106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
package model
|
|
|
|
import (
|
|
"github.com/globalsign/mgo/bson"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
type Chat struct {
|
|
Id bson.ObjectId `bson:"_id"`
|
|
BindSnid string //snid1 < snid2
|
|
ChatContent []*ChatContent
|
|
LastChatTs int64
|
|
}
|
|
|
|
type ChatContent struct {
|
|
SrcSnId int32
|
|
Content string
|
|
Ts int64
|
|
}
|
|
|
|
const ChatMaxNum = 1000 //聊天记录上限
|
|
|
|
type ChatRet struct {
|
|
C *Chat
|
|
}
|
|
|
|
type ChatByKey struct {
|
|
Platform string
|
|
BindSnId string
|
|
C *Chat
|
|
}
|
|
|
|
func NewChat(bindsnid string) *Chat {
|
|
f := &Chat{Id: bson.NewObjectId()}
|
|
f.BindSnid = bindsnid
|
|
f.LastChatTs = time.Now().Unix()
|
|
f.ChatContent = []*ChatContent{}
|
|
return f
|
|
}
|
|
|
|
func UpsertChat(platform, bindsnid string, chat *Chat) *Chat {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.UpsertChat rpcCli == nil")
|
|
return nil
|
|
}
|
|
if chat != nil && chat.ChatContent != nil && len(chat.ChatContent) > ChatMaxNum {
|
|
sort.Slice(chat.ChatContent, func(i, j int) bool {
|
|
if chat.ChatContent[i].Ts < chat.ChatContent[j].Ts {
|
|
return false
|
|
}
|
|
return true
|
|
})
|
|
chat.ChatContent = append(chat.ChatContent[:ChatMaxNum])
|
|
}
|
|
args := &ChatByKey{
|
|
Platform: platform,
|
|
BindSnId: bindsnid,
|
|
C: chat,
|
|
}
|
|
ret := &ChatRet{}
|
|
err := rpcCli.CallWithTimeout("ChatSvc.UpsertChat", args, ret, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Error("UpsertChat error:", err)
|
|
return nil
|
|
}
|
|
return ret.C
|
|
}
|
|
|
|
func QueryChatByBindSnid(platform, bindsnid string) (chat *Chat, err error) {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.QueryChatByBindSnid rpcCli == nil")
|
|
return
|
|
}
|
|
args := &ChatByKey{
|
|
Platform: platform,
|
|
BindSnId: bindsnid,
|
|
}
|
|
var ret *ChatRet
|
|
err = rpcCli.CallWithTimeout("ChatSvc.QueryChatByKey", args, &ret, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Error("QueryChatByBindSnid error:", err)
|
|
}
|
|
if ret != nil {
|
|
chat = ret.C
|
|
}
|
|
return
|
|
}
|
|
|
|
func DelChat(platform, bindsnid string) {
|
|
if rpcCli == nil {
|
|
logger.Logger.Error("model.DelChat rpcCli == nil")
|
|
return
|
|
}
|
|
args := &ChatByKey{
|
|
Platform: platform,
|
|
BindSnId: bindsnid,
|
|
}
|
|
err := rpcCli.CallWithTimeout("ChatSvc.DelChat", args, nil, time.Second*30)
|
|
if err != nil {
|
|
logger.Logger.Error("DelChat error:", err)
|
|
}
|
|
return
|
|
}
|