!xDy,!chtt,!poolコマンドの実装 #37

Merged
stat2 merged 3 commits from konkon-fox/delightly-v2fork:main into main 2023-10-27 19:29:18 +09:00
4 changed files with 255 additions and 1 deletions

View File

@ -329,6 +329,11 @@ if (!$newthread && !$tlonly) {
if ($SETTING['BBS_FORCE_SAGE'] && $_POST['thread'] + $SETTING['BBS_FORCE_SAGE'] < $NOWTIME) $sage = true;
}
// !chttコマンド
@include './extend/extra-commands/chtt.php';
// !xDy(dice)コマンド
@include './extend/extra-commands/dice.php';
// >>1への変更を反映させる
if (!$newthread && !$tlonly && $reload) {
array_shift($LOG);
@ -486,7 +491,7 @@ elseif ($SETTING['id']){
}
// 未ログイン時で本文が半角文字のみ
if ($SETTING['unauthorized_half_check'] == "checked" && strlen($_POST['comment']) == mb_strlen($_POST['comment'],"UTF-8") && !$authorized) DispError("この掲示板・スレッドでは未承認ユーザでの日本語を含まない投稿が禁止されています");
if ($SETTING['unauthorized_half_check'] == "checked" && strlen($_POST['comment']) == mb_strlen($_POST['comment'],"UTF-8") && !$authorized) Error("この掲示板・スレッドでは未承認ユーザでの日本語を含まない投稿が禁止されています");
// 安価と競合しないように一時変換
$_POST['comment'] = str_replace('&gt;&gt;',' &gt;&gt;',$_POST['comment']);
@ -1060,6 +1065,9 @@ if ($ThreadCount > $SETTING['BBS_THREADS_LIMIT']) {
}
$PAGEFILE = array_slice($PAGEFILE, 0, $SETTING['BBS_THREADS_LIMIT']);
}
// !poolコマンド
@include './extend/extra-commands/pool.php';
// 更新
file_put_contents($subjectfile, json_encode($PAGEFILE, JSON_UNESCAPED_UNICODE), LOCK_EX);

View File

@ -0,0 +1,102 @@
<?php
/**
* @param array $SETTING 板の設定
* @param boolean $supervisor スレ主判定
* @param boolean $admin 管理者判定(管理人or常時コマンド権限を持つCAP)
* @param boolean $newthread スレ立て時判定
* @param boolean $tlonly TL判定
* @param string $threadSubjectFile 過去ログ用subject.jsonへのパス
* @param string $d datファイル1行目の日付ID
* @param string $message datファイル1行目の本文
* @param string $subject datファイル1行目のスレタイ
* @param boolean $reload bbs-main.phpでの>>1更新フラグ
*/
function applyChttCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$threadSubjectFile,
$d,
&$message,
&$subject,
&$reload
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if($newthread || $tlonly) {
return;
}
if(!($supervisor || $admin)) {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if(strpos($_POST['comment'], '!chtt:') === false) {
return;
}
if(!preg_match('/\!chtt:(.+?)((?=\<br\>)|$)/', $_POST['comment'], $commandMatches)) {
return;
}
// コマンド文字列から新スレタイを抽出
$newThreadTitle = trim($commandMatches[1]);
// 本文にシステムメッセージ用ラインを追加
if(strpos($_POST['comment'], '<hr>') === false) {
$_POST['comment'] .= '<hr>';
}
// 空欄エラー
if($newThreadTitle === '') {
$_POST['comment'] .= '★新スレタイが空欄です。<br>';
return;
}
// スレタイ長すぎエラー
if(mb_strlen($newThreadTitle, 'UTF-8') > $SETTING['BBS_SUBJECT_COUNT']) {
$_POST['comment'] .= '★新スレタイが長すぎます。<br>';
return;
}
// スレタイにIDが存在するかを判定
preg_match('/ID:(.+)$/', $d, $IDMatches);
$titleHasId = $SETTING['createid'] === 'checked' && $IDMatches;
// 成功メッセージ出力(本文)
$oldThreadTitle = $titleHasId ? preg_replace('/\s\[[^\[]+?★\]$/', '', $subject) : $subject;
$changeMessage = "★スレタイ変更【{$oldThreadTitle}】→【{$newThreadTitle}】<br>";
$_POST['comment'] .= $changeMessage;
// 成功メッセージ出力(>>1) datへの反映はbbs-main.phpで行われる
if(strpos($message, '<hr>') === false) {
$message .= '<hr>';
}
$message .= preg_replace('/\!(?=[a-zA-Z0-9])/', '', $changeMessage);
// 新スレタイに>>1のIDを追加
if($titleHasId) {
$newThreadTitle .= " [{$IDMatches[1]}★]";
}
// 過去ログ用subject.jsonを更新
$tlist = json_decode(file_get_contents($threadSubjectFile), true);
$tlist = array_map(function ($thread) use ($newThreadTitle) {
if((int) $thread['thread'] === (int) $_POST['thread']) {
$thread['title'] = $newThreadTitle;
}
return $thread;
}, $tlist);
file_put_contents($threadSubjectFile, json_encode($tlist, JSON_UNESCAPED_UNICODE), LOCK_EX);
// subject.jsonとsubject.txtへの反映はbbs-main.phpで行われる
$subject = $newThreadTitle;
// >>1更新フラグ
$reload = true;
}
applyChttCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$PATH."thread/".substr($_POST['thread'], 0, 4)."/subject.json",
$d,
$message,
$subject,
$reload
);

View File

@ -0,0 +1,78 @@
<?php
/**
* @param array $SETTING 板の設定
*/
function applyDiceCommand($SETTING)
{
if ($SETTING['commands'] !== 'checked') {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if (!preg_match('/\![1-9]+[0-9]*[dD][1-9]+[0-9]*/', $_POST['comment'])) {
return;
}
// 振れるダイスxの最大数
$MAX_NUM_OF_DICE = 100;
// ダイスの出目yの最大数
$MAX_DICE_VALUE = 100;
// 1レス内でダイスコマンドが発火する最大回数
$DICE_LIMIT = 5;
// x,yが最大数を超えているかの判定
$xIsOver = false;
$yIsOver = false;
// 元本文のみ取得 ※<hr>以降はシステムメッセージなので対象外
$commentParts = explode('<hr>', $_POST['comment']);
// ダイス処理
$commentParts[0] = preg_replace_callback(
'/\!(([1-9]+[0-9]*)([dD])([1-9]+[0-9]*))/',
function ($commandMatches) use ($MAX_NUM_OF_DICE, $MAX_DICE_VALUE, &$xIsOver, &$yIsOver) {
$diceText = $commandMatches[1];
$x = $commandMatches[2];
$diceType = $commandMatches[3];
$y = $commandMatches[4];
// 最大数オーバー確認
if($x > $MAX_NUM_OF_DICE) {
$xIsOver = true;
}
if($y > $MAX_DICE_VALUE) {
$yIsOver = true;
}
// 最大数オーバーなので処理しない
if($x > $MAX_NUM_OF_DICE || $y > $MAX_DICE_VALUE) {
return "{$diceText}";
}
// 通常処理
$values = array_map(function () use ($y) {
return mt_rand(1, $y);
}, array_fill(0, $x, 1));
$sum = array_sum($values);
if($diceType === 'd') {
$valuesAddition = implode('+', $values);
return "<b>【{$diceText}:{$sum}({$valuesAddition})】</b>";
} else {
return "<b>【{$diceText}:{$sum}】</b>";
}
},
$commentParts[0],
$DICE_LIMIT
);
$newComment = implode('<hr>', $commentParts);
// 例外メッセージ
if($xIsOver || $yIsOver) {
if(strpos($newComment, '<hr>') === false) {
$newComment .= '<hr>';
}
if($xIsOver) {
$newComment .= "★x(ダイスの個数)の最大値は{$MAX_NUM_OF_DICE}です。<br>";
}
if($yIsOver) {
$newComment .= "★y(ダイスの出目)の最大値は{$MAX_DICE_VALUE}です。<br>";
}
}
// 本文変更
$_POST['comment'] = $newComment;
}
applyDiceCommand($SETTING);

View File

@ -0,0 +1,66 @@
<?php
/**
* @param array $SETTING 板の設定
* @param boolean $supervisor スレ主判定
* @param boolean $admin 管理者判定(管理人or常時コマンド権限を持つCAP)
* @param boolean $newthread スレ立て時判定
* @param boolean $tlonly TL判定
* @param string $datlog スレッド毎連続投稿規制用ファイルへのパス
* @param string $THREADFILE 通常ブラウザ用datファイルへのパス
* @param string $DATILE 専ブラ用datファイルへのパス
* @param array $PAGEFILE subject.json用の連想配列
*/
function applyPoolCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$datlog,
$THREADFILE,
$DATFILE,
&$PAGEFILE
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if($newthread || $tlonly) {
return;
}
if(!($supervisor || $admin)) {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if(strpos($_POST['comment'], '!pool') === false) {
return;
}
// datファイル削除
@unlink($DATFILE);
// 過去ログを保持しない場合
if ($SETTING['disable_kakolog'] === 'checked') {
@unlink($THREADFILE);
}
// datlog削除
if (is_file($datlog)) {
@unlink($datlog);
}
// subject.json用のデータ更新
$PAGEFILE = array_filter($PAGEFILE, function ($thread) {
return (int) $thread['thread'] !== (int) $_POST['thread'];
});
$PAGEFILE = array_values($PAGEFILE);
}
applyPoolCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$PATH."dat/".$_POST['thread']."_kisei.cgi", // $datlog
$THREADFILE,
$DATFILE,
$PAGEFILE
);