#!/usr/local/bin/perl
#
# nph-minichat.txt は nph-minichat.cgi に名前変更してください。
;# 簡易チャット2(NPH仕様) version 6.0n
;#
;# This is Freesoft.
;# Copyright(c)2000 by rescue.ne.jp
# [基本構成] ( )内はパーミッション値
#
# /public_html/(ホームページディレクトリ)
# |
# +-- /cgi-local/(任意のディレクトリ)
# |
# |-- jcode.pl (644)
# |-- 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仕様化
#----------------#
# 初期設定 #
#----------------#
#◆名称
$title = '簡易チャット2';
#◆
設定
$body = '';
#◆チャット表示行
$max = 30;
#◆画面に挿入するリンクURL
$modoru = 'http://ホームページなどのURL';
#◆画面に挿入するリンクの名称
$modoru_name = '戻る';
#◆minichat.datのパス設定
$chat_file = './minichat.dat';
#◆日本語コード変換ライブラリ
require './jcode.pl';
#◆ホスト名をソースに表示 (1:する 0:しない)
$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; }
#--フォーム入力と解析 (項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'convert(*value,'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 "") { $time = time; &list(1); exit; } # 強制リロード
#--クッキー取得と解析 (クッキー名=項1:値1,項2:値2,項3:値3,…)
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {
($key,$val) = split(/=/,$pair,2);
$key =~ s/ //g;
if ($key eq "minichat") {
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@pairs2 = split(/\,/,$val);
foreach $pair (@pairs2) {
($key,$val) = split(/:/,$pair,2);
$COOKIE{$key} = $val;
}
}
}
if ($in{'uname'} eq "" && $COOKIE{'uname'} eq "" && -s $chat_file == 0) { print "HTTP/1.0 204 OK\r\n"; exit; }
if ($in{'uname'} eq "" && $COOKIE{'uname'} eq "") { $in{'Value'} = ""; }
if ($COOKIE{'uname'} eq "" && $in{'Value'} eq "") {
if ($TIME eq "" || $COOKIE{'reload'} eq $TIME) { print "HTTP/1.0 204 OK\r\n"; exit; } # 更新なし→ドキュメントを送信しない
else { $time = $TIME; &list(4); exit; } # 更新検知リロード
}
if ($COOKIE{'reload'} eq "" || $COOKIE{'uname'} eq "") { # 参加
if ($TIME eq "") { $TIME = time; }
if ($in{'Value'} ne "") { $COOKIE{'uname'} = $in{'uname'}; ®ist; $time = time; }
else { $time = $TIME; }
&list(2); exit;
}
if ($in{'Value'} ne "" && $COOKIE{'uname'} ne "") { $time = time; ®ist; &list(3); exit; }
if ($TIME eq "" || $COOKIE{'reload'} eq $TIME) { print "HTTP/1.0 204 OK\r\n"; exit; } # 更新なし→ドキュメントを送信しない
else { $time = $TIME; &list(4); exit; } # 更新検知リロード
sub list {
if ($in{'uname'} ne "") { $COOKIE{'uname'} = $in{'uname'}; }
$cookie = "reload:$time,uname:$COOKIE{'uname'}";
$cookie =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; # URLエンコード
$cookie =~ tr/ /+/;
print "HTTP/1.0 200 OK\r\n";
if ($buffer ne "") { print "Set-Cookie: minichat=$cookie\r\n"; }
else { print "Set-Cookie: minichat=reload:$time\r\n"; undef %COOKIE; }
if ($COOKIE{'uname'} eq "") { $body =~ s/
$title
$body
$title
\n";
foreach $line (@lines) {
$line =~ s/\n//g;
($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5);
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 regist {
if ($max <= $#lines +1) { pop(@lines); }
unshift(@lines,"$time\t$date_now\t$COOKIE{'uname'}\t$in{'Value'}\t$host\n");
if (!open(DB,"> $chat_file")) { &error('エラー','チャットファイルへ記録できません.'); }
print DB @lines;
close(DB);
}
sub error {
local (@msg) = @_;
local ($i);
print "HTTP/1.0 200 OK\r\n";
print "Content-type: text/html\r\n\r\n";
print <<"EOF";
$title
$body
$_[0]
EOF
print "\n";
foreach $i (1 .. $#msg) { print "- $msg[$i]\n"; }
print "
\n";
print <<"EOF";
EOF
exit;
}