#!/usr/bin/perl $version='2.24'; #************************************************ # 変数初期設定 #************************************************ sub setup{ #####---------------------------------------------------------- #####クイズのログのファイル名の付け方を設定する。 #####初期設定では、挑戦者ログのファイル名が『log数字.cgi』 #####各クイズの回答状況ログのファイル名が『qu数字.cgi』となる #####---------------------------------------------------------- #####パーミッション $mod_cgi ='0755'; #CGIスクリプトファイルのパーミッション $mod_dat ='0666'; #データファイルのパーミッション $mod_dir ='0777'; #ディレクトリのパーミッション #####オプション $edit_pass =1; #パスワード変更オプション 0:禁止 1:許可 $method ='post'; if($ENV{'HTTP_X_JPHONE_MSNAME'} ne ''){$imode='mb';} #J-PHONE判定 elsif($ENV{'HTTP_USER_AGENT'} =~ /J-PHONE/){$imode='mb';} #J-PHONE判定 elsif($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/){$imode='mb';} #DoCoMo判定 elsif($ENV{'HTTP_USER_AGENT'} =~ /UP\.Browser/){$imode='mb';} #Ezweb判定 elsif($ENV{'HTTP_USER_AGENT'} =~ /PDXGW/){$imode='mb';} #H"判定 elsif($ENV{'HTTP_USER_AGENT'} =~ /ASTEL/){$imode='mb';} #ASTEL判定 else{$imode='pc';} $header ='log'; $quiz_header ='qu'; $mondai_ ='mondai_'; $mes_ ='mes_'; $high1_ ='high1_'; $hst1_ ='hst1_'; $high2_ ='high2_'; $hst2_ ='hst2_'; $id = $ENV{'REMOTE_HOST'}; #####IPアドレス $ip = $ENV{'REMOTE_HOST'}; #####IPアドレス if($id eq ''){ $id=$ENV{'REMOTE_ADDR'}; $ip=$ENV{'REMOTE_ADDR'}; } $sys_color ='#dfdfff'; #####管理人室の表の色 $sys_color2 ='#ddffdd'; #####管理人室の表の色 $border ='3'; #####表ののborder $tblw ='700'; $sys_tbl_opt ="border=3 width=$tblw cellspacing=1 cellpadding=2"; #####全テーブルのオプション $sys_tbl_opt2 ="border=3 cellspacing=1 cellpadding=2"; #####全テーブルのオプション $time_lag =0; #####海外サーバーなどで時刻表示がおかしい場合の表示時刻の調整。単位(秒) $max_en =30; #####ハイスコア登録名の最大長さ $max_com =100; #####ハイスコア登録コメントの最大長さ $graph_w =300; #####成績グラフの長さ $graph_h =10; #####成績グラフの幅 $now = time(); #####アクセス時刻 $high_i =5; #####携帯用ハイスコア表示人数初期値 $charset ="x-sjis"; #####ページのキャラセット #####ファイル名 $genre_cgi ='genre.cgi'; #####クイズのジャンル情報が載っているデータファイル $design_cgi ='design.cgi'; #####クイズのデザイン情報が載っているデータファイル $sysdesign_cgi ='sysdesign.cgi'; #####システムのデザイン情報が載っているデータファイル $pass_cgi ='pass.cgi'; #####管理人パスワードを暗号化したファイル $system_cgi ='system.cgi'; #####システム設定ファイル $contribute_cgi ='contribute.cgi'; #####投稿問題記録ファイル $quiz_op_cgi ='quiz_op.cgi'; #####管理人用プログラムファイル $quiz_cgi ='quiz.cgi'; #####クイズプログラムファイル $function_cgi ='function.cgi'; #####共有関数ファイル $index_cgi ='index.cgi'; #####メニューページプログラムファイル $data_dir ='data'; #####プレイログ保存ディレクトリ $file_lock ='file.lock'; #####ファイルロック用ファイル $count_file ='count_file'; #####ログファイル番号記録ファイル $guard_cgi ='guard.cgi'; #####アクセス制限IP一覧 $_try ='挑戦'; #####挑戦 $_underconst ='工事中'; #####工事中 $_high ='高成績者'; #####高成績者 $_graph ='成績分布'; #####成績分布 $_score ='出題状況'; #####出題状況 $_add ='問題投稿'; #####問題投稿 $_imode ='携帯専用'; #####携帯専用 $_op ='管理人室'; #####管理人室 $_top ='TOP'; #####TOP } #************************************************ # パスワードのチェック ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_pwd{ local($pass)=@_; open(DB,$pass_cgi);@line=<DB>;close(DB); $line[0]=~ s/\n//g; if(&crypt_pwd($pass) ne $line[0]){return 1;} else{return 0;} } #************************************************ # パスワード生成関数 #************************************************ sub crypt_pwd{ return crypt($_[0],"ARRAY(0xb74f5c)"); } #************************************************ # アドレスチェック関数 # 引数から、4桁一定の数字を返します。 ## ## 引数 $key キーとなる数字 ## ## 広域 $LOG{seed} プレイごとの変数決定seed値 #************************************************ sub ch_address { local($key)=@_; local($sin,$r); $sin=sin($key*$LOG{seed}*10); if($sin<0){$sin=-$sin;} $r=int(9999*$sin); if($r<10){$r="000$r";} elsif($r<100){$r="00$r";} elsif($r<1000){$r="0$r";} return $r; } #************************************************ # クイズ初期化関数 ## ## 特定ジャンルの全クイズをロードしてあるメモリをクリアする #************************************************ sub refresh_quiz{ (@mondai,@ans,@misans1,@misans2,@misans3,@misans4,@anscom,@misanscom,@cf,@digest,@misanscom1,@misanscom2,@misanscom3,@misanscom4,@anstype,@author,@misanscorrect1,@misanscorrect2,@misanscorrect3,@misanscorrect4)=(); } #************************************************ # ファイルサイズを返す(kb) #************************************************ sub file_size_kb{ local($file_name)=@_; local($mon_size)=-s $file_name; local($mon_size2)=int($mon_size/1024); if(0 < $mon_size % 1024){$mon_size2++;} return $mon_size2; } #************************************************ # system.datを新規作成処理 #************************************************ sub make_new_system_dat{ &def_sys; #####デフォルトのシステム情報をメモリ上に読み込む return &write_system_dat; #####メモリ上のシステム情報をファイルに書き込む } #************************************************ # クイズで使用するジャンルリストを生成する ## ##@genre_dir_useに、クイズに使用するジャンルのリストをセットする ##%genre_numに、ジャンルごとの使用問題数をセットする #************************************************ sub get_genre_dir_use{ if($GNR{mondai_cgi} =~ /\//){ #####総合問題ジャンルの場合 @mondai_dat=split(/\t/,$GNR{mondai_cgi}); #####ジャンルリストの取得 foreach(@mondai_dat){ local($dir,$val)=split(/\//,$_); #####ジャンル名と問題数を取得 push(@genre_dir_use,$dir); if($val eq 'all'){$val ='-1';} $genre_num{$dir}=$val; #####利用問題数制限のセット } }else{ push(@genre_dir_use,$FORM{d}); $genre_num{$FORM{d}}=$GNR{quiz_max}; #####クイズ開始時、問題数maxの意味 } } #************************************************ # 問題番号から、ジャンル名を取得する ## ## 総合問題ジャンルの場合、問題の生成場所が違うので ## 問題がどこのジャンルからきたものかを知る必要があるため。 ## ## 引数 $num 問題番号 ## ## 戻り値 ジャンル名 ## #************************************************ sub get_question_dir{ local($num)=@_; local($count); foreach $genre(@genre_dir_use){ #####使用するジャンルを記憶 $count = $count + $genre_num{$genre}; if($num < $count){ return $genre; } } } #************************************************ # MAX最適化関数 ## ## $GNR{quiz_max},$GNR{play_max},$GNR{lose_max}の値を補正する #************************************************ sub max_set{ if($GNR{quiz_max} eq ''){$GNR{quiz_max} = $#mondai+1;} elsif($GNR{quiz_max} > $#mondai+1){$GNR{quiz_max} = $#mondai+1;} if($GNR{play_max} eq ''){$GNR{play_max} = $GNR{quiz_max};} elsif($GNR{play_max} > $GNR{quiz_max}){$GNR{play_max} = $GNR{quiz_max};} if($GNR{lose_max} eq ''){$GNR{lose_max} = $GNR{play_max};} elsif($GNR{lose_max} > $GNR{play_max}){$GNR{lose_max} = $GNR{play_max};} } #************************************************ # html出力用に引数1を変換し引数2に格納 #************************************************ sub conv_for_html{ $_[0]=$_[1]; $_[0]=~ s/</</g; $_[0]=~ s/>/>/g; $_[0]=~ s/"/"/g; @_; } #************************************************ # ラジオボタンのチェック用に%FORMから%FORMにchecked文字列を格納 #************************************************ sub form_to_formch{ foreach $pal(@_){ $FORM{"$pal-".$FORM{$pal}}=' checked'; } } #************************************************ # html出力用に%FORMを変換し%FORM2に格納 #************************************************ sub form_to_form2{ foreach $pal(@_){&conv_for_html($FORM2{$pal},$FORM{$pal});} } #************************************************ # 改行タグを改行に変換し%FORM3に格納 #************************************************ sub form_to_form3{ foreach $pal(@_){ $FORM3{$pal}=$FORM{$pal}; $FORM3{$pal}=~ s/<br>/\n/ig; &conv_for_html($FORM3{$pal},$FORM3{$pal}); } } #************************************************ # 改行を改行タグに変換し%FORM4に格納 #************************************************ sub form_to_form4{ foreach $pal(@_){ $FORM4{$pal}=$FORM{$pal}; $FORM4{$pal}=~ s/\n/<br>/g; } } #************************************************ # 改行を削除し%FORM5に格納 #************************************************ sub form_to_form5{ foreach $pal(@_){ $FORM5{$pal}=$FORM{$pal}; $FORM5{$pal}=~ s/\n//g; } } #************************************************ # FORMからの入力値のバリエーションフォーマットの作成 #************************************************ sub form_to_form{ foreach(keys %FORM){ &form_to_formch($_); &form_to_form2($_); &form_to_form3($_); &form_to_form4($_); } } #************************************************ # FORM変数をクリア #************************************************ sub clear_form{ foreach $pal(@_){ ($FORM{$pal},$FORM2{$pal},$FORM3{$pal},$FORM4{$pal})=(); } } #************************************************ # ファイルへの書き込み ## ## 引数 $file_name ファイル名 ## @value 書き込み内容 #************************************************ sub write_file{ local($file_name,@value)=@_; local($opt); if($file_name =~ /^(>)(.*)$/){$opt=$1;$file_name=$2;} #####ファイル名をオプションとファイル名に分離 local($exist)=-f $file_name; #####ファイルの存在チェック local($edit)=-M $file_name; #####ファイルの更新日時を取得 open(DB,">$opt$file_name");print DB @value;close(DB); #####ファイルに書き込む chmod(oct($mod_dat),$file_name); #####パーミッションの変更 if(!(-f $file_name)){ #####ファイルが存在しなければ、書き込み不可エラー &error(731,$file_name); return 1; }elsif(!($exist)){ #####ファイルを新規作成したかどうか &mes(450,$file_name); }elsif((-M $file_name eq $edit)&&($edit > 0)){ #####ファイルの更新日時に変化がなければ更新不可エラー &error(741,$file_name); return 1; } return 0; } #************************************************ # 時刻表記関数 #************************************************ sub time_set{ my($epoc,$lag)=@_; if($lag eq '' && $SYS{lag} ne '' && $SYS{lag} =~ /\d+/){$lag=$SYS{lag}*60*60;} elsif($lag eq '' && $SYS{lag} eq ''){$lag = $time_lag;} local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($epoc+$lag); $month = ($mon + 1); $year=$year+1900; if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } if ($mday < 10) { $mday = "0$mday"; } if ($month < 10) { $month = "0$month"; } if($year<10){$year="0$year";} return "[$year/$month/$mday $hour'$min\"$sec]"; } #************************************************ # スコア用時刻表記関数 #************************************************ sub score_time{ local($hour,$min,$sec); $hour=int($_[0]/60/60); $min=int($_[0]%(60*60)/60); $sec=($_[0])%60; $min='0' x (2-length($min)) .$min; $sec='0' x (2-length($sec)) .$sec; return ($sec,$min,$hour); } #************************************************ # パーミッション表示処理 #************************************************ sub permition { local(@permit)=('---','--x','-w-','-wx','r--','r-x','rw-','rwx'); return "\($permit[substr($_,length($_[0])-3,1)]$permit[substr($_,length($_[0])-2,1)]$permit[substr($_,length($_[0])-1,1)]\)"; } #************************************************ # フォーカス移動スクリプト生成 #************************************************ sub focus_move { local($field)=@_; $ret=<<"_HTML_"; <script language=javascript> //<!-- document.frm.${field}.focus(); //--> </script> _HTML_ } #************************************************ # メッセージ表示処理 #************************************************ sub mes { $mesno=" message($_[0])"; if (!($_[0] =~ /^\d+$/)){ $system_mes .= $_[0]; $mesno=''; }elsif ($_[0] <= 149) { $system_mes .= "$_[1]の新規作成が正常に終了しました。"; }elsif ($_[0] <= 199) { $system_mes .= "$_[1]の追加が正常に終了しました。"; }elsif ($_[0] <= 249) { $system_mes .= "$_[1]の編集が正常に終了しました。"; }elsif ($_[0] <= 299) { $system_mes .= "$_[1]の削除、順序変更が正常に終了しました。"; }elsif ($_[0] <= 349) { $system_mes .= "$_[1]の削除が正常に終了しました。"; }elsif ($_[0] <= 399) { $system_mes .= "$_[1]の一括追加が正常に終了しました。"; }elsif ($_[0] <= 449) { $system_mes .= "$_[1]の順序変更が正常に終了しました。"; }elsif ($_[0] <= 499) { $system_mes .= "$_[1]の自動作成が正常に終了しました。"; }elsif ($_[0] <= 549) { $system_mes .= "$_[1]を問題ファイルに追加しました。"; }elsif ($_[0] <= 599) { $system_mes .= "$_[1]を問題ファイルに追加しました。"; }elsif ($_[0] <= 649) { $system_mes .= "$_[1]の一括追加が正常に終了しました。"; }elsif ($_[0] <= 699) { $system_mes .= "$_[1]の一括追加が正常に終了しました。"; }elsif ($_[0] <= 749) { $system_mes .= "$_[1]の一括追加が正常に終了しました。"; }elsif ($_[0] <= 759) { $system_mes .= "$_[1]の複製が正常に終了しました。"; }elsif ($_[0] <= 999) { $system_mes .= "$_[1]"; } $system_mes .="$mesno<br><br>"; } #************************************************ # メッセージ表示処理 #************************************************ sub mes_html { if($system_mes ne ''){ return <<"_HTML_"; <table $sys_tbl_opt bgcolor="#eeeeaa"><tr><td> <center><big><b>■■■システムメッセージ■■■<br></b><big><br> <table border=0><tr><td><small><b>$system_mes</b></small></td></tr></table> </center> </td></tr></table><br> _HTML_ } } #************************************************ # 小数点位統一関数 #************************************************ sub point { local($num,$point)=@_; local($over,$under)=split(/\./,$num); $under=substr($under,0,$point); $under=$under . '0' x ($point - length($under)); return "$over.$under"; } #************************************************ # フッタ表示処理 # #_HTML_と_HTML_とのあいだに #クイズのページのフッター部分のHTMLを記入してください。 #普通のHTML表記でかまいません。 # #その際、著作権表記は消さないでください。 # #************************************************ sub footer_html { $footer_html = <<"_HTML_"; <hr width="100%"><div align=right><span> </span> </div></body></html> _HTML_ } #************************************************ # 出題状況表示処理 #************************************************ sub rec_html { local(@line); local($type)=@_; if($type eq 'op'){$cgi_file=$quiz_op_cgi;} else{$cgi_file=$quiz_cgi;} ($QU_ALL{play_win},$QU_ALL{play_num})=(0,0); if($type eq 'op'){ &refresh_quiz(); #####使用するジャンルリストを取得する &get_genre_dir_use(); #####使用ジャンルからの問題の読み込み。%genre_numの値を補正する &quiz_read_all(); #####$GNR{quiz_max},$GNR{play_max},$GNR{lose_max}の値を補正する &max_set(); } #####問題が無い場合 if($GNR{quiz_max} < 1){ &error(692); return; } if($type eq 'op'){ $td=" bgcolor='$sys_color'"; $th=" bgcolor='$sys_color'"; $opt=$sys_tbl_opt; $opt2=$sys_tbl_opt2; $bdc=$DSN{td_color}; }else{ $td=" bgcolor='$DSN{td_color}'"; $th=" bgcolor='$DSN{th_color}'"; $opt=$tbl_opt; $opt2=$tbl_opt; $bdc=$DSN{border_color}; } local(@mon_type)=('単一選択問題','テキスト入力問題','複数選択問題'); local(%multi_ans); $multi_ans{1}="[正解]"; #####問題ごとの出題状況集計 for($quiz_index=0;$quiz_index<$GNR{quiz_max};$quiz_index++){ &quiz_log_read(); #####問題文の編集 my($mondai_str); if($GENRE_LST{$FORM{d}}{show_auth} eq 0){ $mondai_str=$mondai[$quiz_index]; }elsif($author[$quiz_index] ne ''){ $mondai_str=$mondai[$quiz_index]."<div align=right>by $author[$quiz_index]</div>"; }else{ $mondai_str=$mondai[$quiz_index]; } @mon_name=('選択肢1[正解]','選択肢2','選択肢3','選択肢4','選択肢5'); if($FORM{item} eq 'list'){ $per[int($QU{win_ratio}/5)]++; #####管理人用出題状況表示 }elsif($type eq 'op'){ ########## $dumy=$quiz_index+1; $value=<<"_HTML_"; <table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td> <table $opt> <tr> <td$td nowrap> $mon_type[$anstype[$quiz_index]] </td> <td$td colspan=3> Q$dumy\.$mondai_str </td></tr> <tr> <td$td colspan=4> $QU{play_num}人中$QU{play_win}人正解 正解時間 $QU{ave2} 秒 _HTML_ local(@ans_list)=($ans[$quiz_index],$misans1[$quiz_index],$misans2[$quiz_index],$misans3[$quiz_index],$misans4[$quiz_index]); local(@ans_correct_list)=(0,$misanscorrect1[$quiz_index],$misanscorrect2[$quiz_index],$misanscorrect3[$quiz_index],$misanscorrect4[$quiz_index]); for($i=0;$i<5;$i++){ $qu[$i]=$qu[$i]+0; #####選択肢ごとの正解率 if($QU{play_num} > 0){ $per=&point($qu[$i]*100/$QU{play_num},1); }else{ $per='0.0'; } if($ans_list[$i] ne ''){ $value=$value."<tr><td$td nowrap>$mon_name[$i]$multi_ans{$ans_correct_list[$i]}</td><td$td nowrap>$qu[$i]人</td><td$td nowrap>$per%</td><td$td width=100%>$ans_list[$i]</td></tr>\n" } } #####テキスト入力形式の場合 if($anstype[$quiz_index] eq '1'){ local($qu_else)=$QU{play_num}; foreach(@qu){ $qu_else=$qu_else - $_; if($QU{play_num} > 0){ $per=&point($qu_else*100/$QU{play_num},1); }else{ $per='0.0'; } } $value=$value."<tr><td$td nowrap>誤答(その他)</td><td$td nowrap>$qu_else人</td><td$td nowrap>$per%</td><td$td width=100%> </td></tr>\n" } $value=$value.'</table></td></tr></table><br>'; #####一般用出題状況表示 }else{ $dumy=$quiz_index+1; #####問題コメントの取得 if($GNR{show_digest} eq 1){ $mon_digest=$digest[$quiz_index]; }else{ $mon_digest=$mondai_str } if($mon_digest eq ''){ $mon_digest='------'; } #####総合問題の場合、ジャンル名の取得 if($#genre_dir_use > 1){ $genre_name="<td nowrap bgcolor='$DSN{td_color}'>$GENRE_LST{&get_question_dir($quiz_index)}{title}</td>"; }else{ $genre_name=''; } $value=<<"_HTML_"; <tr> <td bgcolor='$DSN{td_color}' nowrap>$walign1Q$dumy.$walign2</td> <td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{play_num}人中$QU{play_win}人正解$walign2</td> <td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{win_ratio}%$walign2</td> <td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{ave2}秒$walign2</td> <td bgcolor='$DSN{td_color}' nowrap>$walign1$author[$quiz_index] $walign2</td> <td bgcolor='$DSN{td_color}' nowrap>$walign1$mon_digest$walign2</td> $genre_name </tr> _HTML_ } #####全問題の総計を計算する $QU_ALL{play_num}=$QU_ALL{play_num}+$QU{play_num}; $QU_ALL{play_win}=$QU_ALL{play_win}+$QU{play_win}; $QU_ALL{ave_sum} =$QU_ALL{ave_sum}+$QU{ave}*$QU{play_win}; #####ソート条件の作成 push(@line,$value); if($FORM{item} eq 'num'){ push(@sort,"$QU{play_num}\t$quiz_index"); }elsif($FORM{item} eq 'aper'){ push(@sort,"$QU{win_ratio}\t$quiz_index"); }elsif($FORM{item} eq 'time'){ push(@sort,"$QU{ave2}\t$quiz_index"); }elsif($FORM{item} eq 'auth'){ push(@sort,"$author[$quiz_index] \t$quiz_index"); }else{ push(@sort,"$quiz_index\t$quiz_index"); } } #####全問題の正解時間の計算 if($QU_ALL{play_win} > 0){ $QU_ALL{ave2}=&point($QU_ALL{ave_sum}/$QU_ALL{play_win},2); }else{$QU_ALL{ave2}='0.00';} if($QU_ALL{play_num} > 0){ $QU_ALL{win_ratio}=&point($QU_ALL{play_win}*100/$QU_ALL{play_num},2); }else{ $QU_ALL{win_ratio}='0.00'; } $QU_ALL{play_lose}=$QU_ALL{play_num}-$QU_ALL{play_win}; $FORM{"item-$FORM{item}"}=' selected'; $FORM{"sort-$FORM{sort}"}=' selected'; $main_html=<<"_HTML_"; <br><span><b>■$_score情報■</b></span> $align1 <table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td> <table $opt> <tr><td$th><small>$walign1総問題数$walign2</small></td> <td$td width=100%><small>$walign1$GNR{quiz_max}問$walign2</small></td></tr> <tr><td$th><small>$walign1総出題回数$walign2</small></td> <td$td><small>$walign1$QU_ALL{play_num}回$walign2</small></td></tr> <tr><td$th><small>$walign1総正解回数$walign2</small></td> <td$td><small>$walign1$QU_ALL{play_win}回$walign2</small></td></tr> <tr><td$th nowrap><small>$walign1平均正解時間$walign2</small></td> <td$td><small>$walign1$QU_ALL{ave2}秒$walign2</small></td></tr> <tr><td$th><small>$walign1総正解率$walign2</small></td> <td$td><small>$walign1$QU_ALL{win_ratio}%$walign2</small></td></tr></table> </td></tr></table> <form action="$cgi_file" method="$method"> _HTML_ #####管理者用hiddenタグ if($type eq 'op'){ $main_html.=<<"_HTML_"; <input type=hidden name=passch value="$FORM2{passch}"> <input type=hidden name=menu value=1> <input type=hidden name=type value=score> _HTML_ #####一般用hiddenタグ }else{ $main_html.='<input type=hidden name=s value=1>'; if($FORM{passch} ne ''){ $main_html.="<input type=hidden name=passch value='$FORM2{passch}'>"; } } $main_html.=<<"_HTML_"; <input type=hidden name=d value="$FORM{d}"> <table border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td> <table $opt2> <tr> <td$td><select name=item> <option value=mon$FORM{'item-mon'}>問題番号順</option> <option value=num$FORM{'item-num'}>出題数順</option> <option value=aper$FORM{'item-aper'}>正解率順</option> <option value=time$FORM{'item-time'}>正解時間順</option> <option value=list$FORM{'item-list'}>正解率分布</option> <option value=auth$FORM{'item-auth'}>作成者</option> </select></td> <td$td><select name=sort> <option value=up$FORM{'sort-up'}>昇順</option> <option value=down$FORM{'sort-down'}>降順</option> </select></td> <td$td> <input type=submit value=表\示> </td></tr></table></td></tr></table></form><hr> _HTML_ #####出題状況のソート if($FORM{sort} eq 'down'){ if($FORM{item} eq 'auth'){ @sort=sort {$b cmp $a} @sort; }else{@sort=sort {$b <=> $a} @sort;} }else{ if($FORM{item} eq 'auth'){ @sort=sort {$a cmp $b} @sort; }else{@sort=sort {$a <=> $b} @sort;} } if($#genre_dir_use > 1){$genre_name="<td nowrap bgcolor='$DSN{th_color}'>ジャンル</td>";} else{$genre_name='';} if($FORM{item} eq 'list'){ $main_html.='<span><b>■正解率分布■</b></span>'; $main_html.="<table width='$SYS{tblw}'border=0 cellpadding=0 cellspacing=0 bgcolor='$bdc'><tr><td><table $opt>"; $max=0;$sum=0; for($i=0;$i<=20;$i++){ $sum=$sum+$per[$i]; if($max < $per[$i]){$max=$per[$i];} } for($i=0;$i<=20;$i++){ $per[$i]=$per[$i]+0; if($max > 0){ $rate=&point($per[$i]/$sum*100,1); $width=int($per[$i]/$max*$graph_w); }else{$rate=0.0;$width=1;} if($width < 1){$width=1;} $from=$i*5;$to=$i*5+5; if($i<20){ $main_html.="<tr><td$th nowrap>$walign1$from\%-$to\%$walign2</td><td$td nowrap><img src='$SYS{b_gif}' width='$width' height='$graph_h'> $per[$i]問\($rate%\)</td></tr>"; }else{ $main_html.="<tr><td$th nowrap>$walign1$from\%$walign2</td><td$td nowrap><img src='$SYS{b_gif}' width='$width' height='$graph_h'> $per[$i]問\($rate%\)</td></tr>"; } } $main_html.='</table></td></tr></table>'; #####一般出題状況表示 }elsif($type ne 'op'){ $main_html.=<<"_HTML_"; <table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td> <table $opt><tr> <td nowrap bgcolor="$DSN{th_color}">$walign1問題番号$walign2</td> <td nowrap bgcolor="$DSN{th_color}">$walign1成績$walign2</td> <td nowrap bgcolor="$DSN{th_color}">$walign1正解率$walign2</td> <td nowrap bgcolor="$DSN{th_color}">$walign1正解時間$walign2</td> <td nowrap bgcolor="$DSN{th_color}">$walign1作成者$walign2</td> <td nowrap bgcolor="$DSN{th_color}">$walign1問題内容$walign2</td> $genre_name </tr> _HTML_ } foreach(@sort){ ($dum,$num)=split(/\t/,$_); $main_html.= $line[$num]; } if($type ne 'op'){$main_html.='</table></td></tr></table>';} $main_html.= "$align2\n"; } #************************************************ # 問題入力form用Script #************************************************ sub edit_quiz_form_script{ $main_html.=<<"_HTML_"; <script language="javascript"> <!-- function setAnsType(){ if(!document.frm.atype){return;} if(!document.frm.atype[1]){return;} if(document.frm.atype[1].checked){ com_color="#bbbbbb"; com_disabled=true; cor_disabled=false; }else{ com_color="#ffffff"; com_disabled=false; cor_disabled=true; } document.frm.qmasc1.disabled=cor_disabled; document.frm.qmasc2.disabled=cor_disabled; document.frm.qmasc3.disabled=cor_disabled; document.frm.qmasc4.disabled=cor_disabled; if(document.frm.qmac1){ document.frm.qmac1.disabled=com_disabled; document.frm.qmac2.disabled=com_disabled; document.frm.qmac3.disabled=com_disabled; document.frm.qmac4.disabled=com_disabled; document.frm.qmac1.style.background=com_color; document.frm.qmac2.style.background=com_color; document.frm.qmac3.style.background=com_color; document.frm.qmac4.style.background=com_color; } } //--> </script> _HTML_ } #************************************************ # 引数のうち最大数を返す。 #************************************************ sub max{ local(@list)=@_; local($max);$max=$list[0]; foreach(@list[1..$#list]){if($max < $_){$max = $_;}} return $max; } #************************************************ # 引数のうち最大数を返す。 #************************************************ sub mygrep{ local($item); local($sorce,@list)=@_; foreach $item(@list){ if($sorce eq $item){return 1;} } return 0; } #************************************************ # ファイル内容を返す #************************************************ sub getFileLine{ local($ret,@list); local($path)=@_; open(DB,"$path"); @list=<DB>; close(DB); foreach $line(@list){ $ret.=$line; } return $ret; } #************************************************ # エラー表示処理 #************************************************ sub error { local($errno); $errno=" message($_[0])"; if (!($_[0] =~ /^\d+$/)){ $error_mes .= $_[0]; $errno=''; }elsif ($_[0] <= 199) { $error_mes .= "$_[1]が不正です。"; }elsif ($_[0] <= 299) { $error_mes .= "$_[1]が入力されていません"; }elsif ($_[0] <= 349) { $error_mes .= "$_[1]が不正です。半角数字を入力してください"; }elsif ($_[0] <= 399) { $error_mes .= "$_[1]が不正です。半角数字または0%~100%を入力してください"; }elsif ($_[0] <= 499) { $error_mes .= "$_[1]が正しく選択されていません"; }elsif ($_[0] <= 509) { $error_mes .= "$_[1]は半角で$max_en文字までです。<br>$_[1]が長すぎます。<br>登録できませんでした。"; }elsif ($_[0] <= 519) { $error_mes .= "$_[1]は半角で$max_com文字までです。<br>$_[1]が長すぎます。<br>登録できませんでした。"; }elsif ($_[0] <= 529) { $error_mes .= "$_[1]が長すぎます。<br>半角20文字以内で入力して下さい。"; }elsif ($_[0] <= 539) { $error_mes .= "$_[1]が範囲外です。"; }elsif ($_[0] <= 549) { $error_mes .= "$_[1]が一致しません。<br>再入力してください。"; }elsif ($_[0] <= 609) { $error_mes .= 'ずるをした可能性があります。正常に処理されませんでした。<br><br>なお、管理者が作業を行っていた可能性があります。しばらくしてからリロードしてみて下さい。'; }elsif ($_[0] <= 619) { $error_mes .= 'このジャンルでは、より多くの方に登録していただくために、<br>同一IPアドレスによる同一スコアの登録は出来ません。'; }elsif ($_[0] <= 629) { $error_mes .= "このハイスコアは、上位$GNR{num_limit}人をのスコアを記録しています。<br>残念ながらこの記録は登録できませんでした。"; }elsif ($_[0] <= 639) { $error_mes .= 'すでにこの記録は登録されています。登録出来ませんでした。'; }elsif ($_[0] <= 649) { $error_mes .= 'このクイズは、高成績者を登録できません。'; }elsif ($_[0] <= 659) { $error_mes .= "このクイズは現在$_underconstです。\nまたのおこしをお待ちしています。"; }elsif ($_[0] <= 669) { $error_mes .= "現在同時プレイ人数限度$SYS{max_player}人がプレイ中です。<br>しばらくしてからお越しください。"; }elsif ($_[0] <= 679) { $error_mes .= '登録された問題がありません。<br><br>しばらくしてから、またお越しください。'; }elsif ($_[0] <= 689) { $error_mes .= 'クイズのジャンルが登録されていません。'; }elsif ($_[0] <= 699) { $error_mes .= 'このジャンルは、問題が未登録です。'; }elsif ($_[0] <= 704) { $error_mes .= 'このジャンルは、問題ファイルがありません。'; }elsif ($_[0] <= 709) { $error_mes .= '一括出題形式の問題は、携帯モードではチャレンジできません。'; }elsif ($_[0] <= 719) { $error_mes .= 'システムファイルの読み込みに失敗しました。<br>管理者にお問い合わせ下さい。'; }elsif ($_[0] <= 729) { $error_mes .= 'ジャンルファイルの読み込みに失敗しました。<br>管理者にお問い合わせ下さい。'; }elsif ($_[0] <= 739) { local($permition); $permition=&permition($mod_dir); $error_mes .="$_[1]を自動作成できませんでした。<br>本プログラムを設置しているディレクトリのパーティションを<br>$mod_dir$permitionにしてください。<br>なお、プロバイダの関係上パーミッションに制限があり、<br>このエラーが発生する場合は、<br>FTPを使い手動で$_[1]を作成して下さい。"; }elsif ($_[0] <= 749) { local($permition); $permition=&permition($mod_dat); $error_mes .="$_[1]に書き込みができませんでした。<br>ファイルのパーティションを<br>$mod_dat$permitionにしてください。"; }elsif ($_[0] <= 759) { $error_mes .= 'このジャンルは、問題の投稿ができません。'; }elsif ($_[0] <= 769) { $error_mes .= '現在、高成績者は登録されていません。'; }elsif ($_[0] <= 779) { $error_mes .= "$_[1]はすでに登録されています。"; }elsif ($_[0] <= 789) { $error_mes .= "同じ問題を何度も回答することはできません。"; }elsif ($_[0] <= 799) { $error_mes .= "このジャンルは、登録されている投稿問題がありません。"; }elsif ($_[0] <= 809) { $error_mes .= "$_[1]が存在しません。"; }elsif ($_[0] <= 819) { $error_mes .= "$_[1]が存在しません。ファイル構\成を確認してください。"; }elsif ($_[0] <= 829) { $error_mes .= "$_[1]は空です"; }elsif ($_[0] <= 839) { $error_mes .= "$_[1]は現在使用中です。<br>削除できませんでした。"; }elsif ($_[0] <= 849) { $error_mes .= "$_[1]は使用できません。<br>別のディレクトリ名を入力してください。"; }elsif ($_[0] <= 859) { $error_mes .= "$_[1]はすでに登録されています。<br>別の名前を入力してください。"; }elsif ($_[0] <= 869) { $error_mes .= "$_[1]のタイムスタンプが違います。<br>作業中に変更されたか、二度送信を行った可能\性があります。<br>正しく変更されているか確認してください。"; }elsif ($_[0] <= 909) { $error_mes .= '問題が一問も登録されませんでした。'; }elsif ($_[0] <= 919) { $error_mes .= "$_[1]行目にエラーがあります。"; }elsif ($_[0] <= 929) { $error_mes .= "$_[1]問目の問題文がありません。"; }elsif ($_[0] <= 939) { $error_mes .= "$_[1]問目の正解がありません。"; }elsif ($_[0] <= 949) { $error_mes .= "$_[1]問目の選択肢1がありません。"; }elsif ($_[0] <= 959) { $error_mes .= "パスワードは変更できません。"; }else { $error_mes .= '処理に何らかのエラーが発生し作業は中止されました。'; $errno=''; } $error_mes .="$errno<br><br>"; # open(DB,">>error.dat"); # print DB &time_set(time)."$error_mes\n"; # close(DB); } #************************************************ # エラー表示処理 #************************************************ sub error_html{ local($return,$color); if($error_mes ne ''){ if($DSN{com_color} eq ''){$color='#eeeebb';} else{$color=$DSN{com_color};} $return = <<"_HTML_"; <hr><br> <table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0><tr><td> <table $top_tbl_opt bgcolor="$color"><tr><td$nowrap> <center><big><font color=#ff0000>◆ お知らせ ◆</font><br><br> </big> <table border=0><tr><td><span><b>$error_mes</b></span></td></tr></table> </center> </td></tr></table> </td></tr></table><br> _HTML_ } return $return; } #************************************************ # HTML出力 #************************************************ sub output{ local($er); $er=&error_html; print"Content-type: text/html\n"; if($SYS{nocache} ne '0'){ print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"; } print "\n"; print <<"_HTML_"; $header_html $align1 $er $start_html $test $main_html $align2 $midi_html $footer_html _HTML_ exit; } #************************************************ # HTML出力(携帯用) #************************************************ sub output_i{ print"Content-type: text/html\n"; if($SYS{nocache} ne '0'){ print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"; } print "\n"; print <<"_HTML_"; $header_i_html $error_mes $start_i_html $test $main_i_html $footer_i_html _HTML_ exit; } #************************************************ # ビジー表示 #************************************************ sub busy_html{ $header_html=<<"_HTML_"; <html> <head> <title>ビジー</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$charset"> _HTML_ if($SYS{nocache} ne '0'){ $header_html.=<<"_HTML_"; <META http-equiv="Pragma" content="no-cache"> <META http-equiv="Cache-Control" content="no-cache"> <META http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"> _HTML_ } $header_html.=<<"_HTML_"; </head> <BODY bgcolor='$sys_color'> <br><br><b> ■ファイルを読み込めませんでした■<br></b> <br> 管理人が作業中の可能\性があります。<br> もう一度その場でリロードしてください。<br><br><br> _HTML_ } #************************************************ # アクセス制限表示 #************************************************ sub guard_html{ $header_html=<<"_HTML_"; <html> <head> <title>アクセス制限</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$charset"> _HTML_ if($SYS{nocache} ne '0'){ $header_html.=<<"_HTML_"; <META http-equiv="Pragma" content="no-cache"> <META http-equiv="Cache-Control" content="no-cache"> <META http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"> _HTML_ } $header_html.=<<"_HTML_"; </head> <BODY bgcolor='$sys_color'> <br><br><b> ■アクセスできませんでした■<br></b> <br> 現在、管理人によりアクセス制限がかかっております。<br><br> _HTML_ } #************************************************ # ファイルロック #************************************************ sub file_lock{ open(DB,">$_[0]"); close(DB); } #************************************************ # ファイルアンロック #************************************************ sub file_unlock{ unlink "$_[0]"; } #************************************************ # ロック状態をチェック。 ## ## 戻り値 0:正常 1:busy ## ## ロックファイルが1分以内に作成されていれば、1秒待機する ## 指定回数連続busyならば、0を返す #************************************************ sub ch_lock{ local($file,$count)=@_; while($count--){ if(-f $file){ if((-M $file)*60*60*24 < 60){sleep(1);} else{return 0;} }else{return 0;} } return 1; } ###############以下、アダプター############### #************************************************ # 管理人が作業中でないことをチェック ## ## 戻り値 0:正常 1:busy #************************************************ sub ch_sys_lock{ return &ch_lock("$data_dir/$file_lock",10); } #************************************************ # 管理人作業開始によるロック #************************************************ sub sys_lock{ return &file_lock("$data_dir/$file_lock"); } #************************************************ # 管理人作業終了によるアンロック #************************************************ sub sys_unlock{ return &file_unlock("$data_dir/$file_lock"); } #************************************************ # ハイスコアファイルが更新中でないことをチェック ## ## 戻り値 0:正常 1:busy ## ## 引数 $dir_name ジャンル名 #************************************************ sub ch_hist_lock{ local($dir_name)=@_; return &ch_lock("$dir_name/$GNR{scorehst_cgi}\.lock",10); } #************************************************ # ハイスコアファイルの更新開始によるロック ## 引数 $dir_name ジャンル名 #************************************************ sub hist_lock{ local($dir_name)=@_; return &file_lock("$dir_name/$GNR{scorehst_cgi}\.lock"); } #************************************************ # ハイスコアファイルの更新終了によるアンロック ## 引数 $dir_name ジャンル名 #************************************************ sub hist_unlock{ local($dir_name)=@_; return &file_unlock("$dir_name/$GNR{scorehst_cgi}\.lock"); } #************************************************ # クッキーから読み込み #************************************************ sub get_cookie{ local(@pairs,$pair,$name,$value); if($imode eq 'mb'){return;} @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair,2); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$SYS{cookie}}); foreach $pair (@pairs) { ($name,$value) = split(/:/,$pair,2); $COOKIE{$name} = $value; } } #************************************************ # クッキーへ書き込み #************************************************ sub set_cookie{ if($imode eq 'mb'){return;} ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 90*24*60*60); $y0='Sunday'; $y1='Monday'; $y2='Tuesday'; $y3='Wednesday'; $y4='Thursday'; $y5='Friday'; $y6='Saturday'; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0='Jan'; $m1='Feb'; $m2='Mar'; $m3='Apr'; $m4='May'; $m5='Jun'; $m6='Jul'; $m7='Aug'; $m8='Sep'; $m9='Oct'; $m10='Nov'; $m11='Dec'; @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); @data=(); foreach(sort{$a cmp $b} keys %COOKIE){ push(@data,"$_\:$COOKIE{$_}"); } $data=join(',',@data); print "Set-Cookie: $SYS{cookie}=$data; expires=$date_gmt\n"; }#このクッキーはだいたい3ヶ月間有効です。 #************************************************ # ファイルのバックアップ処理 ## ## 引数 $file バックアップ元ファイル ## $write 0:蓄積モード 1:上書きモード ## $span バックアップ間隔(日) #************************************************ sub backup_file{ local($file,$write,$span)=@_; #####バックアップ時刻の取得 local($backuptime)=&get_recent_backuptime($file,$write); #####バックアップ間隔を超えていたらバックアップを取る if($now - $backuptime > $span*60*60*24){ ©_file($file,$write); } } #************************************************ # ファイルヘッダの更新時刻を更新 ## ## 1行目に更新時刻を印字する ## ## 引数 $file_name ファイル名 #************************************************ sub renew_date{ local($file_name)=@_; open(DB,"$file_name");local(@list)=<DB>;close(DB); #####1行目に更新時刻が記載されていれば削除する if($list[0]=~ /^date/){$list[0]='';} #####1行目に更新時刻を付け、ファイルに書き込む &write_file($file_name,('date'.time."\n",@list)); } #************************************************ # バックアップファイルを作成 ## ## 引数 $fromfile バックアップ元ファイル ## $LOG{write} 0:蓄積モード 1:上書きモード #************************************************ sub copy_file{ local($fromfile,$LOG{write})=@_; local(@list,$tofile,$max); #####バックアップ先ファイル名を取得する $tofile=&buckup_filename($fromfile,$LOG{write},$update); #####バックアップファイルを作成する open(DB,"$fromfile"); @list=<DB>; close(DB); if($list[0] =~ /^date/){$list[0]='';} if(&write_file($tofile,("date$now\n",@list))){return;} #####作成したバックアップファイル名を返す return $tofile; } #************************************************ # バックアップファイル名を返す ## ## 引数 $fromfile バックアップ元ファイル ## $write 0:蓄積モード 1:上書きモード ## $update 1行目に更新時刻を追加するかどうか #************************************************ sub buckup_filename{ local($fromfile,$write,$update)=@_; local($head,$dir); $max=0; if($fromfile =~ /(.*)\/(.*)\.cgi$/){ $dir="$1/"; $head=$2; }elsif($fromfile =~ /(.*)\.cgi$/){ $head=$1; } #####上書きモードの場合 if($write){ #####バックアップ先ファイル名を返す return "${dir}${head}_bak.cgi"; #####蓄積モードの場合 }else{ #####最新のバックアップファイル番号を取得する opendir(DIR,$FORM{d}); local(@dir_files)=readdir(DIR); close(DIR); foreach $file(@dir_files){ if($file=~ /^${head}_bak(\d+).cgi/){ if($max < $1){$max=$1;} } } $max++; #####バックアップ先ファイル名を返す return "${dir}${head}_bak${max}.cgi"; } } #************************************************ # 最新のバックアップ時刻を取得する ## ## 戻り値 最新バックアップファイルのバックアップ時刻を取得する ## ## 引数 $fromfile バックアップ元ファイル ## $write 0:蓄積モード 1:上書きモード #************************************************ sub get_recent_backuptime{ local($fromfile,$write,$update)=@_; $max=0; local($head,$dir,$backup_file); if($fromfile =~ /(.*)\/(.*)\.cgi$/){ $dir="$1/"; $head=$2; }elsif($fromfile =~ /(.*)\.cgi$/){ $head=$1; } #####上書きモードの場合 if($write){ #####バックアップ先ファイル名を返す $backup_file = "${dir}${head}_bak.cgi"; #####蓄積モードの場合 }else{ #####最新のバックアップファイル番号を取得する opendir(DIR,$FORM{d}); local(@dir_files)=readdir(DIR); close(DIR); foreach $file(@dir_files){ if($file=~ /^${dir}${head}_bak(\d+).cgi/){ if($max < $1){$max=$1;} } } #####バックアップ先ファイル名を返す $backup_file = "${dir}${head}_bak${max}.cgi"; } open (DB,$backup_file); local(@list)=<DB>; close(DB); if($list[0] =~ /^date(\d+)/){ return $1; }else{ return 0; } } #************************************************ # %SYS変数の初期値 #************************************************ sub def_sys{ $SYS{design} ='デフォルトシステムデザイン'; #####メニューページのデザイン名 $SYS{limit} =10; #####プレイヤのログ保護期間(分) $SYS{max_player} =50; #####同時にプレイできる人数(人数×1kbの容量を必要とします) $SYS{cookie} ='QQQ'; #####クッキーID $SYS{quiz_form} =2; #####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型 $SYS{main_title} ='無題'; #####クイズタイトル $SYS{header} ='<table cellspacing=0 cellpadding=0 width="100%"><tr>' .'<td Valign=TOP><small>$top$quiz_op$imode</small></td>' .'<td><div align=right><p><B><BIG>$title</BIG></B></p></div></td></tr></table>'; #####メニューページのヘッダー $SYS{sub_header} ='<table cellspacing=0 cellpadding=0 width="100%"><tr>' .'<td nowarap Valign=TOP><small>$index$challenge$high$graph$score$add</small></td>' .'<td><div align=right><p><big><B>$genre</B>$sub_title<br> </big><br>' .'<span>$mode</span></p></div></td></tr></table>'; $SYS{style} ='BIG{font-size:12pt;}<br>' .'SPAN{font-size:9pt;}<br>' .'SMALL{font-size:8pt;}<br>' .'BODY,TD{font-size:8pt;}'; $SYS{top_message} =''; #####メニューページのメッセージ $SYS{top_table} =1; #####メニューページのコメントのテーブル表記 $SYS{top_url} =''; #####トップぺージへのURL $SYS{easy} =0; #####メニューページの表レイアウトの項目数 $SYS{'time'} ='1'; #####回答時間による高成績者順位付けを行う。0の場合同順位。 $SYS{wrap} ='0'; #####自動文字折り返し $SYS{nocache} =1; #####no-cache設定 1:有り 0:無し $SYS{lag} ='0'; #####サーバー時刻のタイムラグ(単位時間) $SYS{tblw} ='80%'; #####テーブル幅 } #************************************************ # %SYSDESIGN_LST変数の初期値 # # 引数:$dtitle システムデザイン名 #************************************************ sub def_sysdesign{ my($dtitle)=$_[0]; undef(%{$SYSDESIGN_LST{$dtitle}}); $SYSDESIGN_LST{$dtitle}{pc}{sysdesign_title} =$dtitle; #####デザイン名 $SYSDESIGN_LST{$dtitle}{mb}{sysdesign_title} =$dtitle; #####デザイン名 $SYSDESIGN_LST{$dtitle}{pc}{top_wall} =''; #####メニューページの壁紙 $SYSDESIGN_LST{$dtitle}{pc}{top_back_color} ='#ddffdd'; #####メニューページの背景色 $SYSDESIGN_LST{$dtitle}{pc}{top_table_color} ='#ffffdd'; #####メニューページの表の色 $SYSDESIGN_LST{$dtitle}{pc}{top_genre_color} ='#ffffdd'; #####メニューページのジャンル名色 $SYSDESIGN_LST{$dtitle}{pc}{top_info_color} ='#cceeee'; #####メニューページの情報色 $SYSDESIGN_LST{$dtitle}{pc}{top_com_color} ='#ddffff'; #####メニューページのコメント色 $SYSDESIGN_LST{$dtitle}{pc}{top_high_color} ='#ffdddd'; #####メニューページの高成績者色 $SYSDESIGN_LST{$dtitle}{pc}{top_border_color} ='#99ff99'; #####メニューページの表の枠の色 $SYSDESIGN_LST{$dtitle}{pc}{top_text_color} ='#000000'; #####文字色 $SYSDESIGN_LST{$dtitle}{pc}{top_link_color} ='#0000EE'; #####リンク色 $SYSDESIGN_LST{$dtitle}{pc}{top_vlink_color} ='#551A8B'; #####既訪問リンク色 $SYSDESIGN_LST{$dtitle}{pc}{top_border_high} ='1'; #####メニューページの表の高さ $SYSDESIGN_LST{$dtitle}{pc}{top_border} ='2'; #####メニューページの表の幅 $SYSDESIGN_LST{$dtitle}{pc}{top_border_in} ='1'; #####メニューページの表の内幅 $SYSDESIGN_LST{$dtitle}{pc}{a_gif} ='a.gif'; #####履歴グラフ画像1 $SYSDESIGN_LST{$dtitle}{pc}{b_gif} ='b.gif'; #####履歴グラフ画像2 $SYSDESIGN_LST{$dtitle}{pc}{align} ='c'; #####表のレイアウト $SYSDESIGN_LST{$dtitle}{pc}{walign} ='l'; #####表内文字レイアウト } #************************************************ # %GENRE_LSTの初期設定 #************************************************ sub def_genre { my($dir)=$_[0]; $GENRE_LST{$dir}{dir} =$dir; $GENRE_LST{$dir}{design} ='デフォルトジャンルデザイン'; $GENRE_LST{$dir}{title} ='無題'; $GENRE_LST{$dir}{top_comment} =''; $GENRE_LST{$dir}{start_comment} ='<center>$titleにようこそ。現在、挑戦者数は$challenge人です。<br>' .'クイズの総問題数は$quiz_max問で、出題数は$play_max問ですが、<br>' .'$lose_max問間違えるとゲームオーバーです。<br>' .'なお制限時間は$time秒で、正答率$high%以上で合格です。<br>' .'$champion最高成績目指してがんばってください。</center>'; $GENRE_LST{$dir}{mondai_cgi} =''; $GENRE_LST{$dir}{mes_cgi} ="$mes_$dir"; $GENRE_LST{$dir}{mente} =0; $GENRE_LST{$dir}{cont} =1; $GENRE_LST{$dir}{notext} =0; $GENRE_LST{$dir}{direct_cont} =0; $GENRE_LST{$dir}{show_digest} =1; $GENRE_LST{$dir}{show_auth} =1; $GENRE_LST{$dir}{show_genre} =1; $GENRE_LST{$dir}{result_cf} =0; $GENRE_LST{$dir}{result_digest} =0; $GENRE_LST{$dir}{portable_high_num} =10; $GENRE_LST{$dir}{challenge_code} =''; $GENRE_LST{$dir}{1}{mode_name} ="勝ち抜き戦モード"; $GENRE_LST{$dir}{1}{show_ans} =0; $GENRE_LST{$dir}{1}{random} =1; $GENRE_LST{$dir}{1}{quiz_max} =''; $GENRE_LST{$dir}{1}{play_max} =''; $GENRE_LST{$dir}{1}{lose_max} =3; $GENRE_LST{$dir}{1}{time_limit} =60; $GENRE_LST{$dir}{1}{high_border} =80; $GENRE_LST{$dir}{1}{high_cgi} ="$high1_$dir"; $GENRE_LST{$dir}{1}{high_back_day} =0; $GENRE_LST{$dir}{1}{high_back_w} =1; $GENRE_LST{$dir}{1}{scorehst_cgi} ="$hst1_$dir"; $GENRE_LST{$dir}{1}{scorehst_back_day} =0; $GENRE_LST{$dir}{1}{scorehst_back_w} =1; $GENRE_LST{$dir}{1}{graph_border} =20; $GENRE_LST{$dir}{1}{histry_div} =5; $GENRE_LST{$dir}{1}{day_limit} =''; $GENRE_LST{$dir}{1}{num_limit} =''; $GENRE_LST{$dir}{1}{no_limit} =10; $GENRE_LST{$dir}{1}{rec_com} =1; $GENRE_LST{$dir}{1}{double_high} =1; $GENRE_LST{$dir}{1}{bundle} =0; $GENRE_LST{$dir}{1}{show_result} =1; $GENRE_LST{$dir}{2}{mode_name} ="20問モード"; $GENRE_LST{$dir}{2}{show_ans} =0; $GENRE_LST{$dir}{2}{random} =1; $GENRE_LST{$dir}{2}{quiz_max} =''; $GENRE_LST{$dir}{2}{play_max} =20; $GENRE_LST{$dir}{2}{lose_max} =20; $GENRE_LST{$dir}{2}{time_limit} =60; $GENRE_LST{$dir}{2}{high_border} =80; $GENRE_LST{$dir}{2}{high_cgi} ="$high2_$dir"; $GENRE_LST{$dir}{2}{high_back_day} =0; $GENRE_LST{$dir}{2}{high_back_w} =1; $GENRE_LST{$dir}{2}{scorehst_cgi} ="$hst2_$dir"; $GENRE_LST{$dir}{2}{scorehst_back_day} =0; $GENRE_LST{$dir}{2}{scorehst_back_w} =1; $GENRE_LST{$dir}{2}{graph_border} =40; $GENRE_LST{$dir}{2}{histry_div} =2; $GENRE_LST{$dir}{2}{day_limit} =''; $GENRE_LST{$dir}{2}{num_limit} =''; $GENRE_LST{$dir}{2}{no_limit} =10; $GENRE_LST{$dir}{2}{rec_com} =1; $GENRE_LST{$dir}{2}{double_high} =1; $GENRE_LST{$dir}{2}{bundle} =0; $GENRE_LST{$dir}{2}{show_result} =1; } #************************************************ # %DESIGNの初期設定 # # 引数:$dtitle ジャンルデザイン名 #************************************************ sub def_design { my($dtitle)=$_[0]; undef(%{$DESIGN_LST{$dtitle}}); $DESIGN_LST{$dtitle}{pc}{design_title} =$_[0]; $DESIGN_LST{$dtitle}{mb}{design_title} =$_[0]; $DESIGN_LST{$dtitle}{pc}{text_color} ='#000000'; $DESIGN_LST{$dtitle}{pc}{link_color} ='#0000ee'; $DESIGN_LST{$dtitle}{pc}{vlink_color} ='#551A8B'; $DESIGN_LST{$dtitle}{pc}{champ_color} ='#ff0000'; $DESIGN_LST{$dtitle}{pc}{main_color} ='#cccccc'; $DESIGN_LST{$dtitle}{pc}{win_color} ='#ccccff'; $DESIGN_LST{$dtitle}{pc}{lose_color} ='#ffcccc'; $DESIGN_LST{$dtitle}{pc}{com_color} ='#eeeebb'; $DESIGN_LST{$dtitle}{pc}{th_color} ='#bbeebb'; $DESIGN_LST{$dtitle}{pc}{td_color} ='#ddffdd'; $DESIGN_LST{$dtitle}{pc}{border_color} ='#ffdddd'; $DESIGN_LST{$dtitle}{pc}{border_high} ='3'; $DESIGN_LST{$dtitle}{pc}{border} ='1'; $DESIGN_LST{$dtitle}{pc}{border_in} ='2'; $DESIGN_LST{$dtitle}{pc}{win_sign} ='<font color="blue"><big><b>正解!</b></big></font>'; $DESIGN_LST{$dtitle}{mb}{win_sign} ='<font color="blue"><b>正解!</b></font>'; $DESIGN_LST{$dtitle}{pc}{lose_sign} ='<font color="red"><big><b>不正解!</b></big></font>'; $DESIGN_LST{$dtitle}{mb}{lose_sign} ='<font color="red"><b>不正解!</b></font>'; $DESIGN_LST{$dtitle}{pc}{over_sign} ='<font color="red"><big><b>時間オーバー!</b></big></font>'; $DESIGN_LST{$dtitle}{mb}{over_sign} ='<font color="red"><b>時間オーバー!</b></font>'; } #************************************************ # プレイログの初期化 #************************************************ sub def_log{ srand(); if($FORM{m} eq ''){$FORM{m}=1;} $LOG{num} =0; #####問題数 $LOG{win} =0; #####正解数 $LOG{lose} =0; #####不正回数 $LOG{seed} =int(rand(1000)*100+1); #####シーズ $LOG{old} =0; #####前回分回答 $LOG{write} =''; #####ハイスコア登録フラグ $LOG{name} =$COOKIE{N}; #####ハイスコア登録名 $LOG{'time'} =""; #####初回アクセス時刻 $LOG{lap} =$now; #####前回回答時刻 $LOG{last_lap} =0; #####前回回答時間 $LOG{genre} =$FORM{d}; #####ジャンル名 $LOG{mode} =$FORM{m}; #####モード $LOG{ck_s} =$COOKIE{"S$FORM{m}$FORM{d}"}; ##### $LOG{ck_n} =$COOKIE{N}; ##### $LOG{bundle} =$GNR{bundle}; #####一括出題 $LOG{ip} =''; #####IP } #************************************************ # 設問別成績 #************************************************ sub def_qu{ @qu=(); $QU{play_num} =0; #####回答者数 $QU{play_win} =0; #####正解者数 $QU{ave} =0; #####平均正解時間 $QU{ave2} ='0.00'; #####平均正解時間(小数第2位) $QU{win_ratio} ='0.0'; #####正解確率 } #************************************************ # バッファを変数に読み込む #************************************************ sub buf_read { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } if($buffer ne ''){ @pairs = split(/&/,$buffer); foreach $pair (@pairs){ local($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if(($name ne 'newq') &&($name ne 'qqu') &&($name ne 'qas') &&($name ne 'qmas1') &&($name ne 'qmas2') &&($name ne 'qmas3') &&($name ne 'qmas4') &&($name ne 'qac') &&($name ne 'qmac') &&($name ne 'qmac1') &&($name ne 'qmac2') &&($name ne 'qmac3') &&($name ne 'qmac4') &&($name ne 'qcf') &&($name ne 'auth') &&($name ne 'tc') &&($name ne 'stc') &&($name ne 'tmes') &&($name ne 'stl-2') &&($name ne 'iplist')) {$value =~ s/\n//g;} #####名前の登録と、コメントにはhtmlタグは許可しない。 if($name eq 'EntryName' || $name eq 'com' ){ $value =~ s/</</g; $value =~ s/>/>/g; } $value =~ s/\t//g; $value =~ s/\r//g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; &form_to_form2($name); &form_to_form3($name); &form_to_form4($name); if($FORM{j} ne ''){$imode='mb';} if($name =~ /^type_(.*)/){ $FORM{type}=$1; } } } &form_tag; if($buffer ne ''){ return 0; }else{ return 1; } return 0; } #************************************************ # FORM変数の設定 #************************************************ sub form_tag{ #####FORMのヘッダータグのセット if($FORM2{passch} ne ''){ $formop_p ="<input type=hidden name=passch value='$FORM2{passch}'>\n"; } $formop_h ="<form action='$quiz_op_cgi' method='$method' >\n$formop_p"; $formop_hb ="<form action='$quiz_op_cgi' method='$method' target='_blank'>\n$formop_p"; $formop_nh ="<form action='$quiz_op_cgi' method='$method' name=frm>\n$formop_p"; $formop_nhb ="<form action='$quiz_op_cgi' method='$method' name=frm target='_blank'>\n$formop_p"; $form_d ="<input type=hidden name=d value=$FORM{d}>"; $formop_hd ="$formop_h$form_d"; $formop_nhd ="$formop_nh$form_d"; if($FORM{m} eq ''){ $cid="1$FORM{d}"; }else{ $cid="$FORM{m}$FORM{d}"; } if($buffer ne ''){ return 0; }else{ return 1; } } #************************************************ # ジャンル情報ファイルを全ジャンル管理配列に読み込む # # パラメータが1で終わるものはモード1用設定 # パラメータが2で終わるものはモード2用設定 #************************************************ sub all_genre_read { my($dir); #####ジャンル情報ファイルを開く open(DB,$genre_cgi);@genres=<DB>;close(DB); undef %GENRE_LST; @GENRE_DIR_ALL=(); if(($genres[0]=~ /^ver/)||($genres[0] eq '')||($genres[0] eq "\n")){ #####ジャンル情報は、dirキーから始まるので、 #####dirキーが現れる毎に、ジャンル情報をメモリ上にセットする foreach $genre(@genres[1..$#genres]){ $genre=~ s/\n//g; local($key,$val)=split(/\t/,$genre,2); if($key eq 'dir'){ $dir=$val; #####全ジャンルディレクトリの配列に追加 push(@GENRE_DIR_ALL,$dir); #####デフォルトジャンル情報の読み込み &def_genre($dir); }elsif($dir ne ''){ #モード1の設定 if($key =~ /^(.*)1$/){ $GENRE_LST{$dir}{1}{$1}=$val; #モード2の設定 }elsif($key =~ /^(.*)2$/){ $GENRE_LST{$dir}{2}{$1}=$val; #その他の設定 }else{ $GENRE_LST{$dir}{$key}=$val; } } } } #ジャンル情報に関するグローバル配列の初期化 foreach $dir(@GENRE_DIR_ALL){ &set_genre_global_array($dir); } } #************************************************ # デザイン情報ファイルを全デザイン管理配列に読み込む #************************************************ sub all_design_read { my($dtitle); local(%HASH); #####デザイン情報ファイルを開く open(DB,$design_cgi);@designs=<DB>;close(DB); undef %DESIGN; @DESIGN_ALL=(); if(($designs[0]=~ /^ver/)||($designs[0] eq '')||($designs[0] eq "\n")){ #####デザイン情報は、design_titleキーから始まるので、 #####design_titleキーが現れる毎に、ジャンル情報をメモリ上にセットする foreach $line(@designs[1..$#designs]){ $line=~ s/\n//g; local($key,$val)=split(/\t/,$line,2); if($key eq 'design_title'){ $dtitle=$val; #####重複設定読み込み防止 if($HASH{$dtitle} eq ""){ $HASH{$dtitle}='1'; #####全ジャンルデザイン名の配列に追加 push(@DESIGN_ALL,$dtitle); #####デフォルトデザイン情報の読み込み &def_design($dtitle); } }elsif($dtitle ne ''){ #携帯用設定 if($key =~ /^(.*)_m$/){ $DESIGN_LST{$dtitle}{mb}{$1}=$val; #PC用設定 }else{ $DESIGN_LST{$dtitle}{pc}{$key}=$val; } } } } #下位互換用の設定値補完 #色に関する携帯用の設定が無い場合、PC用設定をコピー &design_color_copy(); } #************************************************ # システムデザイン情報ファイルを全デザイン管理配列に読み込む #************************************************ sub all_sysdesign_read { my($dtitle); local(%HASH); #####デザイン情報ファイルを開く open(DB,$sysdesign_cgi);@designs=<DB>;close(DB); undef %SYSDESIGN_LST; @SYSDESIGN_ALL=(); if(($designs[0]=~ /^ver/)||($designs[0] eq '')||($designs[0] eq "\n")){ #####デザイン情報は、sysdesign_titleキーから始まるので、 #####sysdesign_titleキーが現れる毎に、ジャンル情報をメモリ上にセットする foreach $line(@designs[1..$#designs]){ $line=~ s/\n//g; local($key,$val)=split(/\t/,$line,2); if($key eq 'sysdesign_title'){ $dtitle=$val; #####重複設定読み込み防止 if($HASH{$dtitle} eq ""){ $HASH{$dtitle} = 1; #####全システムデザイン名の配列に追加 push(@SYSDESIGN_ALL,$dtitle); #####デフォルトデザイン情報の読み込み &def_sysdesign($dtitle); } }elsif($dtitle ne ''){ #携帯用設定 if($key =~ /^(.*)_m$/){ $SYSDESIGN_LST{$dtitle}{mb}{$1}=$val; #PC用設定 }else{ $SYSDESIGN_LST{$dtitle}{pc}{$key}=$val; } } } } #下位互換用の設定値補完 #色に関する携帯用の設定が無い場合、PC用設定をコピー &sysdesign_color_copy(); } #************************************************ # ジャンル設定用のグローバル配列に値をセット #************************************************ sub set_genre_global_array{ my($dir)=$_[0]; #####ジャンルデザイン使用リストに追加 $DESIGN_USE{$GENRE_LST{$dir}{design}} .="\t$dir"; #####オリジナル問題ファイルを持っているジャンルリストを作成する(工事中含まず) if(($GENRE_LST{$dir}{mente} eq 1)&&($GENRE_LST{$dir}{mondai_cgi} ne '.')&& !($GENRE_LST{$dir}{mondai_cgi} =~ /\//)){ push(@GENRE_DIR_ORIGN,$dir); } #####オリジナル問題ファイルを持っているジャンルリストを作成する(工事中含む) if(($GENRE_LST{$dir}{mondai_cgi} ne '.')&& !($GENRE_LST{$dir}{mondai_cgi} =~ /\//)){ push(@GENRE_DIR_ORIGN_ALL,$dir); } #####メンテ中でないジャンルリスト if($GENRE_LST{$dir}{mente} eq 1){ push(@GENRE_DIR_AVAILABLE,$dir); } } #************************************************ # 特定ジャンル情報を変数に読み込む #************************************************ sub genre_read { my($dir)=$_[0]; #####ジャンル情報ファイルを全ジャンル管理配列に読み込む &all_genre_read; #####指定ジャンルが存在するかチェックする if(!mygrep($dir,@GENRE_DIR_ALL)){ &error(805,'指定したジャンル'); return 1; } #####特定デザインを読み込む &design_read($GENRE_LST{$dir}{design}); #####ジャンルにモード2が無ければ強制的にモード1へ if($GENRE_LST{$dir}{2}{mode_name} eq ''){$FORM{m}=1;} elsif($FORM{m} ne '1' && $FORM{m} ne '2'){$FORM{m}=1;} #####ジャンルモード設定の読み込み undef(%GNR); %GNR =%{$GENRE_LST{$dir}{$FORM{m}}}; #####ジャンルモード設定以外の設定の読み込み foreach $key(keys %{$GENRE_LST{$dir}}){ if($key ne '1' && $key ne '2'){ $GNR{$key}=$GENRE_LST{$dir}{$key}; } } return 0; } #************************************************ # 特定デザイン情報を変数に読み込む #************************************************ sub design_read { local($dtitle)=@_; #####全デザイン情報を読み込む &all_design_read(); #####指定したジャンルデザインが存在しない場合 if(!mygrep($dtitle,@DESIGN_ALL)){ &def_design($dtitle); push(@DESIGN_ALL,$dtitle); #下位互換用の設定値補完 #色に関する携帯用の設定が無い場合、PC用設定をコピー &design_color_copy(); } undef(%DSN); %DSN=%{$DESIGN_LST{$dtitle}{$imode}}; $tbl_opt ="border='$DSN{border_high}' width=100% cellspacing='$DSN{border}' cellpadding='$DSN{border_in}'"; #####ジャンル別ページの表のオプション } #************************************************ # ジャンルデザインの色設定補完 # # 携帯用の色設定が無い場合、PC用の設定をコピー(下位互換用) #************************************************ sub design_color_copy{ my($id,$key); foreach $id(@DESIGN_ALL){ foreach $key(keys ( %{$DESIGN_LST{$id}{pc}})){ if($key =~ /color$/ && $DESIGN_LST{$id}{mb}{$key} eq ''){ $DESIGN_LST{$id}{mb}{$key} = $DESIGN_LST{$id}{pc}{$key}; } } } } #************************************************ # システムデザインの色設定補完 # # 携帯用の色設定が無い場合、PC用の設定をコピー(下位互換用) #************************************************ sub sysdesign_color_copy{ my($dtitle,$key); foreach $dtitle(@SYSDESIGN_ALL){ foreach $key(keys ( %{$SYSDESIGN_LST{$dtitle}{pc}})){ if($key =~ /color$/ && $SYSDESIGN_LST{$dtitle}{mb}{$key} eq ''){ $SYSDESIGN_LST{$dtitle}{mb}{$key} = $SYSDESIGN_LST{$dtitle}{pc}{$key}; } } } } #************************************************ # 設定編集パラメーターの読み込み #************************************************ sub sys_read{ #####デフォルトのシステム情報をメモリ上に読み込む &def_sys; #####システムファイルを開く。なければ新規作成。 if(!open(DB,"$system_cgi")){&make_new_system_dat;} else{ @sys=<DB>;close(DB); #####システム情報をメモリ上に読み込む if(($sys[0] =~ /^ver/)||($sys[0] eq '')||($sys[0] eq "\n")){ foreach(@sys){ $_=~ s/\n//g; local($key,$val)=split(/\t/,$_); $SYS{$key}=$val; } if($SYS{top_junle_color} ne ''){$SYS{top_genre_color}=$SYS{top_junle_color};} } } &def_sysdesign(); &sysdesign_read($SYS{design}); #####このあたり何とかしたい if($SYS{align} eq 'r'){$align1='<div align=right>';$align2='</div>';} elsif($SYS{align} eq 'c'){$align1='<center>';$align2='</center>';} else{$align1='';$align2='';} if($SYS{walign} eq 'r'){$walign1='<div align=right>';$walign2='</div>';} elsif($SYS{walign} eq 'c'){$walign1='<center>';$walign2='</center>';} else{$walign1='';$walign2='';} $style = $SYS{style}; $style=~ s/<br>/\n/g; return 0; } #************************************************ # メニューページのデザインの読み込み #************************************************ sub sysdesign_read{ my($param); local($dtitle)=$SYS{design}; &all_sysdesign_read(); #####指定したシステムデザインが存在しない場合 if(!mygrep($dtitle,@SYSDESIGN_ALL)){ &def_sysdesign($dtitle); #下位互換用の設定値補完 #色に関する携帯用の設定が無い場合、PC用設定をコピー &sysdesign_color_copy(); } foreach $param(keys %{$SYSDESIGN_LST{$dtitle}{$imode}}){ $SYS{$param}=$SYSDESIGN_LST{$dtitle}{$imode}{$param}; } $top_tbl_opt ="border='$SYS{top_border_high}' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'"; #メニューページの表のオプション if($SYS{wrap} eq 0){ $nowrap=' nowrap'; } } #************************************************ # プレイログを読み込む ## ## %LOGと、@genre_dir_use,%genre_numに読み込む #************************************************ sub play_log_read { local(@list,@log); local($quiz_id)=@_; #####プレイログを読み込む open(DB,"$data_dir/$header${quiz_id}.cgi"); @log = <DB>; close(DB); $log[0]=~ s/\n//g; ($LOG{num} #####問題数 ,$LOG{win} #####正解数 ,$LOG{lose} #####不正回数 ,$LOG{seed} #####シーズ ,$LOG{old} #####前回分回答 ,$LOG{write} ##### ,$LOG{name} ##### ,$LOG{'time'} #####初回アクセス時刻 ,$LOG{lap} #####前回回答時刻 ,$LOG{last_lap} #####前回回答時間 ,$LOG{genre} #####ジャンル名 ,$LOG{mode} #####モード ,$LOG{ck_s} ##### ,$LOG{ck_n} ##### ,$LOG{bundle} #####一括出題 ,$LOG{ip} #####IP ) = split(/\t/,$log[0]); ($LOG{sec} ##### ,$LOG{min} ##### )=&score_time($LOG{lap}-$LOG{'time'}); $cid="$LOG{mode}$LOG{genre}"; @genre_dir_use=(); foreach(@log[1..$#log]){ local($genre,$num)=split(/\t/,$_); push(@genre_dir_use,$genre); #####使用するジャンルを記憶 $genre_num{$genre}=$num; #####使用する問題数制限を記憶 } } #************************************************ # 使用ジャンル全てのクイズを読み込み #************************************************ sub quiz_read_all{ my($multiquiz); if($GNR{mondai_cgi} =~ /\// && $GNR{show_genre} ne '0'){ $multiquiz=1; } foreach(@genre_dir_use){ $quiz_num_dir{$_}=$#mondai+1; #####このジャンルからの問題開始番号を格納 &quiz_read($_,$genre_num{$_},$multiquiz); #####問題読み込み $genre_num{$_}=$#mondai + 1 - $quiz_num_dir{$_}; #####このジャンルの問題数を格納 } } #************************************************ # 指定ジャンルのクイズ追加関数 ## ## 引数 $dir_name ディレクトリ名 ## $maxnum 読み込み問題制限数 ## $multi 総合問題ジャンルフラグ ## $file_name 問題ファイル名(nullならデフォルトファイル名) #************************************************ sub quiz_read{ local($dir_name,$maxnum,$multi,$file_name)=@_; local(@lines,$line,$max,$i); #####ファイル名の決定 if($file_name eq ''){$file_name = "$mondai_$dir_name\.cgi";} open(DB,"$dir_name/$file_name");@lines=<DB>;close(DB); if($maxnum ne ''){ if($maxnum > $#lines+1){$maxnum=$#lines + 1;} elsif($maxnum < 0){$maxnum=$#lines + 1;} }else{$maxnum=$#lines + 1;} $i=0; foreach $line(@lines){ $line=~ s/\n//g; if($line eq '') {next;} #####空行ならとばす if($line=~ /^#/){next;} #####「#」から始まる行はコメント行 if($i >= $maxnum) {last;} #####最大読み込み行による制限 $i++; local($mondai,$ans,$misans1,$misans2,$misans3,$misans4,$anscom,$misanscom,$cf,$digest,$misanscom1,$misanscom2,$misanscom3,$misanscom4,$anstype,$author,$misanscorrect1,$misanscorrect2,$misanscorrect3,$misanscorrect4)=split(/\t/,$line); #####問題情報をメモリ上に読み込む if($multi > 0){ #####総合問題ジャンルは、問題文にジャンル名を付加する push(@mondai,"$mondai<br><div align=right>【$GENRE_LST{$dir_name}{title}】より</div>"); }else{push(@mondai,$mondai);} push(@ans,$ans); push(@misans1,$misans1); push(@misans2,$misans2); push(@misans3,$misans3); push(@misans4,$misans4); push(@anscom,$anscom); push(@misanscom,$misanscom); push(@cf,$cf); push(@digest,$digest); push(@misanscom1,$misanscom1); push(@misanscom2,$misanscom2); push(@misanscom3,$misanscom3); push(@misanscom4,$misanscom4); push(@anstype,$anstype); push(@author,$author); push(@misanscorrect1,($misanscorrect1 eq '1') ? 1 : 0); push(@misanscorrect2,($misanscorrect2 eq '1') ? 1 : 0); push(@misanscorrect3,($misanscorrect3 eq '1') ? 1 : 0); push(@misanscorrect4,($misanscorrect4 eq '1') ? 1 : 0); } } #************************************************ # 設問別成績ファイルの読み込み #************************************************ sub quiz_log_read{ #####設問番号の取得 $QU{dir} = &get_question_dir($quiz_index); $QU{index} = $quiz_index - $quiz_num_dir{$QU{dir}}; &def_qu(); #####ファイルの読み込み if (open(DB,$QU{dir}."/$quiz_header$QU{index}\.cgi")){ local(@log)= <DB>; close(DB); #####選択肢別選択人数の取得 $log[0] =~ s/\n//g; @qu = split(/\t/, $log[0]); for($i=0;$i<5;$i++){ $qu[$i]=$qu[$i]+0; } #####平均正解時間と回答者数の取得 $log[1] =~ s/\n//g; ($QU{ave},$QU{play_num},$QU{play_win}) = split(/\t/,$log[1]); $QU{play_num}=$QU{play_num}+0; $QU{ave}=$QU{ave}+0; #####その他項目の導出 &quiz_log_calc(); } } #************************************************ # 設問別成績の計算 #************************************************ sub quiz_log_calc{ #####平均正解時間と正解者数の取得 if($QU{ave} eq ''){$QU{ave}='0';} #####正解者数の取得 if($QU{play_win} eq ''){ $QU{play_win} = $qu[0]+0; } #####正解率の取得 if($QU{play_num} > 0){ $QU{win_ratio}=&point($QU{play_win}*100/$QU{play_num},1); } #####平均正解時間(小数第2位)の取得 $QU{ave2}=&point($QU{ave},2); } ##genre_array_to_form ##form_to_genre_array ##genre_array_to_line ##sys_to_system_dat ##sys_to_form ##form_to_sys ##quiz_array_to_form ##push_quiz_palam ##mes_dat_to_form #************************************************ # %SYSから%FORMへ #************************************************ sub sys_to_form{ $FORM{sdes} =$SYS{design}; $FORM{li} =$SYS{limit}; #####プレイヤのログ保護期間(分) $FORM{mp} =$SYS{max_player}; #####同時にプレイできる人数(人数×1kbの容量を必要とします) $FORM{cok} =$SYS{cookie}; #####クッキーID $FORM{qf} =$SYS{quiz_form}; #####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型 $FORM{"qf-$SYS{quiz_form}"} =' checked'; $FORM{mt} =$SYS{main_title}; $FORM{hd} =$SYS{header}; $FORM{shd} =$SYS{sub_header}; if($SYS{style} eq ''){$FORM{'stl-2'}='BIG{font-size:12pt;}<br>SPAN{font-size:9pt;}<br>SMALL{font-size:8pt;}<br>BODY,TD{font-size:8pt;}';$FORM{'stl-0'}=' checked';} else{$FORM{'stl-2'}=$SYS{style};$FORM{'stl-1'}=' checked';} $FORM{tmes} =$SYS{top_message}; $FORM{tu} =$SYS{top_url}; $FORM{"tt-$SYS{top_table}"} =' checked'; $FORM{"ey-$SYS{easy}"} =' checked'; $FORM{"rt-$SYS{'time'}"} =' checked'; $FORM{wr} =$wrap{$id}; $FORM{"wr-$SYS{wrap}"} =' checked'; $FORM{lag} =$SYS{lag}; $FORM{tblw} =$SYS{tblw}; $FORM{"nc-$SYS{nocache}"} =' checked'; } #************************************************ # メモリ上のgenre配列を、%FORMにセットする #************************************************ sub genre_array_to_form{ $dir=$FORM{d}; $FORM{gdes} =$GENRE_LST{$dir}{design}; $FORM{t} =$GENRE_LST{$dir}{title}; $FORM{tc} =$GENRE_LST{$dir}{top_comment}; $FORM{stc} =$GENRE_LST{$dir}{start_comment}; if($GENRE_LST{$dir}{mondai_cgi} eq '.'){ $FORM{md}=1; $FORM{'md-1'}=' checked'; foreach(@GENRE_DIR_ALL){ if(($dir eq $_)||($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;} $FORM2{"smd-$_"}='all'; } }elsif($GENRE_LST{$dir}{mondai_cgi} =~ /\//){ $FORM{'md-1'}=' checked'; @mondai_dat=split(/\t/,$GENRE_LST{$dir}{mondai_cgi}); foreach(@mondai_dat){ local($d,$val)=split(/\//,$_); $FORM2{"smd-$d"}=$val; } }else{ $FORM{'md-0'}=' checked'; foreach(@GENRE_DIR_ALL){ if(($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;} &refresh_quiz; &quiz_read($_); $FORM2{"smd-$_"}=$#mondai+1; } } $FORM{me} =$GENRE_LST{$dir}{mente}; $FORM{ct} =$GENRE_LST{$dir}{cont}; $FORM{nt} =$GENRE_LST{$dir}{notext}; $FORM{dc} =$GENRE_LST{$dir}{direct_cont}; $FORM{sd} =$GENRE_LST{$dir}{show_digest}; $FORM{ath} =$GENRE_LST{$dir}{show_auth}; $FORM{sgr} =$GENRE_LST{$dir}{show_genre}; $FORM{rcf} =$GENRE_LST{$dir}{result_cf}; $FORM{rdg} =$GENRE_LST{$dir}{result_digest}; $FORM{phn} =$GENRE_LST{$dir}{portable_high_num}; $FORM{ccd} =$GENRE_LST{$dir}{challenge_code}; foreach $mod(1,2){ $FORM{"mn$mod"} =$GENRE_LST{$dir}{$mod}{mode_name}; $FORM{"sa$mod"} =$GENRE_LST{$dir}{$mod}{show_ans}; $FORM{"sr$mod"} =$GENRE_LST{$dir}{$mod}{show_result}; $FORM{"r$mod"} =$GENRE_LST{$dir}{$mod}{random}; if($GENRE_LST{$dir}{$mod}{quiz_max} eq ''){ $FORM{"qm$mod-1"}=' checked'; }else{ $FORM{"qm$mod-0"}=' checked'; $FORM{"qm$mod-2"}=$GENRE_LST{$dir}{$mod}{quiz_max}; } if($GENRE_LST{$dir}{$mod}{play_max} eq ''){ $FORM{"pm$mod-1"}=' checked'; }else{ $FORM{"pm$mod-0"}=' checked'; $FORM{"pm$mod-2"}=$GENRE_LST{$dir}{$mod}{play_max}; } if($GENRE_LST{$dir}{$mod}{lose_max} eq ''){ $FORM{"lm$mod-1"}=' checked'; }else{ $FORM{"lm$mod-0"}=' checked'; $FORM{"lm$mod-2"}=$GENRE_LST{$dir}{$mod}{lose_max}; } if($GENRE_LST{$dir}{$mod}{time_limit} eq ''){ $FORM{"tl$mod-1"}=' checked'; $FORM{"tl$mod-2"}=60; }else{ $FORM{"tl$mod-0"}=' checked'; $FORM{"tl$mod-2"}=$GENRE_LST{$dir}{$mod}{time_limit}; } $FORM{"hb$mod"} =$GENRE_LST{$dir}{$mod}{high_border}; if($GENRE_LST{$dir}{$mod}{high_back_day} > 0){ $FORM{"hbu$mod-1"}=' checked'; $FORM{"hbu$mod-2"}=$GENRE_LST{$dir}{$mod}{high_back_day}; }else{ $FORM{"hbu$mod-0"}=' checked'; $FORM{"hbu$mod-2"}=30; } $FORM{"hbw$mod"} =$GENRE_LST{$dir}{$mod}{high_back_w}; if($GENRE_LST{$dir}{$mod}{scorehst_back_day} > 0){ $FORM{"sbu$mod-1"}=' checked'; $FORM{"sbu$mod-2"}=$GENRE_LST{$dir}{$mod}{scorehst_back_day}; }else{ $FORM{"sbu$mod-0"}=' checked'; $FORM{"sbu$mod-2"}=30; } $FORM{"sbw$mod"} =$GENRE_LST{$dir}{$mod}{scorehst_back_w}; $FORM{"gb$mod"} =$GENRE_LST{$dir}{$mod}{graph_border}; $FORM{"hd$mod"} =$GENRE_LST{$dir}{$mod}{histry_div}; if($GENRE_LST{$dir}{$mod}{day_limit} eq ''){ $FORM{"dl$mod-1"}=' checked'; $FORM{"dl$mod-2"}=30; }else{ $FORM{"dl$mod-0"}=' checked'; $FORM{"dl$mod-2"}=$GENRE_LST{$dir}{$mod}{day_limit}; } if($GENRE_LST{$dir}{$mod}{num_limit} eq ''){ $FORM{"nl$mod-1"}=' checked'; $FORM{"nl$mod-2"}=100; }else{ $FORM{"nl$mod-0"}=' checked'; $FORM{"nl$mod-2"}=$GENRE_LST{$dir}{$mod}{num_limit}; } $FORM{"no$mod"} =$GENRE_LST{$dir}{$mod}{no_limit}; $FORM{"rc$mod"} =$GENRE_LST{$dir}{$mod}{rec_com}; $FORM{"dh$mod"} =$GENRE_LST{$dir}{$mod}{double_high}; $FORM{"bd$mod"} =$GENRE_LST{$dir}{$mod}{bundle}; } &form_to_form; } #************************************************ # %SYSDESIGN_LSTから%FORMへ #************************************************ sub sysdesign_to_form{ local($id)=@_; my(%mob); $mob{mb}='_m'; foreach $pc('pc','mb'){ $FORM{"tw".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_wall}; $FORM{"tbc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_back_color}; $FORM{"ttc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_table_color}; $FORM{"tjc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_genre_color}; $FORM{"tic".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_info_color}; $FORM{"tcc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_com_color}; $FORM{"thc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_high_color}; $FORM{"tbdc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_border_color}; $FORM{"txc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_text_color}; $FORM{"lc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_link_color}; $FORM{"vc".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_vlink_color}; $FORM{"tbdh".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_border_high}; $FORM{"tbd".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_border}; $FORM{"tbdi".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{top_border_in}; $FORM{"ag".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{a_gif}; $FORM{"bg".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{b_gif}; $FORM{"al".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{align}; $FORM{"al-".$SYSDESIGN_LST{$id}{$pc}{align}.$mob{$pc}} =' checked'; $FORM{"wal".$mob{$pc}} =$SYSDESIGN_LST{$id}{$pc}{walign}; $FORM{"wal-".$SYSDESIGN_LST{$id}{$pc}{walign}.$mob{$pc}} =' checked'; } } #************************************************ # %DESIGNから%FORMへ #************************************************ sub design_to_form{ local($id)=@_; my(%mob); $mob{mb}='_m'; foreach $pc('pc','mb'){ $FORM{"gtc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{text_color}; $FORM{"glc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{link_color}; $FORM{"gvc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{vlink_color}; $FORM{"gcc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{champ_color}; $FORM{"gmc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{main_color}; $FORM{"gwi".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{win_color}; $FORM{"glo".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{lose_color}; $FORM{"gcm".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{com_color}; $FORM{"thc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{th_color}; $FORM{"tdc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{td_color}; $FORM{"bdc".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{border_color}; $FORM{"bdh".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{border_high}; $FORM{"bd".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{border}; $FORM{"bdi".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{border_in}; $FORM{"gw".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{wall}; $FORM{"gww".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{win_wall}; $FORM{"glw".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{lose_wall}; $FORM{"wsg".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{win_sign}; $FORM{"lsg".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{lose_sign}; $FORM{"osg".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{over_sign}; $FORM{"wmd".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{win_midi}; $FORM{"lmd".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{lose_midi}; $FORM{"emd".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{end_midi}; $FORM{"hmd".$mob{$pc}} =$DESIGN_LST{$id}{$pc}{high_midi}; } } #************************************************ # メモリ上の問題情報を、問題入力form用変数にセットする #************************************************ sub quiz_array_to_form{ local($quiz_num)=$FORM{qn}-1; $FORM{qqu} =$mondai[$quiz_num]; $FORM{qas} =$ans[$quiz_num]; $FORM{qmas1} =$misans1[$quiz_num]; $FORM{qmas2} =$misans2[$quiz_num]; $FORM{qmas3} =$misans3[$quiz_num]; $FORM{qmas4} =$misans4[$quiz_num]; $FORM{qac} =$anscom[$quiz_num]; $FORM{qmac} =$misanscom[$quiz_num]; $FORM{qcf} =$cf[$quiz_num]; $FORM{qdg} =$digest[$quiz_num]; $FORM{qmac1} =$misanscom1[$quiz_num]; $FORM{qmac2} =$misanscom2[$quiz_num]; $FORM{qmac3} =$misanscom3[$quiz_num]; $FORM{qmac4} =$misanscom4[$quiz_num]; $FORM{atype} =$anstype[$quiz_num]; $FORM{auth} =$author[$quiz_num]; $FORM{qmasc1} =$misanscorrect1[$quiz_num]; $FORM{qmasc2} =$misanscorrect2[$quiz_num]; $FORM{qmasc3} =$misanscorrect3[$quiz_num]; $FORM{qmasc4} =$misanscorrect4[$quiz_num]; } #************************************************ # %FORMから%SYSへ #************************************************ sub form_to_sys{ $SYS{design} =$FORM{sdes}; #####システムデザインID $SYS{limit} =$FORM{li}; #####プレイヤのログ保護期間(分) $SYS{max_player} =$FORM{mp}; #####同時にプレイできる人数(人数×1kbの容量を必要とします) $SYS{cookie} =$FORM{cok}; #####クッキーID $SYS{quiz_form} =$FORM{qf}; #####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型 $SYS{main_title} =$FORM{mt}; #####メニューページのタイトル $SYS{header} =$FORM{hd}; #####メニューページのヘッダー $SYS{sub_header} =$FORM{shd}; #####サブページのヘッダー if($FORM{stl} eq '1'){$SYS{style}=$FORM4{'stl-2'};} else{$SYS{style}='';} #####スタイルシート $SYS{top_message} =$FORM4{tmes}; #####メニューページのコメント $SYS{top_table} =$FORM{tt}; #####メニューページのコメントのtable表記 $SYS{top_url} =$FORM{tu}; #####トップページへのURL $SYS{easy} =$FORM{ey}; #####メニューページの表示項目 $SYS{'time'} =$FORM{rt}; #####メニューページの表示項目 $SYS{wrap} =$FORM{wr}; #####自動改行 $SYS{lag} =$FORM{lag}; #####サーバー時刻とのタイムラグ $SYS{tblw} =$FORM{tblw}; #####表の幅 $SYS{nocache} =$FORM{nc}; #####no-cache設定 } #************************************************ # %FORMの内容を、メモリ上のgenre配列にセットする #************************************************ sub form_to_genre_array{ $dir=$FORM{d}; $GENRE_LST{$dir}{design} =$FORM{gdes}; $GENRE_LST{$dir}{title} =$FORM{t}; $GENRE_LST{$dir}{top_comment} =$FORM4{tc}; $GENRE_LST{$dir}{start_comment} =$FORM4{stc}; $GENRE_LST{$dir}{mondai_cgi} =''; if($FORM{md}){ foreach(@GENRE_DIR_ALL){ if(($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)||($FORM{"smd-$_"} eq '')){next;} $GENRE_LST{$dir}{mondai_cgi}.="$_\/".$FORM{"smd-$_"}."\t"; } } $GENRE_LST{$dir}{mente} =$FORM{me}; $GENRE_LST{$dir}{cont} =$FORM{ct}; $GENRE_LST{$dir}{notext} =$FORM{nt}; $GENRE_LST{$dir}{direct_cont} =$FORM{dc}; $GENRE_LST{$dir}{show_digest} =$FORM{sd}; $GENRE_LST{$dir}{show_auth} =$FORM{ath}; $GENRE_LST{$dir}{show_genre} =$FORM{sgr}; $GENRE_LST{$dir}{result_cf} =$FORM{rcf}; $GENRE_LST{$dir}{result_digest} =$FORM{rdg}; $GENRE_LST{$dir}{portable_high_num} =$FORM{phn}; $GENRE_LST{$dir}{challenge_code} =$FORM{ccd}; foreach $mod(1,2){ $GENRE_LST{$dir}{$mod}{mode_name} =$FORM{"mn$mod"}; $GENRE_LST{$dir}{$mod}{show_ans} =$FORM{"sa$mod"}; $GENRE_LST{$dir}{$mod}{show_result} =$FORM{"sr$mod"}; $GENRE_LST{$dir}{$mod}{random} =$FORM{"r$mod"}; if($FORM{"hbu$mod"}){ $GENRE_LST{$dir}{$mod}{high_back_day}=$FORM{"hbu$mod-2"}; }else{ $GENRE_LST{$dir}{$mod}{high_back_day}='0'; } $GENRE_LST{$dir}{$mod}{high_back_w} =$FORM{"hbw$mod"}; if($FORM{"dl$mod"}){ $GENRE_LST{$dir}{$mod}{day_limit}=''; }else{ $GENRE_LST{$dir}{$mod}{day_limit}=$FORM{"dl$mod-2"}; } if($FORM{"nl$mod"}){ $GENRE_LST{$dir}{$mod}{num_limit}=''; }else{ $GENRE_LST{$dir}{$mod}{num_limit}=$FORM{"nl$mod-2"}; } $GENRE_LST{$dir}{$mod}{no_limit}=$FORM{"no$mod"}; $GENRE_LST{$dir}{$mod}{rec_com}=$FORM{"rc$mod"}; $GENRE_LST{$dir}{$mod}{double_high} =$FORM{"dh$mod"}; $GENRE_LST{$dir}{$mod}{bundle} =$FORM{"bd$mod"}; if($FORM{"sbu$mod"}){ $GENRE_LST{$dir}{$mod}{scorehst_back_day}=$FORM{"sbu$mod-2"}; }else{ $GENRE_LST{$dir}{$mod}{scorehst_back_day}='0'; } $GENRE_LST{$dir}{$mod}{scorehst_back_w} =$FORM{"sbw$mod"}; $GENRE_LST{$dir}{$mod}{graph_border} =$FORM{"gb$mod"}; $GENRE_LST{$dir}{$mod}{histry_div} =$FORM{"hd$mod"}; if($FORM{"qm$mod"}){ $GENRE_LST{$dir}{$mod}{quiz_max}=''; }else{ $GENRE_LST{$dir}{$mod}{quiz_max}=$FORM{"qm$mod-2"}; } if($FORM{"pm$mod"}){ $GENRE_LST{$dir}{$mod}{play_max}=''; }else{ $GENRE_LST{$dir}{$mod}{play_max}=$FORM{"pm$mod-2"}; } if($FORM{"lm$mod"}){ $GENRE_LST{$dir}{$mod}{lose_max}=''; }else{ $GENRE_LST{$dir}{$mod}{lose_max}=$FORM{"lm$mod-2"}; } if($FORM{"tl$mod"}){ $GENRE_LST{$dir}{$mod}{time_limit}=''; }else{ $GENRE_LST{$dir}{$mod}{time_limit}=$FORM{"tl$mod-2"}; } $GENRE_LST{$dir}{$mod}{high_border} =$FORM{"hb$mod"}; } } #************************************************ # %FORMからメモリ上のsysdesign配列にセットする #************************************************ sub form_to_sysdesign_array{ $id=$FORM{sdt}; my(%mob); $mob{mb}='_m'; foreach $pc('pc','mb'){ $SYSDESIGN_LST{$id}{$pc}{sysdesign_title} =$FORM{"sdt".$mob{$pc}}; #####システムデザイン $SYSDESIGN_LST{$id}{$pc}{top_wall} =$FORM{"tw".$mob{$pc}}; #####メニューページの壁紙 $SYSDESIGN_LST{$id}{$pc}{top_back_color} =$FORM{"tbc".$mob{$pc}}; #####メニューページの背景色 $SYSDESIGN_LST{$id}{$pc}{top_table_color} =$FORM{"ttc".$mob{$pc}}; #####メニューページの表の色 $SYSDESIGN_LST{$id}{$pc}{top_genre_color} =$FORM{"tjc".$mob{$pc}}; #####メニューページのジャンル名色 $SYSDESIGN_LST{$id}{$pc}{top_info_color} =$FORM{"tic".$mob{$pc}}; #####メニューページの情報色 $SYSDESIGN_LST{$id}{$pc}{top_com_color} =$FORM{"tcc".$mob{$pc}}; #####メニューページのコメント色 $SYSDESIGN_LST{$id}{$pc}{top_high_color} =$FORM{"thc".$mob{$pc}}; #####メニューページの高成績者色 $SYSDESIGN_LST{$id}{$pc}{top_border_color} =$FORM{"tbdc".$mob{$pc}}; #####メニューページの枠の色 $SYSDESIGN_LST{$id}{$pc}{top_text_color} =$FORM{"txc".$mob{$pc}}; #####文字色 $SYSDESIGN_LST{$id}{$pc}{top_link_color} =$FORM{"lc".$mob{$pc}}; #####リンク色 $SYSDESIGN_LST{$id}{$pc}{top_vlink_color} =$FORM{"vc".$mob{$pc}}; #####既訪問リンク色 $SYSDESIGN_LST{$id}{$pc}{top_border_high} =$FORM{"tbdh".$mob{$pc}}; #####メニューページの枠の高さ $SYSDESIGN_LST{$id}{$pc}{top_border} =$FORM{"tbd".$mob{$pc}}; #####メニューページの枠の幅 $SYSDESIGN_LST{$id}{$pc}{top_border_in} =$FORM{"tbdi".$mob{$pc}}; #####メニューページの枠の内幅 $SYSDESIGN_LST{$id}{$pc}{a_gif} =$FORM{"ag".$mob{$pc}}; #####成績履歴画像1 $SYSDESIGN_LST{$id}{$pc}{b_gif} =$FORM{"bg".$mob{$pc}}; #####成績履歴画像2 $SYSDESIGN_LST{$id}{$pc}{align} =$FORM{"al".$mob{$pc}}; #####表レイアウト $SYSDESIGN_LST{$id}{$pc}{walign} =$FORM{"wal".$mob{$pc}}; #####表内文字レイアウト } } #************************************************ # %FORMからメモリ上のdesign配列にセットする #************************************************ sub form_to_design_array{ $id=$FORM{gdt}; my(%mob); $mob{mb}='_m'; foreach $pc('pc','mb'){ $DESIGN_LST{$id}{$pc}{design_title} =$FORM{"gdt".$mob{$pc}}; #####デザイン名 $DESIGN_LST{$id}{$pc}{text_color} =$FORM{"gtc".$mob{$pc}}; #####文字色 $DESIGN_LST{$id}{$pc}{link_color} =$FORM{"glc".$mob{$pc}}; #####リンク文字色 $DESIGN_LST{$id}{$pc}{vlink_color} =$FORM{"gvc".$mob{$pc}}; #####既訪問リンク文字色 $DESIGN_LST{$id}{$pc}{champ_color} =$FORM{"gcc".$mob{$pc}}; #####殿堂入り者色 $DESIGN_LST{$id}{$pc}{main_color} =$FORM{"gmc".$mob{$pc}}; #####基本背景色 $DESIGN_LST{$id}{$pc}{win_color} =$FORM{"gwi".$mob{$pc}}; #####正解時背景色 $DESIGN_LST{$id}{$pc}{lose_color} =$FORM{"glo".$mob{$pc}}; #####不正解時背景色 $DESIGN_LST{$id}{$pc}{com_color} =$FORM{"gcm".$mob{$pc}}; #####情報ウインドウの色 $DESIGN_LST{$id}{$pc}{th_color} =$FORM{"thc".$mob{$pc}}; #####表のヘッダー色 $DESIGN_LST{$id}{$pc}{td_color} =$FORM{"tdc".$mob{$pc}}; #####表の色 $DESIGN_LST{$id}{$pc}{border_color} =$FORM{"bdc".$mob{$pc}}; #####表の枠の色 $DESIGN_LST{$id}{$pc}{border_high} =$FORM{"bdh".$mob{$pc}}; #####表の枠の高さ $DESIGN_LST{$id}{$pc}{border} =$FORM{"bd".$mob{$pc}}; #####表の枠の幅 $DESIGN_LST{$id}{$pc}{border_in} =$FORM{"bdi".$mob{$pc}}; #####表の枠の内幅 $DESIGN_LST{$id}{$pc}{wall} =$FORM{"gw".$mob{$pc}}; #####基本壁紙 $DESIGN_LST{$id}{$pc}{win_wall} =$FORM{"gww".$mob{$pc}}; #####正解時壁紙 $DESIGN_LST{$id}{$pc}{lose_wall} =$FORM{"glw".$mob{$pc}}; #####不正解時壁紙 $DESIGN_LST{$id}{$pc}{win_sign} =$FORM{"wsg".$mob{$pc}}; #####正解表示 $DESIGN_LST{$id}{$pc}{lose_sign} =$FORM{"lsg".$mob{$pc}}; #####不正解表示 $DESIGN_LST{$id}{$pc}{over_sign} =$FORM{"osg".$mob{$pc}}; #####タイムオーバー表示 $DESIGN_LST{$id}{$pc}{win_midi} =$FORM{"wmd".$mob{$pc}}; #####正解時MIDI $DESIGN_LST{$id}{$pc}{lose_midi} =$FORM{"lmd".$mob{$pc}}; #####不正解時MIDI $DESIGN_LST{$id}{$pc}{end_midi} =$FORM{"emd".$mob{$pc}}; #####クイズ終了時MIDI $DESIGN_LST{$id}{$pc}{high_midi} =$FORM{"hmd".$mob{$pc}}; #####高成績者用MIDI } } #************************************************ # dirから、genre.cgi用のログを返す #************************************************ sub genre_array_to_line{ local($dir)=@_; local($id,$ret,$mod); foreach $id('dir' ,'design' ,'title' ,'top_comment' ,'start_comment' ,'mondai_cgi' ,'mente' ,'cont' ,'notext' ,'direct_cont' ,'show_digest' ,'show_auth' ,'show_genre' ,'result_cf' ,'result_digest' ,'portable_high_num' ,'challenge_code' ){ $ret.="$id\t".$GENRE_LST{$dir}{$id}."\n"; } foreach $mod (1,2){ foreach $id('mode_name' ,'show_ans' ,'random' ,'quiz_max' ,'play_max' ,'lose_max' ,'time_limit' ,'high_border' ,'high_back_day' ,'high_back_w' ,'scorehst_back_day' ,'scorehst_back_w' ,'graph_border' ,'histry_div' ,'day_limit' ,'num_limit' ,'no_limit' ,'rec_com' ,'double_high' ,'bundle' ,'show_result' ){ $ret.="$id$mod\t".$GENRE_LST{$dir}{$mod}{$id}."\n"; } } return $ret; } #************************************************ # idから、sysdesign.cgi用のログを返す #************************************************ sub sysdesign_array_to_line{ local($dtitle)=@_; local($id,$ret,$pc,%mob); $mob{mb}='_m'; foreach $id('sysdesign_title' ,'top_border_high' ,'top_border' ,'top_border_in' ,'top_table_color' ,'top_genre_color' ,'top_info_color' ,'top_com_color' ,'top_high_color' ,'top_border_color' ,'a_gif' ,'b_gif' ,'align' ,'walign' ){ $ret.="$id\t".$SYSDESIGN_LST{$dtitle}{pc}{$id}."\n"; } foreach $pc ('pc','mb'){ foreach $id('top_wall' ,'top_back_color' ,'top_text_color' ,'top_link_color' ,'top_vlink_color' ){ $ret.="$id$mob{$pc}\t".$SYSDESIGN_LST{$dtitle}{$pc}{$id}."\n"; } } return $ret; } #************************************************ # idから、design.cgi用のログを返す #************************************************ sub design_array_to_line{ local($dtitle)=@_; local($id,$ret,$pc,%mob); $mob{mb}='_m'; foreach $id('design_title' ,'com_color' ,'th_color' ,'td_color' ,'border_color' ,'border_high' ,'border' ,'border_in' ,'win_midi' ,'lose_midi' ,'end_midi' ,'high_midi' ){ $ret.="$id\t".$DESIGN_LST{$dtitle}{pc}{$id}."\n"; } foreach $pc ('pc','mb'){ foreach $id('text_color' ,'link_color' ,'vlink_color' ,'champ_color' ,'main_color' ,'win_color' ,'lose_color' ,'wall' ,'win_wall' ,'lose_wall' ,'win_sign' ,'lose_sign' ,'over_sign' ){ $ret.="$id$mob{$pc}\t".$DESIGN_LST{$dtitle}{$pc}{$id}."\n"; } } return $ret; } #************************************************ # %SYSからsystem.dat形式の出力 #************************************************ sub sys_to_system_dat{ local($return);$return="ver2\n"; foreach( 'design' ,'limit' ,'max_player' ,'cookie' ,'quiz_form' ,'main_title' ,'header' ,'sub_header' ,'style' ,'top_message' ,'top_table' ,'top_url' ,'easy' ,'time' ,'wrap' ,'lag' ,'tblw' ,'nocache' ){ $return.="$_\t$SYS{$_}\n"; } return $return; } #************************************************ # 引数を、メモリ上の問題配列変数に格納 #************************************************ sub push_quiz_palam{ local($mondai,$ans,$misans1,$misans2,$misans3,$misans4,$anscom,$misanscom,$cf,$digest,$misanscom1,$misanscom2,$misanscom3,$misanscom4,$anstype,$author,$misanscorrect1,$misanscorrect2,$misanscorrect3,$misanscorrect4)=@_; if($anstype ne 2){ $misanscorrect1=''; $misanscorrect2=''; $misanscorrect3=''; $misanscorrect4=''; }else{ $misanscom1=''; $misanscom2=''; $misanscom3=''; $misanscom4=''; } push(@mondai,$mondai); push(@ans,$ans); push(@misans1,$misans1); push(@misans2,$misans2); push(@misans3,$misans3); push(@misans4,$misans4); push(@anscom,$anscom); push(@misanscom,$misanscom); push(@cf,$cf); push(@digest,$digest); push(@misanscom1,$misanscom1); push(@misanscom2,$misanscom2); push(@misanscom3,$misanscom3); push(@misanscom4,$misanscom4); push(@anstype,$anstype); push(@author,$author); push(@misanscorrect1,($misanscorrect1 eq '1') ? 1 : 0); push(@misanscorrect2,($misanscorrect2 eq '1') ? 1 : 0); push(@misanscorrect3,($misanscorrect3 eq '1') ? 1 : 0); push(@misanscorrect4,($misanscorrect4 eq '1') ? 1 : 0); } #************************************************ # 問題配列から、問題ファイル用ログを返す #************************************************ sub quiz_to_line{ local($ret); local($id,$num)=@_; if($num ne ''){ $ret=('#' x 5) ."$num".('#' x 5)."\n"; } if($anstype[$id] ne 2){ $misanscorrect1[$id]=0; $misanscorrect2[$id]=0; $misanscorrect3[$id]=0; $misanscorrect4[$id]=0; }else{ $misanscom1[$id]=''; $misanscom2[$id]=''; $misanscom3[$id]=''; $misanscom4[$id]=''; } $ret.=join("\t",$mondai[$id],$ans[$id],$misans1[$id],$misans2[$id],$misans3[$id],$misans4[$id],$anscom[$id],$misanscom[$id],$cf[$id],$digest[$id],$misanscom1[$id],$misanscom2[$id],$misanscom3[$id],$misanscom4[$id],$anstype[$id],$author[$id],$misanscorrect1[$id],$misanscorrect2[$id],$misanscorrect3[$id],$misanscorrect4[$id],"\n"); return $ret; } #************************************************ # 終了時メッセージパラメータ読み込み #************************************************ sub mes_dat_to_form{ unless(-f "$FORM{d}/$GENRE_LST{$FORM{d}}{mes_cgi}\.cgi"){&make_mes_cgi;} open(DB,"$FORM{d}/$GENRE_LST{$FORM{d}}{mes_cgi}\.cgi");@lines= <DB>;close(DB); $FORM{mn}=-1; $i=0; foreach $line(@lines){ $line=~ s/\n//g; if($line eq ''){next;} local($per,$mes,$mod1,$mod2)=split(/\t/,$line); if($mod1 ne '0'){$mod1 = ' checked';}else{$mod1='';} if($mod2 ne '0'){$mod2 = ' checked';}else{$mod2='';} if($per eq 'top'){$FORM{'mes-top1'}=$mes;$FORM{'mes-top2'}=$mes;} #####下位互換用 elsif($per eq 'top1'){$FORM{'mes-top1'}=$mes;} elsif($per eq 'top2'){$FORM{'mes-top2'}=$mes;} else{ $FORM{mn}++; $FORM{"per-$i"}=$per; $FORM{"mes-$i"}=$mes; $FORMCH{"ch1-$i"}=$mod1; $FORMCH{"ch2-$i"}=$mod2; $i++; } } } #************************************************ # 構成ファイルのチェック ## ## 必要とするcgiファイルの存在とバージョンを確認する ## 必要とするディレクトリの存在を確認する。 #************************************************ sub ch_files{ local($i,$mes,@cgis,@dirs,$err_files,$err_cgis,$err_dirs); @cgis=($quiz_op_cgi,$quiz_cgi,$index_cgi,$function_cgi); @dirs=($data_dir); #####cgiファイルの存在チェック foreach $cgi(@cgis){ &ch_file_exist($cgi,$cgi); } #####cgiファイルのバージョンチェック &ch_file_ver(@cgis); #####ディレクトリの存在チェック foreach $dir(@dirs){ &ch_dir_exist("$dirディレクトリ",$dir); } } #************************************************ # ファイルのバージョンチェック ## ## 各cgiファイルのバージョンをチェックする。 ## バージョンナンバーは各ファイルの2行目。 #************************************************ sub ch_file_ver{ local(@cgis)=@_; local($mes,$ver_max,%cgis_ver); $ver_max=0; #####各cgiファイルのバージョンをチェックする foreach $cgi(@cgis){ unless(-f $cgi){next;} open(DB,$cgi);@list=<DB>;close(DB); if($list[1]=~ /\$version=\'(.*)\'/){ $cgis_ver{$cgi}=$1; #####バージョン番号の取得 if($ver_max < $1){$ver_max=$1;} #####最新バージョン番号の取得 } } #####最新でないファイルリストの作成 foreach(keys %cgis_ver){ if($ver_max > $cgis_ver{$_}){$mes.="【$_】<br>";} } #####メッセージ作成 if($mes ne ''){ &mes(901,$mes.'上記のスクリプトは、最新バージョンではありません。<br>動作に支障をきたす可能性があります。'); } } #************************************************ # ディレクトリの名前チェックと存在確認。無ければ作成 ## ## 引数 $dir_nick ディレクトリニックネーム ## $dir_name ディレクトリ名 ## ## 戻り値 0:正常 ## 1:名前不正エラー ## 2:作成不可エラー #************************************************ sub ch_dir_exist{ local($dir_nick,$dir_name)=@_; #####ディレクトリ名チェック if($dir_name eq ''){&error(202,$dir_nick);return 1;} if($dir_name=~ /\W/){&error(106,$dir_nick);return 1;} #####存在チェック if(!(-d $dir_name)){ mkdir($dir_name,$mod_dir); #####ディレクトリ作成 chmod(oct($mod_dir),$dir_name); #####パーミッション変更 if(!(-d $dir_name)){ #####再度存在チェック &error(732,"$dir_nameディレクトリ"); return 2; } else{&mes(451,"$dir_nameディレクトリ");} } return 0; } #************************************************ # ファイルの名前チェックと存在確認。 ## ## 引数 $file_nick ファイルニックネーム ## $file_name ファイル名 ## ## 戻り値 0:存在する ## 1:存在しない #************************************************ sub ch_file_exist{ local($file_nick,$file_name)=@_; if($file_name eq ''){return 0;} if($file_name =~ /^http:\/\//){return 0;} if(!(-f $file_name)){ &error(813,"【$file_nick】"); return 1; } return 0; } #************************************************ # ファイルスタンプチェック ## ## 引数 $file_name ファイル名 ## $file_nick ファイルニックネーム ## $file_stump ファイルスタンプ ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_file_stump{ local($file_age); local($file_name,$file_nick,$file_stump)=@_; #####ファイルの作成日時(秒単位)を取得 $file_age = $now - (-M "$file_name")*60*60*24; #####ファイルスタンプチェック(誤差±10秒) if(($file_stump > $file_age+10)||($file_stump < $file_age-10)){ &error(861,$file_nick); return 1; } return 0; } #************************************************ # パスワードチェック処理 #************************************************ sub ch_pwd_html { local(@line); open(DB,$pass_cgi);@line=<DB>;close(DB); $line[0]=~ s/\n//g; #####パスワードが登録されていない場合 if($line[0] eq ''){ #####パスワード登録中の場合 if($FORM{passnew} ne ''){ #####パスワードが入力されていない場合 if($FORM{passnew1} eq ''){ &header_html("パスワードエラー"); &error(209,'新規パスワード'); &pass_new_html; #####パスワード新規登録ページ #####確認用パスワードと一致しない場合 }elsif($FORM{passnew1} ne $FORM{passnew2}){ &header_html("パスワードエラー"); &error(541,'新規パスワードと確認用パスワード'); &pass_new_html; #####パスワード新規登録ページ #####パスワードファイルに書き込む }else{ $pass=&crypt_pwd($FORM2{passnew1}); #####パスワード暗号化文字列作成 if(&write_file($pass_cgi,$pass)){ &header_html("パスワード新規登録失敗"); }else{ &header_html("パスワード新規登録完了"); &mes(902,"管理者用パスワードを登録しました<br>パスワードを初期化したい場合は、$pass_cgiファイルを消去してください。"); } } }else{ &header_html("パスワード新規登録"); &pass_new_html; #####パスワード新規登録ページ } return 1; #####パスワードパラメータがある場合 }elsif($FORM{passch} ne ''){ #####パスワードチェック if(&ch_pwd($FORM2{passch})){ &header_html("パスワードエラー"); &error(542,'パスワード'); &pass_enter_html; #####パスワード入力用ページ return 1; } #####パスワード入力画面から、パスワードが空欄の場合 }elsif($FORM{passch1} ne ''){ &header_html("パスワードエラー"); &error(209,'パスワード'); &pass_enter_html; #####パスワード入力用ページ return 1; #####パスワードパラメータが全くないときパスワード入力を促す }else{ &header_html("パスワード入力"); &pass_enter_html; #####パスワード入力用ページ return 1; } return 0; } #************************************************ # ジャンル情報の存在判定 ## ## 引数 $dir ジャンル名 ## ## 戻り値 0:存在する ## 1:存在しない #************************************************ sub ch_genre_exist{ local($dir)=@_; #####ジャンルの存在チェック foreach(@GENRE_DIR_ALL){ if(($_ ne '')&&($_ eq $dir)){return 1;} } return 0; } #************************************************ # 独自の問題ファイルを持つかどうかチェック ## ## 総合問題型ジャンルの場合は問題ファイルを持たないため、 ## 問題の編集はできない。そのためのチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_mondai_exist{ #####総合問題型ジャンルかどうかのチェック if(($GENRE_LST{$FORM{d}}{mondai_cgi} eq '.')||($GENRE_LST{$FORM{d}}{mondai_cgi} =~ /\//)){ &error(701); &menu_html; return 1; } return 0; } #************************************************ # ファイル名の妥当性チェック #************************************************ sub ch_file_format{ #####総合問題型ジャンルかどうかのチェック unless($_[0]=~ /^[\w\$\#\~\.\/\-\?\=\&:]+$/){ return 1; } return 0; } #************************************************ # 問題追加時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_add_quiz_param{ #####入力内容チェック if($FORM{atype} eq ""){&error(203,'回答方式');} #####回答方式未入力 elsif($FORM{atype} !~ /^[012]$/){&error(409,'回答方式');} #####回答方式不正入力 if($FORM{qqu} eq ''){&error(203,'問題文');return 1;} #####問題文未入力 if($FORM{qas} eq ''){&error(203,'選択肢1');return 1;} #####選択肢1未入力 if(($FORM{qmas1} eq '')&&($FORM{atype} ne '1')){&error(203,'選択肢2');return 1;} #####選択肢2未入力かつ選択問題 return 0; } #************************************************ # 問題追加時の重複登録チェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_duplic_quiz{ #####重複登録防止チェック local($i); foreach(@mondai){ if(join("\t",$mondai[$i],$ans[$i],$misans1[$i],$misans2[$i],$misans3[$i],$misans4[$i]) eq join("\t",$FORM4{qqu},$FORM4{qas},$FORM4{qmas1},$FORM4{qmas2},$FORM4{qmas3},$FORM4{qmas4})){ my($num)=$i+1; &error('この問題はすでに登録されています。'."($num問目)");return 1; } $i++; } return 0; } #************************************************ # 問題編集時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_edit_quiz_param{ local($error)=$error_mes; #####現時点のエラーを記録 #####入力内容チェック if($FORM{atype} eq ""){&error(204,'回答方式');} #####回答方式未入力 elsif($FORM{atype} !~ /^[012]$/){&error(410,'回答方式');} #####回答方式不正入力 if($FORM{qn} eq ''){&error(204,'問題番号');} #####問題番号が未入力 elsif($FORM{qn} =~/\D/){&error(302,'問題番号');} #####問題番号が非整数 elsif(($FORM{qn}>$#mondai+1)&&($FORM{qn}<=0)){&error(531,'問題番号');} #####問題番号が範囲外 if($FORM{qqu} eq ''){&error(204,'問題文');} #####問題文が未入力 if($FORM{qas} eq ''){&error(204,'選択肢1');} #####選択肢1が未入力 if(($FORM{qmas1} eq '')&&($FORM{atype} ne '1')){&error(204,'選択肢2');} #####選択肢2未入力かつ選択問題 if($error eq $error_mes){return 0;} #####エラー発生なし else{return 1;} #####エラー発生有り } #************************************************ # システム設定編集時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_sys_palam{ local(@return,$error); #####ラジオボタン用変数初期化 $FORM{"qf-$FORM{qf}"} =' checked'; $FORM{"stl-$FORM{stl}"} =' checked'; $FORM{"tt-$FORM{tt}"} =' checked'; $FORM{"ey-$FORM{ey}"} =' checked'; $FORM{"rt-$FORM{rt}"} =' checked'; $FORM{"wr-$FORM{wr}"} =' checked'; $FORM{"nc-$FORM{nc}"} =' checked'; #####現時点のエラーを記録 $error=$error_mes; #####入力内容チェック if($FORM{li} eq ''){&error(205,'(1)プレイログ保護期間');} elsif($FORM{li} =~ /\D/){&error(303,'(1)プレイログ保護期間');} if($FORM{mp} eq ''){&error(205,'(2)同時プレイ人数');} elsif($FORM{mp} =~ /\D/){&error(303,'(2)同時プレイ人数');} if($FORM{cok} eq ''){&error(205,'(3)クッキーID');} elsif($FORM{cok} =~ /\W/){&error(106,'(3)クッキーID');} if(!mygrep($FORM{qf},(0,1,2))){&error(401,'(4)選択肢形式');} if($FORM{mt} eq ''){&error(205,'(6)メニューページのタイトル');} if(!mygrep($FORM{stl},(0,1))){&error(401,'(10)スタイルシート');} if(!mygrep($FORM{ey},(0,1,2,3))){&error(401,'(12)メニューページ表示項目');} if(!mygrep($FORM{rt},(0,1))){&error(401,'(13)回答時間による順位付け');} if(!mygrep($FORM{wr},(0,1))){&error(401,'(14)自動文字折り返し');} if(!mygrep($FORM{nc},(0,1))){&error(401,'(15)ブラウザによるキャッシュ');} if($FORM{lag} eq ''){&error(205,'(16)サーバー時間の時間差補正');} elsif(!($FORM{lag} =~ /^\d+$/) && !($FORM{lag} =~ /^-[\d+]$/)){&error(303,'(16)サーバー時間の時間差補正');} elsif($FORM{lag} > 23 || $FORM{lag} < -23){&error(532,'(16)サーバー時間の時間差補正');} if($FORM{tblw} eq ''){&error(205,'(17)表の幅');} elsif(!($FORM{tblw} =~ /^\d+$|^\d{1,2}\%$|^100\%$/)){&error(350,'(17)表の幅');} if($error eq $error_mes){return 0;} #####エラー発生なし else{return 1;} #####エラー発生有り } #************************************************ # システムデザイン設定編集時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_sysdesign_palam{ local(@return,$error); #####ラジオボタン用変数初期化 $FORM{"al-$FORM{al}"} =' checked'; $FORM{"wal-$FORM{wal}"} =' checked'; #####現時点のエラーを記録 $error=$error_mes; #####入力内容チェック if($FORM{sdt} eq ''){&error(206,'(2)システムデザイン名');} foreach $id(@SYSDESIGN_ALL){ ##名前の重複チェック(新規、複製) if($id eq $FORM{sdt} && $FORM{edittype} ne 'edit'){ &error(853,'(2)システムデザイン名'); ##名前の重複チェック(編集) }elsif($id eq $FORM{sdt} && $FORM{sdt} ne $FORM{id} && $FORM{edittype} eq 'edit'){ &error(854,'(2)システムデザイン名'); } } if(($FORM{tw} ne '')&&(&ch_file_format($FORM{tw}))){&error(305,'(3)メニューページの壁紙');} elsif(&ch_file_exist('(3)メニューページの壁紙',$FORM{tw}) eq 1){;} elsif(($FORM{tw_m} ne '')&&(&ch_file_format($FORM{tw_m}))){&error(305,'(3)メニューページの壁紙');} elsif(&ch_file_exist('(3)メニューページの壁紙',$FORM{tw_m}) eq 1){;} if($FORM{tbc} eq '') {&error(206,'(4)メニューページの背景色');} elsif($FORM{tbc_m} eq '') {&error(206,'(4)メニューページの背景色');} if($FORM{ttc} eq '') {&error(206,'(5)メニューページの表の色');} if($FORM{tjc} eq '') {&error(206,'(6)メニューページのジャンル色');} if($FORM{tic} eq '') {&error(206,'(7)メニューページの情報色');} if($FORM{tcc} eq '') {&error(206,'(8)メニューページのコメント色');} if($FORM{thc} eq '') {&error(206,'(9)メニューページの高成績者色');} if($FORM{tbdc} eq '') {&error(206,'(10)メニューページの表の枠の色');} if($FORM{txc} eq '') {&error(206,'(11)ページの文字色');} elsif($FORM{txc_m} eq '') {&error(206,'(11)ページの文字色');} if($FORM{lc} eq '') {&error(206,'(12)ページのリンク色');} elsif($FORM{lc_m} eq '') {&error(206,'(12)ページのリンク色');} if($FORM{vc} eq '') {&error(206,'(13)ページの既訪問リンク色');} elsif($FORM{vc_m} eq '') {&error(206,'(13)ページの既訪問リンク色');} if($FORM{tbdh} eq '') {&error(206,'(14)メニューページの表の枠の高さ');} elsif($FORM{tbdh} =~/\D/) {&error(305,'(14)メニューページの表の枠の高さ');} if($FORM{tbd} eq '') {&error(206,'(15)メニューページの表の枠の幅');} elsif($FORM{tbd} =~/\D/) {&error(305,'(15)メニューページの表の枠の幅');} if($FORM{tbdi} eq '') {&error(206,'(16)メニューページの表の枠の内幅');} elsif($FORM{tbdi} =~/\D/) {&error(305,'(16)メニューページの表の枠の内幅');} if($FORM{ag} eq '') {&error(206,'(17)成績履歴グラフ画像1');} elsif(&ch_file_format($FORM{ag})) {&error(305,'(17)成績履歴グラフ画像1');} elsif(&ch_file_exist('(17)成績履歴グラフ画像1',$FORM{ag}) eq 1){;} if($FORM{bg} eq '') {&error(206,'(18)成績履歴グラフ画像2');} elsif(&ch_file_format($FORM{bg})) {&error(305,'(18)成績履歴グラフ画像2');} elsif(&ch_file_exist('(18)成績履歴グラフ画像2',$FORM{bg}) eq 1){;} if(!mygrep($FORM{al},('l','c','r'))) {&error(402,'(19)表のレイアウト');} if(!mygrep($FORM{wal},('l','c','r'))) {&error(402,'(20)表内文字レイアウト');} if($error eq $error_mes){ #####エラー発生なし #####ジャンルの追加(新規、複製) if($FORM{edittype} ne 'edit'){ push(@SYSDESIGN_ALL,$FORM{sdt}); #####ジャンル名の変更(編集) }else{ $i=0; foreach $id(@SYSDESIGN_ALL){ if($id eq $FORM{id}){ $SYSDESIGN_ALL[$i] = $FORM{sdt}; last; } $i++; } } return 0; } else{return 1;} #####エラー発生有り } #************************************************ # ジャンルデザイン設定編集時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_design_palam{ local(@return,$error); #####現時点のエラーを記録 $error=$error_mes; #####入力内容チェック if($FORM{gdt} eq ''){&error(207,'(2)ジャンルデザイン名');} foreach $id(@DESIGN_ALL){ ##名前の重複チェック(新規、複製) if($id eq $FORM{gdt} && $FORM{edittype} ne 'edit'){ &error(855,'(2)ジャンルデザイン名'); ##名前の重複チェック(編集) }elsif($id eq $FORM{gdt} && $FORM{gdt} ne $FORM{id} && $FORM{edittype} eq 'edit'){ &error(856,'(2)ジャンルデザイン名'); } } if($FORM{gtc} eq '') {&error(207,'(3)文字色');} elsif($FORM{gtc_m} eq '') {&error(207,'(3)文字色');} if($FORM{glc} eq '') {&error(207,'(4)リンク文字色');} elsif($FORM{glc_m} eq '') {&error(207,'(4)リンク文字色');} if($FORM{gvc} eq '') {&error(207,'(5)既訪問リンク文字色');} elsif($FORM{gvc_m} eq '') {&error(207,'(5)既訪問リンク文字色');} if($FORM{gcc} eq '') {&error(207,'(6)殿堂入り者色');} elsif($FORM{gcc_m} eq '') {&error(207,'(6)殿堂入り者色');} if($FORM{gmc} eq '') {&error(207,'(7)基本背景色');} elsif($FORM{gmc_m} eq '') {&error(207,'(7)基本背景色');} if($FORM{gwi} eq '') {&error(207,'(8)正解時背景色');} elsif($FORM{gwi_m} eq '') {&error(207,'(8)正解時背景色');} if($FORM{glo} eq '') {&error(207,'(9)不正解時背景色');} elsif($FORM{glo_m} eq '') {&error(207,'(9)不正解時背景色');} if($FORM{gcm} eq '') {&error(207,'(10)情報ウインドウの色');} if($FORM{thc} eq '') {&error(207,'(11)表のヘッダー色');} if($FORM{tdc} eq '') {&error(207,'(12)表の色');} if($FORM{bdc} eq '') {&error(207,'(13)表の枠の色');} if($FORM{bdh} eq '') {&error(207,'(14)表の枠の高さ');} elsif($FORM{bdh} =~/\D/) {&error(306,'(14)表の枠の高さ');} if($FORM{bd} eq '') {&error(207,'(15)表の枠の幅');} elsif($FORM{bd} =~/\D/) {&error(306,'(15)表の枠の幅');} if($FORM{bdi} eq '') {&error(207,'(16)表の枠の内幅');} elsif($FORM{bdi} =~/\D/) {&error(306,'(16)表の枠の内幅');} if(($FORM{gw} ne '')&& (&ch_file_format($FORM{gw}))){&error(104,'(17)基本壁紙');} elsif(&ch_file_exist('(17)基本壁紙',$FORM{gw}) eq 1){;} elsif(($FORM{gw_m} ne '')&& (&ch_file_format($FORM{gw_m}))){&error(104,'(17)基本壁紙');} elsif(&ch_file_exist('(17)基本壁紙',$FORM{gw_m}) eq 1){;} if(($FORM{gww} ne '')&& (&ch_file_format($FORM{gww}))){&error(104,'(18)正解時壁紙');} elsif(&ch_file_exist('(18)正解時壁紙',$FORM{gww}) eq 1){;} elsif(($FORM{gww_m} ne '')&& (&ch_file_format($FORM{gww_m}))){&error(104,'(18)正解時壁紙');} elsif(&ch_file_exist('(18)正解時壁紙',$FORM{gww_m}) eq 1){;} if(($FORM{glw} ne '')&& (&ch_file_format($FORM{glw}))){&error(104,'(19)不正解時壁紙');} elsif(&ch_file_exist('(19)不正解時壁紙',$FORM{glw}) eq 1){;} elsif(($FORM{glw_m} ne '')&& (&ch_file_format($FORM{glw_m}))){&error(104,'(19)不正解時壁紙');} elsif(&ch_file_exist('(19)不正解時壁紙',$FORM{glw_m}) eq 1){;} if($FORM{wsg} eq '') {&error(207,'(20)正解表示');} elsif($FORM{wsg_m} eq '') {&error(207,'(20)正解表示');} if($FORM{lsg} eq '') {&error(207,'(21)不正解表示');} elsif($FORM{lsg_m} eq '') {&error(207,'(21)不正解表示');} if($FORM{osg} eq '') {&error(207,'(22)タイムオーバー表示');} elsif($FORM{osg_m} eq '') {&error(207,'(22)タイムオーバー表示');} if(($FORM{wmd} ne '')&& (&ch_file_format($FORM{wmd}))){&error(104,'(23)正解時MIDI');} elsif(&ch_file_exist('(23)正解時MIDI',$FORM{wmd}) eq 1){;} if(($FORM{lmd} ne '')&& (&ch_file_format($FORM{lmd}))){&error(104,'(24)不正解時MIDI');} elsif(&ch_file_exist('(24)不正解時MIDI',$FORM{lmd}) eq 1){;} if(($FORM{emd} ne '')&& (&ch_file_format($FORM{emd}))){&error(104,'(25)クイズ終了時MIDI');} elsif(&ch_file_exist('(25)クイズ終了時MIDI',$FORM{emd}) eq 1){;} if(($FORM{hmd} ne '')&& (&ch_file_format($FORM{hmd}))){&error(104,'(26)高成績者用MIDI');} elsif(&ch_file_exist('(26)高成績者用MIDI',$FORM{hmd}) eq 1){;} if($error eq $error_mes){ #####エラー発生なし #####ジャンルの追加(新規、複製) if($FORM{edittype} ne 'edit'){ push(@DESIGN_ALL,$FORM{gdt}); #####ジャンル名の変更(編集) }else{ $i=0; foreach $id(@DESIGN_ALL){ if($id eq $FORM{id}){ $DESIGN_ALL[$i] = $FORM{gdt}; last; } $i++; } } return 0; } else{return 1;} #####エラー発生有り } #************************************************ # 終了時メッセージ編集のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_edit_mes_param{ #####指定正解率が範囲外です for($i=0;$i<$FORM{mn};$i++){ if($FORM{"per-$i"} eq ''){next;} if(($FORM{"per-$i"}<0.00000001)||($FORM{"per-$i"}>100)){ &error(531,'正解率の指定'); return 1; } } return 0; } #************************************************ # ジャンル編集時のパラメータチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_edit_genre_palam{ #####現時点のエラーを記録 $error=$error_mes; #####ラジオボタン用変数初期化 $FORM{"md-$FORM{md}"} =' checked'; $FORM{"me-$FORM{me}"} =' checked'; $FORM{"ct-$FORM{ct}"} =' checked'; $FORM{"nt-$FORM{nt}"} =' checked'; $FORM{"dc-$FORM{dc}"} =' checked'; $FORM{"sd-$FORM{sd}"} =' checked'; $FORM{"ath-$FORM{ath}"} =' checked'; $FORM{"rcf-$FORM{rcf}"} =' checked'; $FORM{"rdg-$FORM{rdg}"} =' checked'; $FORM{"sa1-$FORM{sa1}"} =' checked';$FORM{"sa2-$FORM{sa2}"} =' checked'; $FORM{"sr1-$FORM{sr1}"} =' checked';$FORM{"sr2-$FORM{sr2}"} =' checked'; $FORM{"r1-$FORM{r1}"} =' checked';$FORM{"r2-$FORM{r2}"} =' checked'; $FORM{"qm1-$FORM{qm1}"} =' checked';$FORM{"qm2-$FORM{qm2}"} =' checked'; $FORM{"pm1-$FORM{pm1}"} =' checked';$FORM{"pm2-$FORM{pm2}"} =' checked'; $FORM{"lm1-$FORM{lm1}"} =' checked';$FORM{"lm2-$FORM{lm2}"} =' checked'; $FORM{"tl1-$FORM{tl1}"} =' checked';$FORM{"tl2-$FORM{tl2}"} =' checked'; $FORM{"dl1-$FORM{dl1}"} =' checked';$FORM{"dl2-$FORM{dl2}"} =' checked'; $FORM{"nl1-$FORM{nl1}"} =' checked';$FORM{"nl2-$FORM{nl2}"} =' checked'; $FORM{"dh1-$FORM{dh1}"} =' checked';$FORM{"dh2-$FORM{dh2}"} =' checked'; $FORM{"bd1-$FORM{bd1}"} =' checked';$FORM{"bd2-$FORM{bd2}"} =' checked'; $FORM{"hbu1-$FORM{hbu1}"} =' checked';$FORM{"hbu2-$FORM{hbu2}"} =' checked'; $FORM{"hbw1-$FORM{hbw1}"} =' checked';$FORM{"hbw2-$FORM{hbw2}"} =' checked'; $FORM{"sbu1-$FORM{sbu1}"} =' checked';$FORM{"sbu2-$FORM{sbu2}"} =' checked'; $FORM{"sbw1-$FORM{sbw1}"} =' checked';$FORM{"sbw2-$FORM{sbw2}"} =' checked'; $FORM{"rc1-$FORM{rc1}"} =' checked';$FORM{"rc2-$FORM{rc2}"} =' checked'; #####ラジオボタン付きテキストボックスの内容をクリア if($FORM{qm} eq 1){$FORM{'qm-2'}='';} if($FORM{pm} eq 1){$FORM{'pm-2'}='';} if($FORM{lm} eq 1){$FORM{'lm-2'}='';} if($FORM{dl} eq 1){$FORM{'dl-2'}='';} if($FORM{nl} eq 1){$FORM{'nl-2'}='';} #####入力内容チェック if($FORM{t} eq ''){&error(208,'(2)タイトル');} if(!mygrep($FORM{md},(0,1))) {&error(403,"(2-4)問題ファイル");} elsif($FORM{md} eq 1){ foreach(@GENRE_DIR_ORIGN){ if(($FORM{d} eq $_)||($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;} if(!($FORM{"smd-$_"} =~ /^\d+$/)&&($FORM{"smd-$_"} ne 'all')){&error(304,'(2-4)問題ファイル');last;} } } if(!mygrep($FORM{me},(0,1))) {&error(403,'(2-5)ジャンルの動作状態');} if(!mygrep($FORM{ct},(0,1))) {&error(403,'(2-6)投稿問題の受付');} if(!mygrep($FORM{nt},(0,1))) {&error(403,'(2-7)テキスト形式の投稿問題');} if(!mygrep($FORM{dc},(0,1))) {&error(403,'(2-8)投稿問題の自動採用');} if(!mygrep($FORM{ath},(0,1))) {&error(403,'(2-10)問題文への作成者表示');} if(!mygrep($FORM{rcf},(0,1))) {&error(403,'(2-11)回答結果への参考文献表示');} if(!mygrep($FORM{rdg},(0,1))) {&error(403,'(2-12)回答結果への問題内容表示');} if($FORM{'phn'} eq '') {&error(208,'(2-13)携帯電話モードでの高成績者表示数');} elsif($FORM{'phn'}=~ /\D/) {&error(304,'(2-13)携帯電話モードでの高成績者表示数');} if($FORM{mn1} eq '') {&error(208,'(3-1)モード1の名前');} if(!mygrep($FORM{sa1},(0,1))) {&error(403,'(3-2)正解表示');} if(!mygrep($FORM{sr1},(0,1))) {&error(403,'(3-3)回答結果表示');} if(!mygrep($FORM{r1},(0,1))) {&error(403,'(3-4)出題順序');} if(!mygrep($FORM{qm1},(0,1))) {&error(403,'(3-5)使用問題数');} elsif(($FORM{qm1} eq '0')&&($FORM{'qm1-2'} eq '')) {&error(208,'(3-5)使用問題数');} elsif(($FORM{qm1} eq '0')&&($FORM{'qm1-2'}=~ /\D/)) {&error(304,'(3-5)使用問題数');} if(!mygrep($FORM{pm1},(0,1))) {&error(403,'(3-6)出題問題数');} elsif(($FORM{pm1} eq '0')&&($FORM{'pm1-2'} eq '')) {&error(208,'(3-6)出題問題数');} elsif(($FORM{pm1} eq '0')&&($FORM{'pm1-2'}=~ /\D/)) {&error(304,'(3-6)出題問題数');} if(!mygrep($FORM{bd1},(0,1))) {&error(403,'(3-7)一括出題');} if(!mygrep($FORM{lm1},(0,1))) {&error(403,'(3-8)終了条件誤答数');} elsif(($FORM{lm1} eq '0')&&($FORM{'lm1-2'} eq '')) {&error(208,'(3-8)終了条件誤答数');} elsif(($FORM{lm1} eq '0')&&($FORM{'lm1-2'}=~ /\D/)) {&error(304,'(3-8)終了条件誤答数');} if(!mygrep($FORM{tl1},(0,1))) {&error(403,'(3-9)制限時間');} elsif(($FORM{tl1} eq '0')&&($FORM{'tl1-2'} eq '')) {&error(208,'(3-9)制限時間');} elsif(($FORM{tl1} eq '0')&&($FORM{'tl1-2'}!~ /^[0-9]+\.?[0-9]*$/)) {&error(304,'(3-9)制限時間');} if($FORM{hb1} eq '') {&error(208,'(3-10)合格点');} elsif($FORM{hb1} =~ /\D/) {&error(304,'(3-10)合格点');} if(!mygrep($FORM{hbu1},(0,1))) {&error(403,'(3-11)高成績者のBACK UP');} elsif(($FORM{hbu1} eq '1')&&($FORM{'hbu1-2'} eq '')) {&error(208,'(3-11)高成績者のBACK UP間隔(日)');} elsif(($FORM{hbu1} eq '1')&&($FORM{'hbu1-2'}=~ /\D/)) {&error(304,'(3-11)高成績者のBACK UP間隔(日)');} if(!mygrep($FORM{hbw1},(0,1))) {&error(403,'(3-12)高成績者のBACK UP方式');} if(!mygrep($FORM{sbu1},(0,1))) {&error(403,'(3-13)成績分布のBACK UP');} elsif(($FORM{sbu1} eq '1')&&($FORM{'sbu1-2'} eq '')) {&error(208,'(3-13)成績分布のBACK UP間隔(日)');} elsif(($FORM{sbu1} eq '1')&&($FORM{'sbu1-2'}=~ /\D/)) {&error(304,'(3-13)成績分布のBACK UP間隔(日)');} if(!mygrep($FORM{sbw1},(0,1))) {&error(403,'(3-14)成績分布のBACK UP方式');} if($FORM{gb1} eq '') {&error(208,'(3-15)成績分布省略表\示');} elsif($FORM{gb1} =~ /\D/) {&error(304,'(3-15)成績分布省略表\示');} if($FORM{hd1} eq '') {&error(208,'(3-16)成績分布集計単位');} elsif($FORM{hd1} =~ /\D/) {&error(304,'(3-16)成績分布集計単位');} if(!mygrep($FORM{dl1},(0,1))) {&error(403,'(3-17)高成績者日数制限');} elsif(($FORM{dl1} eq '0')&&($FORM{'dl1-2'} eq '')) {&error(208,'(3-17)高成績者日数制限');} elsif(($FORM{dl1} eq '0')&&($FORM{'dl1-2'}=~ /\D/)) {&error(304,'(3-17)高成績者日数制限');} if(!mygrep($FORM{nl1},(0,1))) {&error(403,'(3-18)高成績者人数制限');} elsif(($FORM{nl1} eq '0')&&($FORM{'nl1-2'} eq '')) {&error(208,'(3-18)高成績者人数制限');} elsif(($FORM{nl1} eq '0')&&($FORM{'nl1-2'}=~ /\D/)) {&error(304,'(3-18)高成績者人数制限');} if($FORM{no1} eq '') {&error(208,'(3-19)殿堂入り人数');} elsif($FORM{no1} =~ /\D/) {&error(304,'(3-19)殿堂入り人数');} if(!mygrep($FORM{rc1},(0,1))) {&error(403,'(3-20)高成績者コメント記録');} if(!mygrep($FORM{dh1},(0,1))) {&error(403,'(3-21)同ホスト同スコア');} if($FORM{mn2} ne ''){ if(!mygrep($FORM{sa2},(0,1))) {&error(403,'(4-2)モード2正解表示');} if(!mygrep($FORM{sr2},(0,1))) {&error(403,'(4-3)回答結果表示');} if(!mygrep($FORM{r2},(0,1))) {&error(403,'(4-4)出題順序');} if(!mygrep($FORM{qm2},(0,1))) {&error(403,'(4-5)使用問題数');} elsif(($FORM{qm2} eq '0')&&($FORM{'qm2-2'} eq '')) {&error(208,'(4-5)使用問題数');} elsif(($FORM{qm2} eq '0')&&($FORM{'qm2-2'}=~ /\D/)) {&error(304,'(4-5)使用問題数');} if(!mygrep($FORM{pm2},(0,1))) {&error(403,'(4-6)出題問題数');} elsif(($FORM{pm2} eq '0')&&($FORM{'pm2-2'} eq '')) {&error(208,'(4-6)出題問題数');} elsif(($FORM{pm2} eq '0')&&($FORM{'pm2-2'}=~ /\D/)) {&error(304,'(4-6)出題問題数');} if(!mygrep($FORM{bd2},(0,1))) {&error(403,'(4-7)一括出題');} if(!mygrep($FORM{lm2},(0,1))) {&error(403,'(4-8)終了条件誤答数');} elsif(($FORM{lm2} eq '0')&&($FORM{'lm2-2'} eq '')) {&error(208,'(4-8)終了条件誤答数');} elsif(($FORM{lm2} eq '0')&&($FORM{'lm2-2'}=~ /\D/)) {&error(304,'(4-8)終了条件誤答数');} if(!mygrep($FORM{tl2},(0,1))) {&error(403,'(4-9)制限時間');} elsif(($FORM{tl2} eq '0')&&($FORM{'tl2-2'} eq '')) {&error(208,'(4-9)制限時間');} elsif(($FORM{tl2} eq '0')&&($FORM{'tl2-2'}!~ /^[0-9]+\.?[0-9]*$/)) {&error(403,'(4-9)制限時間');} if($FORM{hb2} eq '') {&error(208,'(4-10)合格点');} elsif($FORM{hb2} =~ /\D/) {&error(304,'(4-10)合格点');} if(!mygrep($FORM{hbu2},(0,1))) {&error(403,'(4-11)高成績者のBACK UP');} elsif(($FORM{hbu2} eq '1')&&($FORM{'hbu2-2'} eq '')) {&error(208,'(4-11)高成績者のBACK UP間隔(日)');} elsif(($FORM{hbu2} eq '1')&&($FORM{'hbu2-2'}=~ /\D/)) {&error(304,'(4-11)高成績者のBACK UP間隔(日)');} if(!mygrep($FORM{hbw2},(0,1))) {&error(403,'(4-12)高成績者のBACK UP方式');} if(!mygrep($FORM{sbu2},(0,1))) {&error(403,'(4-13)成績分布のBACK UP');} elsif(($FORM{sbu2} eq '1')&&($FORM{'sbu2-2'} eq '')) {&error(208,'(4-13)成績分布のBACK UP間隔(日)');} elsif(($FORM{sbu2} eq '1')&&($FORM{'sbu2-2'}=~ /\D/)) {&error(304,'(4-13)成績分布のBACK UP間隔(日)');} if(!mygrep($FORM{sbw2},(0,1))) {&error(403,'(4-14)成績分布のBACK UP方式');} if($FORM{gb2} eq '') {&error(208,'(4-15)成績分布省略表\示');} elsif($FORM{gb2} =~ /\D/) {&error(304,'(4-15)成績分布省略表\示');} if($FORM{hd2} eq '') {&error(208,'(4-16)成績分布集計単位');} elsif($FORM{hd2} =~ /\D/) {&error(304,'(4-16)成績分布集計単位');} if(!mygrep($FORM{dl2},(0,1))) {&error(403,'(4-17)高成績者日数制限');} elsif(($FORM{dl2} eq '0')&&($FORM{'dl2-2'} eq '')) {&error(208,'(4-17)高成績者日数制限');} elsif(($FORM{dl2} eq '0')&&($FORM{'dl2-2'}=~ /\D/)) {&error(304,'(4-17)高成績者日数制限');} if(!mygrep($FORM{nl2},(0,1))) {&error(403,'(4-18)高成績者人数制限');} elsif(($FORM{nl2} eq '0')&&($FORM{'nl2-2'} eq '')) {&error(208,'(4-18)高成績者人数制限');} elsif(($FORM{nl2} eq '0')&&($FORM{'nl2-2'}=~ /\D/)) {&error(304,'(4-18)高成績者人数制限');} if($FORM{no2} eq '') {&error(208,'(4-19)殿堂入り人数');} elsif($FORM{no2} =~ /\D/) {&error(304,'(4-19)殿堂入り人数');} if(!mygrep($FORM{rc2},(0,1))) {&error(403,'(4-20)高成績者コメント記録');} if(!mygrep($FORM{dh2},(0,1))) {&error(403,'(4-21)同ホスト同スコア');} } if($error eq $error_mes){return 0;} #####エラー発生なし else{return 1;} #####エラー発生有り } #************************************************ # アクセス制限IPチェック ## ## 戻り値 0:正常 ## 1:エラー #************************************************ sub ch_guard_ip{ open(DB,$guard_cgi); @list=<DB>; close(DB); if($list[0] eq "guard\n"){ $guard=1; $permit=0; $list[0]=''; }elsif($list[0] eq "permit\n"){ $guard=0; $permit=1; $list[0]=''; }else{ $guard=1; $permit=0; } foreach $line(@list){ $line=~ s/\n//g; $line=~ s/ //g; if($line eq ''){next;} if($ip =~ /^$line/){ return $guard; } } return $permit; } #************************************************ # パスワード変更チェック #************************************************ sub ch_edit_pass{ if(&ch_pwd($FORM2{op})) {&error(543,'(1)旧パスワード');return 1} if($FORM2{np1} eq "") {&error(211,'(2)新パスワード');return 1;} if($FORM2{np1} ne $FORM2{np2}) {&error(544,'(2)新規パスワードと(3)新パスワード(確認用)');return 1;} return 0; } #************************************************ # システムファイルの書き込み #************************************************ sub write_system_dat{ return &write_file($system_cgi,&sys_to_system_dat); } #************************************************ # ジャンルファイルの書き込み #************************************************ sub write_genre_dat{ local($value); #####書き込みデータの作成 $value = "ver2\n"; foreach $dir(@GENRE_DIR_ALL){ if($dir ne ''){$value .= &genre_array_to_line($dir);} } #####書き込み return &write_file($genre_cgi,$value); } #************************************************ # デザインファイルの書き込み #************************************************ sub write_design_dat{ local($value); #####書き込みデータの作成 $value = "ver2\n"; foreach $id(@DESIGN_ALL){ if($id ne ''){$value .= &design_array_to_line($id);} } #####書き込み return &write_file($design_cgi,$value); } #************************************************ # システムデザインファイルの書き込み #************************************************ sub write_sysdesign_dat{ local($value); #####書き込みデータの作成 $value = "ver2\n"; foreach $id(@SYSDESIGN_ALL){ if($id ne '' && $SYSDESIGN_LST{$id}{pc}{sysdesign_title} ne ''){$value .= &sysdesign_array_to_line($id);} } #####書き込み return &write_file($sysdesign_cgi,$value); } #************************************************ # 問題ファイル上書き処理 ## ## 引数 $file_name 問題ファイル名 #************************************************ sub write_mondai{ local(@lines); local($file_name,$dir) = @_; if($dir eq ""){$dir=$FORM{d};} $i=0;$j=0; foreach(@mondai){ if($mondai[$i] ne ''){ $j++; #####書き込みデータの作成 push(@lines,&quiz_to_line($i,$j)); } $i++; } #####ディレクトリの存在チェック if(&ch_dir_exist('ディレクトリ名',$dir)){return 1;} #####書き込み return &write_file("$dir/$file_name",@lines); }