#!/usr/local/bin/perl

;# 簡易ＣＨＡＴ version 4.0（フリーソフト）
;#
;# Script written by Kazu.Y
;# Created on: 26/FEB/96
;# Last Modified on: 24/SEP/97
;# I can be reached at: rescue@ask.or.jp
;# Scripts Found at: http://www2r.biglobe.ne.jp/~rescue/

# 注意！これ以前のバージョンとのデータ互換はありません.

#----------------#
#    初期設定    #
#----------------#

#◆minichat.datのパス設定 
#　minichat.cgiと同じ場所に設置する場合はこのままでよい.
$chat_file = './minichat.dat';

#◆名称
$title = '<FONT SIZE=8>ＨＭＳチャットルーム</FONT><BR>望月ゼミはバーチャルゼミへ着々と進行中！';

#◆<BODY>設定
$body = '<body background="jm/img/red1.gif">';

#◆チャット表示行
$max = '20';

#◆画面に挿入するリンクＵＲＬ
$modoru = 'http://www.isc.senshu-u.ac.jp/~the0350/Welcome.htm';

#◆画面に挿入するリンクの名称
$modoru_name = 'ゼミナールホームページへ';

#◆入力方式 (標準:post その他:get)
$method = 'post';

#◆日本語コード変換ライブラリ
#　minichat.cgiと同じ場所に設置する場合はこのままでよい.
require './jcode.pl';

#----------------------------------------------------------------------------

#■時間処理

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$date_now = sprintf("%02d時%02d分",$hour,$min);

#■入力処理

if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $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/</&lt;/g;
	$value =~ s/>/&gt;/g;
	if ($name eq 'chat') { $value =~ s/\,/\0/g; } else { $value =~ s/\,//g; }
	$value =~ s/\n//g;
	$FORM{$name} = $value;
}

if ($FORM{'chat'} ne '' && $FORM{'name'} ne '') { &write; }

#■画面出力

print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "$body\n";
print "<h1>$title</h1>\n";

print "<form method=$method action=\"minichat.cgi\">\n";

if ($FORM{'name'} eq '') { print "チャットネーム <input type=text name=\"name\" size=10> <input type=submit value=\"参加\"><p>\n"; }
else {

	print "<input type=hidden name=\"name\" value=\"$FORM{'name'}\">\n";
	print "<b>$FORM{'name'}</b> &gt; <input type=text name=\"chat\" size=60> <input type=submit value=\"発言/更新\"><p>\n";
}

print "</form><hr>\n";

if (!open(IN,"$chat_file")) { &error('システムエラー','チャットファイルが開けません.'); }
@DATA = <IN>;
close(IN);

@DATA = reverse(@DATA);

foreach $data (@DATA) {

	if ($data =~ /(.*)\,(.*)\,(.*)\,(.*)\,(.*)/) { $date = $1; $name = $2; $chat = $3; $email = $4; $host = $5; }
	else { next; }

	chop($email) if $email =~ /\n$/;
	$chat =~ s/\0/\,/g;
	if ($email =~ /(.*)\@(.*)\.(.*)/) { print "<b><a href=\"mailto:$email\">$name</a></b> &gt; $chat ($date $host)<hr>\n"; }
	else { print "<b>$name</b> &gt; $chat ($date $host)<hr>\n"; }
}

print "[<a href=\"$modoru\">$modoru_name</a>]<p>\n";

# このスクリプトの著作権表示（かならず表示してください）
print "<h4 align=right><a href=\"http://www2r.biglobe.ne.jp/~rescue/\" target=\"_top\">MiniCHAT v4.0</a> is Free.</h4>\n";

print "<p></body></html>\n";
exit;

sub write {

	if (!open(DB,"$chat_file")) { &error('システムエラー','チャットファイルが開けません.'); }
	@lines = <DB>;
	close(DB);

	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
	if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }

	$axs = @lines;
	if ($axs >= $max) { shift(@lines); }
	push(@lines,"$date_now\,$FORM{'name'}\,$FORM{'chat'}\,$FORM{'email'}\,$host\n");

	if (!open(DB,">$chat_file")) { &error('システムエラー','チャットファイルへ記録できません.'); }
	print DB @lines;
	close(DB);
}

sub error {

        print "<html><head><title>$title</title></head>\n";
        print "$body\n";
        print "<h1>$_[0]</h1>\n";
	print "<h3>$_[1]</h3>\n";
	print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.<p>\n";
        print "</body></html>\n";
        exit;
}
