#!/usr/local/bin/perl
#
# nph-minichat.txt は nph-minichat.cgi に名前変更してください。
;# 簡易チャット3(iMODE・Web双方向対応/NPH仕様) version 6.2i
;#
;# This is Freesoft.
;# Copyright(c)2000-2006 by CGI-RESCUE
# [基本構成] ( )内はパーミッション値
#
# /public_html/(ホームページディレクトリ)
# |
# |-- /cgi-bin/(任意のディレクトリ)
# |
# |-- jcode.pl (644) ... version2.0以降のものを使用のこと!
# |-- nph-minichat.cgi (755)
# |-- minichat.dat (666)
# [履歴]
#
# v1.0 26/FEB/96 初版
# v4.0 09/JUN/98
# ----------------ここを境にデータ互換はありません-----
# v5.0 30/NOV/98 JavaScript組み込み、データ構造の変更
# v5.1 01/DEC/98 JavaScriptエラー修正
# v5.2 16/JAN/99 JavaScriptの採用の有無設定可能に
# ----------------ここを境にデータ互換はありません-----
# v6.0n 16/MAR/00 NPH仕様化
# v6.0i 15/JUL/00 iMODE側からも利用可能に改良
# v6.1i 12/NOV/04 レスポンスヘッダの記述ミスを修正
# v6.2i 29/DEC/06 レスポンスヘッダの記述ミスを修正
#----------------#
# 初期設定 #
#----------------#
#◆名称
$title = '簡易チャット3';
#◆名称(iMODE用) 14文字以内推奨(半角カナOK)
$title_imode = 'アイミニチャット';
#◆
設定
$body = '';
#◆チャット表示行
$max = 20;
#◆チャット表示行(iMODE用) .. 少なくしないと転送量オーバーで表示できなくなる可能性が高くなります
$imax = 5;
#◆終了リンク先のURL
$modoru = 'http://www.rescue.ne.jp/cgis/minichat3/';
#◆iMODE用の終了リンク先のURL
$modoru_imode = 'http://www.rescue.ne.jp/i/';
#◆終了リンク名
$modoru_name = '終了';
#◆minichat.datのパス設定
$chat_file = './minichat.dat';
#◆日本語コード変換ライブラリ(version2.0以降のものを使用のこと)
require './jcode.pl';
#◆ホスト名をソースに表示 (1:する 0:しない) .. iMODEには表示されません
$view_host = 1;
#----------------------------------------------------------------------------
#--時間処理
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$date_now = sprintf("%d:%02d",$hour,$min);
#ホスト取得
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq '') { $host = $addr; }
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
#iMODEチェック
if ($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/) { $iMODE = 1; } else { $iMODE = 0; }
#--フォーム入力と解析 (項1=値1&項2=値2&項3=値3&…)
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
$buffer .= $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'h2z_sjis(*value); # 半角カナ→全角カナ変換
&jcode'convert(*value,'sjis'); # SJIS変換
$value =~ s/</g;
$value =~ s/>/>/g;
$value =~ s/\t//g;
$in{$name} = $value;
}
#--ログ取得
if (!open(DB,$chat_file)) { &error('システムエラー','チャットファイルが開けません.'); }
@lines = ;
close(DB);
($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$lines[0],5);
if ($in{'action'} eq "" || $in{'action'} == 2) { $time = time; &list(1); exit; } # 強制リロード
if ($in{'uname'} eq "" && -s $chat_file == 0) {
if ($iMODE) { &i204; }
else { print "HTTP/1.0 204 No Content\r\n"; }
exit;
}
if ($in{'uname'} eq "") { $in{'Value'} = ""; }
if ($in{'uname'} eq "" && $in{'Value'} eq "") {
if ($TIME eq "" || $in{'reload'} >= $TIME) { # 更新なし→ドキュメントを送信しない
if ($iMODE) { &i204; }
else { print "HTTP/1.0 204 No Content\r\n"; }
exit;
}
else { $time = $TIME; &list(4); exit; } # 更新検知リロード
}
if ($in{'reload'} eq "" || $in{'uname'} eq "") { # 参加
if ($TIME eq "") { $TIME = time; }
if ($in{'Value'} ne "") { $in{'uname'} = $in{'uname'}; ®ist; $time = time; }
else { $time = $TIME; }
&list(2); exit;
}
if ($in{'Value'} ne "" && $in{'uname'} ne "") { $time = time; ®ist; &list(3); exit; }
if ($TIME eq "" || $in{'reload'} >= $TIME) { # 更新なし→ドキュメントを送信しない
if ($iMODE) { &i204; }
else { print "HTTP/1.0 204 No Content\r\n"; }
exit;
}
else { $time = $TIME; &list(4); exit; } # 更新検知リロード
sub list {
if ($iMODE) { &list_imode; return; }
print "HTTP/1.0 200 OK\r\n";
if ($in{'uname'} eq "") { $body =~ s/
$title
$body
$title
\n";
foreach $line (@lines) {
$line =~ s/\n//g;
($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5);
$VALUE =~ s/\d+;//g;
if ($view_host) { $host = " "; }
else { $host = ""; }
#--URL自動リンク
$VALUE =~ s/"/"/g;
$VALUE =~ s/>/>/g;
$VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig;
#--Eメール自動リンク
$VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g;
print "
\n";
print "$UNAME > $VALUE ($DATE)$host\n";
}
print "
\n";
print "[$modoru_name] [リセット]\n";
#--このスクリプトの著作権表示(かならず表示してください)
print "
\n";
print "\n";
exit;
}
sub list_imode {
print "HTTP/1.0 200 OK\r\n";
print "Content-type: text/html\r\n\r\n";
print <<"EOF";
$title_imode
$body
\n";
if ($in{'line'} ne "") { $imax = $in{'line'}; }
foreach $line (@lines) {
$i++;
if ($i > $imax) { last; }
$line =~ s/\n//g;
&jcode'z2h_sjis(*line); # 全角カナ→半角カナ変換
($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5);
#--URL自動リンク
$VALUE =~ s/"/"/g;
$VALUE =~ s/>/>/g;
$VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig;
#--Eメール自動リンク
$VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g;
#--携帯番号自動リンク
$VALUE =~ s/(0\d0)(.)([-\d.]+)/$1$2$3<\/a>/g;
print "
\n";
print "$UNAME>$VALUE($DATE)\n";
}
print "
\n";
print "
\n";
#--このスクリプトの著作権表示(かならず表示してください)
print "\n";
print "\n";
exit;
}
sub regist {
if ($max <= $#lines +1) { pop(@lines); }
if ($in{'emoji'} ne "") { $in{'emoji'} = "$in{'emoji'};"; }
unshift(@lines,"$time\t$date_now\t$in{'uname'}\t$in{'Value'}$in{'emoji'}\t$host\n");
if (!open(DB,"> $chat_file")) { &error('エラー','チャットファイルへ記録できません.'); }
print DB @lines;
close(DB);
}
sub i204 {
local (@msg) = @_;
local ($i);
print "HTTP/1.0 200 OK\r\n";
print "Content-type: text/html\r\n\r\n";
print <<"EOF";
$title_imode
$body
新しい会話はありません.
会話表\示せず戻る
会話表\示して戻る