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.
267 lines
9.0 KiB
267 lines
9.0 KiB
using IP2Region;
|
|
using ProtoCSStruct;
|
|
using Sog;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Realmlist
|
|
{
|
|
public static class RecommendRealmByIP
|
|
{
|
|
private static DbSearcher m_search;
|
|
private static Dictionary<string, string> cache = new Dictionary<string, string>();
|
|
public static void OnReloadConfig()
|
|
{
|
|
cache.Clear();
|
|
foreach (var item in CountryAreaNameMapDescMgr.Instance.ItemTable.Values)
|
|
{
|
|
if(!cache.ContainsKey(item.name))
|
|
{
|
|
cache.Add(item.name, item.areaName);
|
|
TraceLog.Debug("RecommendRealmByIP.OnReloadConfig name {0} area {1} timezone {2}", item.name, item.areaName,item.timezone);
|
|
}
|
|
}
|
|
}
|
|
public static void TestIp()
|
|
{
|
|
var cur = DateTime.Now;
|
|
|
|
Test("60.246.49.9");
|
|
Test("119.28.228.38");
|
|
Test("175.97.158.95");
|
|
Test("183.192.62.65");
|
|
Test("66.249.65.56");
|
|
Test("127.0.0.1");
|
|
Test("192.168.1.60");
|
|
Test("162.125.32.9");
|
|
Test("84.170.88.33");
|
|
Test("80.141.135.243");
|
|
Test("185.5.70.217");
|
|
Test("110.138.168.102");
|
|
Test("188.106.62.74");
|
|
Test("189.40.102.157");
|
|
Test("139.47.118.213");
|
|
Test("178.168.216.84");
|
|
Test("175.97.158.95");
|
|
Test("180.244.130.43");
|
|
Test("116.206.31.84");
|
|
Test("175.176.69.190");
|
|
Test("140.213.204.147");
|
|
Test("136.158.57.132");
|
|
Test("45.89.89.181");
|
|
Test("50.116.43.86");
|
|
Test("165.186.33.33");
|
|
Test("43.229.44.44");
|
|
Test("61.13.55.55");
|
|
Test("12.63.184.204");
|
|
Test("216.244.208.11");
|
|
Test("15.15.15.15");
|
|
Test("57.57.57.57");
|
|
Test("62.184.8.32");
|
|
Test("194.112.177.132");
|
|
Test("202.41.41.41");
|
|
Test("62.32.33.33");
|
|
Test("62.16.64.44");
|
|
Test("194.117.107.65");
|
|
Test("19.203.239.31");
|
|
Test("193.188.48.55");
|
|
Test("41.32.22.22");
|
|
Test("5.134.92.4");
|
|
Test("1.128.11.11");
|
|
Test("31.13.194.11");
|
|
Test("2.56.68.55");
|
|
Test("210.52.109.11");
|
|
Test("17.253.106.33");
|
|
Test("23.37.96.33");
|
|
Test("190.15.144.44");
|
|
Test("2.21.243.33");
|
|
Test("43.231.64.44");
|
|
Test("57.87.144.44");
|
|
Test("45.85.4.44");
|
|
Test("1.9.114.33");
|
|
Test("103.29.199.11");
|
|
Test("43.245.116.44");
|
|
Test("45.231.32.33");
|
|
Test("23.204.128.33");
|
|
Test("103.38.236.33");
|
|
Test("41.78.208.33");
|
|
Test("81.199.131.22");
|
|
Test("5.43.48.208");
|
|
Test("2.21.192.11");
|
|
Test("5.153.112.22");
|
|
Test("1.0.182.224");
|
|
Test("5.44.80.11");
|
|
Test("64.76.65.11");
|
|
Test("2.58.116.11");
|
|
Test("45.66.40.11");
|
|
Test("27.252.48.11");
|
|
Test("5.63.204.44");
|
|
Test("94.102.80.55");
|
|
Test("37.238.224.44");
|
|
Test("5.226.48.55");
|
|
Test("37.61.230.55");
|
|
Test("2.32.4.33");
|
|
Test("1.52.69.160");
|
|
Test("45.167.192.44");
|
|
Test("1.22.57.44");
|
|
Test("11.191.39.11");
|
|
Test("31.12.128.44");
|
|
Test("46.150.192.11");
|
|
Test("102.143.128.11");
|
|
Test("45.15.44.11");
|
|
Test("1.33.88.44");
|
|
Test("2.148.100.33");
|
|
Test("102.64.124.11");
|
|
Test("45.219.255.11");
|
|
Test("103.68.139.11");
|
|
Test("78.141.128.11");
|
|
Test("157.119.180.11");
|
|
Test("91.102.232.11");
|
|
Test("8.40.30.11");
|
|
Test("13.88.224.11");
|
|
Test("94.102.234.11");
|
|
Test("181.189.224.11");
|
|
Test("196.49.10.11");
|
|
Test("169.159.208.11");
|
|
Test("196.223.144.11");
|
|
Test("183.81.132.11");
|
|
Test("190.52.48.11");
|
|
Test("89.104.128.11");
|
|
Test("23.251.128.11");
|
|
Test("138.186.12.11");
|
|
Test("82.163.96.11");
|
|
Test("43.245.128.11");
|
|
Test("23.210.60.11");
|
|
Test("46.226.136.11");
|
|
Test("23.223.204.11");
|
|
Test("103.53.16.11");
|
|
Test("192.245.148.11");
|
|
Test("91.226.220.11");
|
|
Test("88.151.192.11");
|
|
Test("169.239.132.11");
|
|
Test("17.253.114.11");
|
|
Test("14.13.176.11");
|
|
Test("218.184.11.22");
|
|
Test("83.40.189.11");
|
|
Test("66.91.192.253");
|
|
Test("64.140.149.70");
|
|
Test("181.42.29.193");
|
|
Test("179.9.191.155");
|
|
TraceLog.Debug("RecommendRealmByIP.OnTickTest Cost Time {0} ms", (DateTime.Now - cur).TotalMilliseconds);
|
|
}
|
|
private static void Test(string ip)
|
|
{
|
|
string country, city;
|
|
TraceLog.Debug("RecommendRealmByIP.Test ip {0} region {1} realm {2}", ip, GetRegionByIP(ip), GetRealmInfoByIP(ip, out country, out city));
|
|
}
|
|
private static string GetRegionByIP(string ip)
|
|
{
|
|
if(string.IsNullOrEmpty(ip))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
try
|
|
{
|
|
if (m_search == null)
|
|
{
|
|
string filePath = @"../cfg/sog/ip2region.db";
|
|
if (!File.Exists(filePath))
|
|
{
|
|
TraceLog.Error("RecommendRealmByIP.GetRegionByIP not find file {0}", filePath);
|
|
return null;
|
|
}
|
|
m_search = new DbSearcher(filePath);
|
|
}
|
|
return m_search.MemorySearch(ip)?.Region;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
TraceLog.Error("RecommendRealmByIP.GetRegionByIP Exception:{0}", e.Message);
|
|
TraceLog.Error("RecommendRealmByIP.GetRegionByIP Exception StackTrace:{0}", e.StackTrace);
|
|
return null;
|
|
}
|
|
}
|
|
public static AreaRealm GetAreaByIP(string ip)
|
|
{
|
|
string country, city;
|
|
var areaName = GetRealmInfoByIP(ip, out country, out city);
|
|
//测试代码
|
|
//if (ip == "192.168.1.189")
|
|
//{
|
|
// areaName = "NA";
|
|
//}
|
|
if (string.IsNullOrEmpty(areaName))
|
|
{
|
|
areaName = "Asia";
|
|
TraceLog.Error("RecommendRealmByIP.GetAreaByIP not config area region info ,ip {0} country {1} city {2}", ip, country, city);
|
|
// return null;
|
|
}
|
|
if(RealmlistSvc.areaDict.ContainsKey(areaName))
|
|
{
|
|
return RealmlistSvc.areaDict[areaName];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static void GetIpCountry(string ip, out string country, out string city)
|
|
{
|
|
city = string.Empty;
|
|
country = string.Empty;
|
|
|
|
string region = GetRegionByIP(ip); //格式 中国|0|上海|上海市|移动
|
|
if (region == null)
|
|
{
|
|
return;
|
|
}
|
|
string[] strs = region.Split("|");
|
|
if (strs.Length >= 3)//城市
|
|
{
|
|
city = strs[2];
|
|
}
|
|
if (strs.Length >= 1)//国家
|
|
{
|
|
country = strs[0];
|
|
}
|
|
}
|
|
|
|
//在返回给前端的list中的推荐服中,根据ip找到合适的推荐服
|
|
private static string GetRealmInfoByIP(string ip, out string country, out string city)
|
|
{
|
|
GetIpCountry(ip, out country, out city); //格式 中国|0|上海|上海市|移动
|
|
if(string.IsNullOrEmpty(country))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
string areaNameByCity = string.Empty;
|
|
string areaNameByCountry = string.Empty;
|
|
if(cache.ContainsKey(city))//城市
|
|
{
|
|
areaNameByCity = cache[city];
|
|
}
|
|
if (cache.ContainsKey(country))//国家
|
|
{
|
|
areaNameByCountry = cache[country];
|
|
}
|
|
|
|
TraceLog.Trace("RecommendRealmByIP.GetRealmInfoByIP ip {0} country {1} city {2} areaNameByCity {3} areaNameByCountry {4}",
|
|
ip, country, city, areaNameByCity, areaNameByCountry);
|
|
|
|
if (!string.IsNullOrEmpty(areaNameByCity))
|
|
{
|
|
return areaNameByCity;
|
|
}
|
|
else if (!string.IsNullOrEmpty(areaNameByCountry))
|
|
{
|
|
return areaNameByCountry;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|