公会系统:chat_manager.lua

管理员
```lua -- modules/chat_manager.lua -- 公会聊天管理器,处理聊天消息的发送、接收、存储等 local utils = require("core.utils") local class = require("core.class") local event = require("core.event") local moduleBase = require("core.module") local ChatManager = moduleBase.Module:extend("ChatManager") -- 聊天频道类型 local ChannelType = { WORLD = 0, -- 世界频道 GUILD = 1, -- 公会频道 PRIVATE = 2, -- 私聊 SYSTEM = 3 -- 系统消息 } -- 消息存储容量 local MAX_MESSAGE_COUNT = 100 function ChatManager:ctor(name) ChatManager.super.ctor(self, name) -- 消息存储(按频道分类) self.messages = { [ChannelType.WORLD] = {}, [ChannelType.GUILD] = {}, [ChannelType.PRIVATE] = {}, [ChannelType.SYSTEM] = {} } -- 当前选中的频道 self.currentChannel = ChannelType.GUILD -- 公会ID self.guildId = 0 -- 消息ID计数器 self.localMessageId = 0 -- 私聊会话 self.privateSessions = {} -- 敏感词过滤 self.sensitiveWords = {} -- 消息发送频率限制 self.sendInterval = 1 -- 发送间隔(秒) self.lastSendTime = 0 end function ChatManager:initialize() utils.print("初始化聊天管理器...") -- 加载敏感词库 self:LoadSensitiveWords() -- 注册事件监听 self:RegisterEvents() ChatManager.super.initialize(self) end function ChatManager:LoadSensitiveWords() -- 这里可以从配置文件或服务器加载敏感词 self.sensitiveWords = { "傻逼", "操", "他妈", "妈的", "废物", "垃圾", "死", "杀", "暴力", "色情" } end function ChatManager:RegisterEvents() -- 监听网络连接事件 event.on("NETWORK_CONNECTED", function() self:OnNetworkConnected() end) -- 监听新消息推送 event.on("CHAT_NEW_MESSAGE", function(chatMessage) self:OnNewMessage(chatMessage) end) -- 监听玩家登录成功事件 event.on("PLAYER_LOGIN_SUCCESS", function(playerInfo) self:OnPlayerLogin(playerInfo) end) end function ChatManager:OnNetworkConnected() utils.print("网络连接成功,拉取历史消息...") -- 拉取公会聊天历史 if self.guildId > 0 then self:RequestChatHistory(ChannelType.GUILD) end -- 拉取世界聊天历史 self:RequestChatHistory(ChannelType.WORLD) end function ChatManager:OnPlayerLogin(playerInfo) self.guildId = playerInfo.guild_id or 0 utils.print("玩家登录,公会ID: " .. self.guildId) if self.guildId > 0 then self:RequestChatHistory(ChannelType.GUILD) end end -- 发送聊天消息 function ChatManager:SendMessage(channelType, content, targetId, atUserIds) -- 检查网络连接 local networkManager = require("modules.network_manager") if not networkManager.getModule("NetworkManager"):IsConnected() then utils.print("未连接到服务器") return false, "网络未连接" end -- 检查发送频率 local currentTime = CS.UnityEngine.Time.time if currentTime - self.lastSendTime < self.sendInterval then local remainingTime = math.ceil(self.sendInterval - (currentTime - self.lastSendTime)) utils.print("发送过快,请等待" .. remainingTime .. "秒") return false, "发送过快" end -- 检查内容长度 if #content == 0 or #content > 200 then return false, "消息长度必须在1-200字符之间" end -- 敏感词过滤 local filteredContent, hasSensitiveWord = self:FilterSensitiveWords(content) if hasSensitiveWord then return false, "消息包含敏感词" end -- 构造请求消息 local request = { guild_id = self.guildId, type = channelType, content = filteredContent, target_id = targetId or 0, at_user_ids = atUserIds or {} } -- 发送请求 local networkModule = networkManager.getModule("NetworkManager") networkModule:SendRequest("guild.SendChat", request, function(result, message, data) if result == 0 then -- 发送成功 self.lastSendTime = CS.UnityEngine.Time.time local chatMessage = data.chat_message if chatMessage then self:AddMessage(chatMessage) event.emit("CHAT_SEND_SUCCESS", chatMessage) end else -- 发送失败 utils.print("发送消息失败: " .. message) event.emit("CHAT_SEND_FAILED", message) end end) return true end -- 拉取聊天历史 function ChatManager:RequestChatHistory(channelType, lastMessageId, count) local request = { guild_id = self.guildId, type = channelType, last_message_id = lastMessageId or 0, count = count or 20 } local networkManager = require("modules.network_manager") local networkModule = networkManager.getModule("NetworkManager") networkModule:SendRequest("guild.GetChatHistory", request, function(result, message, data) if result == 0 then local messages = data.messages or {} utils.print("拉取到" .. #messages .. "条历史消息") for i, chatMessage in ipairs(messages) do self:AddMessage(chatMessage) end event.emit("CHAT_HISTORY_LOADED", channelType, messages) else utils.print("拉取历史消息失败: " .. message) end end) end -- 添加消息到存储 function ChatManager:AddMessage(chatMessage) local channelType = chatMessage.type if not self.messages[channelType] then self.messages[channelType] = {} end -- 添加消息 table.insert(self.messages[channelType], chatMessage) -- 限制消息数量 if #self.messages[channelType] > MAX_MESSAGE_COUNT then table.remove(self.messages[channelType], 1) end -- 如果是私聊,记录会话 if channelType == ChannelType.PRIVATE then self:AddPrivateSession(chatMessage.sender_id, chatMessage.sender_name) end -- 派发新消息事件 event.emit("CHAT_MESSAGE_ADDED", chatMessage) end -- 获取指定频道的消息列表 function ChatManager:GetMessages(channelType) return self.messages[channelType] or {} end -- 获取当前频道的消息 function ChatManager:GetCurrentMessages() return self.messages[self.currentChannel] or {} end -- 切换频道 function ChatManager:SwitchChannel(channelType) if self.currentChannel == channelType then return end self.currentChannel = channelType utils.print("切换到频道: " .. self:GetChannelName(channelType)) event.emit("CHAT_CHANNEL_CHANGED", channelType) end -- 获取频道名称 function ChatManager:GetChannelName(channelType) local channelNames = { [ChannelType.WORLD] = "世界", [ChannelType.GUILD] = "公会", [ChannelType.PRIVATE] = "私聊", [ChannelType.SYSTEM] = "系统" } return channelNames[channelType] or "未知" end -- 添加私聊会话 function ChatManager:AddPrivateSession(userId, userName) if not self.privateSessions[userId] then self.privateSessions[userId] = { user_id = userId, user_name = userName, messages = {} } event.emit("CHAT_PRIVATE_SESSION_ADDED", self.privateSessions[userId]) end end -- 获取私聊会话列表 function ChatManager:GetPrivateSessions() local sessions = {} for userId, session in pairs(self.privateSessions) do table.insert(sessions, session) end return sessions end -- 获取与指定用户的私聊消息 function ChatManager:GetPrivateMessages(userId) if not self.privateSessions[userId] then return {} end return self.privateSessions[userId].messages end -- 敏感词过滤 function ChatManager:FilterSensitiveWords(content) local filtered = content local hasSensitiveWord = false for _, word in ipairs(self.sensitiveWords) do if string.find(filtered, word) then filtered = string.gsub(filtered, word, "***") hasSensitiveWord = true end end return filtered, hasSensitiveWord end -- 发送系统消息 function ChatManager:SendSystemMessage(content) local systemMessage = { message_id = self:GenerateMessageId(), sender_id = 0, sender_name = "系统", guild_id = 0, type = ChannelType.SYSTEM, content = content, timestamp = os.time() * 1000, level = 0, vip_level = 0, avatar = "" } self:AddMessage(systemMessage) event.emit("CHAT_SYSTEM_MESSAGE", systemMessage) end -- 生成本地消息ID function ChatManager:GenerateMessageId() self.localMessageId = self.localMessageId + 1 return self.localMessageId end -- 清空指定频道的消息 function ChatManager:ClearMessages(channelType) if self.messages[channelType] then self.messages[channelType] = {} end event.emit("CHAT_MESSAGES_CLEARED", channelType) end -- 处理新消息 function ChatManager:OnNewMessage(chatMessage) -- 检查是否需要提示 if chatMessage.type == ChannelType.PRIVATE then event.emit("CHAT_PRIVATE_MESSAGE_RECEIVED", chatMessage) elseif chatMessage.sender_id ~= self:GetPlayerId() then event.emit("CHAT_MENTION", chatMessage) end end -- 获取当前玩家ID function ChatManager:GetPlayerId() -- 从玩家管理器获取 local playerModule = require("modules.player_module") local playerManager = playerModule.getModule("PlayerModule") if playerManager then return playerManager:GetPlayerId() end return 0 end -- 获取当前频道 function ChatManager:GetCurrentChannel() return self.currentChannel end -- 发送@消息 function ChatManager:SendAtMessage(channelType, content, targetIds) return self:SendMessage(channelType, content, nil, targetIds) end -- 格式化消息时间 function ChatManager:FormatTime(timestamp) local time = timestamp / 1000 local hour = os.date("%H", time) local minute = os.date("%M", time) return hour .. ":" .. minute end -- 获取消息类型名称 function ChatManager:GetMessageTypeName(chatMessage) if chatMessage.type == ChannelType.WORLD then return "[世界]" elseif chatMessage.type == ChannelType.GUILD then return "[公会]" elseif chatMessage.type == ChannelType.PRIVATE then return "[私聊]" elseif chatMessage.type == ChannelType.SYSTEM then return "[系统]" end return "" end -- 导出常量 ChatManager.ChannelType = ChannelType return ChatManager ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧