Woopsie
This commit is contained in:
		
							
								
								
									
										942
									
								
								src/NadekoBot/Migrations/20170110180534_protection.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										942
									
								
								src/NadekoBot/Migrations/20170110180534_protection.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,942 @@ | ||||
| using System; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.EntityFrameworkCore.Infrastructure; | ||||
| using Microsoft.EntityFrameworkCore.Metadata; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NadekoBot.Modules.Music.Classes; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|     [DbContext(typeof(NadekoContext))] | ||||
|     [Migration("20170110180534_protection")] | ||||
|     partial class protection | ||||
|     { | ||||
|         protected override void BuildTargetModel(ModelBuilder modelBuilder) | ||||
|         { | ||||
|             modelBuilder | ||||
|                 .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 => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<ulong>("ItemId"); | ||||
|  | ||||
|                     b.Property<int>("Type"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("BlacklistItem"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("BufferSize"); | ||||
|  | ||||
|                     b.Property<float>("CurrencyGenerationChance"); | ||||
|  | ||||
|                     b.Property<int>("CurrencyGenerationCooldown"); | ||||
|  | ||||
|                     b.Property<string>("CurrencyName"); | ||||
|  | ||||
|                     b.Property<string>("CurrencyPluralName"); | ||||
|  | ||||
|                     b.Property<string>("CurrencySign"); | ||||
|  | ||||
|                     b.Property<string>("DMHelpString"); | ||||
|  | ||||
|                     b.Property<bool>("ForwardMessages"); | ||||
|  | ||||
|                     b.Property<bool>("ForwardToAllOwners"); | ||||
|  | ||||
|                     b.Property<string>("HelpString"); | ||||
|  | ||||
|                     b.Property<int>("MigrationVersion"); | ||||
|  | ||||
|                     b.Property<string>("RemindMessageFormat"); | ||||
|  | ||||
|                     b.Property<bool>("RotatingStatuses"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("BotConfig"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<bool>("BaseDestroyed"); | ||||
|  | ||||
|                     b.Property<string>("CallUser"); | ||||
|  | ||||
|                     b.Property<int>("ClashWarId"); | ||||
|  | ||||
|                     b.Property<int?>("SequenceNumber"); | ||||
|  | ||||
|                     b.Property<int>("Stars"); | ||||
|  | ||||
|                     b.Property<DateTime>("TimeAdded"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("ClashWarId"); | ||||
|  | ||||
|                     b.ToTable("ClashCallers"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<string>("EnemyClan"); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<int>("Size"); | ||||
|  | ||||
|                     b.Property<DateTime>("StartedAt"); | ||||
|  | ||||
|                     b.Property<int>("WarState"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("ClashOfClans"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<string>("CommandName"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<int>("Seconds"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("CommandCooldown"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<string>("InternalTrigger"); | ||||
|  | ||||
|                     b.Property<decimal>("Modifier"); | ||||
|  | ||||
|                     b.Property<string>("UnitType"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("ConversionUnits"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<long>("Amount"); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("UserId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     b.ToTable("Currency"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<long>("Amount"); | ||||
|  | ||||
|                     b.Property<string>("Reason"); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("CurrencyTransactions"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong?>("GuildId"); | ||||
|  | ||||
|                     b.Property<bool>("IsRegex"); | ||||
|  | ||||
|                     b.Property<bool>("OwnerOnly"); | ||||
|  | ||||
|                     b.Property<string>("Response"); | ||||
|  | ||||
|                     b.Property<string>("Trigger"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("CustomReactions"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int>("Amount"); | ||||
|  | ||||
|                     b.Property<string>("Name"); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("UserId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     b.ToTable("Donators"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<string>("Text"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("EightBallResponses"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId1"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId1"); | ||||
|  | ||||
|                     b.ToTable("FilterChannelId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<string>("Word"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("FilteredWord"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<int>("Type"); | ||||
|  | ||||
|                     b.Property<string>("Username"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("FollowedStream"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("GCChannelId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("AutoAssignRoleId"); | ||||
|  | ||||
|                     b.Property<bool>("AutoDeleteByeMessages"); | ||||
|  | ||||
|                     b.Property<int>("AutoDeleteByeMessagesTimer"); | ||||
|  | ||||
|                     b.Property<bool>("AutoDeleteGreetMessages"); | ||||
|  | ||||
|                     b.Property<int>("AutoDeleteGreetMessagesTimer"); | ||||
|  | ||||
|                     b.Property<bool>("AutoDeleteSelfAssignedRoleMessages"); | ||||
|  | ||||
|                     b.Property<ulong>("ByeMessageChannelId"); | ||||
|  | ||||
|                     b.Property<string>("ChannelByeMessageText"); | ||||
|  | ||||
|                     b.Property<string>("ChannelGreetMessageText"); | ||||
|  | ||||
|                     b.Property<bool>("CleverbotEnabled"); | ||||
|  | ||||
|                     b.Property<float>("DefaultMusicVolume"); | ||||
|  | ||||
|                     b.Property<bool>("DeleteMessageOnCommand"); | ||||
|  | ||||
|                     b.Property<string>("DmGreetMessageText"); | ||||
|  | ||||
|                     b.Property<bool>("ExclusiveSelfAssignedRoles"); | ||||
|  | ||||
|                     b.Property<bool>("FilterInvites"); | ||||
|  | ||||
|                     b.Property<bool>("FilterWords"); | ||||
|  | ||||
|                     b.Property<ulong>("GreetMessageChannelId"); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<int?>("LogSettingId"); | ||||
|  | ||||
|                     b.Property<string>("MuteRoleName"); | ||||
|  | ||||
|                     b.Property<string>("PermissionRole"); | ||||
|  | ||||
|                     b.Property<int?>("RootPermissionId"); | ||||
|  | ||||
|                     b.Property<bool>("SendChannelByeMessage"); | ||||
|  | ||||
|                     b.Property<bool>("SendChannelGreetMessage"); | ||||
|  | ||||
|                     b.Property<bool>("SendDmGreetMessage"); | ||||
|  | ||||
|                     b.Property<bool>("VerbosePermissions"); | ||||
|  | ||||
|                     b.Property<bool>("VoicePlusTextEnabled"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     b.HasIndex("LogSettingId"); | ||||
|  | ||||
|                     b.HasIndex("RootPermissionId"); | ||||
|  | ||||
|                     b.ToTable("GuildConfigs"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<TimeSpan>("Interval"); | ||||
|  | ||||
|                     b.Property<string>("Message"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("GuildRepeater"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("LogSettingId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("LogSettingId"); | ||||
|  | ||||
|                     b.ToTable("IgnoredLogChannels"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<int?>("LogSettingId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("LogSettingId"); | ||||
|  | ||||
|                     b.ToTable("IgnoredVoicePresenceCHannels"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<bool>("ChannelCreated"); | ||||
|  | ||||
|                     b.Property<ulong?>("ChannelCreatedId"); | ||||
|  | ||||
|                     b.Property<bool>("ChannelDestroyed"); | ||||
|  | ||||
|                     b.Property<ulong?>("ChannelDestroyedId"); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<bool>("ChannelUpdated"); | ||||
|  | ||||
|                     b.Property<ulong?>("ChannelUpdatedId"); | ||||
|  | ||||
|                     b.Property<bool>("IsLogging"); | ||||
|  | ||||
|                     b.Property<ulong?>("LogOtherId"); | ||||
|  | ||||
|                     b.Property<bool>("LogUserPresence"); | ||||
|  | ||||
|                     b.Property<ulong?>("LogUserPresenceId"); | ||||
|  | ||||
|                     b.Property<bool>("LogVoicePresence"); | ||||
|  | ||||
|                     b.Property<ulong?>("LogVoicePresenceId"); | ||||
|  | ||||
|                     b.Property<ulong?>("LogVoicePresenceTTSId"); | ||||
|  | ||||
|                     b.Property<bool>("MessageDeleted"); | ||||
|  | ||||
|                     b.Property<ulong?>("MessageDeletedId"); | ||||
|  | ||||
|                     b.Property<bool>("MessageUpdated"); | ||||
|  | ||||
|                     b.Property<ulong?>("MessageUpdatedId"); | ||||
|  | ||||
|                     b.Property<bool>("UserBanned"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserBannedId"); | ||||
|  | ||||
|                     b.Property<bool>("UserJoined"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserJoinedId"); | ||||
|  | ||||
|                     b.Property<bool>("UserLeft"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserLeftId"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserMutedId"); | ||||
|  | ||||
|                     b.Property<ulong>("UserPresenceChannelId"); | ||||
|  | ||||
|                     b.Property<bool>("UserUnbanned"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserUnbannedId"); | ||||
|  | ||||
|                     b.Property<bool>("UserUpdated"); | ||||
|  | ||||
|                     b.Property<ulong?>("UserUpdatedId"); | ||||
|  | ||||
|                     b.Property<ulong>("VoicePresenceChannelId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("LogSettings"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<string>("ModuleName"); | ||||
|  | ||||
|                     b.Property<string>("Prefix"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("ModulePrefixes"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<string>("Author"); | ||||
|  | ||||
|                     b.Property<ulong>("AuthorId"); | ||||
|  | ||||
|                     b.Property<string>("Name"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("MusicPlaylists"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("GuildConfigId"); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildConfigId"); | ||||
|  | ||||
|                     b.ToTable("MutedUserId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("NextId"); | ||||
|  | ||||
|                     b.Property<int>("PrimaryTarget"); | ||||
|  | ||||
|                     b.Property<ulong>("PrimaryTargetId"); | ||||
|  | ||||
|                     b.Property<int>("SecondaryTarget"); | ||||
|  | ||||
|                     b.Property<string>("SecondaryTargetName"); | ||||
|  | ||||
|                     b.Property<bool>("State"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("NextId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     b.ToTable("Permission"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<string>("Status"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("PlayingStatus"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("MusicPlaylistId"); | ||||
|  | ||||
|                     b.Property<string>("Provider"); | ||||
|  | ||||
|                     b.Property<int>("ProviderType"); | ||||
|  | ||||
|                     b.Property<string>("Query"); | ||||
|  | ||||
|                     b.Property<string>("Title"); | ||||
|  | ||||
|                     b.Property<string>("Uri"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("MusicPlaylistId"); | ||||
|  | ||||
|                     b.ToTable("PlaylistSong"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("AuthorId"); | ||||
|  | ||||
|                     b.Property<string>("AuthorName") | ||||
|                         .IsRequired(); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<string>("Keyword") | ||||
|                         .IsRequired(); | ||||
|  | ||||
|                     b.Property<string>("Text") | ||||
|                         .IsRequired(); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("Quotes"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<int?>("BotConfigId"); | ||||
|  | ||||
|                     b.Property<string>("Icon"); | ||||
|  | ||||
|                     b.Property<string>("Name"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("BotConfigId"); | ||||
|  | ||||
|                     b.ToTable("RaceAnimals"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("ChannelId"); | ||||
|  | ||||
|                     b.Property<bool>("IsPrivate"); | ||||
|  | ||||
|                     b.Property<string>("Message"); | ||||
|  | ||||
|                     b.Property<ulong>("ServerId"); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.Property<DateTime>("When"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.ToTable("Reminders"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("GuildId"); | ||||
|  | ||||
|                     b.Property<ulong>("RoleId"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("GuildId", "RoleId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     b.ToTable("SelfAssignableRoles"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => | ||||
|                 { | ||||
|                     b.Property<int>("Id") | ||||
|                         .ValueGeneratedOnAdd(); | ||||
|  | ||||
|                     b.Property<ulong>("UserId"); | ||||
|  | ||||
|                     b.Property<string>("type"); | ||||
|  | ||||
|                     b.HasKey("Id"); | ||||
|  | ||||
|                     b.HasIndex("UserId") | ||||
|                         .IsUnique(); | ||||
|  | ||||
|                     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 => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|                         .WithMany("Blacklist") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") | ||||
|                         .WithMany("Bases") | ||||
|                         .HasForeignKey("ClashWarId") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("CommandCooldowns") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|                         .WithMany("EightBallResponses") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("FilterInvitesChannelIds") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|  | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("FilterWordsChannelIds") | ||||
|                         .HasForeignKey("GuildConfigId1"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("FilteredWords") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("FollowedStreams") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("GenerateCurrencyChannelIds") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") | ||||
|                         .WithMany() | ||||
|                         .HasForeignKey("LogSettingId"); | ||||
|  | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") | ||||
|                         .WithMany() | ||||
|                         .HasForeignKey("RootPermissionId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("GuildRepeaters") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") | ||||
|                         .WithMany("IgnoredChannels") | ||||
|                         .HasForeignKey("LogSettingId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") | ||||
|                         .WithMany("IgnoredVoicePresenceChannelIds") | ||||
|                         .HasForeignKey("LogSettingId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|                         .WithMany("ModulePrefixes") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") | ||||
|                         .WithMany("MutedUsers") | ||||
|                         .HasForeignKey("GuildConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") | ||||
|                         .WithOne("Previous") | ||||
|                         .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|                         .WithMany("RotatingStatusMessages") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") | ||||
|                         .WithMany("Songs") | ||||
|                         .HasForeignKey("MusicPlaylistId") | ||||
|                         .OnDelete(DeleteBehavior.Cascade); | ||||
|                 }); | ||||
|  | ||||
|             modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => | ||||
|                 { | ||||
|                     b.HasOne("NadekoBot.Services.Database.Models.BotConfig") | ||||
|                         .WithMany("RaceAnimals") | ||||
|                         .HasForeignKey("BotConfigId"); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										104
									
								
								src/NadekoBot/Migrations/20170110180534_protection.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/NadekoBot/Migrations/20170110180534_protection.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
|  | ||||
| namespace NadekoBot.Migrations | ||||
| { | ||||
|     public partial class protection : Migration | ||||
|     { | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AntiRaidSetting", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     Action = table.Column<int>(nullable: false), | ||||
|                     GuildConfigId = table.Column<int>(nullable: false), | ||||
|                     Seconds = table.Column<int>(nullable: false), | ||||
|                     UserThreshold = table.Column<int>(nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AntiRaidSetting", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AntiRaidSetting_GuildConfigs_GuildConfigId", | ||||
|                         column: x => x.GuildConfigId, | ||||
|                         principalTable: "GuildConfigs", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Restrict); | ||||
|                 }); | ||||
|  | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AntiSpamSetting", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     Action = table.Column<int>(nullable: false), | ||||
|                     GuildConfigId = table.Column<int>(nullable: false), | ||||
|                     MessageThreshold = table.Column<int>(nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AntiSpamSetting", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AntiSpamSetting_GuildConfigs_GuildConfigId", | ||||
|                         column: x => x.GuildConfigId, | ||||
|                         principalTable: "GuildConfigs", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Restrict); | ||||
|                 }); | ||||
|  | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AntiSpamIgnore", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     AntiSpamSettingId = table.Column<int>(nullable: true), | ||||
|                     ChannelId = table.Column<ulong>(nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AntiSpamIgnore", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AntiSpamIgnore_AntiSpamSetting_AntiSpamSettingId", | ||||
|                         column: x => x.AntiSpamSettingId, | ||||
|                         principalTable: "AntiSpamSetting", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Restrict); | ||||
|                 }); | ||||
|  | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AntiRaidSetting_GuildConfigId", | ||||
|                 table: "AntiRaidSetting", | ||||
|                 column: "GuildConfigId", | ||||
|                 unique: true); | ||||
|  | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AntiSpamIgnore_AntiSpamSettingId", | ||||
|                 table: "AntiSpamIgnore", | ||||
|                 column: "AntiSpamSettingId"); | ||||
|  | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AntiSpamSetting_GuildConfigId", | ||||
|                 table: "AntiSpamSetting", | ||||
|                 column: "GuildConfigId", | ||||
|                 unique: true); | ||||
|         } | ||||
|  | ||||
|         protected override void Down(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AntiRaidSetting"); | ||||
|  | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AntiSpamIgnore"); | ||||
|  | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AntiSpamSetting"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,425 @@ | ||||
| using Discord; | ||||
| using Discord.Commands; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using NadekoBot.Attributes; | ||||
| using NadekoBot.Extensions; | ||||
| using NadekoBot.Services; | ||||
| using NadekoBot.Services.Database; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using NLog; | ||||
| using System; | ||||
| using System.Collections.Concurrent; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace NadekoBot.Modules.Administration | ||||
| { | ||||
|     public partial class Administration | ||||
|     { | ||||
|         public enum ProtectionType | ||||
|         { | ||||
|             Raiding, | ||||
|             Spamming, | ||||
|         } | ||||
|  | ||||
|         public class AntiRaidStats | ||||
|         { | ||||
|             public AntiRaidSetting AntiRaidSettings { get; set; } | ||||
|             public int UsersCount { get; set; } = 0; | ||||
|             public ConcurrentHashSet<IGuildUser> RaidUsers { get; set; } = new ConcurrentHashSet<IGuildUser>(); | ||||
|  | ||||
|             public override string ToString() => | ||||
|                 $"If **{AntiRaidSettings.UserThreshold}** or more users join within **{AntiRaidSettings.Seconds}** seconds," + | ||||
|                 $" I will **{AntiRaidSettings.Action}** them."; | ||||
|         } | ||||
|  | ||||
|         public class AntiSpamStats | ||||
|         { | ||||
|             public AntiSpamSetting AntiSpamSettings { get; set; } | ||||
|             public ConcurrentDictionary<ulong, UserSpamStats> UserStats { get; set; } | ||||
|                 = new ConcurrentDictionary<ulong, UserSpamStats>(); | ||||
|  | ||||
|             public override string ToString() | ||||
|             { | ||||
|                 var ignoredString = string.Join(", ", AntiSpamSettings.IgnoredChannels.Select(c => $"<#{c.ChannelId}>")); | ||||
|  | ||||
|                 if (string.IsNullOrWhiteSpace(ignoredString)) | ||||
|                     ignoredString = "none"; | ||||
|                 return $"If a user posts **{AntiSpamSettings.MessageThreshold}** same messages in a row, I will **{AntiSpamSettings.Action}** them." | ||||
|                 + $"\n\t__IgnoredChannels__: {ignoredString}"; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public 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 ProtectionCommands : ModuleBase | ||||
|         { | ||||
|             private static ConcurrentDictionary<ulong, AntiRaidStats> antiRaidGuilds = | ||||
|                     new ConcurrentDictionary<ulong, AntiRaidStats>(); | ||||
|             // guildId | (userId|messages) | ||||
|             private static ConcurrentDictionary<ulong, AntiSpamStats> antiSpamGuilds = | ||||
|                     new ConcurrentDictionary<ulong, AntiSpamStats>(); | ||||
|  | ||||
|             private static Logger _log { get; } | ||||
|  | ||||
|             static ProtectionCommands() | ||||
|             { | ||||
|                 _log = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|                 foreach (var gc in NadekoBot.AllGuildConfigs) | ||||
|                 { | ||||
|                     var raid = gc.AntiRaidSetting; | ||||
|                     var spam = gc.AntiSpamSetting; | ||||
|  | ||||
|                     if (raid != null) | ||||
|                     { | ||||
|                         var raidStats = new AntiRaidStats() { AntiRaidSettings = raid }; | ||||
|                         antiRaidGuilds.TryAdd(gc.GuildId, raidStats); | ||||
|                     } | ||||
|  | ||||
|                     if (spam != null) | ||||
|                         antiSpamGuilds.TryAdd(gc.GuildId, new AntiSpamStats() { AntiSpamSettings = spam }); | ||||
|                 } | ||||
|  | ||||
|                 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; | ||||
|                         AntiSpamStats spamSettings; | ||||
|                         if (!antiSpamGuilds.TryGetValue(channel.Guild.Id, out spamSettings) || | ||||
|                             spamSettings.AntiSpamSettings.IgnoredChannels.Contains(new AntiSpamIgnore() | ||||
|                             { | ||||
|                                 ChannelId = channel.Id | ||||
|                             })) | ||||
|                             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.AntiSpamSettings.MessageThreshold) | ||||
|                         { | ||||
|                             if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats)) | ||||
|                             { | ||||
|                                 await PunishUsers(spamSettings.AntiSpamSettings.Action, ProtectionType.Spamming, (IGuildUser)msg.Author) | ||||
|                                     .ConfigureAwait(false); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     catch { } | ||||
|                 }; | ||||
|  | ||||
|                 NadekoBot.Client.UserJoined += async (usr) => | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         if (usr.IsBot) | ||||
|                             return; | ||||
|                         AntiRaidStats settings; | ||||
|                         if (!antiRaidGuilds.TryGetValue(usr.Guild.Id, out settings)) | ||||
|                             return; | ||||
|                         if (!settings.RaidUsers.Add(usr)) | ||||
|                             return; | ||||
|  | ||||
|                         ++settings.UsersCount; | ||||
|  | ||||
|                         if (settings.UsersCount >= settings.AntiRaidSettings.UserThreshold) | ||||
|                         { | ||||
|                             var users = settings.RaidUsers.ToArray(); | ||||
|                             settings.RaidUsers.Clear(); | ||||
|  | ||||
|                             await PunishUsers(settings.AntiRaidSettings.Action, ProtectionType.Raiding, users).ConfigureAwait(false); | ||||
|                         } | ||||
|                         await Task.Delay(1000 * settings.AntiRaidSettings.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 = 5, int seconds = 10, PunishmentAction action = PunishmentAction.Mute) | ||||
|             { | ||||
|                 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; | ||||
|                 } | ||||
|  | ||||
|                 AntiRaidStats throwaway; | ||||
|                 if (antiRaidGuilds.TryRemove(Context.Guild.Id, out throwaway)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     { | ||||
|                         var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.AntiRaidSetting)); | ||||
|  | ||||
|                         gc.AntiRaidSetting = null; | ||||
|                         await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                     } | ||||
|                     await Context.Channel.SendConfirmAsync("**Anti-Raid** feature has been **disabled** on this server.").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 stats = new AntiRaidStats() | ||||
|                 { | ||||
|                     AntiRaidSettings = new AntiRaidSetting() | ||||
|                     { | ||||
|                         Action = action, | ||||
|                         Seconds = seconds, | ||||
|                         UserThreshold = userThreshold, | ||||
|                     } | ||||
|                 }; | ||||
|  | ||||
|                 antiRaidGuilds.AddOrUpdate(Context.Guild.Id, stats, (key, old) => stats); | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.AntiRaidSetting)); | ||||
|  | ||||
|                     gc.AntiRaidSetting = stats.AntiRaidSettings; | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|  | ||||
|                 await Context.Channel.SendConfirmAsync("Anti-Raid Enabled", $"{Context.User.Mention} {stats.ToString()}") | ||||
|                         .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; | ||||
|  | ||||
|                 AntiSpamStats throwaway; | ||||
|                 if (antiSpamGuilds.TryRemove(Context.Guild.Id, out throwaway)) | ||||
|                 { | ||||
|                     using (var uow = DbHandler.UnitOfWork()) | ||||
|                     { | ||||
|                         var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.AntiSpamSetting) | ||||
|                             .ThenInclude(x => x.IgnoredChannels)); | ||||
|  | ||||
|                         gc.AntiSpamSetting = null; | ||||
|                         await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                     } | ||||
|                     await Context.Channel.SendConfirmAsync("**Anti-Spam** has been **disabled** on this server.").ConfigureAwait(false); | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 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; | ||||
|                 } | ||||
|  | ||||
|                 var stats = new AntiSpamStats | ||||
|                 { | ||||
|                     AntiSpamSettings = new AntiSpamSetting() | ||||
|                     { | ||||
|                         Action = action, | ||||
|                         MessageThreshold = messageCount, | ||||
|                     } | ||||
|                 }; | ||||
|  | ||||
|                 antiSpamGuilds.AddOrUpdate(Context.Guild.Id, stats, (key, old) => stats); | ||||
|  | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.AntiSpamSetting)); | ||||
|  | ||||
|                     gc.AntiSpamSetting = stats.AntiSpamSettings; | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|  | ||||
|                 await Context.Channel.SendConfirmAsync("Anti-Spam Enabled", $"{Context.User.Mention} {stats.ToString()}").ConfigureAwait(false); | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task AntispamIgnore() | ||||
|             { | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 var obj = new AntiSpamIgnore() | ||||
|                 { | ||||
|                     ChannelId = channel.Id | ||||
|                 }; | ||||
|                 bool added; | ||||
|                 using (var uow = DbHandler.UnitOfWork()) | ||||
|                 { | ||||
|                     var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.AntiSpamSetting).ThenInclude(x => x.IgnoredChannels)); | ||||
|                     var spam = gc.AntiSpamSetting; | ||||
|                     if (spam == null) | ||||
|                     { | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     if (spam.IgnoredChannels.Add(obj)) | ||||
|                     { | ||||
|                         AntiSpamStats temp; | ||||
|                         if (antiSpamGuilds.TryGetValue(Context.Guild.Id, out temp)) | ||||
|                             temp.AntiSpamSettings.IgnoredChannels.Add(obj); | ||||
|                         added = true; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         spam.IgnoredChannels.Remove(obj); | ||||
|                         AntiSpamStats temp; | ||||
|                         if (antiSpamGuilds.TryGetValue(Context.Guild.Id, out temp)) | ||||
|                             temp.AntiSpamSettings.IgnoredChannels.Remove(obj); | ||||
|                         added = false; | ||||
|                     } | ||||
|  | ||||
|                     await uow.CompleteAsync().ConfigureAwait(false); | ||||
|                 } | ||||
|                 if (added) | ||||
|                     await Context.Channel.SendConfirmAsync("Anti-Spam will ignore this channel.").ConfigureAwait(false); | ||||
|                 else | ||||
|                     await Context.Channel.SendConfirmAsync("Anti-Spam will no longer ignore this channel.").ConfigureAwait(false); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             [NadekoCommand, Usage, Description, Aliases] | ||||
|             [RequireContext(ContextType.Guild)] | ||||
|             public async Task AntiList() | ||||
|             { | ||||
|                 var channel = (ITextChannel)Context.Channel; | ||||
|  | ||||
|                 AntiSpamStats spam; | ||||
|                 antiSpamGuilds.TryGetValue(Context.Guild.Id, out spam); | ||||
|  | ||||
|                 AntiRaidStats raid; | ||||
|                 antiRaidGuilds.TryGetValue(Context.Guild.Id, out raid); | ||||
|  | ||||
|                 if (spam == null && raid == null) | ||||
|                 { | ||||
|                     await Context.Channel.SendConfirmAsync("No protections enabled."); | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 var embed = new EmbedBuilder().WithOkColor() | ||||
|                     .WithTitle("Protections Enabled"); | ||||
|  | ||||
|                 if (spam != null) | ||||
|                     embed.AddField(efb => efb.WithName("Anti-Spam") | ||||
|                         .WithValue(spam.ToString()) | ||||
|                         .WithIsInline(true)); | ||||
|  | ||||
|                 if (raid != null) | ||||
|                     embed.AddField(efb => efb.WithName("Anti-Raid") | ||||
|                         .WithValue(raid.ToString()) | ||||
|                         .WithIsInline(true)); | ||||
|  | ||||
|                 await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								src/NadekoBot/Services/Database/Models/AntiProtection.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/NadekoBot/Services/Database/Models/AntiProtection.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| using Discord; | ||||
| using NadekoBot.Services.Database.Models; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations.Schema; | ||||
| namespace NadekoBot.Services.Database.Models | ||||
| { | ||||
|     public class AntiRaidSetting : DbEntity | ||||
|     { | ||||
|         public int GuildConfigId { get; set; } | ||||
|         public GuildConfig GuildConfig { get; set; } | ||||
|  | ||||
|         public int UserThreshold { get; set; } | ||||
|         public int Seconds { get; set; } | ||||
|         public PunishmentAction Action { get; set; } | ||||
|     } | ||||
|  | ||||
|     public class AntiSpamSetting : DbEntity | ||||
|     { | ||||
|         public int GuildConfigId { get; set; } | ||||
|         public GuildConfig GuildConfig { get; set; } | ||||
|  | ||||
|         public PunishmentAction Action { get; set; } | ||||
|         public int MessageThreshold { get; set; } = 3; | ||||
|         public HashSet<AntiSpamIgnore> IgnoredChannels { get; set; } = new HashSet<AntiSpamIgnore>(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public enum PunishmentAction | ||||
|     { | ||||
|         Mute, | ||||
|         Kick, | ||||
|         Ban, | ||||
|     } | ||||
|  | ||||
|     public class AntiSpamIgnore : DbEntity | ||||
|     { | ||||
|         public ulong ChannelId { get; set; } | ||||
|  | ||||
|         public override int GetHashCode() => ChannelId.GetHashCode(); | ||||
|  | ||||
|         public override bool Equals(object obj) | ||||
|         { | ||||
|             var inst = obj as AntiSpamIgnore; | ||||
|  | ||||
|             if (inst == null) | ||||
|                 return false; | ||||
|  | ||||
|             return inst.ChannelId == ChannelId; | ||||
|              | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user