公会系统: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
```