135 lines
5.0 KiB
Lua
135 lines
5.0 KiB
Lua
|
|
local skynet = require "skynet"
|
|||
|
|
local oo = require "Class"
|
|||
|
|
local gameCmd = require "GameCmd"
|
|||
|
|
local json =require "json"
|
|||
|
|
local log = require "Log"
|
|||
|
|
local sqlUrl = require "SqlUrl"
|
|||
|
|
local errorInfo = require "ErrorInfo"
|
|||
|
|
local dataType = require "DataType"
|
|||
|
|
local serverId = tonumber(skynet.getenv "serverId")
|
|||
|
|
local redisKeyUrl = require "RedisKeyUrl"
|
|||
|
|
local serverManage = require "ServerManage"
|
|||
|
|
local personal = require "Personal"
|
|||
|
|
local partner = require "Partner"
|
|||
|
|
|
|||
|
|
local ChatManage = oo.class()
|
|||
|
|
ChatManage.OpType_Ban = 1 --开始禁言
|
|||
|
|
ChatManage.OpType_UnBan = 2 --取消禁言
|
|||
|
|
|
|||
|
|
--初始化
|
|||
|
|
function ChatManage:Init()
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--用户禁言
|
|||
|
|
function ChatManage:Ban( c2sData , s2cData )
|
|||
|
|
if not c2sData.account or not c2sData.opType then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
return s2cData
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local account = c2sData.account
|
|||
|
|
local opType = c2sData.opType
|
|||
|
|
local banTime = c2sData.banTime or 0
|
|||
|
|
banTime = banTime * 60
|
|||
|
|
|
|||
|
|
--获取用户数据库信息
|
|||
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|||
|
|
if not userDBInfo then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|||
|
|
return s2cData
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local dbIndex = userDBInfo.DBIndex
|
|||
|
|
local userId = userDBInfo.UserID
|
|||
|
|
local myPartnerId = userDBInfo.PartnerId
|
|||
|
|
local redisBanChatKey = string.format( redisKeyUrl.ChatManageBanChatTimeString, myPartnerId )
|
|||
|
|
|
|||
|
|
if self.OpType_Ban == opType then
|
|||
|
|
--设置禁言标记
|
|||
|
|
skynet.server.redis:set( redisBanChatKey , skynet.GetTime() + banTime )
|
|||
|
|
skynet.server.redis:expire( redisBanChatKey, banTime )
|
|||
|
|
|
|||
|
|
--清屏
|
|||
|
|
self:ClearScreen( account , myPartnerId )
|
|||
|
|
elseif self.OpType_UnBan == opType then
|
|||
|
|
skynet.server.redis:del( redisBanChatKey )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--用户清屏
|
|||
|
|
function ChatManage:Clear( c2sData , s2cData )
|
|||
|
|
|
|||
|
|
--验证登陆接口参数
|
|||
|
|
if not c2sData.account then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
return s2cData
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取用户数据库信息
|
|||
|
|
local account = c2sData.account
|
|||
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|||
|
|
if not userDBInfo then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|||
|
|
return s2cData
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local dbIndex = userDBInfo.DBIndex
|
|||
|
|
local userId = userDBInfo.UserID
|
|||
|
|
local myPartnerId = userDBInfo.PartnerId
|
|||
|
|
|
|||
|
|
--清屏
|
|||
|
|
self:ClearScreen( account , myPartnerId )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--清屏
|
|||
|
|
function ChatManage:ClearScreen( account , myPartnerId )
|
|||
|
|
--获取所有好友
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerPartnerMyFriendZSet , myPartnerId )
|
|||
|
|
local friendList = skynet.server.redis:zrange( redisKey , 0 , -1 )
|
|||
|
|
|
|||
|
|
--遍历每个好友
|
|||
|
|
for k, otherPartnerId in pairs( friendList ) do
|
|||
|
|
local msgRedisKey = skynet.server.partner:GetMsgKey( myPartnerId , otherPartnerId )
|
|||
|
|
local msgList = skynet.server.redis:zrange( msgRedisKey , 0 , -1 , "withscores" ) --将我与该好友的消息全部取出
|
|||
|
|
msgList = redisKeyUrl:CovertTable(msgList)
|
|||
|
|
|
|||
|
|
--遍历该好友的所有聊天记录
|
|||
|
|
for stringData , score in pairs( msgList ) do
|
|||
|
|
local msgData = json:decode( stringData )
|
|||
|
|
--被禁玩家发送的 并且文本消息 并且 ( isShowMsg为true 或者 isShowMsg为nil 才处理 )
|
|||
|
|
if msgData.sendPartnerId == myPartnerId and msgData.msgType == skynet.server.partner.MsgType_Text and ( msgData.isShowMsg or nil == msgData.isShowMsg ) then
|
|||
|
|
msgData.isShowMsg = false
|
|||
|
|
--先删除之前的数据,再把修改后的数据填充进去
|
|||
|
|
skynet.server.redis:zremrangebyscore( msgRedisKey , score, score)
|
|||
|
|
skynet.server.redis:zadd( msgRedisKey , score , json:encode(msgData))
|
|||
|
|
log.info(string.format("玩家 %s 成功清屏好友消息记录 %d", account , score ))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--遍历家园的聊天记录
|
|||
|
|
local groupId = skynet.server.personal:GetCurDetail( myPartnerId , "groupId" ) or ""
|
|||
|
|
if "" ~= groupId then
|
|||
|
|
local msgRedisKey = string.format( redisKeyUrl.GameServerGroupMsgRecordZSet , groupId )
|
|||
|
|
local msgList = skynet.server.redis:zrange( msgRedisKey, 0, -1, "withscores" )
|
|||
|
|
msgList = redisKeyUrl:CovertTable( msgList )
|
|||
|
|
|
|||
|
|
--遍历家园所有的聊天记录
|
|||
|
|
for stringData, score in pairs( msgList ) do
|
|||
|
|
local msgData = json:decode( stringData )
|
|||
|
|
|
|||
|
|
if msgData.sendPartnerId == myPartnerId and ( msgData.isShowMsg or nil == msgData.isShowMsg ) then
|
|||
|
|
msgData.isShowMsg = false
|
|||
|
|
--先删除之前的数据,再把修改后的数据填充进去
|
|||
|
|
skynet.server.redis:zremrangebyscore( msgRedisKey , score, score)
|
|||
|
|
skynet.server.redis:zadd( msgRedisKey , score , json:encode(msgData))
|
|||
|
|
log.info(string.format("玩家 %s 成功清屏家园消息记录 %d", account , score ))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.chatManage = ChatManage
|
|||
|
|
return ChatManage
|