1369 lines
No EOL
50 KiB
Lua
1369 lines
No EOL
50 KiB
Lua
local tableInsert = table.insert
|
||
local ipairs = ipairs
|
||
local ChatChannelType = ChatChannelType
|
||
|
||
XChatManagerCreator = function()
|
||
local XChatManager = {}
|
||
|
||
local CLIENT_WORLD_CHAT_MAX_SIZE = 0
|
||
local CLIENT_ROOM_CHAT_MAX_SIZE = 0
|
||
local REMOVE_CHAT_RECORD_OF_DAY = 0
|
||
local CHAT_INTERVAL_TIME = 0
|
||
local TodayResetTime = 0
|
||
local WORLD_CHAT_MAX_COUNT = 0
|
||
local MENTOR_CHAT_MAX_COUNT = 0
|
||
-- 一天的秒数
|
||
local ONE_DAY_SECONDS = 60 * 60 * 24
|
||
|
||
local WorldChatList = {} --保存世界聊天记录
|
||
local PrivateChatMap = {} --保存私聊的聊天纪录
|
||
local GuildChatList = {} --保存公会聊天纪录
|
||
local RoomChatList = {} --保存房间聊天记录
|
||
local MentorChatList = {} --师徒聊天记录
|
||
local ChatList = {} --各类聊天记录
|
||
local EmojiDatasDic = {}
|
||
local EffectInfo = {} -- 关键字屏幕特效
|
||
local EffectTriggerType = {
|
||
Me = 1,
|
||
Other = 2,
|
||
All = 3,
|
||
}
|
||
local LastChatCoolTime = 0
|
||
local LastEffectCoolTime = 0
|
||
|
||
local MessageId = -1 --离线消息
|
||
local OfflineMessageTag = "OfflineRecordMessage_"
|
||
|
||
local LastRequestChannelTime = 0
|
||
local CurrentChatChannelId = 0
|
||
local LastReadChatTime = {}
|
||
local ChatChannelInfos
|
||
local GuildChatContent = ""
|
||
local GuildSaveCount = 0
|
||
local MentorChatContent = ""
|
||
local MentorSaveCount = 0
|
||
|
||
--协议处理
|
||
local MethodName = {
|
||
SendChat = "SendChatRequest",
|
||
GetGift = "GetGiftsRequest",
|
||
GetAllGiftsRequest = "GetAllGiftsRequest",
|
||
GetOfflineMessageRequest = "OfflineMessageRequest",
|
||
SelectChatChannelRequest = "SelectChatChannelRequest",
|
||
EnterWorldChatRequest = "EnterWorldChatRequest",
|
||
GetWorldChannelInfoRequest = "GetWorldChannelInfoRequest",
|
||
}
|
||
|
||
function XChatManager.Init()
|
||
REMOVE_CHAT_RECORD_OF_DAY = CS.XGame.ClientConfig:GetInt("RemoveChatRecordOfDay")
|
||
CLIENT_WORLD_CHAT_MAX_SIZE = CS.XGame.ClientConfig:GetInt("WorldChatMaxSize")
|
||
CLIENT_ROOM_CHAT_MAX_SIZE = CS.XGame.ClientConfig:GetInt("RoomChatMaxSize")
|
||
CHAT_INTERVAL_TIME = CS.XGame.Config:GetInt("ChatIntervalTime")
|
||
WORLD_CHAT_MAX_COUNT = CS.XGame.Config:GetInt("WorldChatMaxCount")
|
||
MENTOR_CHAT_MAX_COUNT = XMentorSystemConfigs.GetMentorSystemData("MentorChatMaxCount")
|
||
|
||
ChatList[ChatChannelType.World] = WorldChatList
|
||
ChatList[ChatChannelType.Guild] = GuildChatList
|
||
ChatList[ChatChannelType.Room] = RoomChatList
|
||
ChatList[ChatChannelType.Mentor] = MentorChatList
|
||
|
||
for _, type in pairs(ChatChannelType) do
|
||
local key = string.format("%s%d" ,XChatConfigs.KEY_LAST_READ_CHAT_TIME, type)
|
||
LastReadChatTime[type] = XSaveTool.GetData(key) or XMath.IntMax()
|
||
end
|
||
|
||
XEventManager.AddEventListener(XEventId.EVENT_ROOM_LEAVE_ROOM, function()
|
||
RoomChatList = {}
|
||
ChatList[ChatChannelType.Room] = RoomChatList
|
||
end)
|
||
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, function()
|
||
XChatManager.InitChatChannel()
|
||
-- 登录完成后直接获取所有频道信息
|
||
XChatManager.GetWorldChannelInfos()
|
||
end)
|
||
|
||
-- 聊天播放特效功能
|
||
local effectTemplates = XChatConfigs.GetEffectTemplates()
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
for _, template in pairs(effectTemplates) do
|
||
local endTime = XTime.ParseToTimestamp(template.EndTimeStr)
|
||
if nowTime < endTime then
|
||
local data = XTool.Clone(template)
|
||
data.BeginTime = XTime.ParseToTimestamp(data.BeginTimeStr)
|
||
data.EndTime = endTime
|
||
tableInsert(EffectInfo, data)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XChatManager.GetLastRequestChannelTime()
|
||
return LastRequestChannelTime
|
||
end
|
||
|
||
function XChatManager.SetLastRequestChannelTime(time)
|
||
LastRequestChannelTime = time
|
||
end
|
||
|
||
function XChatManager.GetWorldChatMaxCount()
|
||
return WORLD_CHAT_MAX_COUNT
|
||
end
|
||
|
||
function XChatManager.GetMentorChatMaxCount()
|
||
return MENTOR_CHAT_MAX_COUNT
|
||
end
|
||
|
||
-- 初始化世界聊天数据
|
||
function XChatManager.InitWorldChatData(worldChatDataList)
|
||
WorldChatList = {}
|
||
ChatList[ChatChannelType.World] = WorldChatList
|
||
local WorldChatLoop = function(item)
|
||
if item ~= nil then
|
||
XChatManager.ProcessExtraContent(item)
|
||
tableInsert(WorldChatList, 1, item)
|
||
end
|
||
end
|
||
XTool.LoopCollection(worldChatDataList, WorldChatLoop)
|
||
end
|
||
|
||
--加载私聊信息
|
||
function XChatManager.InitFriendPrivateChatData()
|
||
PrivateChatMap = {}
|
||
local cb = function()
|
||
for _, friendId in pairs(XDataCenter.SocialManager.GetFriendIds()) do
|
||
XChatManager.ReadSpecifyFriendsChatContent(friendId)
|
||
end
|
||
XChatManager.GetOfflineMessageRequest(XChatManager.GetLocalOfflineRecord())
|
||
end
|
||
XDataCenter.SocialManager.GetFriendsInfo(cb)
|
||
end
|
||
|
||
--处理系统消息
|
||
local function HandleSystemChat()
|
||
--TODO Handle System Chat
|
||
end
|
||
|
||
--处理世界消息
|
||
local function HandleWorldChat(chatData, isNotify)
|
||
--黑名单的聊天数据不加入
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
if #WorldChatList >= CLIENT_WORLD_CHAT_MAX_SIZE then
|
||
table.remove(WorldChatList, #WorldChatList)
|
||
end
|
||
tableInsert(WorldChatList, 1, chatData)
|
||
|
||
if isNotify then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, chatData)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, chatData)
|
||
end
|
||
end
|
||
|
||
--处理公会消息
|
||
local function HandleGuildChat(chatData, isNotify)
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
tableInsert(GuildChatList, 1, chatData)
|
||
if isNotify then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_GUILD_RECEIVE_CHAT, chatData)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_GUILD_RECEIVE_CHAT, chatData)
|
||
end
|
||
end
|
||
|
||
--处理师徒消息
|
||
local function HandleMentorChat(chatData, isNotify)
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
if #MentorChatList >= MENTOR_CHAT_MAX_COUNT then
|
||
table.remove(MentorChatList, #MentorChatList)
|
||
end
|
||
tableInsert(MentorChatList, 1, chatData)
|
||
|
||
if isNotify then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, chatData)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, chatData)
|
||
end
|
||
end
|
||
|
||
--处理私聊消息
|
||
local function HandlePrivateChat(chatData, ignoreNotify)
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
if (not chatData) then
|
||
return
|
||
end
|
||
if chatData.SenderId == XPlayer.Id or
|
||
chatData.MsgType == ChatMsgType.Gift or
|
||
chatData.MsgType == ChatMsgType.Tips then
|
||
chatData.IsRead = true
|
||
end
|
||
if chatData.SenderId ~= XPlayer.Id then
|
||
XChatManager.UpdateLocalOfflineRecord(chatData.MessageId or 0)
|
||
end
|
||
local targetId = chatData:GetChatTargetId()
|
||
|
||
XChatManager.AddPrivateChatData(targetId, chatData, false, ignoreNotify)
|
||
|
||
--保存消息
|
||
XChatManager.SaveSpecifyFriendsChatContent(targetId)
|
||
end
|
||
|
||
--处理房间消息
|
||
local function HandleRoomChat(chatData)
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
if #RoomChatList >= CLIENT_ROOM_CHAT_MAX_SIZE then
|
||
table.remove(RoomChatList, #RoomChatList)
|
||
end
|
||
tableInsert(RoomChatList, 1, chatData)
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_ROOM_MSG, chatData)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_ROOM_MSG, chatData)
|
||
end
|
||
|
||
-- 清除房间聊天
|
||
function XChatManager.ResetRoomChat()
|
||
RoomChatList = {}
|
||
ChatList[ChatChannelType.Room] = RoomChatList
|
||
end
|
||
|
||
function XChatManager.OnSynChat(chatMsg, ignoreNotify)
|
||
local chatData = XChatData.New(chatMsg)
|
||
if chatMsg.ChannelType == ChatChannelType.System then
|
||
HandleSystemChat(chatData)
|
||
elseif chatMsg.ChannelType == ChatChannelType.World then
|
||
HandleWorldChat(chatData, true)
|
||
elseif chatMsg.ChannelType == ChatChannelType.Private then
|
||
HandlePrivateChat(chatData, ignoreNotify)
|
||
elseif chatMsg.ChannelType == ChatChannelType.Room then
|
||
HandleRoomChat(chatData)
|
||
elseif chatMsg.ChannelType == ChatChannelType.Guild then
|
||
HandleGuildChat(chatData, true)
|
||
XChatManager.SaveGuildChatContent()
|
||
elseif chatMsg.ChannelType == ChatChannelType.Mentor then
|
||
HandleMentorChat(chatData, true)
|
||
end
|
||
|
||
--接收到礼物时增加一条tip提示
|
||
if chatMsg.MsgType == ChatMsgType.Gift then
|
||
chatMsg.MsgType = ChatMsgType.Tips
|
||
chatMsg.CreateTime = chatMsg.CreateTime
|
||
chatMsg.GiftId = chatMsg.GiftId
|
||
XChatManager.OnSynChat(chatMsg, true)
|
||
end
|
||
end
|
||
|
||
|
||
|
||
---------------------------------public function-----------------------------------
|
||
function XChatManager.GetRemoveChatRecordOfDays()
|
||
return REMOVE_CHAT_RECORD_OF_DAY
|
||
end
|
||
|
||
function XChatManager.GetWorldChatMaxSize()
|
||
return CLIENT_WORLD_CHAT_MAX_SIZE
|
||
end
|
||
|
||
--=== Emoji ===
|
||
function XChatManager.GetEmojiIcon(emojiId)
|
||
return XChatConfigs.GetEmojiIcon(emojiId)
|
||
end
|
||
|
||
function XChatManager.GetEmojiQuality()
|
||
return XChatConfigs.GetEmojiQuality()
|
||
end
|
||
|
||
function XChatManager.GetEmojiName(emojiId)
|
||
return XChatConfigs.GetEmojiName(emojiId)
|
||
end
|
||
|
||
function XChatManager.GetEmojiDescription(emojiId)
|
||
return XChatConfigs.GetEmojiDescription(emojiId)
|
||
end
|
||
|
||
function XChatManager.GetEmojiWorldDesc(emojiId)
|
||
return XChatConfigs.GetEmojiWorldDesc(emojiId)
|
||
end
|
||
|
||
function XChatManager.GetEmojiBigIcon(emojiId)
|
||
return XChatConfigs.GetEmojiBigIcon(emojiId)
|
||
end
|
||
|
||
function XChatManager.GetEmojiTemplates()
|
||
local templates = {}
|
||
|
||
for _, emojiData in pairs(EmojiDatasDic) do
|
||
tableInsert(templates, emojiData)
|
||
end
|
||
table.sort(templates, function(l, r) return l:GetEmojiOrder() < r:GetEmojiOrder() end)
|
||
return templates
|
||
end
|
||
|
||
function XChatManager.GetEmojiDatasDic()
|
||
return EmojiDatasDic
|
||
end
|
||
|
||
function XChatManager.IsEmojiValid(emojiId)
|
||
for _, v in pairs(EmojiDatasDic) do
|
||
if v:IsEmojiValid(emojiId) then
|
||
return true
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
--=== Any Chat ===
|
||
function XChatManager.GetChatList(type)
|
||
return ChatList[type]
|
||
end
|
||
|
||
--=== World Chat ===
|
||
function XChatManager.GetWorldChatList()
|
||
return WorldChatList
|
||
end
|
||
|
||
--=== Guild Chat ===
|
||
function XChatManager.GetGuildChatList()
|
||
return GuildChatList
|
||
end
|
||
|
||
--=== Mentor Chat ===
|
||
function XChatManager.GetMentorChatList()
|
||
return MentorChatList
|
||
end
|
||
|
||
--=== Room Chat ===
|
||
function XChatManager.GetRoomChatList()
|
||
table.sort(RoomChatList, function(a, b)
|
||
if a.CreateTime ~= b.CreateTime then
|
||
return a.CreateTime > b.CreateTime
|
||
end
|
||
end)
|
||
return RoomChatList
|
||
end
|
||
|
||
--=== Private Chat ===
|
||
-- 获取私聊聊天数据
|
||
function XChatManager.GetPrivateDynamicList(friendId)
|
||
local msgData = XChatManager.GetPrivateChatsByFriendId(friendId)
|
||
local sortFunc = function(a, b)
|
||
if a.CreateTime ~= b.CreateTime then
|
||
return a.CreateTime > b.CreateTime
|
||
else
|
||
if a.MsgType == ChatMsgType.Tips then
|
||
if b.MsgType == ChatMsgType.Tips then
|
||
return a.GiftStatus > b.GiftStatus
|
||
end
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
table.sort(msgData, sortFunc)
|
||
return msgData
|
||
end
|
||
|
||
-- 获取私聊好友id列表
|
||
function XChatManager.GetPrivateChatGroupData(nowID)
|
||
--初始化数据
|
||
local chatFriendIdList = XChatManager.GetHaveChatDataFriendIds()
|
||
local targetInList = false
|
||
for _, id in ipairs(chatFriendIdList) do
|
||
if id == nowID then
|
||
targetInList = true
|
||
break
|
||
end
|
||
end
|
||
if not targetInList then
|
||
tableInsert(chatFriendIdList, 1, nowID)
|
||
end
|
||
|
||
local dynamicListData = {}
|
||
for _, v in ipairs(chatFriendIdList) do
|
||
local friendInfo = XDataCenter.SocialManager.GetFriendInfo(v)
|
||
tableInsert(dynamicListData, friendInfo)
|
||
end
|
||
return dynamicListData
|
||
end
|
||
|
||
|
||
--新增私聊消息
|
||
function XChatManager.AddPrivateChatData(friendId, chatData, isInit, ignoreNotify)
|
||
if XDataCenter.SocialManager.GetBlackData(friendId) then
|
||
return
|
||
end
|
||
|
||
--好友聊天数据结构
|
||
local friendChats = PrivateChatMap[friendId]
|
||
if not friendChats then
|
||
friendChats = {}
|
||
friendChats.ChatMap = {}
|
||
friendChats.LastChat = nil
|
||
PrivateChatMap[friendId] = friendChats
|
||
end
|
||
|
||
friendChats.LastChat = chatData
|
||
|
||
friendChats.ChatMap = friendChats.ChatMap or {}
|
||
tableInsert(friendChats.ChatMap, chatData)
|
||
|
||
if not isInit or not chatData.IsRead then
|
||
if not ignoreNotify then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, chatData)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, chatData)
|
||
end
|
||
end
|
||
end
|
||
|
||
--获取已聊天过的好友id列表
|
||
function XChatManager.GetHaveChatDataFriendIds()
|
||
local list = {}
|
||
|
||
for friendId, chatInfo in pairs(PrivateChatMap) do
|
||
if chatInfo and chatInfo.ChatMap then
|
||
for _, _ in pairs(chatInfo.ChatMap) do
|
||
tableInsert(list, friendId)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if #list >= 2 then
|
||
local sortByCreateTime = function(l, r)
|
||
local lchat = XChatManager.GetLastPrivateChatByFriendId(l)
|
||
local rchat = XChatManager.GetLastPrivateChatByFriendId(r)
|
||
if lchat.CreateTime > rchat.CreateTime then
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
table.sort(list, sortByCreateTime)
|
||
end
|
||
|
||
return list
|
||
end
|
||
|
||
--更新礼物信息
|
||
function XChatManager.UpdateGiftData(friendId, giftId, status, giftCount)
|
||
local friendChats = PrivateChatMap[friendId]
|
||
if not friendChats or not friendChats.ChatMap then
|
||
return
|
||
end
|
||
|
||
for _, v in pairs(friendChats.ChatMap) do
|
||
if (v.MsgType == ChatMsgType.Gift or v.MsgType == ChatMsgType.Tips) and v.GiftId == giftId and v.SenderId == friendId then
|
||
friendChats.LastChat = v
|
||
v.GiftStatus = status
|
||
if giftCount and giftCount > 0 then
|
||
v.GiftCount = giftCount
|
||
end
|
||
end
|
||
end
|
||
--保存消息
|
||
XChatManager.SaveSpecifyFriendsChatContent(friendId)
|
||
end
|
||
|
||
--获取指定好友聊天列表
|
||
function XChatManager.GetPrivateChatsByFriendId(friendId)
|
||
local list = {}
|
||
if (PrivateChatMap[friendId] and PrivateChatMap[friendId].ChatMap) then
|
||
for _, chat in pairs(PrivateChatMap[friendId].ChatMap) do
|
||
tableInsert(list, chat)
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
--获取好友最后一条聊天
|
||
function XChatManager.GetLastPrivateChatByFriendId(friendId)
|
||
local lastChat = nil
|
||
local info = PrivateChatMap[friendId]
|
||
if (info) then
|
||
lastChat = info.LastChat
|
||
end
|
||
return lastChat
|
||
end
|
||
|
||
--获取好友未读聊天数量
|
||
function XChatManager.GetPrivateUnreadChatCountByFriendId(friendId)
|
||
local count = 0
|
||
local info = PrivateChatMap[friendId]
|
||
if (info and info.ChatMap) then
|
||
for _, chat in pairs(info.ChatMap) do
|
||
if (not chat.IsRead) then
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
--设置指定好友全部聊天为已读
|
||
function XChatManager.SetPrivateChatReadByFriendId(friendId)
|
||
local friendChat = PrivateChatMap[friendId]
|
||
local count = 0
|
||
if friendChat and friendChat.ChatMap then
|
||
for _, chat in pairs(friendChat.ChatMap) do
|
||
if not chat.IsRead then
|
||
chat.IsRead = true
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
|
||
--保存消息
|
||
XChatManager.SaveSpecifyFriendsChatContent(friendId)
|
||
|
||
if count > 0 then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_FRIEND_READ_PRIVATE_MSG)
|
||
end
|
||
end
|
||
|
||
--检测好友是否有自己可以领取的礼物
|
||
function XChatManager.CheckDoesHaveGiftByFriendId(friendId)
|
||
local friendChats = PrivateChatMap[friendId]
|
||
if not friendChats or not friendChats.ChatMap then
|
||
return false
|
||
end
|
||
for _, v in pairs(friendChats.ChatMap) do
|
||
if v:CheckHaveGift() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
---------------------------------Chat Record-----------------------------------
|
||
local ChatRecordTag = "ChatRecord_%d_%d" --标识 + 好友id + 自己id
|
||
|
||
--读取指定好友的聊天内容
|
||
function XChatManager.ReadSpecifyFriendsChatContent(friendId)
|
||
local key = string.format(ChatRecordTag, friendId, XPlayer.Id)
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
local chatRecord = CS.UnityEngine.PlayerPrefs.GetString(key)
|
||
local msgTab = string.Split(chatRecord, '\n')
|
||
if msgTab ~= nil and #msgTab > 0 then
|
||
for index = 1, #msgTab do
|
||
local content = msgTab[index]
|
||
if (not string.IsNilOrEmpty(content)) then
|
||
local tab = string.Split(content, '\t')
|
||
if tab ~= nil then
|
||
if XChatManager.CheckIsRemove(tonumber(tab[3])) then
|
||
local chatData = XChatData.New()
|
||
chatData.ChannelType = ChatChannelType.Private
|
||
|
||
chatData.SenderId = tonumber(tab[1])
|
||
chatData.TargetId = tonumber(tab[2])
|
||
chatData.CreateTime = tonumber(tab[3])
|
||
chatData.Content = tab[4]
|
||
chatData.MsgType = tonumber(tab[5])
|
||
chatData.GiftId = tonumber(tab[6])
|
||
chatData.GiftCount = tonumber(tab[7])
|
||
chatData.GiftStatus = tonumber(tab[8])
|
||
chatData.IsRead = tonumber(tab[9]) == 1
|
||
chatData.CustomContent = tab[10]
|
||
|
||
if XPlayer.Id == chatData.SenderId then
|
||
chatData.Icon = XPlayer.CurrHeadPortraitId
|
||
chatData.NickName = XPlayer.Name
|
||
chatData.HeadFrameId = XPlayer.CurrHeadFrameId
|
||
else
|
||
local friendInfo = XDataCenter.SocialManager.GetFriendInfo(friendId)
|
||
if friendInfo then
|
||
chatData.Icon = friendInfo.Icon
|
||
chatData.NickName = friendInfo.NickName
|
||
chatData.HeadFrameId = friendInfo.HeadFrameId
|
||
end
|
||
end
|
||
XChatManager.ProcessExtraContent(chatData)
|
||
XChatManager.AddPrivateChatData(friendId, chatData, true)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--检测该消息是否是七天前的
|
||
function XChatManager.CheckIsRemove(time)
|
||
if time == nil then
|
||
return false
|
||
end
|
||
local curTime = XTime.GetServerNowTimestamp()
|
||
return curTime - time <= REMOVE_CHAT_RECORD_OF_DAY * 24 * 60 * 60
|
||
end
|
||
|
||
function XChatManager.DeleteGuildChat(guildId)
|
||
GuildChatList = {}
|
||
ChatList[ChatChannelType.Guild] = GuildChatList
|
||
local key = XDataCenter.GuildManager.GetGuildChannelKey(guildId)
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
CS.UnityEngine.PlayerPrefs.DeleteKey(key)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
end
|
||
|
||
-- 登录初始化公会聊天内容
|
||
function XChatManager.InitLocalCacheGuildChatContent()
|
||
if not XDataCenter.GuildManager.IsJoinGuild() then return end
|
||
local guildId = XDataCenter.GuildManager.GetGuildId()
|
||
local key = XDataCenter.GuildManager.GetGuildChannelKey(guildId)
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
GuildChatList = {}
|
||
ChatList[ChatChannelType.Guild] = GuildChatList
|
||
local chatRecord = CS.UnityEngine.PlayerPrefs.GetString(key)
|
||
local allLines = string.Split(chatRecord, '\n')
|
||
if allLines ~= nil and #allLines > 0 then
|
||
for i = 1, #allLines do
|
||
local content = allLines[i]
|
||
if (not string.IsNilOrEmpty(content)) then
|
||
local tab = string.Split(content, '\t')
|
||
if tab ~= nil then
|
||
local chatData = XChatData.New()
|
||
chatData.SenderId = tonumber(tab[1])
|
||
chatData.TargetId = tonumber(tab[2])
|
||
chatData.CreateTime = tonumber(tab[3])
|
||
chatData.Content = tab[4]
|
||
chatData.MsgType = tonumber(tab[5])
|
||
chatData.IsRead = tonumber(tab[6])
|
||
chatData.MessageId = tonumber(tab[7])
|
||
chatData.Icon = tonumber(tab[8])
|
||
chatData.CustomContent = tab[9]
|
||
chatData.NickName = tab[10]
|
||
chatData.GuildRankLevel = tonumber(tab[11])
|
||
chatData.ChannelType = tonumber(tab[12])
|
||
chatData.HeadFrameId = tonumber(tab[13])
|
||
chatData.CollectWordId = tonumber(tab[14])
|
||
chatData.NameplateId = tonumber(tab[15]) or 0
|
||
tableInsert(GuildChatList, chatData)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 合并客户端,服务端公会聊天
|
||
function XChatManager.MergeClientAndServerGuildChat(serverChat)
|
||
|
||
if #serverChat <= 0 then return end
|
||
if #GuildChatList <= 0 then
|
||
if #serverChat > 0 then
|
||
for _, chatData in pairs(serverChat) do
|
||
tableInsert(GuildChatList, chatData)
|
||
end
|
||
return
|
||
end
|
||
end
|
||
|
||
local clientTailIndex = 1
|
||
local clientTailCreateTime = GuildChatList[clientTailIndex].CreateTime
|
||
|
||
local serverTailIndex = #serverChat
|
||
local serverTailCreateTime = serverChat[serverTailIndex].CreateTime
|
||
|
||
local serverHeadIndex = 1
|
||
local serverHeadCreateTime = serverChat[serverHeadIndex].CreateTime
|
||
|
||
-- 服务端缓存与客户端缓存完全重叠
|
||
if clientTailCreateTime > serverHeadCreateTime then
|
||
return
|
||
end
|
||
|
||
-- 服务端缓存与客户端缓存部分重叠
|
||
local beginIndex = 0
|
||
if serverTailCreateTime <= clientTailCreateTime and clientTailCreateTime <= serverHeadCreateTime then
|
||
local clientHeadChat = GuildChatList[clientTailIndex]
|
||
for i = #serverChat, 1, -1 do
|
||
local curServerChat = serverChat[i]
|
||
|
||
if clientHeadChat.CreateTime == curServerChat.CreateTime and
|
||
clientHeadChat.SenderId == curServerChat.SenderId and
|
||
clientHeadChat.Content == curServerChat.Content then
|
||
|
||
beginIndex = i - 1
|
||
break
|
||
end
|
||
|
||
if clientHeadChat.CreateTime < curServerChat.CreateTime then
|
||
beginIndex = i
|
||
break
|
||
end
|
||
end
|
||
|
||
if beginIndex > 0 and beginIndex <= #serverChat then
|
||
for i = beginIndex, 1, -1 do
|
||
tableInsert(GuildChatList, 1, serverChat[i])
|
||
end
|
||
end
|
||
XChatManager.SaveGuildChatContent()
|
||
return
|
||
end
|
||
|
||
-- 服务端缓存与客户端缓存完成不重叠
|
||
if clientTailCreateTime < serverTailCreateTime then
|
||
for i = #serverChat, 1, -1 do
|
||
tableInsert(GuildChatList, 1, serverChat[i])
|
||
end
|
||
end
|
||
XChatManager.SaveGuildChatContent()
|
||
end
|
||
|
||
-- 存储公会聊天内容
|
||
function XChatManager.SaveGuildChatContent()
|
||
if not XDataCenter.GuildManager.IsJoinGuild() then return end
|
||
local splitMark = "\n"
|
||
for i = #GuildChatList-GuildSaveCount, 1, -1 do
|
||
local chat = GuildChatList[i]
|
||
local list = {}
|
||
if chat ~= nil and type(chat) == 'table' and i <= XGuildConfig.GuildChatCacheCount then
|
||
tableInsert(list, chat.SenderId)
|
||
tableInsert(list, chat.TargetId)
|
||
tableInsert(list, chat.CreateTime)
|
||
tableInsert(list, chat.Content)
|
||
tableInsert(list, chat.MsgType)
|
||
tableInsert(list, (chat.IsRead and "1" or "0"))
|
||
tableInsert(list, chat.MessageId)
|
||
tableInsert(list, chat.Icon)
|
||
tableInsert(list, (chat.CustomContent or ""))
|
||
tableInsert(list, (chat.NickName or ""))
|
||
tableInsert(list, (chat.GuildRankLevel or "0"))
|
||
tableInsert(list, (chat.ChannelType or "0"))
|
||
tableInsert(list, (chat.HeadFrameId or "0"))
|
||
tableInsert(list, (chat.CollectWordId or "0"))
|
||
tableInsert(list, (chat.NameplateId or "0"))
|
||
end
|
||
GuildSaveCount = GuildSaveCount + 1
|
||
local chatStr = table.concat(list, "\t")
|
||
GuildChatContent = string.format("%s%s%s", chatStr, splitMark, GuildChatContent)
|
||
end
|
||
if GuildChatContent ~= nil and GuildChatContent ~= '' then
|
||
local guildId = XDataCenter.GuildManager.GetGuildId()
|
||
local key = XDataCenter.GuildManager.GetGuildChannelKey(guildId)
|
||
CS.UnityEngine.PlayerPrefs.SetString(key, GuildChatContent)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
end
|
||
|
||
-- 关键字匹配
|
||
function XChatManager.KeywordMatch(channelType, chatData)
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
local firstMatchIndex = nil
|
||
local minMatchPos = XMath.IntMax()
|
||
for index, info in ipairs(EffectInfo) do
|
||
local isMatch = true
|
||
isMatch = isMatch and nowTime > info.BeginTime and nowTime < info.EndTime
|
||
isMatch = isMatch and nowTime > LastEffectCoolTime + info.CoolTime
|
||
isMatch = isMatch and chatData.MsgType == ChatMsgType.Normal or chatData.MsgType == ChatMsgType.RoomMsg
|
||
if not isMatch then goto CONTINUE end
|
||
|
||
if info.TriggerType == EffectTriggerType.Me then
|
||
isMatch = isMatch and chatData.SenderId == XPlayer.Id
|
||
elseif info.TriggerType == EffectTriggerType.Other then
|
||
isMatch = isMatch and chatData.SenderId ~= XPlayer.Id
|
||
end
|
||
|
||
if info.Channel and next(info.Channel) then
|
||
local isPartMatch = false
|
||
for _,channel in ipairs(info.Channel) do
|
||
isPartMatch = isPartMatch or channel == channelType
|
||
end
|
||
isMatch = isMatch and isPartMatch
|
||
end
|
||
|
||
if not isMatch then goto CONTINUE end
|
||
|
||
-- 开始匹配具体内容
|
||
if info.Keyword and next(info.Keyword) then
|
||
for _,pattern in ipairs(info.Keyword) do
|
||
local matchPos = string.find(chatData.Content, pattern)
|
||
if matchPos and matchPos < minMatchPos then
|
||
firstMatchIndex = index
|
||
minMatchPos = matchPos
|
||
end
|
||
end
|
||
|
||
end
|
||
:: CONTINUE ::
|
||
end
|
||
if firstMatchIndex then
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_MATCH_EFFECT, EffectInfo[firstMatchIndex])
|
||
return
|
||
end
|
||
end
|
||
|
||
-- 权重随机算法(输入:权重数组 输出:加权后的随机index)
|
||
function XChatManager.WeightRandomSelect(weights)
|
||
local sum = 0
|
||
for i = 1, #weights do
|
||
sum = sum + weights[i]
|
||
end
|
||
math.randomseed(os.time())
|
||
local compareWeight = math.random(1, sum)
|
||
local weightIndex = 1
|
||
while sum > 0 do
|
||
sum = sum - weights[weightIndex]
|
||
if sum < compareWeight then
|
||
return weightIndex
|
||
end
|
||
weightIndex = weightIndex + 1
|
||
end
|
||
XLog.Error("compare error, return nil")
|
||
return nil
|
||
end
|
||
|
||
-- 设置特效播放完毕的时间
|
||
function XChatManager.SetEffectEnd(time)
|
||
LastEffectCoolTime = time or XTime.GetServerNowTimestamp()
|
||
end
|
||
|
||
-- 设置最后一次读消息的时间
|
||
function XChatManager.SetChatRead(type)
|
||
local key = string.format("%s%d" ,XChatConfigs.KEY_LAST_READ_CHAT_TIME, type)
|
||
if next(ChatList[type]) then
|
||
LastReadChatTime[type] = ChatList[type][1].CreateTime
|
||
else
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
LastReadChatTime[type] = nowTime
|
||
-- XLog.Warning("nowTime",XTime.TimestampToLocalDateTimeString(nowTime),type)
|
||
end
|
||
XSaveTool.SaveData(key, LastReadChatTime[type])
|
||
end
|
||
|
||
-- 获取未读信息数量
|
||
function XChatManager.GetUnreadChatCount(type)
|
||
local count = 0
|
||
local chatList = XChatManager.GetChatList(type)
|
||
if not (chatList and next(chatList)) then
|
||
return count
|
||
end
|
||
for i = 1, #chatList do
|
||
local chat = chatList[i]
|
||
if chat.CreateTime > LastReadChatTime[type] then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
function XChatManager.CheckRedPointByType(type)
|
||
-- return XChatManager.GetUnreadChatCount(type) > 0
|
||
local chatList = XChatManager.GetChatList(type)
|
||
if not (chatList and next(chatList)) then
|
||
return false
|
||
end
|
||
-- 除了好友消息,其他类型都是将最新消息插入到表头
|
||
-- XLog.Warning(chatList)
|
||
-- XLog.Warning(type, chatList[1].CreateTime > LastReadChatTime[type], chatList[1].CreateTime, XTime.TimestampToLocalDateTimeString(LastReadChatTime[type]),XTime.TimestampToLocalDateTimeString(chatList[1].CreateTime))
|
||
return chatList[1].CreateTime > LastReadChatTime[type]
|
||
end
|
||
|
||
function XChatManager.GetLatestChatData(type)
|
||
if type then
|
||
return ChatList[type][1]
|
||
else
|
||
-- 默认返回最后一次公会或者世界聊天内容
|
||
local worldMsg = ChatList[ChatChannelType.World][1]
|
||
local guildMsg = ChatList[ChatChannelType.Guild][1]
|
||
local latestMsg
|
||
local latestTime = 0
|
||
if guildMsg then
|
||
latestMsg = guildMsg
|
||
latestTime = guildMsg.CreateTime
|
||
end
|
||
if worldMsg and worldMsg.CreateTime > latestTime then
|
||
latestMsg = worldMsg
|
||
latestTime = worldMsg.CreateTime
|
||
end
|
||
return latestMsg
|
||
end
|
||
end
|
||
|
||
-- 删除上一个公会的聊天缓存
|
||
function XChatManager.DeleteLastGuildChatContent(lastGuildId)
|
||
if XDataCenter.GuideManager.IsJoinGuild() then
|
||
local guildId = XDataCenter.GuildManager.GetGuildId()
|
||
if guildId == lastGuildId then return end
|
||
end
|
||
local lastGuildKey = XDataCenter.GuildManager.GetGuildChannelKey(lastGuildId)
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(lastGuildKey) then
|
||
CS.UnityEngine.PlayerPrefs.DeleteKey(lastGuildKey)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
end
|
||
|
||
--存储指定好友的聊天内容
|
||
function XChatManager.SaveSpecifyFriendsChatContent(friendId)
|
||
local chatList = XChatManager.GetPrivateDynamicList(friendId)
|
||
if chatList == nil or #chatList == 0 then
|
||
return
|
||
end
|
||
local saveContent = ''
|
||
for index = 1, #chatList do
|
||
local chat = chatList[index]
|
||
if chat ~= nil and type(chat) == 'table' then
|
||
saveContent = saveContent .. chat.SenderId .. '\t'
|
||
saveContent = saveContent .. chat.TargetId .. '\t'
|
||
saveContent = saveContent .. chat.CreateTime .. '\t'
|
||
saveContent = saveContent .. chat.Content .. '\t'
|
||
saveContent = saveContent .. chat.MsgType .. "\t"
|
||
saveContent = saveContent .. tostring(chat.GiftId) .. "\t"
|
||
saveContent = saveContent .. tostring(chat.GiftCount) .. "\t"
|
||
saveContent = saveContent .. tostring(chat.GiftStatus) .. "\t"
|
||
saveContent = saveContent .. (chat.IsRead and "1" or "0") .. "\t"
|
||
saveContent = saveContent .. (chat.CustomContent or "") .. "\n"
|
||
end
|
||
end
|
||
if saveContent ~= nil and saveContent ~= '' then
|
||
local key = string.format(ChatRecordTag, friendId, XPlayer.Id)
|
||
CS.UnityEngine.PlayerPrefs.SetString(key, saveContent)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
end
|
||
|
||
--清除指定好友的聊天内容
|
||
function XChatManager.ClearFriendChatContent(friendId)
|
||
local key = string.format(ChatRecordTag, friendId, XPlayer.Id)
|
||
PrivateChatMap[friendId] = nil
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
CS.UnityEngine.PlayerPrefs.DeleteKey(key)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
end
|
||
|
||
--获取所有私聊信息
|
||
function XChatManager.GetAllPrivateChatMsgCount()
|
||
|
||
if not PrivateChatMap then
|
||
return 0
|
||
end
|
||
local count = 0
|
||
for _, v in pairs(PrivateChatMap) do
|
||
local info = v
|
||
if (info and info.ChatMap) then
|
||
for _, chat in pairs(info.ChatMap) do
|
||
if (not chat.IsRead) then
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
function XChatManager.CheckCd()
|
||
if LastChatCoolTime > 0 and LastChatCoolTime + CHAT_INTERVAL_TIME > XTime.GetServerNowTimestamp() then
|
||
XUiManager.TipCode(XCode.ChatManagerRefreshTimeCooling)
|
||
return false
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
--发送聊天
|
||
function XChatManager.SendChat(chatData, cb)
|
||
XNetwork.Call(MethodName.SendChat, { ChatData = chatData, TargetIdList = chatData.TargetIds }, function(response)
|
||
LastChatCoolTime = response.RefreshTime
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
|
||
if chatData.ChannelType == ChatChannelType.World then
|
||
if cb then
|
||
cb(CHAT_INTERVAL_TIME + LastChatCoolTime - XTime.GetServerNowTimestamp(), response.ChatData)
|
||
end
|
||
end
|
||
return
|
||
end
|
||
|
||
if cb then
|
||
cb(CHAT_INTERVAL_TIME + LastChatCoolTime - XTime.GetServerNowTimestamp(), response.ChatData)
|
||
end
|
||
end)
|
||
end
|
||
|
||
--收取单个礼物
|
||
function XChatManager.GetGift(giftId, callback)
|
||
callback = callback or function() end
|
||
|
||
XNetwork.Call(MethodName.GetGift, { GiftId = giftId or 0 }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
callback(response.RewardGoodsList)
|
||
end)
|
||
end
|
||
|
||
--群收礼物
|
||
function XChatManager.GetAllGiftsRequest(callback)
|
||
if not XChatManager.CheckHasGift() then
|
||
XUiManager.TipError(CS.XTextManager.GetText("ChatManagerGetGiftNotGift"))
|
||
return
|
||
end
|
||
XNetwork.Call(MethodName.GetAllGiftsRequest, nil, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
if #response.RewardGoodsList <= 0 then
|
||
XUiManager.TipError(CS.XTextManager.GetText("ChatManagerGetGiftNotGift"))
|
||
return
|
||
end
|
||
if callback then
|
||
callback(response.GiftInfoList, response.RewardGoodsList)
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 离线消息
|
||
function XChatManager.GetOfflineMessageRequest(msgId, cb)
|
||
XNetwork.Call(MethodName.GetOfflineMessageRequest, { MessageId = msgId }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
-- 处理离线的消息
|
||
XChatManager.HandleOfflineMessage(response.Messages)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XChatManager.HandleOfflineMessage(offlineMessages)
|
||
if not offlineMessages then return end
|
||
|
||
local lastChatData = nil
|
||
local earliestChatTime = XMath.IntMax()
|
||
for _, chatData in pairs(offlineMessages) do
|
||
XChatManager.ProcessExtraContent(chatData)
|
||
XChatManager.OnSynChat(chatData, true)
|
||
if earliestChatTime < chatData.CreateTime then
|
||
earliestChatTime = chatData.CreateTime
|
||
end
|
||
lastChatData = chatData
|
||
end
|
||
|
||
for _, type in ipairs(ChatChannelType) do
|
||
if earliestChatTime < LastReadChatTime[type] then
|
||
LastReadChatTime[type] = earliestChatTime
|
||
local key = string.format("%s%d" ,XChatConfigs.KEY_LAST_READ_CHAT_TIME, type)
|
||
XSaveTool.SaveData(key, LastReadChatTime[type])
|
||
end
|
||
end
|
||
|
||
-- 只在最后检查一次红点
|
||
if lastChatData then
|
||
local data = XChatData.New(lastChatData)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, data)
|
||
end
|
||
end
|
||
|
||
function XChatManager.UpdateLocalOfflineRecord(messageId)
|
||
if messageId > MessageId then
|
||
MessageId = messageId
|
||
local key = string.format("%s%s", OfflineMessageTag, tostring(XPlayer.Id))
|
||
CS.UnityEngine.PlayerPrefs.SetInt(key, MessageId)
|
||
CS.UnityEngine.PlayerPrefs.Save()
|
||
end
|
||
|
||
end
|
||
|
||
function XChatManager.GetLocalOfflineRecord()
|
||
local key = string.format("%s%s", OfflineMessageTag, tostring(XPlayer.Id))
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
MessageId = CS.UnityEngine.PlayerPrefs.GetInt(key, MessageId)
|
||
end
|
||
return MessageId
|
||
end
|
||
|
||
-- 【聊天分频道】
|
||
function XChatManager.GetCurrentChatChannelId()
|
||
return CurrentChatChannelId
|
||
end
|
||
|
||
-- 切换聊天频道
|
||
function XChatManager.SelectChatChannel(channelId, succeedCb, failedCb)
|
||
if channelId == CurrentChatChannelId then return end
|
||
|
||
XNetwork.Call(MethodName.SelectChatChannelRequest, { ChannelId = channelId - 1 }, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
if failedCb then
|
||
failedCb()
|
||
end
|
||
return
|
||
end
|
||
CurrentChatChannelId = channelId
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_CHANNEL_CHANGED)
|
||
if succeedCb then
|
||
succeedCb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 登录初始化聊天频道
|
||
function XChatManager.InitChatChannel()
|
||
XNetwork.Call(MethodName.EnterWorldChatRequest, {}, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
CurrentChatChannelId = response.ChannelId + 1
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_CHANNEL_CHANGED)
|
||
end)
|
||
end
|
||
local RecruitChannelId = -1
|
||
-- 获取频道消息
|
||
function XChatManager.GetWorldChannelInfos(cb)
|
||
XNetwork.Call(MethodName.GetWorldChannelInfoRequest, {}, function(response)
|
||
if response.Code ~= XCode.Success then
|
||
XUiManager.TipCode(response.Code)
|
||
return
|
||
end
|
||
|
||
ChatChannelInfos = response.ChannelInfos
|
||
local lastIndex = #ChatChannelInfos
|
||
for index, v in pairs(ChatChannelInfos) do
|
||
v.ChannelId = v.ChannelId + 1
|
||
if index == lastIndex then v.IsRecruitChannel = true end
|
||
end
|
||
RecruitChannelId = lastIndex
|
||
if cb then
|
||
cb(ChatChannelInfos)
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XChatManager.GetRecruitChannelId()
|
||
return RecruitChannelId
|
||
end
|
||
|
||
function XChatManager.GetAllChannelInfos()
|
||
return ChatChannelInfos
|
||
end
|
||
|
||
function XChatManager.OnChatChannelChanged(notifyData)
|
||
if not notifyData then return end
|
||
local notifyChannelId = notifyData.ChannelId + 1
|
||
if CurrentChatChannelId ~= notifyChannelId then
|
||
CurrentChatChannelId = notifyChannelId
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_SERVER_CHANNEL_CHANGED, notifyChannelId)
|
||
end
|
||
end
|
||
|
||
function XChatManager.UpdateGiftResetTime(resetTime)
|
||
TodayResetTime = resetTime
|
||
end
|
||
|
||
function XChatManager.CheckHasGift()
|
||
for _, chatInfo in pairs(PrivateChatMap) do
|
||
for _, chat in pairs(chatInfo.ChatMap) do
|
||
if chat.MsgType == ChatMsgType.Gift and chat.GiftStatus == ChatGiftState.WaitReceive and chat.SenderId ~= XPlayer.Id then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
function XChatManager.UpdateGiftStatus()
|
||
for _, chatInfo in pairs(PrivateChatMap) do
|
||
for _, chat in pairs(chatInfo.ChatMap) do
|
||
if TodayResetTime > 0
|
||
and chat.MsgType == ChatMsgType.Gift
|
||
and chat.GiftStatus == ChatGiftState.WaitReceive
|
||
and chat.CreateTime < (TodayResetTime - ONE_DAY_SECONDS) then
|
||
chat.GiftStatus = ChatGiftState.Fetched
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 创建礼物文本
|
||
function XChatManager.CreateGiftTips(chatData)
|
||
if not chatData then
|
||
return ""
|
||
end
|
||
|
||
-- 发礼物提示
|
||
if chatData.GiftStatus == ChatGiftState.WaitReceive then
|
||
if chatData.SenderId == XPlayer.Id then
|
||
local friend = XDataCenter.SocialManager.GetFriendInfo(chatData.TargetId)
|
||
if friend then
|
||
local name = XDataCenter.SocialManager.GetPlayerRemark(chatData.TargetId, chatData.NickName)
|
||
return CS.XTextManager.GetText("GiftMoneySendNotReceive", name, chatData.GiftCount)
|
||
end
|
||
else
|
||
local name = XDataCenter.SocialManager.GetPlayerRemark(chatData.SenderId, chatData.NickName)
|
||
return CS.XTextManager.GetText("GiftMoneyReceiveNotReceive", name, chatData.GiftCount)
|
||
end
|
||
-- 领礼物提示
|
||
elseif chatData.GiftStatus == ChatGiftState.Received then
|
||
-- 自己领礼物
|
||
if chatData.SenderId ~= XPlayer.Id then
|
||
local friend = XDataCenter.SocialManager.GetFriendInfo(chatData.SenderId)
|
||
local name = XDataCenter.SocialManager.GetPlayerRemark(chatData.SenderId, chatData.NickName)
|
||
if friend then
|
||
return CS.XTextManager.GetText("GiftMoneyReceiveHaveReceive", name, chatData.GiftCount)
|
||
else
|
||
return CS.XTextManager.GetText("GiftMoneyReceiveHaveReceive", "", chatData.GiftCount)
|
||
end
|
||
else
|
||
-- 别人领礼物
|
||
local friend = XDataCenter.SocialManager.GetFriendInfo(chatData.TargetId)
|
||
local name = XDataCenter.SocialManager.GetPlayerRemark(chatData.TargetId, chatData.NickName)
|
||
if friend then
|
||
return CS.XTextManager.GetText("GiftMoneySendHaveReceive", name, chatData.GiftCount)
|
||
end
|
||
end
|
||
end
|
||
return ""
|
||
end
|
||
|
||
function XChatManager.ProcessExtraContent(chatData)
|
||
if not chatData then
|
||
return
|
||
end
|
||
|
||
local customContent = XMessagePack.Decode(chatData.CustomContent)
|
||
if not customContent then
|
||
return
|
||
end
|
||
|
||
if string.find(chatData.Content, "room") then
|
||
chatData.Content = string.gsub(chatData.Content, "room", customContent)
|
||
end
|
||
end
|
||
|
||
function XChatManager.NotifyChatMessage(chatData)
|
||
XChatManager.ProcessExtraContent(chatData)
|
||
XChatManager.OnSynChat(chatData)
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_MSG_SYNC)
|
||
end
|
||
|
||
function XChatManager.NotifyPrivateChat(chatData)
|
||
if not chatData or not chatData.ChatMessages then
|
||
return
|
||
end
|
||
|
||
if XDataCenter.SocialManager.GetBlackData(chatData.SenderId) then
|
||
return
|
||
end
|
||
|
||
local lastChatMsg
|
||
for _, chatMsg in ipairs(chatData.ChatMessages) do
|
||
lastChatMsg = XChatData.New(chatMsg)
|
||
XChatManager.ProcessExtraContent(chatMsg)
|
||
XChatManager.OnSynChat(chatMsg, true)
|
||
end
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_MSG_SYNC)
|
||
|
||
if lastChatMsg then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, lastChatMsg)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_PRIVATECHAT, lastChatMsg)
|
||
end
|
||
end
|
||
|
||
function XChatManager.NotifyWorldChat(chatData)
|
||
if not chatData or not chatData.ChatMessages then
|
||
return
|
||
end
|
||
local lastChatMsg
|
||
for _, chatMsg in ipairs(chatData.ChatMessages) do
|
||
if not XDataCenter.SocialManager.GetBlackData(chatMsg.SenderId) then
|
||
XChatManager.ProcessExtraContent(chatMsg)
|
||
lastChatMsg = XChatData.New(chatMsg)
|
||
HandleWorldChat(lastChatMsg)
|
||
end
|
||
end
|
||
|
||
if lastChatMsg then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, lastChatMsg)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_WORLD_MSG, lastChatMsg)
|
||
end
|
||
end
|
||
|
||
function XChatManager.NotifyMentorChat(chatData)
|
||
if not chatData or not chatData.ChatMessages then
|
||
return
|
||
end
|
||
local lastChatMsg
|
||
for _, chatMsg in ipairs(chatData.ChatMessages) do
|
||
XChatManager.ProcessExtraContent(chatMsg)
|
||
lastChatMsg = XChatData.New(chatMsg)
|
||
HandleMentorChat(lastChatMsg)
|
||
end
|
||
|
||
if lastChatMsg then
|
||
XEventManager.DispatchEvent(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, lastChatMsg)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_CHAT_RECEIVE_MENTOR_MSG, lastChatMsg)
|
||
end
|
||
end
|
||
|
||
function XChatManager.NotifyChatEmoji(emojiData)
|
||
if not emojiData.Emoji then
|
||
return
|
||
end
|
||
|
||
EmojiDatasDic[emojiData.Emoji.Id] = XChatEmoji.New(emojiData.Emoji)
|
||
end
|
||
|
||
function XChatManager.NotifyChatLoginData(loginData)
|
||
TodayResetTime = loginData.RefreshTime
|
||
|
||
for __, v in pairs(loginData.UnlockEmojis) do
|
||
EmojiDatasDic[v.Id] = XChatEmoji.New(v)
|
||
end
|
||
end
|
||
|
||
XChatManager.Init()
|
||
return XChatManager
|
||
end
|
||
|
||
--同步聊天
|
||
XRpc.NotifyChatMessage = function(chatData)
|
||
XDataCenter.ChatManager.NotifyChatMessage(chatData)
|
||
end
|
||
|
||
XRpc.NotifyPrivateChat = function(chatData)
|
||
XDataCenter.ChatManager.NotifyPrivateChat(chatData)
|
||
end
|
||
|
||
XRpc.NotifyTodayGiftResetTime = function(notifyData)
|
||
XDataCenter.ChatManager.UpdateGiftResetTime(notifyData.ResetTime)
|
||
end
|
||
|
||
XRpc.NotifyWorldChat = function(chatData)
|
||
XDataCenter.ChatManager.NotifyWorldChat(chatData)
|
||
end
|
||
|
||
XRpc.NotifyMentorChat = function(chatData)
|
||
XDataCenter.ChatManager.NotifyMentorChat(chatData)
|
||
end
|
||
|
||
-- 聊天频道切换
|
||
XRpc.NotifyChatChannelChange = function(notifyData)
|
||
XDataCenter.ChatManager.OnChatChannelChanged(notifyData)
|
||
end
|
||
|
||
XRpc.NotifyChatLoginData = function(loginData)
|
||
XDataCenter.ChatManager.NotifyChatLoginData(loginData)
|
||
end
|
||
|
||
XRpc.NotifyChatEmoji = function(emojiData)
|
||
XDataCenter.ChatManager.NotifyChatEmoji(emojiData)
|
||
end |