Permissions should work completley excep moving
This commit is contained in:
		@@ -1,587 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
using NadekoBot.Services.Database.Impl;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(NadekoSqliteContext))]
 | 
			
		||||
    [Migration("20160922170157_perms")]
 | 
			
		||||
    partial class perms
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            modelBuilder
 | 
			
		||||
                .HasAnnotation("ProductVersion", "1.0.0-rtm-21431");
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("BotConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ItemId");
 | 
			
		||||
 | 
			
		||||
                    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<bool>("DontJoinServers");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ForwardMessages");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ForwardToAllOwners");
 | 
			
		||||
 | 
			
		||||
                    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>("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.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.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.FollowedStream", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LastStatus");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("Type");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Username");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("FollowedStream");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("AutoAssignRoleId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("AutoDeleteByeMessages");
 | 
			
		||||
 | 
			
		||||
                    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<float>("DefaultMusicVolume");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("DeleteMessageOnCommand");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("DmGreetMessageText");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ExclusiveSelfAssignedRoles");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong?>("GenerateCurrencyChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GreetMessageChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendDmGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VoicePlusTextEnabled");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildId")
 | 
			
		||||
                        .IsUnique();
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("GuildConfigs");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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<bool>("ChannelDestroyed");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ChannelUpdated");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("IsLogging");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LogUserPresence");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LogVoicePresence");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageDeleted");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageReceived");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageUpdated");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserBanned");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserJoined");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserLeft");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("UserPresenceChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserUnbanned");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserUpdated");
 | 
			
		||||
 | 
			
		||||
                    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.Permission", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    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("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    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.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.Repeater", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<TimeSpan>("Interval");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Message");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("ChannelId")
 | 
			
		||||
                        .IsUnique();
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("Repeaters");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.TypingArticle", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Author");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Text");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("TypingArticles");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.EightBallResponse", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("EightBallResponses")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.GuildConfig", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
 | 
			
		||||
                        .WithMany()
 | 
			
		||||
                        .HasForeignKey("LogSettingId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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", "BotConfig")
 | 
			
		||||
                        .WithMany("ModulePrefixes")
 | 
			
		||||
                        .HasForeignKey("BotConfigId")
 | 
			
		||||
                        .OnDelete(DeleteBehavior.Cascade);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
 | 
			
		||||
                        .WithMany("Permissions")
 | 
			
		||||
                        .HasForeignKey("GuildConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.RaceAnimal", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("RaceAnimals")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,587 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Metadata;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
using NadekoBot.Services.Database.Impl;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(NadekoSqliteContext))]
 | 
			
		||||
    [Migration("20160926144107_second")]
 | 
			
		||||
    partial class second
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            modelBuilder
 | 
			
		||||
                .HasAnnotation("ProductVersion", "1.0.0-rtm-21431");
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("BotConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ItemId");
 | 
			
		||||
 | 
			
		||||
                    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<bool>("DontJoinServers");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ForwardMessages");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ForwardToAllOwners");
 | 
			
		||||
 | 
			
		||||
                    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>("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.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.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.FollowedStream", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LastStatus");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("Type");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Username");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("FollowedStream");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("AutoAssignRoleId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("AutoDeleteByeMessages");
 | 
			
		||||
 | 
			
		||||
                    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<float>("DefaultMusicVolume");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("DeleteMessageOnCommand");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("DmGreetMessageText");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ExclusiveSelfAssignedRoles");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong?>("GenerateCurrencyChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GreetMessageChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendDmGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VoicePlusTextEnabled");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildId")
 | 
			
		||||
                        .IsUnique();
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("GuildConfigs");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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<bool>("ChannelDestroyed");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("ChannelUpdated");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("IsLogging");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LogUserPresence");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("LogVoicePresence");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageDeleted");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageReceived");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("MessageUpdated");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserBanned");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserJoined");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserLeft");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("UserPresenceChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserUnbanned");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("UserUpdated");
 | 
			
		||||
 | 
			
		||||
                    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.Permission", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    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("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    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.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.Repeater", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<TimeSpan>("Interval");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Message");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("ChannelId")
 | 
			
		||||
                        .IsUnique();
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("Repeaters");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.TypingArticle", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Author");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Text");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("TypingArticles");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.EightBallResponse", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("EightBallResponses")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.GuildConfig", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
 | 
			
		||||
                        .WithMany()
 | 
			
		||||
                        .HasForeignKey("LogSettingId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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", "BotConfig")
 | 
			
		||||
                        .WithMany("ModulePrefixes")
 | 
			
		||||
                        .HasForeignKey("BotConfigId")
 | 
			
		||||
                        .OnDelete(DeleteBehavior.Cascade);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
 | 
			
		||||
                        .WithMany("Permissions")
 | 
			
		||||
                        .HasForeignKey("GuildConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.RaceAnimal", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("RaceAnimals")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    public partial class second : Migration
 | 
			
		||||
    {
 | 
			
		||||
        protected override void Up(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Down(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,106 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    public partial class moarperms : Migration
 | 
			
		||||
    {
 | 
			
		||||
        protected override void Up(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.DropForeignKey(
 | 
			
		||||
                name: "FK_Permission_GuildConfigs_GuildConfigId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropIndex(
 | 
			
		||||
                name: "IX_Permission_GuildConfigId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropColumn(
 | 
			
		||||
                name: "GuildConfigId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddColumn<int>(
 | 
			
		||||
                name: "NextId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                nullable: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddColumn<int>(
 | 
			
		||||
                name: "RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                nullable: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_Permission_NextId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "NextId",
 | 
			
		||||
                unique: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_GuildConfigs_RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                column: "RootPermissionId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddForeignKey(
 | 
			
		||||
                name: "FK_GuildConfigs_Permission_RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                column: "RootPermissionId",
 | 
			
		||||
                principalTable: "Permission",
 | 
			
		||||
                principalColumn: "Id",
 | 
			
		||||
                onDelete: ReferentialAction.Restrict);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddForeignKey(
 | 
			
		||||
                name: "FK_Permission_Permission_NextId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "NextId",
 | 
			
		||||
                principalTable: "Permission",
 | 
			
		||||
                principalColumn: "Id",
 | 
			
		||||
                onDelete: ReferentialAction.Restrict);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Down(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.DropForeignKey(
 | 
			
		||||
                name: "FK_GuildConfigs_Permission_RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropForeignKey(
 | 
			
		||||
                name: "FK_Permission_Permission_NextId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropIndex(
 | 
			
		||||
                name: "IX_Permission_NextId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropIndex(
 | 
			
		||||
                name: "IX_GuildConfigs_RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropColumn(
 | 
			
		||||
                name: "NextId",
 | 
			
		||||
                table: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropColumn(
 | 
			
		||||
                name: "RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddColumn<int>(
 | 
			
		||||
                name: "GuildConfigId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                nullable: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_Permission_GuildConfigId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "GuildConfigId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.AddForeignKey(
 | 
			
		||||
                name: "FK_Permission_GuildConfigs_GuildConfigId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "GuildConfigId",
 | 
			
		||||
                principalTable: "GuildConfigs",
 | 
			
		||||
                principalColumn: "Id",
 | 
			
		||||
                onDelete: ReferentialAction.Restrict);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -8,8 +8,8 @@ using NadekoBot.Services.Database.Impl;
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(NadekoSqliteContext))]
 | 
			
		||||
    [Migration("20160927023659_moar perms")]
 | 
			
		||||
    partial class moarperms
 | 
			
		||||
    [Migration("20160930001917_first")]
 | 
			
		||||
    partial class first
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
@@ -237,6 +237,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("PermissionRole");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("RootPermissionId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
@@ -245,6 +247,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendDmGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VerbosePermissions");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VoicePlusTextEnabled");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
@@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    public partial class perms : Migration
 | 
			
		||||
    public partial class first : Migration
 | 
			
		||||
    {
 | 
			
		||||
        protected override void Up(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
@@ -122,6 +122,30 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    table.PrimaryKey("PK_LogSettings", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "Permission",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    NextId = table.Column<int>(nullable: true),
 | 
			
		||||
                    PrimaryTarget = table.Column<int>(nullable: false),
 | 
			
		||||
                    PrimaryTargetId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    SecondaryTarget = table.Column<int>(nullable: false),
 | 
			
		||||
                    SecondaryTargetName = table.Column<string>(nullable: true),
 | 
			
		||||
                    State = table.Column<bool>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_Permission", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_Permission_Permission_NextId",
 | 
			
		||||
                        column: x => x.NextId,
 | 
			
		||||
                        principalTable: "Permission",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "Quotes",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -326,44 +350,6 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        onDelete: ReferentialAction.Cascade);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "GuildConfigs",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    AutoAssignRoleId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    AutoDeleteByeMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessagesTimer = table.Column<int>(nullable: false),
 | 
			
		||||
                    AutoDeleteSelfAssignedRoleMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ByeMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    ChannelByeMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ChannelGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    DefaultMusicVolume = table.Column<float>(nullable: false),
 | 
			
		||||
                    DeleteMessageOnCommand = table.Column<bool>(nullable: false),
 | 
			
		||||
                    DmGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ExclusiveSelfAssignedRoles = table.Column<bool>(nullable: false),
 | 
			
		||||
                    GenerateCurrencyChannelId = table.Column<ulong>(nullable: true),
 | 
			
		||||
                    GreetMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    GuildId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    LogSettingId = table.Column<int>(nullable: true),
 | 
			
		||||
                    SendChannelByeMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendChannelGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendDmGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VoicePlusTextEnabled = table.Column<bool>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_GuildConfigs", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_GuildConfigs_LogSettings_LogSettingId",
 | 
			
		||||
                        column: x => x.LogSettingId,
 | 
			
		||||
                        principalTable: "LogSettings",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "IgnoredLogChannels",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -404,6 +390,53 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "GuildConfigs",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    AutoAssignRoleId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    AutoDeleteByeMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessagesTimer = table.Column<int>(nullable: false),
 | 
			
		||||
                    AutoDeleteSelfAssignedRoleMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ByeMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    ChannelByeMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ChannelGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    DefaultMusicVolume = table.Column<float>(nullable: false),
 | 
			
		||||
                    DeleteMessageOnCommand = table.Column<bool>(nullable: false),
 | 
			
		||||
                    DmGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ExclusiveSelfAssignedRoles = table.Column<bool>(nullable: false),
 | 
			
		||||
                    GenerateCurrencyChannelId = table.Column<ulong>(nullable: true),
 | 
			
		||||
                    GreetMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    GuildId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    LogSettingId = table.Column<int>(nullable: true),
 | 
			
		||||
                    PermissionRole = table.Column<string>(nullable: true),
 | 
			
		||||
                    RootPermissionId = table.Column<int>(nullable: true),
 | 
			
		||||
                    SendChannelByeMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendChannelGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendDmGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VerbosePermissions = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VoicePlusTextEnabled = table.Column<bool>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_GuildConfigs", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_GuildConfigs_LogSettings_LogSettingId",
 | 
			
		||||
                        column: x => x.LogSettingId,
 | 
			
		||||
                        principalTable: "LogSettings",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_GuildConfigs_Permission_RootPermissionId",
 | 
			
		||||
                        column: x => x.RootPermissionId,
 | 
			
		||||
                        principalTable: "Permission",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "FollowedStream",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -428,30 +461,6 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "Permission",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    GuildConfigId = table.Column<int>(nullable: true),
 | 
			
		||||
                    PrimaryTarget = table.Column<int>(nullable: false),
 | 
			
		||||
                    PrimaryTargetId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    SecondaryTarget = table.Column<int>(nullable: false),
 | 
			
		||||
                    SecondaryTargetName = table.Column<string>(nullable: true),
 | 
			
		||||
                    State = table.Column<bool>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_Permission", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_Permission_GuildConfigs_GuildConfigId",
 | 
			
		||||
                        column: x => x.GuildConfigId,
 | 
			
		||||
                        principalTable: "GuildConfigs",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_BlacklistItem_BotConfigId",
 | 
			
		||||
                table: "BlacklistItem",
 | 
			
		||||
@@ -495,6 +504,11 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                column: "LogSettingId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_GuildConfigs_RootPermissionId",
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                column: "RootPermissionId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_IgnoredLogChannels_LogSettingId",
 | 
			
		||||
                table: "IgnoredLogChannels",
 | 
			
		||||
@@ -511,9 +525,10 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                column: "BotConfigId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_Permission_GuildConfigId",
 | 
			
		||||
                name: "IX_Permission_NextId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "GuildConfigId");
 | 
			
		||||
                column: "NextId",
 | 
			
		||||
                unique: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_PlayingStatus_BotConfigId",
 | 
			
		||||
@@ -570,9 +585,6 @@ namespace NadekoBot.Migrations
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ModulePrefixes");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "PlayingStatus");
 | 
			
		||||
 | 
			
		||||
@@ -605,6 +617,9 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "LogSettings");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "Permission");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -236,6 +236,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("PermissionRole");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("RootPermissionId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
@@ -244,6 +246,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendDmGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VerbosePermissions");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VoicePlusTextEnabled");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Services;
 | 
			
		||||
using NadekoBot.Services.Database;
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using System;
 | 
			
		||||
@@ -21,7 +22,6 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
        public static bool CheckPermissions(this IEnumerable<Permission> permsEnumerable, IUserMessage message, Command command, out int permIndex)
 | 
			
		||||
        {
 | 
			
		||||
            permsEnumerable = permsEnumerable.Reverse();
 | 
			
		||||
            var perms = permsEnumerable as List<Permission> ?? permsEnumerable.ToList();
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < perms.Count; i++)
 | 
			
		||||
@@ -50,13 +50,14 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        public static bool? CheckPermission(this Permission perm, IUserMessage message, Command command)
 | 
			
		||||
        {
 | 
			
		||||
            if (!((perm.SecondaryTarget == SecondaryPermissionType.Command &&
 | 
			
		||||
                    perm.SecondaryTargetName == command.Text.ToLowerInvariant()) ||
 | 
			
		||||
                ((perm.SecondaryTarget == SecondaryPermissionType.Module || perm.SecondaryTarget == SecondaryPermissionType.AllCommands) &&
 | 
			
		||||
                    perm.SecondaryTargetName == command.Module.Name.ToLowerInvariant()) ||
 | 
			
		||||
                    perm.SecondaryTarget == SecondaryPermissionType.AllModules ||
 | 
			
		||||
                    (perm.SecondaryTarget == SecondaryPermissionType.AllCommands && perm.SecondaryTargetName == command.Module.Name.ToLowerInvariant())))
 | 
			
		||||
                    perm.SecondaryTargetName.ToLowerInvariant() == command.Text.ToLowerInvariant()) ||
 | 
			
		||||
                (perm.SecondaryTarget == SecondaryPermissionType.Module &&
 | 
			
		||||
                    perm.SecondaryTargetName.ToLowerInvariant() == command.Module.Name.ToLowerInvariant()) ||
 | 
			
		||||
                    perm.SecondaryTarget == SecondaryPermissionType.AllModules))
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            var guildUser = message.Author as IGuildUser;
 | 
			
		||||
 | 
			
		||||
            switch (perm.PrimaryTarget)
 | 
			
		||||
            {
 | 
			
		||||
                case PrimaryPermissionType.User:
 | 
			
		||||
@@ -67,13 +68,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
                    if (perm.PrimaryTargetId == message.Channel.Id)
 | 
			
		||||
                        return perm.State;
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    var guildUser = message.Author as IGuildUser;
 | 
			
		||||
                case PrimaryPermissionType.Role:        
 | 
			
		||||
                    if (guildUser == null)
 | 
			
		||||
                        break;
 | 
			
		||||
                    if (guildUser.Roles.Any(r => r.Id == perm.PrimaryTargetId))
 | 
			
		||||
                        return perm.State;
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Server:
 | 
			
		||||
                    if (guildUser == null)
 | 
			
		||||
                        break;
 | 
			
		||||
                    return perm.State;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
@@ -92,6 +96,9 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    com += "r";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Server:
 | 
			
		||||
                    com += "s";
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch (perm.SecondaryTarget)
 | 
			
		||||
@@ -102,9 +109,6 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
                case SecondaryPermissionType.Command:
 | 
			
		||||
                    com += "c";
 | 
			
		||||
                    break;
 | 
			
		||||
                case SecondaryPermissionType.AllCommands:
 | 
			
		||||
                    com = "a" + com + "c";
 | 
			
		||||
                    break;
 | 
			
		||||
                case SecondaryPermissionType.AllModules:
 | 
			
		||||
                    com = "a" + com + "m";
 | 
			
		||||
                    break;
 | 
			
		||||
@@ -122,22 +126,19 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    com += $"<@&{perm.PrimaryTargetId}>";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Server:
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return NadekoBot.ModulePrefixes[typeof(Permissions).Name] + com;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void Add(this Permission perm, Permission toAdd)
 | 
			
		||||
        public static void Prepend(this Permission perm, Permission toAdd)
 | 
			
		||||
        {
 | 
			
		||||
            var last = perm;
 | 
			
		||||
            while (last.Next != null)
 | 
			
		||||
            {
 | 
			
		||||
                last = last.Next;
 | 
			
		||||
            }
 | 
			
		||||
            perm = perm.GetRoot();
 | 
			
		||||
 | 
			
		||||
            toAdd.Previous = last;
 | 
			
		||||
            last.Next = toAdd;
 | 
			
		||||
            toAdd.Next = null;
 | 
			
		||||
            perm.Previous = toAdd;
 | 
			
		||||
            toAdd.Next = perm;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void Insert(this Permission perm, int index, Permission toAdd)
 | 
			
		||||
@@ -174,16 +175,9 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
        public static Permission RemoveAt(this Permission perm, int index)
 | 
			
		||||
        {
 | 
			
		||||
            if (index < 0)
 | 
			
		||||
            if (index <= 0) //can't really remove at 0, that means deleting the element right now. Just use perm.Next if its 0
 | 
			
		||||
                throw new IndexOutOfRangeException();
 | 
			
		||||
 | 
			
		||||
            if (index == 0)
 | 
			
		||||
            {
 | 
			
		||||
                perm.Next.Previous = null;
 | 
			
		||||
                perm.Next = null;
 | 
			
		||||
                return perm;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var toRemove = perm;
 | 
			
		||||
            var i = 0;
 | 
			
		||||
            while (i != index)
 | 
			
		||||
@@ -195,7 +189,8 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            toRemove.Previous.Next = toRemove.Next;
 | 
			
		||||
            toRemove.Next.Previous = toRemove.Previous;
 | 
			
		||||
            if (toRemove.Next != null)
 | 
			
		||||
                toRemove.Next.Previous = toRemove.Previous;
 | 
			
		||||
            return toRemove;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,22 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task Verbose(IUserMessage msg, PermissionAction action)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
                config.VerbosePermissions = action.Value;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await channel.SendMessageAsync("I will " + (action.Value ? "now" : "no longer") + " show permission warnings.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ListPerms(IUserMessage msg)
 | 
			
		||||
@@ -30,10 +46,10 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            string toSend = "";
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                var perms = uow.GuildConfigs.For(channel.Guild.Id).RootPermission.AsEnumerable().Reverse();
 | 
			
		||||
                var perms = uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission;
 | 
			
		||||
 | 
			
		||||
                var i = 1;
 | 
			
		||||
                toSend = String.Join("\n", perms.Select(p => $"`{(i++)}.` {p.GetCommand()}"));
 | 
			
		||||
                toSend = String.Join("\n", perms.AsEnumerable().Select(p => $"`{(i++)}.` {p.GetCommand()}"));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(toSend))
 | 
			
		||||
@@ -47,16 +63,36 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        public async Task RemovePerm(IUserMessage imsg, int index)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            index -= 1;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Permission p;
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    var perms = uow.GuildConfigs.For(channel.Guild.Id).RootPermission;
 | 
			
		||||
                    p = perms.RemoveAt(perms.Count() - index);
 | 
			
		||||
                    var perms = uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission;
 | 
			
		||||
                    if (index == perms.Count() - 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (index == 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        p = perms;
 | 
			
		||||
                        uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = perms.Next;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        p = perms.RemoveAt(index);
 | 
			
		||||
                    }
 | 
			
		||||
                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
                await channel.SendMessageAsync($"`Removed permission \"{p.GetCommand()}\" from position #{index}.`").ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
                using (var uow2 = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    uow2._context.Remove<Permission>(p);
 | 
			
		||||
                    uow2._context.SaveChanges();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await channel.SendMessageAsync($"{imsg.Author.Mention} removed permission **{p.GetCommand()}** from position #{index + 1}.").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (ArgumentOutOfRangeException)
 | 
			
		||||
            {
 | 
			
		||||
@@ -68,24 +104,31 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task MovePerm(IUserMessage imsg, int from, int to)
 | 
			
		||||
        {
 | 
			
		||||
            from -= 1;
 | 
			
		||||
            to -= 1;
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            if (!(from == to || from < 1 || to < 1))
 | 
			
		||||
            if (!(from == to || from < 0 || to < 0))
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    Permission toInsert;
 | 
			
		||||
                    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                    {
 | 
			
		||||
                        var perms = uow.GuildConfigs.For(channel.Guild.Id).RootPermission;
 | 
			
		||||
                        var count = perms.Count();
 | 
			
		||||
                        toInsert = perms.RemoveAt(count - from);
 | 
			
		||||
                        var perms = uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission;
 | 
			
		||||
                        if (from == 0)
 | 
			
		||||
                            toInsert = perms;
 | 
			
		||||
                        else
 | 
			
		||||
                            toInsert = perms.RemoveAt(from);
 | 
			
		||||
                        if (from < to)
 | 
			
		||||
                            to -= 1;
 | 
			
		||||
                        perms.Insert(count - to, toInsert);
 | 
			
		||||
                        uow.GuildConfigs.For(channel.Guild.Id).RootPermission = perms;
 | 
			
		||||
                        var last = perms.Count() - 1;
 | 
			
		||||
                        if (from == last || to == last)
 | 
			
		||||
                            throw new IndexOutOfRangeException();
 | 
			
		||||
                        perms.Insert(to, toInsert);
 | 
			
		||||
                        uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = perms.GetRoot();
 | 
			
		||||
                        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    await channel.SendMessageAsync($"`Moved permission \"{toInsert.GetCommand()}\" from #{from} to #{to}.`").ConfigureAwait(false);
 | 
			
		||||
                    await channel.SendMessageAsync($"`Moved permission:` \"{toInsert.GetCommand()}\" `from #{from} to #{to}.`").ConfigureAwait(false);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e) when (e is ArgumentOutOfRangeException || e is IndexOutOfRangeException)
 | 
			
		||||
@@ -95,6 +138,52 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            await channel.SendMessageAsync("`Invalid index(es) specified.`").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task SrvrCmd(IUserMessage imsg, Command command, PermissionAction action)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Server,
 | 
			
		||||
                    PrimaryTargetId = 0,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                    SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command on this server.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task SrvrMdl(IUserMessage imsg, Module module, PermissionAction action)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Server,
 | 
			
		||||
                    PrimaryTargetId = 0,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module on this server.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task UsrCmd(IUserMessage imsg, Command command, PermissionAction action, IGuildUser user)
 | 
			
		||||
@@ -103,14 +192,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                    SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
@@ -124,14 +215,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
@@ -145,14 +238,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
                    PrimaryTargetId = role.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                    SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{role}` role.").ConfigureAwait(false);
 | 
			
		||||
@@ -166,14 +261,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
                    PrimaryTargetId = role.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{role}` role.").ConfigureAwait(false);
 | 
			
		||||
@@ -184,18 +281,25 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        public async Task ChnlCmd(IUserMessage imsg, Command command, PermissionAction action, ITextChannel chnl)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
                    PrimaryTargetId = chnl.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                    SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
                    var newPerm = new Permission
 | 
			
		||||
                    {
 | 
			
		||||
                        PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
                        PrimaryTargetId = chnl.Id,
 | 
			
		||||
                        SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                        SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                        State = action.Value,
 | 
			
		||||
                    };
 | 
			
		||||
                    uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                    uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex) {
 | 
			
		||||
                Console.WriteLine(ex);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{chnl}` channel.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
@@ -208,14 +312,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
                    PrimaryTargetId = chnl.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{chnl}` channel.").ConfigureAwait(false);
 | 
			
		||||
@@ -229,14 +335,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
                    PrimaryTargetId = chnl.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
                    SecondaryTargetName = "*",
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{chnl}` channel.").ConfigureAwait(false);
 | 
			
		||||
@@ -250,14 +358,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
                    PrimaryTargetId = role.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
                    SecondaryTargetName = "*",
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{role}` role.").ConfigureAwait(false);
 | 
			
		||||
@@ -271,14 +381,16 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
                    SecondaryTargetName = "*",
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
@@ -286,66 +398,89 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task AllChnlCmds(IUserMessage imsg, Module module, PermissionAction action, ITextChannel chnl)
 | 
			
		||||
        public async Task AllSrvrMdls(IUserMessage imsg, PermissionAction action, IUser user)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                var newPerm = new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
                    PrimaryTargetId = chnl.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Server,
 | 
			
		||||
                    PrimaryTargetId = 0,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
                    SecondaryTargetName = "*",
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                };
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Prepend(newPerm);
 | 
			
		||||
                uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission = newPerm;
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{chnl}` channel.").ConfigureAwait(false);
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` on this server.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task AllRoleCmds(IUserMessage imsg, Module module, PermissionAction action, IRole role)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
        //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task AllChnlCmds(IUserMessage imsg, Module module, PermissionAction action, ITextChannel chnl)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
                    PrimaryTargetId = role.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{role}` role.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
        //    {
 | 
			
		||||
        //        uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
        //        {
 | 
			
		||||
        //            PrimaryTarget = PrimaryPermissionType.Channel,
 | 
			
		||||
        //            PrimaryTargetId = chnl.Id,
 | 
			
		||||
        //            SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
        //            SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
        //            State = action.Value,
 | 
			
		||||
        //        });
 | 
			
		||||
        //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
        //    }
 | 
			
		||||
        //    await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{chnl}` channel.").ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task AllUsrCmds(IUserMessage imsg, Module module, PermissionAction action, IUser user)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
        //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task AllRoleCmds(IUserMessage imsg, Module module, PermissionAction action, IRole role)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
        //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
        //    {
 | 
			
		||||
        //        uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
        //        {
 | 
			
		||||
        //            PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
        //            PrimaryTargetId = role.Id,
 | 
			
		||||
        //            SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
        //            SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
        //            State = action.Value,
 | 
			
		||||
        //        });
 | 
			
		||||
        //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
        //    }
 | 
			
		||||
        //    await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{role}` role.").ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task AllUsrCmds(IUserMessage imsg, Module module, PermissionAction action, IUser user)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
        //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
        //    {
 | 
			
		||||
        //        uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission.Add(new Permission
 | 
			
		||||
        //        {
 | 
			
		||||
        //            PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
        //            PrimaryTargetId = user.Id,
 | 
			
		||||
        //            SecondaryTarget = SecondaryPermissionType.AllCommands,
 | 
			
		||||
        //            SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
        //            State = action.Value,
 | 
			
		||||
        //        });
 | 
			
		||||
        //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
        //    }
 | 
			
		||||
        //    await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL COMMANDS` from `{module.Name}` module for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@ using Discord.Commands;
 | 
			
		||||
using NadekoBot.Services.Database;
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using NadekoBot.Modules.Permissions;
 | 
			
		||||
using Microsoft.Data.Sqlite;
 | 
			
		||||
using Discord.Net;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services
 | 
			
		||||
{
 | 
			
		||||
@@ -44,41 +46,66 @@ namespace NadekoBot.Services
 | 
			
		||||
                var sw = new Stopwatch();
 | 
			
		||||
                sw.Start();
 | 
			
		||||
 | 
			
		||||
                var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, MultiMatchHandling.Best);
 | 
			
		||||
                var command = t.Item1;
 | 
			
		||||
                var result = t.Item2;
 | 
			
		||||
                sw.Stop();
 | 
			
		||||
                var channel = (usrMsg.Channel as ITextChannel);
 | 
			
		||||
                if (result.IsSuccess)
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    CommandExecuted(this, new CommandExecutedEventArgs(usrMsg, command));
 | 
			
		||||
                    _log.Info("Command Executed after {4}s\n\t" +
 | 
			
		||||
                              "User: {0}\n\t" +
 | 
			
		||||
                              "Server: {1}\n\t" +
 | 
			
		||||
                              "Channel: {2}\n\t" +
 | 
			
		||||
                              "Message: {3}",
 | 
			
		||||
                              usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0}
 | 
			
		||||
                              (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
 | 
			
		||||
                              (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
 | 
			
		||||
                              usrMsg.Content, // {3}
 | 
			
		||||
                              sw.Elapsed.TotalSeconds // {4}
 | 
			
		||||
                              );
 | 
			
		||||
                    var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, MultiMatchHandling.Best);
 | 
			
		||||
                    var command = t.Item1;
 | 
			
		||||
                    var result = t.Item2;
 | 
			
		||||
                    sw.Stop();
 | 
			
		||||
                    var channel = (usrMsg.Channel as ITextChannel);
 | 
			
		||||
                    if (result.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
                        CommandExecuted(this, new CommandExecutedEventArgs(usrMsg, command));
 | 
			
		||||
                        _log.Info("Command Executed after {4}s\n\t" +
 | 
			
		||||
                                  "User: {0}\n\t" +
 | 
			
		||||
                                  "Server: {1}\n\t" +
 | 
			
		||||
                                  "Channel: {2}\n\t" +
 | 
			
		||||
                                  "Message: {3}",
 | 
			
		||||
                                  usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0}
 | 
			
		||||
                                  (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
 | 
			
		||||
                                  (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
 | 
			
		||||
                                  usrMsg.Content, // {3}
 | 
			
		||||
                                  sw.Elapsed.TotalSeconds // {4}
 | 
			
		||||
                                  );
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (!result.IsSuccess && result.Error != CommandError.UnknownCommand)
 | 
			
		||||
                    {
 | 
			
		||||
                        _log.Warn("Command Errored after {5}s\n\t" +
 | 
			
		||||
                                  "User: {0}\n\t" +
 | 
			
		||||
                                  "Server: {1}\n\t" +
 | 
			
		||||
                                  "Channel: {2}\n\t" +
 | 
			
		||||
                                  "Message: {3}\n\t" +
 | 
			
		||||
                                  "Error: {4}",
 | 
			
		||||
                                  usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0}
 | 
			
		||||
                                  (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
 | 
			
		||||
                                  (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
 | 
			
		||||
                                  usrMsg.Content,// {3}
 | 
			
		||||
                                  result.ErrorReason, // {4}
 | 
			
		||||
                                  sw.Elapsed.TotalSeconds // {5}
 | 
			
		||||
                                  );
 | 
			
		||||
                        if (guild != null && command != null && result.Error == CommandError.Exception)
 | 
			
		||||
                        {
 | 
			
		||||
                            bool verbose;
 | 
			
		||||
                            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                            {
 | 
			
		||||
                                verbose = uow.GuildConfigs.For(guild.Id).VerbosePermissions;
 | 
			
		||||
                            }
 | 
			
		||||
                            if (verbose)
 | 
			
		||||
                                await msg.Channel.SendMessageAsync(":warning: " + result.ErrorReason).ConfigureAwait(false);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else if (!result.IsSuccess && result.Error != CommandError.UnknownCommand)
 | 
			
		||||
                catch (InvalidOperationException ex)
 | 
			
		||||
                {
 | 
			
		||||
                    _log.Warn("Command Errored after {5}s\n\t" +
 | 
			
		||||
                              "User: {0}\n\t" +
 | 
			
		||||
                              "Server: {1}\n\t" +
 | 
			
		||||
                              "Channel: {2}\n\t" +
 | 
			
		||||
                              "Message: {3}\n\t" +
 | 
			
		||||
                              "Error: {4}",
 | 
			
		||||
                              usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0}
 | 
			
		||||
                              (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1}
 | 
			
		||||
                              (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2}
 | 
			
		||||
                              usrMsg.Content,// {3}
 | 
			
		||||
                              result.ErrorReason, // {4}
 | 
			
		||||
                              sw.Elapsed.TotalSeconds // {5}
 | 
			
		||||
                              );
 | 
			
		||||
                    Console.WriteLine(ex);
 | 
			
		||||
                }
 | 
			
		||||
                catch (SqliteException ex)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine(ex.InnerException);
 | 
			
		||||
                }
 | 
			
		||||
                catch (HttpException ex)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine(ex);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
@@ -133,11 +160,14 @@ namespace NadekoBot.Services
 | 
			
		||||
                {
 | 
			
		||||
                    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                    {
 | 
			
		||||
                        rootPerm = uow.GuildConfigs.For(guild.Id).RootPermission;
 | 
			
		||||
                        rootPerm = uow.GuildConfigs.PermissionsFor(guild.Id).RootPermission;
 | 
			
		||||
                    }
 | 
			
		||||
                    int index;
 | 
			
		||||
                    if (!rootPerm.AsEnumerable().CheckPermissions(message, cmd, out index))
 | 
			
		||||
                        return new Tuple<Command, IResult>(null, SearchResult.FromError(CommandError.Exception, $"Permission error. Permission number {index} (`{(index != -1 ? rootPerm.GetAt(rootPerm.Count() - index).GetCommand() : "default")}`)"));
 | 
			
		||||
                    {
 | 
			
		||||
                        var returnMsg = $"Permission number #{index} **{rootPerm.GetAt(index).GetCommand()}** is preventing this action.";
 | 
			
		||||
                        return new Tuple<Command, IResult>(cmd, SearchResult.FromError(CommandError.Exception, returnMsg));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return new Tuple<Command, IResult>(commands[i], await commands[i].Execute(message, parseResult));
 | 
			
		||||
 
 | 
			
		||||
@@ -43,14 +43,8 @@ namespace NadekoBot.Services.Database.Models
 | 
			
		||||
        public ulong? GenerateCurrencyChannelId { get; set; }
 | 
			
		||||
 | 
			
		||||
        //permissions
 | 
			
		||||
        public Permission RootPermission { get; set; } = new Permission()
 | 
			
		||||
        {
 | 
			
		||||
            Next = null,
 | 
			
		||||
            Previous = null,
 | 
			
		||||
            PrimaryTarget = PrimaryPermissionType.Role,
 | 
			
		||||
            PrimaryTargetId = 0,
 | 
			
		||||
            SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
            SecondaryTargetName = "*",
 | 
			
		||||
        };
 | 
			
		||||
        public Permission RootPermission { get; set; }
 | 
			
		||||
        public bool VerbosePermissions { get; set; }
 | 
			
		||||
        public string PermissionRole { get; set; } = "Nadeko";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
@@ -18,20 +19,50 @@ namespace NadekoBot.Services.Database.Models
 | 
			
		||||
        public string SecondaryTargetName { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool State { get; set; }
 | 
			
		||||
 | 
			
		||||
        [NotMapped]
 | 
			
		||||
        private static Permission AllowAllPerm => new Permission()
 | 
			
		||||
        {
 | 
			
		||||
            PrimaryTarget = PrimaryPermissionType.Server,
 | 
			
		||||
            PrimaryTargetId = 0,
 | 
			
		||||
            SecondaryTarget = SecondaryPermissionType.AllModules,
 | 
			
		||||
            SecondaryTargetName = "*",
 | 
			
		||||
            State = true,
 | 
			
		||||
        };
 | 
			
		||||
        [NotMapped]
 | 
			
		||||
        private static Permission BlockNsfwPerm => new Permission()
 | 
			
		||||
        {
 | 
			
		||||
            PrimaryTarget = PrimaryPermissionType.Server,
 | 
			
		||||
            PrimaryTargetId = 0,
 | 
			
		||||
            SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
            SecondaryTargetName = "nsfw",
 | 
			
		||||
            State = false,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        public static Permission GetDefaultRoot()
 | 
			
		||||
        {
 | 
			
		||||
            var root = AllowAllPerm;
 | 
			
		||||
            var blockNsfw = BlockNsfwPerm;
 | 
			
		||||
 | 
			
		||||
            root.Previous = blockNsfw;
 | 
			
		||||
            blockNsfw.Next = root;
 | 
			
		||||
 | 
			
		||||
            return blockNsfw;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum PrimaryPermissionType
 | 
			
		||||
    {
 | 
			
		||||
        User,
 | 
			
		||||
        Channel,
 | 
			
		||||
        Role
 | 
			
		||||
        Role,
 | 
			
		||||
        Server
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum SecondaryPermissionType
 | 
			
		||||
    {
 | 
			
		||||
        Module,
 | 
			
		||||
        Command,
 | 
			
		||||
        AllCommands,
 | 
			
		||||
        AllModules
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -186,6 +186,7 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
            permissionEntity
 | 
			
		||||
                .HasOne(p => p.Next)
 | 
			
		||||
                .WithOne(p => p.Previous);
 | 
			
		||||
                
 | 
			
		||||
            #endregion
 | 
			
		||||
 | 
			
		||||
            #region LogSettings
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ namespace NadekoBot.Services.Database.Repositories
 | 
			
		||||
    public interface IGuildConfigRepository : IRepository<GuildConfig>
 | 
			
		||||
    {
 | 
			
		||||
        GuildConfig For(ulong guildId);
 | 
			
		||||
        GuildConfig PermissionsFor(ulong guildId);
 | 
			
		||||
        IEnumerable<FollowedStream> GetAllFollowedStreams();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,10 @@ namespace NadekoBot.Services.Database.Repositories.Impl
 | 
			
		||||
                    .ThenInclude(ls => ls.IgnoredChannels)
 | 
			
		||||
                .Include(gc => gc.LogSetting)
 | 
			
		||||
                    .ThenInclude(ls => ls.IgnoredVoicePresenceChannelIds)
 | 
			
		||||
                .Include(gc => gc.RootPermission)
 | 
			
		||||
                    .ThenInclude(gc => gc.Previous)
 | 
			
		||||
                .Include(gc => gc.RootPermission)
 | 
			
		||||
                    .ThenInclude(gc => gc.Next)
 | 
			
		||||
                .ToList();
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -29,16 +33,45 @@ namespace NadekoBot.Services.Database.Repositories.Impl
 | 
			
		||||
        public GuildConfig For(ulong guildId)
 | 
			
		||||
        {
 | 
			
		||||
            var config = _set.Include(gc => gc.FollowedStreams)
 | 
			
		||||
                             .Include(gc => gc.RootPermission)
 | 
			
		||||
                             .Include(gc => gc.LogSetting)
 | 
			
		||||
                                .ThenInclude(ls=>ls.IgnoredChannels)
 | 
			
		||||
                             .FirstOrDefault(c => c.GuildId == guildId);
 | 
			
		||||
                                .ThenInclude(ls => ls.IgnoredChannels)
 | 
			
		||||
                            .Include(gc => gc.LogSetting)
 | 
			
		||||
                                .ThenInclude(ls => ls.IgnoredVoicePresenceChannelIds)
 | 
			
		||||
                            .FirstOrDefault(c => c.GuildId == guildId);
 | 
			
		||||
 | 
			
		||||
            if (config == null)
 | 
			
		||||
            {
 | 
			
		||||
                _set.Add((config = new GuildConfig
 | 
			
		||||
                {
 | 
			
		||||
                    GuildId = guildId
 | 
			
		||||
                    GuildId = guildId,
 | 
			
		||||
                    RootPermission = Permission.GetDefaultRoot(),
 | 
			
		||||
                }));
 | 
			
		||||
                _context.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
            return config;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public GuildConfig PermissionsFor(ulong guildId)
 | 
			
		||||
        {
 | 
			
		||||
            var query = _set.Include(gc => gc.RootPermission);
 | 
			
		||||
 | 
			
		||||
            //todo this is possibly a disaster for performance
 | 
			
		||||
            //What i could do instead is count the number of permissions in the permission table for this guild
 | 
			
		||||
            // and make a for loop with those.
 | 
			
		||||
            // or just select permissions for this guild and manually chain them
 | 
			
		||||
            for (int i = 0; i < 60; i++)
 | 
			
		||||
            {
 | 
			
		||||
                query = query.ThenInclude(gc => gc.Next);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var config = query.FirstOrDefault(c => c.GuildId == guildId);
 | 
			
		||||
 | 
			
		||||
            if (config == null)
 | 
			
		||||
            {
 | 
			
		||||
                _set.Add((config = new GuildConfig
 | 
			
		||||
                {
 | 
			
		||||
                    GuildId = guildId,
 | 
			
		||||
                    RootPermission = Permission.GetDefaultRoot(),
 | 
			
		||||
                }));
 | 
			
		||||
                _context.SaveChanges();
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@
 | 
			
		||||
    "Microsoft.Extensions.PlatformAbstractions": "1.0.0",
 | 
			
		||||
    "Newtonsoft.Json": "9.0.1",
 | 
			
		||||
    "Microsoft.Extensions.DependencyInjection": "1.0.0",
 | 
			
		||||
    "Discord.Net.Commands": "1.0.0-dev",
 | 
			
		||||
    "System.Resources.ResourceWriter": "4.0.0-beta-22816",
 | 
			
		||||
    "Google.Apis.YouTube.v3": "1.15.0.582",
 | 
			
		||||
    "Google.Apis.Urlshortener.v1": "1.15.0.138",
 | 
			
		||||
@@ -35,7 +34,9 @@
 | 
			
		||||
    "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final",
 | 
			
		||||
    "Microsoft.EntityFrameworkCore.Sqlite": "1.0.0",
 | 
			
		||||
    "CoreCLR-NCalc": "2.1.0",
 | 
			
		||||
    "ImageProcessorCore": "1.0.0-alpha1045"
 | 
			
		||||
    "ImageProcessorCore": "1.0.0-alpha1045",
 | 
			
		||||
    "Discord.Net.Commands": "1.0.0-beta-*",
 | 
			
		||||
    "Discord.Net": "1.0.0-beta-*"
 | 
			
		||||
  },
 | 
			
		||||
  "tools": {
 | 
			
		||||
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
 | 
			
		||||
 
 | 
			
		||||
@@ -9096,7 +9096,8 @@
 | 
			
		||||
  "projectFileDependencyGroups": {
 | 
			
		||||
    "": [
 | 
			
		||||
      "CoreCLR-NCalc >= 2.1.0",
 | 
			
		||||
      "Discord.Net.Commands >= 1.0.0-dev",
 | 
			
		||||
      "Discord.Net >= 1.0.0-beta-*",
 | 
			
		||||
      "Discord.Net.Commands >= 1.0.0-beta-*",
 | 
			
		||||
      "Google.Apis.Customsearch.v1 >= 1.16.0.466",
 | 
			
		||||
      "Google.Apis.Urlshortener.v1 >= 1.15.0.138",
 | 
			
		||||
      "Google.Apis.YouTube.v3 >= 1.15.0.582",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user