From a9b0cf24938f99026659b31fd5a29b6f1a233bdb Mon Sep 17 00:00:00 2001 From: mountain Date: Fri, 8 Sep 2023 16:09:12 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=8C=ED=8B=B0=20=EC=B4=88=EB=8C=80=20accep?= =?UTF-8?q?t=EC=99=80=20deny=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/group_party.go | 195 +++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 121 deletions(-) diff --git a/core/group_party.go b/core/group_party.go index d6839f9..16191a0 100644 --- a/core/group_party.go +++ b/core/group_party.go @@ -541,29 +541,6 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque } } -func (gp *groupParty) DenyPartyInvitation(w http.ResponseWriter, r *http.Request) { - var data struct { - Gid primitive.ObjectID `bson:"gid"` - Mid primitive.ObjectID `bson:"mid"` - } - - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("DenyPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err) - w.WriteHeader(http.StatusInternalServerError) - return - } - - gid := data.Gid - mid := data.Mid - - gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result() - gd := groupDoc{ - id: gid, - rh: gp.rh, - } - gd.removeMember(mid) -} - func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Request) { var data struct { Mid primitive.ObjectID `bson:"mid"` @@ -588,82 +565,6 @@ func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Reque } } -// LeaveParty : 그룹에서 나감 or 내보냄 -// - type : 그룹 타입 -// - 그룹 타입에 맞는 키(주로 _id) -// - member_id : 나갈 멤버의 아이디 -func (gp *groupParty) LeaveParty(w http.ResponseWriter, r *http.Request) { - var data struct { - Gid primitive.ObjectID `bson:"gid"` - Mid primitive.ObjectID `bson:"mid"` - Tid string `bson:"tid"` - } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("LeaveParty failed. ReadJsonDocumentFromBody returns err :", err) - w.WriteHeader(http.StatusInternalServerError) - return - } - - gid := data.Gid - mid := data.Mid - tid := data.Tid - - gd := groupDoc{ - id: gid, - rh: gp.rh, - } - - var err error - if len(tid) > 0 { - if tid != gd.tid(mid) { - // mid가 incharge여야 한다. 그래야 tid를 쫓아낼 수 있음 - incharge, err := gp.rh.JSONGet(gd.strid(), "$._incharge") - if err != nil { - logger.Println("LeaveParty failed. gp.rh.JSONGet returns err :", err) - w.WriteHeader(http.StatusInternalServerError) - return - } - if !strings.Contains(incharge.(string), gd.tid(mid)) { - // incharge가 아니네? - logger.Println("LeaveParty failed. mid is not incharge") - w.WriteHeader(http.StatusBadRequest) - return - } - mid = midFromTid(gd.id, tid) - } - - err = gd.removeMemberByTid(tid) - } else { - err = gd.removeMember(mid) - // 내가 나갔다 - gp.rh.JSONDel(mid.Hex(), "$.party.id") - } - - if err != nil { - logger.Println("LeaveParty failed. gd.removeMember returns err :", err) - w.WriteHeader(http.StatusInternalServerError) - return - } - - // mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐 - gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ - Target: mid.Hex(), - Body: bson.M{"gid": gid}, - Tag: []string{"GroupDocFull", gid.Hex()}, - }) - - // gid에는 제거 메시지 보냄 - gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ - Target: "#" + gd.strid(), - Body: bson.M{ - tid: bson.M{}, - }, - Tag: []string{"MemberDocFull"}, - }) - - gp.leaveRoom(gid, mid) -} - func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson.M) error { gd := &groupDoc{ id: gid, @@ -865,26 +766,78 @@ func (gp *groupParty) UpdatePartyDocumentDirect(ctx wshandler.ApiCallContext) { gp.updatePartyDocument(gidobj, doc) } -// func (gp *groupParty) ClientMessageReceived(sender *wshandler.Sender, mt wshandler.WebSocketMessageType, message any) { -// if mt == wshandler.Disconnected { -// rooms := message.([]string) -// for _, roomname := range rooms { -// gp.memberDisconnected(roomname, sender.Accid) -// } -// } else if mt == wshandler.BinaryMessage { -// commandline := message.([]any) -// cmd := commandline[0].(string) -// args := commandline[1:] -// switch cmd { -// case "UpdatePartyMemberDocument": -// gidobj, _ := primitive.ObjectIDFromHex(args[0].(string)) -// doc := args[1].(map[string]any) -// gp.updateMemberDocument(gidobj, sender.Accid, doc) +func (gp *groupParty) LeaveParty(ctx wshandler.ApiCallContext) { + gids, _ := gp.rh.JSONGetString(ctx.CallBy.Accid.Hex(), "$.party.id") -// case "UpdatePartyDocument": -// gidobj, _ := primitive.ObjectIDFromHex(args[0].(string)) -// doc := args[1].(map[string]any) -// gp.updatePartyDocument(gidobj, doc) -// } -// } -// } + if len(gids) == 0 || len(gids[0]) == 0 { + return + } + // mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐 + gidstr := gids[0] + gid, _ := primitive.ObjectIDFromHex(gidstr) + mid := ctx.CallBy.Accid + tid := ctx.Arguments[0].(string) + + gd := groupDoc{ + id: gid, + rh: gp.rh, + } + + var err error + if len(tid) > 0 { + if tid != gd.tid(mid) { + // mid가 incharge여야 한다. 그래야 tid를 쫓아낼 수 있음 + incharge, err := gp.rh.JSONGet(gd.strid(), "$._incharge") + if err != nil { + logger.Println("LeaveParty failed. gp.rh.JSONGet returns err :", err) + return + } + if !strings.Contains(incharge.(string), gd.tid(mid)) { + // incharge가 아니네? + logger.Println("LeaveParty failed. mid is not incharge") + return + } + mid = midFromTid(gd.id, tid) + } + err = gd.removeMemberByTid(tid) + } else { + err = gd.removeMember(mid) + // 내가 나갔다 + gp.rh.JSONDel(mid.Hex(), "$.party.id") + } + + if err != nil { + logger.Println("LeaveParty failed. gd.removeMember returns err :", err) + return + } + + // mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐 + gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ + Target: mid.Hex(), + Body: bson.M{"gid": gid}, + Tag: []string{"GroupDocFull", gid.Hex()}, + }) + + // gid에는 제거 메시지 보냄 + gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ + Target: "#" + gd.strid(), + Body: bson.M{ + tid: bson.M{}, + }, + Tag: []string{"MemberDocFull"}, + }) + + gp.leaveRoom(gid, mid) +} + +func (gp *groupParty) DenyPartyInvitation(ctx wshandler.ApiCallContext) { + gid, _ := primitive.ObjectIDFromHex(ctx.Arguments[0].(string)) + mid := ctx.CallBy.Accid + + gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result() + gd := groupDoc{ + id: gid, + rh: gp.rh, + } + gd.removeMember(mid) +}