인스턴트 그룹 추가(랜덤매칭용)

This commit is contained in:
2023-10-06 11:13:03 +09:00
parent 2cec9b90fe
commit d7d7df4a28
4 changed files with 431 additions and 29 deletions

View File

@ -9,6 +9,7 @@ import (
"time"
"github.com/go-redis/redis/v8"
"github.com/gorilla/websocket"
"repositories.action2quare.com/ayo/gocommon"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/gocommon/wshandler"
@ -54,7 +55,7 @@ type memberDoc struct {
type InvitationFail bson.M
type groupDoc struct {
type partyDoc struct {
Members map[string]any `json:"_members"`
InCharge string `json:"_incharge"`
Gid string `json:"_gid"`
@ -63,7 +64,7 @@ type groupDoc struct {
id groupID
}
func (gd *groupDoc) loadMemberFull(tid string) (bson.M, error) {
func (gd *partyDoc) loadMemberFull(tid string) (bson.M, error) {
full, err := gd.rh.JSONGet(gd.strid(), "$._members."+tid)
if err != nil {
return nil, err
@ -80,7 +81,7 @@ func (gd *groupDoc) loadMemberFull(tid string) (bson.M, error) {
return doc, nil
}
func (gd *groupDoc) loadFull() (doc bson.M) {
func (gd *partyDoc) loadFull() (doc bson.M) {
// 새 멤버에 그룹 전체를 알림
full, err := gd.rh.JSONGet(gd.strid(), "$")
if err == nil {
@ -96,18 +97,18 @@ func (gd *groupDoc) loadFull() (doc bson.M) {
return
}
func (gd *groupDoc) strid() string {
func (gd *partyDoc) strid() string {
if len(gd.Gid) == 0 {
gd.Gid = gd.id.Hex()
}
return gd.Gid
}
func (gd *groupDoc) tid(in accountID) string {
func (gd *partyDoc) tid(in accountID) string {
return makeTid(gd.id, in)
}
func (gd *groupDoc) mid(tid string) accountID {
func (gd *partyDoc) mid(tid string) accountID {
tidobj, _ := primitive.ObjectIDFromHex(tid)
var out primitive.ObjectID
for i := range tidobj {
@ -116,7 +117,7 @@ func (gd *groupDoc) mid(tid string) accountID {
return out
}
func (gd *groupDoc) addInvite(mid accountID, body bson.M, ttl time.Duration, max int) (*memberDoc, error) {
func (gd *partyDoc) addInvite(mid accountID, body bson.M, ttl time.Duration, max int) (*memberDoc, error) {
targetmid := mid
targetbody := body
@ -170,7 +171,7 @@ func (gd *groupDoc) addInvite(mid accountID, body bson.M, ttl time.Duration, max
return newdoc, err
}
func (gd *groupDoc) addMember(mid accountID, character bson.M) (bson.M, error) {
func (gd *partyDoc) addMember(mid accountID, character bson.M) (bson.M, error) {
tid := gd.tid(mid)
prefix := "$._members." + tid
@ -186,7 +187,7 @@ func (gd *groupDoc) addMember(mid accountID, character bson.M) (bson.M, error) {
return gd.loadMemberFull(tid)
}
func (gd *groupDoc) removeMemberByTid(tid string) error {
func (gd *partyDoc) removeMemberByTid(tid string) error {
_, err := gd.rh.JSONDel(gd.strid(), "$._members."+tid)
if err != nil {
return err
@ -204,11 +205,11 @@ func (gd *groupDoc) removeMemberByTid(tid string) error {
return err
}
func (gd *groupDoc) removeMember(mid accountID) error {
func (gd *partyDoc) removeMember(mid accountID) error {
return gd.removeMemberByTid(gd.tid(mid))
}
func (gd *groupDoc) getMembers() (map[string]any, error) {
func (gd *partyDoc) getMembers() (map[string]any, error) {
res, err := gd.rh.JSONGet(gd.strid(), "$._members")
if err != nil {
return nil, err
@ -486,7 +487,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque
// 기존에 이미 파티에 들어가 있다.
// 기존 파티에서는 탈퇴
oldgid, _ := primitive.ObjectIDFromHex(pids[0])
oldgd := &groupDoc{
oldgd := &partyDoc{
id: oldgid,
rh: gp.rh,
}
@ -503,7 +504,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque
gp.leaveRoom(oldgid, mid)
}
gd := &groupDoc{
gd := &partyDoc{
id: gid,
rh: gp.rh,
}
@ -557,7 +558,7 @@ func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Reque
}
func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson.M) error {
gd := &groupDoc{
gd := &partyDoc{
id: gid,
rh: gp.rh,
}
@ -582,7 +583,7 @@ func (gp *groupParty) updateMemberDocument(gid groupID, mid accountID, doc bson.
}
func (gp *groupParty) updatePartyDocument(gid groupID, frag bson.M) error {
gd := groupDoc{
gd := partyDoc{
id: gid,
rh: gp.rh,
}
@ -628,7 +629,7 @@ func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request)
return
}
gd := groupDoc{
gd := partyDoc{
id: gid,
rh: gp.rh,
}
@ -647,10 +648,10 @@ func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request)
}
}
func (gp *groupParty) createGroup(newid groupID, charge accountID, chargeDoc bson.M) (*groupDoc, error) {
func (gp *groupParty) createGroup(newid groupID, charge accountID, chargeDoc bson.M) (*partyDoc, error) {
tid := makeTid(newid, charge)
gd := &groupDoc{
gd := &partyDoc{
Members: map[string]any{
tid: &memberDoc{
Body: chargeDoc,
@ -671,7 +672,7 @@ func (gp *groupParty) createGroup(newid groupID, charge accountID, chargeDoc bso
return gd, nil
}
func (gp *groupParty) find(id groupID) (*groupDoc, error) {
func (gp *groupParty) find(id groupID) (*partyDoc, error) {
if id.IsZero() {
return nil, nil
}
@ -684,14 +685,13 @@ func (gp *groupParty) find(id groupID) (*groupDoc, error) {
return nil, err
}
return &groupDoc{
return &partyDoc{
rh: gp.rh,
id: id,
}, nil
}
func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) {
gids, _ := gp.rh.JSONGetString(ctx.CallBy.Accid.Hex(), "$.party.id")
func (gp *groupParty) ClientDisconnected(conn *websocket.Conn, callby *wshandler.Sender) {
gids, _ := gp.rh.JSONGetString(callby.Accid.Hex(), "$.party.id")
if len(gids) > 0 && len(gids[0]) > 0 {
// mid한테는 빈 GroupDocFull을 보낸다. 그러면 지워짐
@ -699,18 +699,17 @@ func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) {
gid, _ := primitive.ObjectIDFromHex(gidstr)
// 나를 먼저 룸에서 빼야 나한테 메시지가 안감
gp.leaveRoom(gid, ctx.CallBy.Accid)
gp.leaveRoom(gid, callby.Accid)
// gid에는 제거 메시지 보냄
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
Target: "#" + gidstr,
Body: bson.M{
makeTid(gid, ctx.CallBy.Accid): bson.M{},
makeTid(gid, callby.Accid): bson.M{},
},
Tag: []string{"MemberDocFull"},
})
}
}
@ -740,7 +739,7 @@ func (gp *groupParty) LeaveParty(ctx wshandler.ApiCallContext) {
mid := ctx.CallBy.Accid
tid := ctx.Arguments[0].(string)
gd := groupDoc{
gd := partyDoc{
id: gid,
rh: gp.rh,
}
@ -797,7 +796,7 @@ func (gp *groupParty) DenyPartyInvitation(ctx wshandler.ApiCallContext) {
mid := ctx.CallBy.Accid
gp.rh.Del(context.Background(), "inv."+mid.Hex()).Result()
gd := groupDoc{
gd := partyDoc{
id: gid,
rh: gp.rh,
}