종료 로그 추가
This commit is contained in:
@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user