@@ -2,4 +2,4 @@ | |||||
/drafts | /drafts | ||||
/database.php | /database.php | ||||
/db.sqlite3 | /db.sqlite3 | ||||
/www/images |
@@ -1,56 +0,0 @@ | |||||
<?php | |||||
require_once "${_SERVER['DOCUMENT_ROOT']}/database.php"; | |||||
if (isset ($_GET['page'])) | |||||
$page = $_GET['page']; | |||||
else | |||||
$page = 0; | |||||
if (isset ($_GET['thread'])) | |||||
$thread = $_GET['thread']; | |||||
else | |||||
$thread = -1; | |||||
if (isset ($_GET['sort'])) | |||||
{ | |||||
$sort = $_GET['sort']; | |||||
if (!(in_array ($sort, array ('td', 'eg', 'ta', 'eb')))) | |||||
$sort = 'td'; | |||||
} | |||||
else | |||||
$sort = 'td'; | |||||
// 画像のディレクトリを開く. | |||||
$dir = './images/'; | |||||
$handle = opendir ($dir); | |||||
// MySQL 宣言 | |||||
$mysqli = set_mysql ('miteruzo_bbs'); | |||||
$mysqli -> set_charset ('utf8'); | |||||
if ($row = Dao\Thread -> find ($thread)) | |||||
{ | |||||
$title = $row -> title; | |||||
$explain = $row -> explain; | |||||
} | |||||
if (isset ($_GET['id']) | |||||
&& isset ($_GET['evaluate']) | |||||
&& (($_GET['evaluate'] == 'good') || ($_GET['evaluate'] == 'bad'))) | |||||
{ | |||||
$mysqli -> query (" | |||||
UPDATE | |||||
responses | |||||
SET | |||||
{$_GET['evaluate']} = {$_GET['evaluate']} + 1 | |||||
WHERE | |||||
(thread_id = $thread) AND (response_id = {$_GET['id']})"); | |||||
header ("Location: ./?thread=$thread&sort=$sort"); | |||||
} | |||||
require_once './forms/index.frm.php'; | |||||
@@ -1,10 +0,0 @@ | |||||
<?php | |||||
require_once './db_connection.php'; | |||||
$files = glob ('./migrations/*.sql'); | |||||
foreach ($files as $file) | |||||
$__db_connection -> query (file_get_contents ($file)); | |||||
@@ -1,2 +0,0 @@ | |||||
CREATE TABLE `miteruzo_bbs`.`threads` ( `id` INT NOT NULL AUTO_INCREMENT , `title` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , `explain` MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , `latest` DATETIME NOT NULL , `length` INT NOT NULL DEFAULT '0' , PRIMARY KEY (`id`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; | |||||
@@ -1,2 +0,0 @@ | |||||
CREATE TABLE `miteruzo_bbs`.`responses` ( `thread_id` INT NOT NULL , `response_id` INT NOT NULL , `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '名なしさん' , `message` MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , `date` DATETIME NOT NULL , `image` VARCHAR(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , `held` TINYINT NOT NULL DEFAULT '0' , `deleted` TINYINT NOT NULL DEFAULT '0' , `pass` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL , `good` INT NOT NULL DEFAULT '0' , `bad` INT NOT NULL DEFAULT '0' , PRIMARY KEY (`thread_id`, `response_id`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; | |||||
@@ -1,169 +0,0 @@ | |||||
const music = new Audio ('./assets/music.mp3'); // BGM | |||||
let playing = false; // 再生フラグ | |||||
let nowPlay = true; // 再生すべきかどぅか | |||||
document.getElementById ('sort').addEventListener ('change', sortChange); | |||||
/* | |||||
* BGM を再生しよぅとする. | |||||
* | |||||
* 戻り値は,なし. | |||||
*/ | |||||
async function | |||||
PlayMusic () | |||||
{ | |||||
// 再生中でなぃ場合 | |||||
if (playing === false) | |||||
{ | |||||
// BGM を再生しよぅとする. | |||||
try | |||||
{ | |||||
await music.play (); | |||||
music.loop = true; | |||||
playing = true; | |||||
nowPlay = true; | |||||
// オン/オフ・ボタン | |||||
document.getElementById ('mute').innerHTML = 'BGM がうるさい人用'; | |||||
} | |||||
catch (err) | |||||
{ | |||||
playing = false; | |||||
} | |||||
} | |||||
} | |||||
/* | |||||
* BGM の消音切替 | |||||
* | |||||
* 戻り値は,なし. | |||||
*/ | |||||
function | |||||
PauseMusic () | |||||
{ | |||||
// 切替 | |||||
if (nowPlay && playing) // 再生中の場合 | |||||
{ | |||||
music.muted = true; | |||||
document.getElementById ('mute').innerHTML = 'やっぱり BGM が恋しい人用'; | |||||
nowPlay = false; | |||||
} | |||||
else // 消音中の場合 | |||||
{ | |||||
music.muted = false; | |||||
document.getElementById ('mute').innerHTML = 'BGM がうるさい人用'; | |||||
nowPlay = true; | |||||
} | |||||
} | |||||
// 1000 ms ごとに BGM 再生試行 | |||||
window.setInterval (function | |||||
() | |||||
{ | |||||
PlayMusic (); | |||||
}, | |||||
1000); | |||||
// 画面クリックで BGM 再生試行 | |||||
document.addEventListener ('click', function | |||||
() | |||||
{ | |||||
PlayMusic (); | |||||
}); | |||||
// 画面タッチで BGM 再生試行 | |||||
document.addEventListener ('touchstart', function | |||||
() | |||||
{ | |||||
PlayMusic (); | |||||
}); | |||||
const body = document.getElementsByTagName ('body')[0]; // body 要素 | |||||
const cv = document.getElementById ('work'); // 作業用 Canvas | |||||
const g = cv.getContext ('2d'); // 作業用 Canvas のコンテクスト | |||||
const list = ['magenta', 'lime', 'cyan', 'yellow', 'orange', 'pink', 'aliceblue', | |||||
'antiquewhite', 'aqua', 'aquamarine', 'bisque', 'lightgreen', 'linen', | |||||
'lightsalmon', 'darkorange', 'palegreen']; | |||||
// 色リスト | |||||
let nowColour = Math.floor (Math.random () * list.length); | |||||
// 前の色番号 | |||||
let nextColour = Math.floor (Math.random () * list.length); | |||||
// 次の色番号 | |||||
let [tempR, tempG, tempB] = getRGB (list[nowColour]); | |||||
// 現在の RGB 値 | |||||
// 3000 ms ごとに次の色指定 | |||||
window.setInterval (function | |||||
() | |||||
{ | |||||
nowColour = nextColour; | |||||
nextColour = Math.floor (Math.random () * list.length); | |||||
}, | |||||
3000); | |||||
// 20 ms ごとに,ぢょぢょに,色変更 | |||||
window.setInterval (function | |||||
() | |||||
{ | |||||
let [nowR, nowG, nowB] = getRGB (list[nowColour]); | |||||
let [nextR, nextG, nextB] = getRGB (list[nextColour]); | |||||
body.style.backgroundColor = `rgb(${tempR}, ${tempG}, ${tempB})`; | |||||
tempR += (nextR - nowR) / 150; | |||||
tempG += (nextG - nowG) / 150; | |||||
tempB += (nextB - nowB) / 150; | |||||
}, | |||||
20); | |||||
/* | |||||
* カラ・コゥド c を RGB 値に変換する. | |||||
* | |||||
* 戻り値は,RGB 値排列. | |||||
*/ | |||||
function | |||||
getRGB (c) | |||||
{ | |||||
g.fillStyle = c; | |||||
g.fillRect (0, 0, 1, 1); | |||||
const img = g.getImageData (0, 0, 1, 1); | |||||
const px = img.data; | |||||
const rgb = [px[0], px[1], px[2]]; | |||||
return rgb; | |||||
} | |||||
function | |||||
sortChange (evt) | |||||
{ | |||||
const searchParams = new URLSearchParams (window.location.search); | |||||
switch (evt.currentTarget.value) | |||||
{ | |||||
default: | |||||
window.location.href = `./?thread=${searchParams.get ('thread')}&sort=td`; | |||||
break; | |||||
case 'evaluate-good': | |||||
window.location.href = `./?thread=${searchParams.get ('thread')}&sort=eg`; | |||||
break; | |||||
case 'time-asc': | |||||
window.location.href = `./?thread=${searchParams.get ('thread')}&sort=ta`; | |||||
break; | |||||
case 'evaluate-bad': | |||||
window.location.href = `./?thread=${searchParams.get ('thread')}&sort=eb`; | |||||
break; | |||||
} | |||||
} | |||||
@@ -0,0 +1,53 @@ | |||||
<?php | |||||
use \Dao; | |||||
use \Dto; | |||||
if (isset ($_GET['page'])) | |||||
$page = $_GET['page']; | |||||
else | |||||
$page = 0; | |||||
if (isset ($_GET['thread'])) | |||||
$thread = $_GET['thread']; | |||||
else | |||||
$thread = -1; | |||||
if (isset ($_GET['sort'])) | |||||
{ | |||||
$sort = $_GET['sort']; | |||||
if (!(in_array ($sort, array ('td', 'eg', 'ta', 'eb')))) | |||||
$sort = 'td'; | |||||
} | |||||
else | |||||
$sort = 'td'; | |||||
// 画像のディレクトリを開く. | |||||
$dir = './images/'; | |||||
$handle = opendir ($dir); | |||||
if ($row = Dao\Thread :: find ($thread)) | |||||
{ | |||||
$title = $row -> title; | |||||
$explain = $row -> explain; | |||||
} | |||||
if (isset ($_GET['id'])) | |||||
{ | |||||
if (($_GET['evaluate'] ?? '') === 'good') | |||||
{ | |||||
Dao\Response :: like ((int) $_GET['id']); | |||||
header ("Location: ./?thread=$thread&sort=$sort"); | |||||
} | |||||
if (($_GET['evaluate'] ?? '') === 'bad') | |||||
{ | |||||
Dao\Response :: dislike ((int) $_GET['id']); | |||||
header ("Location: ./?thread=$thread&sort=$sort"); | |||||
} | |||||
} | |||||
require_once './forms/index.frm.php'; | |||||