diff options
author | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-09-17 19:39:05 +0800 |
---|---|---|
committer | Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> | 2022-09-17 19:39:05 +0800 |
commit | 431e4fc9d1657a50ebc34b8ac24f9bfaea06417f (patch) | |
tree | 5987bb14f38d2999c682970429f34b41eb3e5826 /src/features/streamsGUI/index.js | |
parent | e73f2efdf0f50aa775c540317394d46428e9704f (diff) | |
download | SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.tar.gz SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.tar.bz2 SoopyV2-431e4fc9d1657a50ebc34b8ac24f9bfaea06417f.zip |
Initial move to babel + change fetch to use async/await
Diffstat (limited to 'src/features/streamsGUI/index.js')
-rw-r--r-- | src/features/streamsGUI/index.js | 181 |
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 |