改造箇所

要望をもらったらので公開します。 出品者が自分の意志で落札させる機能です。

仕組みとしては

	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&#12316;$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; # 削除不可

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-11-19 (木) 01:50:36 (68d)