マインクラフトと連携できるWebsocketサーバーを作ってみました

# はじめに

![デモ画面](https://socket-manager.github.io/document/img/index/demo.gif "デモ画面")

これはWebsocketサーバーを使ってマインクラフトとブラウザ間でチャットを行っている様子です。
通常のコメント発信とプライベート送信（マインクラフト側はウィスパー機能で実装）に対応しています。

一部例外はありますが、マインクラフトやほとんどのWebブラウザにはWebsocket通信の機能が実装されていますので、Websocketサーバーを通じてこのデモのようにマインクラフト⇔Webブラウザ間で通信を行う事が可能です。
（ブラウザのWebsocket機能はそのまま使えますので別途モジュールを適用する必要はありません）

以降ではデモサーバーのインストールとブラウザやマインクラフトからのアクセス方法をご紹介しています。


# 環境

以下の構成はあくまで動作確認時の環境です。
事前にインストールが必要なのはPHPとComposerのみです。

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>統合環境</dt>
    <dd>Xampp v3.3.0</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Windows Edition v1.20.73</dd>
    <dt>ブラウザ</dt>
    <dd>Chrome v123.0.6312.123</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
    <dt>composer</dt>
    <dd>v2.6.5</dd>
</dl>


# インストール

あらかじめPHP8.1.0以降とcomposerがインストールされているものとします。


### 拡張モジュールの適用
ライブラリを利用するにはまずsockets拡張モジュールを適用する必要がありますが既に入っている場合はこの項目は読み飛ばしてください。


:::note info
ここではXAMPP環境を使っている前提で説明していますが、デフォルトとは別の場所に格納している場合やLinux等の別の環境で利用されている場合は適宜読み替えてください。
:::

php.ini内のモジュール定義がコメントアウトされている場合はコメントをはずして有効にする。

![php-extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619905/24c8b513-185d-2fe3-ee63-7ad3de060332.png)

以下のコマンドを実行してenabledになっている事を確認。

```terminal:PowerShellで確認
> php -i | Select-String -pattern 'Sockets Support'
Sockets Support => enabled
```

これで拡張モジュールであるsocketsが有効になりました。


### Composerでインストール

今回のデモは以下のコマンドでインストールできます。

```terminal:デモ版のインストール
> composer create-project socket-manager/demo-project <インストール先のディレクトリ名>
```
:::note info
GitHubから直接ダウンロードされる場合は以下のページからどうぞ。
:::

https://github.com/socket-manager/demo-project/

# 動作確認

冒頭でご紹介したデモ版を動かしてみます。


### サーバーサイドの準備

プロジェクトルートで以下のコマンドを実行するだけで準備完了です。

```terminal:サーバーの起動
> php worker app:minecraft-chat-server 10000
```

:::note info
今回は10000ポートで起動しています。
:::


### クライアント（ブラウザ）の準備

インストールしたプロジェクトには以下のディレクトリにjQuery/React版のHTMLファイルが入っていますのでお好きな方をブラウザにドラッグ＆ドロップしてください（Webサーバーを起動する必要はありません）。

```text:クライアントのファイル
/app/client/jquery/chat.html（jQuery版）
/app/client/react/chat.html（React版）
```

React版の詳細については以下の記事でご紹介しています。
（機能はjQuery版と全く同じです）

https://qiita.com/glasses_seven/items/31f9530cd29edc1227b0/



### クライアント（マインクラフト）の準備

マインクラフトはUWPアプリのため以下のコマンドを実行してループバックアドレスへのアクセスを許可しておく必要があります（一度設定しておけば以降もそのまま使用できます）。

```terminal:ループバックアドレス許可の設定
> CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.MinecraftUWP_8wekyb3d8bbwe"
```

マインクラフトから接続する時は冒頭のデモのように以下の形式で入力します。

```terminal:マインクラフトからの接続
> /wsserver localhost:10000/<ユーザー名>
```

上記のユーザー名はマインクラフト内のユーザー名でなくても構いません。
あくまでデモ版のサーバー内で使用する名前です。

マインクラフトからは以下のように#でメンションを付ける事でプライベート送信ができます。

```terminal:マインクラフトからのプライベート送信
> <メッセージ>#<ユーザー名>
```

マインクラフトから退室する時は×ボタンで閉じてください。


# おわりに

一応マインクラフトからの退室コマンドもご用意していますが現状での使用はお勧めできません。

```terminal:マインクラフトからの退室コマンド
> $exit
```

上記コマンドで退室してもマインクラフト側から再接続がかかったり、再接続時に失敗する事が頻繁にあります。
マインクラフトの切断処理を含めた検証内容については以下のページでまとめていますので詳しく知りたい方はご覧ください。

https://qiita.com/glasses_seven/items/0431f268a1f7c89b1976/

今回ご紹介させて頂いたのはデモサーバーの一部ですが、その他のサーバーについて詳しく知りたい方は以下のページをご覧ください。

https://socket-manager.github.io/document/extra-demo.html

ホスト名やポート番号等の設定ファイルの詳細は以下のページでまとめています。
デモ環境に収録している６種類のサーバー全てで共通です。

https://socket-manager.github.io/document/extra-demo-setting.html

ここでご紹介したデモ環境のプロジェクトはLaravelと連携できます。
ご興味のある方は以下の記事をご覧ください。

https://qiita.com/glasses_seven/items/39ee921d754ed83585b3/

ここでご紹介させて頂いたデモ環境をカスタマイズしてマインクラフトのコンテンツ専用として構築した環境を以下のページでご紹介しています。

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/