OSDN Git Service

trpgchat ver2.6
[trpgtools-onweb/AjaxChat.git] / mwrite.php
1 <?php
2 /*
3  Ajax Chat for TRPG ver.2.6
4  (c)2007-2009 Cake All Rights Reserved.
5  Mail : cake_67@users.sourceforge.jp
6  Home : http://trpgtools-onweb.sourceforge.jp/
7  */
8
9 /* 携帯用発言書込み */
10
11 // デバッグ用設定
12 ini_set('log_errors', false);
13 ini_set('error_log', "./php_error.log");
14
15 // 設定ファイルの読み込み
16 require_once './trpgchat-ini.php';
17 require_once './lib/trpgchat.php';
18 require_once './lib/write.php';
19 require_once './lib/member_check.php';
20 require_once './lib/mobile.php';
21
22 // 設定セット
23 set_config(read_config());
24
25 // 携帯使用設定
26 if (!USE_MOBILE) {
27     mobile_error('携帯から利用できません。');
28 }
29
30 if (DICE_MAX != 0) {
31     require_once './lib/trpg.php';
32 }
33
34 // 携帯以外のアクセス禁止
35 if (!is_mobile_access($ua)) {
36     mobile_error('携帯以外からはご利用できません。');
37 }
38
39 // 書き込みブロック
40 write_block();
41
42 // アクセスブロック
43 access_block();
44
45 // リクエスト受信
46 if (!$request = $_GET) {
47     mobile_error('データ受信できません');
48 }
49
50 // PL名・コメントがなければ書込みはできない(含ロボット対策)
51 if ((!$request['n'] && !$request['c']) || !$request['m']) mobile_error("書きこみできません");
52
53 // ファイルロック
54 $lfp = fopen(LOCK,"w");
55 stream_set_write_buffer($lfp, 0);
56 flock($lfp,LOCK_EX);
57
58 // 既存ファイル内容の格納
59 $log = array();
60 $log[] = file(RECENT_LOG);
61
62 // 受信データの成形
63 foreach($request as $k => $v) {
64     $data[$k] = htmlspecialchars($v);
65 }
66
67 // ログアウト
68 if ($request['mode'] == 'logout') {
69     $data = set_mobile_logout_data($data);
70 // PC名がない場合、ログイン
71 // PC名がある場合はPC名=PL名
72 } elseif (!$data['c']) {
73     $data['c'] = $data['n'];
74     // PL名チェック:現状なし
75     // ログインデータセット
76     $login_data = set_mobile_login_data($data);
77 } else {
78     $data['n'] = $data['c'];
79     // PL名チェック:現状なし(入れる場合、UAチェックなど必要)
80 }
81
82 // コメント本文の処理:(予定)ダイス、カード、タグ有効[b,span,i,u]、オートリンク、禁止語句処理など
83
84 // ダイス対応
85 if (DICE_MAX != 0) {
86     // コメント欄
87     $data['m'] = convert_dice($data['m']);
88 }
89
90 // HTMLタグ
91 $data['m'] = convert_html_tag($data['m']);
92
93 // オートリンク
94 $data['m'] = convert_autolink($data['m']);
95
96 // 既存ログのチェック
97 if(!is_array($log)){
98     $log = array();
99 } else {
100     $stopflag=0;
101     foreach ($log[0] as $k => $v){
102         $temp[$k] = explode("<>", $v);
103     }
104 }
105
106 // 書込み
107 if ($stopflag==0) {
108
109     // 最新ログNO
110     if ($temp[0][0]) {
111         $last_id = $temp[0][0]+1;
112     } else {
113         $last_id = 1;
114     }
115
116     // ログに書きこみ追加
117     if ($request['mode'] != 'logout' && !empty($login_data)) {
118         $log = mobile_set_log($login_data, $log, $last_id, $host, $ua, true);
119     }
120     $log = mobile_set_log($data, $log, $last_id, $host, $ua, $request['mode']);
121
122     // ログファイル更新
123     $fp = @fopen(RECENT_LOG, "w+") or error("ログファイルを開けません。", true);
124     //$bom = "\xef\xbb\xbf";
125     //fwrite($fp, $bom);
126
127     foreach($log[0] as $k => $v) {
128         fwrite($fp, $v);
129     }
130     fclose($fp);
131 }
132
133 // ロック解除
134 fflush($lfp);
135 fclose($lfp);
136
137 //参加者チェッカーに書き込み
138 // 現状なし
139 //member_checker($dn, $pwd, $request['y'], true);
140
141 // 遷移
142 $params = '/mindex.php';
143 $self_url = get_self_url();
144 if ($request['mode'] == 'logout') {
145     $params .= '?msg='.urlencode('ログアウトしました');
146     $url = str_replace('/mwrite.php', '', $self_url).$params;
147     header('Location: '. $url);
148     exit;
149 } else {
150     $params .= '?c='.urlencode(encode2utf8($data['c'])).'&r='.$data['r'];
151     $url = str_replace('/mwrite.php', '', $self_url).$params;
152     header('Location: '. $url);
153     exit;
154 }
155
156 /* 
157  * ログに追加
158  */
159 function mobile_set_log($data, $log, $last_id, $host, $ua, $system=false)
160 {
161     // 書き込み成形
162     $write = "";
163     $dm = $data['m'];
164     $pcname = $data['c'];
165
166     $pwd = ''; // パスワード:なし
167     if ($system) {
168         $data['l'] = COLOR_SYSTEM; // システム文字色
169     } else {
170         $data['l'] = ''; // PC文字色:
171     }
172     $dn = $data['n'];
173     $dw = ''; // pwdハッシュ
174     $dh = ''; // ステータス表示有無
175     $dt = ''; // ステータス
176     // 難読化
177     if (OBFUSCATION) {
178         $pcname = obf_xor(encode2utf8($pcname));
179         $dm = obf_xor(encode2utf8($dm));
180         $dn = obf_xor(encode2utf8($dn));
181         if ($dw) $dw = obf_xor(encode2utf8($dw));
182         if ($dt) $dt = obf_xor(encode2utf8($dt));
183     }
184
185     $write = $last_id."<>".$dn."<>".$pcname."<>".$data['l']."<>".$dm."<>".time()."<>".$host."<>".$ua."<>".$pwd."<>".$dw."<>".$dh."<>".$data['s']."<>".$dt."<>1\n";
186
187
188     // 直近の過去ログ更新
189     write_recent_past(encode2utf8($write), PAST_LOG);
190
191     // ログ更新
192     array_unshift($log[0], encode2utf8($write));
193
194     //最大行数を超えていたら最終行を削除
195     if (count($log[0]) >= MAX_NUM) {
196         array_pop($log[0]);
197     }
198
199     return $log;
200 }
201
202 /* 
203  * ログイン
204  */
205 function set_mobile_login_data($data) 
206 {
207     $data['c'] = encode2sjis(SYSTEM);
208     $data['m'] = $data['n'].encode2sjis(ONLINE_MSG);
209     $data['s'] = 0;
210
211     return $data;
212 }
213
214 /* 
215  * ログアウト
216  */
217 function set_mobile_logout_data($data) 
218 {
219     $data['c'] = encode2sjis(SYSTEM);
220     $data['m'] = $data['n'].encode2sjis(OFFLINE_MSG);
221     $data['s'] = 0;
222
223     return $data;
224 }
225 /* SJISへ変換 */
226 function encode2sjis($str)
227 {
228     return mb_convert_encoding($str, 'SJIS-win', 'UTF-8');
229 }
230
231 /* UTF8へ変換 */
232 function encode2utf8($str)
233 {
234     return mb_convert_encoding($str, 'UTF-8', 'SJIS-win');
235 }
236
237
238 ?>