From 8c3b2798505149ee6f09e79efd3164380019d562 Mon Sep 17 00:00:00 2001 From: mountain Date: Tue, 11 Jul 2023 11:08:31 +0900 Subject: [PATCH] =?UTF-8?q?message=20receiver=20=EC=8B=9C=EA=B7=B8?= =?UTF-8?q?=EB=8B=88=EC=B3=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/group_memory.go | 32 ++++++++++++++++++++++---------- core/tavern.go | 37 +++++++++++++++++++------------------ go.mod | 2 +- go.sum | 4 ++++ 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/core/group_memory.go b/core/group_memory.go index d289c64..5da87ab 100644 --- a/core/group_memory.go +++ b/core/group_memory.go @@ -409,13 +409,15 @@ type groupContainer struct { type groupInMemory struct { *groupConfig - groupDocSync func(groupID, []byte) error - memberSync func(groupID, accountID, ticketID, *memberDoc, bool) error - rpcCall func([]byte) error - hasConn func(accountID) *connection - sendUpstreamMessage func(*wshandler.UpstreamMessage) - sendCloseMessage func(accountID, string) - groups groupContainer + groupDocSync func(groupID, []byte) error + memberSync func(groupID, accountID, ticketID, *memberDoc, bool) error + rpcCall func([]byte) error + hasConn func(accountID) *connection + sendUpstreamMessage func(*wshandler.UpstreamMessage) + sendEnterRoomMessage func(groupID, accountID) + sendLeaveRoomMessage func(groupID, accountID) + sendCloseMessage func(accountID, string) + groups groupContainer } func (gc *groupContainer) add(id groupID, doc *groupDoc) { @@ -615,7 +617,7 @@ func (gm *groupInMemory) Invite(gid groupID, mid accountID, inviterDoc bson.M, i if rconn == nil { // mid가 있는 곳에서 처리를 해야 접속 끊겼을 때 콜백을 먼저 등록할 수 있다. // 콜백이 rconn에 먼저 등록되지 않으면 좀비 group이 생길 가능성이 생긴다. - return "", rpc.Make(gm).To(targetid).Call(gid, mid, inviteeDoc, inviterDoc) + return gid.Hex(), rpc.Make(gm).To(targetid).Call(gid, mid, inviteeDoc, inviterDoc) } // 이제 여기는 mid가 InCharge이면서 rconn이 존재 @@ -633,6 +635,8 @@ func (gm *groupInMemory) Invite(gid groupID, mid accountID, inviterDoc bson.M, i } gm.groupDocSync(gid, bt) gm.memberSync(gid, mid, tid, newdoc, true) + // 내가 wshandler room에 입장 + gm.sendEnterRoomMessage(gid, mid) } else { // targetid가 이미 멤버인지 미리 확인 가능 if !gd.ticket(targetid).IsZero() { @@ -670,6 +674,7 @@ func (gm *groupInMemory) AcceptInvitation(gid groupID, mid accountID, tid ticket result, isNew := gd.addMember(mid, &tid, member) if result != nil { + gm.sendEnterRoomMessage(gid, mid) return gid, gm.memberSync(gid, mid, tid, result, isNew) } @@ -726,11 +731,11 @@ func (gm *groupInMemory) DropPausedMember(gid primitive.ObjectID, mid primitive. // 드랍해야 한다. if gd.InCharge == mid { // 내가 방장인 경우 - gm.groupDocSync(gid, nil) + return gm.groupDocSync(gid, nil) } else { // 내가 방장이 아닌 경우 gd.removeMember(mid, &tid) - gm.memberSync(gid, mid, tid, nil, false) + return gm.memberSync(gid, mid, tid, nil, false) } } @@ -852,6 +857,7 @@ func (gm *groupInMemory) Leave(gid groupID, mid accountID, tid ticketID) error { Target: "@" + mid.Hex(), Body: makeTypeMessage(FullGroupDoc{Gid: gid}), }) + gm.sendLeaveRoomMessage(gid, targetmid) return nil } @@ -963,6 +969,12 @@ func (cfg *groupConfig) prepareInMemory(ctx context.Context, typename string, su sendUpstreamMessage: func(msg *wshandler.UpstreamMessage) { wsh.SendUpstreamMessage(region, msg) }, + sendEnterRoomMessage: func(gid groupID, accid accountID) { + wsh.EnterRoom(region, gid.Hex(), accid) + }, + sendLeaveRoomMessage: func(gid groupID, accid accountID) { + wsh.LeaveRoom(region, gid.Hex(), accid) + }, sendCloseMessage: func(target accountID, text string) { wsh.SendCloseMessage(region, target.Hex(), text) }, diff --git a/core/tavern.go b/core/tavern.go index 1379120..cd76421 100644 --- a/core/tavern.go +++ b/core/tavern.go @@ -185,21 +185,22 @@ func (tv *Tavern) Cleanup() { } } -func (tv *Tavern) SocketMessageReceived(accid primitive.ObjectID, alias string, messageType wshandler.WebSocketMessageType, body io.Reader) { - switch messageType { - case wshandler.Connected: - case wshandler.Disconnected: - } - // gidtype := msg.Conn.GetTag("gid") - // if len(gidtype) > 0 { - // tokens := strings.SplitN(gidtype, "@", 2) - // gidobj, _ := primitive.ObjectIDFromHex(tokens[0]) - // gtype := tokens[1] - // group := sub.groups[gtype] - // if group != nil { - // group.PauseMember(gidobj, msg.Alias, msg.Conn) - // } -} +// func (tv *Tavern) SocketMessageReceived(accid primitive.ObjectID, alias string, messageType wshandler.WebSocketMessageType, body io.Reader) { +// switch messageType { +// case wshandler.Connected: + +// case wshandler.Disconnected: +// } +// // gidtype := msg.Conn.GetTag("gid") +// // if len(gidtype) > 0 { +// // tokens := strings.SplitN(gidtype, "@", 2) +// // gidobj, _ := primitive.ObjectIDFromHex(tokens[0]) +// // gtype := tokens[1] +// // group := sub.groups[gtype] +// // if group != nil { +// // group.PauseMember(gidobj, msg.Alias, msg.Conn) +// // } +// } func (tv *Tavern) prepare(ctx context.Context) error { redisClient, err := gocommon.NewRedisClient(config.RedisURL, 0) @@ -275,11 +276,11 @@ func (tv *Tavern) RegisterHandlers(ctx context.Context, serveMux *http.ServeMux, return nil } -func (sub *subTavern) clientMessageReceived(accid primitive.ObjectID, alias string, messageType wshandler.WebSocketMessageType, body io.Reader) { +func (sub *subTavern) clientMessageReceived(sender *wshandler.Sender, messageType wshandler.WebSocketMessageType, body io.Reader) { if messageType == wshandler.Connected { - sub.cm.add(accid, alias) + sub.cm.add(sender.Accid, sender.Alias) } else if messageType == wshandler.Disconnected { - sub.cm.remove(accid) + sub.cm.remove(sender.Accid) } } diff --git a/go.mod b/go.mod index 5ef6a2f..411156c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 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-20230710053024-a842845685ee + repositories.action2quare.com/ayo/gocommon v0.0.0-20230711005604-a42eb2888e97 ) require ( diff --git a/go.sum b/go.sum index cf031a8..791b929 100644 --- a/go.sum +++ b/go.sum @@ -104,3 +104,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= repositories.action2quare.com/ayo/gocommon v0.0.0-20230710053024-a842845685ee h1:Aau1j/b9wI4nyvrM7m1Q+2xkcW1Qo7i3q+QBD4Umnzg= repositories.action2quare.com/ayo/gocommon v0.0.0-20230710053024-a842845685ee/go.mod h1:ng62uGMGXyQSeuxePG5gJAMtip4Rnspu5Tu7hgvaXns= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230711003621-3bb985d0b617 h1:91mBIGIyxzcnvOaIdegUuV+i9xs8YTSRcmyRaIytzx8= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230711003621-3bb985d0b617/go.mod h1:ng62uGMGXyQSeuxePG5gJAMtip4Rnspu5Tu7hgvaXns= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230711005604-a42eb2888e97 h1:ARzXt3HBmiAUDyACfNm5Kvz1JMTn7+ryE03kB8x/km0= +repositories.action2quare.com/ayo/gocommon v0.0.0-20230711005604-a42eb2888e97/go.mod h1:ng62uGMGXyQSeuxePG5gJAMtip4Rnspu5Tu7hgvaXns=