zsx

zsx

先作为主站备份 源站:https://my.toho.red

Autowhitelistの紹介&私のmcホワイトリストに関する研究

この記事の前に、autowhitelistというプロジェクトについて話しましょう:これは自動的にmcサーバーのホワイトリストにプレイヤーを追加するプログラムです。管理者は問題を出してプレイヤーに解答させ、プレイヤーがスコアラインに達したら自動的にホワイトリストに追加されます。中間の人間の審査と追加の手間が省けます。~~もちろん、小論文形式の問題は人間の審査が必要ですが~~

もしテストユーザーになりたい場合は、プロジェクトのオープンソースアドレスを見てみることができます。リリースページにはダウンロードできるコンパイル済みのバージョンがありますので、ダウンロードして簡単に設定するだけで使えるようになります。ただし、問題は自分で書かなければなりません

私がこのプロジェクトを始めたきっかけは何だったのでしょうか?実は、理由は特に高尚ではありません、ただ単に私が手動の審査をするのが面倒だったからです。やはり怠惰は技術の発展を推進する力です。このプラグインの原理と理由は同じですが、どちらも特に高尚な内容はありませんが、私はかなりの時間をかけて完全なフロントエンドとバックエンドのプログラムを研究しました。それでは、次に開発プロセス全体について話しましょう。

まずはフロントエンドとバックエンドの通信方法です。最初は websocket の長いリンク通信を使用しようと思っていましたが、関連する基礎がなかったため、長い間研究しても解決策が見つかりませんでした。そこで、http ポーリングの方法に切り替えました。しかし、この方法を使用すると、別の問題が発生しました:メッセージキュー。ポーリングではクライアントにメッセージを即座にプッシュすることができないため、キューにメッセージをキャッシュして、クライアントがポーリングするときにキューを読み取り、プッシュする必要があります。しかし、この問題は解決できず、どのソリューションを使用しても安定性を保証することができず、ポーリングには数倍のリソースが必要です。そのため、私はこの方法を放棄し、socketio に切り替えることにしました。

socketio は websocket のラッパーライブラリですが、理論的には純粋な websocket よりも使用方法が簡単ですが、使用中に問題が発生しました。この問題には、私が 2 日近くかかっても解決できなかった(前の記事で言及したものです)という問題がありました。最終的には v2ex のエキスパートの助けを借りて解決しました。この問題は、開発プロセスで最も困難なもののようですが、この問題を解決した後、開発の進捗は飛躍的に向上し、間もなくプロジェクト全体を完成させました~~(実際にはしていません)~~。

接続方法が確定したので、次にフロントエンドとバックエンドのフレームワークを決定する必要があります。バックエンドでは、私はもちろん flask と flask-socketio を使用しました。これは私が最も馴染んでいる Web フレームワークです。しかし、クライアント側では困ってしまいました。メッセージを受信するだけなら、socketio ライブラリだけで済むのですが、問題はホワイトリストをどのように追加するかです。

私はかなり早い段階から mcdreforged を使用していましたが、私は現在 python しか知りませんので、mcdreforged を選択することにしました。しかし、開発中に大きな問題が発生しました:mcdr プラグインのコードはデフォルトで同期的に実行されるため、プラグインのコードが完了するまで次の操作に進むことはありません。しかし、私のプラグインは長い接続を維持する必要があるため、mcdr は私のコードの完了を待つことができず、スレッドが無限にブロックされて他の命令を実行できません。mcdr にはマルチスレッド機能が付属していますが、このマルチスレッド機能は非常に不完全であり、スレッドを閉じることができません。つまり、プラグインが再起動されると、2 つのスレッドが同時にバックエンドに接続されます。利益と損失を考慮した結果、私は mcdr プラットフォームを放棄し、別の方法を見つけることにしました:直接 whitelist.json を操作することです。

直接操作する場合は、マルチスレッドなどの操作を考慮する必要はなく、スレッドがブロックされる心配もありません。そのため、私はこの道を進んでいき、最終的には正常に使用できる最初の製品を作りました。

作成したばかりの頃、後悔しました:盗品サーバーの使用については全く考慮していませんでした。whitelist.json にはプレイヤーの ID と UUID を同時に保存する必要があるため、プログラム内で mojang 公式から UUID を取得する方法を固定してしまいました。盗品サーバーの UUID は適当に書き換えることができるため、正規の UUID を取得することもできますが、盗品プレイヤーの ID に対応する正規の UUID がない可能性があります。外部プログラムは万能ではないようです。内部プラグインのソリューションの方が安定しているようです。

私は java を知りませんが、幸いなことに協力してくれる人を見つけました。おそらく、fabric 版と spigot 版がまもなく登場するでしょう。このプロジェクトがますます良くなることを願っています。なぜなら、これは私が研究方向と将来性を持つ最初のプロジェクトだからです。

2022.7.26

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。