#!/usr/bin/perl #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃Petit Poll Stylish Edition ver 4.3 (2003/10/07) #┃Copyright(C) 2002-2003 9TST4. All Rights Reserved. #┃URL:http://paxs.hp.infoseek.co.jp/ #┃E-mail:axs@cocoa.freemail.ne.jp #┃Web Master:高見将智(Masatomo Takami) #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #┌─────────────────────────────────────────────────────────┐ #│【SE ver4.0以降のバージョンから乗り換える方】 #│ #│  1:poll.cgiを差し替えるだけでご利用いただけます。 #│ #│ #│【SE ver4.0以前のバージョンから乗り換える方】 #│ #│  1:新バージョンのログディレクトリ内に「使用中のログ」を移します。 #│  2:管理モードへアクセスして、WEB上から設定変更を行ってください。 #│ #│ #│【Petit Pollから乗り換える方】 #│ #│  1:新バージョンのログディレクトリ内に「使用中のログ」を移します。 #│  2:同梱のck.cgi(設定変更済み)を一度だけ呼び出します。 #│  3:管理モードへアクセスして、WEB上から設定変更を行ってください。 #│ #└─────────────────────────────────────────────────────────┘ require './jcode.pl'; my ($fpath, $ldir, $idir, @GAZOU, $qs_img, $rs_img, $od_img, $dw_img, $wn_img, $ad_img, $nw_img, $ptname, $lock, $web); #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ファイル名の設定 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ #このファイルへのパス(httpから) $fpath = "http://f32.aaa.livedoor.jp/~lazy/enq/poll.cgi"; #ログディレクトリへのパス(必ず任意の名前に変更。最後を「/」で閉じる) $ldir = "./dir/"; #画像ディレクトリへのパス(httpから) $idir = "http://f32.aaa.livedoor.jp/~lazy/enq/image/"; #バー画像(指定分だけ複数画像を使用) @GAZOU = ("bar1.gif","bar2.gif","bar3.gif","bar4.gif","bar5.gif","bar6.gif","bar7.gif"); #質問アイコン $qs_img = "q.gif"; #結果アイコン $rs_img = "res.gif"; #過去アイコン $od_img = "old.gif"; #配布元アイコン $dw_img = "down.gif"; #管理アイコン $ad_img = "ad.gif"; #拡縮アイコン $wn_img = "win.gif"; #新着アイコン $nw_img = "new.gif"; #以下は特に変更の必要はありません―――――――――――――――― $ptname = "pt.log"; $lock = "lock"; $web = "http://paxs.hp.infoseek.co.jp/"; #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃デコード処理 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ my ($time, $pflag, $date, $datesize, @DATE, %FORMS, @DEL, @EDIT); $ENV{'TZ'} = "JST-9"; $time = time; if ($ENV{'REQUEST_METHOD'} eq "POST") { read (STDIN, $date, $ENV{'CONTENT_LENGTH'}); $pflag = 1; } else { $date = $ENV{'QUERY_STRING'}; } if ($datesize and ($datesize != $ENV{'CONTENT_LENGTH'})) { undef ($datesize); &error ("データを正しく受け取れませんでした"); } @DATE = split (/&/, $date); foreach (@DATE) { my ($key, $val) = split (/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; #&jcode::h2z_sjis (\$val); &jcode::convert (\$val, "sjis", "", "z"); $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s//>/g; #選択肢のみ改行処理 if ($key eq "sel") { $val =~ s/\r\n/
/g; $val =~ s/\r/
/g; $val =~ s/\n/
/g; } elsif ($key eq "hkick") { $val =~ s/\r\n/;/g; $val =~ s/\r/;/g; $val =~ s/\n/;/g; } else { $val =~ s/\r\n//g; $val =~ s/\r//g; $val =~ s/\n//g; } #削除コメントを配列へ if ($key eq "delarray") { push (@DEL, $val); } $FORMS{$key} = $val; if ($key eq "pass") { if (!$val) { &error ("パスワードが入力されていません"); } } elsif ($key =~ /whi|cleng|nmark/) { if (!$val) { &error ("送信内容に記入漏れがあります"); } elsif ($val =~ /\D/) { &error ("送信内容に全角数字が含まれています"); } } push (@EDIT, "$key=$val\n"); } undef (@DATE); #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃設定ファイル読み込み #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ my $set = $ldir . "set.dat"; my %SET = (); my $now_lock = 0; if (!open (SET, "< $set")) { &error ("設定ファイルを開けませんでした"); } while (chomp ($_ = )) { my ($key, $val) = split (/=/); $SET{$key} = $val; } close (SET); #設定変更後に色指定を反映するための措置 if ($FORMS{'temp'}) { $SET{'bback'} = $FORMS{'bback'}; $SET{'bfont'} = $FORMS{'bfont'}; $SET{'hback'} = $FORMS{'hback'}; $SET{'hfont'} = $FORMS{'hfont'}; $SET{'alink'} = $FORMS{'alink'}; $SET{'vlink'} = $FORMS{'vlink'}; $SET{'hlink'} = $FORMS{'hlink'}; $SET{'efont'} = $FORMS{'efont'}; undef ($FORMS{'temp'}); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃モード分岐 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ if (!$FORMS{'mode'}) { &head (1, "管理パスワード認証画面"); &adcheck; &foot (1); } elsif ($FORMS{'mode'} eq "adcheck") { &head (1, "管理パスワード認証画面"); &adcheck; &foot (1); } elsif ($FORMS{'mode'} eq "on") { &on_poll; } elsif ($FORMS{'mode'} eq "result") { &result; } elsif ($FORMS{'mode'} eq "cview") { &com_view; } elsif ($FORMS{'mode'} eq "old") { &old; } #以下モードはクエリ排除 if (!$pflag) { &error ("不正なアクセスです"); } if ($FORMS{'mode'} eq "admin") { if (!$FORMS{'pass'} or $FORMS{'pass'} ne $SET{'pass'}) { &error ("管理パスワードが認証されませんでした"); } else { &admin; &foot (1); } } elsif ($FORMS{'mode'} eq "set") { &head (1, "設定変更フォーム"); &set_form; &foot (1); } elsif ($FORMS{'mode'} eq "s_edt") { &set_edit; } elsif ($FORMS{'mode'} eq "new") { &head (1, "新規投票作成フォーム"); &form; &foot (1); } elsif ($FORMS{'mode'} eq "pre") { ⪯ &foot (1); } elsif ($FORMS{'mode'} eq "nmk") { &new_make; } elsif ($FORMS{'mode'} eq "maint") { &maint; } elsif ($FORMS{'mode'} eq "edit") { if ($FORMS{'ing'} != 1) { &error ("設定変更は進行中の投票しか行えません"); } &head (1, "設定変更フォーム"); &form; &foot (1); } elsif ($FORMS{'mode'} eq "rel") { &relog; } elsif ($FORMS{'mode'} eq "comdel") { &com_delete; } elsif ($FORMS{'mode'} eq "re_set") { &re_set; } elsif ($FORMS{'mode'} eq "p_end") { &poll_end; } elsif ($FORMS{'mode'} eq "p_del") { &poll_del; } elsif ($FORMS{'mode'} eq "u_end") { &use_end; } else { &error ("不正なアクセスです"); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃管理モード 認証画面 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub adcheck { my ($p_edt); $p_edt = qq|

!!!

管理パスワードは『0123』です。早急に設定変更を行って下さい。


|; #パス0123は警告 if ($SET{'pass'} ne "0123") { $p_edt = "管理パスワードを入力してください
"; } print <
EOF } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票管理画面 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub admin { #再入室キーを取得 if (!$FORMS{'act'}) { $FORMS{'pass'} = $_[0]; } #ディレクトリをチェック unless (-e $ldir) { &error ("ログディレクトリを作成してください"); } #投票タイトルログ my $ptlog = $ldir . $ptname; #投票タイトルログをチェック unless (-e $ptlog) { if (!open (PT, ">$ptlog")) { &error ("投票タイトルログの作成に失敗しました"); } close (PT); chmod (0666, "$ptlog"); } my $p_edt = qq|
*初めてのアクセス時には「設定変更」から管理パスワードを変更して下さい。 |; if ($FORMS{'pass'} ne "0123") { undef ($p_edt); } #投票タイトルを取得 if (!open (PT, "<$ptlog")) { &error ("投票タイトルログが開けませんでした"); } &head (1, "投票管理画面"); print < *メンテナンス画面へ進むには、タイトルの前のボタンにチェックを入れて下さい。
*「投票を全削除」すると、作成した投票がすべて削除されます。 $p_edt

EOF my $idno = 1; #新規作成時のIDナンバー my $exflag = 0; #投票存在フラグ #投票タイトルを取得 while (chomp ($_ = )) { my ($id, $ptitle, $ing) = split (/<>/); print qq||; if ($ing == 1) { print qq||; print qq||; } elsif ($ing == 2) { print qq||; print qq||; } elsif (!$ing) { print qq||; print qq||; } print qq||; $idno ++; $exflag = 1; } close (PT); #リスト分岐 if (!$exflag) { print qq|
ID メンテ 投票タイトル
$id$ptitle$ptitle(終了)-$ptitle(削除)
- - 現在行われている投票はありません
|; } else { print "\n"; } print <
EOF } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃設定ファイル フォーム #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub set_form { my (%CHECK); #表示形式 if (!$SET{'rtype'}) { $CHECK{'rtp_0'} = " checked"; } else { $CHECK{'rtp_1'} = " checked"; } #コメント閲覧 if (!$SET{'ctype'}) { $CHECK{'ctp_0'} = " checked"; } else { $CHECK{'ctp_1'} = " checked"; } #ソート方式 if (!$SET{'stype'}) { $CHECK{'stp_0'} = " checked"; } elsif ($SET{'stype'} == 1) { $CHECK{'stp_1'} = " checked"; } elsif ($SET{'stype'} == 2) { $CHECK{'stp_2'} = " checked"; } #ファイルロック if (!$SET{'lkey'}) { $CHECK{'lky_0'} = " checked"; } else { $CHECK{'lky_1'} = " checked"; } print < *全投票共通の設定です。
*色指定に漏れ・誤りがあると、色が正常に反映されませんのでご注意ください。
*結果表\示・小窓サイズ・色指定を変更した場合、ソ\ースを交換して下さい。
*ホスト制限は最後の部分を省いて下さい。(127.0.0.1 -> 127.0.0)
投票全体のタイトル
ホームページ
管理パスワード ※半角英数字のみ
結果表\示 小窓で開く 既存のウィンドウで開く
コメント閲覧制限 誰でも可 管理者のみ
投票結果のソ\ート 行わない 昇順 降順
小窓の高さ ※半角数字のみ/標準:302(選択肢4つ)
コメントの長さ ※半角数字のみ/機\能\利用時に取得できる文字長(全角換算)
コメントの新着マーク 時間以内 ※半角数字のみ
ファイルロック ロックしない ロックする
ホスト制限 ※一行に一件ずつ

全体の背景色とフォント色 / (背景/フォント)
ヘッダーの下地とフォント色 / (下地/フォント)
リンク / / (通常/訪問済み/マウスオーバー)
投票フレーム色とフォント色 / (フレーム/フォント)
投票データ部の下地とフォント色 / (下地/フォント)
投票フレームの影 (投票データ部の下地と同じ色でも良)
強調フォント色 (注釈ほか、投票期間などの色)



EOF } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃設定ファイル 作成 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub set_edit { #modeとtempを削除 pop (@EDIT); pop (@EDIT); #変更不可能な事項を追加 push (@EDIT, "bhi=$SET{'bhi'}\n"); if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; if (!open (SET, "+< $set")) { &error ("設定ファイルを開けませんでした"); } seek (SET, 0, 0); print SET @EDIT; truncate (SET, tell); close (SET); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } #削除後対策のため、再入室キーを削除 undef ($FORMS{'act'}); &admin ($FORMS{'pass'}); &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票作成フォーム #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub form { my ($setline); if ($FORMS{'mode'} eq "new") { print qq|
*設定は各投票ごとに区別されます。
*コメントは限界数を超えると「古い方から順」に削除されます。
*投票の自動終了は「条件に一致した方」が優先されます。

\n |; } else { my $idlog = $ldir . $FORMS{'id'} . ".log"; if (!open (ID, "<$idlog")) { &error ("投票ログが開けませんでした"); } $setline = ; close (ID); } #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline) if ($setline); #フォーム内容の定義(設定変更時用) my (%CHECK); if ($FORMS{'mode'} ne "new") { #閲覧制限 if ($reye) { $CHECK{'rch_1'} = " checked"; } else { $CHECK{'rch_0'} = " checked"; } #コメント取得 if (!$cget) { $CHECK{'cgt_0'} = " checked"; } elsif ($cget == 1) { $CHECK{'cgt_1'} = " checked"; } elsif ($cget == 2) { $CHECK{'cgt_2'} = " checked"; } #連続投票禁止 if (!$pkick) { $CHECK{'pkc_0'} = " checked"; } elsif ($pkick == 1) { $CHECK{'pkc_1'} = " checked"; } #連続投票禁止 if (!$kunit) { $CHECK{'kut_0'} = " checked"; } elsif ($kunit == 1) { $CHECK{'kut_1'} = " checked"; } elsif ($kunit == 2) { $CHECK{'kut_2'} = " checked"; } #残り日数 my $p_bef = sprintf ("%.1f", ($period - $time) / 86400); $period = (int ($p_bef) == $p_bef) ? sprintf ("%d", $p_bef) : int ($p_bef) + 1; if (!$cget) { undef ($climit); } if (!$kval) { undef ($kval); } if (!$plimit) { undef ($plimit); } if ($end eq "無期限") { undef ($period); } } else { $CHECK{'rch_1'} = " checked"; $CHECK{'cgt_0'} = " checked"; $CHECK{'pkc_0'} = " checked"; $CHECK{'kut_0'} = " checked"; } print <
EOF if ($FORMS{'mode'} eq "new") { print qq| |; } #新規作成、設定変更共用フォーム print < EOF if ($FORMS{'mode'} eq "new") { print qq|
質問内容
選択肢
・選択肢は1行につき一つずつ記入してください(点や英数字は要りません)
・選択肢は最低2つ以上用意してください
結果閲覧 未投票時は不可 いつでも可
コメント取得 未使用 任意 必須
コメント限界数 選択肢一つにつき個まで
(半角数字、0か未記入なら5個まで、機\能\使用時のみ反映)
連続投票禁止機\能\ 未使用 使用
連続投票禁止期間 時間
(左/半角数字、右/単位、0か未記入なら一人一回、機\能\使用時のみ反映)
投票期間 日間
(半角数字、0か未記入なら無期限、指定期間で自動終了)
限界投票数
(半角数字、0か未記入なら無期限、指定票で自動終了)



|; } else { print qq|


|; } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票作成 確認 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub pre { my ($sel_d, @SEL, $ing_ms); if ($FORMS{'mode'} eq "pre") { #選択肢の内容は送信用と確認用を用意 $sel_d = $FORMS{'sel'}; #確認用の選択肢を配列に代入 @SEL = split (/
/, $FORMS{'sel'}); #送信内容確認 if (!$FORMS{'qst'}) { &error ("質問内容が記入されていません"); } elsif (!$SEL[1]) { &error ("選択肢は最低2つ以上用意してください"); } #投票状況 $ing_ms = "進行中"; } else { my ($reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = @_; $FORMS{'reye'} = $reye; $FORMS{'cget'} = $cget; $FORMS{'climit'} = $climit; $FORMS{'pkick'} = $pkick; $FORMS{'kval'} = $kval; $FORMS{'kunit'} = $kunit; $FORMS{'plimit'} = $plimit; $FORMS{'start'} = $start; $FORMS{'end'} = $end; if ($ing == 1) { $ing_ms ="進行中"; } else { $ing_ms ="終了"; } } #結果閲覧フラグ(添え字は$FORMS{'reye'}) my @REYE = qw (未投票時は不可 いつでも可); #結果表示タイプ / コメント閲覧制限 my @RTYPE = qw (小窓を開く 小窓を開かない); my @CTYPE = qw (誰でも可 管理者のみ); #投票期間 if ($FORMS{'period'} =~ /\D/) { &error ("投票期間に無効な数値が含まれています"); } #開始日と終了日 if ($FORMS{'mode'} eq "pre") { &opening; &finale; } #コメント取得($FORMS{'cget'} = 使用未使用 / $FORMS{'climit'} = 取得数) my ($c_ms, $c_lt); if ($FORMS{'climit'} =~ /\D/) { &error ("限界コメント数に無効な数値が含まれています"); } elsif (!$FORMS{'climit'}) { $FORMS{'climit'} = 5; } if (!$FORMS{'cget'}) { $c_ms = "未使用"; $c_lt = "未設定"; } elsif ($FORMS{'cget'} == 1) { $c_ms = "任意"; $c_lt = "各$FORMS{'climit'}個まで"; } elsif ($FORMS{'cget'} == 2) { $c_ms = "必須"; $c_lt = "各$FORMS{'climit'}個まで"; } #連禁期間(添え字は$FORMS{'kunit'}) my ($k_ms); my @KUNIT = qw (分 時間 日); if(!$FORMS{'pkick'}) { $k_ms = "未設定"; $FORMS{'kval'} = 0; } else { if (!$FORMS{'kval'}) { $k_ms = "一人一回"; $FORMS{'kval'} = 0; } else { $k_ms = "$FORMS{'pkick'}$KUNIT[$FORMS{'kunit'}]に一回"; } } #限界投票 my $pl_ms; if ($FORMS{'plimit'} =~ /\D/) { &error ("限界投票数に無効な数値が含まれています"); } elsif (!$FORMS{'plimit'}) { $pl_ms = "未設定"; } else { $pl_ms = "$FORMS{'plimit'}票まで"; } if ($FORMS{'mode'} eq "pre") { &head (1, "新規投票作成確認画面"); print qq|
*下記の内容でよろしければ、「この内容で作成する」ボタンを押してください。
*内容に訂正があれば「戻る」ボタンを押してください。
*作成後に質問、選択肢の内容を変えることはできません。
*設定、フォームデザインは設置後でも自由に変更することができます。


\n |; } #設定テーブル print <
投票状況 $ing_ms 開始日 $FORMS{'start'} 終了日 $FORMS{'end'}
限界投票数 $pl_ms コメント取得 $c_ms コメント限界数 $c_lt
連投禁止期間 $k_ms 結果閲覧 $REYE[$FORMS{'reye'}] コメント閲覧 $CTYPE[$SET{'$ctype'}]
結果表\示 $RTYPE[$SET{'rtype'}]        


EOF if ($FORMS{'mode'} eq "pre") { #投票フォームサンプル print qq|
$FORMS{'qst'}
\n |; #選択肢部を展開 my $no = 1; foreach (0 .. $#SEL) { my $check = " checked" if ($no == 1); print qq|
$SEL[$_]
\n|; $no ++; undef ($check); } print qq|

|; #コメントフォームを展開 if ($FORMS{'cget'}) { print qq| コメント


|; } print qq|

結果 過去の投票 Petit Poll SE ダウンロード 管理


\n |; } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票作成 更新 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub new_make { #ログを定義 my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; #投票タイトルログを開く if (!open (PT, "+<$ptlog")) { &error ("投票タイトルログが開けませんでした"); } my @PNEW = (); while (chomp ($_ = )) { my ($id, $qst, $ing) = split (/<>/, $_); #二重作成チェック if ($id eq $FORMS{'id'}) { &error ("既に投票作成が完了しています"); } elsif ($qst eq $FORMS{'qst'}) { &error ("同じ質問の投票が作成済みです"); } push (@PNEW, "$_\n"); } #新規配列追加 push (@PNEW, "$FORMS{'id'}<>$FORMS{'qst'}<>1\n"); seek (PT, 0, 0); print PT @PNEW; truncate (PT, tell); close(PT); #IDログを作成 if (!open (ID, ">$idlog")) { &error ("投票ログの作成に失敗しました"); } seek (ID, 0, 0); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ print ID "0<>$FORMS{'qst'}<>$FORMS{'reye'}<>$FORMS{'cget'}<>$FORMS{'climit'}<>$FORMS{'pkick'}<>$FORMS{'kval'}<>$FORMS{'kunit'}<>$FORMS{'period'}<>$FORMS{'plimit'}<>$FORMS{'start'}<>$FORMS{'end'}<>1\n"; my $no = 1; my @SEL = split (/<BR>/, $FORMS{'sel'}); foreach (0 .. $#SEL) { print ID "$no<><>$SEL[$_]<><><>0\n"; $no++; } truncate (ID, tell); close (ID); chmod (0666, "$idlog"); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &head (1, "投票フォーム ソ\ース"); print < *下のソ\ースをコピーして、設置したいHTMLファイルに\貼\り付けてください。
*こちらのソ\ースは、メンテナンスモードでいつでも確認ができます。

EOF &sourse (0, 0, @SEL); &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ソース #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub sourse { my ($qst, $cget, @SEL) = @_; $FORMS{'qst'} ||= $qst; my ($front, $button, $rslink); #小窓使用未使用の分岐(前FORM / 投票ボタン / 結果リンク) if ($SET{'rtype'}) { $front = "<FORM method="POST" action="$fpath">"; $button = "<INPUT type="submit" value="投票">"; $rslink = "<A href="$fpath?mode=result&id=$FORMS{'id'}">
<IMG src="$idir$rs_img" alt="結果" border="0"></A>"; } else { $front = "<FORM name="pollform$FORMS{'id'}">"; $button = "<INPUT type="button" value="投票"onClick="OpenWin$FORMS{'id'}()">"; $rslink = "<A href="JavaScript:ResultWin('$FORMS{'id'}')">
<IMG src="$idir$rs_img" alt="結果" border="0"></A>"; } print qq|
\n|; #小窓使用未使用&コメント有無の分岐 if (!$SET{'rtype'}) { print qq| <!-- Petit Poll JavaScript ID$FORMS{'id'}-->
<SCRIPT type="text/javascript">
<!--
function OpenWin$FORMS{'id'}() {
var id = document.pollform$FORMS{'id'}.id.value;
|; if ($FORMS{'cget'} or $cget) { print qq| var com = document.pollform$FORMS{'id'}.com.value;

if (com == "") {
document.pollform$FORMS{'id'}.com.value = \'none\';
com = document.pollform$FORMS{'id'}.com.value;
} else {
com = document.pollform$FORMS{'id'}.com.value;
}

|; } print qq| var poll = 0;

for (var i=0; i < document.pollform$FORMS{'id'}.poll.length; i++) {
if (document.pollform$FORMS{'id'}.poll[i].checked) {
poll = document.pollform$FORMS{'id'}.poll[i].value;
}
}

if (poll == 0) {
alert ("項目がチェックされていません!");
} else {
|; if ($FORMS{'cget'} or $cget) { print qq|window.open (\'$fpath?mode=on&id=\'+id+\'&poll=\'+poll+\'&com=\'+com, \'newwin\', \'menubar=no, scrollbars=yes, width=330, height=$SET{'whi'}\');
\n|; } else { print qq|window.open(\'$fpath?mode=on&id=\'+id+\'&poll=\'+poll, \'newwin\', \'menubar=no, scrollbars=yes, width=330, height=$SET{'whi'}\');
\n|; } print qq| }
}

function ResultWin (Id) {
window.open(\'$fpath?mode=result&id=\'+Id,\'newwin\',\'menubar=no, scrollbars=yes, width=330, height=$SET{'whi'}\');
}
//-->
</SCRIPT>
<!-- Petit Poll JavaScript ID$FORMS{'id'} END -->

|; } #投票フォームサンプル print < $front
<DIV style="font-size:13px;width:180px;background-color:$SET{'rback1'};border:solid 1px $SET{'rback2'};padding:3px;">
<DIV style="width:100%;color:$SET{'rfont1'};text-align:left;padding-bottom:3px;">
<IMG src="$idir$qs_img" alt="質問"> $FORMS{'qst'}
</DIV>
<DIV style="width:100%;text-align:left;background-color:$SET{'rback2'};color:$SET{'rfont2'};border-top:solid 2px $SET{'rshadow'};border-left:solid 2px $SET{'rshadow'};padding:3px;">
EOF #選択肢部を展開 my $no = 1; foreach (0 .. $#SEL) { my $check = " checked" if ($no == 1); print qq|<DIV style="padding:3px;"><INPUT type="radio" name="poll" value="$no"$check>$SEL[$_]</DIV>
\n|; $no ++; undef ($check); } print qq| <DIV align="center"><BR>
<INPUT type="hidden" name="id" value="$FORMS{'id'}">
|; if ($SET{'rtype'}) { print "<INPUT type="hidden" name="mode" value="on">"; } #コメントフォームを展開 if ($FORMS{'cget'} or $cget) { print qq| コメント<BR>
<INPUT type="text" size="25" name="com"><BR><BR>
|; } print < </DIV>
</DIV>
<SPAN style="width:100%;text-align:right;padding-top:3px;">
$rslink
<A href="$fpath?mode=old">
<IMG src="$idir$od_img" border="0" alt="過去の投票" title="過去の投票"></A>
<A href="$web" target="_blank">
<IMG src="$idir$dw_img" border="0" alt="Petit Poll SE ダウンロード"></A>
<A href="$fpath">
<IMG src="$idir$ad_img" border="0" alt="管理" title="管理"></A>
</SPAN>
</DIV>
</FORM>

EOF if ($FORMS{'mode'} eq "nmk") { print qq|
|; } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票処理 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub on_poll { #ログを定義 my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; unless (-e $idlog) { &error ("呼び出された投票は削除されています"); } if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; if (!open (ID, "<$idlog")) { &error ("投票ログが開けませんでした"); } my @OLDID = ; close (ID); #設定ラインを抜く chomp (my $setline = shift (@OLDID)); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split(/<>/, $setline); #投票期間チェック if ($period and ($ing == 1) and ($time >= $period)) { #投票タイトルログ更新 my @NEWPT=(); if (!open (PT, "+<$ptlog")) { &error("投票タイトルログが開けませんでした"); } while (chomp ($_ = )){ my ($id, $ptitle, $ing) = split(/<>/); if ($FORMS{'id'} eq $id) { push (@NEWPT, "$id<>$ptitle<>2\n"); } else { push (@NEWPT, "$_\n"); } } #IDログ更新 if (!open (ID, "+<$idlog")) { &error ("投票ログが開けませんでした"); } seek (ID, 0, 0); print ID "$count<>$qst<>$reye<>$cget<>$climit<>$pkick<>$kval<>$kunit<>$period<>$plimit<>$start<>$end<>2\n"; print ID @OLDID; truncate (ID, tell); close (ID); seek (PT, 0, 0); print PT @NEWPT; truncate (PT, tell); close (PT); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &error ("この投票は終了しました"); } #進行状況チェック if ($ing == 2) { &error ("この投票は終了しました"); } #投票項目チェック if (!$FORMS{'poll'}) { &error ("投票項目がチェックされていません"); } #アクセス拒否 my $ip = $ENV{'REMOTE_ADDR'}; my $ip2 = $ip; $ip2 =~ s/(\d+\.\d+\.\d+)\.\w+/$1/; if ($SET{'hkick'} =~ /$ip2/) { &error ("投票が許可されていません"); } #コメントチェック if ($FORMS{'com'} eq "undefined" or !$FORMS{'com'}) { $FORMS{'com'} = "none"; } if (($cget == 2) and ($FORMS{'com'} eq "none")) { &error ("選択項目へのコメントは必須です"); } if (length ($FORMS{'com'}) > ($SET{'cleng'} * 2)) { &error ("コメントは全角で$SET{'cleng'}字以内までです"); } if ($FORMS{'com'} eq "none") { undef ($FORMS{'com'}); } #閲覧制限&連続投票チェック my ($getcook) = &get_cook (1, $pkick, $kval, $kunit) if (!$reye or $pkick); #投票数 $count ++; my $com_ct = 0; #コメント数 my @ID = (); #選択項目をインクリ&コメント追加 while (chomp ($_ = shift (@OLDID))) { #ID親/ID子/選択肢orコメント/投票時間/ホスト/投票数orコメント# my ($idno, $idsel, $idq, $idj, $idh, $idct) = split(/<>/); #投票先を捜索 if (($idno eq $FORMS{'poll'}) or ($idsel eq $FORMS{'poll'})) { #選択肢ライン更新(親) if ($idno eq $FORMS{'poll'}) { $idct ++; push (@ID, "$idno<><>$idq<><><>$idct\n"); #コメント追加 if ($FORMS{'com'}) { push (@ID, "<>$idno<>$FORMS{'com'}<>$time<>$ip<>$count\n"); $com_ct = 1; #コメントカウント } }else{ #コメントライン追加(子)&コメント限界チェック if ($climit > $com_ct) { push (@ID, "$_\n"); $com_ct ++; } } } else { #無投票配列 push (@ID, "$_\n"); } } #限界投票チェック if ($plimit and ($count >= $plimit)){ my @NEWPT=(); if (!open (PT, "+<$ptlog")) { &error("投票タイトルログが開けませんでした"); } while (chomp ($_ = )){ my ($id, $ptitle, $ing) = split(/<>/, $_); if ($id eq $FORMS{'id'}) { push (@NEWPT, "$id<>$ptitle<>2\n"); } else { push (@NEWPT, "$_\n"); } } #終了日を定義 &opening; #結果表示用の日付 $end = $FORMS{'start'}; if (!open (ID, "+<$idlog")) { &error ("投票ログが開けませんでした"); } seek (ID, 0, 0); print ID "$count<>$qst<>$reye<>$cget<>$climit<>$pkick<>$kval<>$kunit<>$period<>$plimit<>$start<>$end<>2\n"; print ID @ID; truncate(ID,tell); close(ID); seek (PT, 0, 0); print PT @NEWPT; truncate (PT, tell); close (PT); } else { #通常更新 if (!open (ID, "+<$idlog")) { &error ("投票ログが開けませんでした"); } seek (ID, 0, 0); print ID "$count<>$qst<>$reye<>$cget<>$climit<>$pkick<>$kval<>$kunit<>$period<>$plimit<>$start<>$end<>$ing\n"; print ID @ID; truncate(ID,tell); close(ID); } if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } #クッキー設定 if (!$reye or $pkick) { &set_cook ($getcook); } if ($SET{'stype'} == 1) { my @TMP = map {(split /<>/)[5]} @ID; @ID = @ID[sort{$TMP[$b] <=> $TMP[$a]} 0 .. $#TMP]; } elsif ($SET{'stype'} == 2) { my @TMP = map {(split /<>/)[5]} @ID; @ID = @ID[sort{$TMP[$a] <=> $TMP[$b]} 0 .. $#TMP]; } #小窓使用未使用の分岐 my $cpflag = 0; if ($SET{'rtype'}) { &head (1, "投票結果"); $cpflag = 1; } else { &head (0); } &rs_table_top ($count, $qst, $start, $end); print qq|
    \n|; my ($num); while (chomp ($_ = shift (@ID))) { #選択肢#(親) / 選択肢#(子) / 選択肢 / 投票秒数 / ホスト / 投票数 or 投票番号 my ($idno, $idsel, $idq, $idj, $idh, $idct) = split(/<>/); my $rate = 1.7; if ($SET{'rtype'}) { $rate = 3; } my $per = sprintf ("%.1f", ($idct * 100) / $count); #パーセンテージ my $wid = sprintf ("%d", $per * $rate); #画像幅 if (!$GAZOU[$num]) { $num = 0; } #バー画像# #親のみ展開 if ($idno) { print "
  1. $idq
    \n"; if ($wid >= 0) { if ($wid <= 0) { $wid = 1; } print qq| $per\% ($idct票/$per%)

  2. \n |; } else { print qq| 0\% (0票/0%)

    \n |; } $num++; } } print "
\n"; &rs_table_bottom ($FORMS{'id'}, $cget, 1); print "\n"; &foot ($cpflag); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票結果 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub result { #ログを定義 my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; unless (-e $idlog) { &error ("呼び出された投票は削除されています"); } if (!open (ID, "+<$idlog")) { &error("投票ログを開けませんでした"); } my @ID = ; #設定ラインを抽出 chomp (my $setline = shift (@ID)); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); #閲覧制限チェック my ($getcook, $ckflag) = &get_cook if (!$reye and $ing == 1); if (!$reye and !$ckflag and !$FORMS{'r'} and $ing ==1) { &error ("投票前の結果の閲覧が制限されています"); } #投票期間チェック if ($ing == 1 and $period and $time >= $period and !$FORMS{'r'}){ if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; my @NEWPT = (); if (!open (PT, "+<$ptlog")) { &error("投票タイトルログが開けませんでした"); } while (chomp ($_ = )){ my ($id, $ptitle, $ing) = split(/<>/); if ($id eq $FORMS{'id'}) { push (@NEWPT, "$id<>$ptitle<>2\n"); } else { push (@NEWPT, "$_\n"); } } seek (PT, 0, 0); print PT @NEWPT; truncate (PT, tell); close(PT); #IDログ更新 seek(ID, 0, 0); print ID "$count<>$qst<>$reye<>$cget<>$climit<>$pkick<>$kval<>$kunit<>$period<>$plimit<>$start<>$end<>2\n"; print ID @ID; truncate (ID, tell); close (ID); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } } if ($SET{'stype'} == 1) { my @TMP = map {(split /<>/)[5]} @ID; @ID = @ID[sort{$TMP[$b] <=> $TMP[$a]} 0 .. $#TMP]; } elsif ($SET{'stype'} == 2) { my @TMP = map {(split /<>/)[5]} @ID; @ID = @ID[sort{$TMP[$a] <=> $TMP[$b]} 0 .. $#TMP]; } #小窓使用未使用の分岐 my $cpflag = 0; if ($SET{'rtype'} or $FORMS{'r'}) { &head (1, "投票結果"); $cpflag = 1; } else { &head (0); } &rs_table_top ($count, $qst, $start, $end); print qq|
    \n|; $count ||= 1; my ($num); while (chomp ($_ = shift (@ID))) { #選択肢#(親) / 選択肢#(子) / 選択肢 / 投票秒数 / ホスト / 投票数 or 投票番号 my ($idno, $idsel, $idq, $idj, $idh, $idct) = split(/<>/); my $rate = 1.7; if ($SET{'rtype'} or $FORMS{'wide'} or $FORMS{'r'}) { $rate = 3; } my $per = sprintf ("%.1f", ($idct * 100) / $count); #パーセンテージ my $wid = sprintf ("%d", $per * $rate); #画像幅 if (!$GAZOU[$num]) { $num = 0; } #バー画像# #親のみ展開 if ($idno) { print "
  1. $idq
    \n"; if ($wid >= 0) { if ($wid <= 0) { $wid = 1; } print qq| $per\% ($idct票/$per%)

  2. \n |; } else { print qq| 0\% (0票/0%)

    \n |; } $num++; } } print "
\n"; &rs_table_bottom ($FORMS{'id'}, $cget, 1); print "\n"; &foot ($cpflag); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票結果テーブル #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub rs_table_top { my ($count, $qst, $start, $end, $mikey) = @_; #拡大縮小アイコン my $wd_icon = < 拡大縮小 WIDE my ($wwid); if ($mikey) { $wwid = "330px"; undef ($wd_icon); } elsif ($SET{'rtype'} or $FORMS{'cdkey'} or $FORMS{'r'}) { $wwid = "500px"; undef ($wd_icon); } else { $wwid = "100%"; } print <
質問 $qst $wd_icon
[投票期間] $start 〜 $end [投票数] $count票
EOF } sub rs_table_bottom { my ($id, $cget, $cvflag) = @_; print <
EOF #過去ログ閲覧キー/通常時CLOSE/戻るボタン my ($root, $back, $p, $close); if ($FORMS{'r'}) { $root = qq||; $back = qq||; } else { if (!$SET{'rtype'}) { $close = qq||; } else { $back = qq||; } } #コメントボタン if (!$SET{'ctype'} and $cget and $cvflag) { print qq| $root $back |; } elsif ($FORMS{'mode'} eq "cview" and !$FORMS{'r'} and !$SET{'rtype'}) { print qq| $root |; } elsif ($back) { print "$back\n"; } #著作権部削除・改編厳禁!! print <
Petit Poll SE ダウンロード EOF } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃コメント閲覧 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub com_view { if (!$FORMS{'id'}) { ($FORMS{'id'}, $FORMS{'pass'}, $FORMS{'cdkey'}) = @_; } if ($SET{'ctype'} and !$FORMS{'cdkey'}) { &error ("コメントは管理者しか見ることができません"); } #ログを定義 my $idlog = $ldir . $FORMS{'id'} . ".log"; if (!open (ID, "+<$idlog")) { &error("投票ログを開けませんでした"); } #設定ラインを抽出 chomp (my $setline = ); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); if (!$cget) { &error ("コメント取得機\能\は使用していません"); } #小窓使用未使用の分岐 my $cpflag = 0; if ($FORMS{'cdkey'}) { &head (1, "コメント削除画面"); $cpflag = 1; } elsif ($SET{'rtype'} or $FORMS{'r'}) { &head (1, "コメント閲覧"); $cpflag = 1; } else { &head (0); } #削除モード 前タグ挿入 if ($FORMS{'cdkey'}) { print qq|
*削除したいコメントをチェックして削除ボタンを押すと削除することが出来ます。
*ホスト制限を行いたい場合、削除前にカッコ内の数字をメモしておいて下さい。
*送信後のやり直しはできませんので注意してください。(確認画面は出ません)


\n |; } &rs_table_top ($count, $qst, $start, $end); $count ||= 1; my ($r, $chflag, $new_com, $del_box, $host); while (chomp ($_ = )) { #選択肢#(親) / 選択肢#(子) / 選択肢 / 投票秒数 / ホスト / 投票数 or 投票番号 my ($idno, $idsel, $idq, $idj, $idh, $idct) = split(/<>/); if (!$r and $idno) { #先頭 print qq|

■$idq
    |; $r = $idno; } elsif ($idno) { if ($chflag) { #次親(前親にコメント有り) print qq|
|; } else { #次親(前親にコメント無し) print qq|
  • コメントはまだありません
  • |; } print qq|

    ■$idq
      |; #ルート更新、フラグゼロ $r = $idno; $chflag = 0; next; } elsif ($r eq $idsel) { #コメント if ($time < ($idj + ($SET{'nmark'} * 60 * 60))) { $new_com = qq |新着|; } #削除モード専用ボタン&ホスト表示 if ($FORMS{'cdkey'}) { $del_box = qq||; $host = qq|($idh)|; } print qq|
    1. $del_box $idq $host $new_com
    2. \n|; $chflag = 1; undef ($new_com); } } close (ID); if (!$chflag) { print qq|
    3. コメントはまだありません


    |; } else { print "

    \n"; } if (!$FORMS{'cdkey'}) { &rs_table_bottom ($FORMS{'id'}, $cget, 0); } else { #削除モード 後タグ挿入 print qq|
    \n |; } print "
    \n"; &foot ($cpflag); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃メンテナンス #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub maint { #再入室キーを取得 my ($id, $pass) = @_ if (!$FORMS{'act'}); #再入室対策でモードを固定 $FORMS{'mode'} = "maint"; if ($FORMS{'pass'} ne $SET{'pass'}) { &error("不正なアクセスです"); } elsif (!$FORMS{'id'}) { &error ("編集ボタンにチェックが入っていません"); } #ログを定義 my $idlog = $ldir . $FORMS{'id'} . ".log"; unless (-e $idlog) { &error ("呼び出された投票は削除されています"); } if (!open (ID, "+<$idlog")) { &error("投票ログが開けませんでした"); } chomp (my $setline = ); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); &head (1, "メンテナンス画面"); print < *「設定変更」から、各種設定を変更するためのフォームへ行くことが出来ます。
    *「コメント削除画面」では、コメントの閲覧、削除を行うことが出来ます。
    *コメントの有無を変更した場合、小窓の使用未使用を変更した場合は\ソ\ースを交換してください。
    *「投票リセット」すると、投票作成時の状態に戻します。(投票数ゼロで設定はデフォルト)
    *「投票終了」すると、この場で過去ログ化することができます。
    *「投票削除」すると、この投票が完全に削除されます。
    *送信後のやり直しはできませんのでご注意ください。(確認画面は出ません)




    EOF &pre ($reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing); &rs_table_top ($count, $qst, $start, $end, 1); print qq|
      \n|; $count ||= 1; my ($num, @SEL); while (chomp ($_ = )) { #選択肢#(親) / 選択肢#(子) / 選択肢 / 投票秒数 / ホスト / 投票数 or 投票番号 my ($idno, $idsel, $idq, $idj, $idh, $idct) = split(/<>/); my $per = sprintf ("%.1f", ($idct * 100) / $count); #パーセンテージ my $wid = sprintf ("%d", $per * 1.7); #画像幅 if (!$GAZOU[$num]) { $num = 0; } #バー画像# #親のみ展開 if ($idno) { print "
    1. $idq
      \n"; if ($wid >= 0) { if ($wid <= 0) { $wid = 1; } print qq| $per\% ($idct票/$per%)

    2. \n |; } else { print qq| 0\% (0票/0%)

      \n |; } $num++; push (@SEL, "$idq\n"); } } print <


      <ソ\ースを表\示する>
      EOF &sourse ($qst, $cget, @SEL); print <
      EOF &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃設定変更 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub relog { if ($FORMS{'climit'} =~ /\D/) { &error ("限界コメント数に無効な数値が含まれています"); } if ($FORMS{'plimit'} =~ /\D/) { &error ("限界投票数に無効な数値が含まれています"); } if ($FORMS{'kval'} =~ /\D/) { &error ("連続投票禁止期間に無効な数値が含まれています");} my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; if (!open (ID, "+<$idlog")) { &error("投票ログが開けませんでした"); } my @ID = ; chomp (my $setline = shift (@ID)); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); #終了日 &finale; #限界コメント if (!$FORMS{'climit'}) { $FORMS{'climit'} = 5;} #限界投票数のチェック if ($FORMS{'plimit'} and $FORMS{'plimit'} < $count) { &error ("指定された限界投票数は既に超えています"); } #コメントラインのチェックと削除 my (@NEWID, $ct); if ($FORMS{'cget'} and ($climit >= $FORMS{'climit'})) { while (chomp ($_ = shift (@ID))) { my ($idno, $idsel, $idq, $idj, $idh, $idct) = split (/<>/); if ($idno) { push (@NEWID, "$_\n"); $ct = 0; } elsif ($idsel and ($ct < $FORMS{'climit'})) { push (@NEWID, "$_\n"); $ct ++; } else { next; } } seek (ID, 0, 0); print ID "$count<>$qst<>$FORMS{'reye'}<>$FORMS{'cget'}<>$FORMS{'climit'}<>$FORMS{'pkick'}<>$FORMS{'kval'}<>$FORMS{'kunit'}<>$FORMS{'period'}<>$FORMS{'plimit'}<>$start<>$FORMS{'end'}<>1\n"; print ID @NEWID; truncate (ID, tell); close (ID); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &maint ($FORMS{'id'}, $FORMS{'pass'}); } seek (ID, 0, 0); print ID "$count<>$qst<>$FORMS{'reye'}<>$FORMS{'cget'}<>$FORMS{'climit'}<>$FORMS{'pkick'}<>$FORMS{'kval'}<>$FORMS{'kunit'}<>$FORMS{'period'}<>$FORMS{'plimit'}<>$start<>$FORMS{'end'}<>1\n"; print ID @ID; truncate (ID, tell); close (ID); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &maint ($FORMS{'id'}, $FORMS{'pass'}); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃コメント削除処理 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub com_delete { my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; if (!open (ID, "+<$idlog")) { &error ("投票ログが開けませんでした"); } chomp (my $setline = ); my (@NEWID, $dlflag, $val); while (chomp ($_ = )) { my ($idno, $selid, $idq, $idj, $idh, $idct) = split(/<>/); #コメントのみ削除 if (!$idno) { foreach $val (@DEL) { if ($idct eq $val){ $dlflag = 1; last; } } #対象外 if (!$dlflag) { push (@NEWID, "$_\n"); } } else { #選択肢 push (@NEWID, "$_\n"); } undef ($dlflag); } seek (ID, 0, 0); print ID "$setline\n"; print ID @NEWID; truncate (ID, tell); close (ID); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &com_view ($FORMS{'id'}, $FORMS{'pass'}, $FORMS{'cdkey'}); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票リセット #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub re_set { my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; if (!open (ID, "+<$idlog")) { &error ("投票ログが開けませんでした"); } chomp (my $setline = ); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); #開始日 &opening; #選択肢取得 my @ID = (); while (chomp ($_ = )) { my ($idno, $selid, $idq, $idj, $idh, $idc) = split (/<>/); if ($idno) { push (@ID, "$idno<><>$idq<><><>0\n"); } } #投票タイトルログ更新 if ($ing != 0) { my @PT = (); if (!open (PT, "+<$ptlog")) { &error ("投票タイトルログが開けませんでした"); } while (chomp ($_ = )){ my ($id, $ptitle, $ing) = split (/<>/, $_); if ($id eq $FORMS{'id'}) { push (@PT, "$id<>$ptitle<>1\n"); } else { push (@PT, "$_\n"); } } seek (PT, 0, 0); print PT @PT; truncate (PT, tell); close (PT); } seek (ID, 0, 0); print ID "0<>$qst<>1<>0<>5<>0<>0<>0<>0<>0<>$FORMS{'start'}<>無期限<>1\n"; print ID @ID; truncate (ID, tell); close (ID); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &maint ($FORMS{'id'}, $FORMS{'pass'}); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票終了 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub poll_end { my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; #PTログ更新 my @PT = (); if (!open (PT, "+<$ptlog")) { &error("投票タイトルログが開けませんでした"); } while (chomp ($_ = )) { my ($id, $ptitle, $ing) = split(/<>/); if ($id eq $FORMS{'id'}) { push (@PT, "$id<>$ptitle<>2\n"); } else { push (@PT, "$_\n"); } } #IDログ更新 if (!open (ID, "+<$idlog")) { &error("投票ログが開けませんでした"); } my @ID = ; chomp (my $setline = shift (@ID)); #投票数/質問/閲覧制限/コメント取得/コメント限界/連禁/連禁期間/連禁単位/終了秒数/限界投票/開始時刻/終了時刻/ingフラグ my ($count, $qst, $reye, $cget, $climit, $pkick, $kval, $kunit, $period, $plimit, $start, $end, $ing) = split (/<>/, $setline); #終了日を定義 &opening; seek (ID, 0, 0); print ID "$count<>$qst<>$reye<>$cget<>$climit<>$pkick<>$kval<>$kunit<>$period<>$plimit<>$start<>$FORMS{'start'}<>2\n"; print ID @ID; truncate (ID, tell); close (ID); seek (PT, 0, 0); print PT @PT; truncate(PT, tell); close (PT); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } &maint ($FORMS{'id'}, $FORMS{'pass'}); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票削除 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub poll_del { my $ptlog = $ldir . $ptname; my $idlog = $ldir . $FORMS{'id'} . ".log"; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; my @PT = (); if (!open (PT, "+<$ptlog")) { &error ("投票タイトルログが開けませんでした"); } while (chomp ($_ = )) { my ($id, $ptitle, $ing) = split (/<>/); if ($id eq $FORMS{'id'}) { push (@PT, "$id<>$ptitle<>0\n"); if (-e $idlog) { unlink ("$idlog"); } } else { push (@PT, "$_\n"); } } seek (PT, 0, 0); print PT @PT; truncate (PT, tell); close(PT); if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } #削除後対策のため、再入室キーを削除 undef ($FORMS{'act'}); &admin ($FORMS{'pass'}); &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃過去ログ #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub old { my $ptlog = $ldir . $ptname; unless (-e $ptlog) { &error ("この投票の利用は休止されています"); } #現在行われている投票タイトルを取得 if (!open(PT, "<$ptlog")) { &error ("過去ログが開けませんでした"); } &head (1, "過去投票"); print <
      EOF my $odflag = 0; while (chomp ($_ = )) { my ($id, $ptitle, $ing) = split (/<>/); if ($ing == 2) { print qq||; print qq||; $odflag= 1; } } close(PT); if (!$odflag) { print qq|
      ID 投票タイトル
      $id$ptitle
      - 終了した投票はありません
      |; } print <


      EOF &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃投票全削除 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub use_end { my $ptlog = $ldir . $ptname; if ($SET{'lkey'}) { if (!&lock_on) { &error ("サーバーが混み合っています"); } } $now_lock = 1; #投票タイトルログを初期化 if (!open (PT, "+<$ptlog")) { &error ("投票タイトルログを開けませんでした"); } my @PT = ; my $on = @PT; seek (PT, 0, 0); truncate (PT, tell); close (PT); #各投票ログを全削除 my ($i); for ($i = 1; $i <= $on; $i ++) { my $idlog = $ldir . $i . ".log"; if (-e $idlog) { unlink ("$idlog"); } undef ($idlog); } if ($SET{'lkey'} and $now_lock) { rmdir ($lock); } #削除後対策のため、再入室キーを削除 undef ($FORMS{'act'}); &admin ($FORMS{'pass'}); &foot (1); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃開始日 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub opening { my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime ($time); $mon++; $year += 1900; $year = substr ("$year", 2); $FORMS{'start'} = sprintf ("%s/%02d/%02d", $year, $mon, $mday); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃終了日 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub finale { if (!$FORMS{'period'}) { $FORMS{'end'} = "無期限"; $FORMS{'period'} = 0; } else { $FORMS{'period'} = $time + (60 * 24 * 60 * $FORMS{'period'}); my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime ($FORMS{'period'}); $mon++; $year += 1900; $year = substr ("$year", 2); $FORMS{'end'} = sprintf ("%s/%02d/%02d", $year, $mon, $mday); } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキー取得 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub get_cook { my ($pcflag, $pkick, $kval, $kunit) = @_; my ($tani, $kakeru, %COOKIE, $ckflag, $getcook); if ($pcflag) { if (!$kunit) { $tani = "分"; $kakeru = 60; } elsif ($kunit == 1) { $tani = "時間"; $kakeru = 3600; } elsif ($kunit == 2) { $tani = "日"; $kakeru = 86800; } } foreach (split (/;/, $ENV{'HTTP_COOKIE'})) { my ($key, $val) = split (/=/); $COOKIE{$key} = $val; } foreach (split (/,/, $COOKIE{'PPSE'})) { my ($key, $val) = split (/<>/); if ($key eq $FORMS{'id'}) { if ($pcflag) { if ($pkick and !$kval) { &error ("投票は一人一回しかできません"); } elsif ($val + ($kval * $kakeru) < $time) { $val = $time; } else { &error ("投票は$kval$taniに一回しかできません"); } } $ckflag = 1; } $getcook .= "$key<>$val,"; } if (!$ckflag and $pcflag) { $getcook .= "$FORMS{'id'}<>$time,"; } return ($getcook, $ckflag); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃クッキー設定 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub set_cook { my ($getcook) = @_; my @GMT = gmtime (time); my @MONTH = qw (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); my @WEEK = qw (Sun Mon Tue Wed Thu Fri Sat); my $gmt = sprintf ("%s,%02d-%s-%04d %02d:%02d:%02d GMT", $WEEK[$GMT[6]], $GMT[3] += 1, $MONTH[$GMT[4]], $GMT[5] += 2000, $GMT[2], $GMT[1], $GMT[0]); #my $cpath = $ENV{SCRIPT_NAME}; #$cpath =~ s/[^\/]*$//;; path=$cpath print "Set-Cookie: PPSE=$getcook; expires=$gmt\n"; } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ファイルロック ON #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub lock_on { my $ngflag = 0; my $retry = 5; if (-e $lock and ((stat ($lock))[9] < time - 60)) { rmdir ($lock); } while (!mkdir ($lock, 0755)) { if (--$retry <= 0) { $ngflag = 1; last; } sleep (1); } if ($ngflag) { return (0); } else { return (1); } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃エラー #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub error { if ($now_lock) { rmdir ($lock); } print "Content-type:text/html\n\n"; print < $_[0]



      ERROR!

      $_[0]










      EOF exit; } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃ヘッダー #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub head { #$hdflag=ヘッダー / $room=ルームネーム my ($hdflag, $room)= @_; #ページヘッダー my $hdline =< ▼ホームページ▲
      $room


      HEAD #ルームネームとマージン my ($margin); if (!$hdflag) { undef ($hdline); $margin = 0; } else { $margin = 13; } #ワイドウィンドウ my ($wact, $wname, $wkey, $wwin); if (!$FORMS{'wide'}) { $wname = "wide"; $wkey = 1; $wwin = 500; } else { $wname = "def"; $wkey = 0; $wwin = 330; } if ($FORMS{'mode'} eq "cview") { $wact = "cview"; } else { $wact = "result"; } print "Content-type:text/html\n\n"; print < $SET{'title'}
      $hdline EOF } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ #┃フッター(削除・改編厳禁) #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ sub foot { my ($cpflag) = @_; #これより以下の部分は削除改変厳禁 if ($cpflag) { $cpflag = qq (

      ); } else { undef ($cpflag); } print < EOF exit; } __END__