void DoBan(Player player, Command cmd, bool banIP, bool banAll, bool unban) { if (!banAll && !banIP && player.Can(Permissions.Ban) || !banAll && player.Can(Permissions.BanIP) || player.Can(Permissions.BanAll)) { string arg = cmd.Next(); string reason = cmd.NextAll(); IPAddress address; Player offender = world.FindPlayer(arg); PlayerInfo info = world.db.FindPlayerInfoExact(arg); // ban by IP address if (banIP && IPAddress.TryParse(arg, out address)) { if (banIP) { DoIPBan(player, address, reason, null, banAll, unban); } // ban online players } else if (!unban && offender != null) { address = offender.info.lastIP; if (banIP) { DoIPBan(player, address, reason, offender.name, banAll, unban); } if (unban) { if (offender.info.ProcessUnBan(player.name, reason)) { world.log.Log("{0} was unbanned by {1}.", LogType.UserActivity, offender.info.name, player.name); world.SendToAll(PacketWriter.MakeMessage(Color.Red + offender.name + " was unbanned by " + player.name), offender); } else { player.Message(offender.name + " is not currently banned."); } } else { if (offender.info.ProcessBan(player.name, reason)) { world.log.Log("{0} was banned by {1}.", LogType.UserActivity, offender.info.name, player.name); world.SendToAll(PacketWriter.MakeMessage(Color.Red + offender.name + " was banned by " + player.name), offender); offender.session.Kick("You were banned by " + player.name + "!"); } else { player.Message(offender.name + " is already banned."); } } // ban offline players } else if (info != null) { address = info.lastIP; if (banIP) { DoIPBan(player, address, reason, info.name, banAll, unban); } if (unban) { if (info.ProcessUnBan(player.name, reason)) { world.log.Log("{0} (offline) was unbanned by {1}", LogType.UserActivity, info.name, player.name); world.SendToAll(PacketWriter.MakeMessage(Color.Red + info.name + " (offline) was unbanned by " + player.name), null); } else { player.Message(info.name + " (offline) is not currenty banned."); } } else { if (info.ProcessBan(player.name, reason)) { world.log.Log("{0} (offline) was banned by {1}.", LogType.UserActivity, info.name, player.name); world.SendToAll(PacketWriter.MakeMessage(Color.Red + info.name + " (offline) was banned by " + player.name), null); } else { player.Message(info.name + " (offline) is already banned."); } } } else { world.NoPlayerMessage(player, arg); } } else { world.NoAccessMessage(player); } }