diff --git a/broadcast/assets/bg.jpg b/broadcast/assets/bg.jpg new file mode 100755 index 0000000..3614f01 Binary files /dev/null and b/broadcast/assets/bg.jpg differ diff --git a/broadcast/assets/nikumaru.otf b/broadcast/assets/nikumaru.otf new file mode 100644 index 0000000..7fa278c Binary files /dev/null and b/broadcast/assets/nikumaru.otf differ diff --git a/broadcast/assets/nizika.png b/broadcast/assets/nizika.png new file mode 100644 index 0000000..35de93d Binary files /dev/null and b/broadcast/assets/nizika.png differ diff --git a/broadcast/assets/talking.png b/broadcast/assets/talking.png new file mode 100644 index 0000000..3bf53d8 Binary files /dev/null and b/broadcast/assets/talking.png differ diff --git a/broadcast/common_module.js b/broadcast/common_module.js new file mode 100644 index 0000000..cacf16d --- /dev/null +++ b/broadcast/common_module.js @@ -0,0 +1,44 @@ +export default class +CommonModule +{ + static + isWide (chr) + { + return chr.match (/[^\x01-\x7f]/) !== null; + } + + static + lenByFull (str) + { + return str.split ('').map (c => this.isWide (c) ? 1 : .5) + .reduce ((a, c) => a + c); + } + + static + indexByFToC (str, index) + { + let i = 0; + let work = ''; + + for (let c of str) + { + work += c; + + if (this.lenByFull (work) > index) + break; + + i += 1; + } + + return i; + } + + static + midByFull (str, start, length) + { + const trimmedLeft = str.slice (this.indexByFToC (str, start)); + + return trimmedLeft.slice (0, this.indexByFToC (trimmedLeft, length)); + } +} + diff --git a/broadcast/index.frm.php b/broadcast/index.frm.php index 025f4ac..f4daced 100644 --- a/broadcast/index.frm.php +++ b/broadcast/index.frm.php @@ -22,12 +22,18 @@ + + + +

@@ -124,9 +130,9 @@ $length, true) as $record): ?> -
+
- +
@@ -135,11 +141,11 @@
- > + >
- +
diff --git a/broadcast/index.php b/broadcast/index.php index 67438a0..90544aa 100644 --- a/broadcast/index.php +++ b/broadcast/index.php @@ -7,6 +7,11 @@ const LOG_PATH = './log.txt'; $log_data = []; +exec ("(ps -Af | grep -e '^miteruzo' | grep 'python3 main.py') && (ps -Af | grep -e '^miteruzo' | grep 'obs')", + $output, $exit_code); +$available = $exit_code === 0; +unset ($output, $exit_code); + $page = (int) ($_GET['p'] ?? 1); $length = (int) ($_GET['max'] ?? 20); $asc = ($_GET['asc'] ?? 0) != 0; diff --git a/broadcast/script.js b/broadcast/script.js index a75ddc3..53f24c3 100644 --- a/broadcast/script.js +++ b/broadcast/script.js @@ -78,6 +78,15 @@ Script $.cookie ('expand-filter', '0'); }); + $ ('.message-block').on ('click', function () + { + const dt = $ (this).find ('.message-block-dt').text (); + const chat = $ (this).find ('.message-block-chat').text (); + const answer = $ (this).find ('.message-block-answer').text (); + + window.open (`./talk.php?dt=${dt}&chat=${chat}&answer=${answer}`); + }); + if ($.cookie ('expand-filter') === '0') { $ ('#collapse-filter').removeClass ('show'); diff --git a/broadcast/talk.css b/broadcast/talk.css new file mode 100644 index 0000000..c126633 --- /dev/null +++ b/broadcast/talk.css @@ -0,0 +1,32 @@ +/* vim:set tabstop=2 softtabstop=2 expandtab :*/ + +@font-face +{ + font-family: 'Nikumaru'; + src: url(./assets/nikumaru.otf); +} + +html, body +{ + overflow: hidden; +} + +body +{ + background-color: black; +} + +#canvas +{ + width: 100%; + height: 100%; + padding: 0; + margin: 0; + overflow: unset; + border: none + !important; + outline: none + !important; + display: block; +} + diff --git a/broadcast/talk.frm.php b/broadcast/talk.frm.php new file mode 100644 index 0000000..3e0e1cb --- /dev/null +++ b/broadcast/talk.frm.php @@ -0,0 +1,23 @@ + + + + + + + + + + + あほ + + + + + + + + + + + + diff --git a/broadcast/talk.js b/broadcast/talk.js new file mode 100644 index 0000000..517a036 --- /dev/null +++ b/broadcast/talk.js @@ -0,0 +1,136 @@ +import CommonModule from './common_module.js'; + + +class +Talk +{ + static + main () + { + const canvas = new Canvas; + + window.onresize = () => canvas.resize (); + } +} + + +class +Canvas +{ + constructor () + { + this.canvas = $ ('#canvas'); + this.ctx = this.canvas[0].getContext ('2d'); + + (this.bg = new Image ()).src = './assets/bg.jpg'; + this.bg.onload = () => this.resize (); + + (this.nizika = new Image ()).src = './assets/nizika.png'; + this.nizika.onload = () => this.resize (); + + (this.talking = new Image ()).src = './assets/talking.png'; + this.talking.onload = () => this.resize (); + + (new FontFace ('Nikumaru', 'url(./assets/nikumaru.otf)')).load ().then ( + () => this.resize ()); + } + + resize () + { + this.canvas[0].width = $ (window).width (); + this.canvas[0].height = $ (window).height (); + + this.redraw (); + } + + redraw () + { + this.putBG (); + this.putText (0, 0, 15, $ ('#dt').val ()); + this.putImage (this.nizika, 370, 260, 1.1); + this.putImage (this.talking, 0, 0, 640 / 1024); + this.putText (75, 43.75, 20, + ('> ' + ((CommonModule.lenByFull ($ ('#chat').val ()) <= 21) + ? $ ('#chat').val () + : (CommonModule.midByFull ($ ('#chat').val (), 0, 19.5) + + '...'))), + undefined, undefined, + true); + this.putText (62.5, 93.75, 31.25, + ((CommonModule.lenByFull ($ ('#answer').val ()) <= 16) + ? $ ('#answer').val () + : CommonModule.midByFull ($ ('#answer').val (), 0, 16)), + 'Nikumaru', '#c00000'); + if (CommonModule.lenByFull ($ ('#answer').val ()) > 16) + { + this.putText (62.5, 125, 31.25, + ((CommonModule.lenByFull ($ ('#answer').val ()) <= 32) + ? CommonModule.midByFull ($ ('#answer').val (), 16, 16) + : (CommonModule.midByFull ($ ('#answer').val (), 16, 14.5) + + '...')), + 'Nikumaru', '#c00000'); + } + } + + putBG () + { + const [x, y, zoom] = this.convertPosition (0, 0); + + const width = this.bg.height * 4 / 3; + const height = this.bg.height; + + this.ctx.drawImage (this.bg, + (852 - 640) / 2, 0, width, height, + x, y, width * zoom, height * zoom); + } + + putImage (image, x, y, zoom = 1) + { + let zoom2 + + [x, y, zoom2] = this.convertPosition (x, y); + + zoom *= zoom2 + + this.ctx.drawImage (image, + 0, 0, image.width, image.height, + x, y, image.width * zoom, image.height * zoom); + } + + putText (x, y, size, text, style = 'sans-serif', colour = 'black', + italic = false) + { + let zoom; + + [x, y, zoom] = this.convertPosition (x, y); + + size *= zoom; + + this.ctx.font = `${italic ? 'italic ' : ''}${Math.trunc (size)}px ${style}`; + this.ctx.fillStyle = colour; + this.ctx.textBaseline = 'top'; + this.ctx.fillText (text, x, y); + } + + convertPosition (x, y) + { + const sizeX = this.canvas.width (); + const sizeY = this.canvas.height (); + + const width = this.bg.height * 4 / 3; + const height = this.bg.height; + + const vertical = sizeY / sizeX > height / width; + + const zoom = vertical ? (sizeX / width) : (sizeY / height); + + const baseX = vertical ? 0 : ((sizeX - width * zoom) / 2); + const baseY = vertical ? ((sizeY - height * zoom) / 2) : 0; + + return [baseX + x * zoom, baseY + y * zoom, zoom]; + } +} + + +$ (() => Talk.main ()); + diff --git a/broadcast/talk.php b/broadcast/talk.php new file mode 100644 index 0000000..e1fec25 --- /dev/null +++ b/broadcast/talk.php @@ -0,0 +1,11 @@ +