游戏内通讯
服务端现在直接承载 IRC 聊天。之前登录响应的 IRC 默认为空,配置地址也不会启动聊天监听;现在空地址会自动解析为游戏服务器主机,并随 HTTP 服务启动实际 TCP/TLS 监听。无需另装 Node.js、InspIRCd 或独立 IRC 程序。
使用
- 使用
scripts/Start-Server.ps1编译并启动更新后的服务器,或在 Visual Studio 中重新生成服务器项目。 - 退出游戏账号后重新登录,让游戏读取新的
IRC地址。 - 在游戏中验证区域、招募、交易、问答、小队、氏族/联盟频道或玩家私聊。
默认监听 127.0.0.1,TCP 6665–6669,TLS 6695–6699。TLS 复用服务端证书配置;未指定 PFX 时使用进程生成的证书。任何聊天端口绑定失败都会明确报错并中止服务器启动,已绑定端口会释放。控制台 Ctrl+C 和管理 API 停服均会关闭聊天连接、保存掉线标记并释放端口。
已有 server.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 <accountId> 0 * nonce=<Nonce>、传统裸 nonce,以及 OpenWF 的 token=<HMAC-SHA256>。Token 的密钥为当前 nonce 的十进制 UTF-8 字符串,消息为 accountId=<id>&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<id>、联盟#A<id>使用当前有效成员关系校验;移除成员后停止向其转发频道消息。 - 忽略名单过滤频道消息、私聊和通知;在线查询、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 聊天连接传递中文频道消息和私聊,并验证原生挑战响应、地址发布、日志脱敏及停服释放端口。
复现:
dotnet test Server/Tests/XFEWarframe.Tests/XFEWarframe.Tests.csproj -c Release
./scripts/Smoke-Test.ps1
尚未完成两个真实游戏客户端之间的聊天界面验收,不能把上述协议测试等同于所有历史版本或完整游戏联机流程通过。协议参考:OpenWF 聊天服务说明、warframe-irc-server。