Merge pull request #3 from Kwoth/1.0

1.0
This commit is contained in:
miraai 2016-11-09 00:40:05 +01:00 committed by GitHub
commit 1945e3ef4c
6 changed files with 127 additions and 71 deletions

View File

@ -88,8 +88,12 @@ namespace NadekoBot.Modules.Administration
foreach (var toOverwrite in guild.GetTextChannels()) foreach (var toOverwrite in guild.GetTextChannels())
{ {
await toOverwrite.AddPermissionOverwriteAsync(muteRole, new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny)) try
.ConfigureAwait(false); {
await toOverwrite.AddPermissionOverwriteAsync(muteRole, new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny))
.ConfigureAwait(false);
}
catch { }
await Task.Delay(200).ConfigureAwait(false); await Task.Delay(200).ConfigureAwait(false);
} }
} }

View File

@ -36,7 +36,6 @@ namespace NadekoBot.Modules.Administration
public int UserThreshold { get; set; } public int UserThreshold { get; set; }
public int Seconds { get; set; } public int Seconds { get; set; }
public PunishmentAction Action { get; set; } public PunishmentAction Action { get; set; }
public IRole MuteRole { get; set; }
public int UsersCount { get; set; } public int UsersCount { get; set; }
public ConcurrentHashSet<IGuildUser> RaidUsers { get; set; } = new ConcurrentHashSet<IGuildUser>(); public ConcurrentHashSet<IGuildUser> RaidUsers { get; set; } = new ConcurrentHashSet<IGuildUser>();
} }
@ -45,7 +44,6 @@ namespace NadekoBot.Modules.Administration
{ {
public PunishmentAction Action { get; set; } public PunishmentAction Action { get; set; }
public int MessageThreshold { get; set; } = 3; public int MessageThreshold { get; set; } = 3;
public IRole MuteRole { get; set; }
public ConcurrentDictionary<ulong, UserSpamStats> UserStats { get; set; } public ConcurrentDictionary<ulong, UserSpamStats> UserStats { get; set; }
= new ConcurrentDictionary<ulong, UserSpamStats>(); = new ConcurrentDictionary<ulong, UserSpamStats>();
} }
@ -114,9 +112,9 @@ namespace NadekoBot.Modules.Administration
{ {
if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats)) if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats))
{ {
var log = await PunishUser((IGuildUser)msg.Author, spamSettings.Action, spamSettings.MuteRole, ProtectionType.Spamming) await PunishUsers(spamSettings.Action, await GetMuteRole(channel.Guild), ProtectionType.Spamming, (IGuildUser)msg.Author)
.ConfigureAwait(false); .ConfigureAwait(false);
await channel.Guild.SendMessageToOwnerAsync(log).ConfigureAwait(false); } }
} }
} }
catch { } catch { }
@ -142,16 +140,11 @@ namespace NadekoBot.Modules.Administration
if (settings.UsersCount >= settings.UserThreshold) if (settings.UsersCount >= settings.UserThreshold)
{ {
var users = settings.RaidUsers.ToList(); var users = settings.RaidUsers.ToArray();
settings.RaidUsers.Clear(); settings.RaidUsers.Clear();
string msg = "";
foreach (var gu in users)
{
msg += await PunishUser(gu, settings.Action, settings.MuteRole, ProtectionType.Raiding).ConfigureAwait(false);
}
try { await usr.Guild.SendMessageToOwnerAsync(msg).ConfigureAwait(false); } catch { }
}
await PunishUsers(settings.Action, await GetMuteRole(usr.Guild), ProtectionType.Raiding, users).ConfigureAwait(false);
}
await Task.Delay(1000 * settings.Seconds).ConfigureAwait(false); await Task.Delay(1000 * settings.Seconds).ConfigureAwait(false);
settings.RaidUsers.TryRemove(usr); settings.RaidUsers.TryRemove(usr);
@ -161,50 +154,49 @@ namespace NadekoBot.Modules.Administration
return Task.CompletedTask; return Task.CompletedTask;
}; };
} }
private async Task<string> PunishUser(IGuildUser gu, PunishmentAction action, IRole muteRole, ProtectionType pt) private async Task PunishUsers(PunishmentAction action, IRole muteRole, ProtectionType pt, params IGuildUser[] gus)
{ {
switch (action) foreach (var gu in gus)
{ {
case PunishmentAction.Mute: switch (action)
try {
{ case PunishmentAction.Mute:
await gu.AddRolesAsync(muteRole);
return $"{Format.Bold(gu.ToString())} was **MUTED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n";
}
catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); }
break;
case PunishmentAction.Kick:
try
{
await gu.Guild.AddBanAsync(gu, 7);
try try
{ {
await gu.Guild.RemoveBanAsync(gu); await gu.AddRolesAsync(muteRole);
} }
catch catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); }
break;
case PunishmentAction.Kick:
try
{ {
await gu.Guild.RemoveBanAsync(gu); await gu.Guild.AddBanAsync(gu, 7);
// try it twice, really don't want to ban user if try
// only kick has been specified as the punishement {
await gu.Guild.RemoveBanAsync(gu);
}
catch
{
await gu.Guild.RemoveBanAsync(gu);
// try it twice, really don't want to ban user if
// only kick has been specified as the punishement
}
} }
return $"{Format.Bold(gu.ToString())} was **KICKED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n"; catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); }
break;
} case PunishmentAction.Ban:
catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } try
break; {
case PunishmentAction.Ban: await gu.Guild.AddBanAsync(gu, 7);
try }
{ catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); }
await gu.Guild.AddBanAsync(gu, 7); break;
return $"{Format.Bold(gu.ToString())} was **BANNED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n"; default:
} break;
catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } }
break;
default:
break;
} }
return String.Empty; await LogCommands.TriggeredAntiProtection(gus, action, pt).ConfigureAwait(false);
} }
@ -227,10 +219,9 @@ namespace NadekoBot.Modules.Administration
return; return;
} }
IRole muteRole;
try try
{ {
muteRole = await GetMuteRole(channel.Guild).ConfigureAwait(false); await GetMuteRole(channel.Guild).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -246,7 +237,6 @@ namespace NadekoBot.Modules.Administration
Action = action, Action = action,
Seconds = seconds, Seconds = seconds,
UserThreshold = userThreshold, UserThreshold = userThreshold,
MuteRole = muteRole,
}; };
antiRaidGuilds.AddOrUpdate(channel.Guild.Id, setting, (id, old) => setting); antiRaidGuilds.AddOrUpdate(channel.Guild.Id, setting, (id, old) => setting);
@ -271,10 +261,22 @@ namespace NadekoBot.Modules.Administration
} }
else else
{ {
try
{
await GetMuteRole(channel.Guild).ConfigureAwait(false);
}
catch (Exception ex)
{
await channel.SendMessageAsync("Failed creating a mute role. Give me ManageRoles permission" +
"or create 'nadeko-mute' role with disabled SendMessages and try again.")
.ConfigureAwait(false);
_log.Warn(ex);
return;
}
if (antiSpamGuilds.TryAdd(channel.Guild.Id, new AntiSpamSetting() if (antiSpamGuilds.TryAdd(channel.Guild.Id, new AntiSpamSetting()
{ {
Action = action, Action = action,
MuteRole = await GetMuteRole(channel.Guild).ConfigureAwait(false),
MessageThreshold = messageCount, MessageThreshold = messageCount,
})) }))
await channel.SendMessageAsync("`Anti-Spam feature enabled on this server.`").ConfigureAwait(false); await channel.SendMessageAsync("`Anti-Spam feature enabled on this server.`").ConfigureAwait(false);

View File

@ -22,21 +22,20 @@ namespace NadekoBot.Modules.Administration
[Group] [Group]
public class LogCommands public class LogCommands
{ {
private ShardedDiscordClient _client { get; } private static ShardedDiscordClient _client { get; }
private Logger _log { get; } private static Logger _log { get; }
private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; private static string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; } public static ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; }
private ConcurrentDictionary<ITextChannel, List<string>> UserPresenceUpdates { get; } = new ConcurrentDictionary<ITextChannel, List<string>>(); private static ConcurrentDictionary<ITextChannel, List<string>> UserPresenceUpdates { get; } = new ConcurrentDictionary<ITextChannel, List<string>>();
private Timer t; private static Timer timerReference { get; }
private IGoogleApiService _google { get; } private IGoogleApiService _google { get; }
public LogCommands(ShardedDiscordClient client, IGoogleApiService google) static LogCommands()
{ {
_client = client; _client = NadekoBot.Client;
_google = google;
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
@ -45,7 +44,7 @@ namespace NadekoBot.Modules.Administration
.ToDictionary(g => g.GuildId, g => g.LogSetting)); .ToDictionary(g => g.GuildId, g => g.LogSetting));
} }
t = new Timer(async (state) => timerReference = new Timer(async (state) =>
{ {
try try
{ {
@ -63,8 +62,10 @@ namespace NadekoBot.Modules.Administration
_log.Warn(ex); _log.Warn(ex);
} }
}, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); }, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
}
public LogCommands(ShardedDiscordClient client)
{
//_client.MessageReceived += _client_MessageReceived; //_client.MessageReceived += _client_MessageReceived;
_client.MessageUpdated += _client_MessageUpdated; _client.MessageUpdated += _client_MessageUpdated;
_client.MessageDeleted += _client_MessageDeleted; _client.MessageDeleted += _client_MessageDeleted;
@ -81,6 +82,36 @@ namespace NadekoBot.Modules.Administration
_client.ChannelUpdated += _client_ChannelUpdated; _client.ChannelUpdated += _client_ChannelUpdated;
} }
public static async Task TriggeredAntiProtection(IGuildUser[] users, PunishmentAction action, ProtectionType protection)
{
if (users.Length == 0)
return;
LogSetting logSetting;
if (!GuildLogSettings.TryGetValue(users.First().Guild.Id, out logSetting)
|| !logSetting.IsLogging)
return;
ITextChannel logChannel;
if ((logChannel = TryGetLogChannel(users.First().Guild, logSetting)) == null)
return;
var punishment = "";
if (action == PunishmentAction.Mute)
{
punishment = "MUTED";
}
else if (action == PunishmentAction.Kick)
{
punishment = "KICKED";
}
else if (action == PunishmentAction.Ban)
{
punishment = "BANNED";
}
await logChannel.SendMessageAsync(String.Join("\n",users.Select(user=>$"{Format.Bold(user.ToString())} was **{punishment}** due to `{protection}` protection on **{user.Guild.Name}** server.")))
.ConfigureAwait(false);
}
private Task _client_UserUpdated(IGuildUser before, IGuildUser after) private Task _client_UserUpdated(IGuildUser before, IGuildUser after)
{ {
LogSetting logSetting; LogSetting logSetting;
@ -461,7 +492,7 @@ namespace NadekoBot.Modules.Administration
// } // }
private enum LogChannelType { Text, Voice, UserPresence }; private enum LogChannelType { Text, Voice, UserPresence };
private ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text) private static ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text)
{ {
ulong id = 0; ulong id = 0;
switch (logChannelType) switch (logChannelType)

View File

@ -83,7 +83,7 @@ namespace NadekoBot.Modules.Games
catch (Exception ex) catch (Exception ex)
{ {
_log.Warn(ex, "Eror sending response"); _log.Warn(ex, "Eror sending response");
await msg.Channel.SendMessageAsync(response).ConfigureAwait(false); // try twice :\ await msg.Channel.SendMessageAsync(msg.Author.Mention+" "+response).ConfigureAwait(false); // try twice :\
} }
return true; return true;
} }

View File

@ -206,9 +206,16 @@ $@"🌍 **Weather for** 【{obj["target"]}】
var arg = name; var arg = name;
if (string.IsNullOrWhiteSpace(arg)) if (string.IsNullOrWhiteSpace(arg))
{ {
await channel.SendMessageAsync("💢 Please enter a card name to search for.").ConfigureAwait(false); await channel.SendMessageAsync("💢 `Please enter a card name to search for.`").ConfigureAwait(false);
return; return;
} }
if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.MashapeKey))
{
await channel.SendMessageAsync("💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`").ConfigureAwait(false);
return;
}
await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false); await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
string response = ""; string response = "";
using (var http = new HttpClient()) using (var http = new HttpClient())
@ -256,10 +263,16 @@ $@"🌍 **Weather for** 【{obj["target"]}】
{ {
var channel = (ITextChannel)umsg.Channel; var channel = (ITextChannel)umsg.Channel;
if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.MashapeKey))
{
await channel.SendMessageAsync("💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`").ConfigureAwait(false);
return;
}
var arg = query; var arg = query;
if (string.IsNullOrWhiteSpace(arg)) if (string.IsNullOrWhiteSpace(arg))
{ {
await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); await channel.SendMessageAsync("💢 `Please enter a search term.`").ConfigureAwait(false);
return; return;
} }
await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false); await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
@ -293,9 +306,15 @@ $@"🌍 **Weather for** 【{obj["target"]}】
var arg = query; var arg = query;
if (string.IsNullOrWhiteSpace(arg)) if (string.IsNullOrWhiteSpace(arg))
{ {
await channel.SendMessageAsync("💢 Please enter a search term.").ConfigureAwait(false); await channel.SendMessageAsync("💢 `Please enter a search term.`").ConfigureAwait(false);
return; return;
} }
if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.MashapeKey))
{
await channel.SendMessageAsync("💢 `Bot owner didn't specify MashapeApiKey. You can't use this functionality.`").ConfigureAwait(false);
return;
}
await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false); await umsg.Channel.TriggerTypingAsync().ConfigureAwait(false);
string res = ""; string res = "";
using (var http = new HttpClient()) using (var http = new HttpClient())

View File

@ -2470,7 +2470,7 @@
<value>setmuterole</value> <value>setmuterole</value>
</data> </data>
<data name="setmuterole_desc" xml:space="preserve"> <data name="setmuterole_desc" xml:space="preserve">
<value>Sets a name of the role which will be assigned to people who should be muted. Default is nadeko-mute. After specifying this role, restart commands which use mute as punishment.</value> <value>Sets a name of the role which will be assigned to people who should be muted. Default is nadeko-mute.</value>
</data> </data>
<data name="setmuterole_usage" xml:space="preserve"> <data name="setmuterole_usage" xml:space="preserve">
<value>`{0}setmuterole Silenced`</value> <value>`{0}setmuterole Silenced`</value>