using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using FiestaBot.Enums; using FiestaBot.Instances.Networking; using FiestaBot.Login.ClientPacket; using FiestaBot.Login.Networking; using FiestaBot.Manager.Networking; using FiestaBot.Utilities; namespace FiestaBot.Login.Handlers { internal class Login03Handler { [LoginPacketHandler(3, 102)] public static void InvalidVersion(LoginClient socket, Packet packet) { Logger.Log(LogType.Login, "Invalid client version"); packet.Dispose(); socket.Disconnect(); } [LoginPacketHandler(3, 103)] public static void CorrectVersion(LoginClient socket, Packet packet) { Logger.Log(LogType.Login, "Client version verified"); packet.Dispose(); LoginPacket.SendLogin(socket); } [LoginPacketHandler(3, 9)] public static void LoginError(LoginClient socket, Packet packet) { packet.ReadByte(out byte response); switch(response) { case 67: Logger.Log(LogType.Login, "Login failed: a database error occurred"); break; case 68: Logger.Log(LogType.Login, "Login failed: invalid token"); break; case 69: Logger.Log(LogType.Login, "Login failed: check your id or password"); break; case 71: Logger.Log(LogType.Login, "Login failed: user id has been blocked"); break; case 72: Logger.Log(LogType.Login, "Login failed: world servers are under maintenance"); break; case 73: Logger.Log(LogType.Login, "Login failed: login timed out"); break; case 74: Logger.Log(LogType.Login, "Login failed: no reason specified"); break; case 75: Logger.Log(LogType.Login, "Login failed: accept the agreement to continue"); break; default: Logger.Log(LogType.Login, "Login failed: unknown error occurred"); break; } packet.Dispose(); } [LoginPacketHandler(3, 10)] public static void ReceiveWorldInfo(LoginClient socket, Packet packet) { Logger.Log(LogType.Login, "Login succesful"); socket.InWorldSelect = true; packet.ReadByte(out byte worldTotal); if(worldTotal > 0) { Program.AvailableWorlds = worldTotal; Logger.Log(LogType.Login, "{0} available worlds:", worldTotal); for(int i = 0; i < worldTotal; i++) { packet.ReadByte(out byte worldId); packet.ReadString(out string worldName, 16); packet.ReadByte(out byte worldStatus); Logger.Log(LogType.Login, "ID: {0} | Name: {1} | Status: {2}", worldId, worldName, (WorldStatus)worldStatus); } } else { Logger.Log(LogType.Login, "There are currently no worlds available"); socket.Disconnect(); packet.Dispose(); return; } packet.Dispose(); if(Program.Config.AutoSelectWorld) { Logger.Log(LogType.Login, "Automatically connecting to world 0"); LoginPacket.SendWorldSelect(socket, Program.Config.AutoSelectWorldID); } else { Logger.Log(LogType.Login, "> Select a world with selectworld [ID]"); } } [LoginPacketHandler(3, 12)] public static void WorldIp(LoginClient socket, Packet packet) { packet.ReadByte(out byte worldStatus); if(worldStatus < 6) { switch((WorldStatus)worldStatus) { case WorldStatus.Offline: Logger.Log(LogType.World, "World connection failed: server is offline"); break; case WorldStatus.Maintenance: Logger.Log(LogType.World, "World connection failed: server is under maintenance"); break; case WorldStatus.EmptyServer: Logger.Log(LogType.World, "World connection failed: server is offline"); break; case WorldStatus.Reserved: Logger.Log(LogType.World, "World connection failed: server is reserved"); break; case WorldStatus.LoginFailed: Logger.Log(LogType.World, "World connection failed: unknown error occurred"); break; case WorldStatus.Full: Logger.Log(LogType.World, "World connection failed: server is full"); break; } } else { packet.ReadString(out string ip, 16); packet.ReadUShort(out ushort port); packet.ReadString(out string transferKey, 64); packet.Dispose(); Program.TransferKey = transferKey; socket.Disconnect(); new ManagerClient(IPAddress.Parse(ip), port); } } [LoginPacketHandler(3, 28)] public static void ReReceiveWorldInfo(LoginClient socket, Packet packet) { packet.ReadByte(out byte worldTotal); if(worldTotal > 0) { Logger.Log(LogType.Login, "{0} available worlds:", worldTotal); for(int i = 0; i < worldTotal; i++) { packet.ReadByte(out byte worldId); packet.ReadString(out string worldName, 16); packet.ReadByte(out byte worldStatus); Logger.Log(LogType.Login, "ID: {0} | Name: {1} | Status: {2}", worldId, worldName, (WorldStatus)worldStatus); } } else { Logger.Log(LogType.Login, "There are currently no worlds available"); socket.Disconnect(); packet.Dispose(); return; } packet.Dispose(); } } }