From 83b470d4ea02c26e2489fee2e838b874f4c2377a Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Aug 2025 11:31:22 +0200 Subject: [PATCH] refactor: reorganize archirecture --- Makefile | 5 - assets/dist/entrypoints.json | 13 ++ .../dist/img/favicon.6995dfea.png | Bin .../dist/img/owncast.0e92bae8.png | Bin .../dist/img/twitch.e29e246c.png | Bin assets/dist/main.css | 66 ++++++++ assets/dist/main.js | 84 ++++++++++ assets/dist/manifest.json | 8 + assets/dist/runtime.js | 156 ++++++++++++++++++ assets/src/img/favicon.png | Bin 0 -> 3868 bytes assets/src/img/owncast.png | Bin 0 -> 1506 bytes assets/src/img/twitch.png | Bin 0 -> 382 bytes {frontend => assets/src}/js/lib/chat.js | 0 {frontend => assets/src}/js/main.js | 0 {frontend => assets/src}/scss/main.scss | 0 {backend/view => assets}/view.go | 4 +- backend/router/router.go | 12 -- bin/watch.sh | 9 +- cmd/server/{server.go => main.go} | 6 +- .../client}/twitch/irc_client.go | 2 +- {backend => internal}/store/message.go | 0 .../store/owncast_message.go | 2 +- {backend => internal}/store/twitch_message.go | 0 .../web}/controller/chat/controller.go | 14 +- .../webhook/owncast/chat_message.go | 4 +- internal/web/router/router.go | 12 ++ .../web}/webhook/owncast/message.go | 0 webpack.config.js | 8 +- 28 files changed, 365 insertions(+), 40 deletions(-) create mode 100644 assets/dist/entrypoints.json rename frontend/img/favicon.png => assets/dist/img/favicon.6995dfea.png (100%) rename frontend/img/owncast.png => assets/dist/img/owncast.0e92bae8.png (100%) rename frontend/img/twitch.png => assets/dist/img/twitch.e29e246c.png (100%) create mode 100644 assets/dist/main.css create mode 100644 assets/dist/main.js create mode 100644 assets/dist/manifest.json create mode 100644 assets/dist/runtime.js create mode 100644 assets/src/img/favicon.png create mode 100644 assets/src/img/owncast.png create mode 100644 assets/src/img/twitch.png rename {frontend => assets/src}/js/lib/chat.js (100%) rename {frontend => assets/src}/js/main.js (100%) rename {frontend => assets/src}/scss/main.scss (100%) rename {backend/view => assets}/view.go (97%) delete mode 100644 backend/router/router.go rename cmd/server/{server.go => main.go} (84%) rename {backend => internal/client}/twitch/irc_client.go (89%) rename {backend => internal}/store/message.go (100%) rename {backend => internal}/store/owncast_message.go (90%) rename {backend => internal}/store/twitch_message.go (100%) rename {backend => internal/web}/controller/chat/controller.go (76%) rename {backend => internal/web}/controller/webhook/owncast/chat_message.go (85%) create mode 100644 internal/web/router/router.go rename {backend => internal/web}/webhook/owncast/message.go (100%) diff --git a/Makefile b/Makefile index d36296c..ef3887c 100644 --- a/Makefile +++ b/Makefile @@ -32,8 +32,3 @@ build: front rice $(CC) $(CFLAGS) -ldflags="$(LDFLAGS)" \ -tags=static_build \ -o $(EXECUTABLE_SERVER) ./cmd/server - -.PHONY: -docker: - # docker build . -t gitnet.fr/deblan/budget-go - # docker push gitnet.fr/deblan/budget-go diff --git a/assets/dist/entrypoints.json b/assets/dist/entrypoints.json new file mode 100644 index 0000000..7ec9460 --- /dev/null +++ b/assets/dist/entrypoints.json @@ -0,0 +1,13 @@ +{ + "entrypoints": { + "main": { + "js": [ + "/dist/runtime.js", + "/dist/main.js" + ], + "css": [ + "/dist/main.css" + ] + } + } +} \ No newline at end of file diff --git a/frontend/img/favicon.png b/assets/dist/img/favicon.6995dfea.png similarity index 100% rename from frontend/img/favicon.png rename to assets/dist/img/favicon.6995dfea.png diff --git a/frontend/img/owncast.png b/assets/dist/img/owncast.0e92bae8.png similarity index 100% rename from frontend/img/owncast.png rename to assets/dist/img/owncast.0e92bae8.png diff --git a/frontend/img/twitch.png b/assets/dist/img/twitch.e29e246c.png similarity index 100% rename from frontend/img/twitch.png rename to assets/dist/img/twitch.e29e246c.png diff --git a/assets/dist/main.css b/assets/dist/main.css new file mode 100644 index 0000000..5178139 --- /dev/null +++ b/assets/dist/main.css @@ -0,0 +1,66 @@ +/*!******************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf[1].use[1]!./node_modules/resolve-url-loader/index.js??ruleSet[1].rules[4].oneOf[1].use[2]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[4].oneOf[1].use[3]!./assets/src/scss/main.scss ***! + \******************************************************************************************************************************************************************************************************************************************************************************/ +:root { + --color-owncast-user-0: #ff717b; + --color-owncast-user-1: #f4e413; + --color-owncast-user-2: #b99c45; + --color-owncast-user-3: #58f40b; + --color-owncast-user-4: #0bf4f4; + --color-owncast-user-5: #16a8f7; + --color-owncast-user-6: #9a92ff; + --color-owncast-user-7: #ff53ff; + --theme-color-users-0: var(--color-owncast-user-0); + --theme-color-users-1: var(--color-owncast-user-1); + --theme-color-users-2: var(--color-owncast-user-2); + --theme-color-users-3: var(--color-owncast-user-3); + --theme-color-users-4: var(--color-owncast-user-4); + --theme-color-users-5: var(--color-owncast-user-5); + --theme-color-users-6: var(--color-owncast-user-6); + --theme-color-users-7: var(--color-owncast-user-7); +} + +#chat { + background: transparent; + margin: 0; + font-family: monospace; + height: calc(100vh - 10px); + /* border: 5px solid #254779; */ +} +#chat .messages { + max-height: calc(100vh - 20px); + overflow: hidden; + font-size: 13px; +} +#chat .messages .message { + background: rgba(0, 0, 0, 0.8); + margin-bottom: 10px; + border-radius: 5px; + border: 2px solid #00ced1; + padding: 10px; +} +#chat .messages .message .message-origin { + height: 15px; + vertical-align: middle; + margin-right: 4px; +} +#chat .messages .message .message-user { + color: #58d63c; + display: inline-block; + margin-right: 8px; +} +#chat .messages .message .message-body { + color: #fff; + display: inline; +} +#chat .messages .message .message-body p { + margin: 0; + padding: 0; + display: inline; +} +#chat .messages .message .message-body p img { + height: 15px; + vertical-align: middle; +} + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jc3MiLCJtYXBwaW5ncyI6Ijs7O0FBQUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUFGOztBQUdBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUFGO0FBRUU7RUFDRTtFQUNBO0VBQ0E7QUFBSjtBQUVJO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUFOO0FBRU07RUFDRTtFQUNBO0VBQ0E7QUFBUjtBQUdNO0VBQ0U7RUFDQTtFQUNBO0FBRFI7QUFJTTtFQUNFO0VBQ0E7QUFGUjtBQUlRO0VBQ0U7RUFDQTtFQUNBO0FBRlY7QUFJVTtFQUNFO0VBQ0E7QUFGWixDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3NyYy9zY3NzL21haW4uc2NzcyJdLCJzb3VyY2VzQ29udGVudCI6WyI6cm9vdCB7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTA6ICNmZjcxN2I7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTE6ICNmNGU0MTM7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTI6ICNiOTljNDU7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTM6ICM1OGY0MGI7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTQ6ICMwYmY0ZjQ7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTU6ICMxNmE4Zjc7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTY6ICM5YTkyZmY7XG4gIC0tY29sb3Itb3duY2FzdC11c2VyLTc6ICNmZjUzZmY7XG5cbiAgLS10aGVtZS1jb2xvci11c2Vycy0wOiB2YXIoLS1jb2xvci1vd25jYXN0LXVzZXItMCk7XG4gIC0tdGhlbWUtY29sb3ItdXNlcnMtMTogdmFyKC0tY29sb3Itb3duY2FzdC11c2VyLTEpO1xuICAtLXRoZW1lLWNvbG9yLXVzZXJzLTI6IHZhcigtLWNvbG9yLW93bmNhc3QtdXNlci0yKTtcbiAgLS10aGVtZS1jb2xvci11c2Vycy0zOiB2YXIoLS1jb2xvci1vd25jYXN0LXVzZXItMyk7XG4gIC0tdGhlbWUtY29sb3ItdXNlcnMtNDogdmFyKC0tY29sb3Itb3duY2FzdC11c2VyLTQpO1xuICAtLXRoZW1lLWNvbG9yLXVzZXJzLTU6IHZhcigtLWNvbG9yLW93bmNhc3QtdXNlci01KTtcbiAgLS10aGVtZS1jb2xvci11c2Vycy02OiB2YXIoLS1jb2xvci1vd25jYXN0LXVzZXItNik7XG4gIC0tdGhlbWUtY29sb3ItdXNlcnMtNzogdmFyKC0tY29sb3Itb3duY2FzdC11c2VyLTcpO1xufVxuXG4jY2hhdCB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBtYXJnaW46IDA7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gIGhlaWdodDogY2FsYygxMDB2aCAtIDEwcHgpO1xuICAvKiBib3JkZXI6IDVweCBzb2xpZCAjMjU0Nzc5OyAqL1xuXG4gIC5tZXNzYWdlcyB7XG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDIwcHgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZm9udC1zaXplOiAxM3B4O1xuXG4gICAgLm1lc3NhZ2Uge1xuICAgICAgYmFja2dyb3VuZDogIzAwMDAwMGNjO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGJvcmRlcjogMnB4IHNvbGlkICMwMGNlZDE7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuXG4gICAgICAubWVzc2FnZS1vcmlnaW4ge1xuICAgICAgICBoZWlnaHQ6IDE1cHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgfVxuXG4gICAgICAubWVzc2FnZS11c2VyIHtcbiAgICAgICAgY29sb3I6ICM1OGQ2M2M7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gICAgICB9XG5cbiAgICAgIC5tZXNzYWdlLWJvZHkge1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xuXG4gICAgICAgIHAge1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZTtcblxuICAgICAgICAgIGltZyB7XG4gICAgICAgICAgICBoZWlnaHQ6IDE1cHg7XG4gICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9*/ \ No newline at end of file diff --git a/assets/dist/main.js b/assets/dist/main.js new file mode 100644 index 0000000..394adf5 --- /dev/null +++ b/assets/dist/main.js @@ -0,0 +1,84 @@ +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([["main"],{ + +/***/ "./assets/src/js/lib/chat.js": +/*!***********************************!*\ + !*** ./assets/src/js/lib/chat.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ isChat: () => (/* binding */ isChat), +/* harmony export */ updateChat: () => (/* binding */ _updateChat) +/* harmony export */ }); +var isChat = function isChat() { + return document.querySelector('#chat') !== null; +}; +var getChat = function getChat() { + return document.querySelector('#chat'); +}; +var _updateChat = function updateChat() { + fetch(document.location.href).then(function (response) { + return response.text(); + }).then(function (html) { + var parser = new DOMParser(); + var doc = parser.parseFromString(html, 'text/html'); + var nextMessages = doc.querySelectorAll('.message'); + var currentMessages = getChat().querySelectorAll('.message'); + var messagesContainer = getChat().querySelector('.messages'); + nextMessages.forEach(function (nextMessage) { + var add = true; + currentMessages.forEach(function (currentMessage) { + if (currentMessage.id === nextMessage.id) { + add = false; + } + }); + if (add) { + messagesContainer.appendChild(nextMessage); + } + }); + messagesContainer.scrollTo(0, messagesContainer.scrollHeight); + window.setTimeout(_updateChat, 500); + }); +}; + + +/***/ }), + +/***/ "./assets/src/js/main.js": +/*!*******************************!*\ + !*** ./assets/src/js/main.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _scss_main_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../scss/main.scss */ "./assets/src/scss/main.scss"); +/* harmony import */ var _lib_chat_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/chat.js */ "./assets/src/js/lib/chat.js"); + + +if ((0,_lib_chat_js__WEBPACK_IMPORTED_MODULE_1__.isChat)()) { + (0,_lib_chat_js__WEBPACK_IMPORTED_MODULE_1__.updateChat)(); +} + +/***/ }), + +/***/ "./assets/src/scss/main.scss": +/*!***********************************!*\ + !*** ./assets/src/scss/main.scss ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__("./assets/src/js/main.js")); +/******/ } +]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLElBQU1BLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFBLEVBQVM7RUFDbkIsT0FBT0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSTtBQUNqRCxDQUFDO0FBRUQsSUFBTUMsT0FBTyxHQUFHLFNBQVZBLE9BQU9BLENBQUEsRUFBUztFQUNwQixPQUFPRixRQUFRLENBQUNDLGFBQWEsQ0FBQyxPQUFPLENBQUM7QUFDeEMsQ0FBQztBQUVELElBQU1FLFdBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFBLEVBQVM7RUFDdkJDLEtBQUssQ0FBQ0osUUFBUSxDQUFDSyxRQUFRLENBQUNDLElBQUksQ0FBQyxDQUMxQkMsSUFBSSxDQUFDLFVBQUNDLFFBQVE7SUFBQSxPQUFLQSxRQUFRLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQUEsRUFBQyxDQUNuQ0YsSUFBSSxDQUFDLFVBQUNHLElBQUksRUFBSztJQUNkLElBQU1DLE1BQU0sR0FBRyxJQUFJQyxTQUFTLENBQUMsQ0FBQztJQUM5QixJQUFNQyxHQUFHLEdBQUdGLE1BQU0sQ0FBQ0csZUFBZSxDQUFDSixJQUFJLEVBQUUsV0FBVyxDQUFDO0lBQ3JELElBQU1LLFlBQVksR0FBR0YsR0FBRyxDQUFDRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7SUFFckQsSUFBTUMsZUFBZSxHQUFHZixPQUFPLENBQUMsQ0FBQyxDQUFDYyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7SUFDOUQsSUFBTUUsaUJBQWlCLEdBQUdoQixPQUFPLENBQUMsQ0FBQyxDQUFDRCxhQUFhLENBQUMsV0FBVyxDQUFDO0lBRTlEYyxZQUFZLENBQUNJLE9BQU8sQ0FBQyxVQUFDQyxXQUFXLEVBQUs7TUFDcEMsSUFBSUMsR0FBRyxHQUFHLElBQUk7TUFFZEosZUFBZSxDQUFDRSxPQUFPLENBQUMsVUFBQ0csY0FBYyxFQUFLO1FBQzFDLElBQUlBLGNBQWMsQ0FBQ0MsRUFBRSxLQUFLSCxXQUFXLENBQUNHLEVBQUUsRUFBRTtVQUN4Q0YsR0FBRyxHQUFHLEtBQUs7UUFDYjtNQUNGLENBQUMsQ0FBQztNQUVGLElBQUlBLEdBQUcsRUFBRTtRQUNQSCxpQkFBaUIsQ0FBQ00sV0FBVyxDQUFDSixXQUFXLENBQUM7TUFDNUM7SUFDRixDQUFDLENBQUM7SUFFRkYsaUJBQWlCLENBQUNPLFFBQVEsQ0FBQyxDQUFDLEVBQUVQLGlCQUFpQixDQUFDUSxZQUFZLENBQUM7SUFFN0RDLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDekIsV0FBVSxFQUFFLEdBQUcsQ0FBQztFQUNwQyxDQUFDLENBQUM7QUFDTixDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3JDeUI7QUFDd0I7QUFFbEQsSUFBSUosb0RBQU0sQ0FBQyxDQUFDLEVBQUU7RUFDWkksd0RBQVUsQ0FBQyxDQUFDO0FBQ2Q7Ozs7Ozs7Ozs7O0FDTEEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL2pzL2xpYi9jaGF0LmpzIiwid2VicGFjazovLy8uL2Fzc2V0cy9zcmMvanMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvc3JjL3Njc3MvbWFpbi5zY3NzP2VlMzIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaXNDaGF0ID0gKCkgPT4ge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NoYXQnKSAhPT0gbnVsbFxufVxuXG5jb25zdCBnZXRDaGF0ID0gKCkgPT4ge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NoYXQnKVxufVxuXG5jb25zdCB1cGRhdGVDaGF0ID0gKCkgPT4ge1xuICBmZXRjaChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UudGV4dCgpKVxuICAgIC50aGVuKChodG1sKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgIGNvbnN0IG5leHRNZXNzYWdlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCcubWVzc2FnZScpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRNZXNzYWdlcyA9IGdldENoYXQoKS5xdWVyeVNlbGVjdG9yQWxsKCcubWVzc2FnZScpXG4gICAgICBjb25zdCBtZXNzYWdlc0NvbnRhaW5lciA9IGdldENoYXQoKS5xdWVyeVNlbGVjdG9yKCcubWVzc2FnZXMnKVxuXG4gICAgICBuZXh0TWVzc2FnZXMuZm9yRWFjaCgobmV4dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbGV0IGFkZCA9IHRydWVcblxuICAgICAgICBjdXJyZW50TWVzc2FnZXMuZm9yRWFjaCgoY3VycmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudE1lc3NhZ2UuaWQgPT09IG5leHRNZXNzYWdlLmlkKSB7XG4gICAgICAgICAgICBhZGQgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgbWVzc2FnZXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV4dE1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG1lc3NhZ2VzQ29udGFpbmVyLnNjcm9sbFRvKDAsIG1lc3NhZ2VzQ29udGFpbmVyLnNjcm9sbEhlaWdodCk7XG5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHVwZGF0ZUNoYXQsIDUwMClcbiAgICB9KVxufVxuXG5leHBvcnQge1xuICBpc0NoYXQsXG4gIHVwZGF0ZUNoYXRcbn1cbiIsImltcG9ydCAnLi4vc2Nzcy9tYWluLnNjc3MnXG5pbXBvcnQgeyBpc0NoYXQsIHVwZGF0ZUNoYXQgfSBmcm9tICcuL2xpYi9jaGF0LmpzJ1xuXG5pZiAoaXNDaGF0KCkpIHtcbiAgdXBkYXRlQ2hhdCgpXG59XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwibmFtZXMiOlsiaXNDaGF0IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0Q2hhdCIsInVwZGF0ZUNoYXQiLCJmZXRjaCIsImxvY2F0aW9uIiwiaHJlZiIsInRoZW4iLCJyZXNwb25zZSIsInRleHQiLCJodG1sIiwicGFyc2VyIiwiRE9NUGFyc2VyIiwiZG9jIiwicGFyc2VGcm9tU3RyaW5nIiwibmV4dE1lc3NhZ2VzIiwicXVlcnlTZWxlY3RvckFsbCIsImN1cnJlbnRNZXNzYWdlcyIsIm1lc3NhZ2VzQ29udGFpbmVyIiwiZm9yRWFjaCIsIm5leHRNZXNzYWdlIiwiYWRkIiwiY3VycmVudE1lc3NhZ2UiLCJpZCIsImFwcGVuZENoaWxkIiwic2Nyb2xsVG8iLCJzY3JvbGxIZWlnaHQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/assets/dist/manifest.json b/assets/dist/manifest.json new file mode 100644 index 0000000..f2677d0 --- /dev/null +++ b/assets/dist/manifest.json @@ -0,0 +1,8 @@ +{ + "dist/main.css": "/dist/main.css", + "dist/main.js": "/dist/main.js", + "dist/runtime.js": "/dist/runtime.js", + "dist/img/favicon.png": "/dist/img/favicon.6995dfea.png", + "dist/img/owncast.png": "/dist/img/owncast.0e92bae8.png", + "dist/img/twitch.png": "/dist/img/twitch.e29e246c.png" +} \ No newline at end of file diff --git a/assets/dist/runtime.js b/assets/dist/runtime.js new file mode 100644 index 0000000..212d82b --- /dev/null +++ b/assets/dist/runtime.js @@ -0,0 +1,156 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "runtime": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOzs7OztXQ3pCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLCtCQUErQix3Q0FBd0M7V0FDdkU7V0FDQTtXQUNBO1dBQ0E7V0FDQSxpQkFBaUIscUJBQXFCO1dBQ3RDO1dBQ0E7V0FDQSxrQkFBa0IscUJBQXFCO1dBQ3ZDO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7V0NOQTs7Ozs7V0NBQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxxQkFBcUI7V0FDM0I7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovLy93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovLy93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsInZhciBkZWZlcnJlZCA9IFtdO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5PID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuLCBwcmlvcml0eSkgPT4ge1xuXHRpZihjaHVua0lkcykge1xuXHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRmb3IodmFyIGkgPSBkZWZlcnJlZC5sZW5ndGg7IGkgPiAwICYmIGRlZmVycmVkW2kgLSAxXVsyXSA+IHByaW9yaXR5OyBpLS0pIGRlZmVycmVkW2ldID0gZGVmZXJyZWRbaSAtIDFdO1xuXHRcdGRlZmVycmVkW2ldID0gW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldO1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgbm90RnVsZmlsbGVkID0gSW5maW5pdHk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWQubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldID0gZGVmZXJyZWRbaV07XG5cdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjaHVua0lkcy5sZW5ndGg7IGorKykge1xuXHRcdFx0aWYgKChwcmlvcml0eSAmIDEgPT09IDAgfHwgbm90RnVsZmlsbGVkID49IHByaW9yaXR5KSAmJiBPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLk8pLmV2ZXJ5KChrZXkpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fLk9ba2V5XShjaHVua0lkc1tqXSkpKSkge1xuXHRcdFx0XHRjaHVua0lkcy5zcGxpY2Uoai0tLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZ1bGZpbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZihwcmlvcml0eSA8IG5vdEZ1bGZpbGxlZCkgbm90RnVsZmlsbGVkID0gcHJpb3JpdHk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWQuc3BsaWNlKGktLSwgMSlcblx0XHRcdHZhciByID0gZm4oKTtcblx0XHRcdGlmIChyICE9PSB1bmRlZmluZWQpIHJlc3VsdCA9IHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIi9kaXN0L1wiOyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcInJ1bnRpbWVcIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuX193ZWJwYWNrX3JlcXVpcmVfXy5PLmogPSAoY2h1bmtJZCkgPT4gKGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9PT0gMCk7XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uLCBkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMDtcblx0aWYoY2h1bmtJZHMuc29tZSgoaWQpID0+IChpbnN0YWxsZWRDaHVua3NbaWRdICE9PSAwKSkpIHtcblx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKHJ1bnRpbWUpIHZhciByZXN1bHQgPSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR9XG5cdGlmKHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKSBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF1bMF0oKTtcblx0XHR9XG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rXCJdID0gc2VsZltcIndlYnBhY2tDaHVua1wiXSB8fCBbXTtcbmNodW5rTG9hZGluZ0dsb2JhbC5mb3JFYWNoKHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgMCkpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjay5iaW5kKG51bGwsIGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKSk7IiwiIiwiIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/assets/src/img/favicon.png b/assets/src/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..47fce4c3d58898268e3c7f127493ab78054dd3ac GIT binary patch literal 3868 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 IM6N<$f(~`wQUCw| literal 0 HcmV?d00001 diff --git a/assets/src/img/twitch.png b/assets/src/img/twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb99fa75bb0518fddba960f26f336525b2567a3 GIT binary patch literal 382 zcmV-^0fGLBP)R8AnCz^IL_(cV_EF?Mzw!6R5(u(BA#Bft&}>lX4gJeK79nOO#b z8aA$+M}Q9lOamd*(SZedmH~+J$r+un9_6ncirgfQO?fVW4S6m=Te<3Kv9ERaD+Ab~ z56}m&9$)|_RU?`@y8o*Mw=L`ixF3M<_&JZK?&7Bbl>EL=x&bpV3= zp_B6h=;V%G&I+KFpTvXmumF*jD&j0`b literal 0 HcmV?d00001 diff --git a/frontend/js/lib/chat.js b/assets/src/js/lib/chat.js similarity index 100% rename from frontend/js/lib/chat.js rename to assets/src/js/lib/chat.js diff --git a/frontend/js/main.js b/assets/src/js/main.js similarity index 100% rename from frontend/js/main.js rename to assets/src/js/main.js diff --git a/frontend/scss/main.scss b/assets/src/scss/main.scss similarity index 100% rename from frontend/scss/main.scss rename to assets/src/scss/main.scss diff --git a/backend/view/view.go b/assets/view.go similarity index 97% rename from backend/view/view.go rename to assets/view.go index 15e5e8b..bfa9b75 100644 --- a/backend/view/view.go +++ b/assets/view.go @@ -1,4 +1,4 @@ -package view +package assets import ( "embed" @@ -11,7 +11,7 @@ import ( ) var ( - //go:embed static/* + //go:embed dist/* statics embed.FS manifest map[string]string entrypoints map[string]map[string]map[string][]string diff --git a/backend/router/router.go b/backend/router/router.go deleted file mode 100644 index 5a57fdf..0000000 --- a/backend/router/router.go +++ /dev/null @@ -1,12 +0,0 @@ -package router - -import ( - "github.com/labstack/echo/v4" - "gitnet.fr/deblan/owncast-webhook/backend/controller/chat" - "gitnet.fr/deblan/owncast-webhook/backend/controller/webhook/owncast" -) - -func RegisterControllers(e *echo.Echo) { - chat.New(e) - owncast.New(e) -} diff --git a/bin/watch.sh b/bin/watch.sh index 30eaf4d..4227c10 100755 --- a/bin/watch.sh +++ b/bin/watch.sh @@ -2,11 +2,14 @@ export TEMPL_EXPERIMENT=rawgo +sn=owncastwh +st="Owncast Webhook" + while true; do rm -f cmd/server/rice-box.go ./node_modules/.bin/webpack - screen -S owncastwh -d -m go run ./cmd/server - notify-send "Owncast Webhook" "Ready!" + screen -S "$sn" -d -m go run ./cmd/server + notify-send "$t" "Build and ready" inotifywait -r . -e close_write - screen -X -S budget quit + screen -X -S "$sn" quit done diff --git a/cmd/server/server.go b/cmd/server/main.go similarity index 84% rename from cmd/server/server.go rename to cmd/server/main.go index ef78f17..ab38f98 100644 --- a/cmd/server/server.go +++ b/cmd/server/main.go @@ -12,9 +12,9 @@ import ( "github.com/go-playground/validator" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" - "gitnet.fr/deblan/owncast-webhook/backend/router" - "gitnet.fr/deblan/owncast-webhook/backend/twitch" "gitnet.fr/deblan/owncast-webhook/config" + "gitnet.fr/deblan/owncast-webhook/internal/client/twitch" + "gitnet.fr/deblan/owncast-webhook/internal/web/router" ) type TemplateRenderer struct { @@ -38,7 +38,7 @@ func main() { e.Validator = &AppValidator{validator: validator.New()} e.Static("/static", "static") - assetHandler := http.FileServer(rice.MustFindBox("../../backend/view/static").HTTPBox()) + assetHandler := http.FileServer(rice.MustFindBox("../../assets/dist").HTTPBox()) e.GET("/static/*", echo.WrapHandler(http.StripPrefix("/static/", assetHandler))) e.Use(middleware.Logger()) router.RegisterControllers(e) diff --git a/backend/twitch/irc_client.go b/internal/client/twitch/irc_client.go similarity index 89% rename from backend/twitch/irc_client.go rename to internal/client/twitch/irc_client.go index ca37952..e85336e 100644 --- a/backend/twitch/irc_client.go +++ b/internal/client/twitch/irc_client.go @@ -4,8 +4,8 @@ import ( "log" tw "github.com/gempir/go-twitch-irc/v4" - "gitnet.fr/deblan/owncast-webhook/backend/store" "gitnet.fr/deblan/owncast-webhook/config" + "gitnet.fr/deblan/owncast-webhook/internal/store" ) func IrcClient() { diff --git a/backend/store/message.go b/internal/store/message.go similarity index 100% rename from backend/store/message.go rename to internal/store/message.go diff --git a/backend/store/owncast_message.go b/internal/store/owncast_message.go similarity index 90% rename from backend/store/owncast_message.go rename to internal/store/owncast_message.go index 0d0cc08..2ba7961 100644 --- a/backend/store/owncast_message.go +++ b/internal/store/owncast_message.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - webhook "gitnet.fr/deblan/owncast-webhook/backend/webhook/owncast" "gitnet.fr/deblan/owncast-webhook/config" + webhook "gitnet.fr/deblan/owncast-webhook/internal/web/webhook/owncast" ) type OwncastMessage struct { diff --git a/backend/store/twitch_message.go b/internal/store/twitch_message.go similarity index 100% rename from backend/store/twitch_message.go rename to internal/store/twitch_message.go diff --git a/backend/controller/chat/controller.go b/internal/web/controller/chat/controller.go similarity index 76% rename from backend/controller/chat/controller.go rename to internal/web/controller/chat/controller.go index a056259..5a0330d 100644 --- a/backend/controller/chat/controller.go +++ b/internal/web/controller/chat/controller.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/labstack/echo/v4" - "gitnet.fr/deblan/owncast-webhook/backend/store" - "gitnet.fr/deblan/owncast-webhook/backend/view" + "gitnet.fr/deblan/owncast-webhook/assets" + "gitnet.fr/deblan/owncast-webhook/internal/store" . "maragu.dev/gomponents" . "maragu.dev/gomponents/components" . "maragu.dev/gomponents/html" @@ -27,8 +27,8 @@ func (ctrl *Controller) Messages(c echo.Context) error { Title: "Chat", Language: "fr", Head: []Node{ - Group(view.EntrypointCss("main")), - Link(Rel("icon"), Type("image/x-icon"), Href(view.Asset("static/img/favicon.png"))), + Group(assets.EntrypointCss("main")), + Link(Rel("icon"), Type("image/x-icon"), Href(assets.Asset("static/img/favicon.png"))), }, Body: []Node{ ID("chat"), @@ -53,9 +53,9 @@ func (ctrl *Controller) Messages(c echo.Context) error { msg.WebhookMessage.User.DisplayColor, )) - originIcon = Img(Src(view.Asset("static/img/owncast.png")), Class("message-origin")) + originIcon = Img(Src(assets.Asset("static/img/owncast.png")), Class("message-origin")) case store.MessageOriginTwitch: - originIcon = Img(Src(view.Asset("static/img/twitch.png")), Class("message-origin")) + originIcon = Img(Src(assets.Asset("static/img/twitch.png")), Class("message-origin")) } return Div( @@ -74,7 +74,7 @@ func (ctrl *Controller) Messages(c echo.Context) error { ) }), ), - Group(view.EntrypointJs("main")), + Group(assets.EntrypointJs("main")), }, }) diff --git a/backend/controller/webhook/owncast/chat_message.go b/internal/web/controller/webhook/owncast/chat_message.go similarity index 85% rename from backend/controller/webhook/owncast/chat_message.go rename to internal/web/controller/webhook/owncast/chat_message.go index b453f1c..6479d7a 100644 --- a/backend/controller/webhook/owncast/chat_message.go +++ b/internal/web/controller/webhook/owncast/chat_message.go @@ -5,9 +5,9 @@ import ( "net/http" "github.com/labstack/echo/v4" - "gitnet.fr/deblan/owncast-webhook/backend/store" - webhook "gitnet.fr/deblan/owncast-webhook/backend/webhook/owncast" "gitnet.fr/deblan/owncast-webhook/config" + "gitnet.fr/deblan/owncast-webhook/internal/store" + webhook "gitnet.fr/deblan/owncast-webhook/internal/web/webhook/owncast" ) type Controller struct { diff --git a/internal/web/router/router.go b/internal/web/router/router.go new file mode 100644 index 0000000..0bdbe40 --- /dev/null +++ b/internal/web/router/router.go @@ -0,0 +1,12 @@ +package router + +import ( + "github.com/labstack/echo/v4" + "gitnet.fr/deblan/owncast-webhook/internal/web/controller/chat" + "gitnet.fr/deblan/owncast-webhook/internal/web/controller/webhook/owncast" +) + +func RegisterControllers(e *echo.Echo) { + chat.New(e) + owncast.New(e) +} diff --git a/backend/webhook/owncast/message.go b/internal/web/webhook/owncast/message.go similarity index 100% rename from backend/webhook/owncast/message.go rename to internal/web/webhook/owncast/message.go diff --git a/webpack.config.js b/webpack.config.js index b107c3f..795aee2 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -8,9 +8,9 @@ if (!Encore.isRuntimeEnvironmentConfigured()) { Encore // directory where compiled assets will be stored - .setOutputPath('backend/view/static') + .setOutputPath('assets/dist/') // public path used by the web server to access the output path - .setPublicPath('/static') + .setPublicPath('/dist') // only needed for CDN's or subdirectory deploy //.setManifestKeyPrefix('build/') @@ -20,7 +20,7 @@ Encore * Each entry will result in one JavaScript file (e.g. app.js) * and one CSS file (e.g. app.css) if your JavaScript imports CSS. */ - .addEntry('main', './frontend/js/main.js') + .addEntry('main', './assets/src/js/main.js') // When enabled, Webpack "splits" your files into smaller pieces for greater optimization. .splitEntryChunks() @@ -47,7 +47,7 @@ Encore }) .copyFiles({ - from: './frontend/img', + from: './assets/src/img', to: 'img/[path][name].[hash:8].[ext]' })