home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
hostmgr.zip
/
HOSTMAN.PL
< prev
next >
Wrap
Perl Script
|
1999-09-10
|
107KB
|
2,812 lines
#!\perl5\bin\perl
use integer;
use File::Copy;
use Mail::Sender;
use Mail::POP3Client;
use MIME::QuotedPrint;
$HostName = "WHost";
$HostNameFrom = "Warrior Host";
$FidoAddress = "2:5035/24";
$IncomeFIDO = "";
$EMailAddress = "";
$CheckTime = 20;
$WorkDir = "";
$TmpDir = "";
$InMsgDir = "";
$InFileDir = "";
$InEMailDir = "";
$HostMsgs = "";
$FromGMDir = "";
$OutMsgDir = "";
$OutEMailDir = "";
$UnZipCommand = "";
$ZipCommand = "";
$DeUUECommand = "";
$UUECommand = "";
$FlagDir = $WorkDir;
$SmtpServer = "";
$POP3User = "";
$POP3Password = "";
$POP3Server = "";
$POP3Delete = "NO";
$BackupDir = "";
#ó¡πΓαÑ¡¡¿Ñ »ÑαѼѡ¡δÑ-«»αÑñѽѡ¿∩
$IncUUE = "incoming.uue"; #¿¼∩ Σá⌐½á ¿ºó½ÑτÑ¡¡«ú« »¿ß∞¼á
$OutUUE = "outgoing.uue";
$OutMIME = "outgoing.mim";
$InternalCoder = 1;
$FullLog = 1;
$SentTplName = "SENT.TPL";
$ErrorTplName = "ERROR.TPL";
$RRCTplName = "RRC.TPL";
$SleepTplName = "SLEEP.TPL";
$LogFileName = "HOSTMAN.LOG";
$CfgFileName = "HOSTMAN.CFG";
$GamesDat = "gamesdat.moo";
$tearline = "--- Host Manager ver. 13.24.04 gamma\n* Origin : VGA PLANETS rulez forever...";
$ReloadConfig = 0;
$Stop = 1;
$GameCount = 0;
$MaxMsgLines = 400;
$Password = "host manager by AS&DL v.13.24.04g";
$fRun = "RunThis";
$fSleep = "WaitThis";
$fStop = "StopHost";
$fReload = "InitHost";
$fStatus = "DoStatus";
$fStart = "StartNow";
$ChanalOpen = "IsSMPTchanalOPEN";
LoadConfig();
#«íαáí«Γ¬á ¬«¼á¡ñ¡«⌐ ßΓ᫬¿
if ($#ARGV >= 0)
{foreach $arg (@ARGV)
{if ($arg =~ /manager/i)
{$Stop = 0}
elsif
($arg =~ /init/i)
{open FILE,">$FlagDir$fReload"; close FILE}
elsif
($arg =~ /stat/i)
{open FILE,">$FlagDir$fStatus"; close FILE}
elsif
($arg =~ /stop|quit|exit/i)
{open FILE,">$FlagDir$fStop"; close FILE}
elsif
($arg =~ /sleep|wait/i)
{$ArgFile = $FlagDir.$fSleep}
elsif
($arg =~ /run/i)
{$ArgFile = $FlagDir.$fRun}
elsif
($arg =~ /start/i)
{$ArgFile = $FlagDir.$fStart}
elsif
($arg =~ /\-\h|\-\?|\/\?/)
{print "Run me without any options for HELP...\n"}
elsif
($ArgFile)
{open FILE,">>$ArgFile"; print FILE "$arg\n"; close FILE};
}
}
else
{print "Host Manager ver. 13.24.003 (04.08.1999)\n";
print "Usage : perl HostMan.Pl <commands>\n";
print " commands :\n";
print " - manager = use as Host Manager\n";
print " - stop = terminate Manager\n";
print " - init = reload config file\n";
print " - run GAMENAME .. GAMENAME = run this game(s) immediate\n";
print " - start GAMENAME .. GAMENAME = start this game(s) immediate\n";
print " - sleep GAMENAME .. GAMENAME = sleep this game(s) immediate\n";
print " (for sleep some races for game use - GName:Race1+Race2+Race3)\n";
};
#«ß¡«ó¡«⌐ µ¿¬½ «íαáí«Γ¬¿ - αѪ¿¼ îÑ¡ÑñªÑα
until ($Stop)
{
#«ßΓá¡«ó¿Γ∞ ¼Ñ¡ÑñªÑα
if (-e $FlagDir.$fStop)
{unlink $FlagDir.$fStop; $Stop = 1; last};
open LOGFILE,">>$LogFileName";
#»ÑαÑτ¿Γδóá¡¿Ñ ¬«¡Σ¿úπαᵿ¿
if (-e $FlagDir.$fReload)
{unlink $FlagDir.$fReload; $ReloadConfig = 1};
if ($ReloadConfig)
{LoadConfig();
$ReloadConfig = 0;
};
#ºá»π߬ ¿úpδ ópπτ¡πε
if (-e $FlagDir.$fRun)
{open OF, $FlagDir.$fRun;
while (<OF>)
{chomp;
for ($i = 1; $i <= $GameCount; $i++)
{if (/\b$GAMES{"Name$i"}\b/i)
{ReadParams($i);
$GAMEINFO{"External"} = "Run";
printlog("[RUN $i] çá»πΘÑ¡« úÑ⌐¼¼áßΓÑα«¼ ...\n",1) if $FullLog;
SaveParams($i);
};
};
};
close OF;
unlink $FlagDir.$fRun;
};
#ºá»π߬ ¿úpδ ópπτ¡πε
if (-e $FlagDir.$fStart)
{open OF, $FlagDir.$fStart;
while (<OF>)
{chomp;
for ($i = 1; $i <= $GameCount; $i++)
{if (/\b$GAMES{"Name$i"}\b/i)
{ReadParams($i);
$GAMEINFO{"External"} = "Start";
printlog("[RUN $i] æΓáαΓ«óá¡« úÑ⌐¼¼áßΓÑα«¼ ...\n",1) if $FullLog;
SaveParams($i);
};
};
};
close OF;
unlink $FlagDir.$fStart;
};
#ßΓáΓπß »« ¿úαá¼
if (-e $FlagDir.$fStatus)
{$Status = "";
for ($gc = 1; $gc <= $GameCount; $gc++)
{TakeGameInfo($gc,0);
$Status .= "GAME $GAMES{\"Name$gc\"} STATUS.\n".
"Current weight = ".$GAMEINFO{"Summ"}."\n".
"Need for run = ".$GAMEINFO{"Need"}."\n".
"Turns present = ".$GAMEINFO{"Present"}."\n".
"Turns weight = ".$GAMEINFO{"Weight"}."\n".
CheckNextRun($gc)."\n\n";
}
if ($Status)
{ printlog("[STATUS] $Status",1);
MessageToGM($Status);
};
unlink $FlagDir.$fStatus;
};
#ß½¿» ¿úpδ ópπτ¡πε
if (-e $FlagDir.$fSleep)
{open OF, $FlagDir.$fSleep;
while (<OF>)
{chomp;
for ($i = 1; $i <= $GameCount; $i++)
{if (/\b$GAMES{"Name$i"}\b\:/i)
{$gc = $';
ReadParams($i);
$games = '';
$gc =~ s/(\d+)/($1, $games .= "$1,")/ge;
$GAMEINFO{"External"} = "Sleep".($games ? "=$games" : "");
SaveParams($i);
};
};
};
close OF;
unlink $FlagDir.$fSleep;
};
#»α¿Ñ¼ Ñ-¼δ½á »« POP3
if ($POP3User && $POP3Server && POP3Password)
{
$pop3= new Mail::POP3Client( USER => $POP3User,
PASSWORD => $POP3Password,
HOST => $POP3Server );
if ($pop3->Alive())
{
$Count = $pop3->Count();
printlog("[POP3] Started, found $Count messages ...\n");
if ($InEMailDir =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/i)
{$dir = $1;
for ($si = 1; $si <= $Count; $si++)
{@lines = $pop3->HeadAndBody($si);
$FName = MakeOutName($dir,".in");
open FILE,">$FName" || next;
foreach (@lines)
{print FILE $_,"\n";
};
close FILE;
printlog("[POP3] Save new message as $FName ...\n",1) if $FullLog;
unless ($POP3Delete =~ /no/i)
{$pop3->Delete($si);
printlog("[POP3] Message $si marked as deleted...\n",1) if $FullLog;
}
};
}
$pop3->Close();
}
else
{printlog("[POP3] Not available ...\n")};
};
ViewFiles();
ViewMsgs();
ViewEMail();
ViewOutgoing();
for ($gc = 1; $gc <= $GameCount; $gc++)
{CheckGame($gc)};
#ºñÑß∞ »α«óÑα¬á ¡á½¿τ¿∩ óδσ«ñ∩ΘÑú« Ñ-¼Ñ⌐½á ¿ Ñú« «Γß佬á
if ($SmtpServer)
{ undef $sender;
@files = ();
opendir DIR, $OutEMailDir;
@files = readdir DIR;
closedir DIR;
foreach $FName (@files)
{if ($FName =~ /\.out/i)
{open FILE, $OutEMailDir.$FName;
binmode FILE;
read FILE, $mail, -s $OutEMailDir.$FName;
close FILE;
$Delete = 1;
$email = "";
if ($mail =~ /\bTo\:.*?([^\;^\ ^\,]*?@[^\;^\ ^\,^\n]*)/i)
{$email = Trims($1);
$mail =~ /\bSubj\:(.*)/i;
$subj = Trims($1);
$mail =~ /\bInsertFile/i;
$msg = $';
@mimeext = ();
while ($msg =~ /MIMEFiles\=(.*)/)
{$msg = $`.$';
pos $files = 1;
while ($files = /(^;*?)/g) {push @files,$1};
};
while ($msg =~ /MIMEDataStart.*?=(\S+)\n([\s|\S]*)MIMEDataEnd/i)
{$msg = $`.$';
push @mimeext, "$TmpDir$1";
open OF,">$TmpDir$1";
binmode OF;
syswrite OF,$2,length $2;
close OF;
};
unless (defined $sender)
{
printlog("Open SMTP server $SmtpServer\n");
$sender = new Mail::Sender({smtp => $SmtpServer,
from => $EMailAddress,
subject => $ChanalOpen}
);
if (ref $sender && !$sender->{'error'})
{printlog("SMTP servise started for out e-mail...\n",1)
}
else
{printlog("Error($sender) : $Mail::Sender::Error\n") if $FullLog;
last;
};
};
$sender->Open({to => $EMailAddress,
subject => $ChanalOpen});
printlog("[SMTP Status] $sender->{'error'}, $sender\n",1);
last unless (ref $sender &&
(!defined $sender->{'error'} ||
(($sender->{'error'} == 0) || ($sender->{'error'} < -5))
)
);
$sender->Close();
if ($#mimeext >= 0)
{
unless (ref $sender->MailFile({to => $email,
subject => $subj,
file => (@mimeext),
msg => $msg}))
{$Delete = 0};
}
else
{unless (ref $sender->MailMsg({to => $email,
subject => $subj,
msg => $msg}))
{$Delete = 0};
};
foreach $files (@mimeext)
{unlink $files};
if ($Delete)
{printlog ("[Out SMTP] File $FName : $subject sending to $email\n",1) if $FullLog}
else
{printlog ("[Error SMTP] Error sending file $FName to $email\n",1) if $FullLog}
sleep(1);
};
unlink $OutEMailDir.$FName if $Delete;
};
}
};
for ($gc = 1; $gc <= $GameCount; $gc++)
{SaveGameConfig($gc)};
printlog ("[DONE] Wait for next time ...\n");
close LOGFILE;
sleep($CheckTime ? $CheckTime * 60 : 60);
};
################# τΓÑ¡¿Ñ Σá⌐½á ¬«¡Σ¿úπαᵿ¿ ##########################
sub LoadConfig
{
$GameCount = 0;
my ($lc) = 0;
open(MANCFG,$CfgFileName) || die "can't open config file...";
unlink "games.dat" || die "can't close config file...";
dbmopen(%GAMES,'games.dat',0644);
$HostName = "";
$InMsgDir = "";
$InFileDir = "";
$InEMailDir = "";
$FromGMDir = "";
$GAMES{"Player0.0"} = "";
printlog("--------------------------- Start of loadconfig ----------------------\n",1);
while (<MANCFG>)
{ $lc++;
chomp;
$line = $_;
while ($line =~ /(\;|rem|\#)/g) {$line = $`};
$line = Trims($line);
unless ($line) {next};
#ú½«íá½∞¡δÑ «»µ¿¿
#$HostName = "";
if ($line =~ /HOSTNAME.*?[-=](.*)/i)
{$HostName .= ";".Trims($1." "); printlog("Host name is =$HostName\n",1); next};
#$IncomeFIDO = "";
if ($line =~ /INCOMEFIDO.*?[-=](.*)/i)
{$IncomeFIDO .= ";".Trims($1." "); printlog("Income FIDO is=$IncomeFIDO\n",1); next};
#$HostNameFrom = "";
if ($line =~ /HOSTFROM.*?[-=](.*)/i)
{$HostNameFrom = Trims($1." "); printlog("Host name out =$HostNameFrom\n",1); next};
#$FidoAddress = "";
if ($line =~ /HOSTFIDO.*?[-=].*?([0-9\:\.\/]+)/i)
{$FidoAddress = $1; $IncomeFIDO .= ";$1";
printlog("Host FIDO =$FidoAddress\n",1); next};
#$EMailAddress = "";
if ($line =~ /HOSTEMAIL.*?[-=].*?(\S+)/i)
{$EMailAddress = $1; printlog("Host E-Mail =$EMailAddress\n",1); next};
#$CheckTime = 20;
if ($line =~ /CHECKTIME.*?[-=].*?(\d+)/i)
{$CheckTime = $1; printlog("Check time =$CheckTime\n",1); next};
#$WorkDir = "";
if ($line =~ /WORKDIR.*?[-=](.*)/i && ValidDir($1))
{$WorkDir = Trims($1); printlog("Work in dir =$WorkDir\n",1); next};
#$FlagDir = "";
if ($line =~ /FLAGDIR.*?[-=](.*)/i && ValidDir($1))
{$FlagDir = Trims($1); printlog("Flag in dir =$FlagDir\n",1); next};
#$TmpDir = "";
if ($line =~ /TMPDIR.*?[-=](.*)/i && ValidDir($1))
{$TmpDir = Trims($1); printlog("Move tmp file =$TmpDir\n",1); next};
#$InMsgDir = "";
if ($line =~ /INMSGDIR.*?[-=](.*)/i)
{$InMsgDir .= ";".Trims($1); printlog("Check FIDO in =$InMsgDir\n",1); next};
#$InFileDir = "";
if ($line =~ /INFILEDIR.*?[-=](.*)/i)
{$InFileDir .= ";".Trims($1); printlog("Check file in =$InFileDir\n",1); next};
#$InEMailDir = "";
if ($line =~ /INEMAILDIR.*?[-=](.*)/i)
{$InEMailDir .= ";".Trims($1); printlog("Check EMail in=$InEMailDir\n",1); next};
#$OutMsgDir = "";
if ($line =~ /OUTMSGDIR.*?[-=](.*)/i && ValidDir($1))
{$OutMsgDir = Trims($1); printlog("Put FIDO to =$OutMsgDir\n",1); next};
#$OutEMailDir = "";
if ($line =~ /OUTEMAILDIR.*?[-=](.*)/i && ValidDir($1))
{$OutEMailDir = Trims($1); printlog("Put EMail to =$OutEMailDir\n",1); next};
#$HostMsgs = "";
if ($line =~ /HOSTMSGS.*?[-=](.*)/i && ValidDir($1))
{$HostMsgs = Trims($1); printlog("Mail for GM =$HostMsgs\n",1); next};
#$FromGMDir = "";
if ($line =~ /FROMGMDIR.*?[-=](.*)/i && ValidDir($1))
{$FromGMDir .= Trims($1); printlog("Mail from GM =$FromGMDir\n",1); next};
#$BackupDir = "";
if ($line =~ /BACKUPTO.*?[-=](.*)/i && ValidDir($1))
{$BackupDir = Trims($1); printlog("Backed up to =$BackupDir\n",1); next};
#$MaxMsgLines = 400;
if ($line =~ /MAXMSGLINES.*?[-=].*?(\d+)/i)
{$MaxMsgLines = $1; printlog("Lines in MSG =$MaxMsgLines\n",1); next};
#$SmtpServer = "unknown.server";
if ($line =~ /SMTPSERVER.*?[-=](.*)/i)
{$SmtpServer = Trims($1);printlog("External SMTP =$SmtpServer\n",1); next};
#$POP3Server = "unknown.server";
if ($line =~ /POP3SERVER.*?[-=](.*)/i)
{$POP3Server = Trims($1);printlog("External POP3 =$POP3Server\n",1); next};
#$POP3Password = "unknown.password";
if ($line =~ /POP3PASSWORD.*?[-=](.*)/i)
{$POP3Password = Trims($1);printlog("POP3 password =$POP3Password\n",1); next};
#$POP3User = "unknown.user";
if ($line =~ /POP3USER.*?[-=](.*)/i)
{$POP3User = Trims($1);printlog("POP3 user name =$POP3User\n",1); next};
#$POP3Delete = "NO";
if ($line =~ /POP3Delete.*?[-=](.*)/i)
{$POP3Delete = Trims($1);printlog("Delete POP3 mail=$POP3Delete\n",1); next};
#$UnZipCommand = "";
if ($line =~ /UNZIP.*?[-=](.*)/i)
{$UnZipCommand = Trims($1." "); printlog("Dearc ZIP =$UnZipCommand\n",1); next};
#$ZipCommand = "";
if ($line =~ /DOZIP.*?[-=](.*)/i)
{$ZipCommand = Trims($1." "); printlog("Arc ZIP =$UnZipCommand\n",1); next};
#$UnRarCommand = "";
if ($line =~ /UNRAR.*?[-=](.*)/i)
{$UnRarCommand = Trims($1." "); printlog("Dearc RAR =$UnRarCommand\n",1); next};
#$RarCommand = "";
if ($line =~ /DORAR.*?[-=](.*)/i)
{$RarCommand = Trims($1." "); printlog("Arc RAR =$UnRarCommand\n",1); next};
#$UnArjCommand = "";
if ($line =~ /UNARJ.*?[-=](.*)/i)
{$UnArjCommand = Trims($1." "); printlog("Dearc ARJ =$UnArjCommand\n",1); next};
#$ArjCommand = "";
if ($line =~ /DOARJ.*?[-=](.*)/i)
{$ArjCommand = Trims($1." "); printlog("Arc ARJ =$UnArjCommand\n",1); next};
#$UnLzhCommand = "";
if ($line =~ /UNLZH.*?[-=](.*)/i)
{$UnLzhCommand = Trims($1." "); printlog("Dearc LZH =$UnLzhCommand\n",1); next};
#$LzhCommand = "";
if ($line =~ /DOLZH.*?[-=](.*)/i)
{$LzhCommand = Trims($1." "); printlog("Arc LZH =$LzhCommand\n",1); next};
#$DeUUECommand = "";
if ($line =~ /DEUUE.*?[-=](.*)/i)
{$DeUUECommand = Trims($1." "); printlog("Deuue file =$DeUUECommand\n",1); next};
#$UUECommand = "";
if ($line =~ /ENUUE.*?[-=](.*)/i)
{$UUECommand = Trims($1." "); printlog("UUE file =$UUECommand\n",1); next};
#$CopyTo = "";
if ($line =~ /GMCOPYTO.*?[-=](.*)/i)
{$GAMES{"Player0.0"} .= "[".Trims($1." ")."]"; printlog("CC for GM to =$1\n",1); next};
#$GMPASSWORD
if ($line =~ /GMPASSWORD.*?[-=](.*)/i)
{$Password = Trims($1); printlog("GM Password =$Password\n",1); next};
if ($line =~ /GAMEDATA.*?=(.*)/i)
{my ($FName) = Trims($1);
if (open GAMEDATA,$FName)
{$GameCount++;
$GAMES{"DATAFILE$GameCount"} = $FName;
delete $GAMES{"Name$GameCount"};
delete $GAMES{"Dir$GameCount"};
delete $GAMES{"Days$GameCount"};
delete $GAMES{"Time$GameCount"};
delete $GAMES{"Run$GameCount"};
delete $GAMES{"Wait$GameCount"};
delete $GAMES{"Weight$GameCount"};
delete $GAMES{"Weights$GameCount"};
delete $GAMES{"CheckDec$GameCount"};
delete $GAMES{"EnableVia$GameCount"};
delete $GAMES{"RRCTpl$GameCount"};
delete $GAMES{"SleepTpl$GameCount"};
delete $GAMES{"SentTpl$GameCount"};
delete $GAMES{"ErrorTpl$GameCount"};
delete $GAMES{"Comments$GameCount"};
for (my $i = 1; $i <= 11; $i++)
{delete $GAMES{"Player$GameCount.$i"}};
delete $GAMES{"Include$GameCount"};
my $gc = 0;
COMMENT: while (<GAMEDATA>)
{$gc++;
chomp;
$line = $_;
while ($line =~ m/(\;|rem|\#)/g)
{if (pos $line == 1)
{$GAMES{"Comments$GameCount"} .= "[$line]";
next COMMENT;
}
else
{$line = $`
}
};
$line = Trims($line);
unless ($line) {next};
if ($line =~ /\bGAMENAME.*?[-=].*?(\w+)/i)
{$GAMES{"Name$GameCount"} = $1; next};
if ($line =~ /\bGAMEDIR.*?[-=](.*)/i && ValidDir($1))
{$GAMES{"Dir$GameCount"} = Trims($1); next};
if ($line =~ /\bDAILY.*?[-=].*?(\w+)/i)
{$GAMES{"Days$GameCount"} = $1; next};
if ($line =~ /\bRUNTIME.*?[-=].*?(\d+)[:-](\d+)/i)
{$GAMES{"Time$GameCount"} = $1 * 3600 + $2 * 60; next};
if ($line =~ /\bRUNCOMMAND.*?[-=](.*)/i)
{$GAMES{"Run$GameCount"} = Trims($1); next};
if ($line =~ /\bCHECKWEIGHT.*?[-=].*?(\d+)/i)
{$GAMES{"Weight$GameCount"} = $1; next};
if ($line =~ /\bWEIGHTS.*?[-=].*?(\w+)/i)
{$GAMES{"Weights$GameCount"} = $1; next};
if ($line =~ /\bCHECKDEC.*?[-=].*?(\d+)/i)
{$GAMES{"CheckDec$GameCount"} = $1; next};
if ($line =~ /\bWAIT.*?[-=].*?(\d+)/i)
{$GAMES{"Wait$GameCount"} = $1; next};
if ($line =~ /\bENABLEVIA.*?[-=].*?(\w+)/i)
{$GAMES{"EnableVia$GameCount"} = $1; next};
if ($line =~ /\bRRC.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
{$GAMES{"RRCTpl$GameCount"} = $1; next};
if ($line =~ /\bSLEEP.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
{$GAMES{"SleepTpl$GameCount"} = $1; next};
if ($line =~ /\bSENT.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
{$GAMES{"SentTpl$GameCount"} = $1; next};
if ($line =~ /\bERROR.*?[-=].*?([a-zA-Z0-9\_\.\:\/\\\#\$\%\&\-]+)/i)
{$GAMES{"ErrorTpl$GameCount"} = $1; next};
if ($line =~ /\bPLAYER(\d+).*?[-=](.*)/i)
{$GAMES{"Player$GameCount.$1"} .= "[".Trims($2)."]"; next};
if ($line =~ /\bINCLUDE.*?[-=](.*)/i)
{$GAMES{"Include$GameCount"} .= "[".Trims($1)."]"; next};
printlog ("[WARNING] Unknown command line at $gc file $FName...\n");
}
close GAMEDATA;
printlog ("Find game data - succesfully work as game #$GameCount\n",1);
}
next;
}
printlog ("[WARNING] Unknown command line at $lc file $CfgFileName...\n");
}
printlog("--------------------------- End of loadconfig ----------------------\n",1);
close(MANCFG);
}
sub ValidDir
{my ($dir) = @_;
return -d Trims($dir);
};
sub SaveGameConfig
{my ($GNum) = @_;
unless ( ($GAMES{"DATAFILE$GNum"}) && (open GAMEDATA,">".$GAMES{"DATAFILE$GNum"}) )
{return 0};
if ($GAMES{"Name$GNum"}) {print GAMEDATA " GAMENAME = ".$GAMES{"Name$GNum"}."\n"};
if ($GAMES{"Dir$GNum"}) {print GAMEDATA " GAMEDIR = ".$GAMES{"Dir$GNum"}."\n"};
if ($GAMES{"Days$GNum"}) {print GAMEDATA " DAILY = ".$GAMES{"Days$GNum"}."\n"};
if ($GAMES{"Time$GNum"})
{print GAMEDATA " RUNTIME = ".($GAMES{"Time$GNum"} / 3600).':'.
(($GAMES{"Time$GNum"} % 3600) / 60)."\n"};
if ($GAMES{"Run$GNum"})
{print GAMEDATA " RUNCOMMAND = ".$GAMES{"Run$GNum"}."\n"};
if ($GAMES{"Weight$GNum"})
{print GAMEDATA " CHECKWEIGHT= ".$GAMES{"Weight$GNum"}."\n"};
if ($GAMES{"Weights$GNum"})
{print GAMEDATA " WEIGHTS = ".$GAMES{"Weights$GNum"}."\n"};
if ($GAMES{"Wait$GNum"})
{print GAMEDATA " WAIT = ".$GAMES{"Wait$GNum"}."\n"};
if ($GAMES{"CheckDec$GNum"})
{print GAMEDATA " CHECKDEC = ".$GAMES{"CheckDec$GNum"}."\n"};
if ($GAMES{"EnableVia$GNum"})
{print GAMEDATA " ENABLEVIA = ".$GAMES{"EnableVia$GNum"}."\n"};
if ($GAMES{"RRCTpl$GNum"})
{print GAMEDATA " RRC = ".$GAMES{"RRCTpl$GNum"}."\n"};
if ($GAMES{"SleepTpl$GNum"})
{print GAMEDATA " SLEEP = ".$GAMES{"SleepTpl$GNum"}."\n"};
if ($GAMES{"SentTpl$GNum"})
{print GAMEDATA " SENT = ".$GAMES{"SentTpl$GNum"}."\n"};
if ($GAMES{"ErrorTpl$GNum"})
{print GAMEDATA " ERROR = ".$GAMES{"ErrorTpl$GNum"}."\n"};
for (my $i = 1; $i <= 11; $i++)
{my $line = $GAMES{"Player$GNum.$i"};
while ($line =~ /\[(.*?)\]/g)
{ print GAMEDATA " PLAYER$i = ".$1."\n";
}
};
$line = $GAMES{"Include$GNum"};
while ($line =~ m/\[(.*?)\]/g)
{ print GAMEDATA " INCLUDE = ".$1."\n"
};
$line = $GAMES{"Comments$GNum"};
while ($line =~ m/\[(.*?)\]/g)
{ print GAMEDATA $1."\n"
};
close GAMEDATA;
}
################# »α«ß¼«Γα óσ«ñ¡δσ ¬áΓὫú«ó #########################
# »α«ß¼«Γα Σá⌐½«ó
sub ViewFiles
{
my (@files);
my $line = $InFileDir;
while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
{$line = $';
opendir(DIR,$1) || next;
@files = readdir(DIR);
$dir = $1;
closedir DIR;
printlog("[SCAN Files] $dir\n");
#- if ( ($lasttime) = (stat("$1lastread.hst"))[8] ) -#
#- {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
#- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE); -#
foreach $file (@files)
{ #- if ( (stat("$dir$file"))[8] > $lasttime) -#
{
my($GameNum,$RaceNum) = 0;
if(($GameNum,$RaceNum) = ValidFName($file))
{printlog("[i] Find new file : $dir$file\n",1) if $FullLog;
if ($file =~ /\.tr[a-z0-9]/i)
{DoFile($dir,$file,$GameNum,$RaceNum,$dir.$file,"TRN",1);
}
elsif
($file =~ /\.vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9]/i)
{DeArcFile($dir.$file,$TmpDir,$GameNum,$RaceNum,$dir.$file,"VPF",1);
};
};
}
}
};
}
#»α«ß¼«Γα à-îÑ⌐½á
sub ViewEMail
{
my $line = $InEMailDir;
while ($line =~ /([[a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
{$line = $';
opendir(DIR,$1) || next;
my(@files) = readdir(DIR);
$dir = $1;
printlog("[SCAN EMail] $dir\n");
closedir DIR;
#- if ( ($lasttime) = (stat("$1lastread.hst"))[8] ) -#
#- {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
#- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE); -#
foreach $file (@files)
{ if #- ((stat("$dir$file"))[8] > $lasttime) ) -#
($file =~ /\.in\b/i)
{
DivEMail($dir.$file);
}
}
};
}
#»α«ß¼«Γα öêäÄ-îÑ⌐½á
sub ViewMsgs
{
my $line = $InMsgDir;
while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
{$line = $';
opendir(DIR,$1) || next;
my(@files) = readdir(DIR);
$dir = $1;
closedir DIR;
printlog("[SCAN FIDO] $dir\n");
#- if ( ($lasttime) = (stat("$1lastread.hst"))[8] ) -#
#- {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
#- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE); -#
foreach $file (@files)
{ if #- (stat("$dir$file"))[8] > $lasttime) -#
( $file =~ /\.msg/i )
{
DivMsg($dir.$file);
}
}
};
}
#»α«ß¼«Γα »¿ßѼ «Γ âî ¿úα«¬á¼ ¿º öêäÄ-îÑ⌐½á
sub ViewOutgoing
{
my $line = $FromGMDir;
while ($line =~ /([a-zA-Z0-9_\.\:\/\\\#\$\%\&\-]+)/)
{$line = $';
opendir(DIR,$1) || next;
my(@files) = readdir(DIR);
$dir = $1;
closedir DIR;
printlog("[SCAN FROM GM] $dir\n");
#- if ( ($lasttime) = (stat("$1lastread.hst"))[8] ) -#
#- {unlink("$1lastread.hst")} else {$lasttime = 0}; -#
#- open(TIMEFILE,">$1lastread.hst"); close(TIMEFILE); -#
foreach $file (@files)
{ if #- (stat("$dir$file"))[8] > $lasttime) -#
( $file =~ /\.msg/i )
{#- printlog("[i] Find new GM-mail : $dir$file\n",1) if $FullLog; -#
OutMsg($dir.$file);
}
}
};
}
#¿ºó½ÑτÑ¡¿Ñ ¿º Σ«α¼áΓá »¿ß∞¼á à-îÑ⌐½á
sub DivEMail
{ my ($file) = @_;
my ($filename);
my @mail = ();
my @files = ();
my $mail = [];
my $blank = 1;
$filesize = -s $file || return 0;
open(MAILFILE,"$file") || return 0;
#ñѽ¿¼ mbox
$c=0;
while (<MAILFILE>)
{if ($blank && /\AFrom .*\d{4}/)
{push(@mail, $mail) if scalar(@{$mail});
$mail = [ $_ ];
$blank = 0;
}
else
{$blank = m#\A\Z#o ? 1 : 0;
push(@{$mail}, $_);
}
};
push(@mail, $mail) if scalar(@{$mail});
close MAILFILE;
$filename = $file;
$filename =~ s/(.*?)[^\\^\/]*?$/$1/i;
rename ($file,MakeOutName($filename, ".ins"));
# ΓÑ»Ñα∞ ¿¼ÑѼ ¼áßß¿ó ¼áßß¿ó«ó ßΓ᫬
# @{$mail}
foreach $mail (@mail)
{$buf = join("",@{$mail});
$buf =~ /From:(.*)/i || next;
my $From = Trims($1);
$buf =~ /To:(.*)/i || next;
my $To = Trims($1);
pos $HostName = 0;
my $ValidName= 0;
while ($HostName =~ /([^;^,]+)/gc)
{$blank = $1;
if ($To =~ /$blank/i) {$ValidName = 1}
};
next unless $ValidName;
printlog("[EMAIL] $From -> $To\n",1) if $FullLog;
my $Subj = "";
($buf =~ /Subject:(.*)/i) && ($Subj = Trims($1));
if (($Subj eq $ChanalOpen) and ($From eq $EMailAddress))
{printlog ("[EMAIL] Chanal opening message - skipping...\n",1) if $FullLog;
next;
};
@thisfile = ();
#multypart
if ($buf =~ /Content-Type[\s|\S]*?boundary=(\"{0,1})(.+)\1/i)
{$bound = "--".$2;
$open = 0;
while ($buf =~ /(.*?[\n|\r]{1,2})/gc)
{$line = $1;
if ($line =~ /$bound(.*)/)
{close MAILFILE if $open;
last if ($1 eq "--");
$thisfile = MakeOutName($TmpDir,".em");
push @thisfile,$thisfile;
open MAILFILE,">$thisfile";
binmode MAILFILE;
$open = 1;
}
else
{syswrite(MAILFILE,$line,length $line) if ($open);
}
}
}
else
{$thisfile = MakeOutName($TmpDir,".em");
open MAILFILE,">$thisfile";
binmode MAILFILE;
syswrite MAILFILE,$buf,length $buf;
close MAILFILE;
push @thisfile,$thisfile;
};
$RNum = $GNum = 0;
if ($Subj =~ /game.*?(\w+).*?race.*?(\d+)/i)
{$RNum = $2;
$GName = $1;
for ($i = 1; $i <= $GameCount; $i++)
{if (($GAMES{"Name$i"} =~ /\b$GName\b/i) ||
(($GAMES{"Name$i"} >= 10) && ($GAMES{"Name$i"} <= 32) &&
(chr($GAMES{"Name$i"}+55) =~ /\b$GName\b/i)))
{$GNum = $i; last;
}
}
};
foreach $thisfile (@thisfile)
{open (MAILFILE,$thisfile) || next;
binmode MAILFILE;
read MAILFILE,$onemess,-s $thisfile;
close MAILFILE;
if ($onemess =~ /Content-Type.*?charset=\s*?(\S+)/i)
{$onemess = ConvertToAlt($onemess,$1);
open (MAILFILE,">$thisfile") || next;
binmode MAILFILE;
syswrite MAILFILE,$onemess,length $onemess;
close MAILFILE;
};
if ($Subj =~ /game.*?(\w+).*?from.*?(\d+).*?to.*?(\d+)/)
{my $RNum = $1;
my $FromRace = $2;
my $ToRace = $3;
my $GNum = 0;
for (my $i = 1; $i <= $GameCount; $i++)
{if ($GAMES{"Name$i"} =~ /\b$RNum\b/i)
{$GNum = $i; last};
};
last unless $GNum;
last unless $GAMES{"EnableVia$GNum"};
$onemess = "Internal message from $FromRace\n".ConvertFromAlt($onemess,'koi');
open FILE, ">$TmpDir$OutUUE" || return 0;
binmode FILE;
syswrite FILE,$onemess,length $onemess;
close FILE;
OutMail($GNum,$ToRace,0);
printlog("[MSG] Sent via msg in game <$GAMES{\"Name$GNum\"}> $FromRace -> $ToRace\n");
open FILE, ">$TmpDir$OutUUE" || return 0;
binmode FILE;
$buf = "I sent your message in game <$GAMES{\"Name$GNum\"}> ".
"to $ToRace at".localtime()."\n";
syswrite FILE,$buf,length $buf;
close FILE;
OutMail($GNum,$FromRace,0);
next;
};
if ($Subj eq $Password)
{Remote($onemess);
next;
}
if ($onemess =~ /Content-Transfer-Encoding.*?quoted-print/i)
{
$onemess =~ s/[ \t]+?(\r?\n)/$1/g; # rule #3 (trailing space must be deleted)
$onemess =~ s/=\r?\n//g; # rule #5 (soft line breaks)
$onemess =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
open (MAILFILE,">$thisfile") || next;
binmode MAILFILE;
syswrite MAILFILE,$onemess,length $onemess;
close MAILFILE;
};
my ($StoreFile) = $thisfile;
if ($onemess =~ /Content-Transfer-Encoding.*base64/i)
{ #DeMIME message
next unless ($onemess =~ /\n\n/);
if ($onemess =~ /Content-Disposition.*?attachment.*?filename=(\"{0,1})(.+)\1/i)
{$thisfile = $2;
@files = ($thisfile);
};
$onemess = MIME::Base64::decode($');
open MAILFILE,">$TmpDir$thisfile" || next;
binmode MAILFILE;
syswrite MAILFILE,$onemess,length $onemess;
close MAILFILE;
}
if ($#files == -1)
{if (($onemess =~ /file.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i) ||
($onemess =~ /begin.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i))
{$FName = "$1.$2"}
else
{MessageToGM($onemess);
next
};
DeUUEFile($thisfile,$TmpDir.$FName);
opendir (DIR,$TmpDir);
@files = readdir DIR;
closedir DIR;
}
foreach $filename (@files)
{if ($filename =~ /\.(trn)/i)
{DoFile($TmpDir,$filename,$GNum,$RNum,$StoreFile,"EM",1);
printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
unlink $TmpDir.$filename;
}
elsif
($filename =~ /\.(vpf|zip|rar|arj|lzh)/i)
{DeArcFile($TmpDir.$filename,$TmpDir,$GNum,$RNum,$StoreFile,"EM",1);
printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
unlink $TmpDir.$filename;
};
};
unlink $StoreFile;
@files = ();
}
}
};
sub ConvertToAlt
{ my($line,$from) = @_;
if
($from =~ /koi/i)
{$line =~ tr/[.+-|ßΓ≈τΣσ÷·ΘΩδ∞φε∩≡≥≤⌠⌡µΦπ■√² ∙°ⁿα±┴┬╫╟─┼╓┌╔╩╦╠═╬╧╨ÉæÆüç▓┤ºª╡í¿«¡¼âäëêåÇè»░½Ñ╗╕▒á╛╣║╢╖¬⌐óñ╜╝àéìîÄÅï╥╙╘╒╞╚├▐█▌▀┘╪▄└╤│úÖÿô¢ƒù£₧òûÜ¥ö┐]/[.+-|ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■]/
}
elsif
($from =~ /win/i)
{$line =~ tr/[└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ]/[ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»αßΓπΣσµτΦΘΩδ∞φε∩]/
};
return $line;
}
sub ConvertFromAlt
{ my($line,$from) = @_;
if
($from =~ /koi/i)
{$line =~ tr/[.+-|ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■]/[.+-|ßΓ≈τΣσ÷·ΘΩδ∞φε∩≡≥≤⌠⌡µΦπ■√² ∙°ⁿα±┴┬╫╟─┼╓┌╔╩╦╠═╬╧╨ÉæÆüç▓┤ºª╡í¿«¡¼âäëêåÇè»░½Ñ╗╕▒á╛╣║╢╖¬⌐óñ╜╝àéìîÄÅï╥╙╘╒╞╚├▐█▌▀┘╪▄└╤│úÖÿô¢ƒù£₧òûÜ¥ö┐]/;
}
elsif
($from =~ /win/i)
{$line =~ tr/[ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»αßΓπΣσµτΦΘΩδ∞φε∩]/[└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ]/;
printlog("[ALT-> WIN]\n");
};
return $line;
}
#¿ºó½ÑτÑ¡¿Ñ ¿º Σ«α¼áΓá »¿ß∞¼á öêäÄ
#FIDO_Message = Record
# Msg_From, Msg_To : Array [1..36] of Char;
# Subj : Array [1..72] of Char;
# Msg_Date : Array [1..20] of Char;
# Times_Read, Dest_Node, Orig_Node, Cost, Orig_Net, Dest_Net : Integer;
# Date_Written, Date_Arrived : LongInt;
# Reply : Integer;
# Attributes : Word;
# (* Bit 0 Private
# 1 Crash
# 2 Message read
# 3 Message sent
# 4 File-attach
# 5 Forwarded
# 6 Orphan
# 7 Kill/sent
# 8 Local message
# 9 Hold
# 10 ???
# 11 File-request
# 12 Return-receipt requested
# 13 Return-receipt
# 14 Audit-trail requested
# 15 Update-request *)
# Unreply : Integer;
# Txt : Array [1..$8000] of Char;
# (* The message text field contains text of
# any length, terminated with a null (0) byte *)
#end;
sub DivMsg
{ my ($file) = @_;
my ($filename,$i,$GNum,$RNum,$FromRace,$ToRace);
$filesize = -s $file || return 0;
open(MAILFILE,"$file") || return 0;
read(MAILFILE,$buf,$filesize) || return 0;
close(MAILFILE);
$filesize -= $filesize > 190 ? 190 : $filesize;
($From,$To,$Subj,$temp,$let) = unpack("A36 A36 A72 A46 a$filesize", $buf);
$From = Trims($From); $To = Trims($To); $Subj = Trims($Subj);
pos $HostName = 0;
my $ValidName= 0;
while ($HostName =~ /([^;^,]+)/gc)
{$blank = $1;
if ($To =~ /$blank/i) {$ValidName = 1}
};
next unless $ValidName;
my $ToFIDO = unpack("s",substr($temp,30,2)).
"/".
unpack("s",substr($temp,22,2));
if ($let =~ /TOPT.*?(\d+)/i) {$ToFIDO .= ".$1"};
next unless ($IncomeFIDO =~ /\b$ToFIDO\b/i);
printlog ("[MSG] $From->$To = $Subj\n",1) if $FullLog;
if ($Subj eq $Password)
{Remote($let);
unlink $file;
return 1
};
if ($Subj =~ /game.*?(\w+).*?from.*?(\d+).*?to.*?(\d+)/)
{$RNum = $1;
$FromRace = $2;
$ToRace = $3;
$GNum = 0;
for ($i = 1; $i <= $GameCount; $i++)
{if ($GAMES{"Name$i"} =~ /\b$RNum\b/i)
{$GNum = $i; last};
};
return 0 unless $GNum;
return 0 unless $GAMES{"EnableVia$GNum"};
$let =~ s/(\x01.*?\x0D)//g;
$let = "Internal message from $FromRace\n".$let;
open FILE, ">$TmpDir$OutUUE" || return 0;
binmode FILE;
syswrite FILE,$let,length $let;
close FILE;
OutMail($GNum,$ToRace,0);
printlog("[MSG] Sent via msg in game <$GAMES{\"Name$GNum\"}> $FromRace -> $ToRace\n");
open FILE, ">$TmpDir$OutUUE" || return 0;
binmode FILE;
$buf = "I sent your message in game <$GAMES{\"Name$GNum\"}> ".
"to $ToRace at ".localtime()."\n";
syswrite FILE,$buf,length $buf;
close FILE;
OutMail($GNum,$FromRace,0);
unlink $file;
return 1;
}
open (UUEFILE,">$TmpDir$IncUUE") || return 0;
print UUEFILE $let || return 0;
close(UUEFILE);
$RNum = $GNum = 0;
if ($Subj =~ /.*?game.*?(\w+).*?race.*?(\d+)/i)
{$RNum = $2;
$GName = $1;
for ($i = 1; $i <= $GameCount; $i++)
{if (($GAMES{"Name$i"} =~ /\b$GName\b/i) ||
(($GAMES{"Name$i"} >= 10) && ($GAMES{"Name$i"} <= 32) &&
(chr($GAMES{"Name$i"}+55) =~ /\b$GName\b/i)))
{$GNum = $i; last;
}
};
};
if (($let =~ /file.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i) ||
($let =~ /begin.*?([a-zA-Z0-9]*)\.(trn|vpf|arj|lzh|rar|zip)/i))
{$FName = "$1.$2"}
else
{MessageToGM("From:$From\nTo:$To\nSubj:$Subj\n$let");
return 0
};
DeUUEFile($TmpDir.$IncUUE,$TmpDir.$FName);
unlink($TmpDir.$IncUUE);
opendir (DIR,$TmpDir);
my(@files) = readdir DIR;
closedir DIR;
foreach $filename (@files)
{ if ($filename =~ /\.(trn|vpf|zip|rar|arj|lzh)/i)
{DeArcFile($TmpDir.$filename,$TmpDir,$GNum,$RNum,$file,"FM",1);
printlog("[Delete] $TmpDir$filename\n",1) if $FullLog;
unlink $TmpDir.$filename;
};
};
}
sub Remote
{my ($commands) = @_;
my ($cmd,$cmdline,$mode,$i,$mess,$gc,$gr) = "";
my $outmsg = "_REMOTE_CONTROL_OPERATING_STATUS_\n";
while ($commands =~ /(.*?)[\n|\r]{1,2}/g)
{$cmd = $1;
if ($cmd =~ /\s*?\%SLEEP\b/)
{$cmd = $'; $outmsg .= "I set SLEEP flags for :\n";
open FILE,">>$FlagDir$fSleep" || next;
if (Trims($cmd))
{while ($cmd =~ /(\S+)/g) {print FILE "$1\n"; $outmsg .= "$1\n"}
}
else
{for ($i = 1; $i <= $GameCount; $i++)
{print FILE $GAMES{"Name$i"}."\n";
$outmsg .= $GAMES{"Name$i"}."\n"
};
};
close FILE;
}
elsif
($cmd =~ /\s*?%RUN\b/)
{$cmd = $'; $outmsg .= "I set RUN flags for :\n";
open FILE,">>$FlagDir$fRun" || next;
if (Trims($cmd))
{while ($cmd =~ /(\w+)/g) {print FILE "$1\n"; $outmsg .= "$1\n"}
}
else
{for ($i = 1; $i <= $GameCount; $i++)
{print FILE $GAMES{"Name$i"}."\n";
$outmsg .= $GAMES{"Name$i"}."\n"
};
};
close FILE;
}
elsif
($cmd =~ /\s*?%STATUS\b/)
{$cmd = $'; $outmsg .= "Status for games is :\n";
if (Trims($cmd))
{while ($cmd =~ /(\S+)/g)
{$cmdline = $1;
for ($i = 1; $i <= $GameCount; $i++)
{if ($cmdline =~ /\b$GAMES{"Name$i"}\b/i)
{TakeGameInfo($i,0);
$outmsg .= "GAME $GAMES{\"Name$i\"} STATUS.\n".
"Current weight = ".$GAMEINFO{"Summ"}."\n".
"Need for run = ".$GAMEINFO{"Need"}."\n".
"Turns present = ".$GAMEINFO{"Present"}."\n".
"Turns weight = ".$GAMEINFO{"Weight"}."\n".
CheckNextRun($i)."\n\n";
}
}
}
}
else
{for ($i = 1; $i <= $GameCount; $i++)
{TakeGameInfo($i,0);
$outmsg .= "GAME $GAMES{\"Name$i\"} STATUS.\n".
"Current weight = ".$GAMEINFO{"Summ"}."\n".
"Need for run = ".$GAMEINFO{"Need"}."\n".
"Turns present = ".$GAMEINFO{"Present"}."\n".
"Turns weight = ".$GAMEINFO{"Weight"}."\n".
CheckNextRun($i)."\n\n"
}
};
}
elsif
($cmd =~ /\s*?%GETCFG\b/)
{$cmd = Trims($');
$outmsg .= "This is config for game $cmd. Use %SETCFG $cmd for change it.\n";
for ($i = 1; $i <= $GameCount; $i++)
{if ($cmd =~ /\b$GAMES{"Name$i"}\b/i)
{
if ($GAMES{"Name$i"}) {$outmsg .= " GAMENAME = ".$GAMES{"Name$i"}."\n"};
if ($GAMES{"Dir$i"}) {$outmsg .= " GAMEDIR = ".$GAMES{"Dir$i"}."\n"};
if ($GAMES{"Days$i"}) {$outmsg .= " DAILY = ".$GAMES{"Days$i"}."\n"};
if ($GAMES{"Time$i"})
{$outmsg .= " RUNTIME = ".($GAMES{"Time$i"} / 3600).':'.
(($GAMES{"Time$i"} % 3600) / 60)."\n"};
if ($GAMES{"Run$i"})
{$outmsg .= " RUNCOMMAND = ".$GAMES{"Run$i"}."\n"};
if ($GAMES{"Weight$i"})
{$outmsg .= " CHECKWEIGHT= ".$GAMES{"Weight$i"}."\n"};
if ($GAMES{"Weights$i"})
{$outmsg .= " WEIGHTS = ".$GAMES{"Weights$i"}."\n"};
if ($GAMES{"Wait$i"})
{$outmsg .= " WAIT = ".$GAMES{"Wait$i"}."\n"};
if ($GAMES{"CheckDec$i"})
{$outmsg .= " CHECKDEC = ".$GAMES{"CheckDec$i"}."\n"};
if ($GAMES{"EnableVia$i"})
{$outmsg .= " ENABLEVIA = ".$GAMES{"EnableVia$i"}."\n"};
if ($GAMES{"RRCTpl$i"})
{$outmsg .= " RRC = ".$GAMES{"RRCTpl$i"}."\n"};
if ($GAMES{"SleepTpl$i"})
{$outmsg .= " SLEEP = ".$GAMES{"SleepTpl$i"}."\n"};
if ($GAMES{"SentTpl$i"})
{$outmsg .= " SENT = ".$GAMES{"SentTpl$i"}."\n"};
if ($GAMES{"ErrorTpl$i"})
{$outmsg .= " ERROR = ".$GAMES{"ErrorTpl$i"}."\n"};
for (my $c = 1; $c <= 11; $c++)
{my $line = $GAMES{"Player$i.$c"};
while ($line =~ /\[(.*?)\]/g)
{ $outmsg .= " PLAYER$c = ".$1."\n";
}
};
my $line = $GAMES{"Include$i"};
while ($line =~ m/\[(.*?)\]/g)
{ $outmsg .= " INCLUDE = ".$1."\n"
};
$line = $GAMES{"Comments$i"};
while ($line =~ m/\[(.*?)\]/g)
{ $outmsg .= $1."\n"
};
last;
}
}
}
elsif
($cmd =~ /\s*?%SETCFG\b/)
{$cmd = Trims($');
$outmsg .= "Set new config for game $cmd\n";
for ($i = 1; $i <= $GameCount; $i++)
{if ($cmd =~ /\b$GAMES{"Name$i"}\b/i)
{open FILE, ">".$GAMES{"DATAFILE$i"} || last;
$mode = $GAMES{"DATAFILE$i"};
last;
}
}
}
elsif
($cmd =~ /\s*?%ENDSET\b/)
{$mode = "";
open FILE,">$FlagDir$fReload";
close FILE;
}
elsif
($cmd =~ /\s*?%MESSAGE\b/)
{$cmdline = Trims($');
$mess = "Message from GAMEMASTER !\n";
}
elsif
($cmd =~ /\s*?%ENDMESSAGE\b/)
{unless (open FILE,">$TmpDir$OutUUE")
{$mess = "";
next;
};
print FILE $mess;
close FILE;
$outmgs .= "I sent your message for :\n";
unless ($cmdline)
{for ($gc = 1; $gc <= $GameCount; $gc++)
{for ($gr = 1; $gr <= 11; $gr++)
{$outmsg .= "- game $GAMES{\"Name$gc\"} race $gr;\n";
OutMail($gc,$gr);
}
}
}
else
{my @games = split(/\s+/,$cmdline);
foreach my $game (@games)
{$game =~ /(\w+)/i;
$gc = $1 || next;
$gr = $';
for ($i = 1; $i <= $GameCount; $i++)
{if ($gc =~ /\b$GAMES{"Name$i"}\b/i)
{unless ($gr =~ /\d+/)
{for ($gr = 1; $gr <= 11; $gr++)
{$outmsg .= "- game $GAMES{\"Name$i\"} race $gr;\n";
OutMail($i,$gr)
}
}
else {pos $gr = 0;
while ($gr =~ /(\d+)/g)
{$outmsg .= "- game $GAMES{\"Name$i\"} race $1;\n";
OutMail($i,$1)
}
}
last;
}
}
}
}
}
elsif
($cmd =~ /\s*?ADDRESS\b.*?[-=]{0,1}(.*)/)
{open FILE, ">>$CfgFileName";
$cmd = Trims($1);
$outmsg .= "Add new address : $1\n";
print FILE "GMCOPYTO = ".$1."\n";
close FILE;
open FILE,">$FlagDir$fReload";
close FILE;
}
elsif
($cmd =~ /\s*?%HELP\b/)
{$outmsg .= "Å«ññÑনóáεΓß∩ ß½ÑñπεΘ¿Ñ ¬«¼á¡ñδ\n".
"%HELP - »«ß½áΓ∞ »«¼«Θ∞\n".
"%STATUS [gname1 .. gnameX] - ßΓáΓπß ¿úα (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
"%RUN [gname1 .. gnameX] - ºá»πßΓ¿Γ∞ ¿úαδ (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
"%SLEEP [gname1 .. gnameX] - ß½¿» ¿úαδ (¿¼Ñ¡á τÑαѺ »α«íѽδ)\n".
"%GETCFG gname - »«½πτ¿Γ∞ ¬«¡Σ¿ú ¿úαδ («ñ¡«⌐ !)\n".
"%SETCFG gname - πßΓá¡«ó¿Γ∞ ¬«¡Σ¿ú ¿úαδ («ñ¡«⌐ !)\n".
"%ENDSET - ¬«¡Ñµ «»¿ßá½«ó¬¿ ¡«ó«ú« ¬«¡Σ¿úá\n".
"%MESSAGE [gname1 .. gnameX]- »«ß½áΓ∞ ß««íΘÑ¡¿Ñ ¿úα«¬á¼ (¿¼Ñ¡á τÑαѺ »α«íѽδ !)\n".
"%ENDMESSAGE - ¬«¡Ñµ ß««íΘÑ¡¿∩\n".
"%ADDRESS = newaddress - ñ«íáó¿Γ∞ ñ«»«½¡¿Γѽ∞¡δ⌐ áñαÑß αáßß佬¿ âî\n";
}
elsif
($mode)
{print FILE "$cmd\n";
}
elsif
($mess)
{$mess .= "$cmd\n";
}
};
MessageToGM($outmsg);
open FILE, ">$TmpDir$OutUUE";
binmode FILE;
syswrite FILE,$outmsg,length $outmsg;
close FILE;
OutMail(0,0);
if (-e $FlagDir.$fReload)
{LoadConfig()
};
}
sub OutMsg
{ my ($file) = @_;
my ($filename,$GNum,$RNum);
my (@Races,@Games) = ();
$filesize = -s $file || return 0;
open(MAILFILE,"$file") || return 0;
read(MAILFILE,$buf,$filesize) || return 0;
close(MAILFILE);
$filesize -= $filesize > 190 ? 190 : $filesize;
my ($From,$To,$Subj,$temp,$let) = unpack("A36 A36 A72 A46 a$filesize", $buf);
$From = Trims($From); $To = Trims($To); $Subj = Trims($Subj);
return 0 unless ($From =~ /\bGM\b/i || $From =~ /\bGAMEMASTER\b/i);
my $FromFIDO = unpack("s",substr($temp,28,2)).
"/".
unpack("s",substr($temp,24,2));
if ($let =~ /\bFMPT.*?(\d+)/i) {$FromFIDO .= ".$1"};
return 0 unless ($IncomeFIDO =~ /\b$FromFIDO\b/i);
printlog ("[FROM GM] Found message from gamemaster...\n",1);
if ($To =~ /\bALL\b/i)
{@Races = (1..11)}
else
{pos $To = 0;
while ($To =~ /(\d+)/g) {push (@Races, $1)};
};
return 0 unless (@Races);
if ($Subj =~ /\bALL\b/i)
{@GAMES = (1..$GameCount)}
else
{pos $Subj = 0;
while ($Subj =~ /(\w+)/g)
{$RNum = $1;
for ($GNum = 1; $GNum <= $GameCount; $GNum++)
{if ($GAMES{"Name$GNum"} =~ /\b$RNum\b/)
{push (@Games,$GNum); last};
};
};
};
return 0 unless (@Games);
$let =~ s/(\x01.*?\x0D)//g;
open FILE, ">$TmpDir$OutUUE" || return 0;
binmode FILE;
syswrite FILE,$let,length $let;
close FILE;
foreach $GNum (@Games)
{ foreach $RNum (@Races)
{OutMail($GNum,$RNum,0)}
};
unlink $file;
}
#»α«óÑα¬á ó὿ñ¡«ßΓ¿ Σá⌐½á »« ¿¼Ñ¡¿
#»«½πτáÑΓ : ¿¼∩ Σá⌐½á
#ó«ºóαáΘáÑΓ : ¼áßß¿ó - ì« ¿úαδ, ì« αáßδ ¿½¿ »πßΓ«⌐
sub ValidFName
{ my ($file) = @_;
my ($CRace,$Race,$c) = 0;
my ($i);
for ($i = 1; $i <= $GameCount; $i++)
{ $GameName = $GAMES{"Name$i"};
$SName = "player";
substr($SName,0,length $GameName) = $GameName;
if ( $file =~ /$SName([0-9a-fA-F]{1,2})\.(tr[a-z0-9]|vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9])/i )
{ $CRace = $1; $Race = 0;
if ($CRace =~ /[a-fA-F]/)
{pos $CRace = 0;
while ($CRace =~ /(.)/g)
{$Race = ($Race << 4) + ord($1) - (ord($1) > 57 ? 55 : 48)}
}
else
{$Race = $CRace};
if ($Race > 0 || $Race < 12) {return ($i,$Race)};
};
if ( ($GameName >= 10) && ($GameName <= 32) )
{ $GameName = chr ($GameName + 55);
$SName = "player";
substr($SName,0,length $GameName) = $GameName;
if ( $file =~ /$SName([0-9a-fA-F]{1,2})\.(tr[a-z0-9]|vp[a-z0-9]|zi[a-z0-9]|ar[a-z0-9]|ra[a-z0-9]|lz[a-z0-9])/i )
{ $CRace = $1; $Race = 0;
if ($CRace =~ tr/a-fA-F/A-FA-F/)
{pos $CRace = 0;
while ($CRace =~ /(.)/g)
{$Race = ($Race << 4) + ord($1) - (ord($1) > 57 ? 55 : 48)}
}
else
{$Race = $CRace};
if ($Race > 0 || $Race < 12) {return ($i,$Race)};
};
};
}
return ();
};
$ArjHdr = "\x60\xEA\x00\x00";
$RarHdr = "Rar!";
$ZipHdr = "\x50\x4B\x03\x04";
$LzhHdr = "\x2D\x6C\x$68";
# αáºáασ¿ó¿απÑΓ Σá⌐½ ¿úαδ ¿ ºá»π߬áÑΓ ñ½∩ ñá½∞¡Ñ⌐ΦÑ⌐ «íαáí«Γ¬¿
# »«½πτáÑΓ : ¿¼∩ Σá⌐½á, ¬áΓὫú, <ì« ¿úαδ, ì« αáßδ,
# ¿ßσ«ñ¡δ⌐ Σá⌐½(ñ½∩ πñá½Ñ¡¿∩) ¿ Γ¿» Ñú« αáßΦ¿αÑ¡¿∩, πñá½∩Γ∞ Ñß½¿ Äè>
# ó«ºóαáΘáÑΓ : 1 ¿½¿ 0 (Σá⌐½ ¡Ñ ¡á⌐ñÑ¡)
sub DeArcFile
{ my ($file,$dir,$SGNum,$SRNum,$SourceFile,$SourceExt,$DeleteSource) = @_;
my ($Delete,$arc,$found) = 0;
@filesin = ();
$filesize = -s $file || return 0;
open (ARCFILE,"+<$file") || return 0;
read (ARCFILE,$arc,$filesize) || return 0;
close(ARCFILE);
$head = substr($arc,0,10);
$found= "";
pos $arc = 0;
while ($arc =~ /(\w+)\.(trn)/gci)
{$TrnFile = "$1.$2";
unless ($found =~ /$TrnFile\;/i)
{push (@filesin,$TrnFile); $found .= "$TrnFile;";
}
};
foreach $TrnFile (@filesin)
{
if (index($head,$ZipHdr) == 0)
{$command = $UnZipCommand;
}
elsif
(index($head,$RarHdr) == 0)
{$command = $UnRarCommand;
}
elsif
(index($head,$ArjHdr) == 0)
{$command = $UnArjCommand;
}
elsif
(index($head,$LzhHdr) == 2)
{$command = $UnLzhCommand;
}
else
{next;
}
$command =~ s/%ArcFile/$file/i;
$command =~ s/%DirName/$dir/i;
$command =~ s/%ExtFile/$FileName/i;
$command = ChngSlash($command);
printlog("Run command : $command \n",1) if $FullLog;
system("$command");
($CGNum,$CRNum) = ValidFName($file);
($TGNum,$TRNum) = ValidFName($TrnFile);
$GNum = $TGNum ? $TGNum : $CGNum ? $CGNum : $SGNum;
$RNum = $TRNum ? $TRNum : $CRNum ? $CRNum : $SRNum;
if ($GNum && $RNum)
{DoFile($TmpDir,$TrnFile,$GNum,$RNum,$SourceFile,$SourceExt,$DeleteSource)}
else
{$FName = MakeOutExt($HostMsgs,$file,"VPF");
open ARCFILE,">$FName";
binmode ARCFILE;
syswrite ARCFILE,$arc,length $arc;
close ARCFILE;
MessageToGM("/*WARNING*/\nFound _unknown_archive_ $file.\nMoved to $FName.\n");
};
printlog("[Delete] $TmpDir$TrnFile\n",1) if $FullLog;
unlink $TmpDir.$TrnFile;
};
return 1;
};
#áασ¿ó¿απÑΓ Σá⌐½δ
# »«½πτáÑΓ : Γ¿» áασ¿óáΓ«αá, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á, ß»¿ß«¬ ΣὫó
# ó«ºóαáΘáÑΓ : 1 ¿½¿ 0 (¡Ñ π¬áºá¡ Γ¿» áασ¿óáΓ«αá)
sub ArcFile
{ my ($arctype,$outfile,@infiles) = @_;
unlink $outfile;
if ($arctype eq 'zip')
{$command = $ZipCommand;
}
elsif
($arctype eq 'rar')
{$command = $RarCommand;
}
elsif
(arctype eq 'arj')
{$command = $ArjCommand;
}
elsif
(arctype eq 'lzh')
{$command = $LzhCommand;
}
else
{return 0;
};
$command =~ s/%ArcName/$outfile/i;
$command =~ s/%ArcFiles/@infiles/i;
$command = ChngSlash($command);
printlog("Run command : $command \n",1) if $FullLog;
system("$command");
return 1;
};
#ºáππετ¿óáÑΓ Σá⌐½δ
# »«½πτáÑΓ : ¿¼∩ óσ«ñ¡«ú« Σá⌐½á, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á
# ó«ºóαáΘáÑΓ : ¡¿τÑú«
sub UUEFile
{ my ($infile,$outfile) = @_;
my ($local) = "";
if ($InternalCoder)
{$local = uuencode($infile,$outfile,644);
printlog("[Int EnUUE] Succesfully coding $infile -> $outfile\n",1) if ($local && $FullLog);
};
return if $local;
$command = $UUECommand;
$command =~s/%BINFile/$infile/i;
$command =~s/%UUEFile/$outfile/i;
$command = ChngSlash($command);
printlog("Run UUE $command\n",1) if $FullLog;
system("$command");
};
#ñÑππετ¿Γ Σá⌐½δ
# »«½πτáÑΓ : ¿¼∩ óσ«ñ¡«ú« Σá⌐½á, ¿¼∩ óδσ«ñ¡«ú« Σá⌐½á
# ó«ºóαáΘáÑΓ : ¡¿τÑú«
sub DeUUEFile
{ my ($ifile,$ofile) = @_;
my ($local) = "";
if ($InternalCoder)
{$local = uudecode($ifile,$ofile);
if ($local)
{printlog("[Int DeUUE] Succesfully decode $local\n",1) if $FullLog}
else
{printlog("[Int DeUUE] Error...\n",1) if $FullLog;
}
}
return if $local;
$command = $DeUUECommand;
$command =~s/%UUEFile/$ifile/i;
$command =~s/%OutFile/$ofile/i;
$command = ChngSlash($command);
printlog("Run DeUUE $command\n",1) if $FullLog;
system("$command");
};
#«íαáí«Γ¬á αá߻ᬫóá¡¡«ú« Γα¡-Σá⌐½á ¿ Ñú« »α«óÑα¬á
# »«½πτáÑΓ : ¿¼∩ ¬áΓὫúá, ¿¼∩ Σá⌐½á, ì« ¿úαδ, ì« αáßδ,
# ¿¼∩ Σá⌐½á ñ½∩ πñá½Ñ¡¿∩, Γ¿» Ñú« αáßΦ¿αÑ¡¿∩, πñá½∩Γ∞ Ñß½¿ Äè
# Σ«α¼¿απÑΓ ß««íΘÑ¡¿∩ ¿ú᫬π
# ó«ºóαáΘáÑΓ : ¡¿τÑú«
sub DoFile
{my ($dir,$file,$GameNum,$RaceNum,$SourceFile,$SourceExt,$DeleteSource) = @_;
my ($buf,$FName);
if (CheckTurn($dir.$file,$GAMES{"Dir$GameNum"}))
{printlog("[+] File found for game $GameNum race $RaceNum\n") if $FullLog;
$FName = $file;
substr($FName,0,6) = "player";
$FName =~s/\.(.{0,3})/\.trn/;
open FILE,$dir.$file;
binmode FILE;
read (FILE,$buf,-s $dir.$file);
close FILE;
open FILE,">$GAMES{\"Dir$GameNum\"}$FName";
binmode FILE;
syswrite FILE,$buf,length $buf;
close FILE;
SentRRC($GameNum,$RaceNum);
$FName = $BackupDir.sprintf("gm-%s.z%02x",$GAMES{"Name$GameNum"},$GAMEINFO{"Turn"});
if ($BackupDir)
{ArcFile('zip',$FName,($SourceFile));
};
#MessageToGM("/*WARNING*/\n".
# "I see _good_turn_ for game $GAMES{\"Name$GameNum\"} race $RaceNum.\n".
# ($BackupDir ? "It was backed up to $FName" : ""));
open FILE,">>receive.log";
print FILE localtime()." [RCV] Game ".$GAMES{"Name$GameNum"}." race $RaceNum...\n";
close FILE;
unlink $dir.$file;
unlink $SourceFile if $DeleteSource;
return 1;
}
else
{printlog("[-] File error for game $GameNum race $RaceNum\n") if $FullLog;
if ($HostMsgs && $SourceFile && $SourceExt)
{if ($SourceExt eq "EM" || $SourceExt eq "FM")
{$FName = MakeOutName($HostMsgs,".$SourceExt");
}
elsif
($SourceExt eq "VPF" || $SourceExt eq "TRN")
{$FName = MakeOutExt($HostMsgs,$SourceFile,$SourceExt);
}
else
{SentERROR($GameNum,$RaceNum);
return 0;
};
if (open(FILE,$SourceFile))
{binmode FILE;
read (FILE,$buf,-s $SourceFile);
close FILE;
open FILE,">$FName";
binmode FILE;
syswrite FILE,$buf,length $buf;
close FILE;
MessageToGM("/*WARNING*/\n".
"I found _bad_turn_ for game $GAMES{\"Name$GameNum\"} race $RaceNum.\n".
"It was move to file $FName");
}
else
{printlog("[Error] Cann't move bad file $SourceFile -> $FName : $!\n",1) if $FullLog;
}
};
SentERROR($GameNum,$RaceNum);
unlink $SourceFile if ($DeleteSource && $GameNum);
return 0;
};
};
sub FillTpl
{ my ($GNum,$RNum,$FName,$mode,$Next) = @_;
my ($MIMEFiles) = "";
my ($MIMEBuf) = "";
my ($UUEData) = "";
my ($sinc,$dinc) = "";
unlink $TmpDir.$OutUUE;
unlink $TmpDir.$OutMIME;
open IF,$FName || return 0;
$OutBuf = "";
$c = 1;
@packfiles = ();
$arctype = "zip";
$FName = "player.vpf";
$value = $GAMES{"Player$GNum.$RNum"};
if ($value =~ /arc.*?[=-]\s*?(\S+)/i)
{$arc = $1;
if ($arc =~ /rar/i)
{$arctype = 'rar'}
elsif
($arc =~ /lzh/i)
{$arctype = 'lzh'}
elsif
($arc =~ /arj/i)
{$arctype = 'arj'};
};
if ($value =~ /type.*?[=-]\s*?(\S+)/i)
{$arc = $1;
if ($arc =~ /game/i)
{substr($FName,0,length $GAMES{"Name$GNum"}) = $GAMES{"Name$GNum"};
};
if ($arc =~ /race/i)
{substr($FName,6,0) = $RNum;
};
if ($arc =~ /turn/i)
{$FName =~ s/vpf/sprintf("v%02x",$GAMEINFO{"Turn"})/ie};
};
while (<IF>)
{chomp;
$s = $_;
if ($s =~ /\;/) {$s = $`};
$s = Trims($s);
unless ($s) {next};
$UUEData = "";
$s =~s/%ThisGame/$GAMEINFO{"GameName"}/i;
$s =~s/%ThisRace/$RNum/i;
$s =~s/%ThisTurn/$GAMEINFO{"Turn"}/i;
$s =~s/%ThisTime/$GAMEINFO{"TimeStamp"}/i;
$s =~s/%ThisWeig/$GAMEINFO{"Weight"}/i;
$s =~s/%ThisSumm/$GAMEINFO{"Summ"}/i;
$s =~s/%ThisPres/$GAMEINFO{"Present"}/i;
$s =~s/%ThisNeed/$GAMEINFO{"Need"}/i;
$s =~s/%NextTurn/$Next/i;
#»«¼ÑßΓ¿¼ ñó«¿τ¡δÑ Σá⌐½δ
if ($s =~ /%BinFile.*?\=(.*)/i)
{$pre = $`;
$post = $';
$filename = $1;
$mintrn = 0;
$maxtrn = 10000;
$onlyrace = 0;
$arcit = 0;
if ($filename =~ /\<.*?(\d+)/i)
{$filename = $`.$';
$maxtrn = $1-1;
};
if ($filename =~ /\>.*?(\d+)/i)
{$filename = $`.$';
$mintrn = $1+1;
};
if ($filename =~ /(\d+)\.\.(\d+)/i)
{$filename = $`.$';
$mintrn = $1;
$maxtrn = $2;
};
if ($filename =~ /([\-\\\/\ ]ArcIt)/i)
{$filename = $`.$';
$arcit = 1;
};
if ($filename =~ /[\-\\\/\ ]Race\s*?=\s*?(\w+)/i)
{$filename = $`.$';
$onlyrace = $1;
};
$filename = Trims($filename);
$filename =~ s/%RaceNum/$RNum/i;
$filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
if (($GAMEINFO{"Turn"} >= $mintrn) &&
($GAMEINFO{"Turn"} <= $maxtrn) &&
(($onlyrace == 0) || ($onlyrace == $RNum)))
{if ($arcit)
{push(@packfiles,$filename);
}
else
{UUEFile($filename,$TmpDir.$OutUUE);
$UUEData = '';
open OF,"$TmpDir$OutUUE";
while (<OF>) {$UUEData .= $_};
close OF;
if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
{$MIMEFiles .= "$filename;"};
unlink $TmpDir.$OutUUE;
}
};
$s = $pre.$post;
};
#»«¼ÑßΓ¿¼ ΓѬßΓ«óδÑ Σá⌐½δ
if ($s =~ /%TxtFile.*?\=(.*)/i)
{$pre = $`;
$post = $';
$filename = $1;
$mintrn = 0;
$maxtrn = 10000;
$onlyrace = 0;
if ($filename =~ /\<.*?(\d+)/i)
{$filename = $`.$';
$maxtrn = $1-1;
};
if ($filename =~ /\>.*?(\d+)/i)
{$filename = $`.$';
$mintrn = $1+1;
};
if ($filename =~ /(\d+)\.\.(\d+)/i)
{$filename = $`.$';
$mintrn = $1;
$maxtrn = $2;
};
if ($filename =~ /\-|\\Race[\x08\x20]*?=[\x08\x20](\w+)/i)
{$filename = $`.$';
$onlyrace = $1;
};
$filename = Trims($filename);
$filename =~ s/%RaceNum/$RNum/i;
$filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
if (($GAMEINFO{"Turn"} >= $mintrn) &&
($GAMEINFO{"Turn"} <= $maxtrn) &&
(($onlyrace == 0) || ($onlyrace == $RNum)))
{
open (OF,"$filename");
while(<OF>) {$pre .= $_};
close(OF);
};
$s = $pre.$post;
};
$MIMEBuf.= "$s\n";
$OutBuf .= "$s$UUEData\n";
};
#«íαáí«Γ¬á INCLUDE Σá⌐½«ó
$sinc = $GAMES{"Include$GNum"};
$dinc = "";
while ($sinc =~ /\[(.*?)\]/)
{$s = $1;
$sinc = $';
$UUEData = "";
$s =~ s/\+\s*?(\d+)/($GAMEINFO{"Turn"})."..".($GAMEINFO{"Turn"}+$1)/e;
$dinc .= "[$s]";
if ($s =~ s/mode.*?[-=]\s*?(\S+)//i)
{$pre = $1;
next unless ($pre =~ /$mode/i);
};
#»«¼ÑßΓ¿¼ ñó«¿τ¡δÑ Σá⌐½δ
if ($s =~ /%BinFile(.*)/i)
{$filename = $1;
$s = "";
$mintrn = 0;
$maxtrn = 10000;
$onlyrace = 0;
$arcit = 0;
if ($filename =~ /\<.*?(\d+)/i)
{$filename = $`.$';
$maxtrn = $1-1;
};
if ($filename =~ /\>.*?(\d+)/i)
{$filename = $`.$';
$mintrn = $1+1;
};
if ($filename =~ /(\d+)\.\.(\d+)/i)
{$filename = $`.$';
$mintrn = $1;
$maxtrn = $2;
};
if ($filename =~ /([\-\\\/\ ]ArcIt)/i)
{$filename = $`.$';
$arcit = 1;
};
if ($filename =~ /[\-\\\/\ ]Race\s*?=\s*?(\w+)/i)
{$filename = $`.$';
$onlyrace = $1;
};
$filename = Trims($filename);
$filename =~ s/%RaceNum/$RNum/i;
$filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
if (($GAMEINFO{"Turn"} >= $mintrn) &&
($GAMEINFO{"Turn"} <= $maxtrn) &&
(($onlyrace == 0) || ($onlyrace == $RNum)))
{if ($arcit)
{push(@packfiles,$filename)
}
else
{UUEFile($filename,$TmpDir.$OutUUE);
$UUEData = '';
open OF,"$TmpDir$OutUUE";
while (<OF>) {$UUEData .= $_};
close OF;
if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
{$MIMEFiles .= "$filename;"};
unlink $TmpDir.$OutUUE;
}
};
};
#»«¼ÑßΓ¿¼ ΓѬßΓ«óδÑ Σá⌐½δ
if ($s =~ /%TxtFile(.*)/i)
{$filename = $1;
$s = "";
$mintrn = 0;
$maxtrn = 10000;
$onlyrace = 0;
if ($filename =~ /\<.*?(\d+)/i)
{$filename = $`.$';
$maxtrn = $1-1;
};
if ($filename =~ /\>.*?(\d+)/i)
{$filename = $`.$';
$mintrn = $1+1;
};
if ($filename =~ /(\d+)\.\.(\d+)/i)
{$filename = $`.$';
$mintrn = $1;
$maxtrn = $2;
};
if ($filename =~ /\-|\\Race[\x08\x20]*?=[\x08\x20](\w+)/i)
{$filename = $`.$';
$onlyrace = $1;
};
$filename = Trims($filename);
$filename =~ s/%RaceNum/$RNum/i;
$filename =~ s/%HostDir/$GAMES{"Dir$GNum"}/i;
if (($GAMEINFO{"Turn"} >= $mintrn) &&
($GAMEINFO{"Turn"} <= $maxtrn) &&
(($onlyrace == 0) || ($onlyrace == $RNum)))
{
open (OF,"$filename");
while(<OF>) {$s .= $_};
close(OF);
};
};
$MIMEBuf.= "$s\n";
$OutBuf .= "$s$UUEData\n";
};
if ($dinc) {$GAMES{"Include$GNum"} = $dinc}
else {delete $GAMES{"Include$GNum"}};
$MIMEBuf .= "MIMEFiles=$MIMEFiles\n" if $MIMEFiles;
$body = "";
if ($#packfiles >= 0)
{ArcFile("zip",$TmpDir.$FName,@packfiles);
UUEFile($TmpDir.$FName,$TmpDir.$OutUUE);
if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
{open OF,"$TmpDir$FName";
binmode OF;
read (OF,$body,-s $TmpDir.$FName);
close OF;
$MIMEBuf .="MIMEDataStart=$FName\n".$body."MIMEDataEnd\n";
};
open OF,"$TmpDir$OutUUE";
binmode OF;
read (OF,$body,-s $TmpDir.$OutUUE);
close OF;
unlink $TmpDir.$OutUUE;
unlink $TmpDir.$FName;
};
if ($GAMES{"Player$GNum.$RNum"} =~ /\bMIME\b/i)
{open OF,">$TmpDir$OutMIME";
binmode OF;
syswrite OF,$MIMEBuf,length $MIMEBuf;
close OF;
};
open OF,">$TmpDir$OutUUE";
binmode OF;
syswrite OF,"$OutBuf\n$body",length "$OutBuf\n$body";
close OF;
return 1;
}
#Σ«α¼¿απÑΓ Σá⌐½ «Φ¿í¬¿ »α¿Ñ¼á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
sub FillErrorTpl
{ my ($GNum,$RNum) = @_;
if (-s $GAMES{"ErrorTpl$GNum"})
{unless (FillTpl($GNum,$RNum,$GAMES{"ErrorTpl$GNum"},"err")) {return 0}}
else
{unless (FillTpl($GNum,$RNum,$WorkDir.$ErrorTplName,"err")) {return 0}};
return 1;
};
#Σ«α¼¿απÑΓ Σá⌐½ »«ñΓóÑαªñÑ¡¿∩ »α¿Ñ¼á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
sub FillRRCTpl
{ my ($GNum,$RNum) = @_;
if (-s $GAMES{"RRCTpl$GNum"})
{unless (FillTpl($GNum,$RNum,$GAMES{"RRCTpl$GNum"},"rrc")) {return 0}}
else
{unless (FillTpl($GNum,$RNum,$WorkDir.$RRCTplName,"rrc")) {return 0}};
return 1;
};
#Σ«α¼¿απÑΓ Σá⌐½ «ª¿ñá¡¿∩ ºá»π߬á ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
sub FillSleepTpl
{ my ($GNum,$RNum,$Next) = @_;
if (-s $GAMES{"SleepTpl$GNum"})
{unless (FillTpl($GNum,$RNum,$GAMES{"SleepTpl$GNum"},"sl",$Next)) {return 0}}
else
{unless (FillTpl($GNum,$RNum,$WorkDir.$SleepTplName,"sl",$Next)) {return 0}};
return 1;
};
#Σ«α¼¿απÑΓ Σá⌐½ «Γß佬¿ σ«ñá ñ½∩ ¿úαδ/αáßδ ¿º Φáí½«¡á
sub FillSentTpl
{ my ($GNum,$RNum) = @_;
if (-s $GAMES{"SentTpl$GNum"})
{unless (FillTpl($GNum,$RNum,$GAMES{"SentTpl$GNum"},"se")) {return 0}}
else
{unless (FillTpl($GNum,$RNum,$WorkDir.$SentTplName,"se")) {return 0}};
return 1;
};
#»«ßδ½áÑΓ Σá⌐½ »¿ß∞¼á ñ½∩ ¿úαδ/αáßδ »« öêäÄ/àîÑ⌐½π
sub OutMail
{ my ($GNum,$RNum,$UseMime) = @_;
my ($file) = "";
@Month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
$value = $GAMES{"Player$GNum.$RNum"};
if ($value)
{while ($value =~ /\[(.*?)\]/i)
{$value = $';
$mdata = $1;
if ($mdata =~ /EMail/i)
{$from = "From: $HostNameFrom <$EMailAddress>\n";
$mdata =~ /([^\;^\ ^\,^\=]*?@[^\;^\ ^\,^\n]*)/i;
$to = "To: ".Trims($1." ")."\n";
$subj = "Subj: GAME $GAMES{\"Name$GNum\"} RACE $RNum\n";
$head = $from.$to.$subj;
if ($mdata =~ /\bMIME\b/i && $UseMime)
{$file = $TmpDir.$OutMIME}
else
{$file = $TmpDir.$OutUUE};
$filename = MakeOutName($OutEMailDir,".out");
open FILE,$file || return 0;
binmode FILE;
read (FILE,$body,-s $file);
close FILE;
$body = ConvertFromAlt($body,'koi');
open FILE,">$filename" || return 0;
binmode FILE;
syswrite FILE,"$head"."InsertFile\n"."$body",length "$head"."InsertFile\n"."$body";
close FILE;
}
else
{$file = $TmpDir.$OutUUE;
$from = $HostNameFrom;
$FidoAddress =~ /(\d+)\/(\d+)/;
$fromnode = $2; $fromnet = $1; $fmpt = "";
if ($FidoAddress =~ /\.(\d+)/i)
{$fmpt = $1;
};
$mdata =~ /\"(.*?)\"/i;
$to = $1;
$mdata =~ /(\d+)\/(\d+)/;
$tonode = $2; $tonet = $1; $topt = "";
if ($mdata =~ /(\d+)\/(\d+)\.(\d+)/) {$topt = $3};
$MailMask = 0x0181;
if ($mdata =~ /attr.*?[=-](.*)/i)
{$attr = $1;
# 1 Crash
# 2 Message read
# 3 Message sent
# 4 File-attach
# 5 Forwarded
# 6 Orphan
# 7 Kill/sent
# 8 Local message
# 9 Hold
# 10 ???
# 11 File-request
# 12 Return-receipt requested
# 13 Return-receipt
# 14 Audit-trail requested
if ($attr =~ /Crash/i)
{$MailMask |= 0x0001};
if ($attr =~ /Hold/i)
{$MailMask |= 0x0100};
if ($attr =~ /RRC/i)
{$MailMask |= 0x0800};
if ($attr =~ /RRQ/i)
{$MailMask |= 0x1000};
};
@timeis = localtime;
$time = sprintf("%02d %03s %02d %02d:%02d:%02d\x00",
$timeis[3],$Month[$timeis[4]],$timeis[5],
$timeis[2],$timeis[1],$timeis[0]);
$head = pack("a36 a36 a72 a20 c c c c c c c c c c c c L L c c c c c c",
$from, $to,
"GAME ".$GAMES{"Name$GNum"}." RACE ".$RNum,
$time,
0,0,$tonode & 0xFF,$tonode >> 8,$fromnode & 0xFF,$fromnode >> 8,
0,0,$fromnet & 0xFF, $fromnet >> 8,$tonet & 0xFF,$tonet >> 8,
time,0,0,0,$MailMask & 0xFF,$MailMask >> 8,0,0);
open FILE,$file || return 0;
my @lines = ();
while (<FILE>) {push (@lines,$_)};
close FILE;
$UUELines = -1;
$MultiSec = -1;
while ($#lines >= 0)
{
$filename = MakeOutName($OutMsgDir,".msg");
printlog("[OUT] Create message $filename\n",1) if $FullLog;
open FILE,"> $filename\0" || return 0;
binmode FILE;
printf FILE "%s",$head;
if ($fmpt) {printf FILE "%c%s%i%c",0x01,"FMPT ",$fmpt,0x0D};
if ($topt) {printf FILE "%c%s%i%c",0x01,"TOPT ",$topt,0x0D};
close FILE;
open FILE,">>$filename" || return 0;
$RestLines = $MaxMsgLines;
$PartChk = 0;
$PartLen = 0;
if ($UUELines >= 0)
{print FILE "section $SecNow of $MultiSec of file $UUEFile\n\n";
};
while (($RestLines) && ($#lines >= 0))
{my $line = shift(@lines);
if ($line =~ /\bUUELinesStart.*?\=.*?(\d+)\,(\S+)\,(\S+)/i)
{if ($RestLines <= 5)
{unshift(@lines,$line);
last;
};
$UUELines = $1;
$UUEFile = $2;
$UUEChk = $3;
$PartChk = 0;
$MultiSec = -1;
$SecNow = -1;
$RestLines++;
if ($UUELines > $RestLines)
{$MultiSec = ($UUELines - $RestLines);
$MultiSec = ($MultiSec/$MaxMsgLines) + ($MultiSec%$MaxMsgLines ? 2:1);
$SecNow = 1;
print FILE "section $SecNow of $MultiSec of file $UUEFile\n\n";
next;
};
print FILE "section 1 of file $UUEFile\n\n";
next;
};
if (($line =~ /\bend\b/i) && ($UUELines >= 0))
{print FILE "end\n";
#! print FILE "sum -r/size $PartChk/$PartLen section (from ".($SecNow == 1 ? '"begin"' : 'first encoded line').
#! " to ".($SecNow == $MultiSec ? '"end"' : 'last encoded line').")\n";
unless ($SecNow < $MultiSec)
{#! print FILE "sum -r/size $UUEChk entire input file\n";
}
$UUELines = -1;
$MultiSec = -1;
next;
};
#! if ($UUELines >= 0)
#! {$PartChk = CalcChkSumm($line."\0x10",$PartChk);
#! $PartLen += (length $line) + 1;
#! };
print FILE $line;
$RestLines--;
};
if ($UUELines >= 0)
{#! print FILE "sum -r/size $PartChk/$PartLen section (from ".($SecNow == 1 ? '"begin"' : 'first encoded line').
#! " to ".($SecNow == $MultiSec ? '"end"' : 'last encoded line').")\n"
print FILE "\n * Message split, to be continued *\n";
};
$SecNow++ if ($MultiSec >= 0);
print FILE "\n$tearline";
close FILE;
}
}
}
}
};
sub MessageToGM
{ my ($body) = @_;
$from = $HostNameFrom;
$FidoAddress =~ /(\d+)\/(\d+)/;
$fromnode = $2; $fromnet = $1; $fmpt = "";
if ($FidoAddress =~ /\.(\d+)/i)
{$fmpt = $1;
};
$to = "Gamemaster of $HostNameFrom";
$MailMask = 0x0101;
@timeis = localtime;
$time = sprintf("%02d %03s %02d %02d:%02d:%02d\x00",
$timeis[3],$Month[$timeis[4]],$timeis[5],
$timeis[2],$timeis[1],$timeis[0]);
$head = pack("a36 a36 a72 a20 c c c c c c c c c c c c L L c c c c c c",
$from, $to,
"Message to Gamemaster",
$time,
0,0,$fromnode & 0xFF,$fromnode >> 8,$fromnode & 0xFF,$fromnode >> 8,
0,0,$fromnet & 0xFF, $fromnet >> 8,$fromnet & 0xFF,$fromnet >> 8,
time,0,0,0,$MailMask & 0xFF,$MailMask >> 8,0,0);
$filename = MakeOutName($HostMsgs,".msg");
printlog("[TO GM] Message save as $filename...\n",1) if $FullLog;
open FILE,"> $filename\0" || return 0;
binmode FILE;
printf FILE "%s",$head;
if ($fmpt) {printf FILE "%c%s%i%c",0x01,"FMPT ",$fmpt,0x0D};
if ($fmpt) {printf FILE "%c%s%i%c",0x01,"TOPT ",$fmpt,0x0D};
close FILE;
open FILE,">>$filename" || return 0;
print FILE "\n$body";
print FILE "\n$tearline";
close FILE;
}
sub SentRRC
{ my ($GNum,$RNum) = @_;
return 0 unless $GAMES{"Player$GNum.$RNum"};
TakeGameInfo($GNum,0);
return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
FillRRCTpl($GNum,$RNum);
OutMail($GNum,$RNum,1);
};
sub SentERROR
{ my ($GNum,$RNum) = @_;
return 0 unless $GAMES{"Player$GNum.$RNum"};
TakeGameInfo($GNum,0);
return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
FillErrorTpl($GNum,$RNum);
OutMail($GNum,$RNum,1);
};
sub SentSleep
{ my ($GNum,$RNum) = @_;
return 0 unless $GAMES{"Player$GNum.$RNum"};
TakeGameInfo($GNum,0);
return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
my $Next = CheckNextRun($GNum);
FillSleepTpl($GNum,$RNum,$Next);
OutMail($GNum,$RNum,1);
if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /-/)
{FillSentTpl($GNum,$RNum);
OutMail($GNum,$RNum,1);
}
};
sub SentTurn
{ my ($GNum,$RNum) = @_;
return 0 unless $GAMES{"Player$GNum.$RNum"};
TakeGameInfo($GNum,0);
return 0 if (substr($GAMEINFO{"Present"},$RNum-1,1) =~ /X/i);
FillSentTpl($GNum,$RNum);
OutMail($GNum,$RNum,1);
};
sub DoSleep
{ my ($GNum) = @_;
my ($i);
for ($i = 1; $i <= 11; $i++)
{SentSleep($GNum,$i);
}
MessageToGM(localtime()."\nI sent sleep message for game $GAMES{\"Name$GNum\"}\n");
};
sub RunGame
{ my ($GNum) = @_;
my ($OTrn) = @_;
my ($i);
$OTrn = $GAMEINFO{"Turn"};
$command = $GAMES{"Run$GNum"};
$command = ChngSlash($command);
printlog("[Run $GNum] Now perform command : $command\n") if $FullLog;
system($command);
TakeGameInfo($GNum,0);
return 0 if ($GAMEINFO{"Turn"} == $OTrn);
SaveParams($GNum, $GAMEINFO{"RunDay"} = GetCurDays(),
$GAMEINFO{"TimeOut"} = "");
for ($i = 1; $i <= 11; $i++)
{SentTurn($GNum,$i);
}
MessageToGM(localtime()."\nI run game $GAMES{\"Name$GNum\"}\nRun mode : $GAMEINFO{\"RunOption\"}");
};
sub CheckGame
{ my ($GNum) = @_;
TakeGameInfo($GNum,1);
my $HoursGo = GetCurDays()*24 + GetCurTime()/3600 -
$GAMEINFO{"CheckDay"}*24 - $GAMEINFO{"CheckTime"}/3600;
my $NewCheck = (($GAMEINFO{"CheckDay"}*24*60*60 + $GAMEINFO{"CheckTime"} <
$GAMEINFO{"CheckDay"}*24*60*60 + $GAMES{"Time$GNum"}) and
(GetCurDays()*24*60*60 + GetCurTime() >
$GAMEINFO{"CheckDay"}*24*60*60 + $GAMES{"Time$GNum"})) ? 1 : 0;
if ($NewCheck)
{open FILE,">$FlagDir$fStatus";
print FILE "$GNum\n";
close FILE;
SaveParams( $GNum, $GAMEINFO{"CheckWas"} = GetCurDays() );
};
if ($GAMEINFO{"External"} =~ /run/i)
#ºá»πΘÑ¡ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
{printlog ("[Run $GNum] èá¬πε-Γπ ¿¡ΣѬµ¿ε ßÑ⌐τáß Γδ ºá»πßΓ¿½ ...\n",1);
printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ RUN (GAMEMASTER) ...\n",1);
SaveParams($GNum, $GAMEINFO{"External"} = "Empty",
$GAMEINFO{"RunOption"} = "RunGameMaster");
RunGame($GNum);
}
elsif ($GAMEINFO{"External"} =~ /start/i)
#ºá»πΘÑ¡ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
{printlog ("[Run $GNum] èá¬πε-Γπ ¿¡ΣѬµ¿ε ßÑ⌐τáß Γδ ºá»πßΓ¿½ ...\n",1);
printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ START (NORMAL) ...\n",1);
SaveParams($GNum, $GAMEINFO{"External"} = "Empty",
$GAMEINFO{"RunOption"} = "RunNormal");
RunGame($GNum);
}
elsif
($GAMEINFO{"External"} =~ /sleep/i)
#ß½¿»¡πΓ º¼ÑѼ-úÑ⌐¼¼áßΓÑα«¼
{if ($GAMEINFO{"External"} =~ /=/)
{my $games = $';
while ($games =~ /(\d+)/gc) {SentSleep($GNum,$1)};
}
else
{DoSleep($GNum)};
printlog ("[Sleep $GNum] ò«ßΓ ß»¿Γ - »πßΓ∞ º¡áεΓ óßÑ ...\n",1);
$GAMEINFO{"External"} = "Empty";
}
elsif ($GAMEINFO{"AllTurns"})
#»α¿ßπΓßΓóπεΓ éæà Γα¡-¬¿
{printlog ("[Run $GNum] èᬠºñ«α«ó«, τΓ« óßÑ ¼δ ºñÑß∞ ßÑú«ñ¡∩ ß«íα὿ß∞ ...\n",1);
if ( ($GAMEINFO{"TimeOut"}) || #á) Ī¿ñá¡¿Ñ;
( (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /r/i) && #í) ê Γᬠíδ
($GAMEINFO{"RunDay"} != GetCurDays())) || # ºá»πßΓ¿½¿.
($GAMEINFO{"RunOption"} eq "RunImmediate") ) #ó) «ª¿ñ὿ 9¬π
{printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ NORMAL ...\n",1);
SaveParams( $GNum,
$GAMEINFO{"TimeOut"} = 0,
$GAMEINFO{"RunOption"} = "RunNormal" );
}
else
{printlog ("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ ALLPRESENT ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunByAll" );
}
RunGame($GNum);
}
elsif
($GAMEINFO{"TimeOut"})
#¡áσ«ñ¿¼ß∩ ó αѪ¿¼Ñ ÄåêäÇìêƒ
{if ($HoursGo > 0)
{printlog("[Check $GNum] Ī¿ñá¡¿Ñ ºá»π߬á...\n",1);
if ($GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} && $GAMEINFO{"AllNine"} && $NewCheck)
{printlog("[Run $GNum] ä«Γ∩¡π½ ¡á ºá»áß¡«¼, ßΓÑαóѵ ...\n",1);
printlog("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
RunGame($GNum);
}
elsif
($HoursGo >= $GAMEINFO{"TimeOut"})
{if ($GAMEINFO{"RunOption"} eq "RunTimeOut")
{DecWeights($GNum);
printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
};
printlog("[Run $GNum] ìÑ π߻ѽ¿, ¡Ñ π߻ѽ¿ ...\n",1);
printlog("[Run $GNum] çá»π߬ ó αѪ¿¼Ñ TIMEOUT ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunTimeOut" );
RunGame($GNum);
}
else
{SaveParams( $GNum, $GAMEINFO{"TimeOut"} -= $HoursGo );
printlog("[Wait $GNum] ... ¡« α«ó¡« τÑαѺ $GAMEINFO{'TimeOut'} τáß(á,«ó) «¡ »α«ß¡ÑΓß∩ ...\n",1);
DoSleep($GNum) if $NewCheck;
}
}
else
{return 0;
}
}
elsif
($NewCheck)
#¡áßΓπ»¿½« óαѼ∩ »α«óÑα¿Γ∞ Σ½áú¿
{printlog ("[Check $GNum] Åα¿Φ½á »«αá »α«óÑα¿Γ∞ ß«íδΓ¿Ñ ...\n",1);
if (substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /s/i)
{ DoSleep($GNum);
printlog("[Sleep $GNum] 滿¼, í½∩ ...\n",1);
}
elsif
(substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /c/i)
{ printlog("[Check $GNum] Å«ß¼«Γα¿¼, »«ß¼«Γα¿¼ ...\n",1);
if ( ($GAMEINFO{"RunOption"} eq "RunByAll") ||
($GAMEINFO{"RunOption"} eq "RunGameMaster") )
{printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
printlog("[Sleep $GNum] ÉѪ¿¼ ¿º¼Ñ¡Ñ¡ ¡á NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
DoSleep($GNum);
}
elsif
( $GAMEINFO{"RunOption"} eq "RunImmediate" )
{printlog("[Run $GNum] äá¡ »α¿¬áº Ѽπ ¡á ºá»π߬ ...\n",1);
printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
RunGame($GNum);
}
elsif
( $GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} )
{ unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
{DecWeights($GNum);
printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
};
if ($GAMEINFO{"AllNine"})
{printlog("[Run $GNum] òóáΓ¿½« óα«ñÑ ...\n",1);
printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
RunGame($GNum);
}
else
{printlog("[Sleep $GNum] Ç ó«Γ ñÑó∩Γ«¬-Γ« ¿ ¡Ñ σóáΓáÑΓ ...\n",1);
printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
DoSleep($GNum);
};
}
else
{ unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
{DecWeights($GNum);
printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
};
printlog("[Sleep $GNum] îá½áóáΓá íπñÑΓ ...\n",1);
if ($GAMES{"Wait$GNum"})
{SaveParams( $GNum, $GAMEINFO{"TimeOut"} = $GAMES{"Wait$GNum"} );
printlog("[Sleep $GNum] ... ¿ ó ºá»áßÑ π ¡Ñú«(¡¿σ) «ßΓὫß∞ $GAMEINFO{'TimeOut'} τáß(á,«ó) ...\n",1);
}
else
{SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
};
DoSleep($GNum);
};
}
elsif
(substr($GAMES{"Days$GNum"},GetCurDay(),1) =~ /r/i)
{printlog("[Check $GNum] Two beer or not two beer ...\n",1);
if ( ($GAMEINFO{"RunOption"} eq "RunByAll") ||
($GAMEINFO{"RunOption"} eq "RunGameMaster") )
{printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
printlog("[Sleep $GNum] ÉѪ¿¼ ¿º¼Ñ¡Ñ¡ ¡á NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
DoSleep($GNum);
}
elsif
( ($GAMEINFO{"RunOption"} eq "RunTimeOut") && ($GAMES{"Wait$GNum"} > 0) )
{printlog("[Sleep $GNum] Å«¬á »α«¡Ñß½«, á τΓ« ñá½∞ΦÑ ...\n",1);
printlog("[Sleep $GNum] æ½ÑñπεΘ¿⌐ ºá»π߬ ß«ßΓ«¿Γß∩ ó ½εíπε »«ú«ñπ ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunImmediate" );
DoSleep($GNum);
}
else
{unless ($GAMEINFO{"RunOption"} eq "RunTimeOut")
{DecWeights($GNum);
printlog("[Dec $GNum] èΓ« ¡Ñ ΓπΓ - π»á½, «Γªá½ß∩ ...\n",1);
};
printlog("[Run $GNum] Å«αá, íαáΓ, »«αá ...\n",1);
printlog("[Run $GNum] çá»π߬ »α«¿ºóÑñÑ¡ ó αѪ¿¼Ñ - NORMAL ...\n",1);
SaveParams( $GNum, $GAMEINFO{"RunOption"} = "RunNormal" );
RunGame($GNum);
};
};
};
$GAMEINFO{"CheckDay"} = GetCurDays();
$GAMEINFO{"CheckTime"} = GetCurTime();
SaveParams($GNum);
};
sub CheckNextRun
{ my ($GNum) = @_;
if ($GAMEINFO{"TimeOut"})
{$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ : ".AddTime(0,$GAMEINFO{"TimeOut"}*3600,$GNum);
}
elsif
( !($GAMES{"Days$GNum"} =~ /c|r/i) ||
!($GAMES{"Run$GNum"}) )
{$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ : »« »α¿σ«ñπ óßÑσ Γα¡ ¿½¿\n".
" ¿úαá íπñÑΓ ºá»πΘÑ¡á óαπτ¡πε âî.";
}
else
{$AddDays = $GAMEINFO{"CheckWas"} == GetCurDays() ? 1 : 0;
$DayValue = (GetCurDay() + $AddDays) % 7;
$AddTime = 0;
$FirstPoint = -1;
$RunOption = $GAMEINFO{"RunOption"};
while ($AddDays <= 14)
{if (substr($GAMES{"Days$GNum"},$DayValue,1) =~ /s/i)
{$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
}
elsif
(substr($GAMES{"Days$GNum"},$DayValue,1) =~ /c/i)
{if ( $RunOption eq "RunByAll" ||
$RunOption eq "RunGameMaster" )
{$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
$RunOption = "RunNormal";
}
elsif
( $RunOption eq "RunImmediate" )
{ last;
}
elsif
( $GAMEINFO{"Summ"} >= $GAMEINFO{"Need"} )
{ if ($GAMEINFO{"AllNine"})
{ last;
}
else
{ $FirstPoint = $AddDays;
$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
$RunOption = "RunImmediate";
};
}
else
{ if ($GAMES{"Wait$GNum"})
{$FirstPoint = $AddDays;
$AddTime = $GAMES{"Wait$GNum"};
last;
}
else
{$FirstPoint = $AddDays;
$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
$RunOption = "RunImmediate";
}
};
}
elsif
(substr($GAMES{"Days$GNum"},$DayValue,1) =~ /r/i)
{if ( $RunOption eq "RunByAll" ||
$RunOption eq "RunGameMaster" )
{$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
$RunOption = "RunNormal";
}
elsif
( ($RunOption eq "RunTimeOut") && ($GAMES{"Wait$GNum"} > 0) )
{$FirstPoint = $AddDays;
$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
$RunOption = "RunImmediate";
}
else
{last;
};
}
else
{$AddDays++; $DayValue = $DayValue == 6 ? 0 : $DayValue+1;
}
};
if ($AddDays > 14)
{$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ : »« »α¿σ«ñπ óßÑσ Γα¡ ¿½¿\n".
" ¿úαá íπñÑΓ ºá»πΘÑ¡á óαπτ¡πε âî.";
}
else
{if ($FirstPoint >= 0)
{$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :\n".
" - »α¿ ñ«ßΓ¿ªÑ¡¿¿ óÑßá ".AddTime($FirstPoint,0,$GNum)."\n".
" - íѺπß½«ó¡« ".AddTime($AddDays,$AddTime*3600,$GNum);
}
else
{$NextRun = "æ½ÑñπεΘ¿⌐ ºá»π߬ :\n".
" - íѺπß½«ó¡« ".AddTime($AddDays,$AddTime*3600,$GNum);
};
}
};
printlog("[NEXT $GNum] $NextRun\n",1) if $FullLog;
return $NextRun;
};
sub AddTime
{my ($adays,$atime,$GNum) = @_;
$mytime = (GetCurDays() + $adays)*24*60*60 + $GAMES{"Time$GNum"} + $atime;
$timestring = localtime($mytime);
$timestring =~s/sun/é߬/i;
$timestring =~s/mon/Å«¡/i;
$timestring =~s/tue/éΓ«/i;
$timestring =~s/wed/æαÑ/i;
$timestring =~s/thi/ùÑΓ/i;
$timestring =~s/fri/Å∩Γ/i;
$timestring =~s/sat/æπí/i;
return $timestring;
};
sub GetCurDays
{return time / (60*60*24)
};
sub GetCurDay
{my (@realday) = (6,0,1,2,3,4,5);
my $thisday = (gmtime)[6];
return (@realday[$thisday]);
};
sub GetCurTime
{return time % (60*60*24)
};
sub DecWeights
{my ($GNum) = @_;
my ($i);
if ($Dec = $GAMES{"CheckDec$GNum"})
{for ($i = 1; $i <= 11; $i++)
{if ((substr($GAMEINFO{"Present"},$i-1,1) eq "-") &&
(substr($GAMEINFO{"Weight"},$i-1,1) > 0) &&
(substr($GAMEINFO{"Weight"},$i-1,1) < 9))
{$GAMEINFO{"Need"} -= $Dec > substr($GAMEINFO{"Weight"},$i-1,1) ? substr($GAMEINFO{"Weight"},$i-1,1) : $Dec;
substr($GAMEINFO{"Weight"},$i-1,1) -= $Dec > substr($GAMEINFO{"Weight"},$i-1,1) ? substr($GAMEINFO{"Weight"},$i-1,1) : $Dec;
}
}
}
SaveParams($GNum);
};
sub ReadParams
{ my ($GNum) = @_;
foreach $key (keys %GAMEINFO) {delete $GAMEINFO{$key}};
open GAMEPARAM,$WorkDir.$GamesDat || return 0;
while (<GAMEPARAM>)
{chomp;
if (/\bGAME\:$GAMES{"Name$GNum"}\:/i)
{($GAME,
$GAMEINFO{"GameName"},
$GAMEINFO{"Weight"},
$GAMEINFO{"Need"},
$GAMEINFO{"OriginalWts"},
$GAMEINFO{"OriginalWt"},
$GAMEINFO{"RunOption"},
$GAMEINFO{"CheckWas"},
$GAMEINFO{"CheckDay"},
$GAMEINFO{"CheckTime"},
$GAMEINFO{"RunDay"},
$GAMEINFO{"TimeOut"},
$GAMEINFO{"External"}) = split(/:/); last;}
}
close GAMEPARAM;
return 1;
};
sub SaveParams
{ my ($GNum) = @_;
my ($s);
unless (-s $WorkDir.$GamesDat)
{open (GAMEPARAM,">$WorkDir$GamesDat"); close GAMEPARAM};
open GAMEPARAM,"$WorkDir$GamesDat";
$s = join(":", ("GAME",
$GAMES{"Name$GNum"},
$GAMEINFO{"Weight"},
$GAMEINFO{"Need"},
$GAMEINFO{"OriginalWts"},
$GAMEINFO{"OriginalWt"},
$GAMEINFO{"RunOption"},
$GAMEINFO{"CheckWas"},
$GAMEINFO{"CheckDay"},
$GAMEINFO{"CheckTime"},
$GAMEINFO{"RunDay"},
$GAMEINFO{"TimeOut"},
$GAMEINFO{"External"}));
undef @lines;
while (<GAMEPARAM>)
{chomp;
if ((/\bGAME\:$GAMES{"Name$GNum"}\:/i) && $s)
{$_ = $s;
$s = "";
};
push(@lines,$_);
}
if ($s) {push(@lines,$s)};
open (GAMEPARAM,">$WorkDir$GamesDat");
foreach (@lines) {print GAMEPARAM "$_\n"};
close GAMEPARAM;
return 1;
};
sub TakeGameInfo
{ my ($GNum,$ShowLine) = @_;
my ($i);
my ($HexChars) = "123456789AB";
ReadParams($GNum);
$GAMEINFO{"AllTurns"} = "yes";
$GAMEINFO{"AllNine"} = "yes";
$GAMEINFO{"GameName"} = $GAMES{"Name$GNum"} unless ($GAMEINFO{"GameName"});
open (TRNFILE,$GAMES{"Dir$GNum"}."nextturn.hst");
read (TRNFILE,$buf,20);
close(TRNFILE);
($GAMEINFO{"TimeStamp"},$GAMEINFO{"Turn"}) = unpack("a18 c2",$buf);
$GAMEINFO{"Summ"} = 0;
$GAMEINFO{"Present"} = "";
$GAMEINFO{"Weight"} = $GAMES{"Weights$GNum"} unless ($GAMEINFO{"Weight"});
$GAMEINFO{"Need"} = $GAMES{"Weight$GNum"} unless ($GAMEINFO{"Need"});
unless ( ($GAMES{"Weights$GNum"} eq $GAMEINFO{"OriginalWts"}) &&
($GAMES{"Weight$GNum"} eq $GAMEINFO{"OriginalWt"}) )
{$GAMEINFO{"Need"} = $GAMES{"Weight$GNum"};
$GAMEINFO{"OriginalWt"} = $GAMES{"Weight$GNum"};
$GAMEINFO{"Weight"} = $GAMES{"Weights$GNum"};
$GAMEINFO{"OriginalWts"} = $GAMES{"Weights$GNum"};
};
$GAMEINFO{"RunOption"}= "RunNormal" unless ($GAMEINFO{"RunOption"});
for ($i = 1; $i <= 11; $i++)
{ $Wt = substr($GAMEINFO{"Weight"},$i-1,1);
if (($Wt ge "0") && ($Wt le "9"))
{if (CheckTurn($GAMES{"Dir$GNum"}."player$i.trn",$GAMES{"Dir$GNum"}))
{$GAMEINFO{"Summ"} += $Wt;
$GAMEINFO{"Present"} .= substr($HexChars,$i-1,1);
}
else
{unlink $GAMES{"Dir$GNum"}."player$i.trn";
$GAMEINFO{"Present"} .= "-";
$GAMEINFO{"AllTurns"} = "";
if ($Wt == 9)
{$GAMEINFO{"AllNine"} = ""};
}
}
else
{$GAMEINFO{"Present"} .= "x";
};
};
printlog(sprintf("GAME %4s [%3d vs %3d] found <%11s from %11s>\n",
$GAMES{"Name$GNum"},
$GAMEINFO{"Summ"},
$GAMEINFO{"Need"},
$GAMEINFO{"Present"},
$GAMEINFO{"Weight"})) if $ShowLine;
};
sub CheckTurn
{ my ($trnfile,$hostdir) = @_;
($filesize = -s $trnfile) || return 0;
open(TRNFILE,"$trnfile") || return 0;
read(TRNFILE,$buf,$filesize) || return 0;
close(TRNFILE);
($buf =~ /(\d\d\-\d\d\-\d\d\d\d\d\d\:\d\d\:\d\d)/) || return 0;
$TimeStamp = $1;
($filesize = -s $hostdir."lastturn.hst") || return 0;
open(TRNFILE,"$hostdir"."lastturn.hst") || return 0;
read(TRNFILE,$buf,$filesize) || return 0;
close(TRNFILE);
($buf =~ /(\d\d\-\d\d\-\d\d\d\d\d\d\:\d\d\:\d\d)/) || return 0;
if ($TimeStamp eq $1)
{return 1}
else
{return 0};
};
sub ChngSlash
{ my ($mask) = @_;
$mask =~ s/\\/\//g;
return $mask;
};
sub printlog
{ my ($logstr,$onlyfile) = @_;
($hour,$min,$sec) = (localtime())[2,1,0];
printf "%02d:%02d:%02d %s",$hour,$min,$sec,$logstr unless $onlyfile;
printf LOGFILE "%02d:%02d:%02d %s",$hour,$min,$sec,$logstr;
};
sub MakeOutName
{ my ($dir,$ext) = @_;
for ($i = 1; -s $dir.$i.$ext > 0; $i++) {};
return $dir.$i.$ext;
};
sub MakeOutExt
{ my ($dir,$name,$ext) = @_;
my ($i);
$name =~ s/.*?([^\\^\/]*?)(\.[^\\^\/]{0,3}){0,1}$/$1/i;
for ($i = 1; $i <= 255; $i++)
{$Ext = $ext; $Val = sprintf("%x",$i); substr($Ext,length($Ext) - length($Val), length($Val)) = $Val;
if (-s $dir.$name.".$Ext" <= 0)
{return $dir.$name.".".$Ext};
};
return "";
};
sub Trims
{ my ($line) = @_;
$line =~ s/^\s*(.*?)\s*$/$1/;
return $1;
};
sub uuencode
{ my($in,$file,$mode) = @_;
my($chunk,@result,$r);
my($lines,$Chk,$len)= 0;
$mode ||= "644";
open FILE,$in || return "";
binmode FILE;
while (defined($r = read(FILE,$chunk,45)) && $r > 0)
{$lines++;
$Chk = CalcChkSumm($chunk,$Chk);
$len+= length $chunk;
push @result, uuencode_chunk($chunk);
};
my (@name) = split /[\:\\\/]/,$in;
$out = join "", "UUELinesStart=$lines,@name[$#name],$Chk/$len\nbegin $mode @name[$#name]\n", @result, "`\nend\n";
if ($file)
{ open FILE,">$file";
print FILE $out;
close FILE;
}
return $out;
}
sub uuencode_chunk
{
my($string) = shift;
my $encoded_string = pack("u", $string); # unix uuencode
return $encoded_string;
}
sub uudecode
{ my($in,$out) = @_;
my(@result,$file,$mode);
$mode = $file = "";
open FILE,$in || return "";
binmode(FILE);
read FILE,$in,-s $in;
close FILE;
while ($in =~ m/\G(.*?[\n|\r]{1,2})/gc)
{
my $line = $1;
if ($file eq "" and !$mode)
{($mode,$file) = $line =~ /^begin\s+(\d+)\s+(\S+)/ ;
next;
}
next if $file eq "" and !$mode;
last if $line =~ /^end/;
push @result, uudecode_chunk($line);
};
if ($file and $mode)
{open FILE,">$out" || return "";
binmode FILE;
foreach (@result)
{syswrite FILE,$_,length $_;
};
close FILE;
return $file;
}
else
{
return "";
}
}
sub uudecode_chunk {
my($chunk) = @_;
return "" if $chunk =~ /^(?:--|CREATED)/;
my $string = substr($chunk,0,int((((ord($chunk) - 32) & 077) + 2) / 3)*4+1);
# warn "DEBUG: string [$string]";
# my $return = unpack("u", $string);
# warn "DEBUG: return [$return]";
# $return;
my $ret = unpack("u", $string);
defined $ret ? $ret : "";
}
sub CalcChkSumm
{my ($line, $ChkSumm) = @_;
for (my $i = 1; $i <= length $line; $i++)
{ $ChkSumm += (($ChkSumm >> 1) & 0x0000FFFF) + ord(substr($line,$i-1,1)) };
return $ChkSumm;
}
1
__END__