public static void Initialize() { Instance = new CommandHandler() { CommandHandlers = new Dictionary<string,Action<ClientConnection, string[]>>() }; Instance.CommandHandlers.Add("report", (pConnection, pArguments) => { return; // Disabled if (pArguments.Length == 1) { string name = pArguments[0]; if (name.Length > 12) return; bool found = false; string query = "SELECT name FROM character_views WHERE name LIKE '" + MySql.Data.MySqlClient.MySqlHelper.EscapeString(name) + "%' AND mapid = " + pConnection.CharData.Stats.MapID; using (var result = MySQL_Connection.Instance.RunQuery(query) as MySql.Data.MySqlClient.MySqlDataReader) { if (result.HasRows && result.Read()) { name = result.GetString(0); found = true; } else { pConnection.Logger_WriteLine("Could not find {0} for {1}", name, pConnection.CharData.Stats.Name); } } if (found) { using (InsertQueryBuilder iqb = new InsertQueryBuilder("reports")) { iqb.AddColumns(false, "id", "name", "reported_by", "reported_when", "mapid", "screenshot"); iqb.AddRow(null, name, pConnection.CharacterInternalID, new MySQL_Connection.NowType(), pConnection.CharData.Stats.MapID, null); int result = (int)MySQL_Connection.Instance.RunQuery(iqb.ToString()); if (result != 0) { pConnection.Logger_WriteLine("Reported {0} (by {1}). Requesting Screenshot...", name, pConnection.CharData.Stats.Name); using (MaplePacket pack = new MaplePacket(MaplePacket.CommunicationType.ServerPacket, (ushort)0xEEFE)) { pack.WriteString("http://mapler.me/actions/upload_report.php"); pack.WriteInt(MySQL_Connection.Instance.GetLastInsertId()); pack.SwitchOver(); pConnection.SendPacket(pack); } } else { pConnection.Logger_WriteLine("Report FAIL {0} (by {1})", name, pConnection.CharData.Stats.Name); } } } } }); }
public override void OnPacket(MaplePacket pPacket) { MasterThread.Instance.AddCallback((a) => { try { if (Disconnected) return; // Just to be sure... if (_exporter != null) _exporter.AddPacket(pPacket); MaplePacket.CommunicationType type = (MaplePacket.CommunicationType)pPacket.ReadByte(); ushort opcode = pPacket.ReadUShort(); if (IsFake) { Logger.WriteLine("Emulating {0:X4} (Len: {1})", opcode, pPacket.Length); } if ((byte)type < Program.ValidHeaders.Length) { // Check if packet is accepted var list = Program.ValidHeaders[(byte)type]; if (list.ContainsKey(opcode)) { var action = list[opcode]; if (action != null) { try { if (action.CanHandle == null || action.CanHandle(this)) action.Handle(this, pPacket); } catch (Exception ex) { Logger_ErrorLog("Failed parsing {0:X4} for {1}", opcode, type); Logger_WriteLine(ex.ToString()); if (!IsFake) { LogFilename += "ERROR"; SendInfoText("An error occurred on the Mapler.me server! Please report this :)"); // Save exception to packet using (MaplePacket mp = new MaplePacket(MaplePacket.CommunicationType.ServerPacket, 0x9999)) { mp.WriteString(ex.ToString()); if (ex.ToString().Contains("MySql.Data.MySqlClient.MySqlException")) { Logger_ErrorLog("MySQL exception!"); var queries = MySQL_Connection.Instance.GetRanQueries(); mp.WriteInt(queries.Count); foreach (var kvp in queries) { mp.WriteString(kvp.Key); mp.WriteString(kvp.Value); } } mp.SwitchOver(); // Make read packet _exporter.AddPacket(mp); } Save(false, false); } } } else { if (!IsFake) Logger_WriteLine("No action for {0:X4}", opcode); } } else { if (!IsFake) Logger_WriteLine("Client sent packet {0:X4} for {1} but this one is not handled!", opcode, type); } } else { Logger_ErrorLog("Packet Type not accepted!!! {0:X4} {1}", opcode, (byte)type); } } catch (Exception ex) { Logger.ErrorLog("Failed handling packet: {0}", ex.ToString()); SendInfoText("An error occurred on the Mapler.me server! Please report this :)"); } pPacket.Dispose(); pPacket = null; }); }