#!/usr/local/bin/perl
# 設定変数の定義 #
# ログの保存行数
$maxlog = 30;
# 1ページ当たりの表示行数
$pageline = 10;
# 発言文字色
@msgcol = ('#000000','#ff0000','#008000','#000080','#0080ff');
# スクリプト名
$mycgi = 'linebbs3.cgi';
# ログファイル名
$logfile = 'linebbs.log';
# 入力内容のデコード #
if($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
}else{ $in = $ENV{'QUERY_STRING'}; }
@in = split/&/,$in;
foreach(@in){
($key,$val) = split/=/;
$val =~ tr/+/ /;
$val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$val =~ s/\r//g;
$val =~ s/\n//g;
$val =~ s/</g;
$val =~ s/>/>/g;
$in{$key} = $val;
}
# 処理モード判定 #
if($in{'submit'}){ &insert(); }
else{ &view(); }
exit;
# 発言処理 #
sub insert{
$in{'name'} eq '' and &error('お名前が入力されていません。');
$in{'body'} eq '' and &error('本文が入力されていません。');
$in{'color'} eq '' and &error('文字色が選択されていません。');
# 追加するログデータの作成
$newlog = "
$in{'name'} > $in{'body'}\n";
# ロック開始
&lock() or &error('只今混雑しているようです。','Lock ERROR!');
# ログファイル読込
open FILE,$logfile;
@log = ;
close FILE;
# 先頭に新規ログデータを追加
unshift @log,$newlog;
# 保存行数を超える分末尾を削除
while(@log > $maxlog){ pop @log; }
# 更新されたデータでログファイルに上書き
open FILE,">$logfile";
print FILE @log;
close FILE;
# ロック終了
&unlock();
# 出力処理へ飛ばす
print "Location:$mycgi\n\n";
}
# 出力処理 #
sub view{
# ログファイル読込
open FILE,$logfile;
@logdat = ;
close FILE;
# 総ページ数
$maxpage = int((@logdat - 1)/$pageline) + 1;
# ページの指定が無ければ1ページ目
($in{'page'} >= 1 and $in{'page'} <= $maxpage) or $in{'page'} = 1;
# 表示するページのログ取得
foreach$l(0..$#logdat){
$l >= ($in{'page'} - 1) * $pageline and $l < $in{'page'} * $pageline and $log .= $logdat[$l];
}
# ページ切り替えリンク作成
foreach$p(1..$maxpage){
if($p == $in{'page'}){
$pagelink .= <<"EOT";
$p
EOT
}else{
$pagelink .= <<"EOT";
[$p]
EOT
}
}
# 色選択フォーム作成
foreach(@msgcol){
$colform .= <<"EOT";
●
EOT
}
# 出力
print &header();
print <<"EOT";
$pagelink
$log