#!/usr/local/bin/perl # ↑あなたが加入しているプロバイダの「perl」言語が使用できる # パスを指定します。一般的に「#!/usr/local/bin/perl」で大丈夫 #======================================================================================= # Suntack Version 1.1 #======================================================================================= #日本語コード変換モジュール require '../jcodeLE.pl'; #あなたのホームページに戻るためのURL $homepage = 'http://ww3.tiki.ne.jp/~kyocho/index.htm'; #管理者削除モードのパスワード #管理者は、件名欄にパスワードを入力して[投稿]ボタンを押す $password = 'abc123'; #掲示板の名前 $title = 'サンタック'; #バックグランドの画像ファイル $bg_gif = ''; #バックグランドカラー $bg_color = '#000000'; #テキストの文字色 $text_color = '#FFFFFF'; #リンク文字色 $link_color = '#FFFF7A'; #Vリンク文字色 $vlink_color = '#FF8888'; #Aリンク文字色 $alink_color = '#FF0000'; #保存する最高得点の設定 #毎回更新='true' 上回ったら更新する'false' $ansflag = 'false'; #======================================================================================= # 初期設定が必要なのはここまでです。 #======================================================================================= #クッキーを格納する名前を設定する $CookieName = 'suntack'; $logCookie = 'suntacklog'; #メッセージを格納するデータベースファイル $datafile = 'suntack.txt'; $rankfile = 'ranking.txt'; #日付と時刻を取得して、すべて2桁に統一する ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($year < 10) { $year = "0$year"; } if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } $month = ($mon + 1); if ($month < 10) { $month = "0$month"; } if ($mday < 10) { $mday = "0$mday"; } #日付時刻のフォーマットを整えます $date_now = "19$year年$month月$mday日 $hour時$min分"; $logdate = "19$year/$month/$mday $hour-$min"; #クッキーのために時刻を世界標準にする $ENV{'TZ'} = "GMT"; #世界標準の日付と時刻を取得し、クッキーの有効期限を #最終書き込み日より30日に設定する ($c_sec,$c_min,$c_hour,$c_mday,$c_mon,$c_year,$c_wday,$c_yday,$c_isdst) = localtime(time + 30 * 86400); #クッキーを取得 $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } #投稿フォームのデータを取得し、formdataに格納します。 #POSTとGETでは取得の方法が違うので、どちらでも取得できるよう設定します if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'}); } else { $formdata = $ENV{'QUERY_STRING'}; } #formdataのデータを配列にコピーし、各パーツごとに分解して、 #フォーム作成時に指定したnameプロパティーと値のペアにします @pairs = split(/&/,$formdata); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; $value =~ s/\n//g; $value =~ s/\,//g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } #データベースファイルを開き、DATA配列に格納します if (!open(NOTE,"$datafile")) { &error(bad_file); } @DATA = ; close(NOTE); #CGIが呼び出された条件によって処理を分岐 if ($FORM{'action'} eq 'ment' && $FORM{'password'} eq $password) { &deletemode; } elsif ($FORM{'action'} eq 'ans') { &answer; } elsif ($FORM{'action'} eq 'regist') { ®ist; } elsif ($FORM{'action'} eq 'delete') { &delete; } elsif ($FORM{'action'} eq 'html3') { &html3; } elsif ($FORM{'action'} eq 'html4') { &html4; } elsif ($FORM{'action'} eq 'insert') { &html2; } else { &html; } #===============================HTMLドキュメントを生成=========================== sub html { @pairs = split(/,/,$DUMMY{$CookieName}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } $count = @DATA; &html_head; print "

現在$count問が登録されています。

\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "
  1. ルールは簡単です、単なる三択問題です。
  2. \n"; print "
  3. 連続正解率を競っていただきます。
  4. \n"; print "
  5. 途中で退室すると無効になります。
  6. \n"; print "
  7. 間違ったところでゲームオーバーです。
  8. \n"; print "
  9. お名前とメールアドレスを記入して[挑戦]ボタンを押して下さい。
  10. \n"; print "
  11. 上位100位まで成績にランクされます。
  12. \n"; print "
  13. 問題は登録されている中からランダムに出題されます。
  14. \n"; print "
  15. 偶然同じ問題が出てもポイントになります。
  16. \n"; print "
  17. 負けた方は、はらいせに出題しましょう。
  18. \n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
お名前
E-Mail
\n"; print "
\n"; print "
\n"; print "

Suntack Ver1.0 by Terra

\n"; print "\n"; exit; } #===============================HTML2ドキュメントを生成=========================== sub html2 { if ($FORM{'name'} eq "") { &error(bad_data); } if ($FORM{'email'} eq "") { &error(bad_data); } &html_head; $count = @DATA; if ($count < 1) { &html; } srand; ($date,$code,$que,$ans1,$ans2,$ans3,$ans) = split(/\,/,$DATA[rand(@DATA)]); print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; $no = $FORM{'no'} + 1; print "

第" . $no . "問

\n"; print "

$que

\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "
  1. \n"; print "$ans1
  2. \n"; print "
  3. \n"; print "$ans2
  4. \n"; print "
  5. \n"; print "$ans3
  6. \n"; print "
  7. \n"; print "わからない
  8. \n"; print "
\n"; print "
\n"; print "\n"; print "
\n"; print "\n"; exit; } #===============================HTML3ドキュメントを生成=========================== sub html3 { &html_head; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
問題
答え
    \n"; print "
  1. \n"; print "
  2. \n"; print "
  3. \n"; print "
  4. \n"; print "
  5. \n"; print "
  6. \n"; print "
\n"; print "
\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print " \n"; print "
\n"; print "\n"; print "\n"; exit; } #===============================HTML4ドキュメントを生成=========================== sub html4 { if (!open(NOTE,"$rankfile")) { &error(bad_file); } @RANKING = ; close(NOTE); $count = @RANKING; &html_head; if ($count > 0) { print "\n"; $i = 1; foreach $line (@RANKING) { ($answer,$date,$name,$email,$no) = split(/\,/,$line); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; $i++; } print "
\n"; if ($i eq 1) { print "世界記録\n"; } elsif ($i eq 2) { print "日本記録\n"; } else { print "第$i位\n"; } print " " . $no . "$date\n"; print " $name
\n"; } print "\n"; print "
\n"; print "\n"; exit; } #===============================答えあわせ=========================== sub answer { #クッキーの日付、時刻を2桁に統一 if ($c_year < 10) { $c_year = "0$c_year"; } if ($c_sec < 10) { $c_sec = "0$c_sec"; } if ($c_min < 10) { $c_min = "0$c_min"; } if ($c_hour < 10) { $c_hour = "0$c_hour"; } if ($c_mday < 10) { $c_mday = "0$c_mday"; } #クッキーのフォーマットを国際標準に統一 $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$c_wday]; $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; $month = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11) [$c_mon]; $date_gmt = "$youbi, $c_mday\-$month\-$c_year $c_hour:$c_min:$c_sec GMT"; @pairs = split(/,/,$DUMMY{$logCookie}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } $flag = "false"; foreach $line (@DATA) { ($date,$code,$que,$ans1,$ans2,$ans3,$ans) = split(/\,/,$line); chop($ans); if ($FORM{'ansno'} eq $code) { if ($FORM{'ans'} eq $ans) { $flag = "true"; } last; } } if ($FORM{'ansno'} eq $COOKIE{'ansno'} && $logdate eq $COOKIE{'logdate'}) { #クッキーに記憶させるのは、時間、問題番号 $cook="logdate\:$logdate\,ansno\:$FORM{'ansno'}"; #クッキーに書き込み print "Set-Cookie: $logCookie=$cook; expires=$date_gmt\n"; &html_head; print "ゲームオーバーです。
\n"; print "このゲームは無効です。再挑戦して下さい。\n"; print "\n"; print "
\n"; print "\n"; exit; } if ($flag eq "true") { $FORM{'no'}++; &html2; } else { if (!open(NOTE,"$rankfile")) { &error(bad_file); } @RANKING = ; close(NOTE); $match = "false"; $i = 0; foreach $line (@RANKING) { ($answer,$date,$name,$email,$no) = split(/\,/,$line); if ($FORM{'email'} eq $email) { $match = "true"; last; } $i++; } $answer = $FORM{'no'}; if ($answer < 10) { $answer = "0000$answer";} elsif ($answer < 100) { $answer = "000$answer";} elsif ($answer < 1000) { $answer = "00$answer";} elsif ($answer < 10000) { $answer = "0$answer";} else { $answer = $answer;} $value = "$answer\,$date_now\,$FORM{'name'}\,$FORM{'email'}\,$FORM{'no'}\n"; $rewrite = 'false'; if ($match eq "true") { if ($ansflag eq 'true') { $RANKING[$i] = $value; $rewrite = 'true'; } else { if ($FORM{'no'} > $no) { $RANKING[$i] = $value; $rewrite = 'true'; } } } else { push(@RANKING,$value); $rewrite = 'true'; } if ($rewrite eq 'true') { @RANKING = sort(@RANKING); @RANKING = reverse(@RANKING); $i = 0; foreach $line (@RANKING) { push(@NEW_DATA,$line); if ($i == 99) { last; } $i++; } if (!open(NOTE,">$rankfile")) { &error(bad_file); } print NOTE @NEW_DATA; close(NOTE); } #クッキーに記憶させるのは、投稿者名、メールアドレスです。 $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}"; #クッキーに書き込み print "Set-Cookie: $CookieName=$cook; expires=$date_gmt\n"; #クッキーに記憶させるのは、時間、問題番号 $cook="logdate\:$logdate\,ansno\:$FORM{'ansno'}"; #クッキーに書き込み print "Set-Cookie: $logCookie=$cook; expires=$date_gmt\n"; &html_head; print "ゲームオーバーです。
\n"; print "今回のあなたの記録は、$FORM{'no'}問でした。
\n"; if ($rewrite eq 'true') { print "あなたの成績を記録しました。
\n"; } else { print "今回の成績は前回を上回っていませんので記録しません。
\n"; } print "\n"; print "
\n"; print "\n"; exit; } } #===============================問題をファイルに書き込むサブルーチン=========================== sub regist { #入力されたデータをチェックして、投稿者、コメント、メールアドレスが #入力されていなければエラーを出力し、再入力を促す if ($FORM{'que'} eq "") { &error(bad_data); } if ($FORM{'ans1'} eq "") { &error(bad_data); } if ($FORM{'ans2'} eq "") { &error(bad_data); } if ($FORM{'ans3'} eq "") { &error(bad_data); } #書き込みデータのフォーマットを整えます $count =@DATA; if ($count < 1) { $new_code = 1; } else { ($date,$code,$que,$ans1,$ans2,$ans3,$ans) = split(/\,/,$DATA[($count - 1)]); $new_code = $code + 1; } $value = "$date_now\,$new_code,$FORM{'que'}\,$FORM{'ans1'}\,$FORM{'ans2'}\,$FORM{'ans3'}\,$FORM{'ans'}\n"; if (!open(NOTE,">>$datafile")) { &error(bad_file); } print NOTE $value; close(NOTE); push(@DATA,$value); &html; exit; } #======================================削除モード================================= sub deletemode { $count = @DATA; #登録されている記事が無ければ削除の必要が無いので戻る if ($count eq 0) { &html; } &html_head; @DATA = reverse(@DATA); print "
\n"; print "\n"; print "削除コード:\n"; print " 
\n"; print "スペースで区切っていくつでも同時に削除することができます。\n"; print "
\n"; print "
\n"; foreach $line (@DATA) { ($date,$code,$que,$ans1,$ans2,$ans3,$ans) = split(/\,/,$line); #入力通り出力されるようエンターを
に換える #$que =~ s/\r/
/g; print "\n"; print "\n"; print "\n"; print "\n"; print "
[$code]\n"; print "投稿日:" . $date . "
\n"; print "$que\n"; print "
\n"; print "
\n"; } print "
\n"; print "\n"; print "削除コード:\n"; print " 
\n"; print "スペースで区切っていくつでも同時に削除することができます。\n"; print "
\n"; print "\n"; print "\n"; exit; } #======================================削除================================= sub delete { @CODE = split(/ /,$FORM{'delcode'}); $keycount = @CODE; #削除する番号が指定されていなければ戻る if ($keycount eq 0) { &html; } #データベースファイルを開き、DATA配列に格納します if (!open(NOTE,"$datafile")) { &error(bad_file); } @DATA = ; close(NOTE); $count = @DATA; foreach $line (@DATA) { ($date,$code,$que,$ans1,$ans2,$ans3,$ans) = split(/\,/,$line); $match = "false"; foreach $delcode (@CODE) { if ($code eq $delcode) { $match = "true"; } } if ($match eq "false") { push (@new_data,$line); } } #データベースファイルを上書きする if (!open(NOTE,">$datafile")) { &error(bad_file); } print NOTE @new_data; close(NOTE); &html; exit; } #================================HTMLドキュメントのヘッダーを宣言================================= sub html_head { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "$title\n"; print "\n"; print "


\n"; print "| 挑戦する |\n"; print "| 問題を作る |\n"; print "| 成績 |\n"; print "| ホームに戻る |

\n"; print "
\n"; print "
\n"; } #======================================エラー処理ルーチン================================= sub error { $error = $_[0]; if ($error eq "bad_file") { $msg = 'ファイルのオープン、入出力に失敗しました。'; } elsif ($error eq "bad_name") { $msg = 'ニックネームが記入されていません。'; } elsif ($error eq "bad_data") { $msg = 'すべての項目を記入して下さい。'; } elsif ($error eq "bad_email") { $msg = 'メールアドレスが不正です。'; } else { $msg = '原因不明のエラーで処理を継続できません。'; } &html_head; print "ERROR
\n"; print "" . $msg . "
\n"; print "
\n"; print "\n"; exit; }