diff options
Diffstat (limited to 'src/features/streamsGUI')
-rw-r--r-- | src/features/streamsGUI/index.js | 181 | ||||
-rw-r--r-- | src/features/streamsGUI/metadata.json | 8 |
2 files changed, 189 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 diff --git a/src/features/streamsGUI/metadata.json b/src/features/streamsGUI/metadata.json new file mode 100644 index 0000000..3123559 --- /dev/null +++ b/src/features/streamsGUI/metadata.json @@ -0,0 +1,8 @@ +{ + "name": "Streams gui", + "description": "Gui for skyblock streams", + "isHidden": true, + "isTogglable": false, + "defaultEnabled": true, + "sortA": 0 +}
\ No newline at end of file |