From f7173a4f494585598f963342a9c8fe38c92852ef Mon Sep 17 00:00:00 2001 From: mountain Date: Mon, 4 Sep 2023 10:24:17 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=8C=ED=8B=B0=EB=A5=BC=20=EC=98=AE?= =?UTF-8?q?=EA=B8=B8=20=EB=95=8C=20=EA=B8=B0=EC=A1=B4=20=ED=8C=8C=ED=8B=B0?= =?UTF-8?q?=EC=97=90=20=EB=82=A8=EC=95=84=EC=9E=88=EB=8A=94=20=EA=B1=B0=20?= =?UTF-8?q?=EC=B2=98=EB=9F=BC=20=EB=B3=B4=EC=9D=B4=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/group_party.go | 48 +++++++++++++++++++++++++++++++++++++++------ core/tavern.go | 7 ++----- go.mod | 2 +- go.sum | 2 ++ 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/core/group_party.go b/core/group_party.go index 7b441b6..689b61c 100644 --- a/core/group_party.go +++ b/core/group_party.go @@ -481,6 +481,34 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque return } + pids, err := gp.rh.JSONGetString(mid.Hex(), "$.party.id") + if err != nil { + logger.Error("AcceptPartyInvitation failed. gp.rh.JSONGetString returns err :", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + if len(pids) > 0 && len(pids[0]) > 0 { + // 기존에 이미 파티에 들어가 있다. + // 기존 파티에서는 탈퇴 + oldgid, _ := primitive.ObjectIDFromHex(pids[0]) + oldgd := &groupDoc{ + id: oldgid, + rh: gp.rh, + } + + // gid에는 제거 메시지 보냄 + gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ + Target: "#" + oldgd.strid(), + Body: bson.M{ + oldgd.tid(mid): bson.M{}, + }, + Tag: []string{"MemberDocFull"}, + }) + + gp.leaveRoom(oldgid, mid) + } + gd := &groupDoc{ id: gid, rh: gp.rh, @@ -499,6 +527,9 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque gp.enterRoom(gid, mid) + // 현재 내 파티를 기록 + gp.rh.JSONSet(mid.Hex(), "$.party", bson.M{"id": gid.Hex()}) + // 새 멤버에 그룹 전체를 알림 gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ Target: mid.Hex(), @@ -531,13 +562,16 @@ func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Reque return } - states, _ := gp.rh.HMGet(gp.rh.Context(), mid, "party_state", "_ts").Result() - if states[0] != nil && len(states[0].(string)) > 0 { - w.Write([]byte(states[0].(string))) - } else if states[1] != nil && len(states[1].(string)) > 0 { - w.Write([]byte("connected")) + states, err := gp.rh.JSONGetString(mid, "$.party.state") + if err == redis.Nil { + return } + if len(states) > 0 && len(states[0]) > 0 { + w.Write([]byte(states[0])) + } else { + w.Write([]byte("connected")) + } } // LeaveParty : 그룹에서 나감 or 내보냄 @@ -593,6 +627,8 @@ func (gp *groupParty) LeaveParty(w http.ResponseWriter, r *http.Request) { return } + gp.rh.JSONDel(mid.Hex(), "$.party.id") + // mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐 gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ Target: mid.Hex(), @@ -624,7 +660,7 @@ func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson. } if newstate, ok := doc["_state"]; ok { - gp.rh.HSet(gp.rh.Context(), mid.Hex(), "party_state", newstate).Result() + gp.rh.JSONSet(mid.Hex(), "$.party.state", newstate) } gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ diff --git a/core/tavern.go b/core/tavern.go index 3fcbec6..bdff8be 100644 --- a/core/tavern.go +++ b/core/tavern.go @@ -181,13 +181,10 @@ func (tv *Tavern) RegisterHandlers(ctx context.Context, serveMux *http.ServeMux, func (tv *Tavern) OnClientMessageReceived(sender *wshandler.Sender, messageType wshandler.WebSocketMessageType, body io.Reader) { if messageType == wshandler.Connected { logger.Println("OnClientMessageReceived : connected ", sender.Accid.Hex()) - _, err := tv.redison.HSet(tv.redison.Context(), sender.Accid.Hex(), "_ts", time.Now().UTC().Unix()).Result() + tv.redison.Del(tv.redison.Context(), sender.Accid.Hex()) + _, err := tv.redison.JSONSet(sender.Accid.Hex(), "$", bson.M{"_ts": time.Now().UTC().Unix()}) if err != nil { logger.Println("OnClientMessageReceived HSet error :", err) - if *devflag { - tv.redison.Del(tv.redison.Context(), sender.Accid.Hex()).Result() - tv.redison.HSet(tv.redison.Context(), sender.Accid.Hex(), "_ts", time.Now().UTC().Unix()).Result() - } } for _, gt := range tv.groups { diff --git a/go.mod b/go.mod index 2d4f393..96ca369 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-20230901022951-26e968f7c9bf + repositories.action2quare.com/ayo/gocommon v0.0.0-20230904005440-d396a35713ad ) require ( diff --git a/go.sum b/go.sum index 5d28de7..efb1150 100644 --- a/go.sum +++ b/go.sum @@ -156,3 +156,5 @@ repositories.action2quare.com/ayo/gocommon v0.0.0-20230831121619-9e9d91b5a30f h1 repositories.action2quare.com/ayo/gocommon v0.0.0-20230831121619-9e9d91b5a30f/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw= repositories.action2quare.com/ayo/gocommon v0.0.0-20230901022951-26e968f7c9bf h1:lG83p89qnYwtYYLh92Fc5hXHPk3lKxKe1lZx1ShDu/Y= repositories.action2quare.com/ayo/gocommon v0.0.0-20230901022951-26e968f7c9bf/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230904005440-d396a35713ad h1:/hwmPT3hKm/eSqvZ9LjamlvptygWZ87fg09OujRu5xo= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230904005440-d396a35713ad/go.mod h1:PdpZ16O1czKKxCxn+0AFNaEX/0kssYwC3G8jR0V7ybw=