OSDN Git Service

trpgchat ver1.0.1
[trpgtools-onweb/AjaxChat.git] / write.php
1 <?php
2 /*
3  * Ajax Chat for TRPG ver.1.0.1
4  * (c)2007 Cake All righ1ts reserved.
5  * Mail : cake_67@users.sourceforge.jp
6  * Home : http://trpgtools-onweb.sourceforge.jp/
7  *
8  * [注意事項他]
9  * 本チャットスクリプトの使用および配布は、BSDライセンスに基づきます。
10  * BSDライセンスの詳細につきましては、添付のライセンス.txtを参照してください。
11  *
12  * BSDライセンス概要&使用上の注意
13  * 1. このスクリプトはフリーソフトです。以下の条件を満たす限りにおいて、使用・改造・再配布(オリジナルおよび改造版の両方とも)は自由です。
14  * 再配布する場合、上記著作権表示、本条件書きおよび第2項・第3項の責任限定規定を必ず含めてください。
15  * 2. 同梱のアイコンはPetite Prier様(http://snow.if.tv/)の素材です。
16       本スクリプトの使用および再配布時にアイコンをそのまま用いる場合は、配布元の規定も遵守してください。
17  * 3. 本スクリプトは無保証です。自己責任で使用してください。このスクリプトを使用したいかなる損害に対しても、作者は一切の責任を負いません。
18  * 4. 設置および使用方法に関する質問は、配布サイトの掲示板にお願いします。ただし、必ず回答できるとは限りません。
19  * メールによる質問は、ご遠慮ください。
20  */
21
22 // 設定ファイルの読み込み
23 require_once 'trpgchat-ini.php';
24 //メンバーチェッカー
25 require_once 'member_check.php';
26
27 // ユーザの情報
28 $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
29
30 // IPブロック
31 foreach ($block_ip as $v) {
32     if (strstr($host, $v)) { die("書きこみできません。"); }
33 }
34
35 // ファイルロック
36 $lfp = fopen($lockfile,"w");
37 stream_set_write_buffer($lfp, 0);
38 flock($lfp,LOCK_EX);
39
40 // 既存ファイル内容の格納
41 $log = array();
42 $log[] = file($recent_log);
43
44 // 受信データの整形
45 foreach($_GET as $k => $v) {
46     $data[$k] = htmlspecialchars($v);
47 }
48
49     // PC名がない場合PL名
50 if (!$data['c']) $data['c'] = $data['n'];
51
52 $ua = getenv("HTTP_USER_AGENT");
53
54     // コメント本文の処理:(予定)ダイス、カード、タグ有効[b,span,i,u]、オートリンク、禁止語句処理など
55         // ダイス
56 if ($dice_max) {
57     if(preg_match("/(.*)[[]\({0,}([0-9]{1,3})([dD])([0-9]{1,3})([-\+\*\/0-9\s]{0,}[\]])(.*$)/i", $data['m'], $dice)) {
58         $dice_result = dice_convert($dice[2], $dice[4], $dice[5], $dice_max, $dice_color);
59         $data['m'] = $dice[1].$dice_result.$dice[6];
60     }
61 }
62
63 // 既存ログのチェック
64 if(!is_array($log)){
65     $log = array();
66 } else {
67     $stopflag=0;
68     foreach ($log[0] as $k => $v){
69         $temp[$k] = explode("<>", $v);
70     }
71 }
72
73 // 書込み
74 if($stopflag==0) {
75
76     // 最新ログNO
77     if ($temp[0][0]) {
78         $last_id = $temp[0][0]+1;
79     } else {
80         $last_id = 1;
81     }
82
83     // 書き込み整形
84     $write = "";
85         // ログイン
86     if ($data['y'] =='in') {
87         $pcname = $system;
88         $data['m'] = $data['n'].$online_msg;
89         $data['l'] = $color_system;
90         $data['s'] = 0;
91         // ログアウト
92     } elseif ($data['y'] == 'out') {
93         $pcname = $system;
94         $data['m'] = $data['n'].$offline_msg;
95         $data['l'] = $color_system;
96         $data['s'] = 0;
97     } else {
98         $pcname = $data['c'];
99     }
100
101     if ($data['n'] && $data['p']) {
102         $pwd = create_hash($data['n'],$data['p']);
103     }
104
105     $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";
106
107     array_unshift($log[0], $write);
108
109     //最大行数を超えていたら最終行を削除
110     if (count($log[0]) >= $max_num) {
111         array_pop($log[0]);
112     }
113
114     // ログファイル更新
115     $fp = @fopen($recent_log, "w+") or die("ログファイルを開けません。");
116     //$bom = "\xef\xbb\xbf";
117     //fwrite($fp, $bom);
118
119         foreach($log[0] as $k => $v) {
120             fwrite($fp, $v);
121         }
122     fclose($fp);
123 }
124
125     //直近の過去ログ更新
126     write_recent_past($write, $past_log);
127
128     // ロック解除
129 fflush($lfp);
130 fclose($lfp);
131
132     //参加者チェッカーに書き込み
133 member_checker($data['n'], $pwd, $data['y'], $now_member, $getdata_off);
134
135 1;
136
137
138 /**** ここから関数 ****/
139
140 // 直近の過去ログ
141 function write_recent_past($write, $pdata) {
142     $pfp = @fopen($pdata, "a+") or die("過去ログファイルを開けません。");
143
144     fwrite($pfp, $write);
145
146     return true;
147 }
148
149 function dice_convert($dicenum, $dicenumber, $revision, $dice_max, $color) {
150
151     // ダイス本体
152     if($dicenum >= 1 && $dicenum <= $dice_max) {
153         if ($dicenumber >= 1 && $dicenumber <= 100) {
154             mt_srand((double) microtime() * 1000000);
155             $dicesum = 0;
156             for ($i=0; $i<$dicenum; $i++) {
157                 $d_result[$i] = mt_rand(1,$dicenumber);
158                 $dice_sum += $d_result[$i];
159                 if ($i != 0) {
160                     $dice_list .= ", ".$d_result[$i];
161                 } else {
162                     $dice_list = " (".$d_result[$i];
163                 }
164             }
165             $dice_list .= ")";
166         } else {
167             return $dice.' (d2~d100の範囲で指定してください)';
168         }
169     } else {
170         return $dice.' (ダイスの数は1から'.$dice_max.'の間で指定してください)';
171     }
172
173     // 修正値を加えた結果の計算
174     if(rtrim($revision, "]")) {
175         $dice = preg_replace("/\s/","+",$dice);
176         $value = calc_value($dice_sum, $revision);
177     } else {
178         $value = $dice_sum;
179     }
180
181     if (!is_numeric($value)) {
182         return '<span style="color:#'.$color.';">'.$dice.' ('.$value.')</span>';
183     } else {
184         $dice = '<span style="color:#'.$color.'; font-weight: bold;">['.$dicenum.'d'.$dicenumber.$revision.' :'.$dice_list.' = '.$value.'</span>';
185         return $dice;
186     }
187 }
188
189 /* ダイス修正値の計算
190  */
191 function calc_value($dice_sum, $revision) {
192     $multi = preg_match("/\*/", $revision);
193     $dev = preg_match("/\//", $revision);
194     $add = preg_match("/\+/", $revision);
195     $subtract = preg_match("/\-/", $revision);
196
197     // +-*/で分割
198     $revision = preg_replace("/\+/","<>+<>",$revision);
199     $revision = preg_replace("/\-/","<>-<>",$revision);
200     $revision = preg_replace("/\*/","<>*<>",$revision);
201     $revision = preg_replace("/\//","<>/<>",$revision);
202     $parts = explode("<>",$revision);
203     array_splice($parts, 0, 1, $dice_sum);
204
205     // 乗算&除算
206     if ($multi || $dev) {
207         foreach ($parts as $k => $v) {
208             if ($v != '0' && $v == '*') {
209                 if (!preg_match("/[0-9]{1,}/", $parts[$k+1])) return "演算子が連続してます";
210                 $flg = $k;
211                 array_splice($parts, $k+1, 1, $parts[$k-1] * $parts[$k+1]);
212                 array_splice($parts, $k-1, 1, 0);
213                 array_splice($parts, $k, 1, $parts[$k-2]);
214                 array_splice($parts, $k-2, 1, '+');
215             }
216             if ($v != '0' && $v == '/') {
217                 if (!preg_match("/[0-9]{1,}/", $parts[$k+1])) return "演算子が連続してます";
218                 array_splice($parts, $k+1, 1, $parts[$k-1] / $parts[$k+1]);
219                 array_splice($parts, $k-1, 1, 0);
220                 array_splice($parts, $k, 1, $parts[$k-2]);
221                 array_splice($parts, $k-2, 1, '+');
222             }
223         }
224     }
225
226     // 加減算
227         foreach ($parts as $k => $v){
228             if ($v != '0') {
229                 if ($v == '+') {
230                     if (!preg_match("/[0-9]{1,}/", $parts[$k+1]))  return "演算子が連続してます";
231                     array_splice($parts, 0, 1, $parts[0] + $parts[$k+1]);
232                 } elseif ($v == '-') {
233                     if (!preg_match("/[0-9]{1,}/", $parts[$k+1]))  return "演算子が連続してます";
234                     array_splice($parts, 0, 1, $parts[0] - $parts[$k+1]);
235                 }
236             }
237         }
238
239     return round($parts[0], 1);
240 }
241
242  ?>