You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
5.3 KiB

1 month ago
/*
Sog
2016 by zouwei
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using ProtoCSStruct;
using Sog.Gate;
namespace Realmlist
{
public class RootMessageHandler : BaseReloadableService
{
private ServerApp m_app;
public override int GetServiceType()
{
return RealmlistServiceType.RootMessageHandler;
}
//销毁的时候置空
public override void Dispose()
{
m_app = null;
}
public RootMessageHandler(ServerApp app)
{
m_app = app;
}
public ServerApp GetApp()
{
return m_app;
}
public void HandlerMessage(uint remoteAppID, MessageData message)
{
int iServerType = ServerIDUtils.GetServerType(remoteAppID);
TraceLog.Trace("RootMessageHandler.HandlerMessage recv msg from server type {0} length {1}", iServerType, message.Header.Length);
HandlerOtherServerMessage(remoteAppID, message);
return;
}
private void HandlerOtherServerMessage(uint remoteAppID, MessageData message)
{
try
{
StructPacket packet;
bool result = RealmlistServerUtils.GetProtoPacker().UnpackMessage(message, out packet);
if (result)
{
//预先判断,提高效率
if (TraceLog.GetLogLevel() <= (int)Sog.Log.LogLevel.TraceDetail
&& TraceLog.IsSkipLogMsgID(packet.MsgID) == false)
{
// log message
TraceLog.TraceDetail("RootMessageHandler.HandlerOtherServerMessage recv message from server {0}, message type {1} length {2} : {3}->{4}"
, ServerIDUtils.IDToString(remoteAppID)
, message.Header.Type
, message.Header.Length
, packet.MessageName()
, packet.ToString());
}
int iServerType = ServerIDUtils.GetServerType(remoteAppID);
HandlerServerPacket(remoteAppID, packet);
}
}
catch (Exception ex)
{
TraceLog.Error("RootMessageHandler.HandlerOtherServerMessage Received from server:{0} error:{1}"
, ServerIDUtils.IDToString(remoteAppID), ex.Message);
//TraceLog.Exception(ex);
throw;
}
}
private void HandlerServerPacket(uint remoteAppID, StructPacket packet)
{
switch (packet.MsgID)
{
// CS消息是accountsvr转发过来的
case (int)CSMsgID.GameListReq:
RealmInfoHandler.OnClientGameListReq(remoteAppID, packet);
break;
case (int)SSMsgID.GameReportRealmlistReq:
RealmInfoHandler.OnGameWorldReport(remoteAppID, packet);
break;
case (int)SSMsgID.RealmBriefReq:
RealmInfoHandler.OnRealmBriefReq(remoteAppID, packet);
break;
case (int)SSMsgID.RealmAllbriefReq:
RealmInfoHandler.OnRealmAllBriefReq(remoteAppID, packet);
break;
case (int)SSMsgID.AllRealmReq:
RealmInfoHandler.OnAllRealmReq(remoteAppID, packet);
break;
case (int)SSMsgID.SsAddRealmReq:
RealmInfoHandler.OnSsAddRealmReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.AddServerTimeSync:
OnAddServerTimeSync(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmOperationReq:
RealmInfoHandler.OnRealmOperationReq(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmDbsaveRes:
RealmlistDBSvc.OnRealmDBCfgSaveRes(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmDbqueryRes:
RealmlistDBSvc.OnRealmCfgDBQueryRes(remoteAppID, packet);
break;
case (int)SSGameMsgID.OperationLimitReq:
LimitIPList.OpLimitIPList(remoteAppID,packet);
break;
case (int)SSMsgID.SsRealmNewPlayer:
RealmInfoHandler.SsRealmNewPlayer(remoteAppID, packet);
break;
default:
break;
}
}
private void OnAddServerTimeSync(uint remoteAppID, StructPacket packet)
{
ref SSAddServerTimeSync sync = ref packet.GetMessage<SSAddServerTimeSync>();
TraceLog.Debug("RootMessageHandler.OnAddServerTimeSync serverid {0} offset {1}"
, ServerIDUtils.IDToString(remoteAppID), sync.Offset);
RealmlistServerUtils.GetApp().Time.SetOffset(sync.Offset);
RealmlistServerUtils.GetApp().Time.UpdateTime();
TraceLog.Debug("RootMessageHandler.OnAddServerTimeSync serverid {0} offset {1} set time success"
, ServerIDUtils.IDToString(remoteAppID), sync.Offset);
}
}
}