using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using Sog.Service;
using ProtoCSStruct;
namespace Name
{
//每个Task需要一个Handler,一个Handler一个DBOperator
public class MessageTaskHandler
{
private NameOperator m_nameOperator;
private long m_lastKeepMysqlConnTimeSecond;
//自管理
private static MessageTaskHandler[] m_allTaskHandler;
public static void InitAllTaskHandler()
{
//分配消息任务,线程数量=表的数量,免得冲突
uint iTaskCount = (uint)NameUtils.DBServerWorkThreadCount;
TraceLog.Debug("MessageTaskHandler.InitAllHandler messageTaskCount is {0}", iTaskCount);
MessageTaskDistributor.Instance.InitTask(iTaskCount);
//配置文件
NameServerConfig serverConfig = NameServerUtils.GetServerConfig();
m_allTaskHandler = new MessageTaskHandler[iTaskCount];
for (int i = 0; i < m_allTaskHandler.Length; i++)
{
m_allTaskHandler[i] = new MessageTaskHandler();
m_allTaskHandler[i].m_nameOperator = new NameOperator(serverConfig.dbname, serverConfig.dbip
, serverConfig.dbuser, serverConfig.dbpassword);
MessageTaskObj taskObj = MessageTaskDistributor.Instance.GetTaskByIndex(i);
taskObj.Handler = m_allTaskHandler[i].HandlerPacket;
taskObj.IdleTick = m_allTaskHandler[i].OnIdleTick;
}
MessageTaskDistributor.Instance.StartAllTask();
}
public static void DisposeAllHandler()
{
//关闭所有消息处理任务
MessageTaskDistributor.Instance.CloseAllTask();
if (m_allTaskHandler == null)
{
return;
}
//销毁数据库连接,销毁对象
for (int i = 0; i < m_allTaskHandler.Length; i++)
{
m_allTaskHandler[i].m_nameOperator.Dispose();
m_allTaskHandler[i].m_nameOperator = null;
}
m_allTaskHandler = null;
}
public void OnIdleTick(long idleSecond)
{
//5分钟保持连接一次
if(AppTime.GetNowSysSecond() - m_lastKeepMysqlConnTimeSecond < 300)
{
return;
}
m_lastKeepMysqlConnTimeSecond = AppTime.GetNowSysSecond();
m_nameOperator.KeepAlive();
}
public void HandlerPacket(uint remoteAppID, StructPacket packet)
{
//去掉这里的时间重置逻辑,如果下面实际处理逻辑里没有进行sql查询就返回会造成KeepAlive不执行
//m_lastKeepMysqlConnTimeSecond = AppTime.GetNowSysSecond();
switch (packet.MsgID)
{
case (int)SSMsgID.NameQueryReq:
OnQueryNameDBReq(remoteAppID, packet);
break;
case (int)SSMsgID.NameInsertReq:
OnInsertNameDBReq(remoteAppID, packet);
break;
default:
TraceLog.Error("MessageTaskHandler unknow MsgID {0}", packet.MsgID);
break;
}
}
//角色新创建的时候,检查角色名称是否已经存在
///
///
///
///
///
private void OnQueryNameDBReq(uint remoteAppID, StructPacket packet)
{
ref SSNameQueryReq nameQueryReq = ref packet.GetMessage();
string strName = nameQueryReq.StrName.GetString();
string hashName = HashHelper.SHA1String(strName+"_"+nameQueryReq.RealmId);
string accountID = nameQueryReq.AccountID.GetString();
SSNameQueryRes nameQueryRes = new SSNameQueryRes();
nameQueryRes.PlayerSessionID = nameQueryReq.PlayerSessionID;
nameQueryRes.StrName.SetString(strName);
nameQueryRes.HashName.SetString(hashName);
nameQueryRes.AccountID.SetString(accountID);
nameQueryRes.CreateIfNotExist = nameQueryReq.CreateIfNotExist;
nameQueryRes.RealmId = nameQueryReq.RealmId;
TraceLog.Debug("OnQueryNameDBReq strName {0} hashName {1} accountID {2}", strName, hashName, accountID);
tbName tbName = m_nameOperator.QueryName(hashName, nameQueryReq.RealmId);
if (tbName != null)
{
nameQueryRes.Count = 1;
TraceLog.Debug("query success, hashName is {0}", hashName);
nameQueryRes.Ret = 1;//存在
}
else if(nameQueryReq.CreateIfNotExist)//自动创建角色
{
//没有记录,则创建,大部分手游只有一个玩家角色信息(棋牌,卡牌,竞技游戏等等),直接创建user
TraceLog.Debug("no record, create it ");
//int accountTableIndex = TableIndexCalc.CalcNameTableIndex(0, hashName);
bool bSuccess = m_nameOperator.InsertName(
hashName
,strName
, accountID
, nameQueryReq.RealmId
);
if (!bSuccess)
{
nameQueryRes.Ret = -1;
//queryAccountDbReq.GameId = 0;
}
else
{
//queryAccountDbReq.GameId = gameId;
nameQueryRes.Ret = 0;//不存在,自动创建
}
}
else
{
TraceLog.Debug("OnQueryNameDBReq strName {0} hashName {1} not exist, config.CreateIfNotExist is false! "
, strName, hashName);
nameQueryRes.Ret = 0;//不存在
}
NameServerUtils.GetPacketSender().SendToServerByID(remoteAppID,
(int)SSMsgID.NameQueryRes, ref nameQueryRes, packet.ObjectID);
}
private void OnInsertNameDBReq(uint remoteAppID, StructPacket packet)
{
//ref SSNameInsertReq nameInsertReq = ref packet.GetMessage();
//string strName = nameInsertReq.StrName.GetString();
//string hashName = HashHelper.SHA1String(strName);
//string accountID = nameInsertReq.AccountID.GetString();
//SSNameInsertRes nameInsertRes = new SSNameInsertRes();
//nameInsertRes.StrName.SetString(strName);
//nameInsertRes.HashName.SetString(hashName);
//nameInsertRes.AccountID.SetString(accountID);
//TraceLog.Debug("OnInsertNameDBReq strName {0} hashName {1} accountID {2}", strName, hashName, accountID);
//tbName tbName = m_nameOperator.QueryName(hashName);
//if (tbName != null)
//{
// nameInsertRes.Ret = -1;
// TraceLog.Debug("query success, hashName is {0}", hashName);
//}
//else //自动创建角色
//{
// //没有记录,则创建,大部分手游只有一个玩家角色信息(棋牌,卡牌,竞技游戏等等),直接创建user
// TraceLog.Debug("OnInsertNameDBReq no record, create it ");
// int accountTableIndex = TableIndexCalc.CalcNameTableIndex(0, hashName);
// bool bSuccess = m_nameOperator.InsertName(
// hashName
// , strName
// , accountID
// );
// if (!bSuccess)
// {
// nameInsertRes.Ret = -1;
// //queryAccountDbReq.GameId = 0;
// }
// else
// {
// //queryAccountDbReq.GameId = gameId;
// }
//}
//NameServerUtils.GetPacketSender().SendToServerByID(remoteAppID,
// (int)SSMsgID.NameInsertRes, ref nameInsertRes, packet.ObjectID);
}
}
}