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