Files
zt-online-game-backend/internal/boot/boot.go
T

47 lines
2.1 KiB
Go

// Package boot 负责 WebSocket 各模块的接线:注册玩法、创建房间管理器与匹配器、注册消息处理器。
package boot
import (
"context" // 标准库:匹配循环的生命周期上下文
"log/slog" // 标准库:记录初始化完成
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/game"
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/game/gobang"
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/game/snake"
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/hall"
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/room"
"git.lzcwy.cn/zhengchiliu/zt-online-game-backend/internal/wsgateway"
)
// 模块句柄:便于后续 HTTP 接口或运维命令查询在线数、房间数。
var (
Hub *wsgateway.Hub // 连接注册表
Rooms *room.Manager // 房间管理器
Matcher *hall.Matcher // 匹配器
)
// InitWS 完成 WS 模块初始化与接线,应在配置加载之后、服务启动之前调用。
func InitWS() {
// 注册玩法:每新增一个玩法就在此加一行,网关 / 大厅 / 房间代码无需改动。
// 玩法自己通过 Meta 声明人数范围与推进周期(TickMs),匹配器据此分队列。
game.Register("gobang", func() game.Game { return gobang.New() }) // 五子棋:2 人,回合制
game.Register("snake", func() game.Game { return snake.New() }) // 贪吃蛇:2~4 人,实时(200ms 一步)
Hub = wsgateway.DefaultHub // 使用网关默认 Hub
Rooms = room.NewManager(Hub) // 创建房间管理器
room.RegisterHandlers(Hub, Rooms) // 注册 room.* 消息处理器
Matcher = hall.NewMatcher(Hub, Rooms) // 创建匹配器(成局后委托 Rooms 建房间)
hall.RegisterHandlers(Hub, Matcher, Rooms) // 注册 hall.* 消息处理器
// 断连回调:连接断开时通知房间,进入掉线宽限,重连逻辑因此生效。
Hub.OnDisconnect(func(userID int64) { Rooms.OnUserDisconnected(userID) })
slog.Info("ws modules initialized")
}
// Start 启动 WS 后台任务(匹配队列扫描)。
func Start(ctx context.Context) {
go Matcher.Run(ctx) // 后台扫描,ctx 取消即退出
}