# 游戏内通讯 服务端现在直接承载 IRC 聊天。之前登录响应的 `IRC` 默认为空,配置地址也不会启动聊天监听;现在空地址会自动解析为游戏服务器主机,并随 HTTP 服务启动实际 TCP/TLS 监听。无需另装 Node.js、InspIRCd 或独立 IRC 程序。 ## 使用 1. 使用 `scripts/Start-Server.ps1` 编译并启动更新后的服务器,或在 Visual Studio 中重新生成服务器项目。 2. 退出游戏账号后重新登录,让游戏读取新的 `IRC` 地址。 3. 在游戏中验证区域、招募、交易、问答、小队、氏族/联盟频道或玩家私聊。 默认监听 `127.0.0.1`,TCP `6665–6669`,TLS `6695–6699`。TLS 复用服务端证书配置;未指定 PFX 时使用进程生成的证书。任何聊天端口绑定失败都会明确报错并中止服务器启动,已绑定端口会释放。控制台 Ctrl+C 和管理 API 停服均会关闭聊天连接、保存掉线标记并释放端口。 已有 `server.json` 无需补字段即可默认开启。需要自定义时,将以下字段合并进原配置,保留原有令牌和其他设置: ```json { "IrcAddresses": [], "Irc": { "Enabled": true, "ListenAddress": "127.0.0.1", "Ports": [6665, 6666, 6667, 6668, 6669], "TlsPorts": [6695, 6696, 6697, 6698, 6699], "AllowLegacyLoopbackClients": true, "MaxConnections": 256, "RegistrationTimeoutSeconds": 30, "PingIntervalSeconds": 60, "PingTimeoutSeconds": 120 } } ``` `IrcAddresses` 非空时保留显式配置;要切换到内置服务,应将它清空或改成该服务器的实际聊天地址。留空时,地址取 `GamePublicUrl`(未配置时取 `PublicUrl`)的主机名;自定义端口会一起公布。`%THIS_MACHINE%` 同样替换为该主机名。登录响应与 `/custom/tunables.json` 的地址保持一致。 仅使用外部 IRC 时,将 `Irc.Enabled` 设为 `false` 并填写 `IrcAddresses`。完全关闭聊天时同时清空 `IrcAddresses`。设置变更需要重启。`--no-irc` 临时禁用监听;`--irc-port=<端口>`、`--irc-tls-port=<端口>` 分别临时替换 TCP/TLS 端口列表,不修改磁盘配置。这些参数主要用于隔离验证。 ## 鉴权与客户端兼容 支持 `USER 0 * nonce=`、传统裸 nonce,以及 OpenWF 的 `token=`。Token 的密钥为当前 nonce 的十进制 UTF-8 字符串,消息为 `accountId=&ct=IRC`。昵称必须与账号当前名称相符;会话过期、注销、封禁或账号改名会使连接失效。昵称平台标记、旧客户端私聊目标和 WHOX 查询均有适配。 当前 `2026.08.19.11.06` 原生客户端使用原生挑战响应校验,无需修改桥接组件,也不受本机地址限制。服务器在 identd 通知中发送随机 8 位十六进制挑战,按该版本协议校验客户端提交的 20 字节响应,将其绑定到当前账号和 nonce;只在 TLS 上接受这种响应。错误响应不会降级到未校验兼容模式。带缓存清单后缀的同版本 buildLabel 也适用。 该版本协议常量记录在 `Server/data/irc-auth.json`,来源为已验证的本机游戏副本:EXE SHA-256 `D01B5CB5CFF51AFC5FFB7D3AF051674AAFA84000BEE764780FF71D9D073CAD93`。已对照原生握手的指令数据流,并只读核对运行中副本的固定协议常量区域,内容一致。服务端运行不需要读取游戏文件或进程。 其他尚未记录原生握手算法的版本保留默认开启的**本机兼容入口**:连接必须使用 TLS、来自回环地址,账号必须有有效的游戏登录,并且该登录也来自回环地址。它检查账号和昵称,不校验旧版的 40 位原生握手值,不提供管理员或频道管理权限;同机程序仍可能冒用这些旧版本已登录账号的聊天身份。需要严格校验时关闭 `AllowLegacyLoopbackClients`,使用上述已支持原生握手的版本或发送 nonce/token 的客户端。 远程部署需将 `Irc.ListenAddress` 改为适合的网卡地址(例如 `0.0.0.0`),设置可访问的 `GamePublicUrl`,开放实际使用的聊天 TCP 端口。当前已支持的原生版本及 nonce/token 客户端均可走会话校验;其他版本不能使用仅限本机的未校验兼容入口。本次变更全部在服务端,未新增或修改客户端钩子。 ## 已实现行为 - 区域、招募、交易、问答和小队等客户端请求的频道加入/离开、中文消息广播、在线成员名单。 - 私聊及游戏通过 `NOTICE` 发送的社交通知;保留消息正文和 CTCP 内容。 - 氏族 `#C`、联盟 `#A` 使用当前有效成员关系校验;移除成员后停止向其转发频道消息。 - 忽略名单过滤频道消息、私聊和通知;在线查询、WHO/WHOX、WHOIS、离开状态。 - 已校验会话根据服务器管理员和氏族/联盟权限获得频道管理权限;支持主题和移出频道。 - 心跳、注册超时、重连替换、会话失效、掉线持久化。旧连接退出不会把新会话标记为掉线。 - 每连接有界发送队列、报文长度限制、连接数与命令频率限制;聊天日志不记录原始报文、nonce/token 或聊天正文。 聊天不代替 NRS、UDP Hub、P2P 网络或语音服务。转发组队邀请通知也不等于完整联机游玩已验收。 ## 验证 2026-09-27 使用独立临时存档和本机真实 TCP/TLS 连接验证: - 23 项聊天相关自动化用例覆盖协议收发、分片 UTF-8、TLS、nonce/token、当前版本原生挑战响应、错误响应拒绝降级、旧版本机兼容限制、权限与忽略名单、重连、注销/封禁、超时、端口冲突和配置兼容。 - 服务器整体回归 284 项通过。 - `scripts/Smoke-Test.ps1` 共 34 项通过;其中直接使用实际 HTTP 登录返回的两组账号会话,跨 TCP/TLS 聊天连接传递中文频道消息和私聊,并验证原生挑战响应、地址发布、日志脱敏及停服释放端口。 复现: ```powershell dotnet test Server/Tests/XFEWarframe.Tests/XFEWarframe.Tests.csproj -c Release ./scripts/Smoke-Test.ps1 ``` 尚未完成两个真实游戏客户端之间的聊天界面验收,不能把上述协议测试等同于所有历史版本或完整游戏联机流程通过。协议参考:[OpenWF 聊天服务说明](https://about.openwf.io/chat-server-setup)、[warframe-irc-server](https://github.com/Sainan/warframe-irc-server/blob/senpai/main.cpp)。