# @CHaT WebSocket サーバー

Xojo製TCPサーバー (ポート25102) をNode.js + WebSocketに移植したサーバーです。

## 前提条件

- Node.js 18以上
- npm

## インストール

```bash
cd ~/Library/CloudStorage/Dropbox/www/atchat/server
npm install
```

## 起動方法

### 開発モード（ファイル変更で自動再起動）

```bash
npm run dev
```

### 本番モード

```bash
npm start
```

起動すると以下のようなログが出ます：

```
[20260417 120000] @CHaT WebSocket Server starting...
[20260417 120000] Root: /Users/.../atchat/server/
[20260417 120000] Initializing places...
[20260417 120000] Places initialized. 42 named places found.
[20260417 120000] WebSocket server listening on ws://localhost:25102
```

## エンドポイント

```
ws://localhost:25102
```

## データディレクトリ

サーバーは起動ディレクトリ直下の `DATA2/` を参照します。

```
server/
├── DATA2/
│   ├── UserList.text          # ID=パスワード (iFile形式)
│   ├── account.text           # アカウントキー → trueId マッピング
│   └── Place/
│       ├── 0/
│       │   ├── Place.text     # 部屋設定 (名前, 壁紙, マップ等)
│       │   └── GroundObject.text
│       ├── 1/
│       └── ...
│   └── User/
│       └── {trueId}/
│           └── prof.text      # プロフィール (EXP, Info, URL等)
```

## ログインプロトコル

メッセージ区切りは `,\r` (カンマ + CR)。

```
l,{名前},{顔番号},{ユーザーID},{パスワード},{バージョン},{OS},{MACアドレス},{場所番号},
```

例：

```
l,テスト太郎,0,myUserId,myPassword,WEB100,Web,,0,
```

ログインが成功すると以下の順でレスポンスが返ります：

| ステップ | クライアント送信 | サーバー応答 |
|---------|---------------|------------|
| 1 | `l,...` | `i,{cID},{wallPaper}` / `cl,{日時}` / `pf,{EXP},...` / `jc,...` / `lp,1` |
| 2 | `sv` | `sv,WEB100` / `wt,` / `lp,2` |
| 3 | `ul` | `u,...` (部屋のユーザー一覧) / `lp,3` |
| 4 | `ol` | `o,...` (地上オブジェクト一覧) / `lp,4` |
| 5 | `il` | `ilste` / `lp,5` |
| 6〜7 | (次のステップ) | `lp,6` / `lp,7` |
| 完了 | — | `j,...` (join broadcast) |

## 主なコマンド一覧

| コマンド | 内容 |
|---------|------|
| `l` | ログイン |
| `sv` | サーバーバージョン確認 |
| `ul` | ユーザーリスト要求 |
| `ol` | オブジェクトリスト要求 |
| `il` | アイテムリスト要求 |
| `t` | 発言 (部屋内ブロードキャスト) |
| `m` | 移動 |
| `fm` | フリーズ移動 |
| `cc` | キャラクター変更 |
| `sc` | ステータス変更 |
| `c` | ライフチェック (ハートビート) |
| `en` | 部屋移動 |
| `ss` | サーバーステータス |
| `gi` | ユーザー情報取得 |
| `cp` | プロフィール変更 |
| `im` | インスタントメッセージ送信 |
| `imc` | インスタントメッセージ相手確認 |

## 接続テスト

`wscat` を使った手動テスト：

```bash
# wscatのインストール (未インストールの場合)
npm install -g wscat

# 接続
wscat -c ws://localhost:25102

# ログインコマンド送信 (末尾に ,\r が必要)
> l,テスト,0,myUserId,myPassword,WEB100,Web,,0,^M
```

Node.jsスクリプトによるテスト：

```js
import WebSocket from 'ws';

const TN = ',\r';
const ws = new WebSocket('ws://localhost:25102');

ws.on('open', () => {
  ws.send(`l,テスト,0,myUserId,myPassword,WEB100,Web,,0${TN}`);
});

ws.on('message', (data) => {
  console.log('<<', data.toString());
});
```

## プロジェクト構成

```
server/
├── src/
│   ├── index.ts      # エントリポイント (サーバー起動)
│   ├── session.ts    # セッション管理・コマンド処理
│   ├── place.ts      # 場所(部屋)クラス
│   ├── ifile.ts      # iFile形式ファイル読み書き
│   ├── types.ts      # 型定義
│   └── utils.ts      # ユーティリティ関数
├── DATA2/            # データファイル
├── package.json
└── tsconfig.json
```
