#!/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.0'; # バージョン情報(変更不可)
#--- [注意事項] --------------------------------------------#
# 1.このスクリプトは以下の利用規程に従って配布しています。 #
# http://www24.big.or.jp/~obo/game/ore_/gild/ #
#-----------------------------------------------------------#
# 設定項目
#-------------------------------------------------------------------------------
# 各種ファイル
require './inc/ore_sub-bbs.cgi'; # 各種掲示板共通な設定項目読み込み
$script = "./letter.cgi"; # このスクリプトのパス
$logfile = "./logdata/letter_log.cgi";# ログファイルのパス
$usrdata = "./usrdata/"; # 参加者ログ格納ディレクトリ
$lockkey = 0; # ファイルロック(0=no 1=yes)
#-------------------------------------------------------------------------------
# 環境設定
$title = "罪罰通信"; # タイトル名
$max = 180; # 最大保有記事数
$write_limit= 60; # この秒数の間は再度投稿ができない
$com_limit = 500; # コメントの最大文字数(半角換算)
$tagkey = 0; # タグの許可 (0=no 1=yes)
$nolink = 1; # URL宣伝排除 (0=no 1=yes)
$br_mode = 1; # 改行モード (0=no 1=yes)
$player_now = 60*5; # 何秒以内にログインした人をプレイ中の参加者にするか
# 機種別設定
if($mv_mode eq 'mv'){
# モバイル用設定
$log_last= 10; # 表示行数(モバイル)
# BODYタグ装飾
$body = 'body bgcolor="black" text="white" link="pink" vlink="pink" alink="pink"';
$hr_color= 'white'; # 罫線の色(モバイル)
}else{
# PC用設定
$log_last= 500; # 表示行数(PC)
# BODYタグ装飾
$body = 'bgcolor="#111122" text="#ddddee" link="#ffddee" vlink="#ffddee" alink="#ffddee"';
}
#===============================================================================
# 以下処理 基本的にこれ以下はいじらないように。
#-------------------------------------------------------------------------------
# メイン処理
&axs_check; # アクセス制御
&decode; # フォームデコード
&mandata_open; # 参加者ログ読み込み
&get_time; # 日時取得
if ($mode eq "regist" && $com) { ®ist; } # 書き込み処理
&html; # ページ表示
#-------------------------------------------------------------------------------
# 記事表示部
sub html {
# 表示開始
&header;
if($mv_mode eq 'mv'){
print <<"EOM";
$title
EOM
}
else{
# 全参加者取得
&read_data_letter;
print <<"EOM";
EOM
}
($mv_mode eq 'mv') ?
print qq|
\n|:
print qq|
\n|;
print qq|$mes
| if($mes);
# ログを展開
open(IN,"$logfile") || &error("Open Error : $logfile");
local $log_last_flag=0;
my $camp_flag = $camp_info[$DAT{'camp'}][0];
while () {
$log_last_flag++;
local($date,$nm,$camp,$com,$sogo,$addr,$host,$agent,$time2,$myid) = split(/<>/);
if($nm eq $camp_info[$DAT{'camp'}][0] || $myid eq $DAT{'nm'} || $myid eq $camp_info[$DAT{'camp'}][0]){ # <--この行のみを修正
if($myid eq $DAT{'nm'}){
$nm = qq|To:$myid From:$nm|; # 自分宛
}elsif($nm eq $DAT{'nm'}){
$nm = qq|To:$myid From:$nm|; # 自分の送信
}else{
$nm = qq|To:$myid From:$nm|; # その他
}
$nm = qq|$nm[$sogo_p[$sogo]]| if($sogo);
if($myid ne $DAT{'nm'}){
($mv_mode eq 'mv') ?
print qq|$nm:$com [$camp_info[$camp][0] $date]
\n|:
print qq|$nm [ $camp_info[$camp][0] $date ]
$com
\n|;
}else{
($mv_mode eq 'mv') ?
print qq|$nm:$com [$camp_info[$camp][0] $date]
\n|:
print qq|$nm [ $camp_info[$camp][0] $date ]
$com
\n|;
}
last if $log_last_flag > $log_last;
}
}
close(IN);
open(IN,"$logfile") || &error("Open Error : $logfile");
while () {
local($date,$nm,$camp,$com,$sogo,$addr,$host,$agent,$time2,$myid) = split(/<>/);
if($myid eq $DAT{'nm'} || $myid eq $camp_info[$DAT{'camp'}][0]){
if($ltime<$time2){
require './inc/ore_sub-system.cgi';
&usr_file_open;
$ltime=$time2;
&dat_write;
exit;
}
last;
}
}
close(IN);
# 著作権表示(削除禁止)
print "
\n";
©right;
exit;
}
#-------------------------------------------------------------------------------
# ログ書き込み処理
sub regist {
if($in{'camp'}){
$in{'nm'} = "$camp_info[$DAT{'camp'}][0]";
$DAT{'nm'} ="$DAT{'nm'}(多)";
if($SAT{'nm'} eq $in{'nm'}
|| $in{'nm'} ne $camp_info[1][0] # <--ここを追加
|| $in{'nm'} ne $camp_info[2][0] #
|| $in{'nm'} ne $camp_info[3][0] #
|| $in{'nm'} ne $camp_info[4][0] #
|| $in{'nm'} ne $camp_info[5][0] # <--ここまでの5行を追加
|| $in{'nm'} ne $camp_info[6][0] # <--ここまでの5行を追加
){
$flag=1;
last;
}
else{
local @tdat;
# 参加者データファイル一覧取得/一括読み込み
opendir(DIR,"$usrdata") || &error("ユーザデータ読みこみエラー",1);
@usrfile = grep /\.cgi/,readdir(DIR);
closedir(DIR);
foreach (0 .. $#usrfile) {
open(IN,"$usrdata$usrfile[$_]") || &error("Can't open $usrfile[$_]",1);
$line = ;
close(IN);
push(@tdat,$line);
}
my $flag=0;
foreach(0 .. $#tdat){
%SAT = '';
my @prats = split(/,/,$tdat[$_]);
foreach $prats (@prats){
my($key,$v) = split(/;/,$prats);
$SAT{$key} = $v;
}
if($SAT{'nm'} eq $in{'nm'}){
$flag=1;
last;
}
}
if(!$flag){
$mes = qq|$in{'nm'}さんという参加者は存在しません。
| ;
&html;
}
}
# ファイルロック
if ($lockkey) { &lock; }
# ログを読み込み
open(IN,"$logfile") || &error("Open Error : $logfile");
@lines = ;
close(IN);
my @y1 = split(/<>/,$lines[0]);
&error("暫く後に投稿してください。") if(($time<$y1[8]+$write_limit) && ($addr eq $y1[5]));
# 最大記事数処理
while ($max <= @lines) { pop(@lines); }
# ログ更新処理
unshift (@lines,"$date<>$DAT{'nm'}<>$DAT{'camp'}<>$com<>$DAT{'sogo'}<>$addr<>$host<>$agent<>$time<>$in{'nm'}<>\n");
open(OUT,">$logfile") || &error("Write Error : $logfile");
print OUT @lines;
close(OUT);
$mes = qq|$in{'nm'}さんに電報と届けました。
| ;
# ロック解除
if (-e $lockfile) { unlink($lockfile); }
}
#-------------------------------------------------------------------------------
# HTMLのヘッダー
sub header {
print "Content-type: text/html\n\n";
print <<"EOM";
$title
EOM
if($mv_mode eq 'pc'){
print <<"EOM";
$css
EOM
}
(!$_[0] && $mv_mode eq 'pc') ? print qq|\n| : print "\n" ;
}
# データ読み込み
# 参加者データ一括読み込み
sub read_data_letter{
local @tdat;
# 参加者データファイル一覧取得/一括読み込み
opendir(DIR,"$usrdata") || &error("ユーザデータ読みこみエラー",1);
@usrfile = grep /\.cgi/,readdir(DIR);
closedir(DIR);
foreach (0 .. $#usrfile) {
open(IN,"$usrdata$usrfile[$_]") || &error("Can't open $usrfile[$_]",1);
$line = ;
close(IN);
push(@tdat,$line);
}
$now_sanka=$#tdat+1;
$now_nm_cnt=0;
foreach(0 .. $#tdat){
%SAT = '';
my @prats = split(/,/,$tdat[$_]);
foreach $prats (@prats){
my($key,$v) = split(/;/,$prats);
$SAT{$key} = $v;
}
# 現在のプレイヤー抽出
if($player_now>=$time-$SAT{'la'}){
if($mv_mode eq 'pc'){
$now_nm .= ($SAT{'sogo'}) ? qq|$SAT{'nm'} [$sogo_p[$SAT{'sogo'}]] [$camp_info[$SAT{'camp'}][0]]
| : qq|$SAT{'nm'} [$camp_info[$SAT{'camp'}][0]]
| ;
}else{
$now_nm .= ($SAT{'sogo'}) ? "$SAT{'nm'} [$sogo_p[$SAT{'sogo'}]]/" : "$SAT{'nm'}/" ;
}
$now_nm_cnt++;
}
}
return ($now_nm,$now_sanka,$now_nm_cnt);
}