*下のソ\ースをコピーして、設置したい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 "$idq \n";
if ($wid >= 0) {
if ($wid <= 0) { $wid = 1; }
print qq|
($idct票/$per%) \n
|;
} else {
print qq|
(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 "$idq \n";
if ($wid >= 0) {
if ($wid <= 0) { $wid = 1; }
print qq|
($idct票/$per%) \n
|;
} else {
print qq|
(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 <
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";
&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 "$idq \n";
if ($wid >= 0) {
if ($wid <= 0) { $wid = 1; }
print qq|
($idct票/$per%) \n
|;
} else {
print qq|
(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 <
ID
投票タイトル
EOF
my $odflag = 0;
while (chomp ($_ = )) {
my ($id, $ptitle, $ing) = split (/<>/);
if ($ing == 2) {
print qq|$id |;
print qq|$ptitle |;
$odflag= 1;
}
}
close(PT);
if (!$odflag) {
print qq|
-
終了した投票はありません
|;
}
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]
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__