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

(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にお寄せください。
必ずとは言えませんができるだけ対応します。
(機能拡張の要望などもお寄せください。汎用的に役立ちそうなら作るかもしれません)

Ver1.20と比べるとかなり処理量が増えています。ご注意ください。

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

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


(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)のように記述
   $AUCTION_CANCELLIMIT_TIME=120; #入札をキャンセルできる時間(秒)
   $AUCTION_COMMENT_MAXLENGTH=100; #コメントの最大長(バイト)
   $AUCTION_TIME_MIN=3600; #実施期間の最低値(秒)
   $AUCTION_TIME_MAX=604800; #実施期間の最高値(秒)
   $AUCTION_ENTER_UPMIN=1; #入札時に少なくとも上げなければならない金額(公開時のみ有効)
   $AUCTION_AUTORECEIVE_ENABLE=1; #自動受け取りオプションを有効=1 無効=0
   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の482行目から下全てを切り離します。
   開始行は

      sub AuctionRead{


   周辺のコード
         }
         $disp.="$TBE<br>";
      }
   }
   
   sub AuctionRead{←切り離し開始位置
      if(!defined(%AUCTION_NG_ITEMNO_HASH)){
         @AUCTION_NG_ITEMNO_HASH{@AUCTION_NG_ITEMNO}=@AUCTION_NG_ITEMNO;
      }
      @AUCTIONDATA_LIST=
         qw(owner msg itemno itemcnt nowprice hide endtime noworder aucid ownerid orderid startprice status enterlog);


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

   ●作成されるinc-auction.cgi (一部)
sub AuctionRead{
   if(!defined(%AUCTION_NG_ITEMNO_HASH)){
      @AUCTION_NG_ITEMNO_HASH{@AUCTION_NG_ITEMNO}=@AUCTION_NG_ITEMNO;
   }
   @AUCTIONDATA_LIST=
      qw(owner msg itemno itemcnt nowprice hide endtime noworder aucid ownerid orderid startprice status enterlog);
   open(IN,GetPath($AUCTION_FILE));
   my @aucdata=<IN>;
   close(IN);
   OutError("AUCTION SCRIPT ERROR<br>オークションデータが異常になっています<br>以下の情報と共に管理者に報告してください<br><br>EXITPOINT:AuctionRead<br>データファイルが開けません")if(!@aucdata);
   $AUCIDCOUNT=int shift(@aucdata);

      〜 中略 〜

         }
      }
      foreach(@AUCTION_NG_ITEMNO){
         $output.="undefined item ID=$_<br>" if(($_<1)||($_>$MAX_ITEM));
      }
      $output.=$enptymes;
   }
   $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();
   DataRead();
   CheckUserPass(1);
   
   RequireFile('inc-auction.cgi');←記述位置
   Auction();
   DataCommitOrAbort();UnLock();
   
   $disp.='<br><div align="right"><small>auction script ver2.05 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行目と、オークションのページの右下に書いてあります。

●適用されているバージョンが 〜ver1.22の場合
   (1):データファイルの変換
      データファイルの仕様変更のため、データファイルの変換が必要です。
      ただし、実施中のオークションがひとつもない場合に限り互換性があります。

      具体的にはこのバージョンのデータファイルにはキャンセル用のログが残っていないため、
      キャンセルを行うと入札者が消えてしまいます。

      直接変換を行うか、いったん全てのオークションを終了させてください。
      全て終了させる場合には全商品を出品禁止指定にして(@AUCTION_NG_ITEMNO=(1..100)等のように設定すれば複数を一斉に禁止できます)
      新しいオークションの開始を阻止して全て消えるまでお待ちください。

      直接変換を行う場合には、データファイルを開き、3行目以降にあるデータ(,によって13個に区切られている)の
      左から数えて5個目と11個目を使って 11個目,5個目,0,0として4個の要素を付け加えます。
      例:test2[test2],,5,500,200,1,1084117880,test[test3],72,102,105,100,0
      このような場合は、
      5個目(200)と11個目(105)を使って以下のように追記します。
      test2[test2],,5,500,200,1,1084117880,test[test3],72,102,105,100,0,105,200,0,0
      この操作を3行目以降の全てのデータに行ってください。
      [注意]失敗するとエラーが出ることがあるので自信のない人は行わないでください。

   (2):設定を追記します(当てはまる項目全て行ってください)
      ●〜ver1.08のみ追記
         $AUCTION_RECALL_TIME=172800; #オークション終了後、買い手が付かなかった場合の出品者に強制返還されるまでの時間(秒)
         @AUCTION_NG_ITEMNO=(); #出品禁止の商品の固有IDを指定。(1,2,3)のように記述

 
      ●〜ver1.22で追記
         $AUCTION_CANCELLIMIT_TIME=120; #入札をキャンセルできる時間(秒)
         $AUCTION_COMMENT_MAXLENGTH=100; #コメントの最大長(バイト)
         $AUCTION_TIME_MIN=3600; #実施期間の最低値(秒)
         $AUCTION_TIME_MAX=604800; #実施期間の最高値(秒)
         $AUCTION_ENTER_UPMIN=1; #入札時に少なくとも上げなければならない金額(公開時のみ有効)
         $AUCTION_AUTORECEIVE_ENABLE=1; #自動受け取りオプションを有効=1 無効=0

 
   (3):スクリプトを上書きします
      perlのパスを設定したら新しいスクリプトファイルで上書きしてください。
      inc-auction.cgiも作成している場合は作り直してください。

   以上です。

●適用されているバージョンが ver2.00〜ver2.04の場合
   (1):設定を追記します(当てはまる項目全て行ってください)
      ●〜ver2.04で追記
         $AUCTION_AUTORECEIVE_ENABLE=1; #自動受け取りオプションを有効=1 無効=0


   (2):スクリプトを上書きします
      perlのパスを設定したら新しいスクリプトファイルで上書きしてください。
      inc-auction.cgiも作成している場合は作り直してください。

   以上です。



●アイテムフラグで出品禁止を設定する


ベータ版に存在するアイテムフラグによって出品禁止を設定することができます。
(この設定はシステムがver03-04-11以上のみ利用可能です)

auction.cgiの795行目に以下の注釈があります。

   #return 1 if($ITEM[$_[0]]->{flag}=~/[sm]/);#文字セット=smeitb  この行の最初の#を消せば陳列禁止、送付禁止も出品禁止になる(Ver03-04-11以上のみ)

この注釈を解除すれば「陳列禁止」「送付禁止」フラグが出品禁止に設定されます。
また、[sm]の部分にフラグ毎の文字を入れるとそのフラグを持つアイテムを出品禁止にできます。
フラグごとの文字は以下のようになっています。

 s 陳列不可
 m 送付不可
 e 輸出不可
 i 輸入不可
 t 破棄不可
 b 購入不可(他店陳列棚から) (ver040318以上のみ)

(SOLD標準(ver040318)のauto/item.cgi 109行目あたりより引用)

また、この注釈がある場所に条件分岐を増やすことで、様々な条件で出品禁止を行うことができます。
1を返すと出品禁止になり、0を返すと出品可能になりますので、Perlができる方はいろいろできます。
   




技術資料

以下は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:入札者なしで終了
   {enterlog}:入札ログ情報へのリファレンス
      リファレンス先はハッシュです。キーとして入札者の固有ID(DT->{id})が入り、
      データとして入札ログ情報の配列へのリファレンスが入ります。
         [0]入札者ID [1]入札金額 [2]入札時刻 [3]もう一回前の入札金額



関数説明

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

各変数の要求型について

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

グローバルI/O:グローバル領域に露出する変数を使った入出力です。
     [入力]値は読み取られるのみで、変更されません
     [出力]値は出力されるのみです。既存の情報があった場合、上書きされます
     [入出力]値を処理して、書き換えます
     [追記]値は出力されるのみです。既存の情報に連結されます
     [条件出力]値は出力されるかもしれません。出力された場合、[出力]と同義、されなかった場合は変更されません。
          利用したい場合は呼び出す前に初期化する必要があります。
     [注意]@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":設定情報表示
         "cancel":入札キャンセル
         "optionset":設定変更
      [数値]{itemno}(出品時のみ)商品のID
      [数値]{itemcnt}(出品時のみ)商品の数
      [数値]{tmd}(出品時のみ)開催期間の日数
      [数値]{tmh}(出品時のみ)開催期間の時間数
      [UI文字列]{msg}(出品時のみ)コメント文
      [数値]{startprice}(出品時のみ)初期金額
      [存在真偽値]{hideprice}(出品時のみ)現在金額非公開チェック
      [存在真偽値]{unitprice}(出品時のみ)単価指定チェック
      [数値]{price}(入札時のみ)入札金額
      [数値]{aucid}(入札、受け取り、回収時のみ)操作するオークションの固有ID
      [ブール値]{opt_autoreceive}(設定時のみ)自動受け取りスイッチ
   [入力][数値]$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 個人で作成可能なオークション数
   [入力][数値]$AUCTION_CANCELLIMIT_TIME 入札をキャンセルできる時間
   [入力][数値]$AUCTION_COMMENT_MAXLENGTH コメントの最大長
   [入力][数値]$AUCTION_TIME_MIN 実施期間の最低値
   [入力][数値]$AUCTION_TIME_MAX 実施期間の最高値
   [入力][数値]$AUCTION_ENTER_UPMIN 入札時に少なくとも上げなければならない金額(公開時のみ有効)
   [入力][HTML]$METHOD フォームの転送スタイル
   [入力][HTML]$TB テーブルの開始タグ
   [入力][HTML]$TR テーブルの行タグ
   [入力][HTML]$TD テーブルの改列タグ
   [入力][HTML]$TRE テーブルの行終了タグ
   [入力][HTML]$TBE テーブルの終了タグ
   [入力][数値]@AUCTION_NG_ITEMNO 出品禁止商品固有IDの配列
   [入力][参照]@ITEM 全商品データへの参照の配列
   [入力][参照]@DT 全店舗データへの参照の配列
   [入力][文字列]$AUCTION_FILE 作成するデータファイル名
   [入力][文字列]$MYNAME 起動されたスクリプト名
   [入力][ブール値]$GUEST_USER ゲストアクセスなら1
   [入力][ブール値]$AUCTION_AUTORECEIVE_ENABLE 自動受け取り機能が有効なら1
   [入出力][数値]@DTwholestore 市場の商品数の配列
   [入出力][参照]$DT 店舗情報への参照
   [入出力][ブール値]%AUCTION_NG_ITEMNO_HASH 出品禁止商品固有IDのハッシュ
   [出力][数値]$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


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

AuctionRead


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

内部依存関数
   GetPath
   OutError


ファイルからオークションのデータを@AUCTIONDATAへ読み込みます。
また、AuctionFlagCheck用のハッシュを準備します。

AuctionWrite


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

内部依存関数
   GetPath
   OpenAndCheck
   OutError


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

AuctionCheck


構文 AuctionCheck()
引数 なし
戻り値 なし
グローバルI/O
   [入力][数値]$NOW_TIME 現在時刻
   [入力][数値]$MAX_STOCK_TIME 最大保持時間
   [入力][数値]$AUCTION_RECEIVE_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
   DataWrite


オークションの時間経過による処理を行い、@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


出品者にオークションの商品を返還します。
引数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


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

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

CheckWholeStoreSingle


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

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


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

AuctionFlagCheck


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

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


指定された商品が出品禁止されているか調査します
禁止されている場合、1を返します。
また、AuctionReadが実行されていない場合は正常に処理されません。

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 個人で作成可能なオークション数
   [入力][数値]$AUCTION_CANCELLIMIT_TIME 入札をキャンセルできる時間
   [入力][数値]$AUCTION_COMMENT_MAXLENGTH コメントの最大長
   [入力][数値]$AUCTION_TIME_MIN 実施期間の最低値
   [入力][数値]$AUCTION_TIME_MAX 実施期間の最高値
   [入力][数値]$AUCTION_ENTER_UPMIN 入札時に少なくとも上げなければならない金額(公開時のみ有効)
   [入力][数値]$MAX_ITEM 存在するアイテムIDの最大数
   [入力][数値]@AUCTION_NG_ITEMNO 出品禁止商品固有IDの配列
   [入出力][ブール値]%AUCTION_NG_ITEMNO_HASH 出品禁止商品固有IDのハッシュ

内部依存関数
   AuctionFlagCheck
   GetTime2HMS


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




仕様

各部の仕様です。

時限処理部
  処理実行 自スクリプト起動時
  入札履歴 一人につき2回まで保存する
  出品者閉店時 中止および削除
  入札者閉店時 実施中=第2位が繰上げ 終了済み=中止

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

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

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

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

回収部
  回収時間 0
  
キャンセル部
  キャンセル時間 0
  キャンセル期限 $AUCTION_CANCELLIMIT_TIMEに等しい




更新履歴

更新履歴です。

v2.05 少し高速化 (05/03/10 02:01)
v2.05 入札額を10倍以上に引き上げた場合のメッセージを追加 (05/03/10 02:01)
v2.05 落札時自動受け取り機能を追加 (05/03/10 02:01)
v2.04 USERPASS系で認証している場合、正しく認証されない問題を修正 (04/11/27 10:55)
v2.03 設定情報表示のリンクを直接記述に変更 (04/05/28 13:55)
v2.03 作者ページへのリンク方法を変更 (04/05/28 13:55)
v2.02 出品エラーが発生した時チェックボックスが解除される問題を修正 (04/05/12 03:19)
v2.02 出品時単価指定を追加 (04/05/12 03:19)
v2.02 同額でキャンセル時に順位が昇格する問題を修正 (04/05/12 03:19)
v2.01 少し高速化 (04/05/08 01:21)
v2.00 データファイル仕様変更 (04/05/03 23:08)
v2.00 入札キャンセル機能追加 (04/05/03 23:08)
v2.00 入札ログ保存機能追加 (04/05/03 23:08)
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からは設定情報が誰でも閲覧できるようになりました。
とはいえ、公開されるのは本来公開すべき程度の情報のはずですから、困るようなことはないと思います。
出品禁止アイテムだけは、公開したくない人もいるかと思ったので
228行目の$disp.=AuctionInformation(1);を$disp.=AuctionInformation(0);にすると非表示になるようにしました

入札金額10倍メッセージ

Ver2.05から 入札時に金額を10倍以上に引き上げるとメッセージが表示されるようになりました。
これは打ち間違えで桁数が増えている可能性があることをプレイヤーに警告します。
なお、この表示が出ても処理はそのまま行われます。

なおこの機能をこのバージョンで無効にする場合は、auction.cgiの98〜107行、115〜124行を削除すると無効にできます。

プレイヤー設定

Ver2.05から プレイヤー毎に保存される設定が追加されました。
これらの設定は$DT->{user}->{...}に保存されます。

設定項目と保存されるキーの対応は以下のようになります。
項目名キー
落札時自動受け取りfuku_auction_autoreceive

(命名規則は fuku_スクリプト名_設定名 です)

カスタマイズ

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

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



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