From 19eacf0d4ce0c037a842fa45bef4a3f0231d431c Mon Sep 17 00:00:00 2001 From: mountain Date: Mon, 11 Sep 2023 12:47:27 +0900 Subject: [PATCH] =?UTF-8?q?gob=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/group_chat.go | 42 ++++----------- core/group_party.go | 121 +++++++++++++++----------------------------- 2 files changed, 52 insertions(+), 111 deletions(-) diff --git a/core/group_chat.go b/core/group_chat.go index b365ebe..8d62568 100644 --- a/core/group_chat.go +++ b/core/group_chat.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/go-redis/redis/v8" + "go.mongodb.org/mongo-driver/bson/primitive" "repositories.action2quare.com/ayo/gocommon" "repositories.action2quare.com/ayo/gocommon/logger" "repositories.action2quare.com/ayo/gocommon/wshandler" @@ -312,16 +313,13 @@ func (gc *groupChat) LeavePrivateChannel(ctx wshandler.ApiCallContext) { // } func (gc *groupChat) FetchChattingChannels(w http.ResponseWriter, r *http.Request) { - var data struct { - Prefix string `bson:"prefix"` - } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { + var prefix string + if err := gocommon.MakeDecoder(r).Decode(&prefix); err != nil { logger.Println("FetchChattingChannels failed. ReadJsonDocumentFromBody returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } - prefix := data.Prefix if len(prefix) == 0 { logger.Println("FetchChattingChannel failed. prefix is missing") w.WriteHeader(http.StatusBadRequest) @@ -346,53 +344,35 @@ func (gc *groupChat) FetchChattingChannels(w http.ResponseWriter, r *http.Reques if err == redis.Nil || onechan == nil { rows = append(rows, cfg.emptyJson) } else { - rows = append(rows, onechan.(string)) + // json array로 나온다 + rows = append(rows, strings.Trim(onechan.(string), "[]")) } } - if len(rows) == 0 { - w.Write([]byte("[]")) - } else if len(rows) == 1 { - w.Write([]byte(rows[0])) - } else { - first := rows[0] - w.Write([]byte(first[:len(first)-1])) - for i := 1; i < len(rows); i++ { - mid := rows[i] - w.Write([]byte(",")) - w.Write([]byte(mid[1 : len(mid)-1])) - } - w.Write([]byte("]")) - } + gocommon.MakeEncoder(w, r).Encode(rows) } func (gc *groupChat) QueryPlayerChattingChannel(w http.ResponseWriter, r *http.Request) { - var data struct { - Accid string `bson:"accid"` - Typename string `bson:"typename"` - } - err := gocommon.ReadJsonDocumentFromBody(r.Body, &data) - if err != nil { + var accid primitive.ObjectID + if err := gocommon.MakeDecoder(r).Decode(&accid); err != nil { logger.Println("QueryPlayerChattingChannel failed. ReadJsonDocumentFromBody returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } - accid := data.Accid - sub, err := gc.rh.JSONGetDocuments(accid, "$.channel") + sub, err := gc.rh.JSONGetDocuments(accid.Hex(), "$.channel") if err != nil { w.WriteHeader(http.StatusInternalServerError) return } if len(sub) > 0 { - enc := json.NewEncoder(w) - enc.Encode(sub[0]) + gocommon.MakeEncoder(w, r).Encode(sub[0]) } } func (gc *groupChat) SendMessageOnChannel(w http.ResponseWriter, r *http.Request) { var msg wshandler.UpstreamMessage - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &msg); err != nil { + if err := gocommon.MakeDecoder(r).Decode(&msg); err != nil { logger.Println("SendMessageOnChannel failed. ReadJsonDocumentFromBody return err :", err) w.WriteHeader(http.StatusBadRequest) return diff --git a/core/group_party.go b/core/group_party.go index f499d53..83fed47 100644 --- a/core/group_party.go +++ b/core/group_party.go @@ -276,13 +276,13 @@ func (gp *groupParty) RegisterApiFunctions() { // - body : 멤버의 속성 bson document func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { var data struct { - Gid primitive.ObjectID `bson:"gid"` - Mid primitive.ObjectID `bson:"mid"` - Character bson.M `bson:"character"` - First bool `bson:"first"` + Gid primitive.ObjectID + Mid primitive.ObjectID + First bool + Character bson.M } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("JoinParty failed. ReadJsonDocumentFromBody returns err :", err) + if err := gocommon.MakeDecoder(r).Decode(&data); err != nil { + logger.Println("JoinParty failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -305,7 +305,7 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { if gd == nil { // 그룹이 없다. 실패 - w.Write([]byte("{}")) + w.WriteHeader(http.StatusBadRequest) return } @@ -329,11 +329,6 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { Body: gd.loadFull(), Tag: []string{"GroupDocFull"}, }) - enc := json.NewEncoder(w) - enc.Encode(map[string]string{ - "gid": gid.Hex(), - "tid": gd.tid(mid), - }) } else if err != nil { logger.Error("JoinParty failed :", err) w.WriteHeader(http.StatusInternalServerError) @@ -368,20 +363,20 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { // - (body) : 검색시 노출되는 document func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) { var doc struct { - Gid primitive.ObjectID `bson:"gid"` - Mid primitive.ObjectID `bson:"mid"` - Targetid primitive.ObjectID `bson:"targetid"` - Inviter bson.M `bson:"inviter"` - Invitee bson.M `bson:"invitee"` + Gid primitive.ObjectID + Mid primitive.ObjectID + Target primitive.ObjectID + Inviter bson.M + Invitee bson.M } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &doc); err != nil { - logger.Println("InviteToParty failed. ReadJsonDocumentFromBody returns err :", err) + if err := gocommon.MakeDecoder(r).Decode(&doc); err != nil { + logger.Println("InviteToParty failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } - targetid := doc.Targetid + targetid := doc.Target gid := doc.Gid mid := doc.Mid @@ -412,6 +407,7 @@ func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) { } if gd == nil { + gid = primitive.NewObjectID() gd, err = gp.createGroup(gid, mid, doc.Inviter) if err != nil { logger.Println("InviteToParty failed. gp.createGroup() return err :", err) @@ -447,19 +443,17 @@ func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) { }, Tag: []string{"Invitation"}, }) - - w.Write([]byte(gd.strid())) } func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Request) { var doc struct { - Gid primitive.ObjectID `bson:"gid"` - Mid primitive.ObjectID `bson:"mid"` - Tid string `bson:"tid"` - Character bson.M `bson:"character"` + Gid primitive.ObjectID + Mid primitive.ObjectID + Tid string + Character bson.M } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &doc); err != nil { - logger.Println("AcceptPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err) + if err := gocommon.MakeDecoder(r).Decode(&doc); err != nil { + logger.Println("AcceptPartyInvitation failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -477,7 +471,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque if cnt == 0 { // 만료됨 - w.Write([]byte("expired")) + w.WriteHeader(http.StatusGatewayTimeout) return } @@ -543,26 +537,22 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque } func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Request) { - var data struct { - Mid primitive.ObjectID `bson:"mid"` - } - - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("DenyPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err) + var mid primitive.ObjectID + if err := gocommon.MakeDecoder(r).Decode(&mid); err != nil { + logger.Println("DenyPartyInvitation failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } - mid := data.Mid - states, err := gp.rh.JSONGetString(mid.Hex(), "$.party.state") - if err == redis.Nil { + if cnt, _ := gp.rh.Exists(gp.rh.Context(), mid.Hex()).Result(); cnt == 0 { return } + states, _ := gp.rh.JSONGetString(mid.Hex(), "$.party.state") if len(states) > 0 && len(states[0]) > 0 { - w.Write([]byte(states[0])) + gocommon.MakeEncoder(w, r).Encode(states[0]) } else { - w.Write([]byte("connected")) + gocommon.MakeEncoder(w, r).Encode("connected") } } @@ -610,12 +600,12 @@ func (gp *groupParty) updatePartyDocument(gid groupID, frag bson.M) error { func (gp *groupParty) UpdatePartyDocument(w http.ResponseWriter, r *http.Request) { var data struct { - Gid primitive.ObjectID `bson:"gid"` - Doc bson.M `bson:"doc"` + Gid primitive.ObjectID + Doc bson.M } - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("UpdatePartyDocument failed. ReadJsonDocumentFromBody returns err :", err) + if err := gocommon.MakeDecoder(r).Decode(&data); err != nil { + logger.Println("UpdatePartyDocument failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -631,17 +621,13 @@ func (gp *groupParty) UpdatePartyDocument(w http.ResponseWriter, r *http.Request } func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request) { - var data struct { - Gid primitive.ObjectID `bson:"gid"` - } - - if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil { - logger.Println("QueryPartyMembers failed. ReadJsonDocumentFromBody returns err :", err) + var gid primitive.ObjectID + if err := gocommon.MakeDecoder(r).Decode(&gid); err != nil { + logger.Println("QueryPartyMembers failed. DecodeGob returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } - gid := data.Gid gd := groupDoc{ id: gid, rh: gp.rh, @@ -654,8 +640,7 @@ func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request) return } - enc := json.NewEncoder(w) - if err := enc.Encode(members); err != nil { + if err := gocommon.MakeEncoder(w, r).Encode(members); err != nil { logger.Error("QueryPartyMembers failed. writeBsonDoc return err :", err) w.WriteHeader(http.StatusInternalServerError) return @@ -705,27 +690,6 @@ func (gp *groupParty) find(id groupID) (*groupDoc, error) { }, nil } -func (gp *groupParty) memberDisconnected(room string, mid primitive.ObjectID) { - gid, err := primitive.ObjectIDFromHex(room) - if err != nil { - return - } - gd := &groupDoc{ - id: gid, - rh: gp.rh, - } - - gd.removeMember(mid) - // 퇴장을 알림 - gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ - Target: "#" + room, - Body: bson.M{ - gd.tid(mid): bson.M{}, - }, - Tag: []string{"MemberDocFull"}, - }) -} - func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) { gids, _ := gp.rh.JSONGetString(ctx.CallBy.Accid.Hex(), "$.party.id") @@ -734,11 +698,8 @@ func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) { gidstr := gids[0] gid, _ := primitive.ObjectIDFromHex(gidstr) - gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ - Target: ctx.CallBy.Accid.Hex(), - Body: bson.M{"gid": gid}, - Tag: []string{"GroupDocFull", gidstr}, - }) + // 나를 먼저 룸에서 빼야 나한테 메시지가 안감 + gp.leaveRoom(gid, ctx.CallBy.Accid) // gid에는 제거 메시지 보냄 gp.sendUpstreamMessage(&wshandler.UpstreamMessage{ @@ -749,7 +710,7 @@ func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) { Tag: []string{"MemberDocFull"}, }) - gp.leaveRoom(gid, ctx.CallBy.Accid) + } }