#!jperl #!/usr/local/bin/perl #!D:/app/Perl/bin/perl # ↑はサーバーに合わせて変更して下さい。 #---------------------------------------------------------------------- # 箱庭諸島 ver2.20 # メンテナンスツール(ver1.00) # 使用条件、使用方法等は、hako-readme.txtファイルを参照 # # 箱庭諸島のページ: http://t.pos.to/hako/ #---------------------------------------------------------------------- # 「帝国の興亡」 ver1.0.0 by おじー http://t.pos.to/ozzy/ # 使用条件は箱庭諸島に準ずる.詳しくは付属のreadme.txtファイルを参照 #---------------------------------------------------------------------- # ―――――――――――――――――――――――――――――― # 各種設定値 # ―――――――――――――――――――――――――――――― # マスターパスワード my($masterpassword) = 'hoge'; # 1ターンが何秒か my($unitTime) = 21600; # 6時間 # ディレクトリのパーミッション my($dirMode) = 0755; # このファイル my($thisFile) = 'http://localhost/cgi-bin/imperial_100/hako-mente.cgi'; #my($thisFile) = 'http://cgi2.bekkoame.ne.jp/cgi-bin/user/u5534/imperial/hako-mente.cgi'; # データディレクトリの名前 # hakojima.cgi中のものと合わせてください。 my($dirName) = 'data'; # use Time::Localが使えない環境では、'use Time::Local'の行を消して下さい。 # ただし、更新時間の変更が'秒指定で変更'しかできなくなります。 use Time::Local; # 「帝国の興亡」用の設定 # 陣営の数 my($campMaxNum) = 2; # 陣営の名前とマークに関する設定 ( by まほ〜つかい☆みんさん ) my(@camp_name, @camp_head, @camp_color); @camp_name = ('陣営1','陣営2','陣営3','陣営4'); #陣営名称 @camp_head = ('(1)','(2)','(3)','(4)'); #陣営マーク @camp_color = ('ff00ff','ff5400','0079f2','9933cc'); #マークの色 @camp_bbs = ( 'http://', # 陣営1 'http://', # 陣営2 'http://', # 陣営3 'http://' # 陣営4 ); #@camp_name = ('帝国軍','同盟軍'); #陣営名称 #@camp_head = ('ψ','∇'); #陣営マーク #@camp_color = ('ff0000','0000ff'); #マークの色 #@camp_bbs = ( # 'http://t.pos.to/b/trees.cgi?bname=k1', # 陣営1 # 'http://t.pos.to/b/trees.cgi?bname=k2', # 陣営2 # ); # ―――――――――――――――――――――――――――――― # 設定項目は以上 # ―――――――――――――――――――――――――――――― # 各種変数 my($mainMode); my($inputPass); my($deleteID); my($currentID); my($ctYear); my($ctMon); my($ctDate); my($ctHour); my($ctMin); my($ctSec); print < 箱島2 メンテナンスツール END cgiInput(); if($mainMode eq 'delete') { if(passCheck()) { deleteMode(); } } elsif($mainMode eq 'current') { if(passCheck()) { currentMode(); } } elsif($mainMode eq 'time') { if(passCheck()) { timeMode(); } } elsif($mainMode eq 'stime') { if(passCheck()) { stimeMode(); } } elsif($mainMode eq 'new') { if(passCheck()) { newMode(); } } mainMode(); print < END sub myrmtree { my($dn) = @_; opendir(DIN, "$dn/"); my($fileName); while($fileName = readdir(DIN)) { unlink("$dn/$fileName"); } closedir(DIN); rmdir($dn); } sub currentMode { myrmtree "${dirName}"; mkdir("${dirName}", $dirMode); opendir(DIN, "${dirName}.bak$currentID/"); my($fileName); while($fileName = readdir(DIN)) { fileCopy("${dirName}.bak$currentID/$fileName", "${dirName}/$fileName"); } closedir(DIN); } sub deleteMode { if($deleteID eq '') { myrmtree "${dirName}"; } else { myrmtree "${dirName}.bak$deleteID"; } } sub newMode { mkdir($dirName, $dirMode); # 現在の時間を取得 my($now) = time; $now = $now - ($now % ($unitTime)); open(OUT, ">$dirName/hakojima.dat"); # ファイルを開く print OUT "0\n"; # ターン数0 print OUT "$now\n"; # 開始時間 print OUT "\n"; # メイン拡張領域 # 陣営のデータを追加 # 陣営名とマーク(色)はdataファイルを直接書き換えて下さい print OUT "$campMaxNum\n"; print OUT "$campMaxNum\n"; my($ii); for ($ii = 0; $ii < $campMaxNum; $ii++) { print OUT "$camp_name[$ii]\n"; print OUT "$camp_head[$ii]\n"; print OUT "$ii\n"; print OUT makeRandomString() . "$ii\n"; print OUT "0\n"; print OUT "0\n"; print OUT "0\n"; print OUT "$camp_bbs[$ii]\n"; # bbs url print OUT "\n"; # extend } print OUT "0\n"; # 島の数 print OUT "1\n"; # 次に割り当てるID # ファイルを閉じる close(OUT); } sub timeMode { $ctMon--; $ctYear -= 1900; $ctSec = timelocal($ctSec, $ctMin, $ctHour, $ctDate, $ctMon, $ctYear); stimeMode(); } sub stimeMode { my($t) = $ctSec; open(IN, "${dirName}/hakojima.dat"); my(@lines); @lines = ; close(IN); $lines[1] = "$t\n"; open(OUT, ">${dirName}/hakojima.dat"); print OUT @lines; close(OUT); } sub mainMode { opendir(DIN, "./"); print <

箱島2 メンテナンスツール

パスワード: END # 現役データ if(-d "${dirName}") { dataPrint(""); } else { print < END } # バックアップデータ my($dn); while($dn = readdir(DIN)) { if($dn =~ /^${dirName}.bak(.*)/) { dataPrint($1); } } closedir(DIN); } # 表示モード sub dataPrint { my($suf) = @_; print "
"; if($suf eq "") { open(IN, "${dirName}/hakojima.dat"); print "

現役データ

"; } else { open(IN, "${dirName}.bak$suf/hakojima.dat"); print "

バックアップ$suf

"; } my($lastTurn); $lastTurn = ; my($lastTime); $lastTime = ; my($timeString) = timeToString($lastTime); print <ターン$lastTurn
最終更新時間:$timeString
最終更新時間(秒数表示):1970年1月1日から$lastTime 秒
END if($suf eq "") { my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $dummy) = localtime($lastTime); $mon++; $year += 1900; print <最終更新時間の変更
1970年1月1日から END } else { print < END } } sub timeToString { my($sec, $min, $hour, $date, $mon, $year, $day, $yday, $dummy) = localtime($_[0]); $mon++; $year += 1900; return "${year}年 ${mon}月 ${date}日 ${hour}時 ${min}分 ${sec}秒"; } # CGIの読みこみ sub cgiInput { my($line); # 入力を受け取る $line = <>; $line =~ tr/+/ /; $line =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if($line =~ /DELETE([0-9]*)/) { $mainMode = 'delete'; $deleteID = $1; } elsif($line =~ /CURRENT([0-9]*)/) { $mainMode = 'current'; $currentID = $1; } elsif($line =~ /NEW/) { $mainMode = 'new'; } elsif($line =~ /NTIME/) { $mainMode = 'time'; if($line =~ /YEAR=([0-9]*)/) { $ctYear = $1; } if($line =~ /MON=([0-9]*)/) { $ctMon = $1; } if($line =~ /DATE=([0-9]*)/) { $ctDate = $1; } if($line =~ /HOUR=([0-9]*)/) { $ctHour = $1; } if($line =~ /MIN=([0-9]*)/) { $ctMin = $1; } if($line =~ /NSEC=([0-9]*)/) { $ctSec = $1; } } elsif($line =~ /STIME/) { $mainMode = 'stime'; if($line =~ /SSEC=([0-9]*)/) { $ctSec = $1; } } if($line =~ /PASSWORD=([^\&]*)\&/) { $inputPass = $1; } } # ファイルのコピー sub fileCopy { my($src, $dist) = @_; open(IN, $src); open(OUT, ">$dist"); while() { print OUT; } close(IN); close(OUT); } # パスチェック sub passCheck { if($inputPass eq $masterpassword) { return 1; } else { print <パスワードが違います。 END return 0; } } # [a-zA-Z]で構成される8文字のパスワードを作る sub makeRandomString { my($baseString) = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; my($baseLen) = length($baseString); my($i, $passward); for ($i = 0; $i < 8; $i++) { $passward .= substr($baseString, rand($baseLen), 1); } return $passward; } 1;