#!/usr/bin/perl # #強化型ゆいぼーど(list.cgi) #を改造した亜流アンケート require './jcodeLE.pl'; require './prei.cgi'; $| = 1; &winit;&noaxschk; &init;&decode;&jikan; if (($make ne 'on') && ($delete ne 'on')){ $page = 0 if ($page < 0); $page2 = $page*$lmax; &html; }else{ if($referer = ~ /$cgichk/i ){ &make; }else{ $page = 0;$page2 = 0; &html; } } exit; ################################################## sub init{ $rootpwd = 'master777'; #総合管理者のパスワード(重要!) $limax=50; #1ページあたりのタイトル表示数 $brmax=10; #説明文の行最大数 $seritime = 60*60*24; #箱連続作成制限の目安時間 $sericount = 5; #箱連続作成制限個数 $seritime2 = 60*10; #箱連続作成制限の目安時間その2 $sericount2 = 1; #箱連続作成制限個数その2 $boxmakers = "./$coudir/boxlist.cgi"; }#init END ################################################## sub html { my($bbslink); $bbslink = "[$bbsname]" if($bbscgi); print "Content-type: text/html\n\n"; print <<"_HTML_"; $orititle $metacode $bodys $orititle

[新規に話題を投稿する。][表\示形式の変更(${lmax}件/page)] [インデックス] $bbslink
_HTML_ &listing;#普通のリスト作成 print <<"_HTML_";
新規の話題を投稿しましょう

ここでは、新規のアンケートを簡単に作成できます。(...はずです。)
あなたの質問したい内容を簡潔に分かりやすく説明するタイトルと説明を記入して、 箱を設置してください。

話題のタイトル:(全角${titlemax}文字まで)

おなまえ:(全角${namemax}文字まで。省略可)
内容:(タグは使えません。)

(${brmax}行まで)

一定期間書き込まれなかった話題は自動的に削除します。(${sday}〜${daylimit}日後)

リストの表\示形式の変更

一ページに表\示する件数:
過去日以内に更新された記事を表\示
(0日を指定した場合は、すべての記事を表\示します。)
リストの表\示順:新規作成順新規発言順
ブラウザに設定を覚えさせる


$original _HTML_ }#html END ################################################## sub listing{ my($room,$filedata,$roomtotal,$total,$count,$i,$file,$set,$title,$chkkey,$datedata,$hatusuu,$link); my($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst); my($d1,$d2,$hst,$pagelink); opendir(DIR,"$logdir"); @readlist = grep(/log/, readdir(DIR)); closedir(DIR); $roomtotal = 0; foreach $room (@readlist) { $room=~s/log\.(.*)\.cgi/$1/; $filedata = -M "./$logdir/log.$room.cgi"; if($hotlist){ #更新日付がhotlist以内のものをピックアップ push(@roomlist,$room) if ($filedata < $hotlist); }else{ push(@roomlist,$room); } $ans2{$room} = $filedata; $roomtotal++; }#foreach if ($sorttype eq 'new'){ @roomlist = sort { $ans2{$a} <=> $ans2{$b} } @roomlist; #更新順 }else{ @roomlist = sort { $a <=> $b; } @roomlist; #作成順 @roomlist = reverse (@roomlist); } print <<"_HTML_";
  • ${date}現在の投票箱のリスト(計 ${roomtotal}箱)
  • 括弧内が箱番号です。日付、時刻は最終書き込み時です。
  • 先頭の◇をクリックすると新しくブラウザが開くかも。
  • _HTML_ $total = @roomlist; $count = int(($total-1)/$lmax); $pagelink = "
  • Page:"; for($i=0;$i<=$count;$i++){ if($i eq $page){ $pagelink = "$pagelink\[$i] \n"; }else{ $pagelink = "$pagelink\[$i] \n"; } }#for $pagelink = "$pagelink
  • "; print "$pagelink\n"; print "
    \n" if($root eq $rootpwd); print "
      \n"; (@roomlist < $lmax) || (@roomlist = @roomlist[$page2 .. $page2+$lmax-1]); foreach $room (@roomlist) { last if($room eq ''); $file="./$logdir/log.$room.cgi"; open(DB, $file); @lines = ; close(DB); $set=shift(@lines); ($title,$chkkey,$ddata,$d1,$d2,$hst) = split(/:#/,$set); $title = unpack("A80",$title); if( $vkey ne $chkkey ){ $title=''; $ddata=10; } $title = '?' if($title eq ''); $filedata = -M "./$logdir/log.$room.cgi"; if ($filedata > $ddata){ #規定日間書き込みなしでその話題を削除 &logdel($room); } else{ $datedata = $ddata - $filedata; $hatusuu=@lines; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($times-$filedata*24*60*60); $sec = "0$sec" if ($sec < 10);$min = "0$min" if ($min < 10);$month++; if($datedata < 1){ $dates = "$month/$mday $hour時$min分<\/FONT>"; }else{ if($filedata < 0.5 ){ $dates = "$month/$mday $hour時$min分<\/FONT>"; }else{ $dates = "$month/$mday $hour時$min分"; } } print "
      \n"; $datedata = int($datedata*100)/100; if($root eq $rootpwd){ $link = "./$cgi_log?room=$room&pass=$root"; print "\n"; print " \n"; print "$title"; print "($room $hst)$dates: $hatusuu投票
      \n"; } else{ $link = "./$cgi_log?room=$room"; print " \n"; print "$title"; print "($room)$dates: $hatusuu投票: 残り$datedata日
      \n"; } $set = shift(@lines); } }#foreach print "

    \n"; print "$pagelink\n"; if($root eq $rootpwd){ print <<"_HTML_";
    削除キーワード(箱データの中に含まれる文字列。)
    _HTML_ } }#listing END ################################################## sub decode { my($brnum); if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } &decodearg($buffer,$cgi_list); $title = $FORM{'title'};&err("タイトルが長すぎます。") if(length($title) > ($titlemax*2)); $page = $FORM{'page'};$page = int($page); $make = $FORM{'make'}; $root = $FORM{'root'};$delete = $FORM{'delete'}; $hotlist = $FORM{'h'};$hotlist = 0 if($hotlist eq ''); $sorttype = $FORM{'s'}; $lmax = $COOKIE{$c_lm}; $lmax = $FORM{'lm'} if ($FORM{'lm'} > 0); $lmax = $limax if($lmax < 1); $lmax = int($lmax); $oname = $FORM{'oname'}; &err("名前が長すぎます。") if(length($oname) > ($namemax*2)); $eraseword = $FORM{'eraseword'}; $chat = $FORM{'chat'}; $_ = $chat;$brnum = s/
    //ig; &err("説明の行数が多すぎます。") if($brnum >= $brmax); }#decode END ################################################## sub make {#新規話題ルームを設置or管理者による削除 my($dmy,$erase,$chktitle,$room,$rnum,$file,$set,$otitle,$file2,$tm); my($hst,$tm2,$cnt,$cnt2,@boxlist); if($delete eq 'on'){ &err("パスワードが違います。") if($root ne $rootpwd); $buffer=~s/&//g; #余分な部分を削除 (@erase) = split(/erase=/, $buffer); #削除リストを作成 $dmy = shift( @erase); foreach $erase(@erase){ if(-e "./$logdir/log.$erase.cgi"){ &logdel($erase); } } opendir(DIR,"$logdir"); @readlist = grep(/log/, readdir(DIR)); closedir(DIR); foreach $file (@readlist){ $file2="./$logdir/$file"; open(DB, $file2); @lines = ; close(DB); $set=shift(@lines); ($otitle) = split(/:#/,$set); $otitle = unpack("A80",$otitle); if(($set =~ /$eraseword/) || ($otitle =~ /$eraseword/)){ $erase=$file; $erase=~s/log\.(.*)\.cgi/$1/; if(-e "./$logdir/log.$erase.cgi"){ &logdel($erase); } } } print "Location: $cgidir/$cgi_list?root=$root\n\n"; exit; } #タイトルが空だと作成されない if( $title eq '' ){print "Location: $cgidir/$cgi_list\n\n";exit;} $chktitle = $title; $chktitle =~ s/ //g;$chktitle =~ s/ //g; $room = ''; $tm = time; $cnt = 0; opendir(DIR,"$logdir")|| &err("ログのディレクトリが開けません。"); @readlist = grep(/log/, readdir(DIR)); closedir(DIR); $rnum = '000'; foreach $room (@readlist) { $room=~s/log\.(.*)\.cgi/$1/; $rnum = $room if($room > $rnum); $file="./$logdir/log.$room.cgi"; open(DB, $file) || next; @lines = ; close(DB); $set=shift(@lines); ($otitle) = split(/:#/,$set); $otitle =~ s/ //g;$otitle =~ s/ //g; &err("同じタイトルの箱が既にあります。") if($chktitle eq $otitle); } #別ファイルのログによって箱作成制限をかける if(open(DB,$boxmakers)){ seek(DB,0,0); @boxlist = ; close(DB); }else{ open(DB,">$boxmakers"); close(DB); chmod 0600, "$boxmakers"; } foreach $box (@boxlist) { ($tm2,$otitle,$hst) = split(/:#/,$box); if($hst eq $host){ $cnt++ if($tm-$tm2 < $seritime); $cnt2++ if($tm-$tm2 < $seritime2); } } &err("一人連続箱作成制限にかかりました") if(($cnt >= $sericount) || ($cnt2 >= $sericount2)); $rnum = $rnum?sprintf("%03d",++$rnum):"000"; $file = "./$logdir/log.$rnum.cgi"; $set = "$title:#$vkey:#$sday:#$oname:#$chat:#$host:#$date:#\n"; open(DB,">$file"); print DB $set; close(DB); chmod 0600, "$file"; #0666でないとダメかも。 #カウンタファイルを作る $file = "./$coudir/cou.$rnum.dat"; open(DB,">$file"); print DB "0\n"; close(DB); chmod 0600, "$file"; #0666でないとダメかも。 #箱作のホストを別ファイルに記録 $set = "$tm:#$title:#$host:#\n"; @boxlist = (@boxlist,$set); shift(@boxlist) if(@boxlist > 200); open(DB,">$boxmakers"); seek(DB,0,0); print DB @boxlist; close(DB); print "Location: $cgidir/$cgi_log?room=$rnum\n\n"; exit; }#make END ################################################## sub logdel { my($lognum,$file,$acou); $lognum = $_[0]; $file="./$logdir/log.$lognum.cgi"; if( open(DB, $file) ){ @lines = ; close(DB); $file="./$coudir/cou.$lognum.cgi"; open(DB,$file); $acou = ; close(DB); } else{ err("箱の削除に失敗しました:$lognum"); } unlink "./$logdir/log.$lognum.cgi"; unlink "./$coudir/cou.$lognum.dat"; }#logdel END __END__