gob로 변경

This commit is contained in:
2023-09-11 12:47:27 +09:00
parent ea28d93f7d
commit 19eacf0d4c
2 changed files with 52 additions and 111 deletions

View File

@ -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

View File

@ -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)
}
}