#!/usr/bin/perl
# サーバーの環境に合わせて変更して下さい。
#-----------------------------------------------------------#
# 罪と罰++ 二律背反 #
# Copyright(C) 2001-2002 by Vivid Studio. BLANK BOARD #
# Vivid Studio.[ http://www17.big.or.jp/~obochan/vivid/ ] #
# BLANK BOARD [ http://pom.to/ ] #
#-----------------------------------------------------------#
$ver = '作戦会議室 v1.1'; # バージョン情報(変更不可)
#--- [注意事項] --------------------------------------------#
# 1.このスクリプトは以下の利用規程に従って配布しています。 #
# http://www24.big.or.jp/~obo/game/ore_/gild/ #
#-----------------------------------------------------------#
#===============================================================================
# 設定項目
#-------------------------------------------------------------------------------
# 各種ファイル
require './inc/ore_sub-bbs.cgi'; # 各種掲示板共通な設定項目読み込み
$script = "./campbbs.cgi"; # このスクリプトのパス
$logfile = "./logdata/camp_log_"; # ログファイルの一部($logfile$camp.\cgiとなる)
$memfile = "./logdata/camp_mem_"; # 参加者ファイルの一部($memfile$camp.\cgiとなる)
$lockkey = 0; # ファイルロック(0=no 1=yes)
$lockfile = "./camp.lock"; # ロックファイル名
#-------------------------------------------------------------------------------
# 環境設定
$title = "작전회의실"; # タイトル名
$max = 100; # 最大保有記事数
$reload_mn = 5; # 最短リロード間隔(この秒数以内に発言するとエラー[負荷対策])
$reload_limit= 120; # この秒数発言がないと退室扱いにする
$com_limit = 240; # コメントの最大文字数(半角換算)
$tagkey = 0; # タグの許可 (0=no 1=yes)
$nolink = 1; # URL宣伝排除 (0=no 1=yes)
# 機種別設定
if($mv_mode eq 'mv'){
# モバイル用設定
$log_last= 15; # 表示行数(モバイル)
# BODYタグ装飾
$body = 'bgcolor="black" text="white" link="pink" vlink="pink" alink="pink"';
$hr_color= 'white'; # 罫線の色(モバイル)
}else{
# PC用設定
@reload_time= (90,120,180); # リロード時間
$log_last= 50; # 表示行数(PC)
# BODYタグ装飾
$body = 'bgcolor="#111122" text="#ddddee" link="#ffddee" vlink="#ffddee" alink="#ffddee"';
}
#===============================================================================
# 以下処理 基本的にこれ以下はいじらないように。
#-------------------------------------------------------------------------------
# メイン処理
&axs_check; # アクセス制御
&decode; # フォームデコード
&mandata_open; # 参加者ログ読み込み
&get_time; # 日時取得
&error("무소속이신 분은 이용하실 수 없습니다.
교류 광장을 이용해 주세요.") if(!$DAT{'camp'});
&member;
if($mode eq "regist" && $com){ ®ist; } # 書き込み処理
&html; # ページ表示
#-------------------------------------------------------------------------------
# 記事表示部
sub html {
# 表示開始
&header;
if($mv_mode eq 'mv'){
print <<"EOM";
$camp_info[$DAT{'camp'}][0]전용
$title
EOM
}
else{
print <<"EOM";
 |
$title
~ $camp_info[$DAT{'camp'}][0]의 작전회의실 ~
|
EOM
}
# 参加者表示:$member
($mv_mode eq 'mv') ?
print qq|참가자($num)
\n|:
print qq|
참가자($num):$member
\n|;
# ログを展開
open(IN,"$logfile$DAT{'camp'}\.cgi") || &error("Open Error : $logfile$DAT{'camp'}\.cgi");
local $log_last_flag=0;
while () {
$log_last_flag++;
local($date,$nm,$camp,$com,$sogo,$addr,$host) = split(/<>/);
$nm = qq|$nm [$sogo_p[$sogo]]| if($sogo);
($mv_mode eq 'mv') ? $com =~ s/하트/\&\#63726<\/font>/g : $com =~ s/하트/ゥ<\/span>/g ;
($mv_mode eq 'mv') ?
print qq|$nm:$com [$camp_info[$camp][0] $date]
\n|:
print qq|$nm : $com [ $camp_info[$camp][0] $date ]
\n|;
last if $log_last_flag > $log_last;
}
close(IN);
# 著作権表示(削除禁止)
print "
\n";
©right;
exit;
}
#-------------------------------------------------------------------------------
# ログ書き込み処理
sub regist {
# ファイルロック
if ($lockkey) { &lock; }
# ログを読み込み
open(IN,"$logfile$DAT{'camp'}\.cgi") || &error("Open Error : $logfile$DAT{'camp'}\.cgi");
@lines = ;
close(IN);
# 最大記事数処理
while ($max <= @lines) { pop(@lines); }
# ログ更新処理
unshift (@lines,"$date<>$DAT{'nm'}<>$DAT{'camp'}<>$com<>$DAT{'sogo'}<>$addr<>$host<>$agent<>\n");
open(OUT,">$logfile$DAT{'camp'}\.cgi") || &error("Write Error : $logfile$DAT{'camp'}\.cgi");
print OUT @lines;
close(OUT);
# ロック解除
if (-e $lockfile) { unlink($lockfile); }
}
#-------------------------------------------------------------------------------
# 在室者処理
sub member {
open(IN,"$memfile$DAT{'camp'}\.cgi") || &error("Open Error : $memfile$DAT{'camp'}\.cgi");
@data = ;
close(IN);
$member="";
@new=();
$flag=0;
$flag2=0;
foreach (@data) {
($time2,$name2,$host2) = split(/<>/);
# 発言のない者は削除
if ($time-$reload_limit > $time2) { next; }
elsif ($host2 eq "$addr") {
# 発言/更新間隔
# &error("$reload_mn초 이상 간격을 두고 말해 주세요.") if($reload_mn+$time2>$time);
if($reload_mn+$time2>$time){
print "Status: 204\n\n";
exit;
}
# 退室者は削除
if ($_[0] eq 'bye') { next; }
# ホスト名が同一であれば時間と名前を更新
$_ = "$time<>$DAT{'nm'}<>$addr<>\n";
$name2 = $DAT{'nm'};
$flag=1;
}
# 更新用配列 @new に追加
if ($name2 ne "$host2") {
push(@new,$_);
# 参加者表示用文字列を作成
if(!$flag2){$member .="$name2◇";$flag2=1;}
else{$member .="$name2◆";$flag2=0;}
}
}
# 新規参加者を追加
if (!$flag && $mv_mode eq 'pc') {
if ($DAT{'nm'} ne "$host") {
push(@new,"$time<>$DAT{'nm'}<>$addr<>\n");
$member .= (!$flag2) ? "$DAT{'nm'} [IN]◇" : "$DAT{'nm'} [IN]◆";
}
}
# 参加者数を認識
$num = @new;
# ファイル更新
open(OUT,">$memfile$DAT{'camp'}\.cgi") || &error("Write Error : $memfile$DAT{'camp'}\.cgi");
eval "flock(OUT,2);";
truncate(OUT,0);
seek(OUT,0,0);
print OUT @new;
close(OUT);
}
#-------------------------------------------------------------------------------
# HTMLのヘッダー
sub header {
print "Content-type: text/html\n\n";
print <<"EOM";
$title
EOM
if($mv_mode eq 'pc' && $DAT{'camp'}){
print <<"EOM";
$css
EOM
}
(!$_[0] && $mv_mode eq 'pc') ? print qq|\n| : print "\n" ;
}