diff --git a/cmd/main.go b/cmd/main.go index 1765cfb..7182caa 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -27,7 +27,7 @@ func main() { //fmt.Println(k, v) //wait := &sync.WaitGroup{} - //wait.Add(1) + //wait.Publish(1) //wait.Wait() //wait := make(chan bool, 1) @@ -38,7 +38,7 @@ func main() { //var counters [10]*atomic.Int32 // //delayer := async.NewScheduleQueue(time.Second, 32, func(index int32, now time.Time) int32 { - // counters[index%100].Add(1) + // counters[index%100].Publish(1) // fmt.Println(now.Format("2006-01-02 15:04:05.9999"), index, index%100, counters[index%100].Load()) // if index == 10000 && counters[index%100].Load() == 1000 { // wait <- true diff --git a/data/config.toml b/data/config.toml index a1ec0a5..1055f0d 100644 --- a/data/config.toml +++ b/data/config.toml @@ -1,6 +1,7 @@ [http] host = "" +#host = "192.168.3.101" port = 3999 [auth] diff --git a/internal/server/ws.go b/internal/server/ws.go index ea79037..f310926 100644 --- a/internal/server/ws.go +++ b/internal/server/ws.go @@ -84,7 +84,8 @@ func handleNetClient(client *session.NetClient) { }() defer func() { if client.Account != nil { - event.OfflineWatcher.Add(client.Account.Id, true) + client.Online.Store(false) + event.OfflineWatcher.Publish(client.Account.Id, true) } }() // https://github.com/gorilla/websocket/blob/a68708917c6a4f06314ab4e52493cc61359c9d42/examples/chat/conn.go#L50 diff --git a/internal/service/auth.go b/internal/service/auth.go index 8066436..1e456a7 100644 --- a/internal/service/auth.go +++ b/internal/service/auth.go @@ -253,7 +253,7 @@ func HandleReqIdentity(client *session.NetClient, msg *api.ReqIdentity) (proto.M client.Account = account // 在线通知消息 - event.OnlineWatcher.Add(account.Id, true) + event.OnlineWatcher.Publish(account.Id, true) // response res := &api.ResIdentity{Id: subject.Id, Username: subject.Name, Avatar: subject.Avatar} diff --git a/internal/service/event/offline.go b/internal/service/event/offline.go index 309bb91..662842e 100644 --- a/internal/service/event/offline.go +++ b/internal/service/event/offline.go @@ -3,7 +3,7 @@ package event import ( "fmt" "texas-poker-bk/internal/service/store" - "texas-poker-bk/internal/session" + "texas-poker-bk/tool/async" "texas-poker-bk/tool/collect" "texas-poker-bk/tool/watcher" "time" @@ -13,14 +13,14 @@ var ( // OfflineWatcher 离线动作 OfflineWatcher *watcher.Watcher[int64, bool] - //OfflineQueue *collect.DelayQueue[*session.NetAccount] - + offlineCleanDelayer *async.DelayQueue[int64] ) func init() { OfflineWatcher = watcher.NewWatcher(128, handleOffline) go OfflineWatcher.Run() + offlineCleanDelayer = async.NewDelayQueue(time.Second, 128, removeMemoryAccount) } func handleOffline(e *watcher.Event[int64, bool]) { @@ -33,15 +33,15 @@ func handleOffline(e *watcher.Event[int64, bool]) { return } if account.Player == nil { - // 不在游戏中,直接下线 - removeMemoryAccount(account) + // 不在游戏中,n秒后移除 + account.OfflineCleanCanceler = offlineCleanDelayer.Delay(10*time.Second, account.Id) return } if collect.In(account.Player.GameTable.Stage, 1, 9) { // 牌局未在进行中直接移除玩家并下线 account.Player.GameTable.RemovePlayer(account.Id) account.SettlePlayerChip() - removeMemoryAccount(account) + account.OfflineCleanCanceler = offlineCleanDelayer.Delay(10*time.Second, account.Id) return } // 判断当前是玩家回合(60s自动过牌/弃牌) @@ -51,8 +51,10 @@ func handleOffline(e *watcher.Event[int64, bool]) { // 待玩家回合时还是offline(自动过牌/弃牌) } -func removeMemoryAccount(account *session.NetAccount) { - store.NetAccounts.Delete(account.Id) - store.TokenVersions.Delete(account.Id) +// 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/service/event/online.go b/internal/service/event/online.go index bf783e1..7a9bbd4 100644 --- a/internal/service/event/online.go +++ b/internal/service/event/online.go @@ -16,7 +16,13 @@ func init() { // handleOnline 玩家上线了,取消一些自动操作动作 func handleOnline(e *watcher.Event[int64, bool]) { account := store.NetAccounts.Get(e.Publisher) - if account == nil || account.Player == nil { + if account == nil { + return + } + if account.OfflineCleanCanceler != nil { + account.OfflineCleanCanceler.Cancel() + } + if account.Player == nil { return } // 取消自动下注 diff --git a/internal/session/net_account.go b/internal/session/net_account.go index 35fdb7d..d7004d0 100644 --- a/internal/session/net_account.go +++ b/internal/session/net_account.go @@ -3,6 +3,7 @@ package session import ( "sync" "texas-poker-bk/internal/game" + "texas-poker-bk/tool/async" ) // NetAccount 已认证的长连接用户 @@ -15,6 +16,8 @@ type NetAccount struct { Player *game.Player BalanceLock *sync.RWMutex Lock *sync.Mutex + + OfflineCleanCanceler *async.Canceler[int64] } func (account *NetAccount) DecrementBalance(amount int32) int32 { diff --git a/internal/session/net_client.go b/internal/session/net_client.go index 3750ad8..a215320 100644 --- a/internal/session/net_client.go +++ b/internal/session/net_client.go @@ -33,7 +33,6 @@ func NewNetClient(conn *websocket.Conn) *NetClient { func (c *NetClient) Close(reason string) { log.Println("close NetClient reason: ", reason) - c.Online.Store(false) err := c.Conn.Close() if err != nil { log.Println("Close Error", err) diff --git a/tool/watcher/watcher.go b/tool/watcher/watcher.go index a0b9580..5d148da 100644 --- a/tool/watcher/watcher.go +++ b/tool/watcher/watcher.go @@ -39,7 +39,7 @@ func (w *Watcher[P, T]) Stop() { w.stop <- true } -func (w *Watcher[P, T]) Add(publisher P, event T) { +func (w *Watcher[P, T]) Publish(publisher P, event T) { e := &Event[P, T]{publisher, event, time.Now().UnixMilli()} go func() { w.events <- e