SOLD OUT拡張スクリプト
オークション(Version 1.22)


(SOLD OUT開発元) MUTOYSで配布されているSOLD OUT にオークションを追加します

一通り動作確認はしましたが、バグが存在しないという保障はありません。
また、スクリプトの適用によりなんらかの問題が発生したとしても、作者は責任は負いません。
あくまで自己責任にてスクリプトを適用してください。

配布形態についてはSOLD OUTの派生プログラムという扱いになると思います。
詳しくはSOLD OUTのソース一式に同梱されているgpl.txtまたはgpl.textをご覧ください



設置方法
   他のスクリプトから時限処理する
   リンクに更新時間を表示する

技術資料

仕様

更新履歴

補足



設置方法

この拡張スクリプトはSOLD OUT ver.03-04-11およびPerl5.8.2(5.008002)をベースに記述されています。
それ以外のバージョンでの動作互換性は正直怪しいので、ご注意ください。
(Ver.02-07-28kは動作確認しました)

一行目のPerlの座標は環境に合わせて設定してください。
SOLDを設置する時にも行ったはずです

現在のところ、改行コードはWindowsスタイル(CRLFスタイル)です。
UNIX系サーバ上にて正しく動作しない場合、改行コードをUNIXスタイル(LFスタイル)に変換してみてください。
(ASCIIモードで転送すれば問題ないはずですが)

設置にあたっては、一部の標準スクリプトを編集する必要がありますが、
基本的に追記のみにし、既存のコードを削除したりしないようお願いします。

既に適用するSOLD OUTが改造済みである場合で、このスクリプトが利用する標準SOLD OUT関数の仕様および挙動が変更されている場合、
正しい動作は多分できません。
特に拡張スクリプトを適用したSOLD OUTより、初めから大きく編集されているバージョンは注意が必要です。

デフォルトのコードでは、オークションに関する処理は全てこのスクリプトが起動されない限り編集されないようになっていますが、
他の部分でも処理を行うようにする処理を追加することも可能です。
一応方法を後述しますが、動作確認はしておりませんのでご注意ください。

設置情報は03-04-11バージョンを元にします。
02-07-28バージョンでも利用できますが、記述行が若干異なるのでご注意ください(周辺コードは大して変化しません)

表示されるHTMLの確認はInternet Explorer Ver 6.0 for Windowsでしか行っていません。
他のブラウザで表示がおかしいとか壊れるとかするかもしれません。

バグ報告は
当スクリプト作成元「fuku研究所」のBBSにお寄せください。
必ずとは言えませんができるだけ対応します。
(機能拡張の要望などもお寄せください。汎用的に役立ちそうなら作るかもしれません)

・・・前置き長いですね。(笑)
そろそろ本題に入りましょう。

行数については手元のソースを元にしているので、他の改造なども含めて、ずれているかもしれません。
周辺の標準コードも一緒に書いておきますので、それを元に記述位置を修正してください。
ちなみに、周辺コードは変更を適用した状態で書きます。


(1)上部メニューにオークションのリンクを作成します
_base.cgiの220行目に次を追記します。
      print GetMenuTag('auction',      '[オークション]');

周辺のコード

print GetMenuTag('shop-master', '[市場]'); print GetMenuTag('log', '[最近の出来事]'); print GetMenuTag('ranking', '[ランキング]'); print GetMenuTag('commentlist', '[コメント一覧]'); print GetMenuTag('guild', '[ギルド]'); print GetMenuTag('auction', '[オークション]');←記述位置 print GetMenuTag('trade', '[貿易]') if $TRADE_ENABLE; print GetMenuTag('move-town', '[近くの街]') if $MOVETOWN_ENABLE; print GetMenuTag('custom', "[$CUSTOM_TITLE]") if $USE_CUSTOM;       print '<HR SIZE=1>';



(2)オークションの拡張設定を追加します
_config-local.cgiの最後の1;の前に次を追記します。
_config-local.cgiがない場合は作成し、最後の行に1;を追記してください
   #オークション追加設定
   $AUCTION_FILE='auction'; #データファイル名
   $AUCTION_START_TIME=1800; #出品に必要な時間(秒)
   $AUCTION_RECEIVE_TIME=1800; #受け取りに必要な時間(秒)
   $AUCTION_MAXCOUNT=50; #同時に実施できるオークションの数。(ログも含む)
   $AUCTION_USER_MAXCOUNT=5; #一人で同時に実施できるオークションの数。(ログも含む)
   $AUCTION_EXIT_TIME=172800; #オークション終了後、出品者が落札を取り消して回収できるようになるまでの時間(秒)
   $AUCTION_ABORT_TIME=345600; #オークション終了後、落札者、出品者ともに処理しなかった場合に出品者に強制返還されるまでの時間(秒)
   $AUCTION_RECALL_TIME=172800; #オークション終了後、買い手が付かなかった場合の出品者に強制返還されるまでの時間(秒)
   $AUCTION_LOG_SAVETIME=172800; #オークション終了後、ログとして残される時間(秒)
   @AUCTION_NG_ITEMNO=(); #出品禁止の商品の固有IDを指定。(1,2,3)のように記述
   push(@BACKUP_FILES,($AUCTION_FILE)); #バックアップ設定

周辺のコード

定められた場所はありません

各設定を変更することで容易に動作を変更できます。
SOLD標準のものと同様の書き方でいいのでバランスを考えて設定してください。

出品禁止商品を増やすと処理が若干重くなります。
また、受け取り時間は常に固定され、金額に影響されません。


(3)オークションのデータファイルを追加します
データディレクトリにデータファイルを作っておきます。
内容は簡単です。0と改行を二つ書くだけです。
↓記述する内容


0
0



ファイル名は_config.cgiと_config-local.cgi内で定義される

$DATA_DIR.'/'.$AUCTION_FILE.$FILE_EXT
(.は連結です)


が使われます。標準ではこれは

$DATA_DIR ='./data'; # データ保存用ディレクトリ(777)
$AUCTION_FILE='auction'; #データファイル名←(2)で記述したもの
$FILE_EXT ='.cgi'; # 各種データファイルの拡張子


なので、連結すると

./data/auction.cgi


となり、dataフォルダにauction.cgiというファイル名で作成することになります。
それぞれ編集している場合は各部を置き換えて読んでください。


・・・あとはsoldoutのメインディレクトリにauction.cgiスクリプトを置けば完成です。
パーミッションはよく分からないので(755でいいんでしょうかね?)他のcgiファイルと同じにしておいてください。

最後にオークションの右下にあるcustom informationで意図したとおりに設定が表示されることまで確認すればなお良しです(笑)。


●他のスクリプトからオークションの制御を行う
他のスクリプトからオークションの落札や、時間切れによる強制処理を行うことができます。

[注]以下は必須の作業ではありません。拡張する場合の助けとして書いています。
また、理論上OKなはずというのみで動作確認はしていませんので、ご注意ください。


(1)時間経過で行われる処理部分を別ファイルに移動します
auction.cgiの331行目から下全てを切り離します。
開始行は
      sub AuctionRead{

周辺のコード

}          $disp.="$TBE<br>";       }    }     sub AuctionRead{←切り離し開始位置       @AUCTIONDATA_LIST=          qw(owner msg itemno itemcnt nowprice hide endtime noworder aucid ownerid orderid startprice status);       open(IN,GetPath($AUCTION_FILE));       my @aucdata=<IN>;       close(IN);


切り離したソースをinc-auction.cgiファイルに記述します。
incフォルダにinc-auction.cgiファイルを作成し、
先ほど切り離したソースを書き込み、最後の行に1;を追加します。
●作成されるinc-auction.cgi (一部)

sub AuctionRead{    @AUCTIONDATA_LIST=       qw(owner msg itemno itemcnt nowprice hide endtime noworder aucid ownerid orderid startprice status);    open(IN,GetPath($AUCTION_FILE));    my @aucdata=<IN>;    close(IN);    $AUCIDCOUNT=int shift(@aucdata);    $AUCNOWCOUNT=int shift(@aucdata);    @AUCTIONDATA=();    my $cnt=0; 〜 中略 〜       else{          foreach(@AUCTION_NG_ITEMNO){             $output.="undefined item ID=$_<br>",next if(!defined($ITEM[$_]{name}));             $output.=$ITEM[$_]{name}."<br>";          }       }    }    $output.='<br><br><div align="right"><small><a href="http://www5f.biglobe.ne.jp/~fuku-labo/" target="_blank">オークションスクリプト作成元・fuku研究所へ</a></small></div>';    return $output; } 1;←追記


(3)移動したコードを使えるようにします
コードを切り離してしまったので、そのままではエラーになります。
なので、切り離したコードへのリンクを張ります。
auction.cgiの11行目に次を追記します。
      RequireFile('inc-auction.cgi');

周辺のコード

Lock(); #if($Q{auccmd} ne ''); DataRead(); CheckUserPass(1); RequireFile('inc-auction.cgi');←記述位置 Auction(); DataCommitOrAbort();UnLock();# if($Q{auccmd} ne '');    $disp.='<br><div align="right"><small>auction script ver1.22 created by fuku<br>';    $disp.="<a href=\"./auction.cgi?auccmd=customview\">custom information</a></small></div>";


(4)他のスクリプトから処理を呼び出すコード
Lock()の中で、かつDataRead()の後に次を追記します。
      RequireFile('inc-auction.cgi');
      AuctionRead();
      AuctionCheck();



・・・ここまで書いて困ったことに気付きました。
標準スクリプトは余計な事をしないようになっているため、
Lock()がなかったり条件によってLock()を呼び出さないようになっています。
Lock()は時間のかかる処理なので、無条件に呼び出せば、全体の処理が重くなるのは間違いないので当然なのですが。

Lock()が実行されている時のみオークション処理を行えば、処理量の増加は一番抑えられますが、
これは、少しはPerlが読めないとどこがその部分かはわからないでしょう。

というわけで、Perl読めない人は
Lock();
とだけ書いてある場合のみ追記可能と考えてください。
Lock() if $Q{pw};
等、後ろに何かある場合は、条件分岐がかかっているため、どの部分なら追記していいか、理解している場合のみ追記してください。

Lock()の中とは、Lock()からDataCommitOrAbort()〜UnLock()のセットが置いてあるところまでです。


これで終わりというのも薄情(?)な気がしたのでターン処理に組み込む場合を書いておきます。
当然、ターン処理の重量は増大しますのでご注意ください。

auto/turn.cgiの11行目に上記を挿入します。

周辺のコード


{
Lock();
DataRead();
ReadGuild();
ReadGuildData();
RequireFile('inc-auction.cgi');←記述
AuctionRead();←記述
AuctionCheck();←記述
$now=$NOW_TIME+$TZ_JST-$DATE_REVISE_TIME;
$lasttime=$DTlasttime+$TZ_JST-$DATE_REVISE_TIME;
#$now=$lasttime+60*5; #debug

$temptimenow=$DTlasttime;



●リンクに更新時間を表示する
画面上部に表示される、[オークション]タブに掲示板や井戸端と同じ表示を付加します。

[注]以下は必須の作業ではありません。拡張する場合の助けとして書いています。

(1)上部メニューにあるオークションのリンクを編集します
_base.cgiの220行目にある(1-1で追記したもの)次を編集します。
      print GetMenuTag('auction',      '[オークション]');
				
		print GetMenuTag('auction',		"[オークション".GetFileTime($AUCTION_FILE).']');

周辺のコード

print GetMenuTag('shop-master', '[市場]'); print GetMenuTag('log', '[最近の出来事]'); print GetMenuTag('ranking', '[ランキング]'); print GetMenuTag('commentlist', '[コメント一覧]'); print GetMenuTag('guild', '[ギルド]'); print GetMenuTag('auction', "[オークション".GetFileTime($AUCTION_FILE).']');←記述位置 print GetMenuTag('trade', '[貿易]') if $TRADE_ENABLE; print GetMenuTag('move-town', '[近くの街]') if $MOVETOWN_ENABLE; print GetMenuTag('custom', "[$CUSTOM_TITLE]") if $USE_CUSTOM;       print '<HR SIZE=1>';


(2)入札処理で必ず更新するようにします
高速化のため省いてあるファイル書き込みを実行して更新時刻を書き込みます。
auction.cgiの86行目にある次をその次の行(})と入れ替えます。
            AuctionWrite();

周辺のコード

if($errmes eq ""){ if($aucdata->{nowprice}<$price){ $aucdata->{nowprice}=$price; $aucdata->{noworder}=$DT->{shopname}."[$DT->{name}]"; $aucdata->{orderid}=$DT->{id}; }←この}と AuctionWrite();←この行を入れ替え          $disp.="$aucdata->{owner} 出品の $ITEM[$aucdata->{itemno}]->{name} $aucdata->{itemcnt}$ITEM[$aucdata->{itemno}]->{scale}に $price円で入札しました<br>";       }       $disp.="$errmes<br>";    }




技術資料

以下はPerlが読める人用の文書です。
このスクリプトの解析や流用、改造を考える人には有用だと思います。

構造体説明

@AUCTIONDATA系の参照先の構造体について

{owner}:出品者の店名とログイン名(現バージョンでは店名は途中で変更しても出品時点のまま表示されます)
{msg}:コメント
{itemno}:出品されている商品の固有ID
{itemcnt}:出品されている商品の個数
{nowprice}:現在の最高金額
{hide}:現在の金額を非公開なら1
{endtime}:オークションの終了時刻
{noworder}:現在の最高金額入札者。いない場合は""文字列
{aucid}:オークションの固有ID
{ownerid}:出品者の固有ID
{orderid}:現在の最高金額入札者の固有ID。いない場合は0
{startprice}:オークションの開始金額
{status}:現在の状態。0:実施中 1:落札済み 2:落札済み放置 3:ログ 4:入札者なしで終了



関数説明

構文:呼び出す時の記述です。
引数:直接指定して呼び出す引数です。
戻り値:直接返される値です。

各変数の要求型について

Perlはどんな型も勝手に相互変換しますが、何でも送られても困りますので。
     文字列:文字列
     UI文字列:ユーザーにフォーム入力させた文字列を受け入れ可能な、文字列
     数値:数値
     参照:リファレンス
     ブール値:真偽のみを受け取る、論理値です。真は0以外ですが、基本的に1です。偽は0です。
     HTML:出力するHTMLに関する、文字列

グローバルI/O:グローバル領域に露出する変数を使った入出力です。
     [入力]値は読み取られるのみで、変更されません
     [出力]値は出力されるのみです。既存の情報があった場合、上書きされます
     [入出力]値を処理して、書き換えます
     [追記]値は出力されるのみです。既存の情報に連結されます
     [条件出力]値は出力されるかもしれません。出力された場合、[出力]と同義、されなかった場合は変更されません。
          利用したい場合は呼び出す前に初期化する必要があります。
          初期化という1ステップをケチってるだけで、見た目も使い勝手もよろしくない。稀にしか利用しない出力だからこうしたと弁明しておく(笑)
     [注意]@DTや@AUCTIONDATA等は、[入力]になっていても、配列自体が編集されないという意味であり、参照先の内容は変更される可能性があります
内部依存関数:内部で呼び出している関数です。
     グローバルI/Oはこのスクリプト内に定義された関数のみ、内部依存関数全ての内容も含みます。
     SOLD 標準関数は記述していますが Perl 標準関数は記述していません。
依存ソースファイル:外部に依存している関数の定義ファイルなどです。

auction.cgiに定義されている関数一覧
   
Auction
   AuctionRead
   AuctionWrite
   AuctionCheck
   GetDT
   AuctionRecall
   AuctionRestructuring
   AuctionRepair
   CheckWholeStoreSingle
   AuctionFlagCheck
   AuctionInformation


Auction

構文 Auction()
引数 なし
戻り値 なし
グローバルI/O
[入力]%Q
[文字列]{auccmd}コマンド
"":通常
"start":出品
"enter":入札
"receive":受け取り
"recall":出品者回収
"customview":設定情報表示
[数値]{itemno}(出品時のみ)商品のID
[数値]{itemcnt}(出品時のみ)商品の数
[数値]{tmd}(出品時のみ)開催期間の日数
[数値]{tmh}(出品時のみ)開催期間の時間数
[UI文字列]{msg}(出品時のみ)コメント文
[数値]{startprice}(出品時のみ)初期金額
[数値]{price}(入札時のみ)入札金額
[数値]{aucid}(入札、受け取り、回収時のみ)操作するオークションの固有ID
[入力][数値]$MAX_MONEY 最大所持金額
[入力][数値]$MAX_ITEM 存在するアイテムIDの最大数
[入力][数値]$MAX_STOCK_TIME 最大保持時間
[入力][数値]$NOW_TIME 現在時刻
[入力][数値]$AUCTION_START_TIME 出品時間
[入力][数値]$AUCTION_RECEIVE_TIME 受け取り時間
[入力][数値]$AUCTION_EXIT_TIME 受け取り期限
[入力][数値]$AUCTION_ABORT_TIME 強制終了期限
[入力][数値]$AUCTION_RECALL_TIME 強制返還期限
[入力][数値]$AUCTION_LOG_SAVETIME ログの保存期限
[入力][数値]$AUCTION_MAXCOUNT 作成可能なオークション数
[入力][数値]$AUCTION_USER_MAXCOUNT 個人で作成可能なオークション数
[入力][HTML]$METHOD フォームの転送スタイル
[入力][HTML]$TB テーブルの開始タグ
[入力][HTML]$TR テーブルの行タグ
[入力][HTML]$TD テーブルの改列タグ
[入力][HTML]$TRE テーブルの行終了タグ
[入力][HTML]$TBE テーブルの終了タグ
[入力][参照]@ITEM 全商品データへの参照の配列
[入力][参照]@DT 全店舗データへの参照の配列
[入力][参照]@AUCTION_NG_ITEMNO 出品禁止商品固有IDの配列
[入力][文字列]$AUCTION_FILE 作成するデータファイル名
[入力][文字列]$MYNAME 起動されたスクリプト名
[入力][ブール値]$GUEST_USER ゲストアクセスなら1
[入出力][数値]@DTwholestore 市場の商品数の配列
[入出力][参照]$DT 店舗情報への参照
[出力][数値]$AUCIDCOUNT 出品する場合のオークションの固有ID
[出力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[出力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA0 実施中のオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA1 落札済みで受け取り待ちのオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA2 落札済みで受け取りか回収待ちののオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA3 終了してログになったオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA4 落札できず、回収待ちのオークションの構成情報への参照の配列
[出力][文字列]$errmes エラーメッセージ
[出力][文字列]@AUCTIONDATA_LIST @AUCTIONDATAの参照先のハッシュキーの配列
[出力]IN 入力ストリーム
[出力]OUT 出力ストリーム
[追記][HTML]$disp 作成されたHTMLコード
[条件出力][文字列]$logmes 最近の出来事に記録するために作ったバッファ。HTMLにも書き出したかったため(笑)

内部依存関数
AuctionRead
AuctionCheck
AuctionWrite
GetDT
AuctionRecall
AuctionRestructuring
CheckWholeStoreSingle
AuctionFlagCheck
AuctionInformation
EscapeHTML
WriteLog
GetStockTime
DataWrite
RequireFile
GetTime2HMS
GetTime2FormatTime
GetPath
OutError

依存ソースファイル
_base.cgi
_config.cgi
_config-local.cgi
inc/inc-html-ownerinfo.cgi


オークションのページを構成する関数です。
内部でオークションの更新も含めた全ての処理を行います。
$dispに構成されたHTMLを保存します。

AuctionRead

構文 AuctionRead()
引数 なし
戻り値 なし
グローバルI/O
[入力][文字列]$AUCTION_FILE 作成するデータファイル名
[出力][数値]$AUCIDCOUNT 出品する場合のオークションの固有ID
[出力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[出力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列
[出力][文字列]@AUCTIONDATA_LIST @AUCTIONDATAの参照先のハッシュキーの配列
[出力]IN 入力ストリーム

内部依存関数
GetPath
OutError

依存ソースファイル
_base.cgi
_config.cgi
_config-local.cgi


ファイルからオークションのデータを@AUCTIONDATAへ読み込みます。

AuctionWrite

構文 AuctionWrite()
引数 なし
戻り値 なし
グローバルI/O
[入力][文字列]$AUCTION_FILE 作成するデータファイル名
[入力][文字列]$TEMP_DIR 一時データフォルダのパス
[入力][数値]$AUCIDCOUNT 出品する場合のオークションの固有ID
[入力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[入力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列
[出力]OUT 出力ストリーム

内部依存関数
GetPath
OpenAndCheck
OutError

依存ソースファイル
_base.cgi
_config.cgi
_config-local.cgi


@AUCTIONDATAからオークションのデータをファイルへ書き込みます

AuctionCheck

構文 AuctionCheck()
引数 なし
戻り値 なし
グローバルI/O
[入力][数値]$NOW_TIME 現在時刻
[入力][数値]$AUCTION_EXIT_TIME 受け取り期限
[入力][数値]$AUCTION_ABORT_TIME 強制終了期限
[入力][数値]$AUCTION_LOG_SAVETIME ログの保存期限
[入力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列
[入力][参照]@ITEM 全商品データへの参照の配列
[入力][参照]@DT 全店舗データへの参照の配列
[入出力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[出力][参照]@AUCTIONDATA0 実施中のオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA1 落札済みで受け取り待ちのオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA2 落札済みで受け取りか回収待ちののオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA3 終了してログになったオークションの構成情報への参照の配列
[出力][参照]@AUCTIONDATA4 落札できず、回収待ちのオークションの構成情報への参照の配列
[条件出力][文字列]$logmes 最近の出来事に記録するために作ったバッファ。HTMLにも書き出したかったため(笑)

内部依存関数
AuctionRepair
GetDT
AuctionRecall
AuctionRestructuring
AuctionWrite
CheckWholeStoreSingle
GetPath
OpenAndCheck
WriteLog

依存ソースファイル
_base.cgi
_config.cgi
_config-local.cgi


オークションの時間経過による処理を行い、@AUCTIONDATAから状態毎の配列を作成します。

GetDT

構文 GetDT(店舗固有ID)
引数 数値:$userid:取得する店舗の固有ID
戻り値 参照:$useridに合致する店舗データへの参照か、見つからなければ undef。
グローバルI/O
[入力][参照]@DT 全店舗データへの参照の配列
[入力][数値]%id2idx 全店舗データのIDをキーとする配列座標の配列

内部依存関数
依存はありません

依存ソースファイル
依存はありません


店舗固有IDからそのIDを持つ店舗情報への参照を取得します。
見つからない場合は undefを返します。

AuctionRecall

構文 AuctionRecall(操作するオークションデータへの参照,操作するオークションID)
引数 参照:$aucdata:操作するオークションデータへの参照
数値:$aucid:操作するオークションの固有ID
戻り値 参照:操作されたオークションデータへの参照か、""文字列
グローバルI/O
[入力][数値]$AUCTION_FILE 作成するデータファイル名
[入力][数値]$AUCIDCOUNT 出品する場合のオークションの固有ID
[入力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[入力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA2 落札済みで受け取りか回収待ちののオークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA4 落札できず、回収待ちのオークションの構成情報への参照の配列
[入力][参照]@ITEM 全商品データへの参照の配列
[入力][参照]@DT 全店舗データへの参照の配列
[入出力][数値]@DTwholestore 市場の商品数の配列
[出力][文字列]$errmes エラーメッセージ
[出力]OUT 出力ストリーム
[条件出力][文字列]$logmes 最近の出来事に記録するために作ったバッファ。HTMLにも書き出したかったため(笑)

内部依存関数
GetDT
AuctionWrite
CheckWholeStoreSingle
WriteLog
DataWrite
GetPath
OpenAndCheck

依存ソースファイル
_base.cgi
_config.cgi
_config-local.cgi


出品者にオークションの商品を返還します。
引数1と引数2はどちらかを指定すればいいですが、もう片方には""文字列を入れてください。
両方指定した場合は引数1が使用されます。
引数1が""文字列である場合、引数2を使って該当するデータを検索します。
検索した場合、$DT->{id}がオークションのオーナーと一致している必要があります。
該当データが見つからない場合、""文字列を返します。

AuctionRestructuring

構文 AuctionRestructuring()
引数 なし
戻り値 なし
グローバルI/O
[入力][参照]@AUCTIONDATA0 実施中のオークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA1 落札済みで受け取り待ちのオークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA2 落札済みで受け取りか回収待ちののオークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA3 終了してログになったオークションの構成情報への参照の配列
[入力][参照]@AUCTIONDATA4 落札できず、回収待ちのオークションの構成情報への参照の配列
[出力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[出力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列

内部依存関数
依存はありません

依存ソースファイル
依存はありません


分類済みの5つの配列から@AUCTIONDATAを再構築します。
結果的にソート兼削除を実行します。

AuctionRepair

構文 AuctionRepair()
引数 なし
戻り値 ブール値:AuctionWriteの必要があるなら1、ないなら0。
グローバルI/O
[入力][数値]$AUCNOWCOUNT 現在存在するオークションの数
[入力][数値]$NOW_TIME 現在時刻
[入力][数値]$AUCTION_LOG_SAVETIME ログの保存期限
[入力][参照]@ITEM 全商品データへの参照の配列
[入力][参照]@DT 全店舗データへの参照の配列
[入出力][参照]@AUCTIONDATA 全オークションの構成情報への参照の配列

内部依存関数
GetDT

依存ソースファイル
依存はありません


閉店などで無効になった出品者や入札者を削除します。
出品者が無効である場合、オークションは中止され、削除されます。
入札者が無効である場合、入札者はいなくなります。

閉店処理にこの関数を埋め込めば、実質的にAuctionCheck内で呼び出す必要はないため、
処理速度の向上を図ることができます。

CheckWholeStoreSingle

構文 CheckWholeStoreSingle(調査する商品固有ID)
引数 数値:$itemno:調査する商品の固有ID
戻り値 なし
グローバルI/O
[入力][参照]@ITEM 全商品データへの参照の配列
[入力][参照]@DT 全店舗データへの参照の配列
[入出力][数値]@DTwholestore 市場の商品数の配列

内部依存関数
依存はありません

依存ソースファイル
依存はありません


市場にある商品が指定された限界数を越えて存在していないか調査します。
SOLD標準のCheckWholeStore()は全商品を検証しますが、この関数は指定された一種類のみを検証するため、
CheckWholeStore()よりはるかに高速に動作します。

AuctionFlagCheck

構文 AuctionFlagCheck(調査する商品固有ID)
引数 数値:$itemno:調査する商品の固有ID
戻り値 ブール値:出品禁止なら1、出品許可なら0
グローバルI/O
[入力][数値]@AUCTION_NG_ITEMNO 出品禁止商品固有IDの配列

内部依存関数
依存はありません

依存ソースファイル
依存はありません


指定された商品が出品禁止されているか調査します
禁止されている場合、1を返します。

AuctionInformation

構文 AuctionInformation(出品禁止商品一覧を出力するか)
引数 ブール値:$mode:出品禁止商品一覧を出力するなら1、しないなら0
戻り値 HTML:作成されたHTML
グローバルI/O
[入力][数値]$AUCTION_START_TIME 出品時間
[入力][数値]$AUCTION_RECEIVE_TIME 受け取り時間
[入力][数値]$AUCTION_EXIT_TIME 受け取り期限
[入力][数値]$AUCTION_ABORT_TIME 強制終了期限
[入力][数値]$AUCTION_RECALL_TIME 強制返還期限
[入力][数値]$AUCTION_LOG_SAVETIME ログの保存期限
[入力][数値]$AUCTION_MAXCOUNT 作成可能なオークション数
[入力][数値]$AUCTION_USER_MAXCOUNT 個人で作成可能なオークション数
[入力][数値]$MAX_ITEM 存在するアイテムIDの最大数
[入力][数値]@AUCTION_NG_ITEMNO 出品禁止商品固有IDの配列

内部依存関数
AuctionFlagCheck
GetTime2HMS

依存ソースファイル
_base.cgi


設定に関する情報をHTMLで出力します。
設定の解説、設定が認識されていることを確認する用途に使います




仕様

各部の仕様です。

時限処理部
  処理実行 自スクリプト起動時
  入札履歴 保存しない
  出品者閉店時 中止および削除
  入札者閉店時 入札者はいなくなる

表示部
  ゲスト閲覧 許可
  定価表示 する
  単価表示 する
  所属がないグループ 表示しない

出品部
  出品時間 常に $AUCTION_START_TIME に等しい
  出品条件 ログインしていること
  出品手数料 0
  金額指定 出品する商品全部の値段
  期限指定 1時間単位 7日まで

入札部
  入札時間 0
  金額指定 そのオークション自体の入札金額

受け取り部
  受け取り時間 常に $AUCTION_RECEIVE_TIME に等しい(値段、目利きの真髄などの影響は受けない)
  出品者入金先 入金庫
  出品者売上計上 する
  出品者税金徴収 しない
  落札者支払計上 する

回収部
  回収時間 0




更新履歴

更新履歴です。

v1.22 USERPASS系で認証している場合、正しく認証されない問題を修正 (04/11/27 10:55)
v1.21 設定情報表示のリンクを直接記述に変更 (04/05/28 13:55)
v1.21 作者ページへのリンク方法を変更 (04/05/28 13:55)
v1.20 バージョン情報に作者ページへのリンクを追加 (04/04/26 20:33)
v1.19 shift_jis以外の文字コードで文字化けを起こす問題を修正(・・・多分) (04/03/24 06:20)
v1.18 エラーチェックを強化 (04/03/07 01:15)
v1.17 設定表示が正しく表示されない可能性がある問題を修正 (04/02/28 02:37)
v1.16 設定表示を追加 (04/02/28 01:32)
v1.16 一部のundefの明示、暗黙を変更 (04/02/28 01:32)
v1.15 TEMPフォルダを利用していない問題を修正 (04/02/24 09:56)
v1.14 出品数制限を無視できる問題を修正 (04/02/24 07:19)
v1.13 GetDTを高速化(というかもはや無意味) (04/02/23 19:56)
v1.12 少数を入力できる問題を修正 (04/02/23 19:11)
v1.11 単価表示を追加 (04/02/20 02:42)
v1.10 回収待ちのオークションを強制回収させることができる脆弱性を修正 (04/02/20 02:17)
v1.09 設定項目を追加 (04/02/16 03:51)
v1.08 さらに地味に軽量化 (04/02/15 19:25)
v1.07 ver02-07-28上で動作しない問題を修正 (04/02/15 18:18)
v1.07 誰もわからない程度に軽量化 (04/02/15 18:18)
v1.06 危なげな処理を修正 (04/02/12 23:59)
v1.05 所持限界数を超えて取得した際にメッセージを表示するように変更 (04/02/12 04:31)
v1.05 所持限界数を超えて取得してしまう問題を修正 (04/02/12 04:31)
v1.04 個人出品数制限追加 (04/02/11 04:19)
v1.04 閉店者のデータは直ちに削除するように変更 (04/02/11 04:19)
v1.04 他、細かいゴミ取り、バグ取り (04/02/11 04:19)
v1.03 ログの残り方を変更 (04/02/10 03:34)
v1.02 落札者の受け取り時間が持ち時間MAXの時に処理されない問題を修正 (04/02/09 23:57)
v1.01 ゴミが残る問題を修正 (04/02/09 19:40)



補足

設定情報表示機能

Ver1.16からは設定情報が誰でも閲覧できるようになりました。
とはいえ、公開されるのは本来公開すべき程度の情報のはずですから、困るようなことはないと思います。
出品禁止アイテムだけは、公開したくない人もいるかと思ったので
151行目の$disp.=AuctionInformation(1);を$disp.=AuctionInformation(0);にすると非表示になるようにしました

カスタマイズ

設定項目が10個もあるカスタマイズ歓迎(?)な代物です。
デフォルトの設定はかな〜り適当なので、サイトにあった設定をして欲しいものです。
特に各種期限はサイトの活性度によってベスト値が違うと思われます。

_config-local.cgiを書き換えれば設定を変更できますが、変更後はcustom informationを確認し、
正しい値になっていることを確認してください。
特に出品禁止アイテムを設定した場合には、目的のアイテムが禁止されたか、エラーメッセージ undefined item ID=XXXが表示されないか確認してください。



SOLD OUT 拡張用 オークションスクリプト Ver1.22 解説 終わり
作成元
fuku研究所