本文へ移動
ch1w4

www.ch1w4.com / blog / debtcraft-auction-web-discord

オークションとWebからの売買、Discordとの連携を足した

#minecraft#discord#web#homelab

前の記事で取引所(決まった値段で売り買い)を作ったら、「オークションもほしい」「スマホのブラウザからも買いたい」という声が出た。そこで、この2つと、Discord まわりの連携をまとめて作った。

オークションのルール

入札の時点でお金を預かるのは、「落札したのにお金が足りない」を起こさないため。その代わり、返金を取りこぼさない仕組みが要る。入札ごとに「預かり中 → 返すことが決まった → 返した」の状態を DB に持たせ、オフラインの人に返せなかった分は、次のログインで返し直す。

同時に何人も入札したときに、預かりと返金がずれないかは、6人が同時に入札するテストで確かめた。

Web からの売買:国営ショップと同じ作り

国営ショップと同じく、Web はお金を動かさない。

  1. ブラウザで「買う」「入札する」を押す
  2. Web(Node.js)は、market_requests という表に「依頼」の行を入れるだけ
  3. マイクラのプラグインが3秒ごとに依頼を取り出し、お金を引いてアイテムを受け取り箱に入れ、結果を書き戻す
  4. ブラウザは結果が出るまで見に行く

値段はプラグインが DB の出品から読む。入札額だけは Web から来るので、プラグインがゲーム内の入札と同じ確認(最低額・所持金・本人でないか)を全部やり直す。

Web で買ったものは、ゲームに入って /torihiki uketori で受け取る。インベントリが満杯なら、足元に落とさず箱に残す。

ページは、出品・オークション・自分の取引の3つのタブにした。オークションは残り時間が1秒ごとに動き、自分が最高額か上回られたかが一目で分かる。入札額は「1兆2000億」のように単位付きでも入力できる。

Discord との連携

ランクのロールを自動で付ける

ゲーム内で「納税者」に上がっても、Discord のロールは「一般市民」のままだった。ボットにその機能がなかっただけなので、2分ごとに DB を見て、ランク・滞納中・収監中のロールを付け替えるようにした。

スラッシュコマンド

/ステータス、/借金、/相場、/取引所、/ランキング を足した。Discord のスラッシュコマンドは日本語の名前も付けられる。/ステータス は所持金や納税状況が出るので、本人にだけ見えるようにした。

上回られたら DM

プラグインが「上回られた」「落札した」「売れた」を player_notices という表に書き、ボットが30秒ごとに読んで DM を送る。同じオークションで何度も上回られても、送る前なら1通にまとめる。/通知 オフ で止められる。

ハマったこと

ボットを入れ替えたのに変わらない

新しいボットを入れたつもりが、ログに新機能のメッセージが出ない。原因は、サーバーに root で入っていたこと。zip は一般ユーザーのホームに送っていたのに、手順の cd ~ が root のホーム(/root)を指していて、展開もコピーもされていなかった。イメージの作成が1秒で終わったのも、中身が前と同じでキャッシュが使われたからだった。

ゲーム内チャットの称号がずれる

Discord に転送されるチャットで、名前の前の [納税者] が付いたり付かなかったりした。転送には Essentials の「表示名」が使われていて、表示名はログインした時点で作られる。そのため、ログイン後にランクが上がった人や、初参加でグループが付く前に表示名が作られた人は、入り直すまで古いままになる。プラグイン側で、ランクが変わったときに表示名を作り直すように直す予定。

学んだこと