#!/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; charset=UTF-8\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" ; }