OSDN Git Service

PHP Notice対応
[trpgtools-onweb/AjaxChat.git] / write.php
index 3d8549b..b3e77af 100644 (file)
--- a/write.php
+++ b/write.php
@@ -1,64 +1,89 @@
 <?php
 /*
- * Ajax Chat for TRPG ver.1.0.1
- * (c)2007 Cake All righ1ts reserved.
- * Mail : cake_67@users.sourceforge.jp
- * Home : http://trpgtools-onweb.sourceforge.jp/
- *
- * [注意事項他]
- * 本チャットスクリプトの使用および配布は、BSDライセンスに基づきます。
- * BSDライセンスの詳細につきましては、添付のライセンス.txtを参照してください。
- *
- * BSDライセンス概要&使用上の注意
- * 1. このスクリプトはフリーソフトです。以下の条件を満たす限りにおいて、使用・改造・再配布(オリジナルおよび改造版の両方とも)は自由です。
- * 再配布する場合、上記著作権表示、本条件書きおよび第2項・第3項の責任限定規定を必ず含めてください。
- * 2. 同梱のアイコンはPetite Prier様(http://snow.if.tv/)の素材です。
-      本スクリプトの使用および再配布時にアイコンをそのまま用いる場合は、配布元の規定も遵守してください。
- * 3. 本スクリプトは無保証です。自己責任で使用してください。このスクリプトを使用したいかなる損害に対しても、作者は一切の責任を負いません。
- * 4. 設置および使用方法に関する質問は、配布サイトの掲示板にお願いします。ただし、必ず回答できるとは限りません。
- * メールによる質問は、ご遠慮ください。
+ Ajax Chat for TRPG ver.2.6.2
+ (c)2007-2009 Cake All Rights Reserved.
+ Mail : cake_67@users.sourceforge.jp
+ Home : http://trpgtools-onweb.sourceforge.jp/
  */
 
+/* 発言書込み */
+
+// デバッグ用設定
+ini_set('log_errors', false);
+ini_set('error_log', "./php_error.log");
+
 // 設定ファイルの読み込み
-require_once 'trpgchat-ini.php';
-//メンバーチェッカー
-require_once 'member_check.php';
+require_once './trpgchat-ini.php';
+require_once './lib/trpgchat.php';
+require_once './lib/write.php';
+require_once './lib/member_check.php';
+
+// 設定セット
+set_config(read_config());
+if (DICE_MAX != 0) {
+    require_once './lib/trpg.php';
+}
 
 // ユーザの情報
-$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
+if (REC_UA) {
+    $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
+    $ua = getenv("HTTP_USER_AGENT");
+}
+
+// 書き込みブロック
+write_block();
 
-// IPブロック
-foreach ($block_ip as $v) {
-    if (strstr($host, $v)) { die("書きこみできません。"); }
+// アクセスブロック
+access_block();
+
+// リクエスト受信
+if (!$request = $_GET) {
+    error('データを受信できません');
 }
 
+// PL名・コメントがなければ書込みはできない(含ロボット対策)
+if (!$request['n']) error("書きこみできません");
+if (($request['y'] != 'in' && $request['y'] != 'out' && $request['y'] != 'delMember') && $request['m'] == '') error("書きこみできません。");
+
 // ファイルロック
-$lfp = fopen($lockfile,"w");
+$lfp = fopen(LOCK,"w");
 stream_set_write_buffer($lfp, 0);
 flock($lfp,LOCK_EX);
 
 // 既存ファイル内容の格納
 $log = array();
-$log[] = file($recent_log);
+$log[] = file(RECENT_LOG);
 
-// å\8f\97ä¿¡ã\83\87ã\83¼ã\82¿ã\81®æ\95´
-foreach($_GET as $k => $v) {
+// å\8f\97ä¿¡ã\83\87ã\83¼ã\82¿ã\81®æ\88\90
+foreach($request as $k => $v) {
     $data[$k] = htmlspecialchars($v);
 }
-
-    // PC名がない場合PL名
+// PC名がない場合PL名
 if (!$data['c']) $data['c'] = $data['n'];
 
-$ua = getenv("HTTP_USER_AGENT");
-
-    // コメント本文の処理:(予定)ダイス、カード、タグ有効[b,span,i,u]、オートリンク、禁止語句処理など
-        // ダイス
-if ($dice_max) {
-    if(preg_match("/(.*)[[]\({0,}([0-9]{1,3})([dD])([0-9]{1,3})([-\+\*\/0-9\s]{0,}[\]])(.*$)/i", $data['m'], $dice)) {
-        $dice_result = dice_convert($dice[2], $dice[4], $dice[5], $dice_max, $dice_color);
-        $data['m'] = $dice[1].$dice_result.$dice[6];
+// コメント本文の処理:(予定)ダイス、カード、タグ有効[b,span,i,u]、オートリンク、禁止語句処理など
+// 改行
+$data['m'] = convertCr($data['m']);
+
+// ダイス対応
+if (DICE_MAX != 0) {
+    // コメント欄
+    $data['m'] = convert_dice($data['m']);
+    // ステータス欄
+    if ($data['s'] && $data['t']) {
+        $data['t'] = convert_dice($data['t']);
     }
 }
+// HTMLタグ
+$data['m'] = convert_html_tag($data['m']);
+if ($data['s'] && $data['t']) {
+    $data['t'] = convert_html_tag($data['t']);
+}
+// オートリンク
+$data['m'] = convert_autolink($data['m']);
+if ($data['s'] && $data['t']) {
+    $data['t'] = convert_autolink($data['t']);
+}
 
 // 既存ログのチェック
 if(!is_array($log)){
@@ -80,163 +105,86 @@ if($stopflag==0) {
         $last_id = 1;
     }
 
-    // æ\9b¸ã\81\8dè¾¼ã\81¿æ\95´
+    // æ\9b¸ã\81\8dè¾¼ã\81¿æ\88\90
     $write = "";
         // ログイン
     if ($data['y'] =='in') {
-        $pcname = $system;
-        $data['m'] = $data['n'].$online_msg;
-        $data['l'] = $color_system;
+        $pcname = SYSTEM;
+        $data['m'] = $data['n'].ONLINE_MSG;
+        $data['l'] = COLOR_SYSTEM;
         $data['s'] = 0;
         // ログアウト
     } elseif ($data['y'] == 'out') {
-        $pcname = $system;
-        $data['m'] = $data['n'].$offline_msg;
-        $data['l'] = $color_system;
+        $pcname = SYSTEM;
+        $data['m'] = $data['n'].OFFLINE_MSG;
+        $data['l'] = COLOR_SYSTEM;
+        $data['s'] = 0;
+        // カード操作
+    } elseif ($data['y'] == 'card') {
+        $pcname = SYSTEM;
+        $data['m'] = $data['n'].'さんが'.$data['m'];
+        $data['l'] = COLOR_SYSTEM;
+        $data['s'] = 0;
+        // メンバー削除
+    } elseif ($data['y'] == 'delMember') {
+        $pcname = SYSTEM;
+        $data['m'] = $data['n'].'さんが'.$data['dn'].'さんを参加者一覧から削除しました';
+        $data['l'] = COLOR_SYSTEM;
         $data['s'] = 0;
     } else {
         $pcname = $data['c'];
     }
-
     if ($data['n'] && $data['p']) {
-        $pwd = create_hash($data['n'],$data['p']);
+        $pwd = create_hash($data['n'], $data['p']);
+    }
+    $dm = $data['m'];
+    $dn = $data['n'];
+    $dw = $data['w'];
+    $dh = $data['h'];
+    $dt = $data['t'];
+
+    // 難読化
+    if (OBFUSCATION) {
+        $pcname = obf_xor($pcname);
+        $dm = obf_xor($dm);
+        $dn = obf_xor($dn);
+        if ($dw) $dw = obf_xor($dw);
+        if ($dt) $dt = obf_xor($dt);
     }
 
-    $write = $last_id."<>".$data['n']."<>".$pcname."<>".$data['l']."<>".$data['m']."<>".time()."<>".$host."<>".$ua."<>".$pwd."<>".$data['w']."<>".$data['h']."<>".$data['s']."<>".$data['t']."<>".$data['a']."\n";
+
+    $write = $last_id."<>".$dn."<>".$pcname."<>".$data['l']."<>".$dm."<>".time()."<>".$host."<>".$ua."<>".$pwd."<>".$dw."<>".$dh."<>".$data['s']."<>".$dt."<>\n";
 
     array_unshift($log[0], $write);
 
     //最大行数を超えていたら最終行を削除
-    if (count($log[0]) >= $max_num) {
+    if (count($log[0]) >= MAX_NUM) {
         array_pop($log[0]);
     }
 
     // ログファイル更新
-    $fp = @fopen($recent_log, "w+") or die("ログファイルを開けません。");
+    $fp = @fopen(RECENT_LOG, "w+") or error("ログファイルを開けません。", true);
     //$bom = "\xef\xbb\xbf";
     //fwrite($fp, $bom);
 
-        foreach($log[0] as $k => $v) {
-            fwrite($fp, $v);
-        }
+    foreach($log[0] as $k => $v) {
+        fwrite($fp, $v);
+    }
     fclose($fp);
 }
 
-    //直近の過去ログ更新
-    write_recent_past($write, $past_log);
+//直近の過去ログ更新
+write_recent_past($write, PAST_LOG);
 
-    // ロック解除
+// ロック解除
 fflush($lfp);
 fclose($lfp);
 
-    //参加者チェッカーに書き込み
-member_checker($data['n'], $pwd, $data['y'], $now_member, $getdata_off);
-
-1;
-
-
-/**** ここから関数 ****/
-
-// 直近の過去ログ
-function write_recent_past($write, $pdata) {
-    $pfp = @fopen($pdata, "a+") or die("過去ログファイルを開けません。");
-
-    fwrite($pfp, $write);
-
-    return true;
-}
-
-function dice_convert($dicenum, $dicenumber, $revision, $dice_max, $color) {
-
-    // ダイス本体
-    if($dicenum >= 1 && $dicenum <= $dice_max) {
-        if ($dicenumber >= 1 && $dicenumber <= 100) {
-            mt_srand((double) microtime() * 1000000);
-            $dicesum = 0;
-            for ($i=0; $i<$dicenum; $i++) {
-                $d_result[$i] = mt_rand(1,$dicenumber);
-                $dice_sum += $d_result[$i];
-                if ($i != 0) {
-                    $dice_list .= ", ".$d_result[$i];
-                } else {
-                    $dice_list = " (".$d_result[$i];
-                }
-            }
-            $dice_list .= ")";
-        } else {
-            return $dice.' (d2~d100の範囲で指定してください)';
-        }
-    } else {
-        return $dice.' (ダイスの数は1から'.$dice_max.'の間で指定してください)';
-    }
-
-    // 修正値を加えた結果の計算
-    if(rtrim($revision, "]")) {
-        $dice = preg_replace("/\s/","+",$dice);
-        $value = calc_value($dice_sum, $revision);
-    } else {
-        $value = $dice_sum;
-    }
-
-    if (!is_numeric($value)) {
-        return '<span style="color:#'.$color.';">'.$dice.' ('.$value.')</span>';
-    } else {
-        $dice = '<span style="color:#'.$color.'; font-weight: bold;">['.$dicenum.'d'.$dicenumber.$revision.' :'.$dice_list.' = '.$value.'</span>';
-        return $dice;
-    }
+//参加者チェッカーに書き込み
+if ($data['y'] != 'delMember') {
+    member_checker($dn, $pwd, $request['y'], false);
 }
 
-/* ダイス修正値の計算
- */
-function calc_value($dice_sum, $revision) {
-    $multi = preg_match("/\*/", $revision);
-    $dev = preg_match("/\//", $revision);
-    $add = preg_match("/\+/", $revision);
-    $subtract = preg_match("/\-/", $revision);
-
-    // +-*/で分割
-    $revision = preg_replace("/\+/","<>+<>",$revision);
-    $revision = preg_replace("/\-/","<>-<>",$revision);
-    $revision = preg_replace("/\*/","<>*<>",$revision);
-    $revision = preg_replace("/\//","<>/<>",$revision);
-    $parts = explode("<>",$revision);
-    array_splice($parts, 0, 1, $dice_sum);
-
-    // 乗算&除算
-    if ($multi || $dev) {
-        foreach ($parts as $k => $v) {
-            if ($v != '0' && $v == '*') {
-                if (!preg_match("/[0-9]{1,}/", $parts[$k+1])) return "演算子が連続してます";
-                $flg = $k;
-                array_splice($parts, $k+1, 1, $parts[$k-1] * $parts[$k+1]);
-                array_splice($parts, $k-1, 1, 0);
-                array_splice($parts, $k, 1, $parts[$k-2]);
-                array_splice($parts, $k-2, 1, '+');
-            }
-            if ($v != '0' && $v == '/') {
-                if (!preg_match("/[0-9]{1,}/", $parts[$k+1])) return "演算子が連続してます";
-                array_splice($parts, $k+1, 1, $parts[$k-1] / $parts[$k+1]);
-                array_splice($parts, $k-1, 1, 0);
-                array_splice($parts, $k, 1, $parts[$k-2]);
-                array_splice($parts, $k-2, 1, '+');
-            }
-        }
-    }
-
-    // 加減算
-        foreach ($parts as $k => $v){
-            if ($v != '0') {
-                if ($v == '+') {
-                    if (!preg_match("/[0-9]{1,}/", $parts[$k+1]))  return "演算子が連続してます";
-                    array_splice($parts, 0, 1, $parts[0] + $parts[$k+1]);
-                } elseif ($v == '-') {
-                    if (!preg_match("/[0-9]{1,}/", $parts[$k+1]))  return "演算子が連続してます";
-                    array_splice($parts, 0, 1, $parts[0] - $parts[$k+1]);
-                }
-            }
-        }
-
-    return round($parts[0], 1);
-}
+exit;
 
- ?>
\ No newline at end of file
+?>