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);
}
}