using Discord; using Discord.Commands; using NadekoBot.Core.Services; using System; using System.Threading.Tasks; using NadekoBot.Common.Attributes; using NadekoBot.Modules.Administration.Services; namespace NadekoBot.Modules.Administration { public partial class Administration { [Group] public class MuteCommands : NadekoSubmodule { private readonly DbService _db; public MuteCommands(DbService db) { _db = db; } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [Priority(0)] public async Task SetMuteRole([Remainder] string name) { name = name.Trim(); if (string.IsNullOrWhiteSpace(name)) return; using (var uow = _db.UnitOfWork) { var config = uow.GuildConfigs.For(Context.Guild.Id, set => set); config.MuteRoleName = name; _service.GuildMuteRoles.AddOrUpdate(Context.Guild.Id, name, (id, old) => name); await uow.CompleteAsync().ConfigureAwait(false); } await ReplyConfirmLocalized("mute_role_set").ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [Priority(1)] public Task SetMuteRole([Remainder] IRole role) => SetMuteRole(role.Name); [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.MuteMembers)] [Priority(0)] public async Task Mute(IGuildUser user) { try { await _service.MuteUser(user).ConfigureAwait(false); await ReplyConfirmLocalized("user_muted", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.MuteMembers)] [Priority(1)] public async Task Mute(int minutes, IGuildUser user) { if (minutes < 1 || minutes > 1440) return; try { await _service.TimedMute(user, TimeSpan.FromMinutes(minutes)).ConfigureAwait(false); await ReplyConfirmLocalized("user_muted_time", Format.Bold(user.ToString()), minutes).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.MuteMembers)] public async Task Unmute(IGuildUser user) { try { await _service.UnmuteUser(user).ConfigureAwait(false); await ReplyConfirmLocalized("user_unmuted", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] public async Task ChatMute(IGuildUser user) { try { await _service.MuteUser(user, MuteType.Chat).ConfigureAwait(false); await ReplyConfirmLocalized("user_chat_mute", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] public async Task ChatUnmute(IGuildUser user) { try { await _service.UnmuteUser(user, MuteType.Chat).ConfigureAwait(false); await ReplyConfirmLocalized("user_chat_unmute", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.MuteMembers)] public async Task VoiceMute([Remainder] IGuildUser user) { try { await _service.MuteUser(user, MuteType.Voice).ConfigureAwait(false); await ReplyConfirmLocalized("user_voice_mute", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.MuteMembers)] public async Task VoiceUnmute([Remainder] IGuildUser user) { try { await _service.UnmuteUser(user, MuteType.Voice).ConfigureAwait(false); await ReplyConfirmLocalized("user_voice_unmute", Format.Bold(user.ToString())).ConfigureAwait(false); } catch { await ReplyErrorLocalized("mute_error").ConfigureAwait(false); } } } } }