gob로 변경
This commit is contained in:
@ -7,6 +7,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"repositories.action2quare.com/ayo/gocommon"
|
||||
"repositories.action2quare.com/ayo/gocommon/logger"
|
||||
"repositories.action2quare.com/ayo/gocommon/wshandler"
|
||||
@ -312,16 +313,13 @@ func (gc *groupChat) LeavePrivateChannel(ctx wshandler.ApiCallContext) {
|
||||
// }
|
||||
|
||||
func (gc *groupChat) FetchChattingChannels(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Prefix string `bson:"prefix"`
|
||||
}
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
|
||||
var prefix string
|
||||
if err := gocommon.MakeDecoder(r).Decode(&prefix); err != nil {
|
||||
logger.Println("FetchChattingChannels failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
prefix := data.Prefix
|
||||
if len(prefix) == 0 {
|
||||
logger.Println("FetchChattingChannel failed. prefix is missing")
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
@ -346,53 +344,35 @@ func (gc *groupChat) FetchChattingChannels(w http.ResponseWriter, r *http.Reques
|
||||
if err == redis.Nil || onechan == nil {
|
||||
rows = append(rows, cfg.emptyJson)
|
||||
} else {
|
||||
rows = append(rows, onechan.(string))
|
||||
// json array로 나온다
|
||||
rows = append(rows, strings.Trim(onechan.(string), "[]"))
|
||||
}
|
||||
}
|
||||
|
||||
if len(rows) == 0 {
|
||||
w.Write([]byte("[]"))
|
||||
} else if len(rows) == 1 {
|
||||
w.Write([]byte(rows[0]))
|
||||
} else {
|
||||
first := rows[0]
|
||||
w.Write([]byte(first[:len(first)-1]))
|
||||
for i := 1; i < len(rows); i++ {
|
||||
mid := rows[i]
|
||||
w.Write([]byte(","))
|
||||
w.Write([]byte(mid[1 : len(mid)-1]))
|
||||
}
|
||||
w.Write([]byte("]"))
|
||||
}
|
||||
gocommon.MakeEncoder(w, r).Encode(rows)
|
||||
}
|
||||
|
||||
func (gc *groupChat) QueryPlayerChattingChannel(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Accid string `bson:"accid"`
|
||||
Typename string `bson:"typename"`
|
||||
}
|
||||
err := gocommon.ReadJsonDocumentFromBody(r.Body, &data)
|
||||
if err != nil {
|
||||
var accid primitive.ObjectID
|
||||
if err := gocommon.MakeDecoder(r).Decode(&accid); err != nil {
|
||||
logger.Println("QueryPlayerChattingChannel failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
accid := data.Accid
|
||||
sub, err := gc.rh.JSONGetDocuments(accid, "$.channel")
|
||||
sub, err := gc.rh.JSONGetDocuments(accid.Hex(), "$.channel")
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
if len(sub) > 0 {
|
||||
enc := json.NewEncoder(w)
|
||||
enc.Encode(sub[0])
|
||||
gocommon.MakeEncoder(w, r).Encode(sub[0])
|
||||
}
|
||||
}
|
||||
|
||||
func (gc *groupChat) SendMessageOnChannel(w http.ResponseWriter, r *http.Request) {
|
||||
var msg wshandler.UpstreamMessage
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &msg); err != nil {
|
||||
if err := gocommon.MakeDecoder(r).Decode(&msg); err != nil {
|
||||
logger.Println("SendMessageOnChannel failed. ReadJsonDocumentFromBody return err :", err)
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
|
||||
@ -276,13 +276,13 @@ func (gp *groupParty) RegisterApiFunctions() {
|
||||
// - body : 멤버의 속성 bson document
|
||||
func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Gid primitive.ObjectID `bson:"gid"`
|
||||
Mid primitive.ObjectID `bson:"mid"`
|
||||
Character bson.M `bson:"character"`
|
||||
First bool `bson:"first"`
|
||||
Gid primitive.ObjectID
|
||||
Mid primitive.ObjectID
|
||||
First bool
|
||||
Character bson.M
|
||||
}
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
|
||||
logger.Println("JoinParty failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
if err := gocommon.MakeDecoder(r).Decode(&data); err != nil {
|
||||
logger.Println("JoinParty failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
@ -305,7 +305,7 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
if gd == nil {
|
||||
// 그룹이 없다. 실패
|
||||
w.Write([]byte("{}"))
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
@ -329,11 +329,6 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) {
|
||||
Body: gd.loadFull(),
|
||||
Tag: []string{"GroupDocFull"},
|
||||
})
|
||||
enc := json.NewEncoder(w)
|
||||
enc.Encode(map[string]string{
|
||||
"gid": gid.Hex(),
|
||||
"tid": gd.tid(mid),
|
||||
})
|
||||
} else if err != nil {
|
||||
logger.Error("JoinParty failed :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@ -368,20 +363,20 @@ func (gp *groupParty) JoinParty(w http.ResponseWriter, r *http.Request) {
|
||||
// - (body) : 검색시 노출되는 document
|
||||
func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) {
|
||||
var doc struct {
|
||||
Gid primitive.ObjectID `bson:"gid"`
|
||||
Mid primitive.ObjectID `bson:"mid"`
|
||||
Targetid primitive.ObjectID `bson:"targetid"`
|
||||
Inviter bson.M `bson:"inviter"`
|
||||
Invitee bson.M `bson:"invitee"`
|
||||
Gid primitive.ObjectID
|
||||
Mid primitive.ObjectID
|
||||
Target primitive.ObjectID
|
||||
Inviter bson.M
|
||||
Invitee bson.M
|
||||
}
|
||||
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &doc); err != nil {
|
||||
logger.Println("InviteToParty failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
if err := gocommon.MakeDecoder(r).Decode(&doc); err != nil {
|
||||
logger.Println("InviteToParty failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
targetid := doc.Targetid
|
||||
targetid := doc.Target
|
||||
gid := doc.Gid
|
||||
mid := doc.Mid
|
||||
|
||||
@ -412,6 +407,7 @@ func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
if gd == nil {
|
||||
gid = primitive.NewObjectID()
|
||||
gd, err = gp.createGroup(gid, mid, doc.Inviter)
|
||||
if err != nil {
|
||||
logger.Println("InviteToParty failed. gp.createGroup() return err :", err)
|
||||
@ -447,19 +443,17 @@ func (gp *groupParty) InviteToParty(w http.ResponseWriter, r *http.Request) {
|
||||
},
|
||||
Tag: []string{"Invitation"},
|
||||
})
|
||||
|
||||
w.Write([]byte(gd.strid()))
|
||||
}
|
||||
|
||||
func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Request) {
|
||||
var doc struct {
|
||||
Gid primitive.ObjectID `bson:"gid"`
|
||||
Mid primitive.ObjectID `bson:"mid"`
|
||||
Tid string `bson:"tid"`
|
||||
Character bson.M `bson:"character"`
|
||||
Gid primitive.ObjectID
|
||||
Mid primitive.ObjectID
|
||||
Tid string
|
||||
Character bson.M
|
||||
}
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &doc); err != nil {
|
||||
logger.Println("AcceptPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
if err := gocommon.MakeDecoder(r).Decode(&doc); err != nil {
|
||||
logger.Println("AcceptPartyInvitation failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
@ -477,7 +471,7 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque
|
||||
|
||||
if cnt == 0 {
|
||||
// 만료됨
|
||||
w.Write([]byte("expired"))
|
||||
w.WriteHeader(http.StatusGatewayTimeout)
|
||||
return
|
||||
}
|
||||
|
||||
@ -543,26 +537,22 @@ func (gp *groupParty) AcceptPartyInvitation(w http.ResponseWriter, r *http.Reque
|
||||
}
|
||||
|
||||
func (gp *groupParty) QueryPartyMemberState(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Mid primitive.ObjectID `bson:"mid"`
|
||||
}
|
||||
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
|
||||
logger.Println("DenyPartyInvitation failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
var mid primitive.ObjectID
|
||||
if err := gocommon.MakeDecoder(r).Decode(&mid); err != nil {
|
||||
logger.Println("DenyPartyInvitation failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
mid := data.Mid
|
||||
|
||||
states, err := gp.rh.JSONGetString(mid.Hex(), "$.party.state")
|
||||
if err == redis.Nil {
|
||||
if cnt, _ := gp.rh.Exists(gp.rh.Context(), mid.Hex()).Result(); cnt == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
states, _ := gp.rh.JSONGetString(mid.Hex(), "$.party.state")
|
||||
if len(states) > 0 && len(states[0]) > 0 {
|
||||
w.Write([]byte(states[0]))
|
||||
gocommon.MakeEncoder(w, r).Encode(states[0])
|
||||
} else {
|
||||
w.Write([]byte("connected"))
|
||||
gocommon.MakeEncoder(w, r).Encode("connected")
|
||||
}
|
||||
}
|
||||
|
||||
@ -610,12 +600,12 @@ func (gp *groupParty) updatePartyDocument(gid groupID, frag bson.M) error {
|
||||
|
||||
func (gp *groupParty) UpdatePartyDocument(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Gid primitive.ObjectID `bson:"gid"`
|
||||
Doc bson.M `bson:"doc"`
|
||||
Gid primitive.ObjectID
|
||||
Doc bson.M
|
||||
}
|
||||
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
|
||||
logger.Println("UpdatePartyDocument failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
if err := gocommon.MakeDecoder(r).Decode(&data); err != nil {
|
||||
logger.Println("UpdatePartyDocument failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
@ -631,17 +621,13 @@ func (gp *groupParty) UpdatePartyDocument(w http.ResponseWriter, r *http.Request
|
||||
}
|
||||
|
||||
func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request) {
|
||||
var data struct {
|
||||
Gid primitive.ObjectID `bson:"gid"`
|
||||
}
|
||||
|
||||
if err := gocommon.ReadJsonDocumentFromBody(r.Body, &data); err != nil {
|
||||
logger.Println("QueryPartyMembers failed. ReadJsonDocumentFromBody returns err :", err)
|
||||
var gid primitive.ObjectID
|
||||
if err := gocommon.MakeDecoder(r).Decode(&gid); err != nil {
|
||||
logger.Println("QueryPartyMembers failed. DecodeGob returns err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
gid := data.Gid
|
||||
gd := groupDoc{
|
||||
id: gid,
|
||||
rh: gp.rh,
|
||||
@ -654,8 +640,7 @@ func (gp *groupParty) QueryPartyMembers(w http.ResponseWriter, r *http.Request)
|
||||
return
|
||||
}
|
||||
|
||||
enc := json.NewEncoder(w)
|
||||
if err := enc.Encode(members); err != nil {
|
||||
if err := gocommon.MakeEncoder(w, r).Encode(members); err != nil {
|
||||
logger.Error("QueryPartyMembers failed. writeBsonDoc return err :", err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
@ -705,27 +690,6 @@ func (gp *groupParty) find(id groupID) (*groupDoc, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (gp *groupParty) memberDisconnected(room string, mid primitive.ObjectID) {
|
||||
gid, err := primitive.ObjectIDFromHex(room)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
gd := &groupDoc{
|
||||
id: gid,
|
||||
rh: gp.rh,
|
||||
}
|
||||
|
||||
gd.removeMember(mid)
|
||||
// 퇴장을 알림
|
||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||
Target: "#" + room,
|
||||
Body: bson.M{
|
||||
gd.tid(mid): bson.M{},
|
||||
},
|
||||
Tag: []string{"MemberDocFull"},
|
||||
})
|
||||
}
|
||||
|
||||
func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) {
|
||||
gids, _ := gp.rh.JSONGetString(ctx.CallBy.Accid.Hex(), "$.party.id")
|
||||
|
||||
@ -734,11 +698,8 @@ func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) {
|
||||
gidstr := gids[0]
|
||||
gid, _ := primitive.ObjectIDFromHex(gidstr)
|
||||
|
||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||
Target: ctx.CallBy.Accid.Hex(),
|
||||
Body: bson.M{"gid": gid},
|
||||
Tag: []string{"GroupDocFull", gidstr},
|
||||
})
|
||||
// 나를 먼저 룸에서 빼야 나한테 메시지가 안감
|
||||
gp.leaveRoom(gid, ctx.CallBy.Accid)
|
||||
|
||||
// gid에는 제거 메시지 보냄
|
||||
gp.sendUpstreamMessage(&wshandler.UpstreamMessage{
|
||||
@ -749,7 +710,7 @@ func (gp *groupParty) ClientDisconnected(ctx wshandler.ApiCallContext) {
|
||||
Tag: []string{"MemberDocFull"},
|
||||
})
|
||||
|
||||
gp.leaveRoom(gid, ctx.CallBy.Accid)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user