大大大_me05z 发表于 2019-9-7 09:43:03

西游H5聊天修复

西游H5聊天修复:s1\server\lua\logic\modules\chat
ChatCenter.lua
local server = require "server"
local lua_app = require "lua_app"
local lua_shield = require "lua_shield"
local lua_util = require "lua_util"
local ChatConfig = require "resource.ChatConfig"
local RaidConfig = require "resource.RaidConfig"
local utf8 = require("lua_utf8")
local ChatCenter = {}

local _ChatType = ChatConfig.ChatType
local _LinkId = ChatConfig.LinkId
local _MaxPrivateRecord = 20

function ChatCenter:Init()
      self.record = server.baseRecord:Ins(server.baseRecord.RecordType.WorldChat, server.configCenter.ChatConstConfig.saveChatListSize, true)
      self.systemrecord = server.baseRecord:Ins(server.baseRecord.RecordType.System, server.configCenter.ChatConstConfig.saveSystemChatcount, true)
      self.playerlist = {}
      self.privateChatRecord = {}
      self.offlineChat = {}
      self.playershareinfo = {}
      self.chatrecordOfbanned = {}
end

function ChatCenter:onDayTimer(player)
      self.playerlist = {}
end

function ChatCenter:onInitClient(player)
      local worlddatas = self.record:SendRecord(player)
      local systemdatas = self.systemrecord:SendRecord(player)
      server.sendReq(player, "sc_chat_init_msg", {
                        chatDatas = self:FilteChat(worlddatas, systemdatas)
                })
      self:PrivateOfflineChat(player)
end

--设置过滤名单
function ChatCenter:SetFilter(flag, playerid)
      if flag ~= 0 then
                server.broadcastReq("sc_chat_filte_list", {
                              filter = playerid,
                        })
      end
end

function ChatCenter:FilteChat(...)
      local arg = {...}
      local newchatdata = {}
      for __, chatdatas in ipairs(arg) do
                for __, chat in ipairs(chatdatas) do
                        if self:CheckFilteChat(chat.id) then
                              newchatdata[#newchatdata + 1] = chat
                        end
                end
      end
      return newchatdata
end

function ChatCenter:CheckFilteChat(dbid)
      if not dbid then return true end
      local player = server.playerCenter:DoGetPlayerByDBID(dbid)
      local status = player.cache.silent
      return status ~= -1 and status <= lua_app.now()
end

function ChatCenter:GetRecord(chattype)
      if chattype == server.baseRecord.RecordType.WorldChat or
                chattype == server.baseRecord.RecordType.WorldShare then
                return self.record
      else
                return self.systemrecord
      end
end

local function _CheckChatCount(sender, count)
      local ChatLevelConfig = server.configCenter.ChatLevelConfig
      local powerValue = sender.cache.totalpower
      local index = #ChatLevelConfig
      for i = #ChatLevelConfig, 1, -1 do
                local cfg = ChatLevelConfig
                if powerValue >= cfg.power then
                        index = i
                        if count < cfg.chatSize then
                              return true
                        elseif not ChatLevelConfig then
                              return false, cfg.errortips
                        else
                              return false, string.format(cfg.errortips, ChatLevelConfig.power)
                        end
                end
      end
      return false, ChatLevelConfig[#ChatLevelConfig].errortips
end

function ChatCenter:CheckAddCount(sender)
      local playerinfo = self.playerlist
      if not playerinfo then
                playerinfo = {
                        chatdaycount = 0,
                }
                self.playerlist = playerinfo
      end
      local nowtime = lua_app.now()
      local ChatConstConfig = server.configCenter.ChatConstConfig
      if not server.funcOpen:Check(sender, ChatConstConfig.openLevel) then
                server.sendErr(sender, "等级不足,不能发言")
                return false
      end
      local waittime = ChatConfig:GetWaitInterval("chat."..sender.dbid, ChatConstConfig.chatCd)
      if waittime > 0 then
                server.sendErr(sender, "聊天cd中")
                return false
      end
      local checkcountret, errmsg = _CheckChatCount(sender, playerinfo.chatdaycount)
      if not checkcountret then
                server.sendErr(sender, errmsg)
                return false
      end
      playerinfo.chatdaycount = playerinfo.chatdaycount + 1
      return true
end

local _Chatting = {}
_Chatting = function(self, sender, str, recvId, pointId)      -- 世界聊天
      if not self:CheckAddCount(sender) then
                return false
      end
      local data = {
                        type = _ChatType.WorldChat,
                        id = sender.dbid,
                        name = sender.cache.name,
                        vip = sender.cache.vip,
                        str = str,
                        job = sender.cache.job,
                        sex = sender.cache.sex,
                        headframe = sender.head:GetFrame(),
                        time = lua_app.now(),
                }
      --禁言玩家消息只有自己能看到
      if not self:CheckFilteChat(sender.dbid) then
                server.sendReq(sender, "sc_chat_new_msg", { chatData = data })
                return true
      end

      self.record:AddRecord(data)
      server.broadcastReq("sc_chat_new_msg", { chatData = data })
      sender.task:onEventAdd(server.taskConfig.ConditionType.ChatWorld)
      return true
end

_Chatting = function(self, sender, str, recvId)      -- 私聊
      local ret = server.friendCenter:ChatCheck(sender, recvId)
      if ret == 1 then
                server.sendErr(sender, "你屏蔽该玩家了")
                return
      elseif ret == 2 then
                server.sendErr(sender, "你被该玩家屏蔽了")
                return
      end
      local data = {
                        type = _ChatType.PrivateChat,
                        id = sender.dbid,
                        name = sender.cache.name,
                        vip = sender.cache.vip,
                        str = str,
                        job = sender.cache.job,
                        sex = sender.cache.sex,
                        frame = sender.head:GetFrame(),
                        time = lua_app.now(),
                }
      --禁言玩家消息只有自己能看到
      if not self:CheckFilteChat(sender.dbid) then
                server.sendReq(sender, "sc_chat_private_new_msg", {
                        session = self:GetPrivateChatId(sender.dbid, recvId),
                        chatData = data,
                })
                return true
      end

      local receiver = server.playerCenter:DoGetPlayerByDBID(recvId)
      self:AddPrivateChatRecord(sender, receiver, data)
      return true
end

function _StrRepeatCount(src, cond)
      return select(2, string.gsub(src, string.format("%s[^|]*", cond), ""))
end
--禁言检测
function ChatCenter:CheckBanned(dbid, chatstr)
      local ChatshutupConfig = server.configCenter.ChatshutupConfig
      local record = self.chatrecordOfbanned
      if not record then
                record = { nextindex = 1 }
                self.chatrecordOfbanned = record
      end
      local text = table.concat(record, "|")
      for __, str in ipairs(ChatshutupConfig.jlibrary) do
                if_StrRepeatCount(text, str) > ChatshutupConfig.zicount then
                        return true
                end
      end
      for __, str in ipairs(ChatshutupConfig.mlibrary) do
                if_StrRepeatCount(text, str) > ChatshutupConfig.shutupcount then
                        return true
                end
      end
      local count = 0
      for w in string.gmatch(text, "[^|]+") do
                if w == chatstr then
                        count = count + 1
                end
                if count > ChatshutupConfig.repeatcount then
                        return true
                end
      end
      
      local len = utf8.len(chatstr)
      if len >= ChatshutupConfig.count then
                record = chatstr
                record.nextindex = record.nextindex % ChatshutupConfig.historycount + 1
      end
      return false
end

function ChatCenter:Chat(sender, type, str, recvId)
      local status = sender.cache.silent
      if status ~= -1 and self:CheckBanned(sender.dbid, str) then
                sender.cache.silent = -1
                self:SetFilter(-1, sender.dbid)
                lua_app.log_info("CheckBanned:Prohibit players from chatting.", sender.dbid, sender.cache.name)
      end

      if status > lua_app.now() then
                server.sendErr(sender, "您已经被禁言,剩余时间" .. (status - lua_app.now()) .. "秒")
                return false
      end

      if string.len(str) >= server.configCenter.ChatConstConfig.chatLen then
                server.sendErr(sender, "字节太长,超过160个字节")
                return false
      end

      str = lua_shield:string(str)
      return _Chatting(self, sender, str, recvId)
end

local CheckLinkCondition = setmetatable({}, {__index = function()
      return function() return true end
end})

CheckLinkCondition = function(sender)
      local ChaptersCommonConfig = server.configCenter.ChaptersCommonConfig
      local appealtime = sender.cache.chapter.appealtime
      if appealtime >= ChaptersCommonConfig.appealtime then
                server.sendErr(sender, "当日求助次数达到上限")
                return false
      end
      return true
end

function ChatCenter:CheckChatLink(id, sender)
      if not CheckLinkCondition(sender) then
                return false
      end
      local waittime = ChatConfig:GetWaitInterval("CheckChatLink."..sender.dbid)
      if waittime > 0 then
                server.sendErr(sender, string.format("%d秒后才能发送", waittime))
                return false
      end
      local tips = ChatConfig.LinkTips or "发送成功"
      server.sendErr(sender, tips)
      return true
end

--param1 分享id, param2为玩家的id列表
function ChatCenter:ChatLink(shareid, sender, checkflag, ...)
      if checkflag then
                if not self:CheckChatLink(shareid, sender) then
                        return
                end
      end
      print("shareid", "--------------------------")
      local chatData = ChatConfig:PackLinkData(shareid, sender, ...)
      local record = self:GetRecord(chatData.type)
      record:AddRecord(chatData)
      server.broadcastReq("sc_chat_new_msg", {
                chatData = chatData
                })
      return true
end

--战斗通知
local _NoticeRaid = setmetatable({}, {__index = function() return function() end end})

_NoticeRaid = function(dbid, level)
      local GuildFubenConfig = server.configCenter.GuildFubenConfig
      local player = server.playerCenter:DoGetPlayerByDBID(dbid)
      player.guild:ChatLink(11, 0, {ChatConfig.CollectType.Fb, level, RaidConfig.type.GuildFb}, player.cache.name, GuildFubenConfig.uititle)
end

_NoticeRaid = function(dbid, level)
      local player = server.playerCenter:DoGetPlayerByDBID(dbid)
      server.chatCenter:ChatLink(14, player, nil, {ChatConfig.CollectType.Fb, level, RaidConfig.type.CrossTeamFb}, player.cache.name, level)
end

_NoticeRaid = function(dbid, level)
      local player = server.playerCenter:DoGetPlayerByDBID(dbid)
      local DisasterFbConfig = server.configCenter.DisasterFbConfig
      server.chatCenter:ChatLink(15, player, nil, {ChatConfig.CollectType.Fb, level, RaidConfig.type.EightyOneHard}, player.cache.name, DisasterFbConfig.name)
end

_NoticeRaid = function(dbid, level, guildid)
      local guild = server.guildCenter:GetGuild(guildid)
      if not guild then
                return
      end
      local chatdata = server.chatConfig:PackLinkData(8)
      guild.guildRecord:AddGuildChat(chatdata.str, nil, chatdata.share)
end

_NoticeRaid = function(dbid, level)
      server.chatCenter:ChatLink(13)
end

local _NoticeCheck = {}
function ChatCenter:NoticeFb(raidtype, dbid, level, ...)
      local recordkey = string.format("%s%s%s", raidtype, dbid, level)
      local waittime = ChatConfig:GetWaitInterval(recordkey)
      if waittime > 0 then return end
      _NoticeRaid(dbid, level, ...)
end

function ChatCenter:EmitTeamRecruit(dbid)
         local waittime = ChatConfig:GetWaitInterval(dbid)
         if waittime > 0 then
               server.sendErrByDBID(dbid, string.format("%d秒后才能招募", waittime))
      return false
    end
    server.sendErrByDBID(dbid, "招募成功")
    return true
end

function ChatCenter:AddPrivateChatRecord(sender, receiver, data)
      local session = self:GetPrivateChatId(sender.dbid, receiver.dbid)
      local records = self.privateChatRecord
      if not records then
                records = {}
                self.privateChatRecord = records
      end
      if #records > _MaxPrivateRecord then
                table.remove(records, 1)
      end
      table.insert(records, data)
      server.sendReq(sender, "sc_chat_private_new_msg", {
                        session = session,
                        chatData = data,
                })
      if receiver.isLogin then
                server.sendReq(receiver, "sc_chat_private_new_msg", {
                              session = session,
                              chatData = data,
                        })
      else
                local offlineChat = self.offlineChat
                if not offlineChat then
                        offlineChat = {}
                        self.offlineChat = offlineChat
                end
                offlineChat = true
      end
end

function ChatCenter:PrivateOfflineChat(player)
      local offlineChat = self.offlineChat
      if not offlineChat then
                return
      end
      for session,_ in pairs(offlineChat) do
                local records = self.privateChatRecord
                server.sendReq(player, "sc_chat_private_init_msg", {
                        session = session,
                        chatData = records,
                })
      end
      self.offlineChat = nil
end

function ChatCenter:PrivateChatStart(sender, recvId)
      local session = self:GetPrivateChatId(sender.dbid, recvId)
      local records = self.privateChatRecord
      if not records then
                records = {}
                self.privateChatRecord = records
      end
      server.sendReq(sender, "sc_chat_private_init_msg", {
                        session = session,
                        chatData = records,
                })
end

function ChatCenter:GetPrivateChatId(senderId, receiverId)
      return (senderId < receiverId and senderId ..":".. receiverId or receiverId ..":".. senderId)
end

function ChatCenter:ClearChat()
      self.record:ClearRecord()
end

function ChatCenter:ChatSysInfo(dbid, str)
      local player = server.playerCenter:DoGetPlayerByDBID(dbid)
      if player then
                local data = {
                              type = _ChatType.SysChat,
                              id = dbid,
                              name = player.cache.name,
                              vip = player.cache.vip,
                              str = str,
                              job = player.cache.job,
                              sex = player.cache.sex,
                              time = lua_app.now(),
                        }
                player:sendReq("sc_chat_new_msg", { chatData = data })
      end
end

function ChatCenter:BroadcastSysInfo(str)
      local data = {
                              type = _ChatType.SysChat,
                              id = 0,
                              name = player.cache.name,
                              vip = player.cache.vip,
                              str = str,
                              job = player.cache.job,
                              sex = player.cache.sex,
                              time = lua_app.now(),
                        }
      server.broadcastReq("sc_chat_new_msg", { chatData = data })
end

function ChatCenter:ResetServer()
      self.record:ClearRecord()
      self.systemrecord:ClearRecord()
      self.playerlist = {}
      self.privateChatRecord = {}
      self.offlineChat = {}
end

server.SetCenter(ChatCenter, "chatCenter")
return ChatCenter

页: [1]
查看完整版本: 西游H5聊天修复