DeukBot4/DeukBot4/MessageHandlers/CommandHandler/Commands/ModeratorCommands.cs

178 lines
7.8 KiB
C#

using System;
using System.Threading.Tasks;
using DeukBot4.Database.ServerSettings;
using DeukBot4.MessageHandlers.CommandHandler.RequestStructure;
using DeukBot4.MessageHandlers.Permissions;
using DeukBot4.Utilities;
using Discord;
using Discord.WebSocket;
namespace DeukBot4.MessageHandlers.CommandHandler
{
public class ModeratorCommands : CommandContainerBase
{
public override string Name => "Moderator";
[Command("kick", PermissionLevel.Moderator)]
[CommandParameters(ParameterMatcher.ParameterType.User, ParameterMatcher.ParameterType.Remainder)]
[CommandHelp("Kicks a user from the server",
"Kicks a user from the server. Will not work on people with a helper role, or higher.\n" +
"Usage: \n" +
"``!kick {User Mention} {optional: Reason}``\n" +
"``!kick {User ID} {optional: Reason}``")]
[BlockUsageInPm, RequireParameterMatch]
public async Task KickUser(CommandRequest request)
{
// get the server channel object out of message. Return if it's somehow not a server channel
if (!(request.OriginalMessage.Channel is IGuildChannel channel))
return;
// get the id of the user, this parses the string to an id
var user = await request.Parameters[0].AsDiscordUser(channel.Guild);
if (user == null)
{
await request.SendMessageAsync("I can't find that user on the server");
return;
}
// get the permissions of the user we want to kick
var userPermissions =
await PermissionValidator.GetUserPermissionLevel(request.OriginalMessage.Channel, (SocketUser) user);
// if the user has sufficient permissions, or is deukbot, warn the user that he's not allowed to do that, and stop
if (userPermissions >= PermissionLevel.Helper || user.Id == Program.Client.CurrentUser.Id)
{
await request.SendMessageAsync("You are not allowed to kick that user");
return;
}
// see if a reason was given, use that if so
var reason = string.Empty;
if (request.Parameters.Length >= 2)
{
reason = request.Parameters[1].AsString();
}
// and kick
await user.KickAsync(reason);
await request.SendMessageAsync($"User was kicked: {user.Username}");
}
[Command("ban", PermissionLevel.Moderator)]
[CommandHelp("Bans a user from the server",
"Bans a user from the server. Will not work on people with a helper role, or higher.\n" +
"Usage: \n" +
"``ban {User Mention} {optional: Reason}``\n" +
"``ban {User ID} {optional: Reason}``")]
[CommandParameters(ParameterMatcher.ParameterType.User, ParameterMatcher.ParameterType.Remainder)]
[BlockUsageInPm, RequireParameterMatch]
public async Task BanUser(CommandRequest request)
{
// get the server channel object out of message. Return if it's somehow not a server channel
if (!(request.OriginalMessage.Channel is IGuildChannel channel))
return;
// get the id of the user, this parses the string to an id
var user = await request.Parameters[0].AsDiscordUser(channel.Guild);
if (user == null)
{
await request.SendMessageAsync("I can't find that user on the server");
return;
}
// get the permissions of the user we want to kick
var userPermissions =
await PermissionValidator.GetUserPermissionLevel(request.OriginalMessage.Channel, (SocketUser) user);
// if the user has sufficient permissions, or is deukbot, warn the user that he's not allowed to do that, and stop
if (userPermissions >= PermissionLevel.Helper || user.Id == Program.Client.CurrentUser.Id)
{
await request.SendMessageAsync("You are not allowed to ban that user");
return;
}
// see if a reason was given, use that if so
var reason = string.Empty;
if (request.Parameters.Length >= 2)
{
reason = request.Parameters[1].AsString();
}
// and ban
await channel.Guild.AddBanAsync(user, 0, reason);
await request.SendMessageAsync($"User was banned: {user.Username}");
}
[Command("silence", PermissionLevel.Helper)]
[Command("mute", PermissionLevel.Helper)]
[CommandParameters(ParameterMatcher.ParameterType.User, ParameterMatcher.ParameterType.Timespan)]
[CommandParameters(ParameterMatcher.ParameterType.User, ParameterMatcher.ParameterType.Number)]
[CommandHelp("Silences a user for a set amount of time",
"Allows you to mute a user for a set amount of time.\n." +
"Usage:\n" +
"``mute {User Mention} {amount of minutes to silence}``\n" +
"``mute {User ID} {amount of minutes to silence}``\n" +
"``mute {User Mention} {Timespan (amount + time indicator: i.e. 5s, 10m, 3h, 1d)}``\n" +
"``mute {User ID} {Timespan (amount + time indicator: i.e. 5s, 10m, 3h, 1d)}``\n")]
[BlockUsageInPm]
public async Task SilenceUser(CommandRequest request)
{
// get the server channel object out of message. Return if it's somehow not a server channel
if (!(request.OriginalMessage.Channel is IGuildChannel channel))
return;
// get the id of the user, this parses the string to an id
var user = await request.Parameters[0].AsDiscordUser(channel.Guild);
if (user == null)
{
await request.SendMessageAsync("I can't find that user on the server");
return;
}
var silencedRoleId = ServerSettingHandler.GetSettings(channel.GuildId).MutedRoleId;
if (silencedRoleId == 0)
{
await request.SendMessageAsync(
"No silenced role has been set. The server owner should do ``!silencedrole {role id}`` to set one first.");
return;
}
var silencedRole = channel.Guild.GetRole(silencedRoleId);
if (silencedRole == null)
{
await request.SendMessageAsync(
"Can't find the silenced role. Has it been deleted?");
return;
}
await user.AddRoleAsync(silencedRole);
TimeSpan span;
switch (request.Parameters[1].Type)
{
case ParameterMatcher.ParameterType.Number:
var minutes = request.Parameters[1].AsInt();
if (!minutes.HasValue)
return;
span = TimeSpan.FromMinutes(minutes.Value);
break;
case ParameterMatcher.ParameterType.Timespan:
var sp = TimespanParser.Parse(request.Parameters[1].AsString());
if (sp.HasValue)
{
span = sp.Value;
}
else
{
return;
}
break;
default:
return;
}
await Task.Delay(span);
await user.RemoveRoleAsync(silencedRole);
}
}
}