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
|