@@ -124,9 +130,9 @@
$length,
true)
as $record): ?>
-
+
- = $record['date_time'] ?>
+ = $record['date_time'] ?>
@@ -135,11 +141,11 @@
- > = $record['chat_message'] ?>
+ > = $record['chat_message'] ?>
- = $record['answer'] ?>
+ = $record['answer'] ?>
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 @@
+