!774、!gobiコマンドの実装、スレ状態を>>1に反映する処理を追加

This commit is contained in:
konkon-fox 2023-10-30 01:50:48 +09:00
parent 60e4143c4c
commit ff7ff7f571
6 changed files with 365 additions and 0 deletions

View File

@ -345,6 +345,16 @@ if (!$newthread && !$tlonly) {
@include './extend/extra-commands/utilities/add-system-message.php';
// !chttコマンド
@include './extend/extra-commands/chtt.php';
// !774設定
@include './extend/extra-commands/set-774.php';
// !gobi設定
@include './extend/extra-commands/set-gobi.php';
// !774適用
@include './extend/extra-commands/apply-774.php';
// !gobi適用
@include './extend/extra-commands/apply-gobi.php';
// スレ状態更新処理
@include './extend/extra-commands/utilities/show-threads-states.php';
// !xDy(dice)コマンド
@include './extend/extra-commands/dice.php';

View File

@ -0,0 +1,50 @@
<?php
/**
* 設定された!774コマンドに応じて本文に語尾を追加する処理
*
* @param array $SETTING 板の設定
* @param boolean $tlonly TL判定
* @param boolean $admin 管理者判定(管理人or常時コマンド権限を持つCAP)
* @param string $CAPID 投稿者がCAPの場合のID
* @param string $THREADS_STATES_FILE スレ状態ファイルへのパス
*/
function apply774Command(
$SETTING,
$tlonly,
$admin,
$CAPID,
$THREADS_STATES_FILE
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if ($SETTING['DISABLE_NAME'] === 'checked') {
return;
}
if($tlonly) {
return;
}
if($admin || $CAPID) {
return;
}
if ($_POST['name'] !== '') {
return;
}
if (!is_file($THREADS_STATES_FILE)) {
return;
}
$threadsStates = json_decode(file_get_contents($THREADS_STATES_FILE), true);
if(!isset($threadsStates[$_POST['thread']]['774'])) {
return;
}
// 名前変更
$_POST['name'] = $threadsStates[$_POST['thread']]['774'];
}
apply774Command(
$SETTING,
$tlonly,
$admin,
$CAPID,
$THREADS_STATES_FILE
);

View File

@ -0,0 +1,42 @@
<?php
/**
* 設定された!gobiコマンドに応じて本文に語尾を追加する処理
*
* @param array $SETTING 板の設定
* @param boolean $tlonly TL判定
* @param string $THREADS_STATES_FILE スレ状態ファイルへのパス
*/
function applyGobiCommand(
$SETTING,
$tlonly,
$THREADS_STATES_FILE
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if($tlonly) {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if (!is_file($THREADS_STATES_FILE)) {
return;
}
$threadsStates = json_decode(file_get_contents($THREADS_STATES_FILE), true);
if(!isset($threadsStates[$_POST['thread']]['gobi'])) {
return;
}
// 元本文のみ取得 ※<hr>以降はシステムメッセージなので対象外
$commentParts = explode('<hr>', $_POST['comment']);
// 語尾追加
$commentParts[0] .= $threadsStates[$_POST['thread']]['gobi'];
// 本文変更
$_POST['comment'] = implode('<hr>', $commentParts);
}
applyGobiCommand(
$SETTING,
$tlonly,
$THREADS_STATES_FILE
);

View File

@ -0,0 +1,100 @@
<?php
/**
* !774コマンドを設定する際の処理
*
* @param array $SETTING 板の設定
* @param boolean $supervisor スレ主判定
* @param boolean $admin 管理者判定(管理人or常時コマンド権限を持つCAP)
* @param boolean $newthread スレ立て時判定
* @param boolean $tlonly TL判定
* @param ThreadsStatesUpdater $threadsStatesUpdater スレ状態ファイルを更新するオブジェクト
* @param boolean $threadsStatesReload スレ状態の変化を>>1に反映するか判定
*/
function set774Command(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$threadsStatesUpdater,
&$threadsStatesReload
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if ($SETTING['DISABLE_NAME'] === 'checked') {
return;
}
if($tlonly) {
return;
}
if(!($supervisor || $admin)) {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if(strpos($_POST['comment'], '!774:') === false) {
return;
}
$commentParts = explode('<hr>', $_POST['comment']);
if(!preg_match('/\!774:(.*?)((?=\<br\>)|$)/', $commentParts[0], $commandMatches)) {
return;
}
// デフォ名無しの最大文字数
$MAX_774_LENGTH = $SETTING['BBS_NAME_COUNT'];
$name = trim($commandMatches[1]);
// 例外処理
if(mb_strlen($name, 'UTF-8') > $MAX_774_LENGTH) {
addSystemMessage("★デフォ名無しの最大文字数は{$MAX_774_LENGTH}です。<br>");
return;
}
/* --置換処理ここから-- */
// 変換
if ($SETTING['change_sakujyo'] == "checked") {
$name = str_replace("管理", '"管理"', $name);
$name = str_replace("削除", '"削除"', $name);
$name = str_replace("sakujyo", '"sakujyo"', $name);
}
// 偽キャップ、偽トリップ変換
$name = str_replace("", "", $name);
$name = preg_replace("/&#0*9733([^0-9]|$)/", "", $name);
$name = preg_replace("/&#[xX]0*2605([^a-zA-Z0-9]|$)/", "", $name);
$name = str_replace("", "", $name);
$name = preg_replace("/&#0*9670([^0-9]|$)/", "", $name);
$name = preg_replace("/&#[xX]0*25[cC]6([^a-zA-Z0-9]|$)/", "", $name);
/* --置換処理ここまで-- */
// スレッド情報ファイルに書き込み
$threadsStates = $threadsStatesUpdater->get();
if($threadsStates === false) {
addSystemMessage("★!774コマンドの発動に失敗しました。<br>");
return;
}
if(isset($threadsStates[$_POST['thread']])) {
$threadsStates[$_POST['thread']]['774'] = $name;
} else {
$threadsStates[$_POST['thread']] = ['774' => $name];
}
$systemMessage = "★デフォ名無しを「{$name}」に設定しました。<br>";
if($name === '') {
unset($threadsStates[$_POST['thread']]['774']);
$systemMessage = "★デフォ名無しを取り消しました。<br>";
}
$threadsStatesUpdater->put($threadsStates);
// 成功メッセージ出力(本文)
if(!$newthread) {
addSystemMessage($systemMessage);
}
// >>1更新判定
$threadsStatesReload = true;
}
set774Command(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$threadsStatesUpdater,
$threadsStatesReload
);

View File

@ -0,0 +1,83 @@
<?php
/**
* !gobiコマンドを設定する際の処理
*
* @param array $SETTING 板の設定
* @param boolean $supervisor スレ主判定
* @param boolean $admin 管理者判定(管理人or常時コマンド権限を持つCAP)
* @param boolean $newthread スレ立て時判定
* @param boolean $tlonly TL判定
* @param ThreadsStatesUpdater $threadsStatesUpdater スレ状態ファイルを更新するオブジェクト
* @param boolean $threadsStatesReload スレ状態の変化を>>1に反映するか判定
*/
function setGobiCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$threadsStatesUpdater,
&$threadsStatesReload
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if($tlonly) {
return;
}
if(!($supervisor || $admin)) {
return;
}
if (strpos($_POST['name'], '!nocmd') !== false) {
return;
}
if(strpos($_POST['comment'], '!gobi:') === false) {
return;
}
$commentParts = explode('<hr>', $_POST['comment']);
if(!preg_match('/\!gobi:(.*?):/', $commentParts[0], $commandMatches)) {
return;
}
// 語尾の最大文字数
$MAX_GOBI_LENGTH = 100;
$MAX_GOBI_LENGTH = min($MAX_GOBI_LENGTH, floor($SETTING['BBS_MESSAGE_COUNT'] / 2));
$gobi = trim($commandMatches[1]);
// 例外処理
if(mb_strlen($gobi, 'UTF-8') > $MAX_GOBI_LENGTH) {
addSystemMessage("★語尾の最大文字数は{$MAX_GOBI_LENGTH}です。<br>");
return;
}
// スレッド情報ファイルに書き込み
$threadsStates = $threadsStatesUpdater->get();
if($threadsStates === false) {
addSystemMessage("★!gobiコマンドの発動に失敗しました。<br>");
return;
}
if(isset($threadsStates[$_POST['thread']])) {
$threadsStates[$_POST['thread']]['gobi'] = $gobi;
} else {
$threadsStates[$_POST['thread']] = ['gobi' => $gobi];
}
$systemMessage = "★語尾を「{$gobi}」に設定しました。<br>";
if($gobi === '') {
unset($threadsStates[$_POST['thread']]['gobi']);
$systemMessage = "★語尾を取り消しました。<br>";
}
$threadsStatesUpdater->put($threadsStates);
// 成功メッセージ出力(本文)
if(!$newthread) {
addSystemMessage($systemMessage);
}
// >>1更新判定
$threadsStatesReload = true;
}
setGobiCommand(
$SETTING,
$supervisor,
$admin,
$newthread,
$tlonly,
$threadsStatesUpdater,
$threadsStatesReload
);

View File

@ -0,0 +1,80 @@
<?php
/**
* コマンドによって変更されたスレ状態を>>1に反映する処理
*
* @param array $SETTING 板の設定
* @param boolean $newthread スレ立て時判定
* @param boolean $tlonly TL判定
* @param boolean $threadsStatesReload スレ状態の変化を>>1に反映するか判定
* @param string $THREADS_STATES_FILE スレ状態ファイルへのパス
* @param string &$message >>1の本文
* @param boolean &$reload >>1更新フラグ
* @return void
*/
function showThreadsStates(
$SETTING,
$newthread,
$tlonly,
$threadsStatesReload,
$THREADS_STATES_FILE,
&$message,
&$reload
) {
if($SETTING['commands'] !== 'checked') {
return;
}
if($tlonly) {
return;
}
if(!$threadsStatesReload) {
return;
}
if(!is_file($THREADS_STATES_FILE)) {
return;
}
// >>1の本文取得
if($newthread) {
$comment = $_POST['comment'];
} else {
$comment = $message;
}
// >>1の本文を3分割
$commentParts = explode('<hr>', $comment);
for($i = count($commentParts);$i <= 3;$i++) {
array_push($commentParts, '');
}
$commentParts[2] = '';
$threadsStates = json_decode(file_get_contents($THREADS_STATES_FILE), true);
// デフォ名無し情報追加
if(isset($threadsStates[$_POST['thread']]['774'])) {
$defaultName = $threadsStates[$_POST['thread']]['774'];
$defaultName = preg_replace('/\!(?=[a-zA-Z0-9])/', '&#33;', $defaultName);
$commentParts[2] .= "<font color=\"red\">※デフォ名無し=</font>{$defaultName}<br>";
}
// 語尾情報追加
if(isset($threadsStates[$_POST['thread']]['gobi'])) {
$gobi = $threadsStates[$_POST['thread']]['gobi'];
$gobi = preg_replace('/\!(?=[a-zA-Z0-9])/', '&#33;', $gobi);
$commentParts[2] .= "<font color=\"red\">※GOBI=</font>{$gobi}<br>";
}
// 分割された本文を統合
$comment = implode('<hr>', $commentParts);
$comment = preg_replace('/(<hr>)+$/', '', $comment);
// 元本文に反映
if($newthread) {
$_POST['comment'] = $comment;
} else {
$message = $comment;
$reload = true;
}
}
showThreadsStates(
$SETTING,
$newthread,
$tlonly,
$threadsStatesReload,
$THREADS_STATES_FILE,
$message,
$reload
);