파티 재참여 로직 수정
This commit is contained in:
@ -9,7 +9,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-redis/redis/v8"
|
"github.com/go-redis/redis/v8"
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
"repositories.action2quare.com/ayo/gocommon"
|
"repositories.action2quare.com/ayo/gocommon"
|
||||||
"repositories.action2quare.com/ayo/gocommon/logger"
|
"repositories.action2quare.com/ayo/gocommon/logger"
|
||||||
"repositories.action2quare.com/ayo/gocommon/wshandler"
|
"repositories.action2quare.com/ayo/gocommon/wshandler"
|
||||||
@ -311,48 +310,89 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 내 정보 업데이트할 때에도 사용됨
|
// 내 정보 업데이트할 때에도 사용됨
|
||||||
if data.First {
|
if !data.First {
|
||||||
if memdoc, err := gd.addMember(mid, character); err == nil {
|
// 이미 멤버여야 재입장 가능
|
||||||
// 기존 유저에게 새 유저 알림
|
|
||||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
|
||||||
Target: "#" + gid.Hex(),
|
|
||||||
Body: map[string]any{
|
|
||||||
gd.tid(mid): memdoc,
|
|
||||||
},
|
|
||||||
Tag: []string{"MemberDocFull"},
|
|
||||||
})
|
|
||||||
|
|
||||||
gp.enterRoom(gid, mid)
|
|
||||||
|
|
||||||
// 최초 입장이라면 새 멤버에 그룹 전체를 알림
|
|
||||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
|
||||||
Target: mid.Hex(),
|
|
||||||
Body: gd.loadFull(),
|
|
||||||
Tag: []string{"GroupDocFull"},
|
|
||||||
})
|
|
||||||
} else if err != nil {
|
|
||||||
logger.Error("JoinParty failed :", err)
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
path := "$._members." + gd.tid(mid) + "._body"
|
path := "$._members." + gd.tid(mid) + "._body"
|
||||||
if _, err := gd.rh.JSONSet(gd.strid(), path, character, gocommon.RedisonSetOptionXX); err != nil {
|
if _, err := gd.rh.JSONSet(gd.strid(), path, character, gocommon.RedisonSetOptionXX); err != nil {
|
||||||
|
// 멤버가 아니네?
|
||||||
logger.Error("JoinParty failed :", err)
|
logger.Error("JoinParty failed :", err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기존 유저에게 새 유저 알림
|
||||||
|
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||||
|
Target: "#" + gid.Hex(),
|
||||||
|
Body: map[string]any{
|
||||||
|
gd.tid(mid): memdoc,
|
||||||
|
},
|
||||||
|
Tag: []string{"MemberDocFull"},
|
||||||
|
})
|
||||||
|
|
||||||
|
gp.enterRoom(gid, mid)
|
||||||
|
|
||||||
|
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||||
|
Target: mid.Hex(),
|
||||||
|
Body: gd.loadFull(),
|
||||||
|
Tag: []string{"GroupDocFull"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gp *groupParty) ConditionalClearPartyMember(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var doc struct {
|
||||||
|
Gid string
|
||||||
|
Mid string
|
||||||
|
}
|
||||||
|
|
||||||
|
// accid가 접속해 있지 않으면 파티에서 나간 걸로 간주하고
|
||||||
|
// accid가 접속해 있으면 아무것도 하지 않는다.
|
||||||
|
if err := gocommon.MakeDecoder(r).Decode(&doc); err != nil {
|
||||||
|
logger.Println("ConditionalClearPartyMember failed. DecodeGob returns err :", err)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pids, err := gp.rh.JSONGetString(doc.Mid, "$.party.id")
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("ConditionalClearPartyMember failed. gp.rh.JSONGetString returns err :", err)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
removeMember := func() {
|
||||||
|
gid, _ := primitive.ObjectIDFromHex(doc.Gid)
|
||||||
|
mid, _ := primitive.ObjectIDFromHex(doc.Mid)
|
||||||
|
gd := partyDoc{
|
||||||
|
id: gid,
|
||||||
|
rh: gp.rh,
|
||||||
|
}
|
||||||
|
gd.removeMember(mid)
|
||||||
|
|
||||||
// 기존 유저에게 캐릭터 알림
|
|
||||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||||
Target: "#" + gid.Hex(),
|
Target: "#" + doc.Gid,
|
||||||
Body: map[string]any{
|
Body: bson.M{
|
||||||
gd.tid(mid): bson.M{
|
gd.tid(mid): bson.M{},
|
||||||
"_body": character,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Tag: []string{"MemberDocFragment"},
|
Tag: []string{"MemberDocFull"},
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pids) == 0 {
|
||||||
|
// 없다.
|
||||||
|
// doc.Gid에서 제거
|
||||||
|
removeMember()
|
||||||
|
} else if pids[0] != doc.Gid {
|
||||||
|
// 다른 파티? 기존 파티에서 제거
|
||||||
|
removeMember()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,7 +756,8 @@ func (gp *groupParty) find(id groupID) (*partyDoc, error) {
|
|||||||
id: id,
|
id: id,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
func (gp *groupParty) ClientDisconnected(conn *websocket.Conn, callby *wshandler.Sender) {
|
|
||||||
|
func (gp *groupParty) ClientDisconnected(msg string, callby *wshandler.Sender) {
|
||||||
gids, _ := gp.rh.JSONGetString(callby.Accid.Hex(), "$.party.id")
|
gids, _ := gp.rh.JSONGetString(callby.Accid.Hex(), "$.party.id")
|
||||||
|
|
||||||
if len(gids) > 0 && len(gids[0]) > 0 {
|
if len(gids) > 0 && len(gids[0]) > 0 {
|
||||||
@ -727,15 +768,16 @@ func (gp *groupParty) ClientDisconnected(conn *websocket.Conn, callby *wshandler
|
|||||||
// 나를 먼저 룸에서 빼야 나한테 메시지가 안감
|
// 나를 먼저 룸에서 빼야 나한테 메시지가 안감
|
||||||
gp.leaveRoom(gid, callby.Accid)
|
gp.leaveRoom(gid, callby.Accid)
|
||||||
|
|
||||||
// gid에는 제거 메시지 보냄
|
if msg != "pending" {
|
||||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
// gid에는 제거 메시지 보냄
|
||||||
Target: "#" + gidstr,
|
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||||
Body: bson.M{
|
Target: "#" + gidstr,
|
||||||
makeTid(gid, callby.Accid): bson.M{},
|
Body: bson.M{
|
||||||
},
|
makeTid(gid, callby.Accid): bson.M{},
|
||||||
Tag: []string{"MemberDocFull"},
|
},
|
||||||
})
|
Tag: []string{"MemberDocFull"},
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user