diff --git a/.gitignore b/.gitignore index 42069af..4df8e63 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __debug_bin.exe *.log config.json +tavern.exe diff --git a/core/group_instant.go b/core/group_instant.go index 40dc77d..2015053 100644 --- a/core/group_instant.go +++ b/core/group_instant.go @@ -111,6 +111,9 @@ func (gd *instantDoc) removeMember(mid accountID) error { func (gd *instantDoc) getMembers() (map[primitive.ObjectID]any, error) { res, err := gd.rh.JSONGet(gd.strid(), "$._members") + if err == redis.Nil { + return nil, nil + } if err != nil { return nil, err } @@ -250,20 +253,20 @@ func (gi *groupInstant) Join(w http.ResponseWriter, r *http.Request) { } if data.Gid.IsZero() || data.Mid.IsZero() { - logger.Error("groupInstant.Join failed. gid or mid is zero") + logger.Println("groupInstant.Join failed. gid or mid is zero") w.WriteHeader(http.StatusBadRequest) return } gd, err := gi.find(data.Gid) if err != nil || gd == nil { - logger.Error("groupInstant.Join failed. gi find return err :", err) + logger.Println("groupInstant.Join failed. gi find return err :", err) w.WriteHeader(http.StatusInternalServerError) return } if err := gi.join(gd, data.Mid, data.Character); err != nil { - logger.Error("groupInstant.Join failed :", err) + logger.Println("groupInstant.Join failed :", err) w.WriteHeader(http.StatusInternalServerError) } else { gocommon.MakeEncoder(w, r).Encode(gd.Count) @@ -377,12 +380,21 @@ func (gi *groupInstant) Merge(w http.ResponseWriter, r *http.Request) { } // From에 있는 mid를 Into로 옮김 gdinto, err := gi.find(data.Into) - if err != nil || gdinto == nil { + if err != nil { logger.Println("groupInstant.Merge failed. gd.getMembers returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } + if gdinto == nil { + // 이미 나갔다. 머지 중단 + gocommon.MakeEncoder(w, r).Encode(struct { + From int64 + Into int64 + }{From: -1, Into: 0}) // -1: 알수 없음, 0: 비었음 + return + } + gdfrom := instantDoc{ Gid: data.From, rh: gi.rh, @@ -394,6 +406,15 @@ func (gi *groupInstant) Merge(w http.ResponseWriter, r *http.Request) { return } + if len(fromMembers) == 0 { + // gdfrom이 비었다. 머지 중단 + gocommon.MakeEncoder(w, r).Encode(struct { + From int64 + Into int64 + }{From: 0, Into: -1}) + return + } + var movedmids []primitive.ObjectID for mid, doc := range fromMembers { gi.join(gdinto, mid, doc) diff --git a/core/group_party.go b/core/group_party.go index efbea50..99d0120 100644 --- a/core/group_party.go +++ b/core/group_party.go @@ -314,8 +314,8 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { // 이미 멤버여야 재입장 가능 path := "$._members." + gd.tid(mid) + "._body" if _, err := gd.rh.JSONSet(gd.strid(), path, character, gocommon.RedisonSetOptionXX); err != nil { - // 멤버가 아니네? - logger.Error("JoinParty failed :", err) + // 멤버가 아니네? 그새 파티장이 쫓아냈나보다 + logger.Println("JoinParty failed. maybe kicked by party owner :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -324,7 +324,7 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) { gp.rh.JSONSet(mid.Hex(), "$.party", bson.M{"id": gid.Hex()}) memdoc, err := gd.addMember(mid, character) if err != nil { - logger.Error("JoinParty failed :", err) + logger.Println("JoinParty failed :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -363,7 +363,7 @@ func (gp *groupParty) ConditionalClearPartyMember(w http.ResponseWriter, r *http pids, err := gp.rh.JSONGetString(doc.Mid, "$.party.id") if err != nil { - logger.Error("ConditionalClearPartyMember failed. gp.rh.JSONGetString returns err :", err) + logger.Println("ConditionalClearPartyMember failed. gp.rh.JSONGetString returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -519,7 +519,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque cnt, err := gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result() if err != nil { - logger.Error("AcceptPartyInvitation failed. gp.rh.Del returns err :", err) + logger.Println("AcceptPartyInvitation failed. gp.rh.Del returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -532,7 +532,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque pids, err := gp.rh.JSONGetString(mid.Hex(), "$.party.id") if err != nil { - logger.Error("AcceptPartyInvitation failed. gp.rh.JSONGetString returns err :", err) + logger.Println("AcceptPartyInvitation failed. gp.rh.JSONGetString returns err :", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -669,7 +669,7 @@ func (gp *groupParty) UpdatePartyDocument(w http.ResponseWriter, r *http.Request frag := data.Doc if err := gp.updatePartyDocument(gid, frag); err != nil { - logger.Error("UpdatePartyDocument failed. group.UpdatePartyDocument returns err :", err) + logger.Println("UpdatePartyDocument failed. group.UpdatePartyDocument returns err :", err) w.WriteHeader(http.StatusBadRequest) return } @@ -690,13 +690,13 @@ func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request) members, err := gd.getMembers() if err != nil { - logger.Error("QueryPartyMembers failed. group.QueryPartyMembers returns err :", err) + logger.Println("QueryPartyMembers failed. group.QueryPartyMembers returns err :", err) w.WriteHeader(http.StatusBadRequest) return } if err := gocommon.MakeEncoder(w, r).Encode(members); err != nil { - logger.Error("QueryPartyMembers failed. writeBsonDoc return err :", err) + logger.Println("QueryPartyMembers failed. writeBsonDoc return err :", err) w.WriteHeader(http.StatusInternalServerError) return }