diff --git a/data/config.toml b/data/config.toml index a1aabf6..b557f79 100644 --- a/data/config.toml +++ b/data/config.toml @@ -1,8 +1,8 @@ [http] #host = "" -host = "192.168.110.53" -#host = "192.168.3.101" +#host = "192.168.110.53" +host = "192.168.3.102" port = 3999 [auth] diff --git a/internal/game/table.go b/internal/game/table.go index 8a4d46f..e3cd5f7 100644 --- a/internal/game/table.go +++ b/internal/game/table.go @@ -198,14 +198,14 @@ func (t *Table) RemovePlayer(playerId int64) (found bool, player *Player) { if p.Id == playerId { t.Players[i] = nil // 该玩家是房主, 房主给到下个位置玩家 - if t.MasterId == player.Id { + if t.MasterId == p.Id { nextMasterPos := t.NextPlayerPos(i) if nextMasterPos != i { t.MasterId = t.Players[nextMasterPos].Id } else { // 没有玩家了, 解散牌桌 t.Stage = 9 - LobbyTables.Delete(player.GameTable.TableNo) + LobbyTables.Delete(p.GameTable.TableNo) } } return true, p diff --git a/internal/logic/delayer/offline.go b/internal/logic/delayer/offline.go new file mode 100644 index 0000000..b24fba5 --- /dev/null +++ b/internal/logic/delayer/offline.go @@ -0,0 +1,65 @@ +package delayer + +import ( + "texas-poker-bk/internal/game/delayer" + "texas-poker-bk/internal/logic/store" + "texas-poker-bk/tool/async" + "texas-poker-bk/tool/collect" + "time" +) + +// 清理离线用户 + +var ( + OfflineDelayer *async.DelayQueue[int64] +) + +func init() { + OfflineDelayer = async.NewDelayQueue(time.Second, 128, handleOfflineDelay) +} + +func handleOfflineDelay(accountId int64, now time.Time) { + account := store.NetAccounts.Get(accountId) + if account == nil { + return + } + if account.Player == nil { + // 不在游戏中,移除 + removeMemoryAccount(accountId) + return + } + // 牌局未在进行中直接移除玩家并下线 + if collect.In(account.Player.GameTable.Stage, 1, 9) { + found, _ := account.Player.GameTable.RemovePlayer(account.Id) + if found { + account.SettlePlayerChip() + } + removeMemoryAccount(accountId) + return + } + // 牌局结束展示时间,10s后再移除玩家 + if account.Player.GameTable.Stage == 7 { + accountId := accountId + delayer.GameDelayer.Delay(10*time.Second, func() { + account := store.NetAccounts.Get(accountId) + if account == nil || account.Player == nil || collect.NotIn(account.Player.GameTable.Stage, 1, 7, 9) { + return + } + // 从牌桌移除玩家 + found, _ := account.Player.GameTable.RemovePlayer(account.Id) + if found { + account.SettlePlayerChip() + } + removeMemoryAccount(account.Id) + }) + } + // 牌局进行中,自动下注待结束自动处理 +} + +// func removeMemoryAccount(account *session.NetAccount) { +func removeMemoryAccount(accountId int64) { + _ = store.NetAccounts.Get(accountId) + store.NetAccounts.Delete(accountId) + store.TokenVersions.Delete(accountId) + // TODO 持久化账户金额 +} diff --git a/internal/logic/delayer/offline_clean.go b/internal/logic/delayer/offline_clean.go deleted file mode 100644 index a99b0ce..0000000 --- a/internal/logic/delayer/offline_clean.go +++ /dev/null @@ -1,25 +0,0 @@ -package delayer - -import ( - "texas-poker-bk/internal/logic/store" - "texas-poker-bk/tool/async" - "time" -) - -// 清理离线用户 - -var ( - OfflineCleanDelayer *async.DelayQueue[int64] -) - -func init() { - OfflineCleanDelayer = async.NewDelayQueue(time.Second, 128, removeMemoryAccount) -} - -// func removeMemoryAccount(account *session.NetAccount) { -func removeMemoryAccount(accountId int64, now time.Time) { - _ = store.NetAccounts.Get(accountId) - store.NetAccounts.Delete(accountId) - store.TokenVersions.Delete(accountId) - // TODO 持久化账户金额 -} diff --git a/internal/logic/event/offline.go b/internal/logic/event/offline.go index c7d407a..a2084d9 100644 --- a/internal/logic/event/offline.go +++ b/internal/logic/event/offline.go @@ -2,10 +2,8 @@ package event import ( "fmt" - gameDelayer "texas-poker-bk/internal/game/delayer" "texas-poker-bk/internal/logic/delayer" "texas-poker-bk/internal/logic/store" - "texas-poker-bk/tool/collect" "texas-poker-bk/tool/watcher" "time" ) @@ -26,37 +24,6 @@ func handleOffline(e *watcher.Event[int64, bool]) { return } fmt.Printf("account %d, %s handle offline.\n", account.Id, account.UserName) - if account == nil || store.NetAccounts.Get(account.Id) == nil { - return - } - if account.Player == nil { - // 不在游戏中,n秒后移除 - account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(10*time.Second, account.Id) - return - } - // 牌局未在进行中直接移除玩家并下线 - if collect.In(account.Player.GameTable.Stage, 1, 9) { - found, _ := account.Player.GameTable.RemovePlayer(account.Id) - if found { - account.SettlePlayerChip() - } - account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(10*time.Second, account.Id) - return - } - // 牌局结束展示时间,10s后再移除玩家 - if account.Player.GameTable.Stage == 7 { - accountId := e.Publisher - gameDelayer.GameDelayer.Delay(10*time.Second, func() { - account := store.NetAccounts.Get(accountId) - if account == nil || account.Player == nil || collect.NotIn(account.Player.GameTable.Stage, 1, 7, 9) { - return - } - // 从牌桌移除玩家 - found, _ := account.Player.GameTable.RemovePlayer(account.Id) - if found { - account.SettlePlayerChip() - } - account.OfflineCleanCanceler = delayer.OfflineCleanDelayer.Delay(3*time.Second, account.Id) - }) - } + // 10s内未重连上处理离线逻辑 + account.OfflineDelayCanceler = delayer.OfflineDelayer.Delay(10*time.Second, account.Id) } diff --git a/internal/logic/event/online.go b/internal/logic/event/online.go index 1da619a..1151660 100644 --- a/internal/logic/event/online.go +++ b/internal/logic/event/online.go @@ -19,8 +19,8 @@ func handleOnline(e *watcher.Event[int64, bool]) { if account == nil { return } - if account.OfflineCleanCanceler != nil { - account.OfflineCleanCanceler.Cancel() + if account.OfflineDelayCanceler != nil { + account.OfflineDelayCanceler.Cancel() } if account.Player == nil { return diff --git a/internal/logic/table.go b/internal/logic/table.go index 44332c0..6b2776e 100644 --- a/internal/logic/table.go +++ b/internal/logic/table.go @@ -221,7 +221,7 @@ func HandleReqKickOutTable(player *game.Player, msg *api.ReqKickOutTable) (proto // 结算玩家金额 store.NetAccounts.Get(p.Id).SettlePlayerChip() // 被踢玩家消息 - player.Client.Write(&api.ResKickOutTable{}) + p.Client.Write(&api.ResKickOutTable{}) } // 通知牌桌所有玩家 player.GameTable.NoticeGameFullStatus() diff --git a/internal/session/net_account.go b/internal/session/net_account.go index d7004d0..a4bbb85 100644 --- a/internal/session/net_account.go +++ b/internal/session/net_account.go @@ -17,7 +17,7 @@ type NetAccount struct { BalanceLock *sync.RWMutex Lock *sync.Mutex - OfflineCleanCanceler *async.Canceler[int64] + OfflineDelayCanceler *async.Canceler[int64] } func (account *NetAccount) DecrementBalance(amount int32) int32 {