Translating and cleanup

This commit is contained in:
Lucca Faria Ferri 2023-01-21 17:20:32 -08:00
parent ee39d0586a
commit df29776fb7
7 changed files with 583 additions and 575 deletions

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
#define LOG_KEEP_ALIVE
//Blizzless Project 2022
using bgs.protocol;
//Blizzless Project 2022
@ -40,7 +41,6 @@ using System.Net.Security;
//Blizzless Project 2022
using System.Threading.Tasks;
namespace DiIiS_NA.LoginServer.Battle
{
public class BattleClient : SimpleChannelInboundHandler<BNetPacket>, IRpcChannel
@ -55,19 +55,16 @@ namespace DiIiS_NA.LoginServer.Battle
public IRpcController ListenerController;
private uint _tokenCounter = 0;
public static bgs.protocol.NO_RESPONSE NO_RESPONSE = bgs.protocol.NO_RESPONSE.CreateBuilder().Build();
private Dictionary<int, RPCCallBack> pendingResponses = new Dictionary<int, RPCCallBack>();
private readonly Dictionary<int, RPCCallBack> _pendingResponses = new Dictionary<int, RPCCallBack>();
public bgs.protocol.v2.Attribute AttributeOfServer { get; set; }
public Account Account { get; set; }
public bool MMJoined = false;
public const byte ServiceReply = 0xFE;
public SslStream ssl = null;
private static int REQUEST_SERVICE_ID = 0;
private static int RESPONSE_SERVICE_ID = 254;
public ulong LastPartitionIdHigh = 0; //HACK: fix it later
public ulong LastPartitionIdLow = 0;
//public object clientLock = new object();
public object serviceLock = new object();
public object _serviceLock = new object();
public object messageLock = new object();
private ulong _listenerId; // last targeted rpc object.
public bool MOTDSent { get; private set; }
@ -172,8 +169,8 @@ namespace DiIiS_NA.LoginServer.Battle
if (msg.GetHeader().ServiceId == RESPONSE_SERVICE_ID)
{
if (pendingResponses.Count == 0) return;
RPCCallBack done = pendingResponses[(int)header.Token];
if (_pendingResponses.Count == 0) return;
RPCCallBack done = _pendingResponses[(int)header.Token];
if (done != null)
{
var service = Service.GetByID(header.ServiceId);
@ -181,7 +178,7 @@ namespace DiIiS_NA.LoginServer.Battle
{
IMessage message = DescriptorProto.ParseFrom(payload);
done.Action(message);
pendingResponses.Remove((int)header.Token);
_pendingResponses.Remove((int)header.Token);
}
else
Logger.Debug(
@ -283,8 +280,13 @@ namespace DiIiS_NA.LoginServer.Battle
ListenerId = 0
};
#if DEBUG
Logger.Warn("Call: {0}, Service hash: {1}, Method: {2}, ID: {3}",
service.GetType().Name, header.ServiceHash, method.Name, header.MethodId);
#if !LOG_KEEP_ALIVE
if (method.Name != "KeepAlive")
#endif
{
Logger.Warn("Call: {0}, Service hash: {1}, Method: {2}, ID: {3}",
service.GetType().Name, header.ServiceHash, method.Name, header.MethodId);
}
#endif
service.CallMethod(method, controller, message,
@ -445,7 +447,8 @@ namespace DiIiS_NA.LoginServer.Battle
if (!this.Services.ContainsKey(serviceHash))
{
Logger.Warn("Не найден сервис привязанный к клиенту {0} [0x{1}].", serviceName, serviceHash.ToString("X8"));
Logger.Warn("Service not found for client {0} [0x{1}].", serviceName, serviceHash.ToString("X8"));
// in english: "Service not found for client {0} [0x{1}]."
return;
}

View File

@ -248,19 +248,20 @@ namespace DiIiS_NA.LoginServer.GamesSystem
switch (request.Partition)
{
case 1: //Кампания
case 1: //"Campaign"
handicap = request.HandicapLevel;
Difficulty = request.MonsterLevel;
GameTag = request.GameTag;
GameAct = request.GameAct;
GameQuest = request.GameQuest;
break;
case 2: //Приключения
case 2: //"Adventure"
Difficulty = request.HandicapLevel;
GameTag = request.GameTag;
break;
case 3: //Порталы дерзаний
case 3: //"Adventure"
break;
}

View File

@ -48,19 +48,19 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
public override void Logon(IRpcController controller, LogonRequest request, Action<NoData> done)
{
//Error 28 - Появилось обновление Diablo III, клиент закрывается.
//Error 33 - Профилактические работы
//Error 35 - Служба Battle.net - Отключена
//Error 36 - Не удалось загрузить модуль аутентификации
//Error 37 - Служба аутентификации получает слишком много обращений.
//Error 38 - Для игры требуется получить BattleTag
//Error 42 - Вы подключаетесь к неверному серверу (Неверная последовательность действий)
//Error 43 - Вы заблокировали свою учетную запись с мобильного телефона.
//Error 44 - Невозможно выполнить это действие. Учетная запись лишена функции голосового общения.
//Error 50 - Предоплаченное для учетной записи время игры истекло.
//Error 51 - Подписка для данной учетной записи истекла.
//Error 52 - Данная учетная запись была заблокирована в связи с многочисленными нарушениями условий использования службы Battle.net
//Error 53 - Действие данной учетной записи было приостановлено в связи с нарушениями условий использования службы Batle.net.
//Error 28 - There is an update for Diablo III, the client is closing.
//Error 33 - Maintenance
//Error 35 - Battle.net service - Disabled
//Error 36 - Failed to load authentication module
//Error 37 - Authentication service is receiving too many requests.
//Error 38 - To play you need to get BattleTag
//Error 42 - You are connecting to the wrong server (Wrong sequence of actions)
//Error 43 - You blocked your account from your mobile phone.
//Error 44 - Unable to perform this action. The account is deprived of the function of voice communication.
//Error 50 - Prepaid time for the account has expired.
//Error 51 - Subscription for this account has expired.
//Error 52 - This account has been blocked due to numerous violations of the terms of use of the Battle.net service
//Error 53: Action of this account has been suspended due to violations of the terms of use of the Batle.net service
int VersionRetail = 81850; //74291 - 2.7.0, 76761 - 2.7.1, 79575 - 2.7.2;
int VersionPTR = 79151;
@ -82,9 +82,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
}
if (request.ApplicationVersion == 0)
{
var Parts = request.Version.Split('"');
if (Parts.Length > 1)
version = Parts[1];
var parts = request.Version.Split('"');
if (parts.Length > 1)
version = parts[1];
}
else
version = request.ApplicationVersion.ToString();
@ -92,27 +92,27 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
if (request.Program.ToLower() == "d3")
if (request.ApplicationVersion != VersionRetail & request.ApplicationVersion != VersionPTR)
{
//Logger.Error("Подключение не правильной версии клиента!");
//Logger.Error("Connecting the wrong client version!");
var ercomplete = LogonResult.CreateBuilder().SetErrorCode(28);
//(controller as HandlerController).Client.MakeRPC((lid) => AuthenticationListener.CreateStub((controller as HandlerController).Client).OnLogonComplete(controller, ercomplete.Build(), callback => { }));
//((HandlerController)controller).Client.MakeRPC((lid) => AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnLogonComplete(controller, ercomplete.Build(), callback => { }));
}
switch (request.Locale)
{
case "deDE": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.deDE; break;
case "enGB": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enGB; break;
case "enSG": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enSG; break;
case "enUS": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enUS; break;
case "esES": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esES; break;
case "esMX": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esMX; break;
case "frFR": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.frFR; break;
case "itIT": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.itIT; break;
case "koKR": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.koKR; break;
case "plPL": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.plPL; break;
case "ptBR": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptBR; break;
case "ptPT": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptPT; break;
case "ruRU": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ruRU; break;
case "trTR": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.trTR; break;
case "zhCN": (controller as HandlerController).Client.ClientLanguage = Battle.BattleClient.ClientLocale.zhCN; break;
case "deDE": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.deDE; break;
case "enGB": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enGB; break;
case "enSG": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enSG; break;
case "enUS": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enUS; break;
case "esES": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esES; break;
case "esMX": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esMX; break;
case "frFR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.frFR; break;
case "itIT": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.itIT; break;
case "koKR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.koKR; break;
case "plPL": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.plPL; break;
case "ptBR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptBR; break;
case "ptPT": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptPT; break;
case "ruRU": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ruRU; break;
case "trTR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.trTR; break;
case "zhCN": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.zhCN; break;
}
done(NoData.CreateBuilder().Build());
Logger.Info("----------------------------------------------------------------");
@ -123,21 +123,23 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
case "d3":
//if (!request.HasCachedWebCredentials)
{
#region Процедура аутентификации через WEB
#region Authentication procedure through WEB
if (request.HasCachedWebCredentials)
VerifyWebCredentials(controller, VerifyWebCredentialsRequest.CreateBuilder().SetWebCredentials(request.CachedWebCredentials).Build(), callback => { });
builder.SetPayloadType("web_auth_url");
if (REST.Config.Instance.Public)
builder.SetPayload(ByteString.CopyFromUtf8(String.Format("http://{0}:{1}/battlenet/login", REST.Config.Instance.PublicIP, REST.Config.Instance.PORT)));
builder.SetPayload(ByteString.CopyFromUtf8(
$"http://{REST.Config.Instance.PublicIP}:{REST.Config.Instance.PORT}/battlenet/login"));
else
builder.SetPayload(ByteString.CopyFromUtf8(String.Format("http://{0}:{1}/battlenet/login", Program.RESTSERVERIP, REST.Config.Instance.PORT)));
builder.SetPayload(ByteString.CopyFromUtf8(
$"http://{Program.RESTSERVERIP}:{REST.Config.Instance.PORT}/battlenet/login"));
(controller as HandlerController).Client.MakeRPC((lid) => ChallengeListener.CreateStub((controller as HandlerController).Client).OnExternalChallenge(controller, builder.Build(), callback => { }));
((HandlerController)controller).Client.MakeRPC((lid) => ChallengeListener.CreateStub(((HandlerController)controller).Client).OnExternalChallenge(controller, builder.Build(), callback => { }));
#endregion
}
break;
default:
Logger.Error("Authorization not implemeted for Game: {0}", game);
Logger.Error("Authorization not implemented for Game: {0}", game);
Logger.Info("----------------------------------------------------------------");
break;
}
@ -167,13 +169,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
public override void VerifyWebCredentials(IRpcController controller, VerifyWebCredentialsRequest request, Action<NoData> done)
{
done(NoData.CreateBuilder().Build());
#region Завершение аутентификации
#region Authentication completion
if (request.WebCredentials.ToStringUtf8().ToLower().Contains("eu-"))
{
(controller as HandlerController).Client.Account = AccountManager.GetAccountByPersistentID(1);
((HandlerController)controller).Client.Account = AccountManager.GetAccountByPersistentID(1);
var comple = LogonResult.CreateBuilder()
.SetAccountId((controller as HandlerController).Client.Account.BnetEntityId)
.SetAccountId(((HandlerController)controller).Client.Account.BnetEntityId)
.SetEmail("TEST@MAIL.DU")
.SetBattleTag("Test#0000")
.SetSessionKey(ByteString.CopyFrom("7CB18EDA470F96A4DD70C70B9307CBBA2A4131043075648D8B2F55EE0E383132025D3CC3BA43406DC0740D776B1E5C366BD1123D16E6D6759075B475C28C4022".ToByteArray()))
@ -184,49 +186,49 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
.SetGeoipCountry("RU")
.SetRestrictedMode(false)
.SetErrorCode(0);
comple.AddGameAccountId((controller as HandlerController).Client.Account.GameAccount.BnetEntityId);
(controller as HandlerController).Client.Account.GameAccount.LoggedInClient = (controller as HandlerController).Client;
(controller as HandlerController).Client.MakeRPC((lid) => AuthenticationListener.CreateStub((controller as HandlerController).Client).OnLogonComplete(controller, comple.Build(), callback => { }));
(controller as HandlerController).Client.Account.GameAccount.ProgramField.Value = "FEN";
PlayerManager.PlayerConnected((controller as HandlerController).Client);
var ga1selected = GameAccountSelectedRequest.CreateBuilder().SetResult(0).SetGameAccountId((controller as HandlerController).Client.Account.GameAccount.BnetEntityId);
(controller as HandlerController).Client.MakeRPC((lid) =>
AuthenticationListener.CreateStub((controller as HandlerController).Client).OnGameAccountSelected(new HandlerController() { ListenerId = lid }, ga1selected.Build(), callback => { }));
comple.AddGameAccountId(((HandlerController)controller).Client.Account.GameAccount.BnetEntityId);
((HandlerController)controller).Client.Account.GameAccount.LoggedInClient = ((HandlerController)controller).Client;
((HandlerController)controller).Client.MakeRPC((lid) => AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnLogonComplete(controller, comple.Build(), callback => { }));
((HandlerController)controller).Client.Account.GameAccount.ProgramField.Value = "FEN";
PlayerManager.PlayerConnected(((HandlerController)controller).Client);
var ga1selected = GameAccountSelectedRequest.CreateBuilder().SetResult(0).SetGameAccountId(((HandlerController)controller).Client.Account.GameAccount.BnetEntityId);
((HandlerController)controller).Client.MakeRPC((lid) =>
AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnGameAccountSelected(new HandlerController() { ListenerId = lid }, ga1selected.Build(), callback => { }));
}
else
{
(controller as HandlerController).Client.Account = AccountManager.GetAccountBySaltTicket(request.WebCredentials.ToStringUtf8());
((HandlerController)controller).Client.Account = AccountManager.GetAccountBySaltTicket(request.WebCredentials.ToStringUtf8());
if ((controller as HandlerController).Client.Account == null)
if (((HandlerController)controller).Client.Account == null)
{
var complete = LogonResult.CreateBuilder().SetErrorCode(2);
(controller as HandlerController).Client.MakeRPC((lid) => AuthenticationListener.CreateStub((controller as HandlerController).Client).OnLogonComplete(controller, complete.Build(), callback => { }));
(controller as HandlerController).Client.SocketConnection.CloseAsync();
(controller as HandlerController).Client.Connect.CloseAsync();
((HandlerController)controller).Client.MakeRPC((lid) => AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnLogonComplete(controller, complete.Build(), callback => { }));
((HandlerController)controller).Client.SocketConnection.CloseAsync();
((HandlerController)controller).Client.Connect.CloseAsync();
}
else
{
Logger.Info("Client connected - {0}#{1}", (controller as HandlerController).Client.Account.DBAccount.BattleTagName, (controller as HandlerController).Client.Account.HashCode);
Logger.Info("Client connected - {0}#{1}", ((HandlerController)controller).Client.Account.DBAccount.BattleTagName, ((HandlerController)controller).Client.Account.HashCode);
Logger.Info("----------------------------------------------------------------");
var complete = LogonResult.CreateBuilder()
.SetAccountId((controller as HandlerController).Client.Account.BnetEntityId)
.SetEmail((controller as HandlerController).Client.Account.Email)
.SetBattleTag((controller as HandlerController).Client.Account.BattleTag)
.SetAccountId(((HandlerController)controller).Client.Account.BnetEntityId)
.SetEmail(((HandlerController)controller).Client.Account.Email)
.SetBattleTag(((HandlerController)controller).Client.Account.BattleTag)
.AddAvailableRegion(1)
.SetConnectedRegion(1)
.SetGeoipCountry("RU")
.SetRestrictedMode(false)
.SetErrorCode(0);
complete.AddGameAccountId((controller as HandlerController).Client.Account.GameAccount.BnetEntityId); //D3
(controller as HandlerController).Client.Account.GameAccount.LoggedInClient = (controller as HandlerController).Client;
(controller as HandlerController).Client.MakeRPC((lid) => AuthenticationListener.CreateStub((controller as HandlerController).Client).OnLogonComplete(controller, complete.Build(), callback => { }));
complete.AddGameAccountId(((HandlerController)controller).Client.Account.GameAccount.BnetEntityId); //D3
((HandlerController)controller).Client.Account.GameAccount.LoggedInClient = ((HandlerController)controller).Client;
((HandlerController)controller).Client.MakeRPC((lid) => AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnLogonComplete(controller, complete.Build(), callback => { }));
PlayerManager.PlayerConnected((controller as HandlerController).Client);
PlayerManager.PlayerConnected(((HandlerController)controller).Client);
var gaselected = GameAccountSelectedRequest.CreateBuilder().SetResult(0).SetGameAccountId((controller as HandlerController).Client.Account.GameAccount.BnetEntityId);
(controller as HandlerController).Client.MakeRPC((lid) =>
AuthenticationListener.CreateStub((controller as HandlerController).Client).OnGameAccountSelected(new HandlerController() { ListenerId = lid }, gaselected.Build(), callback => { }));
var gaselected = GameAccountSelectedRequest.CreateBuilder().SetResult(0).SetGameAccountId(((HandlerController)controller).Client.Account.GameAccount.BnetEntityId);
((HandlerController)controller).Client.MakeRPC((lid) =>
AuthenticationListener.CreateStub(((HandlerController)controller).Client).OnGameAccountSelected(new HandlerController() { ListenerId = lid }, gaselected.Build(), callback => { }));
}
}
#endregion

View File

@ -42,7 +42,7 @@ namespace DiIiS_NA.Core.MPQ
return;
}
this.BaseMPQFiles.Add(mpqFile);
Logger.Trace("Добавлено хранилище MPQ: {0}.", file);
Logger.Trace("Added MPQ storage: {0}.", file);
}
this.PatchPattern = patchPattern;
@ -93,11 +93,11 @@ namespace DiIiS_NA.Core.MPQ
{
foreach (var mpq in pair.Value)
{
Logger.Trace("Архив: {0}, включен в систему.", System.IO.Path.GetFileName(mpq));
Logger.Trace("MPQ: {0}, added to the system.", System.IO.Path.GetFileName(mpq));
this.FileSystem.Archives.Add(new MpqArchive(new FileStream(mpq, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), true));
}
}
Logger.Trace("Система сконструирована.");
Logger.Trace("MPQ system constructed.");
}
}
}

View File

@ -32,11 +32,11 @@ namespace DiIiS_NA.Core.MPQ
if (!Directory.Exists(MpqRoot))
{
Logger.Error("MPQ арихивы не найдены: {0}.", MpqRoot);
Logger.Error("MPQ archives not found: {0}.", MpqRoot);
return;
}
Logger.Info("Initializating of data..");
Logger.Info("Initializing of data..");
MPQList = FileHelpers.GetFilesByExtensionRecursive(MpqRoot, ".mpq");
Data = new Data();

View File

@ -181,7 +181,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem
{
Task.Run(() =>
{
lock (client.serviceLock)
lock (client._serviceLock)
{
Logger.Trace("GrantAchievement(): id {0}", achievementId);
if (client.Account.GameAccount.Achievements.Where(a => a.AchievementId == achievementId && a.Completion != -1).Count() > 0) return;
@ -246,7 +246,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem
{
Task.Run(() =>
{
lock (client.serviceLock)
lock (client._serviceLock)
{
Logger.Trace("GrantCriteria(): id {0}", criteriaId);
D3.AchievementsStaticData.StaticCriteriaDefinition definition = null;
@ -381,7 +381,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem
{
Task.Run(() =>
{
lock (client.serviceLock)
lock (client._serviceLock)
{
if (additionalQuantity == 0) return;
Logger.Trace("UpdateQuantity(): id {0}", achievementId);