종료 로그 추가

This commit is contained in:
2023-11-28 22:34:18 +09:00
parent 723bd44079
commit 168acce56e
4 changed files with 129 additions and 123 deletions

View File

@ -68,15 +68,6 @@ func (gd *instantDoc) tid(in accountID) string {
return makeTid(gd.Gid, in)
}
func (gd *instantDoc) mid(tid string) accountID {
tidobj, _ := primitive.ObjectIDFromHex(tid)
var out primitive.ObjectID
for i := range tidobj {
out[12-i-1] = gd.Gid[i] ^ tidobj[12-i-1]
}
return out
}
func (gd *instantDoc) addMember(mid accountID, character any) (bson.M, error) {
tid := gd.tid(mid)
if _, err := gd.rh.JSONSet(gd.strid(), "$._members."+tid, character); err != nil {
@ -109,29 +100,6 @@ func (gd *instantDoc) removeMember(mid accountID) error {
return nil
}
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
}
var temp []map[string]any
err = json.Unmarshal([]byte(res.(string)), &temp)
if err != nil {
return nil, err
}
out := make(map[primitive.ObjectID]any)
for k, v := range temp[0] {
out[gd.mid(k)] = v
}
return out, nil
}
type groupInstant struct {
sendUpstreamMessage func(*wshandler.UpstreamMessage)
enterRoom func(groupID, accountID)
@ -368,85 +336,90 @@ func (gi *groupInstant) Leave(w http.ResponseWriter, r *http.Request) {
}
func (gi *groupInstant) Merge(w http.ResponseWriter, r *http.Request) {
var data struct {
From primitive.ObjectID
Into primitive.ObjectID
Max int64
}
if err := gocommon.MakeDecoder(r).Decode(&data); err != nil {
logger.Println("RemoveFromParty failed. Decode returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
// From에 있는 mid를 Into로 옮김
gdinto, err := gi.find(data.Into)
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,
}
fromMembers, err := gdfrom.getMembers()
if err != nil {
logger.Println("groupInstant.Merge failed. gd.getMembers returns err :", err)
w.WriteHeader(http.StatusInternalServerError)
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)
gi.leaveRoom(gdfrom.Gid, mid)
movedmids = append(movedmids, mid)
if gdinto.Count == data.Max {
break
}
}
if len(movedmids) == int(gdfrom.Count) {
gi.rh.JSONDel(gdfrom.strid(), "$")
} else {
for _, mid := range movedmids {
gdfrom.removeMember(mid)
// gid에는 제거 메시지 보냄
gi.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: "#" + gdfrom.strid(),
Body: bson.M{
gdfrom.tid(mid): bson.M{},
},
Tag: []string{"MemberDocFull"},
})
}
}
gocommon.MakeEncoder(w, r).Encode(struct {
From int64
Into int64
}{From: gdfrom.Count, Into: gdinto.Count})
}{From: -1, Into: 0}) // -1: 알수 없음, 0: 비었음
// var data struct {
// From primitive.ObjectID
// Into primitive.ObjectID
// Max int64
// }
// if err := gocommon.MakeDecoder(r).Decode(&data); err != nil {
// logger.Println("RemoveFromParty failed. Decode returns err :", err)
// w.WriteHeader(http.StatusInternalServerError)
// return
// }
// // From에 있는 mid를 Into로 옮김
// gdinto, err := gi.find(data.Into)
// 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,
// }
// fromMembers, err := gdfrom.getMembers()
// if err != nil {
// logger.Println("groupInstant.Merge failed. gd.getMembers returns err :", err)
// w.WriteHeader(http.StatusInternalServerError)
// 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)
// gi.leaveRoom(gdfrom.Gid, mid)
// movedmids = append(movedmids, mid)
// if gdinto.Count == data.Max {
// break
// }
// }
// if len(movedmids) == int(gdfrom.Count) {
// gi.rh.JSONDel(gdfrom.strid(), "$")
// } else {
// for _, mid := range movedmids {
// gdfrom.removeMember(mid)
// // gid에는 제거 메시지 보냄
// gi.sendUpstreamMessage(&wshandler.UpstreamMessage{
// Target: "#" + gdfrom.strid(),
// Body: bson.M{
// gdfrom.tid(mid): bson.M{},
// },
// Tag: []string{"MemberDocFull"},
// })
// }
// }
// gocommon.MakeEncoder(w, r).Encode(struct {
// From int64
// Into int64
// }{From: gdfrom.Count, Into: gdinto.Count})
}
func (gi *groupInstant) createInstantGroup(firstAcc primitive.ObjectID, firstChar primitive.M, instDoc primitive.M) (*instantDoc, error) {