- 追加された行はこの色です。
- 削除された行はこの色です。
[[改造箇所]]
要望をもらったらので公開します。
出品者が自分の意志で落札させる機能です。
仕組みとしては
$can_end = 1 if ($m{name} eq $from_name && $time > $bit_time);
で出品者が自分と同じ名前なら 1 を立てる。
そして1が立ったら
$mes .= qq|<p><input type="checkbox" name="end" value="1">自分の出品を終了させる</p>| if $can_end;
これでチェックボックスで end=1 のクエリ情報を準備。
そしてend=1を受け取ったら
# 出品者による終了
elsif ($in{end}) {
(以下略)
の処理でオークションを落札させます。
以下、ええタイの生コードです。
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; # 削除不可