2017-03-30 01:51:54 +00:00
|
|
|
|
using Discord;
|
|
|
|
|
using Discord.Commands;
|
|
|
|
|
using Discord.WebSocket;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using NadekoBot.Extensions;
|
2017-10-13 04:14:54 +00:00
|
|
|
|
using NadekoBot.Core.Services;
|
|
|
|
|
using NadekoBot.Core.Services.Database.Models;
|
2017-03-30 01:51:54 +00:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
2017-07-17 19:42:36 +00:00
|
|
|
|
using NadekoBot.Common.Attributes;
|
|
|
|
|
using NadekoBot.Modules.Administration.Services;
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
|
|
|
|
namespace NadekoBot.Modules.Administration
|
|
|
|
|
{
|
|
|
|
|
public partial class Administration
|
|
|
|
|
{
|
|
|
|
|
[Group]
|
2017-07-15 16:34:34 +00:00
|
|
|
|
public class UserPunishCommands : NadekoSubmodule<UserPunishService>
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
2017-05-29 04:13:22 +00:00
|
|
|
|
private readonly DbService _db;
|
2017-05-27 08:19:27 +00:00
|
|
|
|
|
2017-07-15 16:34:34 +00:00
|
|
|
|
public UserPunishCommands(DbService db, MuteService muteService)
|
2017-05-27 08:19:27 +00:00
|
|
|
|
{
|
|
|
|
|
_db = db;
|
2017-03-30 01:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Warn(IGuildUser user, [Remainder] string reason = null)
|
|
|
|
|
{
|
2017-10-17 13:14:15 +00:00
|
|
|
|
if (Context.User.Id != user.Guild.OwnerId && (user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max()))
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2017-03-30 01:51:54 +00:00
|
|
|
|
try
|
|
|
|
|
{
|
2017-07-05 15:38:38 +00:00
|
|
|
|
await (await user.GetOrCreateDMChannelAsync()).EmbedAsync(new EmbedBuilder().WithErrorColor()
|
2017-03-30 01:51:54 +00:00
|
|
|
|
.WithDescription(GetText("warned_on", Context.Guild.ToString()))
|
|
|
|
|
.AddField(efb => efb.WithName(GetText("moderator")).WithValue(Context.User.ToString()))
|
|
|
|
|
.AddField(efb => efb.WithName(GetText("reason")).WithValue(reason ?? "-")))
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
}
|
2017-09-27 14:22:42 +00:00
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2017-07-15 03:54:36 +00:00
|
|
|
|
var punishment = await _service.Warn(Context.Guild, user.Id, Context.User.ToString(), reason).ConfigureAwait(false);
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
2017-03-30 18:34:40 +00:00
|
|
|
|
if (punishment == null)
|
|
|
|
|
{
|
|
|
|
|
await ReplyConfirmLocalized("user_warned", Format.Bold(user.ToString())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
await ReplyConfirmLocalized("user_warned_and_punished", Format.Bold(user.ToString()), Format.Bold(punishment.ToString())).ConfigureAwait(false);
|
|
|
|
|
}
|
2017-03-30 01:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
2017-07-15 03:04:16 +00:00
|
|
|
|
[Priority(2)]
|
2017-03-30 01:51:54 +00:00
|
|
|
|
public Task Warnlog(int page, IGuildUser user)
|
|
|
|
|
=> Warnlog(page, user.Id);
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
2017-07-15 03:04:16 +00:00
|
|
|
|
[Priority(3)]
|
2017-03-30 01:51:54 +00:00
|
|
|
|
public Task Warnlog(IGuildUser user)
|
2017-06-28 05:05:08 +00:00
|
|
|
|
=> Context.User.Id == user.Id || ((IGuildUser)Context.User).GuildPermissions.BanMembers ? Warnlog(user.Id) : Task.CompletedTask;
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
2017-07-15 03:04:16 +00:00
|
|
|
|
[Priority(0)]
|
2017-03-30 01:51:54 +00:00
|
|
|
|
public Task Warnlog(int page, ulong userId)
|
|
|
|
|
=> InternalWarnlog(userId, page - 1);
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
2017-07-15 03:04:16 +00:00
|
|
|
|
[Priority(1)]
|
2017-03-30 01:51:54 +00:00
|
|
|
|
public Task Warnlog(ulong userId)
|
|
|
|
|
=> InternalWarnlog(userId, 0);
|
|
|
|
|
|
|
|
|
|
private async Task InternalWarnlog(ulong userId, int page)
|
|
|
|
|
{
|
|
|
|
|
if (page < 0)
|
|
|
|
|
return;
|
|
|
|
|
Warning[] warnings;
|
2017-05-27 08:19:27 +00:00
|
|
|
|
using (var uow = _db.UnitOfWork)
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
warnings = uow.Warnings.For(Context.Guild.Id, userId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
warnings = warnings.Skip(page * 9)
|
|
|
|
|
.Take(9)
|
|
|
|
|
.ToArray();
|
|
|
|
|
|
|
|
|
|
var embed = new EmbedBuilder().WithOkColor()
|
|
|
|
|
.WithTitle(GetText("warnlog_for", (Context.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString()))
|
|
|
|
|
.WithFooter(efb => efb.WithText(GetText("page", page + 1)));
|
|
|
|
|
|
|
|
|
|
if (!warnings.Any())
|
|
|
|
|
{
|
|
|
|
|
embed.WithDescription(GetText("warnings_none"));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
foreach (var w in warnings)
|
|
|
|
|
{
|
|
|
|
|
var name = GetText("warned_on_by", w.DateAdded.Value.ToString("dd.MM.yyy"), w.DateAdded.Value.ToString("HH:mm"), w.Moderator);
|
|
|
|
|
if (w.Forgiven)
|
2017-03-30 18:34:40 +00:00
|
|
|
|
name = Format.Strikethrough(name) + " " + GetText("warn_cleared_by", w.ForgivenBy);
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
|
|
|
|
embed.AddField(x => x
|
|
|
|
|
.WithName(name)
|
|
|
|
|
.WithValue(w.Reason));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Context.Channel.EmbedAsync(embed);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-28 02:59:32 +00:00
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task WarnlogAll(int page = 1)
|
|
|
|
|
{
|
|
|
|
|
if (--page < 0)
|
|
|
|
|
return;
|
|
|
|
|
IGrouping<ulong, Warning>[] warnings;
|
|
|
|
|
using (var uow = _db.UnitOfWork)
|
|
|
|
|
{
|
2017-07-08 13:27:48 +00:00
|
|
|
|
warnings = uow.Warnings.GetForGuild(Context.Guild.Id).GroupBy(x => x.UserId).ToArray();
|
2017-06-28 02:59:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Context.Channel.SendPaginatedConfirmAsync((DiscordSocketClient)Context.Client, page, async (curPage) =>
|
|
|
|
|
{
|
|
|
|
|
var ws = await Task.WhenAll(warnings.Skip(curPage * 15)
|
|
|
|
|
.Take(15)
|
|
|
|
|
.ToArray()
|
|
|
|
|
.Select(async x =>
|
|
|
|
|
{
|
|
|
|
|
var all = x.Count();
|
|
|
|
|
var forgiven = x.Count(y => y.Forgiven);
|
|
|
|
|
var total = all - forgiven;
|
|
|
|
|
return ((await Context.Guild.GetUserAsync(x.Key))?.ToString() ?? x.Key.ToString()) + $" | {total} ({all} - {forgiven})";
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
return new EmbedBuilder()
|
|
|
|
|
.WithTitle(GetText("warnings_list"))
|
|
|
|
|
.WithDescription(string.Join("\n", ws));
|
|
|
|
|
|
2017-10-17 14:10:51 +00:00
|
|
|
|
}, warnings.Length, 15);
|
2017-06-28 02:59:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-03-30 01:51:54 +00:00
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public Task Warnclear(IGuildUser user)
|
|
|
|
|
=> Warnclear(user.Id);
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Warnclear(ulong userId)
|
|
|
|
|
{
|
2017-05-27 08:19:27 +00:00
|
|
|
|
using (var uow = _db.UnitOfWork)
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
await uow.Warnings.ForgiveAll(Context.Guild.Id, userId, Context.User.ToString()).ConfigureAwait(false);
|
|
|
|
|
uow.Complete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await ReplyConfirmLocalized("warnings_cleared",
|
2017-03-30 18:34:40 +00:00
|
|
|
|
Format.Bold((Context.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString())).ConfigureAwait(false);
|
2017-03-30 01:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task WarnPunish(int number, PunishmentAction punish, int time = 0)
|
|
|
|
|
{
|
|
|
|
|
if (punish != PunishmentAction.Mute && time != 0)
|
|
|
|
|
return;
|
|
|
|
|
if (number <= 0)
|
|
|
|
|
return;
|
|
|
|
|
|
2017-05-27 08:19:27 +00:00
|
|
|
|
using (var uow = _db.UnitOfWork)
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
2017-05-16 20:00:55 +00:00
|
|
|
|
var ps = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.WarnPunishments)).WarnPunishments;
|
|
|
|
|
ps.RemoveAll(x => x.Count == number);
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
2017-05-16 20:00:55 +00:00
|
|
|
|
ps.Add(new WarningPunishment()
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
2017-05-16 20:00:55 +00:00
|
|
|
|
Count = number,
|
|
|
|
|
Punishment = punish,
|
|
|
|
|
Time = time,
|
|
|
|
|
});
|
2017-03-30 01:51:54 +00:00
|
|
|
|
uow.Complete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await ReplyConfirmLocalized("warn_punish_set",
|
|
|
|
|
Format.Bold(punish.ToString()),
|
|
|
|
|
Format.Bold(number.ToString())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task WarnPunish(int number)
|
|
|
|
|
{
|
|
|
|
|
if (number <= 0)
|
|
|
|
|
return;
|
|
|
|
|
|
2017-05-27 08:19:27 +00:00
|
|
|
|
using (var uow = _db.UnitOfWork)
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
var ps = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.WarnPunishments)).WarnPunishments;
|
|
|
|
|
var p = ps.FirstOrDefault(x => x.Count == number);
|
|
|
|
|
|
|
|
|
|
if (p != null)
|
|
|
|
|
{
|
|
|
|
|
uow._context.Remove(p);
|
|
|
|
|
uow.Complete();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await ReplyConfirmLocalized("warn_punish_rem",
|
|
|
|
|
Format.Bold(number.ToString())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
public async Task WarnPunishList()
|
|
|
|
|
{
|
|
|
|
|
WarningPunishment[] ps;
|
2017-05-27 08:19:27 +00:00
|
|
|
|
using (var uow = _db.UnitOfWork)
|
2017-03-30 01:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
ps = uow.GuildConfigs.For(Context.Guild.Id, gc => gc.Include(x => x.WarnPunishments))
|
|
|
|
|
.WarnPunishments
|
|
|
|
|
.OrderBy(x => x.Count)
|
|
|
|
|
.ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-30 18:34:40 +00:00
|
|
|
|
string list;
|
|
|
|
|
if (ps.Any())
|
|
|
|
|
{
|
|
|
|
|
list = string.Join("\n", ps.Select(x => $"{x.Count} -> {x.Punishment}"));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
list = GetText("warnpl_none");
|
|
|
|
|
}
|
2017-03-30 01:51:54 +00:00
|
|
|
|
await Context.Channel.SendConfirmAsync(
|
|
|
|
|
GetText("warn_punish_list"),
|
2017-03-30 18:34:40 +00:00
|
|
|
|
list).ConfigureAwait(false);
|
2017-03-30 01:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
[RequireBotPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Ban(IGuildUser user, [Remainder] string msg = null)
|
|
|
|
|
{
|
|
|
|
|
if (Context.User.Id != user.Guild.OwnerId && (user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max()))
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(msg))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await user.SendErrorAsync(GetText("bandm", Format.Bold(Context.Guild.Name), msg));
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
// ignored
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
|
|
|
|
|
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
|
|
|
|
.WithTitle("⛔️ " + GetText("banned_user"))
|
|
|
|
|
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
|
|
|
|
|
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-30 02:35:24 +00:00
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
[RequireBotPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Unban([Remainder]string user)
|
|
|
|
|
{
|
|
|
|
|
var bans = await Context.Guild.GetBansAsync();
|
|
|
|
|
|
|
|
|
|
var bun = bans.FirstOrDefault(x => x.User.ToString().ToLowerInvariant() == user.ToLowerInvariant());
|
|
|
|
|
|
|
|
|
|
if (bun == null)
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("user_not_found").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await UnbanInternal(bun.User).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.BanMembers)]
|
|
|
|
|
[RequireBotPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Unban(ulong userId)
|
|
|
|
|
{
|
|
|
|
|
var bans = await Context.Guild.GetBansAsync();
|
|
|
|
|
|
|
|
|
|
var bun = bans.FirstOrDefault(x => x.User.Id == userId);
|
|
|
|
|
|
|
|
|
|
if (bun == null)
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("user_not_found").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await UnbanInternal(bun.User).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task UnbanInternal(IUser user)
|
|
|
|
|
{
|
|
|
|
|
await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
await ReplyConfirmLocalized("unbanned_user", Format.Bold(user.ToString())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-30 01:51:54 +00:00
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.KickMembers)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.ManageMessages)]
|
|
|
|
|
[RequireBotPermission(GuildPermission.BanMembers)]
|
|
|
|
|
public async Task Softban(IGuildUser user, [Remainder] string msg = null)
|
|
|
|
|
{
|
|
|
|
|
if (Context.User.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(msg))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await user.SendErrorAsync(GetText("sbdm", Format.Bold(Context.Guild.Name), msg));
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
// ignored
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
|
|
|
|
|
try { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
|
|
|
|
|
catch { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
|
|
|
|
|
|
|
|
|
|
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
|
|
|
|
.WithTitle("☣ " + GetText("sb_user"))
|
|
|
|
|
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
|
|
|
|
|
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
|
|
|
[RequireContext(ContextType.Guild)]
|
|
|
|
|
[RequireUserPermission(GuildPermission.KickMembers)]
|
|
|
|
|
[RequireBotPermission(GuildPermission.KickMembers)]
|
|
|
|
|
public async Task Kick(IGuildUser user, [Remainder] string msg = null)
|
|
|
|
|
{
|
|
|
|
|
if (Context.Message.Author.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
|
|
|
|
|
{
|
|
|
|
|
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(msg))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await user.SendErrorAsync(GetText("kickdm", Format.Bold(Context.Guild.Name), msg));
|
|
|
|
|
}
|
|
|
|
|
catch { }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await user.KickAsync().ConfigureAwait(false);
|
|
|
|
|
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
|
|
|
|
|
.WithTitle(GetText("kicked_user"))
|
|
|
|
|
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
|
|
|
|
|
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|