344 lines
11 KiB
Go
344 lines
11 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
|
|
"mongo.games.com/goserver/core/basic"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/netlib"
|
|
"mongo.games.com/goserver/core/task"
|
|
|
|
"mongo.games.com/game/common"
|
|
"mongo.games.com/game/model"
|
|
"mongo.games.com/game/proto"
|
|
"mongo.games.com/game/protocol/chat"
|
|
)
|
|
|
|
// CSChatMsgHandler 用户发送消息
|
|
func CSChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSChatMsgHandler Process recv ", data)
|
|
if msg, ok := data.(*chat.CSChatMsg); ok {
|
|
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
|
if p == nil {
|
|
logger.Logger.Warn("CSChatMsgHandler p == nil")
|
|
return nil
|
|
}
|
|
platform := p.GetPlatform()
|
|
if platform == nil {
|
|
logger.Logger.Warn("CSChatMsgHandler platform == nil")
|
|
return nil
|
|
}
|
|
if msg.GetHead() > 0 {
|
|
PlayerSubjectSign.UpdateHead(p.SnId, msg.GetHead())
|
|
}
|
|
if msg.GetName() != "" {
|
|
PlayerSubjectSign.UpdateName(p.SnId, msg.GetName())
|
|
}
|
|
var content = msg.GetContent()
|
|
if len(content) > 150 {
|
|
logger.Logger.Warn("CSChatMsgHandler len(content) > 150")
|
|
return nil
|
|
}
|
|
pack := &chat.SCChatMsg{
|
|
Msg2Snid: proto.Int32(msg.Msg2Snid),
|
|
Snid: proto.Int32(p.SnId),
|
|
Name: proto.String(p.Name),
|
|
Head: proto.Int32(p.Head),
|
|
HeadUrl: proto.String(p.HeadUrl),
|
|
Ts: proto.Int64(time.Now().Unix()),
|
|
OpRetCode: chat.OpResultCode_OPRC_Sucess,
|
|
}
|
|
if msg.GetMsg2Snid() == 0 { //只有大厅消息走关键字过滤
|
|
if !ChatMgrSington.CanSendToPlatform(p.SnId) { //大厅聊天CD
|
|
return nil
|
|
}
|
|
//has := srvdata.HasSensitiveWord([]rune(msg.GetContent()))
|
|
//if has {
|
|
// content = string(srvdata.ReplaceSensitiveWord([]rune(msg.GetContent()))[:])
|
|
// logger.Logger.Trace("CSChatMsgHandler find HasSensitiveWord then after ReplaceSensitiveWord content=", content)
|
|
//}
|
|
//content = html.EscapeString(content)
|
|
pack.Content = content
|
|
proto.SetDefaults(pack)
|
|
logger.Logger.Trace("SCChatMsg -> Platform", pack)
|
|
PlayerMgrSington.BroadcastMessageToPlatformWithHall(p.Platform, p.SnId, int(chat.ChatPacketID_PACKET_SCChatMsg), pack)
|
|
} else { //私聊
|
|
FriendUnreadMgrSington.DelFriendUnread(p.Platform, p.SnId, msg.GetMsg2Snid())
|
|
pack.Content = content
|
|
if !FriendMgrSingleton.IsFriend(p.Platform, p.SnId, msg.GetMsg2Snid()) {
|
|
pack.OpRetCode = chat.OpResultCode_OPRC_Chat_NotFriend
|
|
logger.Logger.Warn("CSChatMsgHandler not friend")
|
|
} else {
|
|
if FriendMgrSingleton.IsShield(p.Platform, msg.GetMsg2Snid(), p.SnId) { //对方有没有屏蔽发送者
|
|
pack.OpRetCode = chat.OpResultCode_OPRC_Chat_IsShield
|
|
logger.Logger.Warn("CSChatMsgHandler IsShield")
|
|
}
|
|
if FriendMgrSingleton.IsShield(p.Platform, p.SnId, msg.GetMsg2Snid()) { //有没有屏蔽对方
|
|
pack.OpRetCode = chat.OpResultCode_OPRC_Chat_Shield
|
|
logger.Logger.Warn("CSChatMsgHandler Shield")
|
|
}
|
|
}
|
|
if pack.OpRetCode == chat.OpResultCode_OPRC_Sucess {
|
|
msg2p := PlayerMgrSington.GetPlayerBySnId(msg.GetMsg2Snid())
|
|
if msg2p != nil { //在线
|
|
proto.SetDefaults(pack)
|
|
msg2p.SendToClient(int(chat.ChatPacketID_PACKET_SCChatMsg), pack)
|
|
logger.Logger.Trace("SCChatMsg SnId", p.SnId, " -> Msg2Snid:", msg.GetMsg2Snid(), pack)
|
|
FriendUnreadMgrSington.AddFriendUnread(p.Platform, msg.GetMsg2Snid(), p.SnId)
|
|
} else { //不在线
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
return model.UpsertFriendUnread(p.Platform, msg.GetMsg2Snid(), p.SnId)
|
|
}), nil).StartByFixExecutor("UpsertFriendUnread")
|
|
|
|
}
|
|
ChatMgrSington.AddChat(p.Platform, p.SnId, msg.GetMsg2Snid(), content)
|
|
ChatMgrSington.SaveChatData(p.Platform, p.SnId, msg.GetMsg2Snid())
|
|
}
|
|
proto.SetDefaults(pack)
|
|
p.SendToClient(int(chat.ChatPacketID_PACKET_SCChatMsg), pack)
|
|
logger.Logger.Trace("SCChatMsg ", pack)
|
|
}
|
|
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CSGetChatLogHandler 聊天记录
|
|
func CSGetChatLogHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSGetChatLogHandler Process recv ", data)
|
|
if msg, ok := data.(*chat.CSGetChatLog); ok {
|
|
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
|
if p == nil {
|
|
logger.Logger.Warn("CSGetChatLogHandler p == nil")
|
|
return nil
|
|
}
|
|
platform := p.GetPlatform()
|
|
if platform == nil {
|
|
logger.Logger.Warn("CSGetChatLogHandler platform == nil")
|
|
return nil
|
|
}
|
|
if !FriendMgrSingleton.IsFriend(p.Platform, p.SnId, msg.GetSnid()) {
|
|
logger.Logger.Warn("CSGetChatLogHandler not friend")
|
|
return nil
|
|
}
|
|
friendInfo := FriendMgrSingleton.GetFriendList(p.Platform, p.SnId)
|
|
var bf *model.BindFriend
|
|
if friendInfo != nil && len(friendInfo) != 0 {
|
|
for _, friend := range friendInfo {
|
|
if friend.SnId == msg.GetSnid() {
|
|
bf = friend
|
|
}
|
|
}
|
|
}
|
|
FriendUnreadMgrSington.DelFriendUnread(p.Platform, p.SnId, msg.GetSnid())
|
|
chatLogs := ChatMgrSington.GetChat(p.Platform, p.SnId, msg.GetSnid())
|
|
if chatLogs != nil {
|
|
pack := &chat.SCGetChatLog{
|
|
Snid: proto.Int32(msg.GetSnid()),
|
|
}
|
|
if chatLogs.ChatContent != nil && len(chatLogs.ChatContent) != 0 {
|
|
for _, content := range chatLogs.ChatContent {
|
|
if content.Content != "" {
|
|
if bf != nil {
|
|
srcSnid := int32(0)
|
|
srcName := ""
|
|
srcHead := int32(0)
|
|
srcHeadUrl := ""
|
|
toSnId := int32(0)
|
|
toName := ""
|
|
toHead := int32(0)
|
|
ToHeadUrl := ""
|
|
if content.SrcSnId == p.SnId { //我说的
|
|
srcSnid = p.SnId
|
|
srcName = p.Name
|
|
srcHead = p.Head
|
|
srcHeadUrl = p.HeadUrl
|
|
toSnId = bf.SnId
|
|
toName = bf.Name
|
|
toHead = bf.Head
|
|
ToHeadUrl = bf.HeadUrl
|
|
} else { //对方说的
|
|
srcSnid = bf.SnId
|
|
srcName = bf.Name
|
|
srcHead = bf.Head
|
|
srcHeadUrl = bf.HeadUrl
|
|
toSnId = p.SnId
|
|
toName = p.Name
|
|
toHead = p.Head
|
|
ToHeadUrl = p.HeadUrl
|
|
}
|
|
|
|
log := &chat.ChatLog{
|
|
SrcSnId: proto.Int32(srcSnid),
|
|
SrcName: proto.String(srcName),
|
|
SrcHead: proto.Int32(srcHead),
|
|
SrcHeadUrl: proto.String(srcHeadUrl),
|
|
ToSnId: proto.Int32(toSnId),
|
|
ToName: proto.String(toName),
|
|
ToHead: proto.Int32(toHead),
|
|
ToHeadUrl: proto.String(ToHeadUrl),
|
|
Content: proto.String(content.Content),
|
|
Ts: proto.Int64(content.Ts),
|
|
}
|
|
pack.ChatLogs = append(pack.ChatLogs, log)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
proto.SetDefaults(pack)
|
|
p.SendToClient(int(chat.ChatPacketID_PACKET_SCGetChatLog), pack)
|
|
logger.Logger.Trace("SCGetChatLog ", pack)
|
|
} else {
|
|
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
|
|
bindSnid := ChatMgrSington.getBindSnid(p.SnId, msg.GetSnid())
|
|
ret, err := model.QueryChatByBindSnid(p.Platform, bindSnid)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return ret
|
|
}), task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) {
|
|
pack := &chat.SCGetChatLog{
|
|
Snid: proto.Int32(msg.GetSnid()),
|
|
}
|
|
if ret, ok := data.(*model.Chat); ok && ret != nil {
|
|
ChatMgrSington.SetChat(p.Platform, ret.BindSnid, ret)
|
|
if ret.ChatContent != nil && len(ret.ChatContent) != 0 {
|
|
for _, content := range ret.ChatContent {
|
|
if content.Content != "" {
|
|
if bf != nil {
|
|
srcSnid := int32(0)
|
|
srcName := ""
|
|
srcHead := int32(0)
|
|
srcHeadUrl := ""
|
|
toSnId := int32(0)
|
|
toName := ""
|
|
toHead := int32(0)
|
|
ToHeadUrl := ""
|
|
if content.SrcSnId == p.SnId { //我说的
|
|
srcSnid = p.SnId
|
|
srcName = p.Name
|
|
srcHead = p.Head
|
|
srcHeadUrl = p.HeadUrl
|
|
toSnId = bf.SnId
|
|
toName = bf.Name
|
|
toHead = bf.Head
|
|
ToHeadUrl = bf.HeadUrl
|
|
} else { //对方说的
|
|
srcSnid = bf.SnId
|
|
srcName = bf.Name
|
|
srcHead = bf.Head
|
|
srcHeadUrl = bf.HeadUrl
|
|
toSnId = p.SnId
|
|
toName = p.Name
|
|
toHead = p.Head
|
|
ToHeadUrl = p.HeadUrl
|
|
}
|
|
|
|
log := &chat.ChatLog{
|
|
SrcSnId: proto.Int32(srcSnid),
|
|
SrcName: proto.String(srcName),
|
|
SrcHead: proto.Int32(srcHead),
|
|
SrcHeadUrl: proto.String(srcHeadUrl),
|
|
ToSnId: proto.Int32(toSnId),
|
|
ToName: proto.String(toName),
|
|
ToHead: proto.Int32(toHead),
|
|
ToHeadUrl: proto.String(ToHeadUrl),
|
|
Content: proto.String(content.Content),
|
|
Ts: proto.Int64(content.Ts),
|
|
}
|
|
pack.ChatLogs = append(pack.ChatLogs, log)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
proto.SetDefaults(pack)
|
|
p.SendToClient(int(chat.ChatPacketID_PACKET_SCGetChatLog), pack)
|
|
logger.Logger.Trace("SCGetChatLog ", pack)
|
|
})).StartByFixExecutor("LoadChatData")
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CSReadChatMsgHandler 读消息
|
|
func CSReadChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSReadChatMsgHandler Process recv ", data)
|
|
if msg, ok := data.(*chat.CSReadChatMsg); ok {
|
|
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
|
if p == nil {
|
|
logger.Logger.Warn("CSReadChatMsgHandler p == nil")
|
|
return nil
|
|
}
|
|
platform := p.GetPlatform()
|
|
if platform == nil {
|
|
logger.Logger.Warn("CSReadChatMsgHandler platform == nil")
|
|
return nil
|
|
}
|
|
if !FriendMgrSingleton.IsFriend(p.Platform, p.SnId, msg.GetSnid()) {
|
|
logger.Logger.Warn("CSReadChatMsgHandler not friend")
|
|
return nil
|
|
}
|
|
FriendUnreadMgrSington.DelFriendUnread(p.Platform, p.SnId, msg.GetSnid())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CSShieldMsgHandler 屏蔽
|
|
func CSShieldMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error {
|
|
logger.Logger.Trace("CSShieldMsgHandler Process recv ", data)
|
|
if msg, ok := data.(*chat.CSShieldMsg); ok {
|
|
p := PlayerMgrSington.GetOnlinePlayer(sid)
|
|
if p == nil {
|
|
logger.Logger.Warn("CSShieldMsgHandler p == nil")
|
|
return nil
|
|
}
|
|
platform := p.GetPlatform()
|
|
if platform == nil {
|
|
logger.Logger.Warn("CSShieldMsgHandler platform == nil")
|
|
return nil
|
|
}
|
|
|
|
pack := &chat.SCShieldMsg{
|
|
Snid: proto.Int32(p.SnId),
|
|
ShieldSnid: proto.Int32(msg.GetShieldSnid()),
|
|
Shield: proto.Bool(msg.GetShield()),
|
|
Ts: proto.Int64(proto.Int64(time.Now().Unix())),
|
|
OpRetCode: chat.OpResultCode_OPRC_Sucess,
|
|
}
|
|
if msg.GetShield() {
|
|
if FriendMgrSingleton.IsShield(p.Platform, p.SnId, msg.GetShieldSnid()) {
|
|
logger.Logger.Warn("重复屏蔽")
|
|
pack.OpRetCode = chat.OpResultCode_OPRC_Chat_ReShield
|
|
}
|
|
} else {
|
|
if !FriendMgrSingleton.IsShield(p.Platform, p.SnId, msg.GetShieldSnid()) {
|
|
logger.Logger.Warn("重复解除")
|
|
pack.OpRetCode = chat.OpResultCode_OPRC_Chat_ReUnShield
|
|
}
|
|
}
|
|
if pack.OpRetCode == chat.OpResultCode_OPRC_Sucess {
|
|
if msg.GetShield() {
|
|
FriendMgrSingleton.AddShield(p.Platform, p.SnId, msg.GetShieldSnid())
|
|
} else {
|
|
FriendMgrSingleton.DelShield(p.Platform, p.SnId, msg.GetShieldSnid())
|
|
}
|
|
}
|
|
proto.SetDefaults(pack)
|
|
p.SendToClient(int(chat.ChatPacketID_PACKET_SCShieldMsg), pack)
|
|
logger.Logger.Trace("SCShieldMsg ", pack)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func init() {
|
|
//聊天消息
|
|
common.Register(int(chat.ChatPacketID_PACKET_CSChatMsg), &chat.CSChatMsg{}, CSChatMsgHandler)
|
|
//聊天记录
|
|
common.Register(int(chat.ChatPacketID_PACKET_CSGetChatLog), &chat.CSGetChatLog{}, CSGetChatLogHandler)
|
|
//读消息
|
|
common.Register(int(chat.ChatPacketID_PACKET_CSReadChatMsg), &chat.CSReadChatMsg{}, CSReadChatMsgHandler)
|
|
//屏蔽玩家
|
|
common.Register(int(chat.ChatPacketID_PACKET_CSShieldMsg), &chat.SCShieldMsg{}, CSShieldMsgHandler)
|
|
}
|