using Filter; using Filter.Database.Account; using Filter.Database.Character; using Filter.Database.GameFilter; using Filter.Handlers.Instances; using Filter.Handlers.Manager; using Filter.Networking.Instances; using Filter.Utilities; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Timers; namespace Filter.Networking.Manager { internal class ManagerClient : Client { public ManagerServer Server; private FiestaCrypto Crypto; private Timer PingTimer; public Guid GUID = Guid.NewGuid(); public int AccountID = -1; private DateTime LastAccountRefresh; private tAccount RealAccount; private DateTime LastCharacterRefresh; private tCharacter RealCharacter; public bool SentMessages; public tAccount Account { get { if (this.LastAccountRefresh > DateTime.Now.AddMinutes(5)) { this.ReloadAccount(); this.LastAccountRefresh = DateTime.Now; } return this.RealAccount; } set { this.RealAccount = value; } } public tCharacter Character { get { if (this.LastCharacterRefresh > DateTime.Now.AddMinutes(5)) { this.ReloadCharacter(); this.LastCharacterRefresh = DateTime.Now; } return this.RealCharacter; } set { this.RealCharacter = value; } } public ManagerClient(Socket AcceptedSocket, IPEndPoint AcceptedEndPoint) : base(AcceptedSocket, AcceptedEndPoint) { Program.ManagerLoggedIn.Add(this); this.Server = new ManagerServer(this); this.StartPing(); } public override void Connected() { } public override void ConnectFailed(SocketException Exception) { } public override void Disconnected() { if (this.AccountID != -1) { Program.ManagerLoggedIn.Remove(this); } if (this.Character != null) { this.SendDisconnectMessages(); } this.PingTimer.Stop(); this.PingTimer.Dispose(); this.Server.Disconnect(); } private void PingTimer_Elapsed(object Sender, ElapsedEventArgs Args) { this.SendPacket(new Packet(Manager2TypeServer.Ping)); } public override void Received(byte[] Buffer) { if (this.Crypto != null) { this.Crypto.Crypt(Buffer, 0, (int)Buffer.Length); } Packet packet = new Packet(Buffer); if (!packet.SetHeaderAndType()) { base.Disconnect(); return; } if (!Program.ManagerHandlers.HasHandler(packet.Header, packet.Type)) { this.Server.SendPacket(packet); } else { try { MethodInfo handler = Program.ManagerHandlers.GetHandler(packet.Header, packet.Type); ManagerHandlerLoader managerHandlers = Program.ManagerHandlers; object[] objArray = new object[] { this, packet }; managerHandlers.GetAction(handler, objArray)(); } catch (Exception exception1) { Exception exception = exception1; this.SendPacket(packet); Program.WriteError(exception); } } } public void ReloadAccount() { this.RealAccount = ( from nEMID in Program.AccountData.tAccounts where nEMID.nEMID == this.RealAccount.nEMID select nEMID).FirstOrDefault(); } public void ReloadCharacter() { this.RealCharacter = ( from nCharNo in Program.CharacterData.tCharacters where nCharNo.nCharNo == this.RealCharacter.nCharNo select nCharNo).FirstOrDefault(); } public void SendConnectMessages() { if (Convert.ToBoolean(Program.ConfigValues["ShowStaff_Logins"]) && this.Character.nAdminLevel >= Convert.ToInt32(Program.ConfigValues["Connection_AdminLevel"])) { object[] character = new object[] { this.Character.sID }; Echo.SendWorldMessage(true, "Staff member {0} joined the game.", character); } tGuildMember _tGuildMember = ( from nCharNo in Program.CharacterData.tGuildMembers where nCharNo.nCharNo == this.Character.nCharNo select nCharNo).FirstOrDefault(); if (Convert.ToBoolean(Program.ConfigValues["ShowGuild_Logins"]) && _tGuildMember != null && _tGuildMember.nGrade == 0) { List list = ( from nNo in Program.CharacterData.tGuildMembers where nNo.nNo == _tGuildMember.nNo select nNo).ToList(); if (list != null) { foreach (tGuildMember _tGuildMember1 in list) { ManagerClient managerClient = ( from NullCharacter in Program.ManagerLoggedIn where NullCharacter.Character != null select NullCharacter into nCharNo where nCharNo.Character.nCharNo == _tGuildMember1.nCharNo select nCharNo).FirstOrDefault(); ManagerClient managerClient1 = managerClient; if (managerClient == null) { continue; } object[] objArray = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient1, "Guild master {0} joined the game.", objArray); } } } tMarriage _tMarriage = ( from nCharNo in Program.CharacterData.tMarriages where nCharNo.nCharNo == this.Character.nCharNo select nCharNo).FirstOrDefault(); if (Convert.ToBoolean(Program.ConfigValues["ShowMarriage_Logins"]) && _tMarriage != null && _tMarriage.nStatus != 0) { ManagerClient managerClient2 = ( from NullCharacter in Program.ManagerLoggedIn where NullCharacter.Character != null select NullCharacter into nCharNo where nCharNo.Character.nCharNo == _tMarriage.nPartnerCharNo select nCharNo).FirstOrDefault(); ManagerClient managerClient3 = managerClient2; if (managerClient2 != null) { if (_tMarriage.nStatus != 1) { object[] character1 = new object[] { managerClient3.Character.sID }; Echo.SendWorldMessage(this, "Your spouse {0} is in game.", character1); object[] objArray1 = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient3, "Your spouse {0} joined the game.", objArray1); } else { object[] character2 = new object[] { managerClient3.Character.sID }; Echo.SendWorldMessage(this, "Your partner {0} is in game.", character2); object[] objArray2 = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient3, "Your partner {0} joined the game.", objArray2); } } else if (_tMarriage.nStatus != 1) { Echo.SendWorldMessage(this, "Your spouse is not in game.", new object[0]); } else { Echo.SendWorldMessage(this, "Your partner is not in game.", new object[0]); } } object[] character3 = new object[] { this.Character.sID, Program.ManagerLoggedIn.Count - 1 }; Echo.SendWhisper(this, "Welcome back {0}. You and {1} others are currently playing.", character3); if (Convert.ToBoolean(Program.ConfigValues["Lottery_Enabled"])) { LotteryTicket lotteryTicket = ( from nUserNo in Program.GameFilterData.LotteryTickets where nUserNo.nUserNo == this.Account.nEMID select nUserNo).FirstOrDefault(); if (lotteryTicket == null) { Echo.SendWhisper(this, "You have not bought any lottery tickets yet. To join type &Lottery Buy >>Ticket Amount<<.", new object[0]); } else if (lotteryTicket.TicketCount > 19) { object[] objArray3 = new object[] { Program.TheLottery.LotteryTime() }; Echo.SendWhisper(this, "The lottery will draw in: {0}", objArray3); } else { object[] ticketCount = new object[] { lotteryTicket.TicketCount, Program.ConfigValues["Lottery_MaxTickets"] }; Echo.SendWhisper(this, "You have {0} lottery tickets. You can buy {1} maximum.", ticketCount); } } if (( from nCharNo in Program.GameFilterData.Jails where nCharNo.nCharNo == this.Character.nCharNo select nCharNo).FirstOrDefault() != null) { Echo.SendWhisper(this, "You are jailed. :(.", new object[0]); } if (Convert.ToBoolean(Program.ConfigValues["IRC_Enabled"]) && this.Character.nAdminLevel >= Convert.ToInt32(Program.ConfigValues["IRC_AdminLevel"])) { if (Convert.ToBoolean(Program.ConfigValues["IRC_MainServer"])) { if (Program.IRCConnections.Count == 0) { Echo.SendWhisper(this, "There appears to be no servers connected to the IRC.", new object[0]); return; } Echo.SendWhisper(this, "The IRC is running correctly!", new object[0]); return; } if (Program.IRCConnect.IsConnected != 0) { Echo.SendWhisper(this, "The IRC is not connected. Please type &IRC Restart.", new object[0]); return; } Echo.SendWhisper(this, "The IRC is running correctly!", new object[0]); } } public void SendCrypto() { if (this.IsConnected != 0) { return; } this.Crypto = new FiestaCrypto(2); Packet packet = new Packet(Manager2TypeServer.SetXor); packet.WriteInt16(2); this.SendPacket(packet); } public void SendDisconnectMessages() { if (Convert.ToBoolean(Program.ConfigValues["ShowStaff_Logouts"]) && this.Character.nAdminLevel >= Convert.ToInt32(Program.ConfigValues["Connection_AdminLevel"])) { object[] character = new object[] { this.Character.sID }; Echo.SendWorldMessage(true, "Staff member {0} left the game.", character); } tGuildMember _tGuildMember = ( from nCharNo in Program.CharacterData.tGuildMembers where nCharNo.nCharNo == this.Character.nCharNo select nCharNo).FirstOrDefault(); if (Convert.ToBoolean(Program.ConfigValues["ShowGuild_Logouts"]) && _tGuildMember != null && _tGuildMember.nGrade == 0) { List list = ( from nNo in Program.CharacterData.tGuildMembers where nNo.nNo == _tGuildMember.nNo select nNo).ToList(); if (list != null) { foreach (tGuildMember _tGuildMember1 in list) { ManagerClient managerClient = ( from NullCharacter in Program.ManagerLoggedIn where NullCharacter.Character != null select NullCharacter into nCharNo where nCharNo.Character.nCharNo == _tGuildMember1.nCharNo select nCharNo).FirstOrDefault(); ManagerClient managerClient1 = managerClient; if (managerClient == null) { continue; } object[] objArray = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient1, "Guild master {0} left the game.", objArray); } } } _tGuildMember = null; tMarriage _tMarriage = ( from nCharNo in Program.CharacterData.tMarriages where nCharNo.nCharNo == this.Character.nCharNo select nCharNo).FirstOrDefault(); if (Convert.ToBoolean(Program.ConfigValues["ShowMarriage_Logouts"]) && _tMarriage != null && _tMarriage.nStatus != 0) { ManagerClient managerClient2 = ( from NullCharacter in Program.ManagerLoggedIn where NullCharacter.Character != null select NullCharacter into nCharNo where nCharNo.Character.nCharNo == _tMarriage.nPartnerCharNo select nCharNo).FirstOrDefault(); ManagerClient managerClient3 = managerClient2; if (managerClient2 != null) { if (_tMarriage.nStatus == 1) { object[] character1 = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient3, "Your partner {0} left the game.", character1); return; } object[] objArray1 = new object[] { this.Character.sID }; Echo.SendWorldMessage(managerClient3, "Your spouse {0} left the game.", objArray1); } } } public void SendPacket(Packet ServerPacket) { byte[] numArray; if (this.IsConnected != 0) { return; } ServerPacket.ToArray(out numArray); base.Send(numArray); } public void StartPing() { this.PingTimer = new Timer() { AutoReset = true }; this.PingTimer.Elapsed += new ElapsedEventHandler(this.PingTimer_Elapsed); this.PingTimer.Interval = 2000; this.PingTimer.Start(); } } }