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.
1088 lines
45 KiB
1088 lines
45 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using Sog;
|
|
using LitJson;
|
|
using SimpleHttpServer;
|
|
|
|
using Sog.Crypto;
|
|
using System.Web;
|
|
using ProtoCSStruct;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace Operation
|
|
{
|
|
public class SimpleRealm
|
|
{
|
|
public string areaName;
|
|
public int realmId;
|
|
public int openTime;
|
|
public int visibleTime;
|
|
public int bigRealmId;
|
|
}
|
|
|
|
public class RealmsObj
|
|
{
|
|
public string token;
|
|
public string type;
|
|
public SimpleRealm simpleRealm;
|
|
}
|
|
|
|
public class RealmInfo
|
|
{
|
|
public string businessName { get; set; }
|
|
public string areaName { get; set; }
|
|
public int worldId { get; set; }
|
|
public int realmId { get; set; }
|
|
public int logicWorldId { get; set; }
|
|
public string realmName { get; set; }
|
|
public int showSeq { get; set; }
|
|
public int status { get; set; }
|
|
public int visibleOnlyWhiteList { get; set; }
|
|
public string bdcName { get; set; }
|
|
public string openTime { get; set; }
|
|
public string visibleTime { get; set; }
|
|
public int bigRealmName { get; set; }
|
|
}
|
|
|
|
public class RealmCache
|
|
{
|
|
public long updateTime;
|
|
public string lastVersion;
|
|
public List<RealmBriefInfo> realmList;
|
|
public List<RealmBriefInfo> oriRealmList;
|
|
}
|
|
|
|
[MenuMapping(refc = typeof(ServerMonitor))]
|
|
public class Realm
|
|
{
|
|
private static long m_lastTickTime = 0;
|
|
public static RealmCache realmCache = new RealmCache();
|
|
public static Dictionary<int, int> realmIdDictory = new Dictionary<int, int>();
|
|
|
|
// 前端realm服务器管理
|
|
[RequestMapping("服务器区服管理",PermissionCode.SERVER_SELECT,true)]
|
|
public static int OnSelectRealmInfosHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
JsonData data = new JsonData();
|
|
Jsondata["data"] = data;
|
|
//data.Add("");
|
|
//data.Clear();
|
|
var svrData = OperationServerUtils.GetOperationServerData();
|
|
Dictionary<string, Dictionary<int, List<RealmBriefInfo>>> realmDic = new Dictionary<string, Dictionary<int, List<RealmBriefInfo>>>();
|
|
|
|
var realmOnlineInfo = OperationServerUtils.GetOperationServerData().m_allRealmOnlineInfo;
|
|
|
|
foreach (var realm in svrData.m_allRealm.Values)
|
|
{
|
|
if (!realmDic.ContainsKey(realm.areaName))
|
|
{
|
|
Dictionary<int, List<RealmBriefInfo>> m_tempDic = new Dictionary<int, List<RealmBriefInfo>>();
|
|
realmDic.Add(realm.areaName, m_tempDic);
|
|
}
|
|
|
|
if(!realmDic[realm.areaName].ContainsKey(realm.WorldId))
|
|
{
|
|
List<RealmBriefInfo> m_tempList = new List<RealmBriefInfo>();
|
|
realmDic[realm.areaName].Add(realm.WorldId, m_tempList);
|
|
}
|
|
|
|
realmDic[realm.areaName][realm.WorldId].Add(realm);
|
|
}
|
|
|
|
JsonData areaRealmList = new JsonData();
|
|
areaRealmList.Add("");
|
|
areaRealmList.Clear();
|
|
|
|
foreach (var itemArea in realmDic)
|
|
{
|
|
JsonData areaData = new JsonData();
|
|
areaData["areaName"] = itemArea.Key;
|
|
// 不存在
|
|
int timeZone = 10000;
|
|
JsonData worldList = new JsonData();
|
|
worldList.Add("");
|
|
worldList.Clear();
|
|
|
|
foreach (var item in itemArea.Value)
|
|
{
|
|
JsonData worldData = new JsonData();
|
|
worldData["worldId"] = item.Key;
|
|
JsonData realmList = new JsonData();
|
|
realmList.Add("");
|
|
realmList.Clear();
|
|
|
|
foreach (var realmItem in item.Value)
|
|
{
|
|
JsonData oneData = new JsonData();
|
|
|
|
oneData["realmId"] = realmItem.realmId;
|
|
oneData["realmName"] = realmItem.realmName;
|
|
oneData["logicWorldId"] = realmItem.logicWorldId;
|
|
oneData["status"] = realmItem.state;
|
|
oneData["bdcName"] = realmItem.realmBdcName;
|
|
oneData["openTime"] = realmItem.openTime;
|
|
oneData["visibleTime"] = realmItem.visibleTime;
|
|
oneData["bigRealmId"] = realmItem.bigRealmId;
|
|
oneData["ip"] = realmItem.ip;
|
|
oneData["regMax"] = realmItem.regMax;
|
|
|
|
if(realmOnlineInfo.ContainsKey(realmItem.realmId))
|
|
{
|
|
oneData["onlinePlayer"] = realmOnlineInfo[realmItem.realmId];
|
|
}
|
|
else
|
|
{
|
|
oneData["onlinePlayer"] = 0;
|
|
}
|
|
|
|
realmList.Add(oneData);
|
|
|
|
if (timeZone == 10000)
|
|
{
|
|
timeZone = realmItem.timeZone;
|
|
}
|
|
}
|
|
|
|
worldData["realmList"] = realmList;
|
|
worldList.Add(worldData);
|
|
}
|
|
|
|
areaData["timeZone"] = timeZone;
|
|
areaData["worldList"] = worldList;
|
|
|
|
areaRealmList.Add(areaData);
|
|
}
|
|
|
|
data["areaRealmList"] = areaRealmList;
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询所有区服列表",PermissionCode.SERVER_ALL_SELECT)]
|
|
public static int OnSelectAllRealmHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
JsonData data = new JsonData();
|
|
Jsondata["data"] = data;
|
|
|
|
var allRealmReq = new SSRealmAllBriefReq { GameSvrId = OperationServerUtils.GetAppID() };
|
|
allRealmReq.Guid = httpContextId;
|
|
OperationServerUtils.GetPacketSender().SendToRealmlistServer((int)SSMsgID.RealmAllbriefReq, ref allRealmReq, 0);
|
|
rsp.IsWaitFor = true;
|
|
|
|
Jsondata["ret"] = -1;
|
|
Jsondata["msg"] = "查询超时";
|
|
|
|
return -1;
|
|
}
|
|
|
|
public static void OnResMsg(uint guid, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, Dictionary<string, Dictionary<int, List<RealmBriefInfo>>> realmDic)
|
|
{
|
|
var realmOnlineInfo = OperationServerUtils.GetOperationServerData().m_allRealmOnlineInfo;
|
|
|
|
JsonData data = new JsonData();
|
|
jsondata["data"] = data;
|
|
|
|
JsonData areaRealmList = new JsonData();
|
|
areaRealmList.Clear();
|
|
|
|
foreach (var itemArea in realmDic)
|
|
{
|
|
JsonData areaData = new JsonData();
|
|
areaData["areaName"] = itemArea.Key;
|
|
// 不存在
|
|
int timeZone = 10000;
|
|
JsonData worldList = new JsonData();
|
|
worldList.Clear();
|
|
|
|
foreach (var item in itemArea.Value)
|
|
{
|
|
JsonData worldData = new JsonData();
|
|
worldData["worldId"] = item.Key;
|
|
JsonData realmList = new JsonData();
|
|
realmList.Clear();
|
|
|
|
foreach (var realmItem in item.Value)
|
|
{
|
|
JsonData oneData = new JsonData();
|
|
|
|
oneData["realmId"] = realmItem.realmId;
|
|
oneData["realmName"] = realmItem.realmName;
|
|
oneData["showSeq"] = realmItem.ShowSeq;
|
|
oneData["logicWorldId"] = realmItem.logicWorldId;
|
|
oneData["state"] = realmItem.state;
|
|
oneData["bdcName"] = realmItem.realmBdcName;
|
|
oneData["openTime"] = realmItem.openTime;
|
|
oneData["visibleTime"] = realmItem.visibleTime;
|
|
oneData["bigRealmId"] = realmItem.bigRealmId;
|
|
oneData["ip"] = realmItem.ip;
|
|
oneData["visibleOnlyWhiteList"] = realmItem.visibleOnlyWhiteList;
|
|
oneData["regMax"] = realmItem.regMax;
|
|
|
|
if (realmIdDictory.ContainsKey(realmItem.realmId))
|
|
{
|
|
realmIdDictory[realmItem.realmId] = realmItem.bigRealmId;
|
|
}
|
|
else
|
|
{
|
|
realmIdDictory.Add(realmItem.realmId, realmItem.bigRealmId);
|
|
}
|
|
|
|
if (realmOnlineInfo.ContainsKey(realmItem.realmId))
|
|
{
|
|
oneData["onlinePlayer"] = realmOnlineInfo[realmItem.realmId];
|
|
}
|
|
else
|
|
{
|
|
oneData["onlinePlayer"] = 0;
|
|
}
|
|
|
|
realmList.Add(oneData);
|
|
|
|
if (timeZone == 10000)
|
|
{
|
|
timeZone = realmItem.timeZone;
|
|
}
|
|
}
|
|
|
|
worldData["realmList"] = realmList;
|
|
worldList.Add(worldData);
|
|
}
|
|
|
|
areaData["timeZone"] = timeZone;
|
|
areaData["worldList"] = worldList;
|
|
|
|
areaRealmList.Add(areaData);
|
|
}
|
|
|
|
data["areaRealmList"] = areaRealmList;
|
|
|
|
jsondata["ret"] = 0;
|
|
}
|
|
|
|
[RequestMapping("添加区服",PermissionCode.ADD_NEW_REALM, toLog: true)]
|
|
public static int OnAddNewRealmHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
try
|
|
{
|
|
string areaName = query.GetValue("areaName");
|
|
string timezone = query.GetValue("timezone");
|
|
string ip = query.GetValue("ip");
|
|
string name = query.GetValue("realmName");
|
|
string bdcName = query.GetValue("bdcName");
|
|
string openTime = query.GetValue("openTime");
|
|
string visibleTime = query.GetValue("visibleTime");
|
|
|
|
int bigRealmId = query.GetValue("bigRealmId").Toint32();
|
|
int status = query.GetValue("status").Toint32();
|
|
int realmId = query.GetValue("realmId").Toint32();
|
|
int worldId = query.GetValue("worldId").Toint32();
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Jsondata["ret"] = 0;
|
|
Jsondata["msg"] = "操作成功";
|
|
TraceLog.Error("Realm.AddNewRealm error:{0}", e.Message);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询区服列表信息",PermissionCode.SELECT_REALM_LIST)]
|
|
public static int OnSelectRealmListHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
JsonData data = new JsonData();
|
|
Jsondata["data"] = data; data.Add(""); data.Clear();
|
|
JsonData worldIdList = new JsonData();
|
|
Jsondata["worldIdList"] = worldIdList; worldIdList.Add(""); worldIdList.Clear();
|
|
var svrData = OperationServerUtils.GetOperationServerData();
|
|
var startDate = query.GetValue("startDate");
|
|
var endDate = query.GetValue("endDate");
|
|
|
|
List<int> checkWorldIdList = new List<int>();
|
|
|
|
foreach (var m in svrData.m_allRealm.Values)
|
|
{
|
|
JsonData rdata = new JsonData();
|
|
rdata["id"] = m.realmId;
|
|
rdata["name"] = m.realmName;
|
|
rdata["worldId"] = m.WorldId;
|
|
|
|
if(!string.IsNullOrEmpty(startDate) && !string.IsNullOrEmpty(endDate))
|
|
{
|
|
int stareTimeStamp = OperationServerUtils.GetTimeStamp(DateTime.Parse(startDate));
|
|
int endTimeStamp = OperationServerUtils.GetTimeStamp(DateTime.Parse(endDate));
|
|
|
|
if(m.openTime < stareTimeStamp || m.openTime > endTimeStamp)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (!checkWorldIdList.Contains(m.WorldId))
|
|
{
|
|
checkWorldIdList.Add(m.WorldId);
|
|
worldIdList.Add(m.WorldId);
|
|
}
|
|
|
|
data.Add(rdata);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询服务器列表",PermissionCode.SELECT_SERVER_LIST,ignored:true)]
|
|
public static int OnSelectServerListHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
JsonData data = new JsonData();
|
|
Jsondata["data"] = data; data.Add(""); data.Clear();
|
|
|
|
var svrData = OperationServerUtils.GetOperationServerData();
|
|
|
|
foreach (var m in svrData.m_allRealm.Values)
|
|
{
|
|
JsonData rdata = new JsonData();
|
|
rdata["server_id"] = m.realmId;
|
|
rdata["server_name"] = m.realmName;
|
|
rdata["type"] = 3;
|
|
rdata["is_test"] = 0;
|
|
rdata["joined_id"] = 0;
|
|
|
|
data.Add(rdata);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询英雄区服列表信息",PermissionCode.SELECT_REALM_LIST_HERO,ignored:true)]
|
|
public static int OnSelectRealmlistHeroHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
JsonData data = new JsonData();
|
|
jsonData["data"] = data; data.Add(""); data.Clear();
|
|
var svrData = OperationServerUtils.GetOperationServerData();
|
|
|
|
foreach (var m in svrData.m_allRealm.Values)
|
|
{
|
|
JsonData rdata = new JsonData();
|
|
rdata["server_id"] = m.realmId;
|
|
rdata["server_name"] = m.realmName;
|
|
rdata["type"] = 3;
|
|
rdata["is_test"] = 0;
|
|
rdata["joined_id"] = 0;
|
|
data.Add(rdata);
|
|
}
|
|
|
|
jsonData["code"] = 0;
|
|
jsonData["msg"] = "success";
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询web支付",PermissionCode.SELECT_REALM_LIST_WEB_PAY,ignored:true)]
|
|
public static int OnSelectRealmlistWebPayHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
string sign = query.GetValue("sign");
|
|
TraceLog.Debug("Realm.OnSelectRealmlistWebPayHttpReq url:{0}", request.Url);
|
|
|
|
string reqData = HttpUtility.UrlDecode(query.GetValue("data"));
|
|
var allParams = new Dictionary<string, string>();
|
|
|
|
foreach (var item in query.m_map)
|
|
{
|
|
if (item.Key != "sign")
|
|
{
|
|
allParams[item.Key] = HttpUtility.UrlDecode(item.Value);
|
|
}
|
|
}
|
|
|
|
// 校验签名
|
|
string appKey = OperationServerUtils.GetServerConfig().heroAppKey;
|
|
string calcSign = HeroUSDKSecurity.CalcSign(appKey, allParams);
|
|
|
|
if (calcSign != sign)
|
|
{
|
|
TraceLog.Error("Realm.OnSelectRealmlistWebPayHttpReq sign not same, calc {0} req {1}", calcSign, sign);
|
|
jsonData["msg"] = "签名校验错误!";
|
|
jsonData["code"] = -1;
|
|
return -1;
|
|
}
|
|
|
|
JsonData data = new JsonData();
|
|
jsonData["data"] = data; data.Add(""); data.Clear();
|
|
var svrData = OperationServerUtils.GetOperationServerData();
|
|
|
|
SortedDictionary<int, string> ralemsDict = new SortedDictionary<int, string>();
|
|
|
|
foreach (var m in svrData.m_allRealm.Values)
|
|
{
|
|
int realmId = m.realmId;
|
|
if (realmId / 10000 != 80)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(realmId % 1000 == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
ralemsDict.Add(realmId, m.realmName);
|
|
}
|
|
|
|
foreach (var item in ralemsDict)
|
|
{
|
|
JsonData rdata = new JsonData();
|
|
rdata["server_id"] = item.Key;
|
|
rdata["server_name"] = item.Value;
|
|
data.Add(rdata);
|
|
}
|
|
|
|
jsonData["code"] = 0;
|
|
jsonData["msg"] = "success";
|
|
|
|
return 0;
|
|
}
|
|
|
|
[RequestMapping("查询区服",PermissionCode.SELECT_REALM)]
|
|
public static int OnSelectRecentRealmHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
string areaName = query.GetValue("areaName");
|
|
|
|
if (string.IsNullOrEmpty(areaName) || (areaName != "NA" && areaName != "EU" && areaName != "Asia"))
|
|
{
|
|
jsondata["ret"] = -2;
|
|
jsondata["msg"] = "服务器区名不符合要求";
|
|
return -2;
|
|
}
|
|
|
|
//内存中找到对应区域的数据,直接返回
|
|
if (realmCache.realmList != null && realmCache.realmList.Count != 0)
|
|
{
|
|
JsonData data = new JsonData();
|
|
jsondata["data"] = data; data.Add(""); data.Clear();
|
|
int timeZoneBeijing = 8;
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
if (realm.areaName == query.GetValue("areaName"))
|
|
{
|
|
int timeDistance = (timeZoneBeijing - realm.timeZone) * 60 * 60;
|
|
JsonData rdata = new JsonData();
|
|
rdata["realmId"] = realm.realmId;
|
|
rdata["name"] = realm.realmName;
|
|
rdata["showSeq"] = realm.realmId % 1000;
|
|
rdata["timeZone"] = realm.timeZone;
|
|
rdata["visibleOnlyWhiteList"] = realm.visibleOnlyWhiteList;
|
|
rdata["realmBdcName"] = realm.realmBdcName;
|
|
rdata["openTime"] = realm.openTime - timeDistance;
|
|
rdata["visibleTime"] = realm.visibleTime - timeDistance;
|
|
rdata["bigRealmId"] = realm.bigRealmId;
|
|
rdata["logicWorldId"] = realm.logicWorldId;
|
|
|
|
data.Add(rdata);
|
|
}
|
|
}
|
|
|
|
if (data.Count > 0)
|
|
{
|
|
jsondata["code"] = 0;
|
|
jsondata["msg"] = "success";
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
var realmReq = new SSAllRealmReq { GameSvrId = OperationServerUtils.GetAppID(),Guid = httpContextId };
|
|
realmReq.AreaName.SetString(areaName);
|
|
|
|
if (string.IsNullOrEmpty(realmCache.lastVersion))
|
|
{
|
|
realmReq.UpdateSvnFlag = true;
|
|
}
|
|
|
|
//发送消息
|
|
OperationServerUtils.GetPacketSender().SendToRealmlistServer((int)SSMsgID.AllRealmReq, ref realmReq, 0);
|
|
|
|
rsp.IsWaitFor = true;
|
|
|
|
jsondata["ret"] = -1;
|
|
jsondata["msg"] = "查询超时";
|
|
|
|
return -1;
|
|
}
|
|
|
|
[RequestMapping("运维添加区服",PermissionCode.RECENT_OPERATION_REALM, toLog: true)]
|
|
public static int OnSelectRecentOperationRealmHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
//内存中找到对应区域的数据,直接返回
|
|
JsonData data = new JsonData();
|
|
jsondata["data"] = data; data.Add(""); data.Clear();
|
|
int timeZoneBeijing = 8;
|
|
var realmListOperation = new List<RealmBriefOperationInfo>();
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
bool findFlag = false;
|
|
|
|
foreach (var oriRealm in realmCache.oriRealmList)
|
|
{
|
|
if (realm.realmId == oriRealm.realmId)
|
|
{
|
|
findFlag = true;
|
|
|
|
if (realm.openTime != oriRealm.openTime || realm.visibleTime != oriRealm.visibleTime || realm.bigRealmId != realm.bigRealmId)
|
|
{
|
|
var realmBriefOperationInfo = new RealmBriefOperationInfo();
|
|
|
|
realmBriefOperationInfo.realmId = realm.realmId;
|
|
realmBriefOperationInfo.areaName = realm.areaName;
|
|
realmBriefOperationInfo.realmName = realm.realmName;
|
|
realmBriefOperationInfo.realmBdcName = realm.realmBdcName;
|
|
realmBriefOperationInfo.timeZone = realm.timeZone;
|
|
realmBriefOperationInfo.WorldId = realm.WorldId;
|
|
realmBriefOperationInfo.openTime = realm.openTime;
|
|
realmBriefOperationInfo.visibleTime = realm.visibleTime;
|
|
realmBriefOperationInfo.bigRealmId = realm.bigRealmId;
|
|
realmBriefOperationInfo.logicWorldId = realm.logicWorldId;
|
|
realmBriefOperationInfo.operation = "edit";
|
|
|
|
realmListOperation.Add(realmBriefOperationInfo);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (findFlag == false)
|
|
{
|
|
var realmBriefOperationInfo = new RealmBriefOperationInfo();
|
|
|
|
realmBriefOperationInfo.realmId = realm.realmId;
|
|
realmBriefOperationInfo.areaName = realm.areaName;
|
|
realmBriefOperationInfo.realmName = realm.realmName;
|
|
realmBriefOperationInfo.realmBdcName = realm.realmBdcName;
|
|
realmBriefOperationInfo.timeZone = realm.timeZone;
|
|
realmBriefOperationInfo.WorldId = realm.WorldId;
|
|
realmBriefOperationInfo.openTime = realm.openTime;
|
|
realmBriefOperationInfo.visibleTime = realm.visibleTime;
|
|
realmBriefOperationInfo.bigRealmId = realm.bigRealmId;
|
|
realmBriefOperationInfo.logicWorldId = realm.logicWorldId;
|
|
realmBriefOperationInfo.operation = "add";
|
|
|
|
realmListOperation.Add(realmBriefOperationInfo);
|
|
}
|
|
}
|
|
|
|
foreach (var oriRealm in realmCache.oriRealmList)
|
|
{
|
|
bool findFlag = false;
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
if (realm.realmId == oriRealm.realmId)
|
|
{
|
|
findFlag = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (findFlag == false)
|
|
{
|
|
var realmBriefOperationInfo = new RealmBriefOperationInfo();
|
|
|
|
realmBriefOperationInfo.realmId = oriRealm.realmId;
|
|
realmBriefOperationInfo.areaName = oriRealm.areaName;
|
|
realmBriefOperationInfo.realmName = oriRealm.realmName;
|
|
realmBriefOperationInfo.realmBdcName = oriRealm.realmBdcName;
|
|
realmBriefOperationInfo.timeZone = oriRealm.timeZone;
|
|
realmBriefOperationInfo.WorldId = oriRealm.WorldId;
|
|
realmBriefOperationInfo.openTime = oriRealm.openTime;
|
|
realmBriefOperationInfo.visibleTime = oriRealm.visibleTime;
|
|
realmBriefOperationInfo.bigRealmId = oriRealm.bigRealmId;
|
|
realmBriefOperationInfo.logicWorldId = oriRealm.logicWorldId;
|
|
realmBriefOperationInfo.operation = "del";
|
|
|
|
realmListOperation.Add(realmBriefOperationInfo);
|
|
}
|
|
}
|
|
|
|
foreach (var realm in realmListOperation)
|
|
{
|
|
int timeDistance = (timeZoneBeijing - realm.timeZone) * 60 * 60;
|
|
JsonData rdata = new JsonData();
|
|
rdata["realmId"] = realm.realmId;
|
|
rdata["name"] = realm.realmName;
|
|
rdata["showSeq"] = realm.realmId % 1000;
|
|
rdata["timeZone"] = realm.timeZone;
|
|
rdata["visibleOnlyWhiteList"] = realm.visibleOnlyWhiteList;
|
|
rdata["realmBdcName"] = realm.realmBdcName;
|
|
rdata["openTime"] = realm.openTime - timeDistance;
|
|
rdata["visibleTime"] = realm.visibleTime - timeDistance;
|
|
rdata["bigRealmId"] = realm.bigRealmId;
|
|
rdata["operation"] = realm.operation;
|
|
rdata["logicWorldId"] = realm.logicWorldId;
|
|
|
|
data.Add(rdata);
|
|
}
|
|
|
|
jsondata["code"] = 0;
|
|
jsondata["msg"] = "success";
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static void OnResMsg(uint guid, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSAllRealmRes res)
|
|
{
|
|
JsonData data = new JsonData();
|
|
jsondata["data"] = data; data.Add(""); data.Clear();
|
|
|
|
var svrData = res.RealmList;
|
|
int timeBeijingZone = 8;
|
|
|
|
//内存中svn版本号为空,更新版本号
|
|
if (string.IsNullOrEmpty(realmCache.lastVersion))
|
|
{
|
|
realmCache.lastVersion = res.SvnRealmListVersion.ToString();
|
|
}
|
|
|
|
if (realmCache.realmList == null)
|
|
{
|
|
realmCache.realmList = new List<RealmBriefInfo>();
|
|
}
|
|
|
|
if (realmCache.oriRealmList == null)
|
|
{
|
|
realmCache.oriRealmList = new List<RealmBriefInfo>();
|
|
}
|
|
|
|
//从res中读取并更新到cache中
|
|
for (int i = svrData.Count - 1; i >= 0; i--)
|
|
{
|
|
if (svrData[i].AreaName.ToString() == query.GetValue("areaName"))
|
|
{
|
|
for (int j = 5; j >= 0; j--)
|
|
{
|
|
if (i - j >= 0 && svrData[i - j].AreaName.ToString() == query.GetValue("areaName"))
|
|
{
|
|
RealmBriefInfo realmBriefInfo = new RealmBriefInfo();
|
|
realmBriefInfo.timeZone = svrData[i - j].TimeZone;
|
|
realmBriefInfo.realmId = svrData[i - j].RealmId;
|
|
realmBriefInfo.areaName = svrData[i - j].AreaName.ToString();
|
|
realmBriefInfo.realmName = svrData[i - j].RealmName.ToString();
|
|
realmBriefInfo.realmBdcName = svrData[i - j].RealmBdcName.ToString();
|
|
realmBriefInfo.openTime = svrData[i - j].OpenTime;
|
|
realmBriefInfo.visibleTime = svrData[i - j].VisibleTime;
|
|
realmBriefInfo.visibleOnlyWhiteList = svrData[i - j].VisibleOnlyWhiteList;
|
|
realmBriefInfo.bigRealmId = svrData[i - j].BigRealmId;
|
|
realmBriefInfo.WorldId = svrData[i - j].WorldId;
|
|
realmBriefInfo.logicWorldId = svrData[i - j].LogicWorldId;
|
|
|
|
realmCache.realmList.Add(realmBriefInfo);
|
|
realmCache.oriRealmList.Add(realmBriefInfo);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
realmCache.updateTime = OperationServerUtils.GetTimeSecond() * 1000;
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
if (realm.areaName == query.GetValue("areaName"))
|
|
{
|
|
int timeDistance = (timeBeijingZone - realm.timeZone) * 60 * 60;
|
|
JsonData rdata = new JsonData();
|
|
rdata["realmId"] = realm.realmId;
|
|
rdata["name"] = realm.realmName;
|
|
rdata["showSeq"] = realm.realmId % 1000;
|
|
rdata["timeZone"] = realm.timeZone;
|
|
rdata["visibleOnlyWhiteList"] = realm.visibleOnlyWhiteList;
|
|
rdata["realmBdcName"] = realm.realmBdcName;
|
|
rdata["openTime"] = realm.openTime - timeDistance;
|
|
rdata["visibleTime"] = realm.visibleTime - timeDistance;
|
|
rdata["bigRealmId"] = realm.bigRealmId;
|
|
rdata["logicWorldId"] = realm.logicWorldId;
|
|
|
|
data.Add(rdata);
|
|
}
|
|
}
|
|
|
|
jsondata["code"] = 0;
|
|
jsondata["msg"] = "success";
|
|
}
|
|
|
|
public static void Refresh_RealmCache(long nowMs)
|
|
{
|
|
//一个小时一次
|
|
if (realmCache.updateTime == 0 || nowMs - realmCache.updateTime < 60 * 60000)
|
|
{
|
|
return;
|
|
}
|
|
|
|
realmCache.updateTime = 0;
|
|
realmCache.lastVersion = "";
|
|
realmCache.realmList.Clear();
|
|
realmCache.oriRealmList.Clear();
|
|
}
|
|
|
|
[RequestMapping("提交区服信息",PermissionCode.COMMIT_REALM_INFO, toLog: true)]
|
|
public static int OnCommitRealmInfoHttpReq(string httpApiCmd, JsonData Jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
int timeZoneBeijing = 8;
|
|
if (realmCache.realmList == null || realmCache.realmList.Count == 0)
|
|
{
|
|
TraceLog.Trace("数据已失效,请重新获取");
|
|
Jsondata["ret"] = 7;
|
|
Jsondata["msg"] = "数据已失效,请重新获取";
|
|
return 7;
|
|
}
|
|
|
|
//db.DoCheck(Jsondata, rsp, request, query);
|
|
|
|
if ((int)Jsondata["ret"] != 0)
|
|
{
|
|
return (int)Jsondata["ret"];
|
|
}
|
|
|
|
var realmList = new RepeatedCSRealmBrief_512();
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
var cSRealmBrief = new CSRealmBrief
|
|
{
|
|
RealmId = realm.realmId,
|
|
LogicWorldId = realm.logicWorldId,
|
|
TimeZone = realm.timeZone,
|
|
VisibleOnlyWhiteList = realm.visibleOnlyWhiteList,
|
|
OpenTime = realm.openTime - (timeZoneBeijing - realm.timeZone) * 60 * 60,
|
|
VisibleTime = realm.visibleTime - (timeZoneBeijing - realm.timeZone) * 60 * 60,
|
|
WorldId = realm.WorldId,
|
|
BigRealmId = realm.bigRealmId,
|
|
};
|
|
|
|
cSRealmBrief.AreaName.SetString(realm.areaName);
|
|
cSRealmBrief.RealmName.SetString(realm.realmName);
|
|
cSRealmBrief.RealmBdcName.SetString(realm.realmBdcName);
|
|
realmList.Add(cSRealmBrief);
|
|
}
|
|
|
|
var realmReq = new SSAddRealmReq { RealmList = realmList, Id = httpContextId };
|
|
TraceLog.Trace("Realm.DoCommitRealmInfo realmCache.lastVersion == " + realmCache.lastVersion);
|
|
realmReq.SvnRealmListVersion.SetString(realmCache.lastVersion);
|
|
OperationServerUtils.GetPacketSender().SendToRealmlistServer((int)SSMsgID.SsAddRealmReq, ref realmReq, 0);
|
|
|
|
rsp.IsWaitFor = true;
|
|
|
|
Jsondata["ret"] = -1;
|
|
Jsondata["msg"] = "查询超时";
|
|
return -1;
|
|
}
|
|
|
|
[RequestMapping("发送区服列表",PermissionCode.SEND_REALM_INFOS, toLog: true)]
|
|
public static int SendRealmInfosHttpReq(string httpApiCmd, JsonData builder, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint id)
|
|
{
|
|
if ((int)builder["ret"] != 0)
|
|
{
|
|
return (int)builder["ret"];
|
|
}
|
|
|
|
JArray jArray = JArray.Parse(request.Content);
|
|
for (int i = 0; i < jArray.Count; i++)
|
|
{
|
|
var realmId = (int)jArray[i]["realmId"];
|
|
var bigRealmId = (int)jArray[i]["bigRealmId"];
|
|
|
|
// 校验bigrealmid,相等或加1
|
|
if (realmIdDictory.ContainsKey(realmId - 1))
|
|
{
|
|
if (bigRealmId < realmIdDictory[realmId - 1] || bigRealmId > realmIdDictory[realmId - 1] + 1)
|
|
{
|
|
builder["ret"] = 5;
|
|
builder["msg"] = "bigRealmId的值不符合要求";
|
|
return 5;
|
|
}
|
|
}
|
|
|
|
var areaName = jArray[i]["areaName"].ToString();
|
|
var worldId = (int)jArray[i]["worldId"];
|
|
var logicWorldId = (int)jArray[i]["logicWorldId"];
|
|
var regMax = (int)jArray[i]["regMax"];
|
|
|
|
//int.TryParse(realmId.ToString().Replace(worldId.ToString(), ""), out int showSeq);
|
|
int showSeq = (int)jArray[i]["showSeq"];//(int)jArray[i]["showSeq"];
|
|
|
|
if(realmId / 1000 == worldId)
|
|
{
|
|
showSeq = realmId % 1000;
|
|
}
|
|
|
|
var realmName = jArray[i]["realmName"].ToString();
|
|
var bdcName = jArray[i]["bdcName"].ToString();
|
|
var timeZone = (int)jArray[i]["timeZoneTitle"];
|
|
var openTimeStr = jArray[i]["openTime"].ToString();
|
|
var openTime = OperationServerUtils.StampToDateTime((long)(OperationServerUtils.GetTimeStamp(DateTime.Parse(openTimeStr)) + (timeZone - 8) * 3600)).ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
|
var visibleTimeStr = jArray[i]["visibleTime"].ToString();
|
|
var visibleTime = OperationServerUtils.StampToDateTime((long)(OperationServerUtils.GetTimeStamp(DateTime.Parse(visibleTimeStr)) + (timeZone - 8) * 3600)).ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
|
var visibleOnlyWhiteList = (int)jArray[i]["visibleOnlyWhiteList"];
|
|
var state = (int)jArray[i]["state"];
|
|
var opType = realmIdDictory.ContainsKey(realmId) ? (int)OpRealmType.Update : (int)OpRealmType.Add;
|
|
|
|
SSRealmOperationReq realmReq = new SSRealmOperationReq();
|
|
realmReq.Id = id;
|
|
realmReq.AreaName.SetString(areaName);
|
|
realmReq.WorldId = worldId;
|
|
realmReq.RealmId = realmId;
|
|
realmReq.VisibleOnlyWhiteList = visibleOnlyWhiteList;
|
|
realmReq.LogicWorldId = logicWorldId;
|
|
realmReq.RealmName.SetString(realmName);
|
|
realmReq.ShowSeq = showSeq;
|
|
realmReq.Status = state;
|
|
realmReq.BdcName.SetString(bdcName);
|
|
realmReq.OpenTime.SetString(openTime);
|
|
realmReq.VisibleTime.SetString(visibleTime);
|
|
realmReq.BigRealmId = bigRealmId;
|
|
realmReq.RegMax = regMax;
|
|
realmReq.OpType = opType;
|
|
if(i == jArray.Count - 1)
|
|
{
|
|
realmReq.End = 1;
|
|
}
|
|
|
|
OperationServerUtils.GetPacketSender().SendToRealmlistServer((int)SSMsgID.SsRealmOperationReq, ref realmReq, 0);
|
|
if (!realmIdDictory.TryAdd(realmId, bigRealmId))
|
|
{
|
|
realmIdDictory[realmId] = bigRealmId;
|
|
}
|
|
}
|
|
|
|
rsp.IsWaitFor = true;
|
|
|
|
builder["ret"] = -1;
|
|
builder["msg"] = "查询超时";
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
[RequestMapping("添加区服信息",PermissionCode.ADD_REALM_INFO, toLog: true)]
|
|
public static int OnAddRealmInfoHttpReq(string httpApiCmd, JsonData builder, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint id)
|
|
{
|
|
var realmsContent = request.Content.ToJson<RealmsObj>();
|
|
|
|
string tokens = realmsContent.token;
|
|
int timeZoneBeijing = 8;
|
|
|
|
//db.DoCheck(builder, rsp, request, query);
|
|
|
|
if ((int)builder["ret"] != 0)
|
|
{
|
|
return (int)builder["ret"];
|
|
}
|
|
|
|
var lastRealm = new RealmBriefInfo();
|
|
for (int i = realmCache.realmList.Count - 1; i >= 0; i--)
|
|
{
|
|
if (realmCache.realmList[i].areaName == realmsContent.simpleRealm.areaName)
|
|
{
|
|
lastRealm = realmCache.realmList[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (realmsContent.type == "add")
|
|
{
|
|
int timeDistance = (timeZoneBeijing - lastRealm.timeZone) * 60 * 60;
|
|
if (realmsContent.simpleRealm.bigRealmId < lastRealm.bigRealmId || realmsContent.simpleRealm.bigRealmId > lastRealm.bigRealmId + 1)
|
|
{
|
|
builder["ret"] = 5;
|
|
builder["msg"] = "bigRealmId的值不符合要求";
|
|
return 5;
|
|
}
|
|
var realmBriefInfo = new RealmBriefInfo();
|
|
|
|
realmBriefInfo.areaName = realmsContent.simpleRealm.areaName;
|
|
realmBriefInfo.timeZone = lastRealm.timeZone;
|
|
realmBriefInfo.openTime = realmsContent.simpleRealm.openTime + timeDistance;
|
|
realmBriefInfo.visibleTime = realmsContent.simpleRealm.visibleTime + timeDistance;
|
|
realmBriefInfo.bigRealmId = realmsContent.simpleRealm.bigRealmId;
|
|
realmBriefInfo.realmId = lastRealm.realmId + 1;
|
|
realmBriefInfo.realmName = lastRealm.realmName.Replace(((lastRealm.realmId) % 1000).ToString(), ((lastRealm.realmId + 1) % 1000).ToString());
|
|
realmBriefInfo.realmBdcName = (lastRealm.realmId + 1).ToString();
|
|
realmBriefInfo.WorldId = lastRealm.WorldId;
|
|
realmBriefInfo.logicWorldId = lastRealm.logicWorldId;
|
|
realmBriefInfo.regMax = lastRealm.regMax;
|
|
realmCache.realmList.Add(realmBriefInfo);
|
|
}
|
|
else if (realmsContent.type == "del")
|
|
{
|
|
if (realmsContent.simpleRealm.realmId != lastRealm.realmId)
|
|
{
|
|
builder["ret"] = 6;
|
|
builder["msg"] = "realmid值不符合要求";
|
|
return 6;
|
|
}
|
|
|
|
foreach (var realm in realmCache.realmList)
|
|
{
|
|
if (realm.realmId == realmsContent.simpleRealm.realmId)
|
|
{
|
|
realmCache.realmList.Remove(realm);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (realmsContent.type == "edit")
|
|
{
|
|
int timeDistance = (timeZoneBeijing - lastRealm.timeZone) * 60 * 60;
|
|
int preBigrealmId = 0;
|
|
int nextBigrealmId = 0;
|
|
|
|
for (int i = 0; i < realmCache.realmList.Count; i++)
|
|
{
|
|
if (realmCache.realmList[i].realmId == realmsContent.simpleRealm.realmId - 1)
|
|
{
|
|
preBigrealmId = realmCache.realmList[i].bigRealmId;
|
|
}
|
|
if (realmCache.realmList[i].realmId == realmsContent.simpleRealm.realmId + 1)
|
|
{
|
|
nextBigrealmId = realmCache.realmList[i].bigRealmId;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < realmCache.realmList.Count; i++)
|
|
{
|
|
if (realmCache.realmList[i].realmId == realmsContent.simpleRealm.realmId)
|
|
{
|
|
if ((preBigrealmId == 0 || preBigrealmId <= realmsContent.simpleRealm.bigRealmId) &&
|
|
(preBigrealmId == 0 || preBigrealmId + 1 >= realmsContent.simpleRealm.bigRealmId) &&
|
|
(nextBigrealmId == 0 || nextBigrealmId >= realmsContent.simpleRealm.bigRealmId) &&
|
|
(nextBigrealmId == 0 || nextBigrealmId - 1 <= realmsContent.simpleRealm.bigRealmId))
|
|
{
|
|
var realm = new RealmBriefInfo();
|
|
realm.realmId = realmCache.realmList[i].realmId;
|
|
realm.areaName = realmCache.realmList[i].areaName;
|
|
realm.realmName = realmCache.realmList[i].realmName;
|
|
realm.realmBdcName = realmCache.realmList[i].realmBdcName;
|
|
realm.timeZone = realmCache.realmList[i].timeZone;
|
|
realm.WorldId = realmCache.realmList[i].WorldId;
|
|
realm.logicWorldId = realmCache.realmList[i].logicWorldId;
|
|
realm.openTime = realmsContent.simpleRealm.openTime + timeDistance;
|
|
realm.visibleTime = realmsContent.simpleRealm.visibleTime + timeDistance;
|
|
realm.bigRealmId = realmsContent.simpleRealm.bigRealmId;
|
|
realm.logicWorldId = realmCache.realmList[i].logicWorldId;
|
|
realm.regMax = realmCache.realmList[i].regMax;
|
|
realmCache.realmList[i] = realm;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
TraceLog.Trace("i = " + i + "realmCache.realmList[i - 1].bigRealmId = " + realmCache.realmList[i - 1].bigRealmId + "realmsContent.simpleRealm.bigRealmId = " + realmsContent.simpleRealm.bigRealmId);
|
|
TraceLog.Trace("Realm.DoAddRealmInfo realmCache.realmList[i].realmId = " + realmCache.realmList[i].realmId + "realmsContent.simpleRealm.realmId = " + realmsContent.simpleRealm.realmId);
|
|
|
|
builder["ret"] = 5;
|
|
builder["msg"] = "bigRealmId的值不符合要求";
|
|
return 5;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
builder["ret"] = 5;
|
|
builder["msg"] = "操作类型不符合要求";
|
|
return 5;
|
|
}
|
|
|
|
builder["ret"] = 0;
|
|
builder["msg"] = "操作成功";
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static void OnResMsg(JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSAddRealmRes res)
|
|
{
|
|
// 清理内存中的数据
|
|
realmCache.updateTime = 0;
|
|
realmCache.lastVersion = "";
|
|
realmCache.realmList.Clear();
|
|
realmCache.oriRealmList.Clear();
|
|
|
|
// 响应码
|
|
jsondata["code"] = res.Code;
|
|
// 响应信息
|
|
jsondata["msg"] = res.Msg.ToString();
|
|
|
|
rsp.IsWaitFor = false;
|
|
|
|
return;
|
|
}
|
|
public static void OnResMsg(JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, List<RealmOperationRes> resList)
|
|
{
|
|
bool isOk = true;
|
|
JsonData data = new JsonData();
|
|
jsondata["data"] = data; data.Add(""); data.Clear();
|
|
|
|
string msg = "";
|
|
foreach (var res in resList)
|
|
{
|
|
JsonData rdata = new JsonData();
|
|
// realmId
|
|
rdata["realmId"] = res.realmId;
|
|
// 响应码
|
|
rdata["code"] = res.code;
|
|
if (res.code != 0)
|
|
{
|
|
realmIdDictory.Remove(res.realmId);
|
|
isOk = false;
|
|
msg += res.realmId + "失败:" + res.msg + ";";
|
|
}
|
|
// 响应信息
|
|
rdata["msg"] = res.msg;
|
|
data.Add(rdata);
|
|
}
|
|
|
|
if (isOk)
|
|
{
|
|
jsondata["ret"] = 0;
|
|
jsondata["msg"] = "操作成功";
|
|
}
|
|
else
|
|
{
|
|
jsondata["ret"] = -1;
|
|
jsondata["msg"] = msg;
|
|
}
|
|
|
|
rsp.IsWaitFor = false;
|
|
return;
|
|
}
|
|
[RequestMapping("区服操作",PermissionCode.REALM_OPTION, toLog: true)]
|
|
public static int OnRealmOptionHttpReq(string httpApiCmd, JsonData builder, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint id)
|
|
{
|
|
var realmInfo = request.Content.ToJson<RealmInfo>();
|
|
if ((int)builder["ret"] != 0)
|
|
{
|
|
return (int)builder["ret"];
|
|
}
|
|
//做一些基础校验
|
|
|
|
SSRealmOperationReq realmReq = new SSRealmOperationReq();
|
|
//realmReq.BusinessName.SetString(realmInfo.businessName);
|
|
realmReq.AreaName.SetString(realmInfo.areaName);
|
|
realmReq.WorldId=realmInfo.worldId;
|
|
realmReq.RealmId=realmInfo.realmId;
|
|
realmReq.LogicWorldId=realmInfo.logicWorldId;
|
|
realmReq.RealmName.SetString(realmInfo.realmName);
|
|
realmReq.ShowSeq=realmInfo.showSeq;
|
|
realmReq.Status=realmInfo.status;
|
|
realmReq.VisibleOnlyWhiteList = realmInfo.visibleOnlyWhiteList;
|
|
realmReq.BdcName.SetString(realmInfo.bdcName);
|
|
realmReq.OpenTime.SetString(realmInfo.openTime);
|
|
realmReq.VisibleTime.SetString(realmInfo.visibleTime);
|
|
realmReq.BigRealmId = realmInfo.bigRealmName;
|
|
OperationServerUtils.GetPacketSender().SendToRealmlistServer((int)SSMsgID.SsRealmOperationReq, ref realmReq, 0);
|
|
rsp.IsWaitFor = true;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|