#!/usr/local/bin/perl require 'jcode.pl'; #最大保存ログ数 $max=200; #表示ツリー件数/1ページ $pmax=20; #new!マークを付ける発言数 $new=5; #タイトル $title=""; #バック先URL $url="../keijiban.html"; #BODY設定 $body=''; #書きこみフォームのバックカラー $bg='#FFFFFF'; #返信フォームに引用文字をあらかじめ表示するなら0を1に $hens=0; #パスワード $pass="whbbs"; #======================================================================# # フォームデータ処理 srand;push(@rand,rand(9999999)); if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $QUERY, $ENV{'CONTENT_LENGTH'}); }else{ $QUERY = $ENV{'QUERY_STRING'}; } @QUERY = split(/&/,$QUERY); foreach (@QUERY){ ($name, $value) = split(/=/); $seeks=$value if $name eq "seek"; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; $value =~ s/[\n\t]//g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } #======================================================================# # 書き込みデータ表示処理 if($FORM{'log'}){ open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $t=; chop $t; $w=$t - $FORM{'log'} + 2; while(){ if($. == $w){ ($re,$log_f,$ls,$dai,$log_n,$log_e,$log_h,$log_t)=split(/\t/,$_); last; } } close(A); &head; $mail="" if $log_e; print<
$dai ($mail$log_n)
$log_t
発言日:$log_h
関連発言:
HTML

$i=0;

open(A,"treebbs.dat")||&err('ファイルをオープンできません');
$open = ;
while (){
	if(/^$ls\t/){
		($log_c,$log_no,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/);
		print"◆$log_c:$log_d [$log_n] $log_h\n";
		last;
	}
}
close(A);

&tree($log_c);

if($dai=~ /Re\[(\d+)\]:/){
	$r=$1+1;
	$dai=~ s/^Re\[(\d+)\]:/Re\[$r\]:/;
}elsif($dai=~ /^Re:/){
	$dai=~ s/^Re:/Re\[2\]:/;
}else{
	$dai="Re:$dai";
}

&get_cookie;
	
if($hens == 1){
	$log_t=~ s/
/\r>/g; $hen="発言[$re]から引用\r>$log_t"; } print<
 返信フォーム
名 前 保存
題 名
メール 省略可
発 言
書き込む
HTML &last; exit; #======================================================================# # 書き込み処理 }elsif($FORM{'ha'}){ &err('不正エラー') if $FORM{'re'} eq ""; $err=1 if $FORM{'dai'} eq ""; $err=1 if $FORM{'name'} eq ""; $err=1 if $FORM{'t'} eq ""; &ha("記入不足です") if $err; &ha("只今混雑しているので30秒ほどお待ちになってください。","1") if &lock == 0; open(A,"treebbs.dat")||&err('ファイルをオープンできません'); @open=
; close(A); $sss=$open[0]+1; $FORM{'s'}=$sss unless $FORM{'s'}; ($sec,$min,$hour,$day,$mon)=localtime(time); $day="0$day" if $day < 10; $hour= "0$hour" if $hour < 10; $min = "0$min" if $min < 10; $mon++; $FORM{'t'}=~ s/\r/
/g; splice(@open,0,1,"$sss\n","$sss\t$FORM{'re'}\t$FORM{'s'}\t$FORM{'dai'}\t$FORM{'name'}\t$FORM{'email'}\t$mon/$day $hour:$min\t$FORM{'t'}\n"); pop(@open) if $max < $#open; open(A,">treebbs.dat")||&err('ログファイルをオープンできません'); print A @open; close(A); open(C,">lock.txt")&&close(C); #クッキー処理 print "Set-Cookie: CGIROOMTREE=$FORM{'name'}\t$FORM{'email'}; expires=Fri, 31-Dec-2010 00:00:00 GMT\n" if $FORM{'cookie'}; #======================================================================# # 新規発言 }elsif($FORM{'new'}){ &ha; #======================================================================# # 最新発言順 }elsif($FORM{'last'}){ &head; print"
"; open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $i="00"; while(){ if(/^\d+\t\d+\t/){ last if $i++ >= 20; ($log_c,$log_n,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/); print"$log_c:$log_d [$log_n] $log_h
\n"; } } print"
"; &last; exit; #======================================================================# # 検索処理 }elsif($FORM{'seek'}){ &head; print"
"; print<
▼検索:
HTML if(($FORM{'next'} - 1) >= 0){ $back=$FORM{'next'} - 1; print"▲ BACK

\n"; } $FORM{'seek'}=~ s/ / /og; $FORM{'seek'}=~ s/([\\\+\?\.\*\(\)\[\]\{\}\|])/\\$1/og; @seek=split(/ /,$FORM{'seek'}); foreach (@seek){ push(@key,$_); } $log=$FORM{'next'} * 20; open(A,"treebbs.dat") || &error("エラー"); $dummy=; while(){ $i=0; $word=$_; foreach (@key){ next if $word =~ /$_/i; $i = 1; last; } next if $i == 1; $no++; next if $log-- > 0; if($log < - 20){ $f=$FORM{'next'} + 1; last; } ($log_c,$log_n,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/,$word); print"$log_c:$log_d [$log_n] $log_h
\n"; } close(LIST); print"

▼ NEXT\r\n" if $f > 0; print"$FORM{'seek'} に該当する投稿記事はありません" if $no == 0; print"

"; &last; exit; #======================================================================# # 書き込み削除処理 }elsif($FORM{'del'} >= 1 && $FORM{'pass'} eq $pass){ &err("只今混雑しているので30秒ほどお待ちになってください。") if &lock == 0; open(A,"treebbs.dat")||&err('ファイルをオープンできません'); @open=; close(A); $sss=$open[0]; chop $sss; $ss = $sss - $FORM{'del'} + 1; ($log_c,$log_n,$log_s,$log_d,$log,$log_e,$log_h)=split(/\t/,$open[$ss]); $open[$ss]="$log_c\t$log_n\t$log_s\t---\t---\t\t$log_h\tこの記事は何らかの理由で削除されました\n"; open(A,">treebbs.dat")||&err('ログファイルをオープンできません'); print A @open; close(A); open(C,">lock.txt")&&close(C); } #======================================================================# # 書き込みリスト表示ヘッダー部分 &head; print<
▼検索: HTML $i=$FORM{'logs'}; $i=1 unless $i; $back=$i - $pmax; &tree(0); print"\n"; print"<< BACK  " if ($FORM{'logs'} && 0 < $back); print"NEXT >>\n" if $next; print<
No/Pass:
HTML &last; exit; #======================================================================# # ツリー表示処理 sub tree{ local($log,$c,$n)=@_; local(@aaa,$a); open(A,"treebbs.dat")||&err('ファイルをオープンできません'); $open = ; $news = $open - $new; while (){ last if /^$log\t/; if(/^\d+\t$log\t/){ $s++ if $log eq "0"; if($log eq "0"){ next if $i > $s ; if( $s >= $i + $pmax){ $next = $s; last; } } /^([^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t)/; push(@aaa,$1); } } close(A); if($n eq "└"){ $c.=" "; }elsif($n){ $c.="│"; } $a=@aaa; foreach $dat (@aaa){ ($log_c,$log_no,$log_s,$log_d,$log_n,$log_e,$log_h)=split(/\t/,$dat); --$a; $n="├"; $n="└" if $a == 0; print"

$c$n●" if 0 eq $log_no; print"
$c$n○" if 0 ne $log_no; print"$log_c:
$log_d [$log_n] $log_h"; print' new!' if $log_c > $news; print"\n"; &tree($log_c,$c,$n); undef $dat; } undef @aaa; undef $a; } #======================================================================# # HTML ヘッダー表示 sub head{ print< $title $body
新規発言 | ツリー | 発言順一覧

HTML } #======================================================================# # 書き込みフォーム sub ha{ &head; $li="" if $FORM{'s'}; $FORM{'re'}="0" unless $FORM{'re'}; if($FORM{'name'} eq ""){ &get_cookie; $FORM{'name'}=$coo[0]; $FORM{'email'}=$coo[1]; } print<
  発言フォーム $_[0] $li
名 前 名前保存
題 名
メール 省略可
発 言
書き込む
◆注意点
◇題名は、短くわかりやすく書いてください。
◇過去に同じ内容が投稿されていないか検索してから書き込んで下さい。
◇管理人の判断により相応しくない投稿は削除します。
HTML &last; exit; } #======================================================================# # HTML フッター表示 sub last{ print'
'; } #======================================================================# # クッキー獲得 sub get_cookie{ foreach (split(/\;/,$ENV{'HTTP_COOKIE'})){ ($name,$value) = split(/=/); $name =~ s/ //g; $cna=$value if $name eq "CGIROOMTREE"; last if $cna; } if($cna){ @coo=split(/\t/,$cna); $cna=$coo[0]; $maile=$coo[1]; } } #======================================================================# # エラー表示 sub err{ local($err)=@_; print"Content-type: text/html\n\n$body

ERROR

$err
"; print"ブラウザの戻るボタンから戻ってください
"; exit; } #======================================================================# # ロック処理 sub lock{ foreach (1..10){ if(-z "lock.txt"){ if(!open(LOCK,">>lock.txt")){ &err("lock.txtに書き込めません"); exit; } push(@rand,rand(9999999)); print LOCK "$ENV{'REMOTE_ADDR'}$ENV{'HTTP_USER_AGENT'}$ENV{'HTTP_REFERER'} @rand $FORM{'rand'}"; close(LOCK); if(!open(LOCK,"lock.txt")){ &err("lock.txt開けません"); exit; } $dummy=; close(LOCK); if($dummy eq "$ENV{'REMOTE_ADDR'}$ENV{'HTTP_USER_AGENT'}$ENV{'HTTP_REFERER'} @rand $FORM{'rand'}"){ return 1; } } $times=(stat("lock.txt"))[9]; $timer=time - 20; if($times <= $timer){ open(LOCK,">lock.txt")&&close(LOCK); }else{ sleep 1; } } return 0; } __END__ 1999/06/01 Ver 2.10