#!/usr/local/bin/perl ################################################################ # # kchat.cgi version 0.1.0 # i-mode、J-SKY対応チャット # 作成日:2001.07.14 # Copyright (C) 2001 Kiyoteru Onishi # URL http://www.kiyoproject.com/ # ################################################################ # # ■使用許諾 # 本ソフトウェアはフリーソフトです。個人使用、業務使用に関わら # ず、以下の条件を満たす限りにおいてソースの改良、および再配布 # してかまいません。 # # 1. 上記著作権表示、下記免責事項を必ず含めてください。 # # 2. 再配布は、入手したファイルを全て含めた形で行ってください。 # # 3. 変更バージョンは、変更バージョンであることを明示してくださ # い。 # # 4. 変更を行った者は、それが誰であるかを明示し、変更日を明確に # してください。 # # 本ソフトウェアは KIYO Project によって"現状のまま"提供される # ものとします。通常そなえるべき品質をそなえているとの保証も、 # 特定の目的に適合するとの保証を含め、いかなる保証もなされませ # ん。本ソフトウェア使用による、損害発生の原因いかんを問わず、 # KIYO Project は責任を一切負いません。 # # ■ファイル配置 # public_html -- cgi-bin # | # |-- jcode.pl # | # |-- i # | | # | |-- kchat.cgi # | | # | |-- log # | | # | |-- kchat.dat # | |-- kchat.log # | # |-- lib # | # |-- pllibs.pl # # ■パーミッション # -------------------------------------------------- # ファイル名 アクセス権 # -------------------------------------------------- # i 755(ディレクトリ) # log 777(ディレクトリ) # lib 755(ディレクトリ) # kchat.cgi 755(プログラム) # kchat.dat 666(ログファイル) # kchat.log 666(アクセスログ) # jcode.pl 644(ライブラリ) # plibs.pl 644(ライブラリ) # -------------------------------------------------- # ################################################################ ############## # 環境設定 # ############## # ライブラリ取り込み require '../jcode.pl'; require '../lib/plibs.pl'; $script = './kchat.cgi'; # スクリプトのパス $logfile = './log/kchat.dat'; # ログファイルのパス $axlog = './log/kchat.log'; # アクセスログのパス $dbmax = 12; # 画面表示件数 $axmax = 200; # アクセスログ保存件数 $title = 'K-ちゃっと'; # タイトル $bgcolor = '#e2ffe2'; # 背景色 $ret_iurl = '../../i/index.html'; # 戻り先ページ(i-mode) $ret_jurl = '../../i/index.html'; # 戻り先ページ(J-SKY) $ret_url = '../../index.html'; # 戻り先ページ(PC) $charset = 'Shift_JIS'; # 文字コード設定 # 禁止ワード @WORDS = ('殺す','死ね','援助交際','援交'); ############## # 設定終了 # ############## $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; $agent = $ENV{'HTTP_USER_AGENT'}; # 携帯電話からのアクセスかをチェック $ketai = &plibs'_ketaiax($agent); # ホスト名の取得 $host = &plibs'_gethost($addr, $host); # フォームデータのデコード &plibs'decode(*form); $name = $form{'name'}; $text = $form{'text'}; # HTMLタグを無効にする &plibs'nottag(*name); &plibs'nottag(*text); # i-mode対応絵文字処理 &plibs'imoji(*name); &plibs'imoji(*text); # 日本語文字コード変換 &jcode'convert(*name, 'sjis'); &jcode'convert(*text, 'sjis'); ################## # HTML上部分表示 # ################## &datachk; &plibs'header($title, $charset); print <<"EOD";

$title


名前
EOD if ($ketai == 1) { print qq|
\n|; } elsif ($ketai == 2) { print qq|
\n|; } else { print qq|
\n|; } print "発言
\n"; if ($ketai == 1) { print qq|\n|; } elsif ($ketai == 2) { print qq|\n|; } else { print qq|\n|; } print qq|

\n|; $i = 0; # 表示件数のカウンタ if (($text ne '') && ($name ne '')){ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $current_time = sprintf("\"%04d/%02d/%02d(%s)\",\"%02d:%02d:%02d\"", $year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec); $time = sprintf("%02d:%02d", $hour,$min); $ax = "$name>$text"; $post = "$ax [$time]
\n"; push(@new_recs, $post); print $post; $i = 1; } ######################## # データ読み込みと表示 # ######################## if (open(IN, "$logfile")) { @recs = ; close(IN); foreach $rec (@recs) { $i++; if ($i == ($dbmax+1)) { last; } print $rec; # 実際の表示 push(@new_recs, $rec); } } ############## # データ更新 # ############## if ($i > 0) { open(OUT, "+<$logfile"); flock(OUT, 2); truncate(OUT, 0); print OUT @new_recs; flock(OUT, 8); close(OUT); ###################### # アクセスログの更新 # ###################### $logdata = "\"$ax\",$current_time,\"$addr\",\"$host\",\"$agent\""; open(IN,"$axlog"); @lines = ; close(IN); # 最大ログ数を調整 $axmax--; while ($axmax < @lines) { shift(@lines); } # アクセスデータをフォーマット push(@lines,"$logdata\n"); # 書き込み if ($ax ne '') { open(OUT,"+<$axlog"); flock(OUT, 2); truncate(OUT, 0); print OUT @lines; flock(OUT, 8); close(OUT); } } ################## # HTML下部分表示 # ################## if ($ketai == 1) { # i-mode print qq|
戀戻る|; print qq| 憐先頭
\n|; } elsif ($ketai == 2) { # J-SKY print qq|
[0]戻る|; print qq| [9]先頭
\n|; } else { # PC if ($name ne '') { $top = '#text'; } else { $top = '#name'; } print qq|
[0]戻る|; print qq| [9]先頭
\n|; print qq|
\n|; print qq|Copyright (C) 2001 KIYO Project\n|; print qq|

\n|; } print qq|\n|; exit; #################### # 入力文字チェック # #################### sub datachk { local($namemax) = length($name); local($textmax) = length($text); if ($namemax > 20) { &plibs'cgierror('入力エラー','名前は全角10文字以内にしてください。',$script); } elsif ($textmax > 200) { &plibs'cgierror('入力エラー','発言は全角100文字以内にしてください。', "$script?name=$name"); } &wordcheck($name); &wordcheck($text); } ###################### # 禁止ワードチェック # ###################### sub wordcheck { local($s) = @_; local($match) = 0; local($word); foreach $word (@WORDS) { if (index($s, $word) >= 0) { $match = 1; $s = $word; last; } } if ($match) { &plibs'cgierror('入力エラー',"禁止ワード「$s」が使用されています。",$script); } }