More work on permission system, fixes
This commit is contained in:
		@@ -1,556 +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("20160910180231_first")]
 | 
			
		||||
    partial class first
 | 
			
		||||
    {
 | 
			
		||||
        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.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.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,47 +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)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "Permission",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    Command = table.Column<string>(nullable: true),
 | 
			
		||||
                    GuildConfigId = table.Column<int>(nullable: true),
 | 
			
		||||
                    Module = table.Column<string>(nullable: true),
 | 
			
		||||
                    State = table.Column<bool>(nullable: false),
 | 
			
		||||
                    Target = table.Column<string>(nullable: true),
 | 
			
		||||
                    TargetType = table.Column<int>(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_Permission_GuildConfigId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "GuildConfigId");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Down(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "Permission");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -8,8 +8,8 @@ using NadekoBot.Services.Database.Impl;
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(NadekoSqliteContext))]
 | 
			
		||||
    [Migration("20160920004320_second")]
 | 
			
		||||
    partial class second
 | 
			
		||||
    [Migration("20160922170157_perms")]
 | 
			
		||||
    partial class perms
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
@@ -354,18 +354,18 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Command");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Module");
 | 
			
		||||
                    b.Property<int>("PrimaryTarget");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("PrimaryTargetId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("SecondaryTarget");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("SecondaryTargetName");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("State");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Target");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("TargetType");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildConfigId");
 | 
			
		||||
@@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    public partial class first : Migration
 | 
			
		||||
    public partial class perms : Migration
 | 
			
		||||
    {
 | 
			
		||||
        protected override void Up(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
@@ -428,6 +428,30 @@ 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",
 | 
			
		||||
@@ -486,6 +510,11 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                table: "ModulePrefixes",
 | 
			
		||||
                column: "BotConfigId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_Permission_GuildConfigId",
 | 
			
		||||
                table: "Permission",
 | 
			
		||||
                column: "GuildConfigId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_PlayingStatus_BotConfigId",
 | 
			
		||||
                table: "PlayingStatus",
 | 
			
		||||
@@ -541,6 +570,9 @@ namespace NadekoBot.Migrations
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ModulePrefixes");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "Permission");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "PlayingStatus");
 | 
			
		||||
 | 
			
		||||
@@ -353,18 +353,18 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Command");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("GuildConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Module");
 | 
			
		||||
                    b.Property<int>("PrimaryTarget");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("PrimaryTargetId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("SecondaryTarget");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("SecondaryTargetName");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("State");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Target");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int>("TargetType");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildConfigId");
 | 
			
		||||
 
 | 
			
		||||
@@ -96,7 +96,7 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
                    {
 | 
			
		||||
                        try
 | 
			
		||||
                        {
 | 
			
		||||
                            await raceChannel.SendMessageAsync($"🏁`Race is starting in 20 seconds or when the room is full. Type {NadekoBot.ModulePrefixes["Gambling"]}jr to join the race.`");
 | 
			
		||||
                            await raceChannel.SendMessageAsync($"🏁`Race is starting in 20 seconds or when the room is full. Type {NadekoBot.ModulePrefixes[typeof(Gambling).Name]}jr to join the race.`");
 | 
			
		||||
                            var t = await Task.WhenAny(Task.Delay(20000, token), fullgame);
 | 
			
		||||
                            Started = true;
 | 
			
		||||
                            cancelSource.Cancel();
 | 
			
		||||
 
 | 
			
		||||
@@ -86,7 +86,7 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
                        {
 | 
			
		||||
                            var sent = await channel.SendFileAsync(
 | 
			
		||||
                                GetRandomCurrencyImagePath(), 
 | 
			
		||||
                                $"❗ A random { Gambling.Gambling.CurrencyName } appeared! Pick it up by typing `{NadekoBot.ModulePrefixes["Gambling"]}pick`")
 | 
			
		||||
                                $"❗ A random { Gambling.Gambling.CurrencyName } appeared! Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`")
 | 
			
		||||
                                    .ConfigureAwait(false);
 | 
			
		||||
                            plantedFlowers.AddOrUpdate(channel.Id, new List<IUserMessage>() { sent }, (id, old) => { old.Add(sent); return old; });
 | 
			
		||||
                        }
 | 
			
		||||
@@ -148,7 +148,7 @@ namespace NadekoBot.Modules.Games
 | 
			
		||||
                IUserMessage msg;
 | 
			
		||||
                var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(Gambling.Gambling.CurrencyName[0]);
 | 
			
		||||
                
 | 
			
		||||
                var msgToSend = $"Oh how Nice! **{imsg.Author.Username}** planted {(vowelFirst ? "an" : "a")} {Gambling.Gambling.CurrencyName}. Pick it using {NadekoBot.ModulePrefixes["Games"]}pick";
 | 
			
		||||
                var msgToSend = $"Oh how Nice! **{imsg.Author.Username}** planted {(vowelFirst ? "an" : "a")} {Gambling.Gambling.CurrencyName}. Pick it using {NadekoBot.ModulePrefixes[typeof(Gambling.Gambling).Name]}pick";
 | 
			
		||||
                if (file == null)
 | 
			
		||||
                {
 | 
			
		||||
                    msg = await channel.SendMessageAsync(Gambling.Gambling.CurrencySign).ConfigureAwait(false);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ using NadekoBot.Services.Database;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Music
 | 
			
		||||
{
 | 
			
		||||
    [NadekoModule("ClashOfClans", "!!")]
 | 
			
		||||
    [NadekoModule("Music", "!!")]
 | 
			
		||||
    public partial class Music : DiscordModule
 | 
			
		||||
    {
 | 
			
		||||
        public static ConcurrentDictionary<ulong, MusicPlayer> MusicPlayers = new ConcurrentDictionary<ulong, MusicPlayer>();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										121
									
								
								src/NadekoBot/Modules/Permissions/PermissionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/NadekoBot/Modules/Permissions/PermissionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Permissions
 | 
			
		||||
{
 | 
			
		||||
    public static class PermissionExtensions
 | 
			
		||||
    {
 | 
			
		||||
        public static bool CheckPermissions(this IEnumerable<Permission> permsEnumerable, IUserMessage message, Command command)
 | 
			
		||||
        {
 | 
			
		||||
            var perms = permsEnumerable as List<Permission> ?? permsEnumerable.ToList();
 | 
			
		||||
            int throwaway;
 | 
			
		||||
            return perms.CheckPermissions(message, command, out throwaway);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool CheckPermissions(this IEnumerable<Permission> permsEnumerable, IUserMessage message, Command command, out int permIndex)
 | 
			
		||||
        {
 | 
			
		||||
            var perms = permsEnumerable as List<Permission> ?? permsEnumerable.ToList();
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < perms.Count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                var perm = perms[i];
 | 
			
		||||
 | 
			
		||||
                var result = perm.CheckPermission(message, command);
 | 
			
		||||
 | 
			
		||||
                if (result == null)
 | 
			
		||||
                {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    permIndex = i + 1;
 | 
			
		||||
                    return result.Value;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            permIndex = -1; //defaut behaviour
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //null = not applicable
 | 
			
		||||
        //true = applicable, allowed
 | 
			
		||||
        //false = applicable, not allowed
 | 
			
		||||
        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.SecondaryTargetName == command.Module.Name.ToLowerInvariant())))
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            switch (perm.PrimaryTarget)
 | 
			
		||||
            {
 | 
			
		||||
                case PrimaryPermissionType.User:
 | 
			
		||||
                    if (perm.PrimaryTargetId == message.Author.Id)
 | 
			
		||||
                        return perm.State;
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Channel:
 | 
			
		||||
                    if (perm.PrimaryTargetId == message.Channel.Id)
 | 
			
		||||
                        return perm.State;
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    var guildUser = message.Author as IGuildUser;
 | 
			
		||||
                    if (guildUser == null)
 | 
			
		||||
                        break;
 | 
			
		||||
                    if (guildUser.Roles.Any(r => r.Id == perm.PrimaryTargetId))
 | 
			
		||||
                        return perm.State;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string GetCommand(this Permission perm)
 | 
			
		||||
        {
 | 
			
		||||
            var com = NadekoBot.ModulePrefixes[typeof(Permissions).Name];
 | 
			
		||||
            switch (perm.PrimaryTarget)
 | 
			
		||||
            {
 | 
			
		||||
                case PrimaryPermissionType.User:
 | 
			
		||||
                    com += "u";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Channel:
 | 
			
		||||
                    com += "c";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    com += "r";
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch (perm.SecondaryTarget)
 | 
			
		||||
            {
 | 
			
		||||
                case SecondaryPermissionType.Module:
 | 
			
		||||
                    com += "m";
 | 
			
		||||
                    break;
 | 
			
		||||
                case SecondaryPermissionType.Command:
 | 
			
		||||
                    com += "c";
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            com += " " + perm.SecondaryTargetName + " " + (perm.State ? "enable" : "disable") + " ";
 | 
			
		||||
 | 
			
		||||
            switch (perm.PrimaryTarget)
 | 
			
		||||
            {
 | 
			
		||||
                case PrimaryPermissionType.User:
 | 
			
		||||
                    com += $"<@{perm.PrimaryTargetId}>";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Channel:
 | 
			
		||||
                    com += $"<#{perm.PrimaryTargetId}>";
 | 
			
		||||
                    break;
 | 
			
		||||
                case PrimaryPermissionType.Role:
 | 
			
		||||
                    com += $"<@&{perm.PrimaryTargetId}>";
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return com;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -20,6 +20,27 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task ListPerms(IUserMessage msg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
 | 
			
		||||
            string toSend = "";
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                var perms = uow.GuildConfigs.For(channel.Guild.Id).Permissions;
 | 
			
		||||
 | 
			
		||||
                var i = 1;
 | 
			
		||||
                toSend = String.Join("\n", perms.Select(p => $"`{(i++)}.` {p.GetCommand()}"));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(toSend))
 | 
			
		||||
                await channel.SendMessageAsync("`No permissions set.`").ConfigureAwait(false);
 | 
			
		||||
            else
 | 
			
		||||
                await channel.SendMessageAsync(toSend).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task UsrCmd(IUserMessage imsg, Command command, PermissionAction action, IGuildUser user)
 | 
			
		||||
@@ -30,14 +51,15 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).Permissions.Add(new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    TargetType = PermissionType.User,
 | 
			
		||||
                    Target = user.Id.ToString(),
 | 
			
		||||
                    Command = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Command,
 | 
			
		||||
                    SecondaryTargetName = command.Text.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                await uow.CompleteAsync();
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{user}` user.");
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
@@ -50,14 +72,15 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            {
 | 
			
		||||
                uow.GuildConfigs.For(channel.Guild.Id).Permissions.Add(new Permission
 | 
			
		||||
                {
 | 
			
		||||
                    TargetType = PermissionType.User,
 | 
			
		||||
                    Target = user.Id.ToString(),
 | 
			
		||||
                    Module = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    PrimaryTarget = PrimaryPermissionType.User,
 | 
			
		||||
                    PrimaryTargetId = user.Id,
 | 
			
		||||
                    SecondaryTarget = SecondaryPermissionType.Module,
 | 
			
		||||
                    SecondaryTargetName = module.Name.ToLowerInvariant(),
 | 
			
		||||
                    State = action.Value,
 | 
			
		||||
                });
 | 
			
		||||
                await uow.CompleteAsync();
 | 
			
		||||
                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{user}` user.");
 | 
			
		||||
            await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{user}` user.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										27
									
								
								src/NadekoBot/Resources/CommandStrings.Designer.cs
									
									
									
										generated
									
									
									
								
							@@ -3596,6 +3596,33 @@ namespace NadekoBot.Resources {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Lists whole permission chain with their indexes..
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string listperms_desc {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("listperms_desc", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to `;lp`.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string listperms_summary {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("listperms_summary", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to listperms lp.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string listperms_text {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("listperms_text", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///    Looks up a localized string similar to Lists all playing statuses with their corresponding number. **Bot Owner Only!**.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -2637,4 +2637,13 @@
 | 
			
		||||
  <data name="cash_text" xml:space="preserve">
 | 
			
		||||
    <value>cash $$</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="listperms_desc" xml:space="preserve">
 | 
			
		||||
    <value>Lists whole permission chain with their indexes.</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="listperms_summary" xml:space="preserve">
 | 
			
		||||
    <value>`;lp`</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="listperms_text" xml:space="preserve">
 | 
			
		||||
    <value>listperms lp</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
@@ -8,6 +8,9 @@ using Discord;
 | 
			
		||||
using NLog;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using NadekoBot.Services.Database;
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using NadekoBot.Modules.Permissions;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services
 | 
			
		||||
{
 | 
			
		||||
@@ -33,11 +36,15 @@ namespace NadekoBot.Services
 | 
			
		||||
            var usrMsg = msg as IUserMessage;
 | 
			
		||||
            if (usrMsg == null)
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
            var guild = (msg.Channel as ITextChannel)?.Guild;
 | 
			
		||||
 | 
			
		||||
            var throwaway = Task.Run(async () =>
 | 
			
		||||
            {
 | 
			
		||||
                var sw = new Stopwatch();
 | 
			
		||||
                sw.Start();
 | 
			
		||||
                var t = await _commandService.Execute(usrMsg, usrMsg.Content, MultiMatchHandling.Best);
 | 
			
		||||
 | 
			
		||||
                var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, MultiMatchHandling.Best);
 | 
			
		||||
                var command = t.Item1;
 | 
			
		||||
                var result = t.Item2;
 | 
			
		||||
                sw.Stop();
 | 
			
		||||
@@ -77,6 +84,67 @@ namespace NadekoBot.Services
 | 
			
		||||
 | 
			
		||||
            return Task.CompletedTask;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task<Tuple<Command,IResult>> ExecuteCommand(IUserMessage message, string input, IGuild guild, IUser user, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Best) {
 | 
			
		||||
            var searchResult = _commandService.Search(message, input);
 | 
			
		||||
            if (!searchResult.IsSuccess)
 | 
			
		||||
                return new Tuple<Command, IResult>(null, searchResult);
 | 
			
		||||
 | 
			
		||||
            var commands = searchResult.Commands;
 | 
			
		||||
            for (int i = commands.Count - 1; i >= 0; i--)
 | 
			
		||||
            {
 | 
			
		||||
                var preconditionResult = await commands[i].CheckPreconditions(message);
 | 
			
		||||
                if (!preconditionResult.IsSuccess)
 | 
			
		||||
                {
 | 
			
		||||
                    if (commands.Count == 1)
 | 
			
		||||
                        return new Tuple<Command, IResult>(null, searchResult);
 | 
			
		||||
                    else
 | 
			
		||||
                        continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                var parseResult = await commands[i].Parse(message, searchResult, preconditionResult);
 | 
			
		||||
                if (!parseResult.IsSuccess)
 | 
			
		||||
                {
 | 
			
		||||
                    if (parseResult.Error == CommandError.MultipleMatches)
 | 
			
		||||
                    {
 | 
			
		||||
                        TypeReaderValue[] argList, paramList;
 | 
			
		||||
                        switch (multiMatchHandling)
 | 
			
		||||
                        {
 | 
			
		||||
                            case MultiMatchHandling.Best:
 | 
			
		||||
                                argList = parseResult.ArgValues.Select(x => x.Values.OrderByDescending(y => y.Score).First()).ToArray();
 | 
			
		||||
                                paramList = parseResult.ParamValues.Select(x => x.Values.OrderByDescending(y => y.Score).First()).ToArray();
 | 
			
		||||
                                parseResult = ParseResult.FromSuccess(argList, paramList);
 | 
			
		||||
                                break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (!parseResult.IsSuccess)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (commands.Count == 1)
 | 
			
		||||
                            return new Tuple<Command, IResult>(null, parseResult);
 | 
			
		||||
                        else
 | 
			
		||||
                            continue;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                var cmd = commands[i];
 | 
			
		||||
                List<Permission> perms;
 | 
			
		||||
                //check permissions
 | 
			
		||||
                if (guild != null)
 | 
			
		||||
                {
 | 
			
		||||
                    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                    {
 | 
			
		||||
                        perms = uow.GuildConfigs.For(guild.Id).Permissions;
 | 
			
		||||
                    }
 | 
			
		||||
                    int index;
 | 
			
		||||
                    if (!perms.CheckPermissions(message, cmd, out index))
 | 
			
		||||
                        return new Tuple<Command, IResult>(null, SearchResult.FromError(CommandError.Exception, $"Permission error. Permission number {index} (`{(index != -1 ? perms[index - 1].GetCommand() : "default")}`)"));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return new Tuple<Command, IResult>(commands[i], await commands[i].Execute(message, parseResult));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return new Tuple<Command, IResult>(null, SearchResult.FromError(CommandError.UnknownCommand, "This input does not match any overload."));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class CommandExecutedEventArgs
 | 
			
		||||
 
 | 
			
		||||
@@ -8,17 +8,25 @@ namespace NadekoBot.Services.Database.Models
 | 
			
		||||
{
 | 
			
		||||
    public class Permission : DbEntity
 | 
			
		||||
    {
 | 
			
		||||
        public PermissionType TargetType { get; set; }
 | 
			
		||||
        public string Command { get; set; } = null;
 | 
			
		||||
        public string Module { get; set; } = null;
 | 
			
		||||
        public PrimaryPermissionType PrimaryTarget { get; set; }
 | 
			
		||||
        public ulong PrimaryTargetId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public SecondaryPermissionType SecondaryTarget { get; set; }
 | 
			
		||||
        public string SecondaryTargetName { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool State { get; set; }
 | 
			
		||||
        public string Target { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum PermissionType
 | 
			
		||||
    public enum PrimaryPermissionType
 | 
			
		||||
    {
 | 
			
		||||
        User,
 | 
			
		||||
        Channel,
 | 
			
		||||
        Role
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum SecondaryPermissionType
 | 
			
		||||
    {
 | 
			
		||||
        Module,
 | 
			
		||||
        Command
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl
 | 
			
		||||
        public GuildConfig For(ulong guildId)
 | 
			
		||||
        {
 | 
			
		||||
            var config = _set.Include(gc => gc.FollowedStreams)
 | 
			
		||||
                             .Include(gc => gc.Permissions)
 | 
			
		||||
                             .Include(gc => gc.LogSetting)
 | 
			
		||||
                                .ThenInclude(ls=>ls.IgnoredChannels)
 | 
			
		||||
                             .FirstOrDefault(c => c.GuildId == guildId);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user