#!/usr/bin/perl

#******************************************************************************
#lchat.cgi - Light Chat Ver.2.12
#
#Version   	:2.12
#modified  	:2000/12/26
#Copyright 	:The Room
#E-Mail		:dream@lib.net
#URL		:http://dream.lib.net/room/
#
#これはフリー素材です。
#転載・商用目的の利用の際には、メールをお願いします。
#
#******************************************************************************
#1行目のperlのディレクトリ指定は、サーバによって異なります。
#詳しくは、管理者にお聞きください。
#******************************************************************************
#
# jcode.plのパス
$jcode = './jcode.pl';

# ログファイルのパス
$logfile = './log.dat';

# 入室者チェックファイルのパス
$menfile = './men.dat';

# アクセス拒否ファイルのパス
$denyfile = './deny.dat';

#*****************************************************************************

#管理人パスワード
$adminpass = 'Shinonome2022';

#管理人の表示色
$admin_color = 'orange';

#管理人の名前
$admin_name = '管理人';

#入室時及び退室時の挨拶
# NAME のところに挨拶する相手の名前が自動的に入ります。
$admin_entermsg = 'NAMEさん、いらっしゃい〜☆';
$admin_byemsg = 'NAMEさん、また来てね〜☆';

#******************************************************************************

# ROM禁止なら 1 を設定
$romdeny = 0;

# 入室制限をするなら、制限人数を設定。
# しないなら 0 を設定
$limitenter = 0;

# 入室者表示の区切り記号
$delimita = '☆';

# ROMメンバーも表示するなら 1 を設定
$indicate_rom = 1;

# ROM禁止の時の、ROMに対しての表示
# 0 なら何も表示せず
# 1 なら入室者人数を表示
# 2 なら入室者人数と入室者名のリストを表示
$indicate_in_member = 2;

# 個人会話機能を使用するなら 1 を。
$secrettalk = 1;

#*****************************************************************************

# IP をソースに表示するなら 1 を設定
$ipindicate = 0;

#ログの最大保存行数
$logmax = 200;

#使用を許可するタグ
@permittag = ('b','i','font');

#URLが書かれたら自動的にリンクを貼る場合は 1 を。
$autolink = 1;

#書きこみの最大文字数
$maxwrite = 400;

# 時間の表示色
$data_color = '#8080ff';

sub timeset{
	my @weekday = qw (Sun Mon Tue Wed Thr Fri Sat);
	my ($sec,$min,$hour,$day,$month,$year,$wday) = gmtime(time()+32400);
	$year+=1900;$month++;
	$min = "0$min" if $min < 10;

#時間表示の設定
# $year/$month/$day $hour:$min:$sec
# 各々、年月日 時分秒をあらわします。
return "$month/$day $hour:$min:$sec";

	}


#*****************************************************************************

#ホームページURL（「Back to Homepage」のリンク先）
$homeurl = 'http://www.for.gr.jp/comi/';

#リンクのターゲット（フレーム化環境で使うときは _parent などの指定）
$linktarget = '_top';

#テーブルの色1（「お名前」などの背景色）
$table_color_1 = '#d0d0ff';

#テーブルの色2（名前入力欄などの背景色）
$table_color_2 = '#f0f0ff';

#タイトル
$title = 'FORコミchat';

#BODYタグ
$body = '<body bgcolor=#ffffff text=#000000 link=#6060a0 vlink=#6060a0 alink=#a0a0ff>';

#ページ上部に表示する題名
$pagetop = '<div align=left><b>FORコミchat</b></div>';

#スタイルシート
# .input が入力ボックス、 .button がボタンの設定です。
# NN4.7以前では、設定しても表示に反映されません。
$stylesheet = <<EOD;
<style type = "text/css">
<!--
BODY,TD,TH{
	font-size: 10pt;
	}

HR 	{
	color:#d0d0ff;
	}

.input 	{
	border-color:#a0a0ff;
	border-style:solid solid solid solid;
	background-color: #f0f0ff;
	}

.button	{
	border-color:#9090ef;
	border-style:solid solid solid solid;
	background-color: #f0f0ff;
	color: #0000ff;
	}
-->
</style>

EOD
#******************************************************************************
#色
# $sel_color にカラーコードを、$sel_colorname に色の名前を。
#
# 増やしたい場合は、$sel_color[9] のように、[]内の数値を増やして
# 追加してください。

$sel_color[0] = '#ff0000';$sel_colorname[0]='赤';
$sel_color[1] = '#008000';$sel_colorname[1]='緑';
$sel_color[2] = '#0000ff';$sel_colorname[2]='青';
$sel_color[3] = '#c0c020';$sel_colorname[3]='黄';
$sel_color[4] = '#000000';$sel_colorname[4]='黒';
$sel_color[5] = '#ff00ff';$sel_colorname[5]='ピンク';
$sel_color[6] = '#00c0c0';$sel_colorname[6]='水色';
$sel_color[7] = '#900090';$sel_colorname[7]='紫';
$sel_color[8] = '#804040';$sel_colorname[8]='茶色';
#
#表示行数（行）
$indicate_lines[0] = '10';
$indicate_lines[1] = '20';
$indicate_lines[2] = '50';
$indicate_lines[3] = '100';
$indicate_lines[4] = '200';
$indicate_lines[5] = '9999';#9999に設定すると、全部のログを表示します。
#
#リロード時間（秒）
$reload_time[0] = '20';
$reload_time[1] = '30';
$reload_time[2] = '45';
$reload_time[3] = '60';
$reload_time[4] = '90';
$reload_time[5] = '120';
$reload_time[6] = '9999';#9999にすると、手動更新になります。

#各々の初期設定の番号
# 番号は [0] などのカッコ内の数字を指定します。
$new_sel_color = 0;#色
$new_indicate_lines = 1;#表示行数
$new_reload_time = 1;#リロード時間

#******************************************************************************
#jcode.plの読みこみ
require $jcode;
if ($romdeny == 1){$indicate_rom = 0;}

#データ受け取り
$cl = $ENV{"CONTENT_LENGTH"};
if( $cl > 0 ){
	read(STDIN, $qs, $cl );
}else{
	$qs = $ENV{"QUERY_STRING"};
}

@contents = split(/&/,$qs);
foreach $i (0 .. $#contents) {
	local($key,$text)= split(/=/,$contents[$i]);
	$ename = $text if $key eq 'name';
	$text =~ s/\+/ /g;
	$text =~ s/%(..)/pack("c",hex($1))/ge;
	$text =~ s/\r\n/\n/g; 
	$text =~ s/\n//g;
	&jcode'convert(*text,'sjis');

	$act = $text if $key eq 'act';
	$act2 = $text if $key eq 'act2';
	$act3 = $text if $key eq 'act3';
	$act4 = $text if $key eq 'act4';
	$name = $text if $key eq 'name';
	$address = $text if $key eq 'address';
	$color = $text if $key eq 'color';
	$lines = $text if $key eq 'lines';
	$reloadtime = $text if $key eq 'reloadtime';
	$hrindi = $text if $key eq 'hrindi';
	$msg = $text if $key eq 'msg';
	$admsg = $text if $key eq 'admsg';
	$secret_target = $text if $key eq 'secret_target';
	$pass = $text if $key eq 'pass';
}

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

&member_check;

if (($act eq "") || ($act eq "enterform") || ($act eq "enterframe")){
	#初期表示時のみクッキー読みこみ
	for $a1 (split(/; */, $ENV{'HTTP_COOKIE'})) {
		($a2, $a3) = split(/=/, $a1);
		$a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
		$cookie{$a2} = $a3;
		}
	$name = $cookie{'name'} if $name eq "";
	$name = $ip if $name eq "";
	$color = $cookie{'color'} if $color eq "";
	$color = $new_sel_color if $sel_color[$color] eq "" || $color eq "";
	$lines = $cookie{'lines'} if $lines eq "";
	$lines = $new_indicate_lines if $indicate_lines[$lines] eq "" || $lines eq "";
	$reloadtime = $cookie{'reloadtime'} if $reloadtime eq "";
	$reloadtime = $new_reload_time if $reload_time[$reloadtime] eq "" || $reloadtime eq "";
	$hrindi = $cookie{'hrindi'} if $hrindi eq "";
	$hrindi = 0 if $hrindi != 0 && $hrindi != 1;
	$address = $cookie{'address'} if $address eq "";
	}
elsif (($act eq "mainframe") || ($act eq "changeframe")){
	#入室時・変更時のみクッキー書きこみ
	$name = $ip if $name eq "";
	$color = $new_sel_color if $sel_color[$color] eq "" || $color eq "";
	$lines = $new_indicate_lines if $indicate_lines[$lines] eq "" || $lines eq "";
	$reloadtime = $new_reload_time if $reload_time[$reloadtime] eq "" || $reloadtime eq "";
	$hrindi = 0 if $hrindi != 0 && $hrindi != 1;
	print "Set-Cookie:name=$name;expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
	print "Set-Cookie:color=$color;expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
	print "Set-Cookie:lines=$lines;expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
	print "Set-Cookie:reloadtime=$reloadtime;expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
	print "Set-Cookie:hrindi=$hrindi;expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
	}

$flag = 0;
open (IO,"+<$denyfile");
eval{flock(IO,2)};
while(<IO>){
	chomp;
	@y2=split(/<>/,$_);
	if (($act2 eq "deny") && ($act3 eq $y2[1]) && ($msg eq $y2[0]) && ($act4 == 1)){
		$admsg = "「$msg」を拒否リストから削除しました。";
		$flag = 1;
		next;
		}
	elsif ($y2[1] eq "IP"){
		push(@ipdeny,$y2[0]);
		if ($ip =~ /$y2[0]/i){&error("あなたのアクセスは拒否されました。");}
		}
	elsif ($y2[1] eq "HOST"){
		push(@hostdeny,$y2[0]);
		if ($host =~ /$y2[0]/i){&error("あなたのアクセスは拒否されました。");}
		}
	elsif ($y2[1] eq "REF"){
		push(@refdeny,$y2[0]);
		if ($ENV{'HTTP_REFERER'} =~ /$y2[0]/i){&error("あなたのアクセスは拒否されました。");}
		}
	elsif ($y2[1] eq "NAME"){
		push(@namedeny,$y2[0]);
		if ($name eq $y2[0]){&error("あなたのアクセスは拒否されました。");}
		}
	}
if (($act2 eq "deny") && ($msg ne "") && ($act4 == 0) && ($flag == 0)){
	if ($act3 eq "IP"){push(@ipdeny,$msg);$flag=1;}
	elsif ($act3 eq "HOST"){push(@hostdeny,$msg);$flag=1;}
	elsif ($act3 eq "REF"){push(@refdeny,$msg);$flag=1;}
	elsif ($act3 eq "NAME"){push(@namedeny,$msg);$flag=1;}
	if ($flag){
		$admsg="「$msg」を追加しました。";
		}else{
		$admsg="指定が不正です。";
		}
	}
if($flag){
	truncate(IO,0);
	seek(IO,0,0);
	foreach(@ipdeny){print IO "$_<>IP<>\n";}
	foreach(@hostdeny){print IO "$_<>HOST<>\n";}
	foreach(@refdeny){print IO "$_<>REF<>\n";}
	foreach(@namedeny){print IO "$_<>NAME<>\n";}
	}
close (IO);

if (($act =~ /admin/) && ($pass ne $adminpass)){&error("パスワードが間違っています。");}
if (($act eq "saymsg") && ($msg eq "")){$act="reload";}
if ($act eq ""){&enterframe;}
elsif ($act eq "mainframe"){&mainframe;}
elsif ($act eq "changeframe"){&changeframe;}
elsif ($act eq "byeframe"){&byeframe;}
elsif ($act eq "adminframe"){&adminframe;}
elsif ($act eq "adminform"){&adminform;}
elsif ($act eq "adminreload"){&adminreload;}

elsif ($act eq "enterform"){&enterform;}
elsif ($act eq "sayform"){&sayform;}
elsif ($act eq "byeform"){&byeform;}

elsif ($act eq "romdeny"){&romdeny;}
elsif ($act eq "saymsg"){&saymsg;}
elsif ($act eq "entergreet"){&entergreet;}
elsif ($act eq "byemsg"){&byemsg;}
elsif ($act eq "reload"){&reload;}
elsif ($act eq "deleteme"){&deleteme;}

&error("<b>不正なコマンドが送信されました($act)。</b>");

#******************************************************************************
sub byeform{
#退室フォーム
&hphead();
print <<EOD;
<div align=center>
<br>
ご利用ありがとうございました。<br>
<br>
<a href="$homeurl" target="$linktarget">&lt;&lt;Back to Home</a><br>
<br>
EOD
&hpfoot;
}
#******************************************************************************
sub adminform{
#管理フォーム
my ($a1,$a2,$a3,$a4)=&sel_box;
&hphead();
print <<EOD;
<script language="javascript">
<!--
function clearmsg(){
document.logdel.msg.value="";
document.logdel.msg.focus();
}
-->
</script>
<a name="top"></a>
<b>管理モード</b><br>
<hr>
<form method="post" action="./lchat.cgi" target="$linktarget">
<table>
<tr>
<td><a href="#middle" style="text-decoration:none;">▽</a></td>
<td bgcolor=$table_color_1>表\示行数</td>
<td bgcolor=$table_color_2>$a2</td>
<td bgcolor=$table_color_1>リロード</td>
<td bgcolor=$table_color_2>$a3</td>
<td><input type="submit" value="変更" class="button"></td>
</tr>
</table>

<input type="hidden" name="act" value="adminframe">
<input type="hidden" name="pass" value="$pass">
</form>
<hr>
<a name="middle"></a>
<b>ログ削除</b><br>
<form method="post" action="./lchat.cgi" target="frame2" name="logdel" onsubmit="setTimeout(&quot;clearmsg()&quot;,10)">
<table>
<tr>
<td valign=middle>
<a href="#top" style="text-decoration:none;">△</a><br>
<a href="#under" style="text-decoration:none;">▽</a></td>
<td>
<input type="text" name="msg" size=16 class="input">
という
<select name="act3" class="input">
<option value="0" selected">名前からの投稿
<option value="1">IPからの投稿
<option value="2">指定文字を含む投稿
</select>
を
<input type="submit" value="削除する" class="button">
<input type="hidden" name="act" value="adminreload">
<input type="hidden" name="act2" value="delete">
<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="lines" value="$lines">
<input type="hidden" name="reloadtime" value="$reloadtime">
</td>
</tr>
</table>

</form>

<hr>
<a name="under"></a>
<b>拒否設定</b><br>
<form method="post" action="./lchat.cgi" target="$linktarget" name="acsdeny">
<a href="#middle" style="text-decoration:none;">△</a>
<input type="text" name="msg" size=16 class="input">
という
<select name="act3" class="input">
<option value="IP" selected">IPからのアクセス
<option value="HOST">ホスト名からのアクセス
<option value="REF">リンク元からのアクセス
<option value="NAME">名前からのアクセス
</select>
を
<select name="act4" class="input">
<option value="0" selected>拒否リストに追加する
<option value="1">拒否リストから削除する
</select>

<input type="submit" value="実行" class="button">
<input type="hidden" name="act" value="adminframe">
<input type="hidden" name="act2" value="deny">
<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="lines" value="$lines">
<input type="hidden" name="reloadtime" value="$reloadtime">

<br><br>
現在の拒否リスト
<table bgcolor=$table_color_1 cellpadding=0 cellspacing=0>
<tr><td>
<table width=100% cellspacing=3>
<tr>
<td bgcolor=$table_color_2>
IP拒否<br>
<select name="iplist" class="input" size=7 onClick="document.acsdeny.msg.value=document.acsdeny.iplist.options[selectedIndex].text;document.acsdeny.act3.selectedIndex=0;document.acsdeny.act4.selectedIndex=1;">
EOD
foreach(@ipdeny){print "<option>$_";}
print <<EOD;
</select>
</td>
<td bgcolor=$table_color_2>
ホスト名拒否<br>
<select name="hostlist" class="input" size=7 onclick="document.acsdeny.msg.value=document.acsdeny.hostlist.options[selectedIndex].text;document.acsdeny.act3.selectedIndex=1;document.acsdeny.act4.selectedIndex=1;">
EOD
foreach(@hostdeny){print "<option>$_";}
print <<EOD;
</select>
</td>
<td bgcolor=$table_color_2>
リンク元拒否<br>
<select name="reflist" class="input" size=7 onclick="document.acsdeny.msg.value=document.acsdeny.reflist.options[selectedIndex].text;document.acsdeny.act3.selectedIndex=2;document.acsdeny.act4.selectedIndex=1;">
EOD
foreach(@refdeny){print "<option>$_";}
print <<EOD;
</select>
</td>
<td bgcolor=$table_color_2>
名前拒否<br>
<select name="namelist" class="input" size=7 onclick="document.acsdeny.msg.value=document.acsdeny.namelist.options[selectedIndex].text;document.acsdeny.act3.selectedIndex=3;document.acsdeny.act4.selectedIndex=1;">
EOD
foreach(@namedeny){print "<option>$_";}
print <<EOD;
</select>
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
EOD

&hpfoot;
}

#******************************************************************************
sub sayform{
#発言フォーム
my ($a1,$a2,$a3)=&sel_box;
my $a5 = " checked" if $hrindi == 1;
&hphead();
print <<EOD;
<script language="javascript">
<!--
function clearmsg(){
if (document.sayform.clchk.checked){
	document.sayform.msg.value="";
	document.sayform.msg.focus();
	}
}
-->
</script>
<a name="top"></a>
$pagetop<br>
<form method="post" action="lchat.cgi" name="sayform" target="frame2" onsubmit="setTimeout(&quot;clearmsg()&quot;,10)">
<table>
<tr>
<td><a href="#middle" style="text-decoration:none;">▽</a></td>
<td nowrap bgcolor=$table_color_1 align=center>お名前</td>
<td bgcolor=$table_color_2 colspan=3>$name</td>
</tr>
<tr>
<td>&nbsp;</td>
<td nowrap bgcolor=$table_color_1 align=center>コメント</td>
<td bgcolor=$table_color_2><input type="text" name="msg" class="input" value="" size=50></td>
<td><input type="submit" class="button" value="発言／リロード"></td>
</tr>
EOD
if ($secrettalk == 1){
print <<EOD;
<tr>
<td>&nbsp;</td>
<td nowrap bgcolor=$table_color_1 align=center>個人会話</td>
<td bgcolor=$table_color_2 colspan=2><input type="text" name="secret_target" class="input" value="" size=20>
＊メッセージを送る相手の名前を入力
</td>
</tr>
EOD
	}
print <<EOD;
<tr>
<td>&nbsp;</td>
<td colspan=3>
<input type="checkbox" name="clchk" checked>JavaScriptによる自動消去を行う
</td>
</tr>
</table>
<input type="hidden" name="act" value="saymsg">
<input type="hidden" name="name" value="$name">
<input type="hidden" name="color" value="$color">
<input type="hidden" name="lines" value="$lines">
<input type="hidden" name="address" value="$address">
<input type="hidden" name="reloadtime" value="$reloadtime">
<input type="hidden" name="hrindi" value="$hrindi">
</form>
<form method="post" action="./lchat.cgi" target="$linktarget">
<a name="middle"></a>
<table>
<tr>
<td><a href="#top" style="text-decoration:none;">△</a></td>
<td nowrap bgcolor="$table_color_1" align=center>Mail/URL</td>
<td bgcolor="$table_color_2" colspan=3><input type="text" name="address" value="$address" class="input" size=30>
</tr>
<tr>
<td><a href="#under" style="text-decoration:none;">▽</a></td>
<td nowrap bgcolor="$table_color_1" align=center>色</td>
<td bgcolor="$table_color_2">$a1</td>
<td nowrap bgcolor="$table_color_1" align=center>表\示行数</td>
<td bgcolor="$table_color_2">$a2</td>
<td nowrap bgcolor="$table_color_1" align=center>リロード</td>
<td bgcolor="$table_color_2">$a3</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<input type="submit" value="変更" class="button">
<input type="hidden" name="act" value="changeframe">
<input type="hidden" name="name" value="$name">
</td>
<td colspan=4>
<input type="checkbox" name="hrindi" value="1"$a5>区切り線を表\示しない
</td>
</tr>
</table>
</form>
<br>
<a name="under">
<table>
<tr>
<td valign=top>
<a href="#middle" style="text-decoration:none;">△</a><br>
</td>
<td>
<form method="post" action="./lchat.cgi" target="frame2">
<input type="submit" value="自分の発言を消去" class="button">
<input type="hidden" name="act" value="deleteme">
<input type="hidden" name="name" value="$name">
<input type="hidden" name="color" value="$color">
<input type="hidden" name="lines" value="$lines">
<input type="hidden" name="reloadtime" value="$reloadtime">
<input type="hidden" name="hrindi" value="$hrindi">
</form>
</td></tr>
<tr><td>&nbsp;</td>
<td>
<form method="post" action="./lchat.cgi" target="$linktarget">
<input type="submit" value="退室" class="button">
<input type="hidden" name="act" value="byeframe">
<input type="hidden" name="name" value="$name">
<input type="hidden" name="color" value="$color">
<input type="hidden" name="lines" value="$lines">
<input type="hidden" name="reloadtime" value="$reloadtime">
<input type="hidden" name="hrindi" value="$hrindi">
</form>
</td>
</tr>
</table>
EOD

&hpfoot;
}
#******************************************************************************
sub enterform{
#入室フォーム
my ($a1,$a2,$a3)=&sel_box;
my ($a5,$a6);
$a5 = " checked" if $hrindi == 1;

if ($limitenter != 0){
	if ($limitenter > $member_num){
		$a6="<b>入室制限まであと" . ($limitenter-$member_num) . "人です。</b><br>";
		}else{
		&maxenter;
		}
	}
&hphead();
print <<EOD;
<a name="top"></a>
$pagetop<br>
$a6
<form method="post" action="./lchat.cgi" target="$linktarget">
<table>
<tr>
<td><a href="#under" style="text-decoration:none;">▽</a></td>
<td nowrap bgcolor="$table_color_1" align=center>お名前</td>
<td bgcolor="$table_color_2"><input type="text" name="name" value="$name" class="input" size=12>
<td nowrap bgcolor="$table_color_1" align=center>Mail/URL</td>
<td bgcolor="$table_color_2" colspan=5><input type="text" name="address" value="$address" class="input" size=30>
</tr>
<tr>
<td>&nbsp;</td>
<td nowrap bgcolor="$table_color_1" align=center>色</td>
<td bgcolor="$table_color_2">$a1</td>
<td nowrap bgcolor="$table_color_1" align=center>表\示行数</td>
<td bgcolor="$table_color_2">$a2</td>
<td nowrap bgcolor="$table_color_1" align=center>リロード</td>
<td bgcolor="$table_color_2">$a3</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" value="入室" class="button"></td>
<td colspan=7><input type="checkbox" name="hrindi" value="1"$a5>区切り線を表\示しない</td>
</tr>
</table>
<input type="hidden" name="act" value="mainframe">
</form>
<a name="under"></a>
<a href="$homeurl" target="$linktarget">&lt;&lt;Back to Home</a><br>
<table>
<tr>
<td valign=middle>
<a href="#top" style="text-decoration:none;">△</a><br>
</td>
<form method="post" action="./lchat.cgi" target="$linktarget">
<td>
<input type="password" name="pass" class="input" size=9 maxlength=8>
<input type="submit" value="管理用" class="button">
<input type="hidden" name="act" value="adminframe">
<input type="hidden" name="reloadtime" value="$#reload_time">
<input type="hidden" name="lines" value="$#indicate_lines">
</td>
</form>
</tr>
</table>
<br>
EOD
&hpfoot;
}
#******************************************************************************
sub deleteme{
#自分の発言消去
open (IO,"+<$logfile");
eval{flock(IO,2)};
while (<IO>){
	if ($_ =~ /<>$ip/){
		@y2=split(/<>/,$_);
		if ($y2[6] ne $ip){
			push(@log,$_);
			}
		}else{
		push(@log,$_);
		}
	}
truncate(IO,0);
seek(IO,0,0);
print IO @log;
close (IO);
&reload2;
}
#******************************************************************************
sub saymsg{
#発言
my $a1 = &timeset;
my $a2;
#荒らし対策：書きこみ文字数制限
$msg = substr($msg,0,$maxwrite);

#荒らし対策：許可タグ以外を無効化
$msg =~ s/[\t\a]//g;
$msg =~ s/&/&amp;/g;
$msg =~ s/</\t/g;
$msg =~ s/>/\a/g;
foreach (@permittag){
	$msg =~ s/\t(\/?$_)\a/<$1>/g;
	$msg =~ s/\t$_ ([^\a]*)\a/<$_ $1>/g;
	}
$msg =~ s/\t/&lt;/g;
$msg =~ s/\a/&gt;/g;

foreach (@permittag){
if (($msg =~ /<$_/) && ($msg !~ /<\/$_/)){$msg .="<\/$_>";}
	}

if ($autolink == 1){
	#URLには自動的にリンクを行う
	$msg =~ s/(http:\/\/[a-zA-Z0-9\.\/\-+#_?~&%=^\@:;]+)/<A HREF="$1">$1<\/A>/g;
	}

if ($secret_target ne ""){
	if ($secret_ip ne ""){$msg="<b>[個人 $name＞$secret_target]</b> $msg";$a2=$secret_ip;}
	else{$msg="<b>[個人 （指定名無効）]</b> $msg";}
	}

open (IO,"+<$logfile");
eval{flock(IO,2)};
@log=<IO>;
unshift(@log,"$name<>$color<><>$address<>$a1<>$msg<>$ip<>$a2<>\n");
pop(@log) if $#log >= $logmax;
truncate(IO,0);
seek(IO,0,0);
print IO @log;
close (IO);
&reload2;
}
#******************************************************************************
sub entergreet{
#入室時挨拶
my $a1 = &timeset;
$admin_entermsg =~ s/NAME/<font color=$sel_color[$color]>$name<\/font>/;
open (IO,"+<$logfile");
eval{flock(IO,2)};
@log=<IO>;
unshift(@log,"$admin_name<>9999<>9999<><>$a1<>$admin_entermsg<>SYSTEM-MESSAGE<><>\n");
pop(@log) if $#log >= $logmax;
truncate(IO,0);
seek(IO,0,0);
print IO @log;
close (IO);
&reload2;
}
#******************************************************************************
sub byemsg{
#退室時挨拶
my $a1 = &timeset;
$admin_byemsg =~ s/NAME/<font color=$sel_color[$color]>$name<\/font>/;
open (IO,"+<$logfile");
eval{flock(IO,2)};
@log=<IO>;
unshift(@log,"$admin_name<>9999<>9999<><>$a1<>$admin_byemsg<>SYSTEM-MESSAGE<><>\n");
pop(@log) if $#log >= $logmax;
truncate(IO,0);
seek(IO,0,0);
print IO @log;
close (IO);

$name = "";
&romdeny if $romdeny == 1;
&reload2;
}
#******************************************************************************
sub reload{
#データ読みこみ
open (IN,"$logfile");
eval{flock(IN,1)};
@log=<IN>;
close (IN);
&reload2;
}
#******************************************************************************
sub adminreload{
#データ読みこみ
my ($a1,$ct)=($admsg,0);
open (IO,"+<$logfile");
eval{flock(IO,2)};

if ($act2 eq "delete"){
	if ($msg eq ""){
		@log=<IO>;
		$admsg = "対象を設定してください。";
		}
	elsif (($act3 < 0) || ($act3 > 2)){
		@log=<IO>;
		$admsg = "削除指定が不正です。";
		}else{
		while(<IO>){
			@y2=split(/<>/,$_);
			if (($act3 == 0) && ($y2[0] eq $msg)){$ct++;}
			elsif (($act3 == 1) && ($y2[6] eq $msg)){$ct++;}
			elsif (($act3 == 2) && (index($_,$msg) != -1)){$ct++;}
			else{push(@log,$_);}
			}
		}
	}
else{
	@log=<IO>;
	}
if ($ct != 0){
	truncate(IO,0);
	seek(IO,0,0);
	print IO @log;
	}
close (IO);
if (($act2 eq "delete") && ($admsg eq "")){
	if ($act3 == 0){$admsg = "という名前からの投稿を";}
	elsif ($act3 == 1){$admsg = "というIPからの投稿を";}
	elsif ($act3 == 2){$admsg = "という文字を含む投稿を";}
	$admsg="「$msg」$admsg <font color=red>$ct行</font> 削除しました。";
	}
$admsg = $a1 if $a1 ne "";
$admsg ="<hr><b>$admsg</b>" if $admsg ne "";
&reload2;
}
#******************************************************************************
sub reload2{
#ログ表示
if (($romdeny == 1) && ($name eq "") && ($act ne "adminreload")){&romdeny;}
my ($a1,$a2,$a3,$a4,@y1);
if ($act eq "adminreload"){
	$a4="./lchat.cgi?act=adminreload&pass=$pass&lines=$lines&reloadtime=$reloadtime";
	$hrindi=1;
	}else{
	$a4="./lchat.cgi?act=reload&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi";
	}
if ($reload_time[$reloadtime] != 9999){
	&hphead("<meta http-equiv=\"refresh\" content=\"$reload_time[$reloadtime];url=$a4\">");
	}else{
	&hphead();
	}

if ($indicate_lines[$lines] == 9999){
	$a1 = "全部";
	}else{
	$a1 = $indicate_lines[$lines] . "行";
	}
if ($reload_time[$reloadtime] == 9999){
	$a2 = "手動更新";
	}else{
	$a2 = $reload_time[$reloadtime] . "秒";
	}
if (($indicate_rom == 1) && ($rom_num > 0)){
	$a3 = "ROM：$rom_num人 ";
	}
print <<EOD;
<table width=100%>
<td>[<a href="$a4">リロード</a>] $a3参加者($member_num)：$member_name</td>
<td align=right>行数：$a1 リロード：$a2</td>
</tr>
</table>
EOD
print $admsg;
print "<hr>\n" if $hrindi == 1;
print "<table width=100%>";

$a1 = -1;
$sel_color[9999]=$admin_color;
for (0 .. $#log){
	$a1++;
	if ($a1 >= $indicate_lines[$lines]){last;}
	next if $log[$_] eq "";
	@y1=split(/<>/,$log[$_]);
	if (($y1[7] ne "") && (($ip ne $y1[6]) && ($ip ne $y1[7])) && ($act ne "adminreload")){$a1--;next;}
	print "<tr><td colspan=3><hr></td></tr>\n" if $hrindi == 0;
	print "<tr valign=middle>";
	print "<td nowrap>";
	if ($y1[3] =~ /\@/){print "<a href=\"mailto:$y1[3]\"><font color=$sel_color[$y1[1]]>$y1[0]</font></a> ";}
	elsif ($y1[3] ne ""){print "<a href=\"$y1[3]\"><font color=$sel_color[$y1[1]]>$y1[0]</font></a> ";}
	else {print "<font color=$sel_color[$y1[1]]>$y1[0]</font> ";}
	print "</td><td width=100%>&gt; <font color=$sel_color[$y1[1]]>$y1[5]</font> <small><font color=$data_color>($y1[4])</font></small>";
	print "<!-- $y1[6] -->\n" if $ipindicate == 1;
	print "($y1[6])\n" if $act eq "adminreload";
	print "</td></tr>\n";
	}
print "</table>";
&hpfoot;
}
#******************************************************************************
sub byeframe{
#退室フレーム
print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
<title>$title</title>
</head>
<frameset rows="25%,*">
<frame src="./lchat.cgi?act=byeform" name="frame1">
<frame src="./lchat.cgi?act=byemsg&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi" name="frame2">
</frameset>
</html>
EOD
exit;
}
#******************************************************************************
sub adminframe{
#管理フレーム
my $a1;
$a1="&admsg=$admsg" if $admsg ne "";
print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
<title>$title</title>
</head>
<frameset rows="25%,*">
<frame src="./lchat.cgi?act=adminform&pass=$pass&lines=$lines&reloadtime=$reloadtime" name="frame1">
<frame src="./lchat.cgi?act=adminreload&pass=$pass&lines=$lines&reloadtime=$reloadtime$a1" name="frame2">
</frameset>
</html>
EOD
exit;
}
#******************************************************************************
sub changeframe{
#変更フレーム
print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
<title>$title</title>
</head>
<frameset rows="25%,*">
<frame src="./lchat.cgi?act=sayform&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi&address=$address" name="frame1">
<frame src="./lchat.cgi?act=reload&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi" name="frame2">
</frameset>
</html>
EOD
exit;
}
#******************************************************************************
sub mainframe{
#発言フレーム

print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
<title>$title</title>
</head>
<frameset rows="25%,*">
<frame src="./lchat.cgi?act=sayform&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi&address=$address" name="frame1">
<frame src="./lchat.cgi?act=entergreet&name=$ename&color=$color&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi" name="frame2">
</frameset>
</html>
EOD
exit;
}
#******************************************************************************
sub enterframe{
#入室フレーム
print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
<title>$title</title>
</head>
<frameset rows="25%,*">
<frame src="./lchat.cgi?act=enterform" name="frame1">
EOD
if ($romdeny == 0){
	print "<frame src=\"./lchat.cgi?act=reload&lines=$lines&reloadtime=$reloadtime&hrindi=$hrindi\" name=\"frame2\">\n";
	}else{
	print "<frame src=\"./lchat.cgi?act=romdeny\" name=\"frame2\">\n";
	}
print "</frameset></html>\n";
exit;
}
#******************************************************************************
sub romdeny{
#ROM不許可表示
my $a1 = "このチャットはROMが不許可になっています。";

if ($indicate_in_member == 1){
	$a1.="<br><br>現在の参加者 $member_num人<br>";
	}
elsif ($indicate_in_member == 2){
	$a1.="<br><br>参加者($member_num)：$member_name<br>";
	}
&error($a1);
}
#******************************************************************************
sub sel_box{
#選択ボックス
my ($a1,$a2,$a3,@y1);
for (0 .. $#sel_color){
	if (($_ == $color) || (($_ == $#sel_color) && ($a1 == 0))){
		$a1 = 1;
		$a2 = " selected";
		}else{
		$a2 = "";
		}
	$y1[0].="<option value=\"$_\"$a2>$sel_colorname[$_]\n";
	}
$y1[0]="<select name=\"color\" class=\"input\">$y1[0]</select>\n";

$a1 = $a2 = "";
for (0 .. $#indicate_lines){
	if (($_ == $lines) || (($_ == $#indicate_lines) && ($a1 == 0))){
		$a1 = 1;
		$a2 = " selected";
		}else{
		$a2 = "";
		}
	if ($indicate_lines[$_] == 9999){
		$a3 = "全部";
		}else{
		$a3 = $indicate_lines[$_] . "行";
		}
	$y1[1].="<option value=\"$_\"$a2>$a3\n";
	}
$y1[1]="<select name=\"lines\" class=\"input\">$y1[1]</select>\n";

$a1 = $a2 = "";
for (0 .. $#reload_time){
	if (($_ == $reloadtime) || (($_ == $#reload_time) && ($a1 == 0))){
		$a1 = 1;
		$a2 = " selected";
		}else{
		$a2 = "";
		}
	if ($reload_time[$_] == 9999){
		$a3 = "手動更新";
		}else{
		$a3 = $reload_time[$_] . "秒";
		}
	$y1[2].="<option value=\"$_\"$a2>$a3\n";
	}
$y1[2]="<select name=\"reloadtime\" class=\"input\">$y1[2]</select>\n";

return @y1;
}
#******************************************************************************
sub member_check{
#メンバーチェック
my ($flag,$mode,@y1,@y2);

if (($act eq "") || ($act eq "enterform") || ($act eq "romdeny") || (($act eq "reload") && ($name eq ""))){$mode = 0;}
elsif (($act eq "byemsg") || ($act eq "byeframe")){$mode = 1;}
elsif ($act =~ /admin/){$mode = 3;}
else{$mode = 2;}

$member_num = $rom_num = $flag = 0;
$member_name = "";

open (IO,"+<$menfile");
eval{flock(IO,2)};
while(<IO>){
	@y2=split(/<>/,$_);
	if ($y2[1] eq $ip){
		$flag = 1;
		if ($mode == 2){
			push(@y1,time() . "<>$ip<>$name<>1<>$color<><>\n");
			$member_name .= "<font color=\"$sel_color[$color]\">$name</font>$delimita";
			$member_num++;
			}
		elsif ($mode == 0){
			push(@y1,time() . "<>$ip<>$indicate_rom_name<>0<>$indicate_rom_color<><>\n");
			$rom_num++;
			}

		}
	else{
		if ($y2[0]+120 > time()){
			push(@y1,$_);
			if ($y2[3] == 0){
				$rom_num++;
				}else{
				$member_name .= "<font color=\"$sel_color[$y2[4]]\">$y2[2]</font>$delimita";
				$member_num++;
				if ($y2[2] eq $secret_target){
					$secret_ip = $y2[1];
					}
				}
			}
		}
	}
if (($flag == 0) && ($mode %2 != 1)){
	if ($mode == 2){
		push(@y1,time() . "<>$ip<>$name<>1<>$color<><>\n");
		$member_num++;
		}
	if ($mode == 0){
		push(@y1,time() . "<>$ip<>$indicate_rom_name<>0<>$indicate_rom_color<><>\n");
		$rom_num++;
		}
	}
truncate(IO,0);
seek(IO,0,0);
print IO @y1;
close (IO);
}
#******************************************************************************
sub error{
#エラー他表示
&hphead();
print <<EOD;
<div align=center>
<br>
<br>
<br>
<br>
$_[0]<br>
<br>
<br>
<br>
<br>
</div>
EOD
&hpfoot;
}
#******************************************************************************
sub maxenter{
#入室制限表示
&hphead();
print <<EOD;
$pagetop<br><br>
<b>入室制限人数($limitenter人）に達しました。</b><br>
<br>
<a href="$homeurl" target="$linktarget">&lt;&lt;Back to Home</a>
EOD
&hpfoot;
}
#******************************************************************************
sub hphead{
#ヘッダ表示
print "Content-type:text/html; charset=shift_jis\n\n";
print <<EOD;
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="pragma" content="no-cache">
$_[0]
<title>$title</title>
$stylesheet
</head>
$body
EOD
}
#******************************************************************************
sub hpfoot{
#フッタ表示
#
#著作権表示を消すことを禁じます。
print <<EOD;
<hr>
<div align=center>
<a href="http://dream.lib.net/room/" target="_blank">Light Chat by The Room</a>
</div><br><br>
</body>
</html>
EOD
exit;
}
#******************************************************************************
