#!c:/perl/bin/perl ##↑Perlへのパス #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃マスターキーの設定 ┃ #┃半角英数で8文字以下で指定してください。 ┃ #┃"コロンに挟まれた[0123]を変更します。 ┃ #┃["][;]を消さないように注意してください。 ┃ $masterkey = "0123"; #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃外部ファイルの呼び出し ┃ #┃jcode.plが複数ある場合は、まとめましょう ┃ require './jcode.pl'; require './kboard.ini'; #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃以下変更すべきところは特にありません。 ┃ #┃Perlに自信がある人だけ、改造など変更してください。 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃KBOARD v11.00 (01/05/25) ┃ #┃(C) 2000-2001 KAISM ┃ #┃E-MAIL: kai@netpro.ne.jp ┃ #┃ WWW: http://www.netpro.ne.jp/~kai/ ┃ $ver = 'kboard v11.00'; # バージョン情報 ┃ #┃ ┃ #┃KBOARD v11.00 type PhotoEz-03a (01/08/31) ┃ #┃(C) 2001 Ez ┃ #┃E-MAIL: kai@netpro.ne.jp ┃ #┃ WWW: http://www.netpro.ne.jp/~kai/ ┃ $verEz = 'kboard type PhotoEz-03a';# バージョン情報 ┃ #┃ ┃ #┃---[注意事項]-------------------------------------------┃ #┃このスクリプトはフリーソフトです。このスクリプトを使用 ┃ #┃したいかなる損害に対して作者は一切の責任を負いません。 ┃ #┃著作権を放棄したわけではありません。 ┃ #┃ ┃ #┃--------------------------------------------------------┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃処理手順 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ &decode; &access_deny; if ($mode eq "res_pass"){&res_pass;} if ($mode eq "town"){&ktown_win;} if ($mode eq "write"){&write;} if ($mode eq "frame"){&frame;} if ($mode eq "menu"){&menu;} if ($mode eq "clear" && $pass ne "$masterkey"){&clear;} if ($mode eq "clear" && $pass eq "$masterkey"){&admin_res_form;} if ($mode eq "admin_clear"){&clear;} if ($mode eq "admin_res_write"){&admin_res_write;} #改造 if ($mode eq "minna_res_write"){&minna_res_write;} if ($mode eq "admin_in"){&admin_in;} #改造 if ($mode eq "minna_res_form"){&minna_res_form;} if ($mode eq "admin_pass" && $pass eq "$masterkey"){&admin_form;} if ($mode eq "admin_pass" && $pass ne "$masterkey"){&admin_in("キーが違います");} if ($mode eq "admin_write"){&admin_write;} if ($mode eq "res_html"){&res_html;} if ($mode eq "res_write"){&res_write;} if ($mode eq "res_clear_form"){&res_clear_form;} if ($mode eq "res_clear"){&res_clear;} &html; #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃サブルーチン全リスト ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ #┃sub html メイン表示処理 ┃ #┃sub write ログ書き込み処理 ┃ #┃sub clear ログ削除処理 ┃ #┃sub decode デコード処理 ┃ #┃sub make_pass 削除キー暗号化処理 ┃ #┃sub match_pass 削除キー暗号符合処理 ┃ #┃sub uemess 注意メッセージ表示処理 ┃ #┃sub error エラーメッセージ表示処理 ┃ #┃sub auto_link 自動リンク処理 ┃ #┃sub get_time 時間取得処理 ┃ #┃sub get_host ホスト・IPアドレス取得処理 ┃ #┃sub lock ロック処理 ┃ #┃sub unlock ロック解除処理 ┃ #┃sub set_cookie クッキー生成処理 ┃ #┃sub get_cookie クッキー取得処理 ┃ #┃sub mail_to メール送信処理 ┃ #┃sub new_time 新着表示処理 ┃ #┃sub how_to 使い方表示処理 ┃ #┃sub page ページリンク表示処理 ┃ #┃sub ktown town表示処理 ┃ #┃sub ktown_win town別窓表示処理 ┃ #┃sub ktown_time town日時フォーマット処理 ┃ #┃sub ktown_up townカウント更新処理 ┃ #┃sub fudousan 売却メッセージ表示処理 ┃ #┃sub pastwrite 過去ログファイル更新処理 ┃ #┃sub new_pfile 過去ログファイル作成処理 ┃ #┃sub frame 過去ログフレーム生成処理 ┃ #┃sub menu 過去ログメニュー生成処理 ┃ #┃sub admin_in 管理用認証フォーム出力処理 ┃ #┃sub admin_form townデータ修正フォーム出力処理 ┃ #┃sub admin_write townデータ修正処理 ┃ #┃sub admin_res_form 管理者レス入力フォーム ┃ #┃sub admin_res_write 管理者レス書きこみ処理 ┃ #┃sub minna_res_form みんなレス入力フォーム ┃ #┃sub minna_res_write みんなレス書きこみ処理 ┃ #┃sub res_html 私書箱表示処理 ┃ #┃sub res_write 私書箱データの書きこみ処理 ┃ #┃sub res_clear_form 私書箱データ削除フォーム表示 ┃ #┃sub res_clear 私書箱データ削除処理 ┃ #┃sub res_pass 置き手紙パスワード照合処理 ┃ #┃sub access_deny アクセス拒否処理 ┃ #┃sub head_html ヘッダー表示処理 ┃ #┃sub house_page_count 家表示ページ処理 ┃ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃メイン表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub html{ ##クッキーの情報を取得する処理に #$cookie{'cname'} 名前 #$cookie{'cemail'} メールアドレス #$cookie{'curl'} HPアドレス #$cookie{'cpass'} 削除キー &get_cookie; ##投稿記事を取得する処理 #ログファイルを開きます open (IN,"$logfile") || &error("投稿記事ファイル$logfileが読みこめませんでした"); #各行(記事)を配列に代入 @lines = ; #ファイルを閉じる close(IN); #ヘッダー表示処理へ #ページタイトルをもっていく &head_html("$title"); if ($backyes == 1) { $wkhgsu = ($#in_hcolors + 1 ) * 2 +1; } else { $wkhgsu = 1; } #ヒアドキュメント print <<"EOM";
\n"; ###2001.8.31改造 if ($backyes == 1) { print "\n"; foreach (@in_hcolors) { if ($chcolor eq $_) { if ($_ eq "dmy.gif") { print "\n"; print "\n"; } else { if ($_ eq "dmy.gif") { print "\n"; print "\n"; } } print "\n"; } else { } print <<"EOM";
$bbstitle
おなまえ:
メール:
ホームページ:
タイトル:
フォント: EOM foreach (@in_mcolors) { if ($cmcolor eq $_) { print ""; print "\n"; } else { print ""; print "\n"; } } print "
\n"; }else { print "\n"; } print ""; print " \n"; }else { print "\n"; } print ""; print " 
キー:
$uemess

EOM ##ページ処理 #表示する記事の行番号を取得してくる &page; ##記事データの分析&フォーマット処理 #各記事データを解析する。以下、データに対する #処理の繰り返し。 # $page_start 表示する記事の最初の行数(-1) # $page_end 表示する記事の最後の行数(-1) foreach ($page_start .. $page_end){ #$num 記事番号 #$name 名前 #$email メールアドレス #$url HPアドレス #$sub タイトル #$comment 記事 #$date 日付 #$second 日付(秒) #$host ホスト #$pass 削除キー(暗号化) #$mcolor 文字色 改造 #$hcolor 背景画像色 改造 2001.8.31 ($num,$name,$email,$url,$sub,$comment,$res,$date,$second,$host,$pass,$mcolor,$hcolor) = split (/<>/,$lines[$_]); #メールアドレスがあれば、リンクをはる。 if ($email ne ""){ #メール画像があれば、それにリンクをはる。 if ($emailgif){ $email = " "; #なければ、名前にリンクをはる。 }else{ $name = "$name"; } } #HPアドレスがあれば、リンクをはる if ($url ne ""){ #家アイコンがあれば、それにリンクをはる。 if ($urlgif){ $url = ""; #家アイコンがなければ、[url]の文字にリンクをはる。 }else{ $url = "[url]"; } } #新着強調表示をするかを判断し、新着かどうか評価 if ($new_time_check){&new_time;} #ヒアドキュメント(記事表示) print <<"EOM"; EOM #2001.8.31改造 $himgnoflg = 0; if ($backyes == 1) { $wkhimg = $gifdir . "/" . $hcolor; $hcolor =~ s/\n//g; if ($hcolor eq "dmy.gif") { $himgnoflg = 1; } if ($hcolor eq "") { $himgnoflg = 1; } if ($himgnoflg == 1) { print "\n"; } else { print "
\n"; } } else { $himgnoflg = 1; print "
\n"; } print <<"EOM"; EOM if ($himgnoflg == 1) { print <<"EOM"; EOM print ""; #レスの表示 if ($res){ print "\n"; print "\n"; print "\n"; } } else { print <<"EOM"; EOM print ""; #レスの表示 if ($res){ print "\n"; print "\n"; print "\n"; } } #改造3 print <<"EOM";
[$num]$sub $date
    $comment
$name
$email $url
"; print "\n"; print "\n"; print "
\n"; print "
      \n"; print "
      \n"; print "$res\n"; print "
\n"; print "
[$num]$sub $date
    $comment
$name
$email $url
"; print "\n"; print "\n"; print "
\n"; print "
      \n"; print "
      \n"; print "$res\n"; print "
\n"; print "


EOM } ##使い方表示を取得 #使い方を表示するなら、 if ($mode eq "howtogo"){ #表示処理へ &how_to; #表示しないなら }else{ #リンクを表示 $howto = "
使い方をみる
"; } ##html表示処理 #ヒアドキュメント print <<"EOM";
$page_back$page_next
$ver kaism
house iconY.Kishino
$verEz Ez Club
EOM if ($kazariimg) { print "\n"; } if ($midi) { print"\n"; } if ($midiurl) { print"\n"; } print <<"EOM";

$midisname
$message

$howto
まだむの部屋 | 管理用 EOM ##過去ログリンクに関して #過去ログを使うかどうか if($past_check){ #$pcnt_fileの一行目にある、過去ログファイルNOを取り出す。 open (IN ,"$pcnt_file") || &error("$pcnt_fileが開けませんでした") ; $pcnt = ; close (IN); #行末の改行文字を切り落とす $pcnt =~ s/\n//g; #過去ログファイルNOが0でないなら、過去ログファイルへのリンクを表示 unless($pcnt == 0){ print "| 過去ログ\n"; } } #ヒアドキュメント print <<"EOM";


EOM #town表示処理選択 #一緒に表示するなら、表示処理に。 if($ktown){&ktown;} #別窓表示ならtown画像にリンクをはる else{ print <<"EOM";
$town_title
EOM } #ヒアドキュメント print <<"EOM";
EOM #処理を終了。 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ログファイルに書きこみする処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub write{ ##二重処理回避処理 #二重処理を回避するために、ロック処理をする。 if($lock_check){&lock;} ##必須項目制限の処理 #投稿記事に名前$nameが記入されてなかった時の処理 #名前が必須項目なら if ($name_check){ #名前が必須なら、その旨のメッセージを表示して、処理を中断 if ($name eq ""){ &uemess("$mess_name"); } #必須でないなら }else{ if($name eq ""){ #名前に$tokumeiで指定した名前を入れる $name = "$tokumei"; } } #メールアドレスが記入されなかったときの処理 #メールアドレスが必須項目なら if ($email_check){ if ($email eq ""){ #その旨のメッセージを表示して、処理を中断 &uemess("$mess_email"); } } #投稿記事に題名$subが記入されてなかった時の処理 #題名が必須項目なら if ($sub_check){ if ($sub eq ""){ #その旨のメッセージを表示して、処理を中断 &uemess("$mess_sub"); } #必須項目でなければ、 }else{ if ($sub eq ""){ #タイトルに$mudaiで指定したものを入れる $sub ="$mudai"; } } #投稿記事に削除キーが記入されてなかった時の処理 #キーが必須項目なら if ($pass_check){ if ($pass eq ""){ #その旨のメッセージを表示して、処理を中断 &uemess("$mess_key_nashi"); } } ##ログファイルデータを取得する処理 #ログファイルを開く open (IN,"$logfile") || &error("投稿記事保存ファイル$logfileが開けませんでした。"); #各行を配列に代入 @lines = ; #ファイルを閉じる close(IN); #以下、sub decodeから受け取った変数の値を使う ##二重投稿回避処理 #二重投稿があったかどうかの印の指定 $niju_flag = 0; #ログにある全記事の一つ一つに対して foreach (@lines) { #各要素に分割して、配列に代入 @datas_niju = split(/<>/,$_); #もしも、投稿者と、内容が一致するものが今までのログにあったら、 if ($name eq "$datas_niju[1]" && $comment eq "$datas_niju[5]"){ #二重投稿の印に1を代入 $niju_flag = 1; #その記事のNo.を取得 $niju_no = $datas_niju[0]; #ループから抜け出す。 last; } } #もしも、二重投稿の印に1が入っていたら(0でなければ) if ($niju_flag){ #sub uemessに$mess_onajiというメッセージを持っていって、 #二重投稿の旨をつげ、投稿を拒否する。 &uemess("$mess_onaji","[$niju_no]"); } ##白紙コメント回避 #コメントが書かれていなかったときは、 #白紙投稿を禁止する旨のメッセージをもって、sub uemessへいって、 #ログに書きこみする処理をやめる。 if ($comment eq ""){&uemess("$mess_nashi");} ##連続投稿に関して #直前の投稿データだけを取り出す。 @bline = split(/<>/,$lines[0]); #制限をかけるなら if ($renzoku_check){ #直前の名前と同じかチェック if ($name eq "$bline[1]"){ #直前の投稿からの経過時間(秒) $keika_time = time - $bline[8]; #連続投稿を許す時間を指定(秒) $renzoku_ok = 60 * $renzoku_time; #連続投稿を許可するまでの残り時間を指定(秒) $nokori_time = $renzoku_ok - $keika_time; #連続投稿を許可するか #早過ぎるなら unless ($nokori_time < 0 ){ #あと何秒後で書きこめるかのメッセージを表示 &uemess("$nokori_time$renzoku_mess"); } } } ##投稿記事に関する情報を取得する。 #$date に日付を代入 &get_time; #$hostにホスト情報を代入 &get_host; #passがあれば、それを暗号化するため、 #sub make_passへいって、返ってきた値を$PWに代入する。 if ($pass){ $PW = &make_pass($pass);} ##改造 #MAXデータの記事番号にプラス1して、今回の記事番号にする。 @sorttbl = map {(split /<>/)[0]} @lines; @sorttbl2 = @lines[sort {$sorttbl[$b] <=> $sorttbl[$a]} 0 .. $#sorttbl]; $maxnum = $sorttbl2[0]; $num = $maxnum+1; ### $num = $bline[0]+1; ######## ##新着記事をログファイルに保存する処理 #新投稿記事を保存形式に整理して、$newの値とする。 $new = "$num<>$name<>$email<>$url<>$sub<>$comment<>$res<>$date<>$second<>$host<>$PW<>$mcolor<>$hcolor\n"; #新投稿記事をログ配列の先頭に追加 unshift (@lines,$new); ##保存記事数の処理 #総記事数を取得 $kiji = @lines; #最大記事保存数・総記事数を0から始まる行数にするため、マイナス1する $dmax = $max -1; $dkiji= $kiji -1; #logfileに書き出す記事を入れる配列を指定 @news =(); #保存する行数分だけ、配列@newsに代入 foreach (0 .. $dmax){ push(@news,$lines[$_]); } #最大記事保存数を超えたときに、過去ログとして保存するかどうか if ($past_check){ #最後の行数が、最大保存する行数よりも大きければ、 if ($dkiji > $dmax){ #過去ログに書きこむデータを入れる配列を指定 @pasts =(); #溢れた記事の行数分だけ、配列@pastsに代入 foreach ($max .. $dkiji){ push(@pasts,$lines[$_]); } #過去ログに書き込みをする処理へ &pastwrite; } } #表示される記事をあらためて、$logfileに書きこむ。 open (OUT,">$logfile") || &error("$logfileがひらけませんでした。"); print OUT @news; close(OUT); ##townデータを更新する処理 #カウントを増やすので、upという値を持っていく。(削除の場合と区別するため) &ktown_up("up"); ##次の処理を許可する #ログの更新処理が終了したので、ロックを解除する if($lock_check){&unlock;} ##クッキーの処理 #書きこみされた内容をクッキーとして焼く &set_cookie; ##メール通知処理 #書きこまれた内容を管理者にメール通知するかどうかチェックして、 #もし通知するのなら、その処理を行なう if ($mail_send) {&mail_to;} } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃記事を削除する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub clear{ ##二重処理を回避 #ログを更新するため、ロック処理する。 if($lock_check){&lock;} ##記事情報を取得する処理 #ログファイルを開く open (IN,"$logfile") || &error("$logfileが開けませんでした。"); #各行を配列に代入 @lines = ; #ログファイルを閉じる close(IN); ##削除する記事を見つける処理 ##sub decodeからきた変数を使う ##$num 削除する記事番号 ##$pass 削除キー #削除しない記事を代入する配列の指定 @news=(); #記事情報を、ひとつづつ処理する。 foreach $line (@lines){ #xxの部分はいらないので、ダミーの変数。 #最後のc はclearのc #$namec,$urlcは&ktown_upで使用する。 ($numc,$namec,$xx,$urlc,$xx,$xx,$xx,$xx,$xx,$xx,$psc,$xx,$xx) = split(/<>/,$line); #$pscは行の最後にあるので、改行を削除する。 $psc =~ s/\n//g; #sub decodeから送られてきた、削除する記事番号$numをもとに #削除する記事かどうかを判断。 if ($numc == $num){ #設定されていた削除キーを$PWに代入 #削除する記事の投稿者名を取得(変数を変えるのは、&ktown_upでの処理のため) #削除する記事がみつかったか、どうか$delで判断する $PW = $psc; $name = $namec; $del = 1; #削除する記事でなければ、配列@newsに入れる }else{ push(@news,$line); } } ##削除するかどうかの処理 #入力された削除キーがマスターキーじゃなかったら unless ($pass eq "$masterkey"){ #その記事が投稿されたときに、削除キーが設定されていなければ、 #sub uemessにその旨のメッセージをもっていき、削除を中止。 if ($PW eq ""){&uemess("$mess_key_ng1");} #sub decodeから送られてきた、削除キー$passと、記事に設定されていた削除キー$PWが一致するかどうかを #sub match_passで処理して、その結果を$resultに代入する。 $result = &match_pass("$pass","$PW"); #sub match_passから受け取った結果$resultが、okでなければ、 #sub uemessにその旨のメッセージを持っていき、削除を中止 unless ($result eq 'ok'){ &uemess("$mess_key_ng2");} } ##ログファイルの更新処理 #削除する記事があって、($del = 1なら) #以上の削除キーに対する評価を乗り越えて、削除が認められたら、 if($del){ #ログファイルを開く open (OUT,">$logfile") || &error("$logfileがひらけませんでした。"); #あたらしいデータに更新 print OUT @news; #ログファイルを閉じる close (OUT); #townデータファイルの更新処理 #カウントを減らすので、downという値をもっていく(書き込みと区別するため) &ktown_up("down"); } #以上、ログの更新作業が終了したので、ロックを解除する。 if($lock_check){&unlock;} } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃デコード処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub decode { ##送られたデータを読み取る処理 #情報の送信方法Post or Getで処理を区別 #postで送信されていれば、 if ($ENV{'REQUEST_METHOD'} eq "POST") { #そのデータを$bufferに代入 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #getなら #そのデータを$bufferに代入 } else { $buffer = $ENV{'QUERY_STRING'}; } ##受け取ったデータを分析する処理 #受け取った情報$bufferを&で分割する。 @pairs = split(/&/, $buffer); #@pairsを1つづつ処理する foreach $pair (@pairs) { #$pairを連想配列のキー$nameと、値$valueに分割 ($name,$value) = split(/=/, $pair); #$valueのなかの+を半角スペースに。 $value =~ tr/+/ /; #受け取った$valueの中身は、%と16進数で表記されているので、 #それを処理する。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #最初に指定した、jcode.plを用いて、文字コードを変換Shift-JISコードに変換処理する。 &jcode'convert(*value,'sjis'); #タグを許可するなら if ($tag_check) { #タグを許可 #コメント・危険なSSIの書きこみを排除する $value =~ s///g; #記事ログの各要素を分けている<>は変換する。 $value =~ s/<>/<>/g; #タグを許可しなければ }else{ #<,>,"をそれぞれ変換する $value =~ s//>/g; $value =~ s/\"/"/g; } #改行を
に変換する。 #改行コードが違う場合を想定して、順に変換する。 $value =~ s/\r\n/
/g; $value =~ s/\r/
/g; $value =~ s/\n/
/g; #連想配列%FORMにキー$nameと値$valueとして指定する。 $FORM{$name} = $value; } ##データのフォーマット #HPアドレスの最初のhttp://の部分を削除する。 $FORM{'url'} =~ s/^http:\/\///g; #連想配列では使いづらいので、変数に代入しなおす。 $mode = $FORM{'mode'}; $name = $FORM{'name'}; $email = $FORM{'email'}; $sub = $FORM{'sub'}; $url = $FORM{'url'}; $comment = $FORM{'comment'}; $pass = $FORM{'pass'}; $num = $FORM{'num'}; $cnt = $FORM{'cnt'}; $del = $FORM{'del'}; $bname = $FORM{'bname'}; $res = $FORM{'res'}; $color = $FORM{'color'}; $ie = $FORM{'ie'}; $owner = $FORM{'owner'}; $count = $FORM{'count'}; $sec = $FORM{'sec'}; $pass_t = $FORM{'pass_t'}; $mcolor = $FORM{'mcolor'}; $hcolor = $FORM{'hcolor'}; $rcolor = $FORM{'rcolor'}; $minresflg = '0'; #記事内にアドレスなどがあったら、自動でリンクをはる処理を行なうため &auto_link($comment); &auto_link($res); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃削除キーを暗号化する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub make_pass{ #受け取った削除キーを変数に代入しなおす $password = $_[0]; #現在時刻(秒)を取得する。 $time2 = time; #現在時刻(秒)の下二桁を暗号化する塩として取り出す。 $salt = substr($time2,-2,2); #crypt関数によって、暗号化し、その値をこのサブルーチンがよばれた場所に返す return crypt($password,$salt); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃削除キーの照合処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub match_pass{ #受け取った配列を、設定されていた削除キー$log_passと入力された削除キー$form_passに代入しなおす。 ($form_pass,$log_pass)= @_; #塩の場所を調べる if ($log_pass =~ /^\$1\$/) { $key=3;} else{ $key = 0; } #設定されていた削除キーと入力された削除キーが一致するかを判断 if (crypt($form_pass,substr($log_pass,$key,2)) eq "$log_pass"){ #一致したら、このサブルーチンを呼んだところに、値"ok"を返す return 'ok'; }else{ #一致しなかったら、このサブルーチンを呼んだところに、値"ng"を返す return 'ng'; } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃フォームの下に注意メッセージを表示する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub uemess { #ログの更新処理などの途中であった場合を想定して、ロックを解除する。 if($lock_check){&unlock;} #メッセージ内容を、tempデータに入れる。 $uemess = "$_[1] $_[0]"; #メイン表示サブルーチンsub htmlへ &html; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃エラーメッセージの表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub error { #ログの更新処理などの途中であった場合を想定して、ロックを解除する。 if($lock_check){&unlock;} &head_html("error message"); print <<"EOM";
---Message---


$_[0]


$ver kaism
EOM exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃リンク処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub auto_link { #受け取った値$_[0]をリンクを張った状態に変換する。 $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/a>/g; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃現在日時の取得・フォーマット処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub get_time { #日本時間を指定 $ENV{'TZ'} = "JST-9"; #timeで取得した秒をそれぞれの要素に分ける。 #各要素は(秒・分・時・日・月・年・曜日・夏時間調整・?) ($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime(time); #年$yearは1900年からの年数なので、1900を足す $year += 1900; #月$monは0から11なので、1足す。 $mon++; #各値で、一桁のときは、最初に0を足す。(見た目のため) if ($mon < 10) { $mon = "0$mon"; } if ($mday < 10) { $mday = "0$mday"; } if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } #曜日$weekは0から6なので、それを文字に変換する。 $week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; #日時をフォーマットする。 $date = "$year\/$mon\/$mday\($week\) $hour\:$min\:$sec"; #時間の秒を取得しておく。 $second = time; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ホスト名を取得する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub get_host { #環境変数から、ホスト名・IPアドレスを取得する。 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; #ホスト名が取得できなかったか、IPアドレスのみのときは、 #IPアドレスから、ホスト名に変換する。 if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } #変換できなければ、しょうがないので、IPアドレスを$hostに入れる。 if ($host eq "") { $host = $addr; } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ロック処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub lock{ #ロックを判断するファイルの指定 $lockfile = "board.lock"; #処理を判断する旗を立てる local($flag) = 0; #リトライ回数を指定(デフォルトは5回) foreach (1..5) { #ロックファイルが存在すれば、1秒待つ if (-e $lockfile){ sleep(1); }else{ #ロックファイルがなければ、容量ゼロのロックファイル$lockfileを作成する。 open(LOCK,">$lockfile"); close(LOCK); #処理をしたことを示す旗に印をつける。 $flag = 1; #リトライ・ループから抜け出す。 last; } } #旗に印がなければ、ロックファイルがあり、誰かが書きこみ処理をしていることだから、 #しばらく待ってもらう旨のメッセージを表示させる。 if ($flag == 0) { &uemess("しばらく待ってから再度投稿してください。") } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ロック解除処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub unlock{ #処理が終了した印である、ロックファイルを削除して、 #他の人が書きこみなど出来るようにしてあげる。 if (-e,$lockfile){unlink($lockfile);} } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキーを発行する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub set_cookie{ #クッキーの保存期間は60日に指定 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$dmy,$dmy) = gmtime(time + 60*24*60*60); #以下、日付のフォーマット $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; #クッキーの内容を指定 $cook="cname\:$name\,cemail\:$email\,curl\:$url\,cpass\:$pass,cmcolor\:$mcolor,chcolor\:$hcolor"; #クッキーを焼く print "Set-Cookie: kboard=$cook; expires=$date_gmt\n"; #トクトククッキー2001.8.31改造 if ($tok2cookie == 1) { $wktok2cookie = "\n"; } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキーを取得する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub get_cookie { #クッキー情報を取得 @pairs = split(/\;/, $ENV{'HTTP_COOKIE'}); #読み取ったクッキーを1つづつ調べる foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } #kboardのクッキーを取り出す @pairs = split(/\,/, $DUMMY{'kboard'}); #クッキー情報を分析 foreach $pair (@pairs) { local($name, $value) = split(/\:/, $pair); #フォームに取得したクッキーを表示させるために、%cookie配列に代入する。 $cookie{$name} = $value; } #書きこみをした直後であれば、最新の情報に取り替える if ($FORM{'name'}) { $cookie{'cname'} = $FORM{'name'}; } if ($FORM{'email'}) { $cookie{'cemail'} = $FORM{'email'}; } if ($FORM{'url'}) { $cookie{'curl'} = $FORM{'url'}; } if ($FORM{'pass'}) { $cookie{'cpass'} = $FORM{'pass'}; } if ($FORM{'mcolor'}) { $cookie{'cmcolor'} = $FORM{'mcolor'}; } if ($FORM{'hcolor'}) { $cookie{'chcolor'} = $FORM{'hcolor'}; } $cmcolor = $cookie{'cmcolor'}; &jcode'convert(*cmcolor,'sjis'); $chcolor = $cookie{'chcolor'}; &jcode'convert(*chcolor,'sjis'); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃レスクッキーを発行する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub set_res_cookie{ #クッキーの保存期間は60日に指定 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$dmy,$dmy) = gmtime(time + 60*24*60*60); #以下、日付のフォーマット $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; #クッキーの内容を指定 $cook="cname\:$name\,crcolor\:$rcolor"; #クッキーを焼く print "Set-Cookie: kboardres=$cook; expires=$date_gmt\n"; #トクトククッキー2001.8.31改造 if ($tok2cookie == 1) { $wktok2cookie = "\n"; } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃レスクッキーを取得する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub get_res_cookie { #クッキー情報を取得 @pairs = split(/\;/, $ENV{'HTTP_COOKIE'}); #読み取ったクッキーを1つづつ調べる foreach $pair (@pairs) { local($name, $value) = split(/\=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } #kboardのクッキーを取り出す @pairs = split(/\,/, $DUMMY{'kboardres'}); #クッキー情報を分析 foreach $pair (@pairs) { local($name, $value) = split(/\:/, $pair); #フォームに取得したクッキーを表示させるために、%cookie配列に代入する。 $cookie{$name} = $value; } #書きこみをした直後であれば、最新の情報に取り替える if ($FORM{'name'}) { $cookie{'cname'} = $FORM{'name'}; } if ($FORM{'rcolor'}) { $cookie{'crcolor'} = $FORM{'rcolor'}; } $crcolor = $cookie{'crcolor'}; &jcode'convert(*crcolor,'sjis'); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃メール送信処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub mail_to { ##データのフォーマット処理 #文字コードをjisに変換する。 &jcode'convert(*mail_sub,'jis'); &jcode'convert(*name,'jis'); &jcode'convert(*sub,'jis'); &jcode'convert(*comment,'jis'); #記事内容の、改行等を変換する。 $comment =~ s/
/\n/g; $comment =~ s/<//g; #mailのタイトル指定 if ($mailtitle_chek){ $mail_title = "[$num] $sub"; }else{ $mail_title = "$mail_sub"; } ##sendmailへの出力処理 #sendmailを開く #開ければ if (open(MAIL,"| $sendmail $mailto")) { #受信者のアドレスを指定 print MAIL "To: $mailto\n"; #投稿者のメールアドレスがなければ、ダミーのアドレスを代入 if ($email eq "") { $email = "nomail\@xxx.xxx"; } #メールの内容を出力 print MAIL "From: $email\n"; print MAIL "Subject: $mail_title\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "--------------------------------------------------------\n"; print MAIL "投稿日時: $date\n"; print MAIL " ホスト: $host\n"; print MAIL " 名前: $name\n"; print MAIL " MAIL: $email\n"; if ($url) { print MAIL " URL: http://$url\n"; } print MAIL "タイトル: $sub\n\n"; print MAIL "$comment\n"; print MAIL "--------------------------------------------------------\n"; #sendmailを閉じる close(MAIL); } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃新着表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub new_time{ #何時間前を新着とするかを指定。 $newd = time - 60*60*$new_time; #指定した時刻(秒)よりも、投稿時刻(秒)が新しければ if ($newd <= $second){ #新着マーク画像があれば、それを表示 if ($newgif){ $date = " $date"; #なければ、日付に色をつける。 }else{ $date = "$date"; } } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃HOW TO 表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub how_to{ ##how toコメントの指定 #タグを許可するなら if ($tag_check){ $howto_tag = "
  • タグは使えます。閉じ忘れに注意。
    "; #許可しないのなら }else{ $howto_tag = "
  • タグは使えません。
    "; } #必須項目のチェック $howto_hissu = "
  • "; #名前が必須項目なら if ($name_check){ #変数に追加。 $howto_hissu .= "name "; #必須項目があることをチェック $flag=1; } #メールアドレスが必須項目なら if ($email_check){ #変数に追加。 $howto_hissu .= "email "; #必須項目があることをチェック $flag=1; } #タイトルが必須項目なら if ($sub_check){ #変数に追加 $howto_hissu .= "title "; #必須項目があることをチェック $flag=1; } #キーが必須項目なら if ($pass_check){ #変数に追加 $howto_hissu .= "key "; #必須項目があることをチェック $flag=1; } #必須項目があるのなら if ($flag){ #変数に追加 $howto_hissu .= "の欄は必須です。"; #必須項目がなければ、 }else{ #変数をクリアーする $howto_hissu = ""; } #新着マーク処理をするなら if ($new_time_check) { #マーク画像を使うなら if ($newgif){ #マーク画像がつくことを変数に代入 $howto_newmark = "
  • $new_time時間以内の投稿にはがつきます。"; #日付の色付けなら }else{ #日付に色がつくことを変数に代入 $howto_newmark = "
  • $new_time時間以内の投稿は、日時にがつきます。"; } } #削除キーに関する説明 $howto_key = "
  • key(英数半角8文字以下)を設定しておくと、自分の投稿を後で削除することができます。
  • 自分の記事を削除したい時は、その記事の右下のフォームにkeyを入力しをクリックしてください。"; # change #1 #town表示に関する説明 $howto_town = "
  • $town_titleでは、規定の投稿数を超えるとそのたびに持ち家が変化していきます。"; # change #2 #別窓表示の時の説明 if (!$ktown){ $howto_town .= "
  • town画像をクリックすると、町並みがみれます。"; } # change #3 #私書箱機能の説明 if ($shishobako_check){ $howto_shisho = "
  • 各家に置き手紙を残すことができます。ポストをクリックしてください。
  • ポストに手紙がある時は、$ygm_limit時間以内の置き手紙があることを示しています。
  • 各家ごとに最大$resmax件の置き手紙が保存されます。"; } if ($oki_pass_check){ $howto_shisho .= "
  • 掲示板で投稿するときにkeyを設定しておくと、ポストに鍵をかけることができ、他の人に置き手紙を覗かれなくなります。"; } # change #4 #家成長機能に関して $howto_town .= "
  • $old_limit日間投稿がないと、廃墟に、$baikyaku_limit日間投稿がないと、売却されますのでご注意ください。売却されると買った人にカウント数が追加されます。売却と同時に書き込みした人だけ買うことができます。"; #書き込みするときにクリックする画像の説明 $howto_post = "
  • 書きこみしたあと、をクリックして投稿します。"; ##how to 表示のフォーマット #以上を、使い方の説明にまとめて代入 $howto = "
      $howto_post\n$howto_tag\n$howto_hissu\n$howto_newmark\n$howto_key\n$howto_town\n$howto_shisho
    使い方をとじる
    \n"; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ページ処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub page{ ##ページ番号の指定処理 ##行番号で指定する(最初の行は0行) #ページ指定がなければ、最初の行番号を指定 if ($FORM{'page'} eq '') { $page_start = 0; } #ページ指定があれば、その行番号を指定 else { $page_start = $FORM{'page'}; } #ログファイルの最後の記事の行番号を指定 #総行数-1とするのは、行番号は0から始まってるから $all_data = @lines - 1; #表示する最後の記事を行数で指定。 $page_end = $page_start + $pagelog - 1; #ログファイルの最後の行番号よりも、指定した最後の行番号が大きければ #ログファイルの最後の行番号を、表示する最後の記事の行番号に指定しなおす。 if ($page_end >= $all_data) { $page_end = $all_data; } #次のページの最初の記事の行番号を指定 $next_page = $page_end + 1; #前のページの最初の記事の行番号を指定 $back_page = $page_start - $pagelog; ##ページ変更ボタンの表示処理 #もし、前のページがあるのならば、 if ($back_page >= 0 ){ #$page_back変数に代入する。 $page_back = <<"EOM";
    EOM } #もし、次のページのがあるのなら、 if ($page_end ne "$all_data") { #$page_next変数に代入する。 $page_next =<<"EOM";
    EOM } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃house page count処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub house_count{ if($FORM{'hpc'} eq ''){ $house_start = 0; }else{ $house_start = $FORM{'hpc'}; } $house_num = 20; $house_end = $house_start + $house_num - 1; if($house_end >= $#lines){ $house_end = $#lines; } $house_next = $house_start + $house_num; $house_back = $house_start - $house_num; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃town表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub ktown{ ##townデータ取得処理 #rankデータファイルを開く open (IN,"$rankfile") || &error("$rankfileが開けませんでした。"); #データの各行を変数に代入 @lines = ; #改造 $ietotalsu = $#lines+1; #データファイルを閉じる close (IN); ##townの表示処理 #テーブルを作成 print <<"EOM"; EOM ##私書箱データ取得処理 #私書箱機能を使うなら if ($shishobako_check){ #私書箱データファイルを開く open (IN,"$res_file") || &error("$res_fileが開けませんでした"); #データを配列に代入 @shishos = ; #ファイルを閉じる close (IN); } ##データのフォーマット・表示処理 #家の配置を制御する変数を指定 $side = 0; #データをひとつづつ分析する #家表示ページ処理へ &house_page_count; print ""; #表示分だけ・・・ foreach ($house_start .. $house_end){ ($name,$count,$town,$url,$sec,$pass) = split(/<>/,$lines[$_]); $sec =~ s/\n//g; $pass =~ s/\n//g; #家アイコンの指定 if($count == 1 ){$ie = "1";} #最初の投稿 elsif($count <= 2){$ie = "2";} #2回目の投稿 elsif($count <= 3){$ie = "3";} #3回目の投稿 elsif($count <= 4){$ie = "4";} #4回目の投稿 elsif($count <= 6){$ie = "5";} #5〜6回目の投稿 elsif($count <= 10){$ie = "6";} #7〜10回目の投稿 elsif($count <= 20){$ie = "7";} #11〜20回目の投稿 elsif($count <= 30){$ie = "8";} #21〜30回目の投稿 elsif($count <= 40){$ie = "9";} #31〜40回目の投稿 elsif($count <= 50){$ie = "10";} #41〜50回目の投稿 elsif($count <= 60){$ie = "11";} #51〜60回目の投稿 elsif($count <= 70){$ie = "12";} #61〜70回目の投稿 elsif($count <= 80){$ie = "13";} #71〜80回目の投稿 elsif($count <= 99){$ie = "14";} #81〜99回目の投稿 elsif($count == 100){$ie = "town";} #100回目の投稿 #廃墟の期限かどうかを判断 $old = time - 60*60*24*$old_limit; #廃墟期限を指定 #もしも廃墟期限になっていたら、家アイコンを廃墟画像に変更 if ($old > $sec){$ie = "old";} #投稿日時のフォーマット &ktown_time; #総投稿数を取り出す $count = $count + $town * 100; #肩書きを入れる変数を指定 $katagaki = ""; #改造 if ($count > 99 && $ie ne "old") { if($count <= 120){$ie = "15";} #100〜120回目の投稿 elsif($count <= 140){$ie = "16";} #121〜140回目の投稿 elsif($count <= 160){$ie = "17";} #141〜160回目の投稿 elsif($count <= 180){$ie = "18";} #161〜180回目の投稿 elsif($count <= 200){$ie = "19";} #181〜200回目の投稿 elsif($count <= 250){$ie = "20";} #201〜250回目の投稿 elsif($count <= 300){$ie = "21";} #251〜300回目の投稿 elsif($count <= 350){$ie = "22";} #301〜350回目の投稿 elsif($count <= 400){$ie = "23";} #351〜400回目の投稿 elsif($count <= 450){$ie = "24";} #401〜450回目の投稿 elsif($count <= 500){$ie = "25";} #451〜500回目の投稿 elsif($count <= 600){$ie = "26";} #501〜600回目の投稿 elsif($count > 600){$ie = "27";} #600以上 } # change #5 #肩書き指定 if($count >99) {$katagaki = "町長";} #100件以上なら if($count >199){$katagaki = "市長";} #200件以上なら if($count >299){$katagaki = "知事";} #300件以上なら if($count >399){$katagaki = "首相";} #400件以上なら if($count >499){$katagaki = "地球王";} #500件以上なら if($count >599){$katagaki = "宇宙王";} #600件以上なら #ポスト画像を指定 $post = "$post1"; #新着リミットを指定 $ygm = time - 60*60*$ygm_limit; ##私書箱に新着置き手紙があるかどうかのチェック #私書箱機能を使うなら if ($shishobako_check){ #データを分析 foreach(@shishos){ #データを分解 @shishodatas = split(/<>/,$_); #名前で判断 if ($name eq "$shishodatas[0]"){ #新着なら if ($shishodatas[3] > $ygm){ #ポスト画像を指定 $post = "$post2"; #最新の置き手紙だけでよいので、処理を終了 last; } } } } ##私書箱機能を使うときの表示処理 #私書箱機能を使うなら if ($shishobako_check){ if ($oki_win_check){ $oki_target = "oki_window"; }else{ $oki_target = ""; } #道の左側に表示 if ($side == 0){ #次の家を右側に表示させるための印 $side = 1; #表示 print <<"EOM"; EOM #道の右側に表示 }else{ #次の家は左側に表示させるための印 $side = 0; print <<"EOM"; EOM } #私書箱機能を使わないのなら }else{ #道の左側に表示 if ($side == 0){ #次の家を右側に表示させるための印 $side = 1; #表示 print <<"EOM"; EOM #道の右側に表示 }else{ #次の家は左側に表示させるための印 $side = 0; print <<"EOM"; EOM } } } print ""; #テーブルを閉じる print "\t
    $town_title
    $ietotalsu軒

    "; if($ktown == 1){ $ktown_win_select = none; }else{ $ktown_win_select = town; } #前のページがあれば if ($house_back >= 0){ print "\"前の通りへ\""; #無いなら }else{ print "
    "; } #道の部分の表示 print <<"EOM";
    EOM #次のページがあれば if ($house_next <= $#lines){ print "\"次の通りへ\""; #無ければ }else{ print "
    "; } print "
    $katagaki $name [$count]
    $date
    EOM if ($url){ print "\n"; }else{ print "\n"; } print <<"EOM";




    $katagaki $name [$count]
    $date
    EOM if ($url){ print "\n"; }else{ print "\n"; } print <<"EOM";
    $katagaki $name [$count]
    $date
    EOM #投稿者にHPがあれば家アイコンにリンクをはる if ($url ne ""){ print ""; #なければ、そのまま。 }else{ print ""; } print <<"EOM";




    $katagaki $name [$count]
    $date
    EOM #HPがあれば、家アイコンにリンクをはる。 if ($url ne ""){ print ""; #なければそのまま }else{ print ""; } print <<"EOM";
    "; if ($house_back >= 0){ print "\"\前の通りへ\""; }else{ print "
    "; } print <<"EOM";
    EOM if ($house_next <= $#lines){ print "\"次の通りへ\""; }else{ print "
    "; } print "
    \n"; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃別窓でtownを表示する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub ktown_win{ &head_html("town_title"); print "
    \n"; #town表示メイン処理 &ktown; print "
    "; exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃townにつかう日時表示の処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub ktown_time{ #日本時間を指定 $ENV{'TZ'} = "JST-9"; #各要素は(秒・分・時・日・月・年・曜日・夏時間調整・?) ($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime($sec); #年$yearは1900年からの年数なので、1900を足す $year += 1900; #月$monは0から11なので、1足す。 $mon++; #各値で、一桁のときは、最初に0を足す。(見た目のため) if ($mon < 10) { $mon = "0$mon"; } if ($mday < 10) { $mday = "0$mday"; } if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } #日時をフォーマットする。秒数はカットした。 $date = "$year\/$mon\/$mday"; $rdate= "$mon\/$mday $hour:$min"; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃townのデータの更新処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub ktown_up{ #投稿回数を増やすのか、減らすのかの判断(up or down)を取得 local($flag) = "$_[0]"; ##データ取得処理 #データファイルを開く open (IN,"$rankfile") || &error("$rankfileが開けませんでした"); #データの各行を変数に代入 @lines = ; #ファイルを閉じる close(IN); ##更新するデータを見つけ、データをフォーマットする処理 #更新されたデータをいれる配列の指定 @ranks = (); #売却される家のデータを入れる配列の指定 @saledata = (); #データを1つづつ分析する。 foreach $line (@lines){ #最後のtはtownのt ($namet,$cnt,$town,$urlt,$sect,$passt) = split(/<>/,$line); $sect =~ s/\n//g; $passt=~ s/\n//g; #更新するデータを名前で判断する。 #$nameの値は、&write or &clearからのもの。 if ($name eq "$namet"){ #&writeからきた場合 if ($flag eq "up"){ #カウントをアップ ++$cnt; #投稿回数が100を超えた時の処理 if ($cnt > 100){ #100の位を制御する$townのカウントをアップ ++$town; #カウントを1に戻す $cnt = 1; } #データをフォーマット #$url,$second,$PWは&writeからの値 ###改造 $rank = "$namet<>$cnt<>$town<>$url<>$second<>$PW\n"; if ($minresflg eq '1') {#レスの時 $rank = "$namet<>$cnt<>$town<>$urlt<>$second<>$passt\n"; } else { $rank = "$namet<>$cnt<>$town<>$url<>$second<>$PW\n"; } #&clearからの場合 }elsif($flag eq "down"){ #カウントをダウン $cnt=$cnt-1; #減らした時に、投稿回数が0となった時 if ($cnt <1){ #総投稿回数が100を越えてい場合 if ($town >0){ #カウントを100にする $cnt = 100; #100の位を制御する$townを1減らす $town = $town-1; #100を越えていないときは、そのデータを削除する印をつける }else{$nodata = "yes";} } #データを更新する。 $rank = "$namet<>$cnt<>$town<>$urlt<>$sect<>$passt\n"; } #更新するデータでない場合 }else{ #データのなかで、売却期限となっているかの判断 $baikyaku = time - 60*60*24 * $baikyaku_limit; #売却期限 #売却対象とならないものだけ、保存する。 if ($sect > $baikyaku){ push(@ranks,$line); #売却対象の家があったとき }else{ #売却配列に追加 push(@saledata,$line); #売却対象があったことの印 $saleflag = 1; } } } ##更新するデータが無い時 ##初投稿 or townデータ修正で削除されていた場合 #初めての投稿の場合 #ダウンの場合を排除 if ($flag eq "up" && $rank eq ""){ #データのフォーマット #$name,$url,$second,$PWは&writeからの変数 $rank = "$name<>1<>0<>$url<>$second<>$PW\n"; } ##売却処理 #売却対象があった場合 if ($saleflag){ #総カウント数の変数を指定 $cntup =0; #売却対象のすべての家データを分析 foreach (@saledata){ #分解して、配列に代入 @data = split(/<>/,$_); #カウント数を取込む $cntup = $cntup + $data[1]; } } ##新規データ配列に追加処理 ##売却時のカウント処理 #更新が削除でなければ、 #削除処理の場合は、売却カウントアップ処理は #行なわない。つまり、そのまま売却(削除)されるだけ unless ($nodata eq "yes"){ #売却する家があれば、 if ($saleflag){ #不動産売却機能を使う場合は if($fudousan_check){ #改めて、今書き込みした人のデータを分析 #先頭のsはsaleのs ($sname,$scnt,$stown,$surl,$ssec,$spass) = split(/<>/,$rank); #カウントを追加 $scnt = $scnt + $cntup; #追加した結果が、100以下になるまで、 while ($scnt > 100){ #100の位を制御する$stownのカウントをアップ ++$stown; #$scntから100を引く $scnt = $scnt - 100; } #データのフォーマット $rank = "$sname<>$scnt<>$stown<>$surl<>$ssec<>$spass"; #不動産報告メッセージの書きこみ処理へ &fudousan; } } #更新配列の一番上に追加 unshift(@ranks,$rank); } ##データ更新処理 #データファイルを開く open (OUT,">$rankfile"); #新規データ配列を出力 print OUT @ranks; #ファイルを閉じる close (OUT); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃不動産屋からの報告を書き込みする処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub fudousan{ #ログファイルを開く open (IN,"$logfile") || &error("投稿記事保存ファイル$logfileが開けませんでした。"); #直前の行を配列に代入 @lines = ; #ファイルを閉じる close(IN); #直前のデータを取得する @bline = split(/<>/,$lines[0]); #直前の記事Noを取得 ##改造 @sorttbl = map {(split /<>/)[0]} @lines; @sorttbl2 = @lines[sort {$sorttbl[$b] <=> $sorttbl[$a]} 0 .. $#sorttbl]; $maxnum = $sorttbl2[0]; $bnum = $maxnum; ## $bnum = $bline[0]; #記事Noを代入 #fはfudousanのf $fnum = $bnum + 1; #買主の名前をとりだす。 $kainushi = "$sname"; #不動産のリストを入れる配列を指定 @ielist = (); ##売却リスト作成 #売却対象配列を1つづつ分析 foreach(@saledata){ #売却対象データを分割する。 @bukken = split(/<>/,$_); #持ち主の名前を取り出す $urinushi = "$bukken[0]"; # change #6 #投稿数から値段を決定する #なんとなく値段らしいものにするため #あえて半端な数をかける $nedan = $bukken[1] * 976; # change #7 #物件データをフォーマット $list = "$urinushi 様の土地建物 $nedan 万円 で売却。"; #不動産リスト配列に追加 push (@ielist,$list); } ##掲示板に書きこむデータを作成 # change #8 #名前 $fname = "$town_title不動産"; # change #9 #タイトル $fsub = "売却報告"; # change #10 #コメント内容1(前置き) $fcomment = "このたび $kainushi 様との間で土地建物売却契約が成立しました。
    "; #コメント内容2(物件リスト)追加代入 $fcomment .= join ('
    ',@ielist); #コメント内容3 (しめ)追加代入 $fcomment .= "
    以上により $kainushi 様の総カウント数は $cntup だけアップしました。"; #パスワード $fpass = "$masterkey"; $fmcolor = $recolor; $fhcolor = $rehcolor; #データのフォーマット $line = "$fnum<>$fname<><><>$fsub<>$fcomment<>$fres<>$date<>$second<><>$fpass<>$fmcolor<>$fhcolor\n"; #データ配列の先頭に追加 unshift(@lines,$line); #データファイルを書きこみ用に開く open (OUT,">$logfile") || &error("$logfileが開けませんでした"); #データ配列を書きこむ print OUT @lines; #ファイルを閉じる close(OUT); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃過去ログファイルを更新する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub pastwrite{ ##過去ログNOを取得する処理 #過去ログNOファイルを開く open (IN ,"$pcnt_file") || &error("$pcnt_fileが開けませんでした") ; #一行目のNoだけをとりだす $pcnt = ; #ファイルを閉じる close (IN); #行末の改行文字を削除する $pcnt =~ s/\n//g; ##過去ログディレクトリの設定がちゃんとなっているかのチェック処理(最初だけ) #過去ログファイルが生成されていないなら if ($pcnt == 0){ #ダミーファイルを過去ログファイルを保存するディレクトリに指定する。 $dmyfile = "$pastdir\/dmy.html"; #ダミーファイル作成(作成できなければ、処理を中断) open (DMY,">$dmyfile") || &error("過去ログディレクトリの指定を再度確認してください。"); #ダミーファイルを閉じる close (DMY); #ダミーファイルを削除する。 unlink($dmyfile); } ##書きこむファイルを決定する処理 #現在ある最新の過去ログファイルを指定 $p_file = "$pastdir\/$pcnt\.html"; #過去ログファイルがなければ、作成する処理に。 #はじめて過去ログファイルを作る時が、これにあたる。 #0.htmlファイルなんてある分けない unless(-e $p_file){&new_pfile;} #現在ある最新の過去ログファイルを開く open (IN,"$p_file") || &error("$p_fileが開けませんでした"); #各行を配列に代入 @plines = ; #ファイルを閉じる close (IN); #過去ログファイルの最大行数の最後の行番号を指定 #26は記事以外の行数(&new_pfileのベースhtmlを作成を参照してください。) $pline_max = 26 + $pline_max - 1; #今ある過去ログファイルの最終行の行番号が、最大行数の行番号とおなじなら #$#plinesは今ある過去ログファイルの最終行の行番号 if ($#plines >= $pline_max){ #新しい過去ログファイルを作成する処理に &new_pfile; } ##書き込み処理 #書きこむ記事を入れる配列を指定 @phtmls= (); #&writeからきた溢れ出した記事が入った配列1つづつを分析 foreach (@pasts){ #データを分解 #投稿日時(秒)、ホスト情報、削除キーはいらないので、ダミーに代入 ($pnum,$pname,$pemail,$purl,$psub,$pcomment,$pres,$pdate,$xx,$xx,$xx,$xx,$xx) = split(/<>/,$_); #メールアドレスがあれば、名前にリンク if ($pemail){$pname = "$pname";} #サイトがあれば、[url]の文字にリンク if ($purl){$purl = "| [url]";} if ($pres){$pres_data = "
        $pres

        $master_name

    ";} #記事を整理する。 $phtml = "

    [$pnum]$psub
    $pdate

      $pcomment

    $pname $purl

    $pres_data
    \n"; #書きこむ配列に代入 push(@phtmls,$phtml); } #過去ログファイルを開く open (IN,"$p_file") || &error("$p_fileが開けませんでした"); #各行を配列に代入 @plines = ; #ファイルを閉じる close(IN); #過去ログに改めて書きこむ、各行のデータを入れる配列の指定 @pnews = (); #過去ログファイルに今まで書かれていたデータの各行に対して foreach $pline (@plines){ #更新する配列に代入 push(@pnews,$pline); #もしも、という行にきたら if($pline =~ //i){ #新しく書き込みする記事の配列を一気に代入 push(@pnews,@phtmls);} } #過去ログファイルを開く open (OUT,">$p_file") || &error("$p_fileが開けませんでした"); #更新データ配列を出力 print OUT @pnews; #ファイルを閉じる close (OUT); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃過去ログファイルを作成する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub new_pfile{ ##過去ログNoファイルを更新する処理 #過去ログファイルのNOを1つ増やす ++$pcnt; #過去ログNoファイルを開く open (CNT,">$pcnt_file") || &error("$pcnt_fileが開けませんでした"); #Noを更新する print CNT "$pcnt"; #ファイルを閉じる close (CNT); ##過去ログ数調整処理 #過去ログ数調整を行なうか if ($pastlog_check){ #現在の最新過去ログNo.最大過去ログ保存数よりおおきいなら #(削除すべき過去ログファイル候補があるということだから) if ($pcnt > $pastlog_max){ #削除すべき過去ログファイルのなかで一番大きいNo. $pastlog_del = $pcnt - $pastlog_max; #削除すべき過去ログファイルを順に処理する foreach (1 .. $pastlog_del){ #削除すべき過去ログファイルを指定 $del_file = "$pastdir\/$_\.html"; #その過去ログファイルが存在するなら if (-e $del_file){ #そのファイルを削除 unlink($del_file); } } } } ##過去ログファイルのベースを作成する処理 #あらためて、過去ログファイルを指定 $p_file = "$pastdir\/$pcnt\.html"; #過去ログファイルを開く open (OUT,">$p_file") || &error("$p_fileが開けませんでした"); #過去ログファイルのベースhtmlタグを書きこむ #この下のヒアドキュメント+ kboard過去ログ[$pcnt] EOM if ($bg_gif){ print OUT "\n"; }else{ print OUT "\n"; } print OUT <<"EOM";
    EOM #ベース過去ログファイルを閉じる close (OUT); #過去ログファイルのパーミッションを指定 chmod(0666,"$p_file"); } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃過去ログのフレームを生成する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub frame{ ##過去ログファイルNOを取得する処理 #過去ログNoファイルを開く open (IN,"$pcnt_file") || &error("$pcnt_fileが開けませんでした"); #一行目のNoを代入 $pcnt = ; #ファイルを閉じる close (IN); #行末の改行文字を削除 $pcnt =~ s/\n//g; ##フレームを生成する処理 #html出力を宣言 print "Content-type: text/html\n\n"; #ヒアドキュメント print <<"EOM"; <body> <center> フレーム対応ブラウザでご覧ください </center> </body> EOM #処理を終了する exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃過去ログのメニュー(フレームの右側)表示の処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub menu{ ##過去ログファイルNOを取得する処理 #過去ログNoファイルを開く open (IN,"$pcnt_file") || &error("$pcnt_fileが開けませんでした"); #一行目を読みこむ $pcnt = ; #ファイルを閉じる close (IN); #行末の改行文字を削除する。 $pcnt =~ s/\n//g; &head_html("過去ログメニュー"); #ヒアドキュメント print <<"EOM";
    過去ログ
    掲示板に戻る
    EOM #foreach処理の為に、Noをマイナス1する $pend = $pcnt - 1; ##過去ログ数調整処理 #過去ログファイルの最大保存数を #0からはじまる数にする。 $pastlog_max = $pastlog_max - 1; #過去ログファイル数を制限するなら、 if ($pastlog_check){ #最大過去ログファイル数以上であったら、 if ($pend >= $pastlog_max){ #リンクされる数を最大過去ログ数に変更 $pend = $pastlog_max; } } #過去ログファイルの数だけ foreach (0..$pend){ #リンクの順を逆にする為、全ファイル数から、引く $file_num = $pcnt - $_; #そのNo.の過去ログファイルがあるならば if (-e "$pastdir\/$file_num\.html"){ #過去ログファイルへのリンクを表示 print "[$file_num]\n"; } } #しめ print "
    \n"; #処理を終了する exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃管理用マスター・キー認証処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub admin_in{ #注意メッセージの取得 unless($_[0]=~ /value/){$mess2 = $_[0];} &head_html("管理者認証ページ"); #ヒアドキュメント print <<"EOM";
    マスター・キーを入力してください
    $mess2
    掲示板に戻る
    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃townデータの修正フォーム出力処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub admin_form{ #不正処理後に戻ってきた時の場合を想定して #ロックを解除しておく if($lock_check){&unlock;} ##データを取得 #townデータファイルを開く open (IN,"$rankfile"); #データを配列に代入 @lines = ; #ファイルを閉じる close (IN); &head_html("街管理事務所"); #ヒアドキュメント print <<"EOM";
    EOM #データの分析・出力 foreach $line (@lines){ ($name,$juu,$hyaku,$xx,$xx,$xx) = split (/<>/,$line); #カウントのフォーマット $cnt= $hyaku * 100 + $juu; #ヒアドキュメント print <<"EOM"; EOM } #ヒアドキュメント print <<"EOM";
    その家を削除する場合は、チェックを入れて編集をクリック。
    データを編集するだけなら、チェックを入れずに編集をクリック。
    カウント半角数字で指定してください。
    その家にある置き手紙を削除したければ
    置き手紙の編集をクリックし、削除フォームへ。


    掲示板に戻る

    $mess

    削除 名前 カウント

    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃townデータ修正処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub admin_write{ #二重処理を回避するために、ロック処理をする。 if($lock_check){&lock;} ##データ取得処理 #townデータファイルを開く open (IN,"$rankfile"); #データを配列に代入 @lines = ; #ファイルを閉じる close(IN); ##カウントの指定文字のチェック #カウント編集時、全角数字が使われていたら if ($cnt =~ /\D/){ #注意メッセージ取得 $mess= "カウントは半角数字で指定してください"; #処理を中断 &admin_form; } ##位上げ処理 #百以上の位の変数の指定 $hyaku = 0; #カウント指定が100を越えていたら if ($cnt > 100){ #100を越えている間 while($cnt > 100){ #100を引いて $cnt = $cnt - 100; #百以上の位を指定する変数をアップ #位上げ処理 ++$hyaku; } } #100以下の値を取得 $juu = $cnt; ##データ更新処理 #更新データを入れる配列の指定 @news = (); #データ分析 foreach $line (@lines){ ($pname,$pjuu,$phyaku,$purl,$psec,$ppass)=split(/<>/,$line); $psec =~ s/\n//g; $ppass=~ s/\n//g; #修正するものなら(名前で判断) if ($pname eq $bname){ #削除でなければ unless ($del eq "yes"){ #名前の変更がある場合 if ($bname ne "$name"){ ##二重指定を回避する処理 #データを分析 foreach (@lines){ ($pn,$x,$x,$x,$x,$x) = split(/<>/,$_); #二重指定の場合 if ($pn eq "$name"){ #注意メッセージを取得 $mess = "$nameは既に使われています"; #処理を中断 &admin_form; } } #データのフォーマット $new = "$name<>$juu<>$hyaku<>$purl<>$psec<>$ppass\n"; #更新データを配列に追加 push (@news,$new); #名前に変更が無い場合 }else{ #データのフォーマット $new = "$pname<>$juu<>$hyaku<>$purl<>$psec<>$ppass\n"; #更新データを配列に追加 push (@news,$new); } } #修正しないものは }else{ #データを配列に追加 push(@news,$line); } } #更新用にデータファイルを開く open (OUT,">$rankfile") || &error("$rankfileが開けませんでした"); #書きこみ print OUT @news; #ファイルを閉じる close (OUT); #以上、ログの更新作業が終了したので、ロックを解除する。 if($lock_check){&unlock;} #管理用修正フォームに戻る &admin_form; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃管理者記事管理フォーム ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub admin_res_form{ ##記事データ取得処理 #記事ログファイルを開く open (IN,"$logfile") || &error("$logfileが開けませんでした"); #データを配列に代入する。 @lines = ; #ファイルを閉じる close (IN); #データを分析 foreach $line (@lines){ #データを各要素に分割 @datas = split (/<>/,$line); #レスを付けるデータを見つける if ($num == $datas[0]){ #レスを付けるデータを取り出す @ress = @datas; #分析処理を終了 last; } } #もともとあったレス記事の改行タグを折り返しに変換 $ress[6] =~ s/
    /\r/g; &head_html("管理者記事管理"); #ヒアドキュメント print <<"EOM";
    管理者記事管理
    選択した記事を削除するか、レスを付けるかを選択してください。
    掲示板に戻る

    [$ress[0]] $ress[4] || $ress[1] $ress[7]
      $ress[5]
    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃管理者レス書きこみ処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub admin_res_write{ #ログファイルを開く open (IN,"$logfile") || &error("$logfileが開けませんでした"); #データを取得 @lines = ; #ファイルを閉じる close (IN); #更新するデータを入れる配列を指定 @news = (); #データを分析 foreach $line (@lines){ #データを各要素に分解 @datas = split(/<>/,$line); #レスを付けるデータを見つける if ($num == $datas[0]){ #新しいレスを代入 $datas[6] = $res; #新しいデータにフォーマット $line = join ("<>",@datas); } #データを更新するデータ配列に代入 push (@news,$line); } #ログファイルを上書き用に開く open (OUT,">$logfile") || &error("$logfileが開けませんでした"); #データを書きこみ print OUT @news; #ファイルを閉じる close (OUT); &html; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃私書箱表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub res_html{ #エラーメッセージを持っていたら、それを代入 if($_[1] eq "res_html"){$mess = $_[0];} #ログの更新処理などの途中であった場合を想定して、ロックを解除する。 if($lock_check){&unlock;} #クッキーを取得 &get_cookie; #資産価値を計算 #現実味を持たせるため、 #カウントに976万をかける $nedan = $count * 976; &head_html("$ownerさんの私書箱"); print <<"EOM";

    EOM if($url){ print "\n"; }else{ print "\n"; } print <<"EOM";
    $ownerさんのお宅
    住所:ここ住所:不定
    資産価値:$nedan万円

    EOM if ($oki_win_check){ print "| 閉じる |"; }else{ print "| 掲示板に戻る |"; } print <<"EOM";

    EOM if ($oki_pass_check){ print <<"EOM"; EOM } print <<"EOM";
    $ownerさんに置き手紙を残すためのフォーム

    お名前:
    EOM foreach (@res_colors){ print "\n"; } print <<"EOM";


    自分宛ての置き手紙を見るときは下のフォームにkeyを…
    key:

    $mess

    EOM if ($oki_pass_check == "0" || $oki_pass eq "ok"){ #私書箱データファイルを開く open (IN,"$res_file") || &error("$res_fileが開けませんでした"); #データを配列に代入 @lines = ; #ファイルを閉じる close (IN); #置き手紙の数を数える変数 $rescnt=0; #各データを分析 foreach $line (@lines){ #データを分解 ($ownerr,$guest,$res,$sec,$color) = split(/<>/,$line); #家の持ち主のデータのみ取り出す。 if ($owner eq "$ownerr"){ #置き手紙の数をカウント ++$rescnt; #置き手紙の数が最大数をこえたら読みこみ終了 if ($rescnt > $resmax){last;} #日時を拾得 &ktown_time; #色の改行を削除 $color =~ s/\n//g; #ヒアドキュメント print <<"EOM";
    $res

    $guest || $rdate


    EOM } } if ($rescnt == 0){ print "置き手紙は御預かりしておりません

    "; } } #ヒアドキュメント print <<"EOM";
    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃私書箱データの書きこみ処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub res_write{ ##二重処理回避処理 #二重処理を回避するために、ロック処理をする。 if($lock_check){&lock;} ##ログファイルデータを取得する処理 #ログファイルを開く open (IN,"$res_file") || &error("$res_fileが開けませんでした。"); #各行を配列に代入 @lines = ; #ファイルを閉じる close(IN); ##二重投稿回避処理 #直前の投稿データだけを取り出す。 @bline = split(/<>/,$lines[0]); #以下、sub decodeから受け取った変数の値を使う #直前のデータのコメントと全く一緒だった時は、 #二重投稿を禁止する旨のエラーメッセージを表示 if ($res eq "$bline[2]"){&res_html("$mess_onaji","res_html");} #コメントが書かれていなかったときは、 #白紙投稿を禁止する旨のメッセージを表示。 if ($res eq ""){&res_html("$mess_nashi","res_html");} #名前がなければ、 #その旨のメッセージを表示 unless($name){&res_html("名前を記入してください","res_html");} ##投稿記事に関する情報を取得する。 #$second に日付を代入 &get_time; ##新着記事をログファイルに保存する処理 #新投稿記事を保存形式に整理して、$newの値とする。 $new = "$owner<>$name<>$res<>$second<>$color\n"; #新投稿記事をログ配列の先頭に追加 unshift (@lines,$new); ##保存記事数の処理 #総記事数を取得 $kiji = @lines; #最大記事保存数・総記事数を0から始まる行数にするため、マイナス1する $dmax = $reslog_max -1; $dkiji= $kiji -1; #logfileに書き出す記事を入れる配列を指定 @news =(); #保存する行数分だけ、配列@newsに代入 foreach (0 .. $dmax){ push(@news,$lines[$_]); } #表示される記事をあらためて、$logfileに書きこむ。 open (OUT,">$res_file") || &error("$res_fileがひらけませんでした。"); print OUT @news; close(OUT); ##次の処理を許可する #ログの更新処理が終了したので、ロックを解除する if($lock_check){&unlock;} $mess = "御手紙確かに受け取りました。"; #私書箱表示処理へ &res_html; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃私書箱記事を削除するフォーム表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub res_clear_form{ #不正処理後に戻ってきた時の場合を想定して #ロックを解除しておく if($lock_check){&unlock;} ##データを取得 #townデータファイルを開く open (IN,"$res_file"); #データを配列に代入 @lines = ; #ファイルを閉じる close (IN); ##html出力処理 &head_html("私書箱削除フォーム"); #ヒアドキュメント print <<"EOM";
    EOM $cnt = 0; #データの分析・出力 foreach $line (@lines){ ($rowner,$rguest,$rres,$rsec,$xx) = split (/<>/,$line); if ($owner eq "$rowner"){ #ヒアドキュメント print <<"EOM"; EOM } } #ヒアドキュメント print <<"EOM";
    削除する記事にチェックを入れ、削除をクリックしてください。


    掲示板に戻る

    $mess

    $ownerへの置き手紙を編集する

    $rres

    from $rguest

    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃私書箱データを削除する処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub res_clear{ #ログを更新するため、ロック処理する。 if($lock_check){&lock;} #私書箱データファイルを開く open (IN,"$res_file") || &error("$res_fileが開けませんでした"); #データを読み込む @lines = ; #ファイルを閉じる close (IN); #更新するデータを入れる配列を指定 @news = (); #データを個別に分析 foreach $line (@lines){ #データを要素に分解 @datas = split (/<>/,$line); #削除対象記事でなければ unless ("$del" eq "yes" && "$owner" eq "$datas[0]" && "$sec" eq "$datas[3]"){ #更新データ配列の最後に追加 push (@news,$line); } } #私書箱データファイルを上書き用に開く open (OUT,">$res_file") || &error("$res_fileが開けませんでした"); #データを更新する print OUT @news; #ファイルを閉じる close (OUT); #以上、ログの更新作業が終了したので、ロックを解除する。 if($lock_check){&unlock;} #私書箱削除フォーム表示処理へ &res_clear_form; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃置き手紙パスワード照合処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub res_pass{ #sub decodeから送られてきた、$passと、ポストに設定されていたキー$pass_tが一致するかどうかを #sub match_passで処理して、その結果を$oki_passに代入する。 $oki_pass = &match_pass("$pass","$pass_t"); #もしも、$pass_tが設定されていなかったのなら(削除キーが設定されていなかったら) if ($pass_t eq ""){ #だれでも見れるように、okをかえす。 $oki_pass = "ok"; #その旨のメッセージを表示 $mess = "メイン掲示板でkeyを入力してね、他の人にもみられちゃうよ。"; } #もしも、キーが違ったら if ($oki_pass ne "ok"){ #覗き見しちゃだめという旨のメッセージを表示 $mess = "のぞいちゃだめ!!"; } #置き手紙表示処理へ &res_html; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃アクセスチェック処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub access_deny{ #排除ホスト候補があれば、 if ($deny_list[0]) { # ホスト名を取得 &get_host; #チェック印 $flag_deny = 0; #排除リストを1つづつ foreach (@deny_list) { #空になったら、終わり if ($_ eq '') { last; } #*の部分を正規表現に書きなおす $_ =~ s/\*/\.\*/g; #取得したホスト情報とリストが一致するか if ($host =~ /$_/) { #印をつける $flag_deny = 1; #ループから脱出 last; } } #印がついていたら if ($flag_deny) { # エラー表示 &error("$access_deny_mess"); exit; } } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ヘッダー表示処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub head_html{ #ページタイトル取得 local($t) = @_[0]; #html出力宣言 print "Content-type: text/html\n\n"; #ヒアドキュメント print <<"EOM"; EOM #2001.8.31改造 if ($tok2cookie == 1) { print $wktok2cookie; # トクトククッキーの発効 } print <<"EOM"; $t EOM #背景画像があれば、 if ($bg_gif){ print "\n"; # print "\n"; #背景画像がなければ、 }else{ print "\n"; } } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃家表示ページ処理 ┃ #┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ sub house_page_count{ ##表示する最初の家の行数 #値を持っていなければ if($FORM{'hpc'} eq ''){ #0行目、最初から $house_start = 0; #値を持っているなら }else{ #その行目から、 $house_start = $FORM{'hpc'}; } #そのページの最後の家の行数 $house_end = $house_start + $house_num - 1; #最後の家の行数が、データ上での最後の行数以上のときは、 if($house_end >= $#lines){ #データ上での最後の行数になる $house_end = $#lines; } #次のページの最初の家の行数 $house_next = $house_start + $house_num; #前のページの最初の家の行数 $house_back = $house_start - $house_num; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃みんなでレス入力フォーム 改造追加 ┃ sub minna_res_form{ &get_res_cookie; ##記事データ取得処理 #記事ログファイルを開く open (IN,"$logfile") || &error("$logfileが開けませんでした"); #データを配列に代入する。 @lines = ; #ファイルを閉じる close (IN); #データを分析 foreach $line (@lines){ #データを各要素に分割 @datas = split (/<>/,$line); #レスを付けるデータを見つける if ($num == $datas[0]){ #レスを付けるデータを取り出す @ress = @datas; #分析処理を終了 last; } } #もともとあったレス記事の改行タグを折り返しに変換 &head_html("みんなでレス"); #ヒアドキュメント print <<"EOM";
    みんなでレス
    掲示板に戻る
    [$ress[0]] $ress[4]$ress[1] $ress[7]
    $ress[5]


      $ress[6]


    name
    EOM foreach (@in_mcolors) { if ($crcolor eq $_) { print ""; print "\n"; } else { print ""; print "\n"; } } print <<"EOM";
    EOM #処理を終了 exit; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃みんなでレス書きこみする処理 改造追加   ┃ sub minna_res_write{ ##二重処理回避処理 #二重処理を回避するために、ロック処理をする。 if($lock_check){&lock;} ##必須項目制限の処理 #投稿記事に名前$nameが記入されてなかった時の処理 if ($name eq ""){ &uemess("$mess_name"); } ##ログファイルデータを取得する処理 #ログファイルを開く open (IN,"$logfile") || &error("投稿記事保存ファイル$logfileが開けませんでした。"); #各行を配列に代入 @lines = ; #ファイルを閉じる close(IN); #コメントが書かれていなかったときは、 #白紙投稿を禁止する旨のメッセージをもって、sub uemessへいって、 #ログに書きこみする処理をやめる。 if ($res eq ""){&uemess("$mess_nashi");} #二重投稿があったかどうかの印の指定 $niju_flag = 0; #ログにある全記事の一つ一つに対して foreach (@lines) { #各要素に分割して、配列に代入 @datas_niju = split(/<>/,$_); $niju_flag = index("$datas_niju[6]", "$res"); # 同じ内容を探す #ループから抜け出す。 if($niju_flag > 0){last;} } if ($niju_flag > 0){ &uemess("$mess_onaji",""); } ##投稿記事に関する情報を取得する。 #$date に日付を代入 &get_time; #$hostにホスト情報を代入 &get_host; $resdat = "$date $name
    $res

    "; #更新するデータを入れる配列を指定 @news = (); #レスデータ検索更新 foreach $line (@lines){ @datas = split(/<>/,$line); if ($num == $datas[0]){ #レス追加 $datas[6] = "$datas[6]
    $resdat"; $line = join ("<>",@datas); if ($resupflg eq '1') { unshift (@news , $line); } else { push (@news,$line); } }else{ push (@news,$line); } } #表示される記事をあらためて、$logfileに書きこむ。 open (OUT,">$logfile") || &error("$logfileがひらけませんでした。"); print OUT @news; close(OUT); ##townデータを更新する処理 #レスフラグオン $minresflg = '1'; #カウントを増やすので、upという値を持っていく。(削除の場合と区別するため) if ($name ne $kanri_name) { &ktown_up("up"); } ##次の処理を許可する #ログの更新処理が終了したので、ロックを解除する if($lock_check){&unlock;} ##クッキーの処理 #書きこみされた内容をクッキーとして焼く &set_res_cookie; } #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛