要望をもらったらので公開します。 出品者が自分の意志で落札させる機能です。 仕組みとしては my $can_end = 0; # 自分の出品を終了可能フラグ と $can_end = 1 if ($m{name} eq $from_name && $time > $bit_time); の記述で出品者が自分と同じ名前なら $can_end に 1 を立てる。 そしてその 1 を以下のように後置き if 文で判別してチェックボックスを作る。 $mes .= qq|<p><input type="checkbox" name="end" value="1">自分の出品を終了させる</p>| if $can_end; これでチェックボックスで end=1 のクエリ情報を準備。 そしてend=1を受け取ったら # 出品者による終了 elsif ($in{end}) { (以下略) の処理でオークションを落札させます。 まぁ、もしURLに直接 end=1 を書かれても、以下の記述ではじいてくれるので大丈夫です。 if ($m{name} eq $from_name && $time > $bit_time) 以下、ええタイの生コードです。 細かい部分で改造されているかも知れませんので、丸々コピーするとエラーになるかも。 細かい改造部分は10年前のことなので覚えてないです。 my $this_file = "$logdir/auction.cgi"; #================================================= # オークション Created by Merino # Edited by ごっつ #================================================= # 落札時間(日) my $limit_day = 3; # 最大出品数 my $max_auction = 30; # 出品禁止アイテム my %taboo_items = ( wea => [1,6,11,16,21,26], # 武器 egg => [], # タマゴ pet => [], # ペット ); #================================================= # 利用条件 #================================================= sub is_satisfy { if ($m{shogo} eq $shogos[1][0]) { $mes .= "$shogos[1][0]の方はお断りしています<br>"; &refresh; $m{lib} = 'shopping'; &n_menu; return 0; } return 1; } #================================================= sub begin { if ($m{tp} > 1) { $mes .= '他に何かしますか?<br>'; $m{tp} = 1; } else { $mes .= 'オークション会場に来ました<br>何をしますか?<br>'; } &menu('やめる','入札する','出品する'); } sub tp_1 { return if &is_ng_cmd(1,2); $m{tp} = $cmd * 100; &{ 'tp_'.$m{tp} }; } #================================================= # 入札 #================================================= sub tp_100 { $layout = 1; $mes .= qq|オークションの落札日数は、出品日から $limit_day日前後です<br>|; $mes .= qq|<form method="$method" action="$script">|; $mes .= qq|<input type="radio" name="$cmdd" value="0" checked>やめる<br>|; $mes .= $is_mobile ? qq|<hr>落札品/落札額/落札者/出品者<br>| : qq|<table class="table1" cellpadding="3">|. qq|<tr><th>落札品</th><th>落札額</th><th>落札者</th><th>出品者</th><th>入札必要額</th><th>終了時刻</th>|; my $can_end = 0; # 自分の出品を終了可能フラグ open my $fh, "< $this_file" or &error("$this_fileが読み込めません"); while (my $line = <$fh>) { my($bit_time, $no, $kind, $item_no, $item_c, $item_lv, $from_name, $to_name, $item_price) = split /<>/, $line; $can_end = 1 if ($m{name} eq $from_name && $time > $bit_time); my $need_money = int($item_price * 1.2); my ($mm, $hh, $dd, $mon) = (localtime($bit_time))[1..4]; my $end_time = sprintf("%d月%02d日%02d:%02d", $mon+1, $dd, $hh, $mm); my $item_title = $kind eq '1' ? "[$weas[$item_no][2]]$weas[$item_no][1]★$item_lv($item_c/$weas[$item_no][4])" : $kind eq '2' ? "[卵]$eggs[$item_no][1]($item_c/$eggs[$item_no][2])" : "[ペ]$pets[$item_no][1]" ; $mes .= $is_mobile ? qq|<hr><input type="radio" name="$cmdd" value="$no">|. qq|$item_title/$item_price G/$to_name/$from_name/入札必要額$need_money G/終了時刻$end_time<br>| : qq|<tr><td><input type="radio" name="$cmdd" value="$no">$item_title</td>|. qq|<td align="right">$item_price G</td><td>$to_name</td><td>$from_name</td>|. qq|<td align="right">$need_money G</td><td>$end_time</td></tr>|; } close $fh; $mes .= qq|</table>| unless $is_mobile; $mes .= qq|<p>入札金額:<input type="text" name="money" value="0" class="text_box1" style="text-align:right" class="text1">G</p>|; $mes .= qq|<p><input type="checkbox" name="end" value="1">自分の出品を終了させる</p>| if $can_end; $mes .= qq|<input type="hidden" name="id" value="$id"><input type="hidden" name="pass" value="$pass">|; $mes .= qq|<p><input type="submit" value="入札する" class="button1"></p></form>|; $m{tp} += 10; } sub tp_110 { $in{money} = int($in{money}); if ($m{money} < $in{money}) { $mes .= 'そんなにお金を持っていません<br>'; } # 出品者による終了 elsif ($in{end}) { open my $fh, "+< $this_file" or &error("$this_fileが開けません"); eval { flock $fh, 2; }; my @lines; my $is_ok = 0; while (my $line = <$fh>) { my($bit_time, $no, $kind, $item_no, $item_c, $item_lv, $from_name, $to_name, $item_price) = split /<>/, $line; if ($m{name} eq $from_name && $time > $bit_time) { my $item_title = $kind eq '1' ? "[$weas[$item_no][2]]$weas[$item_no][1]★$item_lv($item_c/$weas[$item_no][4])" : $kind eq '2' ? "[卵]$eggs[$item_no][1]($item_c/$eggs[$item_no][2])" : "[ペ]$pets[$item_no][1]" ; &send_item($to_name, $kind, $item_no, $item_c, $item_lv); &send_money($to_name, 'オークション会場', "-$item_price"); &send_money($from_name, 'オークション会場', $item_price); &write_send_news("$from_nameの出品した$item_titleを$to_nameが $item_price Gで落札しました"); $is_ok = 1; } else { push @lines, $line; } } seek $fh, 0, 0; truncate $fh, 0; print $fh @lines; close $fh; $mes .= "ズルしちゃダメよ♪<br>" unless $is_ok; } elsif ($cmd && $in{money} && $in{money} !~ /[^0-9]/) { my $is_rewrite = 0; my @lines = (); open my $fh, "+< $this_file" or &error("$this_fileが開けません"); eval { flock $fh, 2; }; while (my $line = <$fh>) { my($bit_time, $no, $kind, $item_no, $item_c, $item_lv, $from_name, $to_name, $item_price) = split /<>/, $line; if ($no eq $cmd) { my $need_money = int($item_price * 1.2); if ( $in{money} >= $need_money ) { my $item_title = $kind eq '1' ? "[$weas[$item_no][2]]$weas[$item_no][1]★$item_lv($item_c/$weas[$item_no][4])" : $kind eq '2' ? "[卵]$eggs[$item_no][1]($item_c/$eggs[$item_no][2])" : "[ペ]$pets[$item_no][1]" ; $mes .= "$item_titleに $in{money} Gで入札しました<br>"; $line = "$bit_time<>$no<>$kind<>$item_no<>$item_c<>$item_lv<>$from_name<>$m{name}<>$in{money}<>\n"; $is_rewrite = 1; } else { $mes .= "入札は現在の落札額の1.2倍以上の金額( $need_money G)が必要です<br>"; } push @lines, $line; } # 落札処理 elsif ($time > $bit_time) { my $item_title = $kind eq '1' ? "[$weas[$item_no][2]]$weas[$item_no][1]★$item_lv($item_c/$weas[$item_no][4])" : $kind eq '2' ? "[卵]$eggs[$item_no][1]($item_c/$eggs[$item_no][2])" : "[ペ]$pets[$item_no][1]" ; &send_item($to_name, $kind, $item_no, $item_c, $item_lv); &send_money($to_name, 'オークション会場', "-$item_price"); &send_money($from_name, 'オークション会場', $item_price); &write_send_news("$from_nameの出品した$item_titleを$to_nameが $item_price Gで落札しました"); $is_rewrite = 1; } else { push @lines, $line; } } if ($is_rewrite) { seek $fh, 0, 0; truncate $fh, 0; print $fh @lines; } close $fh; } else { $mes .= 'やめました<br>'; } &begin; } #================================================= # 出品 #================================================= sub tp_200 { $layout = 1; $mes .= 'どれを出品しますか?<br>'; $mes .= qq|<form method="$method" action="$script">|; $mes .= qq|<input type="radio" name="$cmdd" value="0" checked>やめる<br>|; $mes .= qq|<input type="radio" name="$cmdd" value="1">$weas[$m{wea}][1]★$m{wea_lv}($m{wea_c})<br>| if $m{wea}; $mes .= qq|<input type="radio" name="$cmdd" value="2">$eggs[$m{egg}][1]($m{egg_c})<br>| if $m{egg}; $mes .= qq|<input type="radio" name="$cmdd" value="3">$pets[$m{pet}][1]<br>| if $m{pet}; $mes .= qq|<p>初期金額<input type="text" name="price" value="0" class="text_box1" style="text-align:right">G</p>|; $mes .= qq|<p>出品期間<select name="limit" class="menu1">\n|; $mes .= qq|<option value="$_">$_</option>\n| foreach (reverse 1..$limit_day); $mes .= qq|</select>日前後</p>|; $mes .= qq|<input type="hidden" name="id" value="$id"><input type="hidden" name="pass" value="$pass">|; $mes .= qq|<p><input type="submit" value="出品する" class="button1"></p></form>|; $m{tp} += 10; } sub tp_210 { return if &is_ng_cmd(1..3); my $is_find = 0; my @lines = (); open my $fh, "< $this_file" or &error("$this_file が開けませんでした"); while (my $line = <$fh>) { my($name) = (split /<>/, $line)[6]; if (!$is_find && $m{name} eq $name) { $is_find = 1; } push @lines, $line; } close $fh; if ($is_find) { $mes .= '出品しているものが落札されるまで、出品することはできません<br>'; $mes .= '物を沢山売りたいのならお店を開くことをお勧めします<br>'; } elsif (@lines >= $max_auction) { $mes .= '現在、出品の受付はしておりません<br>出品数が減ってから再度申\し込みください<br>'; } elsif ($in{price} =~ /[^0-9]/ || $in{price} >= 3000000) { $mes .= '値段は 300万 G以内にする必要があります<br>'; } elsif ($in{limit} =~ /[^0-9]/ || $in{limit} > $limit_day || $in{limit} < 1) { $mes .= "出品期間は1〜$limit_day日しか選べないはずだよ?<br>"; } elsif ( ($cmd eq '1' && $m{wea}) || ($cmd eq '2' && $m{egg}) || ($cmd eq '3' && $m{pet}) ) { my @kinds = ('', 'wea', 'egg', 'pet'); for my $taboo_item (@{ $taboo_items{ $kinds[$cmd] } }) { if ($taboo_item eq $m{ $kinds[$cmd] }) { my $t_item_name = $cmd eq '1' ? $weas[$m{wea}][1] : $cmd eq '2' ? $eggs[$m{egg}][1] : $pets[$m{pet}][1] ; $mes .= "$t_item_nameは出品禁止アイテムとなっております<br>"; &begin; return; } } my $item_price = $in{price} || 0; my $item_no = $m{ $kinds[$cmd] }; my $item_c = $m{ $kinds[$cmd].'_c' } || 0; my $item_lv = $m{ $kinds[$cmd].'_lv' } || 0; if ($cmd eq '1' && $m{wea}) { &mes_and_send_news("$weas[$m{wea}][1]を出品しました"); $m{wea} = $m{wea_c} = $m{wea_lv} = 0; } elsif ($cmd eq '2' && $m{egg}) { &mes_and_send_news("$eggs[$m{egg}][1]を出品しました"); $m{egg} = $m{egg_c} = 0; } elsif ($cmd eq '3' && $m{pet}) { &mes_and_send_news("$pets[$m{pet}][1]を出品しました"); $m{pet} = 0; } $limit_day = $in{limit}; my $bit_time = $time + int( $limit_day * 3600 * 24 + rand(3600) ); # 入札時間を1時間程度ばらけさす my($last_no) = (split /<>/, $lines[-1])[1]; ++$last_no; open my $fh2, ">> $this_file" or &error("$this_file が開けませんでした"); print $fh2 "$bit_time<>$last_no<>$cmd<>$item_no<>$item_c<>$item_lv<>$m{name}<>$m{name}<>$item_price<>\n"; close $fh2; } else { $mes .= 'やめました<br>'; } &begin; } 1; # 削除不可 |