.antiraid .antispam .antilist .antispamignore added/improved
This commit is contained in:
parent
27b0d9fe36
commit
d848ef6270
@ -17,6 +17,62 @@ namespace NadekoBot.Migrations
|
|||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "1.1.0-rtm-22752");
|
.HasAnnotation("ProductVersion", "1.1.0-rtm-22752");
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd();
|
||||||
|
|
||||||
|
b.Property<int>("Action");
|
||||||
|
|
||||||
|
b.Property<int>("GuildConfigId");
|
||||||
|
|
||||||
|
b.Property<int>("Seconds");
|
||||||
|
|
||||||
|
b.Property<int>("UserThreshold");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("GuildConfigId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.ToTable("AntiRaidSetting");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd();
|
||||||
|
|
||||||
|
b.Property<int?>("AntiSpamSettingId");
|
||||||
|
|
||||||
|
b.Property<ulong>("ChannelId");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AntiSpamSettingId");
|
||||||
|
|
||||||
|
b.ToTable("AntiSpamIgnore");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd();
|
||||||
|
|
||||||
|
b.Property<int>("Action");
|
||||||
|
|
||||||
|
b.Property<int>("GuildConfigId");
|
||||||
|
|
||||||
|
b.Property<int>("MessageThreshold");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("GuildConfigId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.ToTable("AntiSpamSetting");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
|
||||||
{
|
{
|
||||||
b.Property<int>("Id")
|
b.Property<int>("Id")
|
||||||
@ -722,6 +778,29 @@ namespace NadekoBot.Migrations
|
|||||||
b.ToTable("PokeGame");
|
b.ToTable("PokeGame");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig")
|
||||||
|
.WithOne("AntiRaidSetting")
|
||||||
|
.HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting")
|
||||||
|
.WithMany("IgnoredChannels")
|
||||||
|
.HasForeignKey("AntiSpamSettingId");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig")
|
||||||
|
.WithOne("AntiSpamSetting")
|
||||||
|
.HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
|
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
|
b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
|
||||||
|
@ -1,272 +0,0 @@
|
|||||||
using Discord;
|
|
||||||
using Discord.Commands;
|
|
||||||
using NadekoBot.Attributes;
|
|
||||||
using NadekoBot.Extensions;
|
|
||||||
using NLog;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Administration
|
|
||||||
{
|
|
||||||
public partial class Administration
|
|
||||||
{
|
|
||||||
public enum PunishmentAction
|
|
||||||
{
|
|
||||||
Mute,
|
|
||||||
Kick,
|
|
||||||
Ban,
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum ProtectionType
|
|
||||||
{
|
|
||||||
Raiding,
|
|
||||||
Spamming,
|
|
||||||
}
|
|
||||||
|
|
||||||
private class AntiRaidSetting
|
|
||||||
{
|
|
||||||
public int UserThreshold { get; set; }
|
|
||||||
public int Seconds { get; set; }
|
|
||||||
public PunishmentAction Action { get; set; }
|
|
||||||
public int UsersCount { get; set; }
|
|
||||||
public ConcurrentHashSet<IGuildUser> RaidUsers { get; set; } = new ConcurrentHashSet<IGuildUser>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class AntiSpamSetting
|
|
||||||
{
|
|
||||||
public PunishmentAction Action { get; set; }
|
|
||||||
public int MessageThreshold { get; set; } = 3;
|
|
||||||
public ConcurrentDictionary<ulong, UserSpamStats> UserStats { get; set; }
|
|
||||||
= new ConcurrentDictionary<ulong, UserSpamStats>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class UserSpamStats
|
|
||||||
{
|
|
||||||
public int Count { get; set; }
|
|
||||||
public string LastMessage { get; set; }
|
|
||||||
|
|
||||||
public UserSpamStats(string msg)
|
|
||||||
{
|
|
||||||
Count = 1;
|
|
||||||
LastMessage = msg.ToUpperInvariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ApplyNextMessage(string message)
|
|
||||||
{
|
|
||||||
var upperMsg = message.ToUpperInvariant();
|
|
||||||
if (upperMsg == LastMessage)
|
|
||||||
Count++;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LastMessage = upperMsg;
|
|
||||||
Count = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Group]
|
|
||||||
public class AntiRaidCommands : ModuleBase
|
|
||||||
{
|
|
||||||
private static ConcurrentDictionary<ulong, AntiRaidSetting> antiRaidGuilds =
|
|
||||||
new ConcurrentDictionary<ulong, AntiRaidSetting>();
|
|
||||||
// guildId | (userId|messages)
|
|
||||||
private static ConcurrentDictionary<ulong, AntiSpamSetting> antiSpamGuilds =
|
|
||||||
new ConcurrentDictionary<ulong, AntiSpamSetting>();
|
|
||||||
|
|
||||||
private static Logger _log { get; }
|
|
||||||
|
|
||||||
static AntiRaidCommands()
|
|
||||||
{
|
|
||||||
_log = LogManager.GetCurrentClassLogger();
|
|
||||||
|
|
||||||
NadekoBot.Client.MessageReceived += async (imsg) =>
|
|
||||||
{
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var msg = imsg as IUserMessage;
|
|
||||||
if (msg == null || msg.Author.IsBot)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var channel = msg.Channel as ITextChannel;
|
|
||||||
if (channel == null)
|
|
||||||
return;
|
|
||||||
AntiSpamSetting spamSettings;
|
|
||||||
if (!antiSpamGuilds.TryGetValue(channel.Guild.Id, out spamSettings))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var stats = spamSettings.UserStats.AddOrUpdate(msg.Author.Id, new UserSpamStats(msg.Content),
|
|
||||||
(id, old) => { old.ApplyNextMessage(msg.Content); return old; });
|
|
||||||
|
|
||||||
if (stats.Count >= spamSettings.MessageThreshold)
|
|
||||||
{
|
|
||||||
if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats))
|
|
||||||
{
|
|
||||||
await PunishUsers(spamSettings.Action, ProtectionType.Spamming, (IGuildUser)msg.Author)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
};
|
|
||||||
|
|
||||||
NadekoBot.Client.UserJoined += async (usr) =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (usr.IsBot)
|
|
||||||
return;
|
|
||||||
AntiRaidSetting settings;
|
|
||||||
if (!antiRaidGuilds.TryGetValue(usr.Guild.Id, out settings))
|
|
||||||
return;
|
|
||||||
if (!settings.RaidUsers.Add(usr))
|
|
||||||
return;
|
|
||||||
|
|
||||||
++settings.UsersCount;
|
|
||||||
|
|
||||||
if (settings.UsersCount >= settings.UserThreshold)
|
|
||||||
{
|
|
||||||
var users = settings.RaidUsers.ToArray();
|
|
||||||
settings.RaidUsers.Clear();
|
|
||||||
|
|
||||||
await PunishUsers(settings.Action, ProtectionType.Raiding, users).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
await Task.Delay(1000 * settings.Seconds).ConfigureAwait(false);
|
|
||||||
|
|
||||||
settings.RaidUsers.TryRemove(usr);
|
|
||||||
--settings.UsersCount;
|
|
||||||
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task PunishUsers(PunishmentAction action, ProtectionType pt, params IGuildUser[] gus)
|
|
||||||
{
|
|
||||||
foreach (var gu in gus)
|
|
||||||
{
|
|
||||||
switch (action)
|
|
||||||
{
|
|
||||||
case PunishmentAction.Mute:
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await MuteCommands.MuteUser(gu).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); }
|
|
||||||
break;
|
|
||||||
case PunishmentAction.Kick:
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await gu.Guild.AddBanAsync(gu, 7).ConfigureAwait(false);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await gu.Guild.RemoveBanAsync(gu).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
await gu.Guild.RemoveBanAsync(gu).ConfigureAwait(false);
|
|
||||||
// try it twice, really don't want to ban user if
|
|
||||||
// only kick has been specified as the punishement
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); }
|
|
||||||
break;
|
|
||||||
case PunishmentAction.Ban:
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await gu.Guild.AddBanAsync(gu, 7).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); }
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await LogCommands.TriggeredAntiProtection(gus, action, pt).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
|
||||||
[RequireContext(ContextType.Guild)]
|
|
||||||
[RequireUserPermission(GuildPermission.Administrator)]
|
|
||||||
public async Task AntiRaid(int userThreshold, int seconds, PunishmentAction action)
|
|
||||||
{
|
|
||||||
if (userThreshold < 2 || userThreshold > 30)
|
|
||||||
{
|
|
||||||
await Context.Channel.SendErrorAsync("❗️User threshold must be between **2** and **30**.").ConfigureAwait(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (seconds < 2 || seconds > 300)
|
|
||||||
{
|
|
||||||
await Context.Channel.SendErrorAsync("❗️Time must be between **2** and **300** seconds.").ConfigureAwait(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await MuteCommands.GetMuteRole(Context.Guild).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await Context.Channel.SendConfirmAsync("⚠️ 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
var setting = new AntiRaidSetting()
|
|
||||||
{
|
|
||||||
Action = action,
|
|
||||||
Seconds = seconds,
|
|
||||||
UserThreshold = userThreshold,
|
|
||||||
};
|
|
||||||
antiRaidGuilds.AddOrUpdate(Context.Guild.Id, setting, (id, old) => setting);
|
|
||||||
|
|
||||||
await Context.Channel.SendConfirmAsync($"ℹ️ {Context.User.Mention} If **{userThreshold}** or more users join within **{seconds}** seconds, I will **{action}** them.")
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[NadekoCommand, Usage, Description, Aliases]
|
|
||||||
[RequireContext(ContextType.Guild)]
|
|
||||||
[RequireUserPermission(GuildPermission.Administrator)]
|
|
||||||
public async Task AntiSpam(int messageCount=3, PunishmentAction action = PunishmentAction.Mute)
|
|
||||||
{
|
|
||||||
if (messageCount < 2 || messageCount > 10)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AntiSpamSetting throwaway;
|
|
||||||
if (antiSpamGuilds.TryRemove(Context.Guild.Id, out throwaway))
|
|
||||||
{
|
|
||||||
await Context.Channel.SendConfirmAsync("🆗 **Anti-Spam feature** has been **disabled** on this server.").ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await MuteCommands.GetMuteRole(Context.Guild).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await Context.Channel.SendErrorAsync("⚠️ 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(Context.Guild.Id, new AntiSpamSetting()
|
|
||||||
{
|
|
||||||
Action = action,
|
|
||||||
MessageThreshold = messageCount,
|
|
||||||
}))
|
|
||||||
await Context.Channel.SendConfirmAsync("✅ **Anti-Spam feature** has been **enabled** on this server.").ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -91,13 +91,11 @@ namespace NadekoBot.Modules.Administration
|
|||||||
{
|
{
|
||||||
var _log = LogManager.GetCurrentClassLogger();
|
var _log = LogManager.GetCurrentClassLogger();
|
||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
using (var uow = DbHandler.UnitOfWork())
|
|
||||||
{
|
repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(NadekoBot.AllGuildConfigs
|
||||||
repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(NadekoBot.AllGuildConfigs
|
.ToDictionary(gc => gc.GuildId,
|
||||||
.ToDictionary(gc => gc.GuildId,
|
gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters.Select(gr => new RepeatRunner(gr))
|
||||||
gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters.Select(gr => new RepeatRunner(gr))
|
.Where(gr => gr.Channel != null))));
|
||||||
.Where(gr => gr.Channel != null))));
|
|
||||||
}
|
|
||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
|
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
|
||||||
|
54
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
54
src/NadekoBot/Resources/CommandStrings.Designer.cs
generated
@ -437,6 +437,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to antilist antilst.
|
||||||
|
/// </summary>
|
||||||
|
public static string antilist_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antilist_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Shows currently enabled protection features..
|
||||||
|
/// </summary>
|
||||||
|
public static string antilist_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antilist_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}antilist`.
|
||||||
|
/// </summary>
|
||||||
|
public static string antilist_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antilist_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to antiraid.
|
/// Looks up a localized string similar to antiraid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -491,6 +518,33 @@ namespace NadekoBot.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to antispamignore.
|
||||||
|
/// </summary>
|
||||||
|
public static string antispamignore_cmd {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antispamignore_cmd", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Toggles whether antispam ignores current channel. Antispam must be enabled..
|
||||||
|
/// </summary>
|
||||||
|
public static string antispamignore_desc {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antispamignore_desc", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to `{0}antispamignore`.
|
||||||
|
/// </summary>
|
||||||
|
public static string antispamignore_usage {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("antispamignore_usage", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to asar.
|
/// Looks up a localized string similar to asar.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -2907,4 +2907,22 @@
|
|||||||
<data name="repeatremove_usage" xml:space="preserve">
|
<data name="repeatremove_usage" xml:space="preserve">
|
||||||
<value>`{0}reprm 2`</value>
|
<value>`{0}reprm 2`</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="antilist_cmd" xml:space="preserve">
|
||||||
|
<value>antilist antilst</value>
|
||||||
|
</data>
|
||||||
|
<data name="antilist_desc" xml:space="preserve">
|
||||||
|
<value>Shows currently enabled protection features.</value>
|
||||||
|
</data>
|
||||||
|
<data name="antilist_usage" xml:space="preserve">
|
||||||
|
<value>`{0}antilist`</value>
|
||||||
|
</data>
|
||||||
|
<data name="antispamignore_cmd" xml:space="preserve">
|
||||||
|
<value>antispamignore</value>
|
||||||
|
</data>
|
||||||
|
<data name="antispamignore_desc" xml:space="preserve">
|
||||||
|
<value>Toggles whether antispam ignores current channel. Antispam must be enabled.</value>
|
||||||
|
</data>
|
||||||
|
<data name="antispamignore_usage" xml:space="preserve">
|
||||||
|
<value>`{0}antispamignore`</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using static NadekoBot.Modules.Administration.Administration;
|
||||||
|
|
||||||
namespace NadekoBot.Services.Database.Models
|
namespace NadekoBot.Services.Database.Models
|
||||||
{
|
{
|
||||||
@ -59,6 +60,11 @@ namespace NadekoBot.Services.Database.Models
|
|||||||
public string MuteRoleName { get; set; }
|
public string MuteRoleName { get; set; }
|
||||||
public bool CleverbotEnabled { get; set; }
|
public bool CleverbotEnabled { get; set; }
|
||||||
public HashSet<GuildRepeater> GuildRepeaters { get; set; } = new HashSet<GuildRepeater>();
|
public HashSet<GuildRepeater> GuildRepeaters { get; set; } = new HashSet<GuildRepeater>();
|
||||||
|
|
||||||
|
public AntiRaidSetting AntiRaidSetting { get; set; }
|
||||||
|
public AntiSpamSetting AntiSpamSetting { get; set; }
|
||||||
|
|
||||||
|
//public List<ProtectionIgnoredChannel> ProtectionIgnoredChannels { get; set; } = new List<ProtectionIgnoredChannel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FilterChannelId : DbEntity
|
public class FilterChannelId : DbEntity
|
||||||
|
@ -142,6 +142,17 @@ namespace NadekoBot.Services.Database
|
|||||||
.HasIndex(c => c.GuildId)
|
.HasIndex(c => c.GuildId)
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
|
modelBuilder.Entity<AntiSpamSetting>()
|
||||||
|
.HasOne(x => x.GuildConfig)
|
||||||
|
.WithOne(x => x.AntiSpamSetting);
|
||||||
|
|
||||||
|
modelBuilder.Entity<AntiRaidSetting>()
|
||||||
|
.HasOne(x => x.GuildConfig)
|
||||||
|
.WithOne(x => x.AntiRaidSetting);
|
||||||
|
|
||||||
|
//modelBuilder.Entity<ProtectionIgnoredChannel>()
|
||||||
|
// .HasAlternateKey(c => new { c.ChannelId, c.ProtectionType });
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region BotConfig
|
#region BotConfig
|
||||||
@ -221,6 +232,11 @@ namespace NadekoBot.Services.Database
|
|||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Protection
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,9 @@ namespace NadekoBot.Services.Database.Repositories.Impl
|
|||||||
.Include(gc => gc.FilteredWords)
|
.Include(gc => gc.FilteredWords)
|
||||||
.Include(gc => gc.CommandCooldowns)
|
.Include(gc => gc.CommandCooldowns)
|
||||||
.Include(gc => gc.GuildRepeaters)
|
.Include(gc => gc.GuildRepeaters)
|
||||||
|
.Include(gc => gc.AntiRaidSetting)
|
||||||
|
.Include(gc => gc.AntiSpamSetting)
|
||||||
|
.ThenInclude(x => x.IgnoredChannels)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user