diff --git a/core/group.go b/core/group.go index f5c3119..a82550a 100644 --- a/core/group.go +++ b/core/group.go @@ -39,4 +39,5 @@ type group interface { Dismiss(groupID primitive.ObjectID) error UpdateGroupDocument(groupID primitive.ObjectID, doc bson.M) error QueryGroupMembers(groupID primitive.ObjectID) (bson.M, error) + MemberDisconnected(room string, mid primitive.ObjectID) } diff --git a/core/group_memory.go b/core/group_memory.go index dc60261..4a08dd8 100644 --- a/core/group_memory.go +++ b/core/group_memory.go @@ -523,6 +523,21 @@ func (gm *groupInMemory) UpdateGroupDocument(gid groupID, frag bson.M) error { return nil } +func (gm *groupInMemory) MemberDisconnected(room string, mid primitive.ObjectID) { + midstr := mid.Hex() + deleted, _ := gm.rh.JSONDel(room, "$._members."+midstr) + if deleted > 0 { + // 퇴장을 알림 + gm.sendUpstreamMessage(&wshandler.UpstreamMessage{ + Target: "#" + room, + Body: bson.M{ + midstr: bson.M{}, + }, + Tag: []string{"MemberDocFull"}, + }) + } +} + func (cfg *groupConfig) prepareInMemory(ctx context.Context, typename string, sub *subTavern) (group, error) { // group document // member document diff --git a/core/tavern.go b/core/tavern.go index e8ebf2b..18b8b1a 100644 --- a/core/tavern.go +++ b/core/tavern.go @@ -217,6 +217,15 @@ func (sub *subTavern) OnClientMessageReceived(sender *wshandler.Sender, messageT if messageType == wshandler.Connected { logger.Println("OnClientMessageReceived : connected ", sender.Accid.Hex()) } else if messageType == wshandler.Disconnected { + var rooms []string + dec := json.NewDecoder(body) + if err := dec.Decode(&rooms); err == nil { + for _, roomname := range rooms { + for _, gt := range sub.groups { + gt.MemberDisconnected(roomname, sender.Accid) + } + } + } logger.Println("OnClientMessageReceived : disconnected ", sender.Accid.Hex()) } else if messageType == wshandler.BinaryMessage { var msg map[string][]any diff --git a/go.mod b/go.mod index aa8fe5f..3d26a50 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/go-redis/redis/v8 v8.11.5 go.mongodb.org/mongo-driver v1.11.7 - repositories.action2quare.com/ayo/gocommon v0.0.0-20230719003525-e0e911f9e7da + repositories.action2quare.com/ayo/gocommon v0.0.0-20230719073844-112e037f4d4e ) require ( diff --git a/go.sum b/go.sum index 88ffa21..596dff2 100644 --- a/go.sum +++ b/go.sum @@ -134,3 +134,5 @@ repositories.action2quare.com/ayo/gocommon v0.0.0-20230719003337-29b2f258507d h1 repositories.action2quare.com/ayo/gocommon v0.0.0-20230719003337-29b2f258507d/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw= repositories.action2quare.com/ayo/gocommon v0.0.0-20230719003525-e0e911f9e7da h1:aXkXUzD06heQQhbvLZurzo+QBDYQrXKjmoLsnv3IV/g= repositories.action2quare.com/ayo/gocommon v0.0.0-20230719003525-e0e911f9e7da/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230719073844-112e037f4d4e h1:WoQVMfkti9XZesqlZfU0Lh7Luib4Y7pOKU2YExNvfmo= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230719073844-112e037f4d4e/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw=