aboutsummaryrefslogtreecommitdiff
path: root/src/features/streamsGUI/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/streamsGUI/index.js')
-rw-r--r--src/features/streamsGUI/index.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/features/streamsGUI/index.js b/src/features/streamsGUI/index.js
new file mode 100644
index 0000000..e47bbc3
--- /dev/null
+++ b/src/features/streamsGUI/index.js
@@ -0,0 +1,181 @@
+/// <reference types="../../../../CTAutocomplete" />
+/// <reference lib="es2015" />
+import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
+import Feature from "../../featureClass/class";
+import GuiPage from "../soopyGui/GuiPage";
+import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement";
+import SoopyMarkdownElement from "../../../guimanager/GuiElement/SoopyMarkdownElement";
+import SoopyImageElement from "../../../guimanager/GuiElement/SoopyImageElement";
+import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
+import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
+import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
+import BoxWithText from "../../../guimanager/GuiElement/BoxWithText";
+import { fetch } from "../../utils/networkUtils";
+
+class StreamsGui extends Feature {
+ constructor() {
+ super()
+ }
+
+ onEnable() {
+ this.initVariables()
+
+ this.GuiPage = new StreamPage()
+
+ }
+
+ initVariables() {
+ this.GuiPage = undefined
+ }
+
+ onDisable() {
+ this.initVariables()
+ }
+}
+
+
+class StreamPage extends GuiPage {
+ constructor() {
+ super(7)
+
+ this.name = "Skyblock Streams"
+
+ this.pages = [this.newPage()]
+
+
+ this.pages[0].addChild(new SoopyTextElement().setText("§0Skyblock Streams").setMaxTextScale(3).setLocation(0.1, 0.05, 0.6, 0.1))
+
+ let button = new ButtonWithArrow().setText("§0Open in browser").setLocation(0.7, 0.05, 0.2, 0.1)
+ this.pages[0].addChild(button)
+
+ button.addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ java.awt.Desktop.getDesktop().browse(
+ new java.net.URI("https://soopy.dev/skyblockstreams")
+ );
+ }))
+
+ this.streamsBox = new SoopyGuiElement().setLocation(0.1, 0.15, 0.8, 0.85)
+
+ this.streamsBox.setScrollable(true)
+
+ this.pages[0].addChild(this.streamsBox)
+
+ this.finaliseLoading()
+ }
+
+ async updateStreams() {
+ let streams = await fetch("http://soopy.dev/api/skyblockstreams").json()
+ this.streamsBox.clearChildren()
+
+ let y = 0
+
+ Object.keys(streams.twitch).forEach((channel, i) => {
+ let stream = streams.twitch[channel]
+
+ if (i % 2 === 0) {
+ let element = new StreamElement().setLocation(0, y, 0.45, 0.4).setStreamPage(this)
+ this.streamsBox.addChild(element)
+ element.setStream(stream, true)
+ }
+ if (i % 2 === 1) {
+ let element = new StreamElement().setLocation(0.55, y, 0.45, 0.4).setStreamPage(this)
+ this.streamsBox.addChild(element)
+ element.setStream(stream, true)
+ y += 0.45
+ }
+ })
+ }
+
+ openStreamSidebar(data) {
+ let sidebar = new SoopyGuiElement().setLocation(0, 0, 1, 1)
+
+ this.openSidebarPage(sidebar)
+
+ sidebar.addChild(new SoopyTextElement().setText("§0" + data.user_name).setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1))
+
+ let title = new SoopyMarkdownElement().setText(data.title).setLocation(0.1, 0.15, 0.8, 0.1)
+ sidebar.addChild(title)
+
+ let image = new SoopyImageElement().setLocation(0.1, 0.15 + title.getHeight(), 0.8, 0.4).setImage(data.image)
+ sidebar.addChild(image)
+
+
+ let button = new ButtonWithArrow().setText("§0Watch on Twitch").setLocation(0.1, 0.15 + image.location.size.y.get() + title.getHeight(), 0.8, 0.1)
+ sidebar.addChild(button)
+
+ button.addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ java.awt.Desktop.getDesktop().browse(
+ new java.net.URI("https://twitch.tv/" + data.user_login)
+ );
+ }))
+
+ let language
+ if (data.language) {
+ language = new BoxWithText().setText("§0Language: " + data.language).setLocation(0.3, 0.25 + image.location.size.y.get() + title.getHeight(), 0.4, 0.1)
+
+ sidebar.addChild(language)
+ }
+
+ image.onImageHeightChange(() => {
+ button.location.location.y.set(0.15 + image.location.size.y.get() + title.getHeight())
+ if (language) language.location.location.y.set(0.25 + image.location.size.y.get() + title.getHeight())
+ }, this)
+ image.loadHeightFromImage()
+ }
+
+ onOpen() {
+ this.updateStreams()
+ }
+}
+
+class StreamElement extends SoopyBoxElement {
+ constructor() {
+ super()
+
+ this.streamData = undefined
+
+ this.channelElement = new SoopyTextElement().setLocation(0.1, 0.025, 0.8, 0.1).setMaxTextScale(10)
+
+ this.channelImg = new SoopyImageElement().setLocation(0.1, 0.125, 0.8, 0.2)
+
+ this.titleElement = new SoopyMarkdownElement().setLocation(0.1, 0.45, 0.8, 0.1)
+
+ this.channelImg.onImageHeightChange(() => {
+ this.titleElement.location.location.y.set(0.15 + this.channelImg.location.size.y.get())
+ }, this)
+
+ this.streamPage = undefined
+
+ this.addEvent(new SoopyMouseClickEvent().setHandler(() => {
+ this.streamPage.openStreamSidebar(this.streamData)
+ }))
+
+ this.addChild(this.channelElement)
+ this.addChild(this.titleElement)
+ this.addChild(this.channelImg)
+ }
+
+ setStream(stream, twitch) {
+ this.streamData = stream
+
+ this.titleElement.setText(stream.title)
+
+ this.channelElement.setText((twitch ? "§0" + stream.user_name : "§0" + stream.channelTitle) + (twitch ? "&7 - " + stream.viewer_count + " viewer" + (stream.viewer_count !== 1 ? "s" : "") : ""))
+
+ this.streamData.image = twitch ? `https://static-cdn.jtvnw.net/previews-ttv/live_user_${stream.user_login}-640x360.jpg` : stream.thumbnails.high.url
+ this.channelImg.setImage(this.streamData.image)
+ this.channelImg.loadHeightFromImage()
+
+ return this
+ }
+
+ setStreamPage(page) {
+ this.streamPage = page
+
+ return this
+ }
+}
+
+module.exports = {
+ class: new StreamsGui()
+} \ No newline at end of file