Work on logserver. Migrations update. Updated discord.net
This commit is contained in:
		@@ -1,418 +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("20160901001820_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<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.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("EightBallResponse");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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>("GreetMessageChannelId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendDmGreetMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("VoicePlusTextEnabled");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("GuildId")
 | 
			
		||||
                        .IsUnique();
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("GuildConfigs");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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("ModulePrefix");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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("RaceAnimal");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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.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.ModulePrefix", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("ModulePrefixes")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            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,32 +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: "TypingArticles",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    Author = table.Column<string>(nullable: true),
 | 
			
		||||
                    Text = table.Column<string>(nullable: true)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_TypingArticles", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Down(MigrationBuilder migrationBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "TypingArticles");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -8,8 +8,8 @@ using NadekoBot.Services.Database.Impl;
 | 
			
		||||
namespace NadekoBot.Migrations
 | 
			
		||||
{
 | 
			
		||||
    [DbContext(typeof(NadekoSqliteContext))]
 | 
			
		||||
    [Migration("20160901010812_second")]
 | 
			
		||||
    partial class second
 | 
			
		||||
    [Migration("20160905095544_first")]
 | 
			
		||||
    partial class first
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
@@ -104,6 +104,22 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    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")
 | 
			
		||||
@@ -213,6 +229,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelGreetMessage");
 | 
			
		||||
@@ -226,9 +244,87 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    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")
 | 
			
		||||
@@ -407,6 +503,27 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        .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")
 | 
			
		||||
@@ -47,6 +47,21 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    table.PrimaryKey("PK_ClashOfClans", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "ConversionUnits",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    InternalTrigger = table.Column<string>(nullable: true),
 | 
			
		||||
                    Modifier = table.Column<decimal>(nullable: false),
 | 
			
		||||
                    UnitType = table.Column<string>(nullable: true)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_ConversionUnits", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "Currency",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -77,33 +92,32 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "GuildConfigs",
 | 
			
		||||
                name: "LogSettings",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    AutoAssignRoleId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    AutoDeleteByeMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessagesTimer = table.Column<int>(nullable: false),
 | 
			
		||||
                    AutoDeleteSelfAssignedRoleMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ByeMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    ChannelByeMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ChannelGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    DefaultMusicVolume = table.Column<float>(nullable: false),
 | 
			
		||||
                    DeleteMessageOnCommand = table.Column<bool>(nullable: false),
 | 
			
		||||
                    DmGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ExclusiveSelfAssignedRoles = table.Column<bool>(nullable: false),
 | 
			
		||||
                    GreetMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    GuildId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    SendChannelByeMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendChannelGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendDmGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VoicePlusTextEnabled = table.Column<bool>(nullable: false)
 | 
			
		||||
                    ChannelCreated = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ChannelDestroyed = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    ChannelUpdated = table.Column<bool>(nullable: false),
 | 
			
		||||
                    IsLogging = table.Column<bool>(nullable: false),
 | 
			
		||||
                    LogUserPresence = table.Column<bool>(nullable: false),
 | 
			
		||||
                    LogVoicePresence = table.Column<bool>(nullable: false),
 | 
			
		||||
                    MessageDeleted = table.Column<bool>(nullable: false),
 | 
			
		||||
                    MessageReceived = table.Column<bool>(nullable: false),
 | 
			
		||||
                    MessageUpdated = table.Column<bool>(nullable: false),
 | 
			
		||||
                    UserBanned = table.Column<bool>(nullable: false),
 | 
			
		||||
                    UserJoined = table.Column<bool>(nullable: false),
 | 
			
		||||
                    UserLeft = table.Column<bool>(nullable: false),
 | 
			
		||||
                    UserPresenceChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    UserUnbanned = table.Column<bool>(nullable: false),
 | 
			
		||||
                    UserUpdated = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VoicePresenceChannelId = table.Column<ulong>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_GuildConfigs", x => x.Id);
 | 
			
		||||
                    table.PrimaryKey("PK_LogSettings", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
@@ -171,6 +185,20 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    table.PrimaryKey("PK_SelfAssignableRoles", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "TypingArticles",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    Author = table.Column<string>(nullable: true),
 | 
			
		||||
                    Text = table.Column<string>(nullable: true)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_TypingArticles", x => x.Id);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "BlacklistItem",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -296,6 +324,83 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        onDelete: ReferentialAction.Cascade);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "GuildConfigs",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    AutoAssignRoleId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    AutoDeleteByeMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    AutoDeleteGreetMessagesTimer = table.Column<int>(nullable: false),
 | 
			
		||||
                    AutoDeleteSelfAssignedRoleMessages = table.Column<bool>(nullable: false),
 | 
			
		||||
                    ByeMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    ChannelByeMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ChannelGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    DefaultMusicVolume = table.Column<float>(nullable: false),
 | 
			
		||||
                    DeleteMessageOnCommand = table.Column<bool>(nullable: false),
 | 
			
		||||
                    DmGreetMessageText = table.Column<string>(nullable: true),
 | 
			
		||||
                    ExclusiveSelfAssignedRoles = table.Column<bool>(nullable: false),
 | 
			
		||||
                    GreetMessageChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    GuildId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    LogSettingId = table.Column<int>(nullable: true),
 | 
			
		||||
                    SendChannelByeMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendChannelGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    SendDmGreetMessage = table.Column<bool>(nullable: false),
 | 
			
		||||
                    VoicePlusTextEnabled = table.Column<bool>(nullable: false)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_GuildConfigs", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_GuildConfigs_LogSettings_LogSettingId",
 | 
			
		||||
                        column: x => x.LogSettingId,
 | 
			
		||||
                        principalTable: "LogSettings",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "IgnoredLogChannels",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    ChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    LogSettingId = table.Column<int>(nullable: true)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_IgnoredLogChannels", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_IgnoredLogChannels_LogSettings_LogSettingId",
 | 
			
		||||
                        column: x => x.LogSettingId,
 | 
			
		||||
                        principalTable: "LogSettings",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "IgnoredVoicePresenceCHannels",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
                {
 | 
			
		||||
                    Id = table.Column<int>(nullable: false)
 | 
			
		||||
                        .Annotation("Autoincrement", true),
 | 
			
		||||
                    ChannelId = table.Column<ulong>(nullable: false),
 | 
			
		||||
                    LogSettingId = table.Column<int>(nullable: true)
 | 
			
		||||
                },
 | 
			
		||||
                constraints: table =>
 | 
			
		||||
                {
 | 
			
		||||
                    table.PrimaryKey("PK_IgnoredVoicePresenceCHannels", x => x.Id);
 | 
			
		||||
                    table.ForeignKey(
 | 
			
		||||
                        name: "FK_IgnoredVoicePresenceCHannels_LogSettings_LogSettingId",
 | 
			
		||||
                        column: x => x.LogSettingId,
 | 
			
		||||
                        principalTable: "LogSettings",
 | 
			
		||||
                        principalColumn: "Id",
 | 
			
		||||
                        onDelete: ReferentialAction.Restrict);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateTable(
 | 
			
		||||
                name: "FollowedStream",
 | 
			
		||||
                columns: table => new
 | 
			
		||||
@@ -358,6 +463,21 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                column: "GuildId",
 | 
			
		||||
                unique: true);
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_GuildConfigs_LogSettingId",
 | 
			
		||||
                table: "GuildConfigs",
 | 
			
		||||
                column: "LogSettingId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_IgnoredLogChannels_LogSettingId",
 | 
			
		||||
                table: "IgnoredLogChannels",
 | 
			
		||||
                column: "LogSettingId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_IgnoredVoicePresenceCHannels_LogSettingId",
 | 
			
		||||
                table: "IgnoredVoicePresenceCHannels",
 | 
			
		||||
                column: "LogSettingId");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.CreateIndex(
 | 
			
		||||
                name: "IX_ModulePrefix_BotConfigId",
 | 
			
		||||
                table: "ModulePrefix",
 | 
			
		||||
@@ -394,6 +514,9 @@ namespace NadekoBot.Migrations
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ClashCallers");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ConversionUnits");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "Currency");
 | 
			
		||||
 | 
			
		||||
@@ -406,6 +529,12 @@ namespace NadekoBot.Migrations
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "FollowedStream");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "IgnoredLogChannels");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "IgnoredVoicePresenceCHannels");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ModulePrefix");
 | 
			
		||||
 | 
			
		||||
@@ -427,6 +556,9 @@ namespace NadekoBot.Migrations
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "SelfAssignableRoles");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "TypingArticles");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "ClashOfClans");
 | 
			
		||||
 | 
			
		||||
@@ -435,6 +567,9 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "BotConfig");
 | 
			
		||||
 | 
			
		||||
            migrationBuilder.DropTable(
 | 
			
		||||
                name: "LogSettings");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -103,6 +103,22 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    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")
 | 
			
		||||
@@ -212,6 +228,8 @@ namespace NadekoBot.Migrations
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("GuildId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("LogSettingId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelByeMessage");
 | 
			
		||||
 | 
			
		||||
                    b.Property<bool>("SendChannelGreetMessage");
 | 
			
		||||
@@ -225,9 +243,87 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    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")
 | 
			
		||||
@@ -406,6 +502,27 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                        .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")
 | 
			
		||||
 
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using Discord.WebSocket;
 | 
			
		||||
using NadekoBot.Attributes;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration
 | 
			
		||||
{
 | 
			
		||||
    public partial class Administration {
 | 
			
		||||
        [Group]
 | 
			
		||||
        public class LogCommands
 | 
			
		||||
        {
 | 
			
		||||
            private DiscordSocketClient _client;
 | 
			
		||||
 | 
			
		||||
            private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
 | 
			
		||||
            public LogCommands(DiscordSocketClient client)
 | 
			
		||||
            {
 | 
			
		||||
                _client = client;
 | 
			
		||||
                _client.MessageReceived += _client_MessageReceived;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task _client_MessageReceived(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var msg = imsg as IUserMessage;
 | 
			
		||||
                if (msg == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task LogServer(IUserMessage msg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										466
									
								
								src/NadekoBot/Modules/Administration/Commands/LogCommand-1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										466
									
								
								src/NadekoBot/Modules/Administration/Commands/LogCommand-1.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,466 @@
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using Discord.WebSocket;
 | 
			
		||||
//using NadekoBot.Attributes;
 | 
			
		||||
//using NadekoBot.Extensions;
 | 
			
		||||
//using NadekoBot.Services;
 | 
			
		||||
//using NadekoBot.Services.Database;
 | 
			
		||||
//using NadekoBot.Services.Database.Models;
 | 
			
		||||
//using NLog;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Reflection;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
//namespace NadekoBot.Modules.Administration
 | 
			
		||||
//{
 | 
			
		||||
//    public partial class Administration
 | 
			
		||||
//    {
 | 
			
		||||
//        [Group]
 | 
			
		||||
//        public class LogCommands
 | 
			
		||||
//        {
 | 
			
		||||
//            private DiscordSocketClient _client { get; }
 | 
			
		||||
//            private Logger _log { get; }
 | 
			
		||||
 | 
			
		||||
//            private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
 | 
			
		||||
//            public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; }
 | 
			
		||||
 | 
			
		||||
//            public LogCommands(DiscordSocketClient client)
 | 
			
		||||
//            {
 | 
			
		||||
//                _client = client;
 | 
			
		||||
//                _log = LogManager.GetCurrentClassLogger();
 | 
			
		||||
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    GuildLogSettings = new ConcurrentDictionary<ulong, LogSetting>(uow.GuildConfigs
 | 
			
		||||
//                                                                                      .GetAll()
 | 
			
		||||
//                                                                                      .ToDictionary(g => g.GuildId, g => g.LogSetting));
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                _client.MessageReceived += _client_MessageReceived;
 | 
			
		||||
//                _client.MessageUpdated += _client_MessageUpdated;
 | 
			
		||||
//                _client.MessageDeleted += _client_MessageDeleted;
 | 
			
		||||
//                _client.UserBanned += _client_UserBanned;
 | 
			
		||||
//                _client.UserUnbanned += _client_UserUnbanned;
 | 
			
		||||
//                _client.UserJoined += _client_UserJoined;
 | 
			
		||||
//                _client.UserLeft += _client_UserLeft;
 | 
			
		||||
//                _client.UserPresenceUpdated += _client_UserPresenceUpdated;
 | 
			
		||||
//                _client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserVoiceStateUpdated(IUser iusr, IVoiceState before, IVoiceState after)
 | 
			
		||||
//            {
 | 
			
		||||
//                var usr = iusr as IGuildUser;
 | 
			
		||||
//                if (usr == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var beforeVch = before.VoiceChannel;
 | 
			
		||||
//                var afterVch = after.VoiceChannel;
 | 
			
		||||
 | 
			
		||||
//                if (beforeVch == afterVch)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.LogVoicePresence
 | 
			
		||||
//                    || !logSetting.IgnoredChannels.Any(ic => ic.ChannelId == after.VoiceChannel.Id))
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                ITextChannel logChannel;
 | 
			
		||||
//                if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (beforeVch?.Guild == afterVch?.Guild)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} moved from **{beforeVch.Name}** to **{afterVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (beforeVch == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has joined **{afterVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (afterVch == null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has left **{beforeVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserPresenceUpdated(IGuildUser usr, IPresence before, IPresence after)
 | 
			
		||||
//            {
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.LogUserPresence
 | 
			
		||||
//                    || before.Status == after.Status)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                ITextChannel logChannel;
 | 
			
		||||
//                if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserLeft(IGuildUser usr)
 | 
			
		||||
//            {
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.UserLeft)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserJoined(IGuildUser usr)
 | 
			
		||||
//            {
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.UserJoined)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserUnbanned(IUser usr, IGuild guild)
 | 
			
		||||
//            {
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.UserUnbanned)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_UserBanned(IUser usr, IGuild guild)
 | 
			
		||||
//            {
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.UserBanned)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_MessageDeleted(ulong arg1, Optional<IMessage> imsg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var msg = (imsg.IsSpecified ? imsg.Value : null) as IUserMessage;
 | 
			
		||||
//                if (msg == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var channel = msg.Channel as ITextChannel;
 | 
			
		||||
//                if (channel == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.MessageDeleted)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_MessageUpdated(Optional<IMessage> optmsg, IMessage imsg2)
 | 
			
		||||
//            {
 | 
			
		||||
//                var after = imsg2 as IUserMessage;
 | 
			
		||||
//                if (after == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var channel = after.Channel as ITextChannel;
 | 
			
		||||
//                if (channel == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting)
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.MessageUpdated)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(async () =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private Task _client_MessageReceived(IMessage imsg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var msg = imsg as IUserMessage;
 | 
			
		||||
//                if (msg == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var channel = msg.Channel as ITextChannel;
 | 
			
		||||
//                if (channel == null)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                LogSetting logSetting;
 | 
			
		||||
//                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting) 
 | 
			
		||||
//                    || !logSetting.IsLogging
 | 
			
		||||
//                    || !logSetting.MessageReceived)
 | 
			
		||||
//                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                var task = Task.Run(() =>
 | 
			
		||||
//                {
 | 
			
		||||
 | 
			
		||||
//                });
 | 
			
		||||
                
 | 
			
		||||
//                return Task.CompletedTask;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            private enum LogChannelType { Text, Voice, UserPresence };
 | 
			
		||||
//            private ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text)
 | 
			
		||||
//            {
 | 
			
		||||
//                ulong id = 0;
 | 
			
		||||
//                switch (logChannelType)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case LogChannelType.Text:
 | 
			
		||||
//                        id = logSetting.ChannelId;
 | 
			
		||||
//                        break;
 | 
			
		||||
//                    case LogChannelType.Voice:
 | 
			
		||||
//                        id = logSetting.VoicePresenceChannelId;
 | 
			
		||||
//                        break;
 | 
			
		||||
//                    case LogChannelType.UserPresence:
 | 
			
		||||
//                        id = logSetting.UserPresenceChannelId;
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
//                var channel = guild.GetTextChannel(id);
 | 
			
		||||
 | 
			
		||||
//                if (channel == null)
 | 
			
		||||
//                    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        switch (logChannelType)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            case LogChannelType.Text:
 | 
			
		||||
//                                logSetting.IsLogging = false;
 | 
			
		||||
//                                break;
 | 
			
		||||
//                            case LogChannelType.Voice:
 | 
			
		||||
//                                logSetting.LogVoicePresence = false;
 | 
			
		||||
//                                break;
 | 
			
		||||
//                            case LogChannelType.UserPresence:
 | 
			
		||||
//                                logSetting.LogUserPresence = false;
 | 
			
		||||
//                                break;
 | 
			
		||||
//                        }
 | 
			
		||||
//                        uow.Complete();
 | 
			
		||||
//                        return null;
 | 
			
		||||
//                    }
 | 
			
		||||
//                else
 | 
			
		||||
//                    return channel;
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task LogServer(IUserMessage msg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
//                GuildConfig config;
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                    logSetting.IsLogging = !logSetting.IsLogging;
 | 
			
		||||
//                    config.LogSetting = logSetting;
 | 
			
		||||
//                    await uow.CompleteAsync();
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                if (config.LogSetting.IsLogging)
 | 
			
		||||
//                    await channel.SendMessageAsync("`Logging enabled.`").ConfigureAwait(false);
 | 
			
		||||
//                else
 | 
			
		||||
//                    await channel.SendMessageAsync("`Logging disabled.`").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task LogIgnore(IUserMessage imsg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
//                int removed;
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                    removed = logSetting.IgnoredChannels.RemoveWhere(ilc => ilc.ChannelId == channel.Id);
 | 
			
		||||
//                    if (removed == 0)
 | 
			
		||||
//                        logSetting.IgnoredChannels.Add(new IgnoredLogChannel { ChannelId = channel.Id });
 | 
			
		||||
//                    config.LogSetting = logSetting;
 | 
			
		||||
//                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                if (removed == 0)
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Logging will now ignore {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//                else
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Logging will no longer ignore {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task LogAdd(IUserMessage msg, string eventName)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
//                eventName = eventName.ToLowerInvariant();
 | 
			
		||||
 | 
			
		||||
//                switch (eventName)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case "messagereceived":
 | 
			
		||||
//                    case "messageupdated":
 | 
			
		||||
//                    case "messagedeleted":
 | 
			
		||||
//                    case "userjoined":
 | 
			
		||||
//                    case "userleft":
 | 
			
		||||
//                    case "userbanned":
 | 
			
		||||
//                    case "userunbanned":
 | 
			
		||||
//                    case "channelcreated":
 | 
			
		||||
//                    case "channeldestroyed":
 | 
			
		||||
//                    case "channelupdated":
 | 
			
		||||
//                        using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                        {
 | 
			
		||||
//                            var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                            LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                            logSetting.GetType().GetProperty(eventName).SetValue(logSetting, true);
 | 
			
		||||
//                            config.LogSetting = logSetting;
 | 
			
		||||
//                            await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        await channel.SendMessageAsync($"`Now logging {eventName} event.`").ConfigureAwait(false);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                    default:
 | 
			
		||||
//                        await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task LogRemove(IUserMessage msg, string eventName)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
//                eventName = eventName.ToLowerInvariant();
 | 
			
		||||
 | 
			
		||||
//                switch (eventName)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case "messagereceived":
 | 
			
		||||
//                    case "messageupdated":
 | 
			
		||||
//                    case "messagedeleted":
 | 
			
		||||
//                    case "userjoined":
 | 
			
		||||
//                    case "userleft":
 | 
			
		||||
//                    case "userbanned":
 | 
			
		||||
//                    case "userunbanned":
 | 
			
		||||
//                    case "channelcreated":
 | 
			
		||||
//                    case "channeldestroyed":
 | 
			
		||||
//                    case "channelupdated":
 | 
			
		||||
//                        using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                        {
 | 
			
		||||
//                            var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                            LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                            logSetting.GetType().GetProperty(eventName).SetValue(logSetting, false);
 | 
			
		||||
//                            config.LogSetting = logSetting;
 | 
			
		||||
//                            await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                        }
 | 
			
		||||
//                        await channel.SendMessageAsync($"`No longer logging {eventName} event.`").ConfigureAwait(false);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                    default:
 | 
			
		||||
//                        await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task UserPresence(IUserMessage imsg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
//                bool enabled;
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                    enabled = logSetting.LogUserPresence = !config.LogSetting.LogUserPresence;
 | 
			
		||||
//                    config.LogSetting = logSetting;
 | 
			
		||||
//                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                if (enabled)
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Logging user presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//                else
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Stopped logging user presence updates.`").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task VoicePresence(IUserMessage imsg)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
//                bool enabled;
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                    enabled = config.LogSetting.LogVoicePresence = !config.LogSetting.LogVoicePresence;
 | 
			
		||||
//                    config.LogSetting = logSetting;
 | 
			
		||||
//                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                if (enabled)
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Logging voice presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//                else
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Stopped logging voice presence updates.`").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
 | 
			
		||||
//            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
//            [RequireContext(ContextType.Guild)]
 | 
			
		||||
//            public async Task VoiPresIgnore(IUserMessage imsg, IVoiceChannel voiceChannel)
 | 
			
		||||
//            {
 | 
			
		||||
//                var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
//                int removed;
 | 
			
		||||
//                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
//                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
//                    removed = logSetting.IgnoredVoicePresenceChannelIds.RemoveWhere(ivpc => ivpc.ChannelId == voiceChannel.Id);
 | 
			
		||||
//                    if (removed == 0)
 | 
			
		||||
//                        logSetting.IgnoredVoicePresenceChannelIds.Add(new IgnoredVoicePresenceChannel { ChannelId = voiceChannel.Id });
 | 
			
		||||
//                    config.LogSetting = logSetting;
 | 
			
		||||
//                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
//                if (removed == 0)
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Enabled logging voice presence updates for {voiceChannel.Name} ({voiceChannel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//                else
 | 
			
		||||
//                    await channel.SendMessageAsync($"`Disabled logging voice presence updates for {voiceChannel.Name} ({voiceChannel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
@@ -1,485 +1,466 @@
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.Extensions;
 | 
			
		||||
//using NadekoBot.Modules.Permissions.Classes;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
using Discord;
 | 
			
		||||
using Discord.Commands;
 | 
			
		||||
using Discord.WebSocket;
 | 
			
		||||
using NadekoBot.Attributes;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using NadekoBot.Services;
 | 
			
		||||
using NadekoBot.Services.Database;
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using NLog;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
////todo DB
 | 
			
		||||
////todo Add flags for every event
 | 
			
		||||
//namespace NadekoBot.Modules.Administration
 | 
			
		||||
//{
 | 
			
		||||
//    public class LogCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
namespace NadekoBot.Modules.Administration
 | 
			
		||||
{
 | 
			
		||||
    public partial class Administration
 | 
			
		||||
    {
 | 
			
		||||
        [Group]
 | 
			
		||||
        public class LogCommands
 | 
			
		||||
        {
 | 
			
		||||
            private DiscordSocketClient _client { get; }
 | 
			
		||||
            private Logger _log { get; }
 | 
			
		||||
 | 
			
		||||
//        private ConcurrentBag<KeyValuePair<Channel, string>> voicePresenceUpdates = new ConcurrentBag<KeyValuePair<Channel, string>>();
 | 
			
		||||
            private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
 | 
			
		||||
//        public LogCommand(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += MsgRecivd;
 | 
			
		||||
//            NadekoBot.Client.MessageDeleted += MsgDltd;
 | 
			
		||||
//            NadekoBot.Client.MessageUpdated += MsgUpdtd;
 | 
			
		||||
//            NadekoBot.Client.UserUpdated += UsrUpdtd;
 | 
			
		||||
//            NadekoBot.Client.UserBanned += UsrBanned;
 | 
			
		||||
//            NadekoBot.Client.UserLeft += UsrLeft;
 | 
			
		||||
//            NadekoBot.Client.UserJoined += UsrJoined;
 | 
			
		||||
//            NadekoBot.Client.UserUnbanned += UsrUnbanned;
 | 
			
		||||
//            NadekoBot.Client.ChannelCreated += ChannelCreated;
 | 
			
		||||
//            NadekoBot.Client.ChannelDestroyed += ChannelDestroyed;
 | 
			
		||||
//            NadekoBot.Client.ChannelUpdated += ChannelUpdated;
 | 
			
		||||
            public ConcurrentDictionary<ulong, LogSetting> GuildLogSettings { get; }
 | 
			
		||||
 | 
			
		||||
            public LogCommands(DiscordSocketClient client)
 | 
			
		||||
            {
 | 
			
		||||
                _client = client;
 | 
			
		||||
                _log = LogManager.GetCurrentClassLogger();
 | 
			
		||||
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += async (s, e) =>
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Channel.IsPrivate || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!SpecificConfigurations.Default.Of(e.Server.Id).SendPrivateMessageOnMention) return;
 | 
			
		||||
//                try
 | 
			
		||||
//                {
 | 
			
		||||
//                    var usr = e.Message.MentionedUsers.FirstOrDefault(u => u != umsg.Author);
 | 
			
		||||
//                    if (usr?.Status != UserStatus.Offline)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    await channel.SendMessageAsync($"User `{usr.Name}` is offline. PM sent.").ConfigureAwait(false);
 | 
			
		||||
//                    await usr.SendMessageAsync(
 | 
			
		||||
//                        $"User `{umsg.Author.Username}` mentioned you on " +
 | 
			
		||||
//                        $"`{e.Server.Name}` server while you were offline.\n" +
 | 
			
		||||
//                        $"`Message:` {e.Message.Text}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                catch { }
 | 
			
		||||
//            };
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    GuildLogSettings = new ConcurrentDictionary<ulong, LogSetting>(uow.GuildConfigs
 | 
			
		||||
                                                                                      .GetAll()
 | 
			
		||||
                                                                                      .ToDictionary(g => g.GuildId, g => g.LogSetting));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
//            // start the userpresence queue
 | 
			
		||||
                _client.MessageReceived += _client_MessageReceived;
 | 
			
		||||
                _client.MessageUpdated += _client_MessageUpdated;
 | 
			
		||||
                _client.MessageDeleted += _client_MessageDeleted;
 | 
			
		||||
                _client.UserBanned += _client_UserBanned;
 | 
			
		||||
                _client.UserUnbanned += _client_UserUnbanned;
 | 
			
		||||
                _client.UserJoined += _client_UserJoined;
 | 
			
		||||
                _client.UserLeft += _client_UserLeft;
 | 
			
		||||
                _client.UserPresenceUpdated += _client_UserPresenceUpdated;
 | 
			
		||||
                _client.UserVoiceStateUpdated += _client_UserVoiceStateUpdated;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//            NadekoBot.OnReady += () => Task.Run(async () =>
 | 
			
		||||
//             {
 | 
			
		||||
//                 while (true)
 | 
			
		||||
//                 {
 | 
			
		||||
//                     var toSend = new Dictionary<Channel, string>();
 | 
			
		||||
//                     //take everything from the queue and merge the messages which are going to the same channel
 | 
			
		||||
//                     KeyValuePair<Channel, string> item;
 | 
			
		||||
//                     while (voicePresenceUpdates.TryTake(out item))
 | 
			
		||||
//                     {
 | 
			
		||||
//                         if (toSend.ContainsKey(item.Key))
 | 
			
		||||
//                         {
 | 
			
		||||
//                             toSend[item.Key] = toSend[item.Key] + Environment.NewLine + item.Value;
 | 
			
		||||
//                         }
 | 
			
		||||
//                         else
 | 
			
		||||
//                         {
 | 
			
		||||
//                             toSend.Add(item.Key, item.Value);
 | 
			
		||||
//                         }
 | 
			
		||||
//                     }
 | 
			
		||||
//                     //send merged messages to each channel
 | 
			
		||||
//                     foreach (var k in toSend)
 | 
			
		||||
//                     {
 | 
			
		||||
//                         try { await k.Key.SendMessageAsync(Environment.NewLine + k.Value).ConfigureAwait(false); } catch { }
 | 
			
		||||
//                     }
 | 
			
		||||
            private Task _client_UserVoiceStateUpdated(IUser iusr, IVoiceState before, IVoiceState after)
 | 
			
		||||
            {
 | 
			
		||||
                var usr = iusr as IGuildUser;
 | 
			
		||||
                if (usr == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                     await Task.Delay(5000);
 | 
			
		||||
//                 }
 | 
			
		||||
//             });
 | 
			
		||||
//        }
 | 
			
		||||
                var beforeVch = before.VoiceChannel;
 | 
			
		||||
                var afterVch = after.VoiceChannel;
 | 
			
		||||
 | 
			
		||||
//        private async void ChannelUpdated(object sender, ChannelUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.After.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (e.Before.Name != e.After.Name)
 | 
			
		||||
//                    await ch.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Name Changed** `#{e.Before.Name}` (*{e.After.Id}*)
 | 
			
		||||
//        `New:` {e.After.Name}").ConfigureAwait(false);
 | 
			
		||||
//                else if (e.Before.Topic != e.After.Topic)
 | 
			
		||||
//                    await ch.SendMessageAsync($@"`{prettyCurrentTime}` **Channel Topic Changed** `#{e.After.Name}` (*{e.After.Id}*)
 | 
			
		||||
//        `Old:` {e.Before.Topic}
 | 
			
		||||
//        `New:` {e.After.Topic}").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                if (beforeVch == afterVch)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//        private async void ChannelDestroyed(object sender, ChannelEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"❗`{prettyCurrentTime}`❗`Channel Deleted:` #{e.Channel.Name} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.LogVoicePresence
 | 
			
		||||
                    || !logSetting.IgnoredChannels.Any(ic => ic.ChannelId == after.VoiceChannel.Id))
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//        private async void ChannelCreated(object sender, ChannelEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"`{prettyCurrentTime}`🆕`Channel Created:` #{e.Channel.Mention} (*{e.Channel.Id}*)").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                ITextChannel logChannel;
 | 
			
		||||
                if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//        private async void UsrUnbanned(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"`{prettyCurrentTime}`♻`User was unbanned:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (beforeVch?.Guild == afterVch?.Guild)
 | 
			
		||||
                    {
 | 
			
		||||
                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} moved from **{beforeVch.Name}** to **{afterVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (beforeVch == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has joined **{afterVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (afterVch == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        await logChannel.SendMessageAsync($"🎼`{prettyCurrentTime}` {usr.Username} has left **{beforeVch.Name}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
//        private async void UsrJoined(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"`{prettyCurrentTime}`✅`User joined:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//        private async void UsrLeft(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"`{prettyCurrentTime}`❗`User left:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
            private Task _client_UserPresenceUpdated(IGuildUser usr, IPresence before, IPresence after)
 | 
			
		||||
            {
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.LogUserPresence
 | 
			
		||||
                    || before.Status == after.Status)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//        private async void UsrBanned(object sender, UserEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync($"❗`{prettyCurrentTime}`❌`User banned:` **{umsg.Author.Username}** ({umsg.Author.Id})").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                ITextChannel logChannel;
 | 
			
		||||
                if ((logChannel = usr.Guild.GetTextChannel(logSetting.ChannelId)) == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//        private async void MsgRecivd(object sender, MessageEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessageAsync(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **New Message** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessageAsync(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **File Uploaded** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void MsgDltd(object sender, MessageEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || umsg.Author?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                if (!string.IsNullOrWhiteSpace(e.Message.Text))
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessageAsync(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **Message** 🚮 `#{e.Channel.Name}`
 | 
			
		||||
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    await ch.SendMessageAsync(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **File Deleted** `#{e.Channel.Name}`
 | 
			
		||||
//👤`{umsg.Author?.ToString() ?? ("NULL")}` {e.Message.Attachments.FirstOrDefault()?.ProxyUrl}").ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void MsgUpdtd(object sender, MessageUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Server == null || e.Channel.IsPrivate || umsg.Author?.Id == NadekoBot.Client.CurrentUser.Id)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                var chId = config.LogServerChannel;
 | 
			
		||||
//                if (chId == null || e.Channel.Id == chId || config.LogserverIgnoreChannels.Contains(e.Channel.Id))
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync(
 | 
			
		||||
//        $@"🕔`{prettyCurrentTime}` **Message** 📝 `#{e.Channel.Name}`
 | 
			
		||||
//👤`{umsg.Author?.ToString() ?? ("NULL")}`
 | 
			
		||||
//        `Old:` {e.Before.Text.Unmention()}
 | 
			
		||||
//        `New:` {e.After.Text.Unmention()}").ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
//        private async void UsrUpdtd(object sender, UserUpdatedEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = config.LogPresenceChannel;
 | 
			
		||||
//                if (chId != null)
 | 
			
		||||
//                {
 | 
			
		||||
//                    Channel ch;
 | 
			
		||||
//                    if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        if (e.Before.Status != e.After.Status)
 | 
			
		||||
//                        {
 | 
			
		||||
//                            voicePresenceUpdates.Add(new KeyValuePair<Channel, string>(ch, $"`{prettyCurrentTime}`**{e.Before.Name}** is now **{e.After.Status}**."));
 | 
			
		||||
//                        }
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
            private Task _client_UserLeft(IGuildUser usr)
 | 
			
		||||
            {
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.UserLeft)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                ulong notifyChBeforeId;
 | 
			
		||||
//                ulong notifyChAfterId;
 | 
			
		||||
//                Channel notifyChBefore = null;
 | 
			
		||||
//                Channel notifyChAfter = null;
 | 
			
		||||
//                var beforeVch = e.Before.VoiceChannel;
 | 
			
		||||
//                var afterVch = e.After.VoiceChannel;
 | 
			
		||||
//                var notifyLeave = false;
 | 
			
		||||
//                var notifyJoin = false;
 | 
			
		||||
//                if ((beforeVch != null || afterVch != null) && (beforeVch != afterVch)) // this means we need to notify for sure.
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (beforeVch != null && config.VoiceChannelLog.TryGetValue(beforeVch.Id, out notifyChBeforeId) && (notifyChBefore = e.Before.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChBeforeId)) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        notifyLeave = true;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if (afterVch != null && config.VoiceChannelLog.TryGetValue(afterVch.Id, out notifyChAfterId) && (notifyChAfter = e.After.Server.TextChannels.FirstOrDefault(tc => tc.Id == notifyChAfterId)) != null)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        notifyJoin = true;
 | 
			
		||||
//                    }
 | 
			
		||||
//                    if ((notifyLeave && notifyJoin) && (notifyChAfter == notifyChBefore))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChAfter.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} moved from **{beforeVch.Mention}** to **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (notifyJoin)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChAfter.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} has joined **{afterVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (notifyLeave)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await notifyChBefore.SendMessageAsync($"🎼`{prettyCurrentTime}` {e.Before.Name} has left **{beforeVch.Mention}** voice channel.").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                if (chId == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                Channel ch;
 | 
			
		||||
//                if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                    return;
 | 
			
		||||
//                string str = $"🕔`{prettyCurrentTime}`";
 | 
			
		||||
//                if (e.Before.Name != e.After.Name)
 | 
			
		||||
//                    str += $"**Name Changed**👤`{e.Before?.ToString()}`\n\t\t`New:`{e.After.ToString()}`";
 | 
			
		||||
//                else if (e.Before.Nickname != e.After.Nickname)
 | 
			
		||||
//                    str += $"**Nickname Changed**👤`{e.Before?.ToString()}`\n\t\t`Old:` {e.Before.Nickname}#{e.Before.Discriminator}\n\t\t`New:` {e.After.Nickname}#{e.After.Discriminator}";
 | 
			
		||||
//                else if (e.Before.AvatarUrl != e.After.AvatarUrl)
 | 
			
		||||
//                    str += $"**Avatar Changed**👤`{e.Before?.ToString()}`\n\t {await e.Before.AvatarUrl.ShortenUrl()} `=>` {await e.After.AvatarUrl.ShortenUrl()}";
 | 
			
		||||
//                else if (!e.Before.Roles.SequenceEqual(e.After.Roles))
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (e.Before.Roles.Count() < e.After.Roles.Count())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var diffRoles = e.After.Roles.Where(r => !e.Before.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
//                        str += $"**User's Roles changed ⚔➕**👤`{e.Before?.ToString()}`\n\tNow has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else if (e.Before.Roles.Count() > e.After.Roles.Count())
 | 
			
		||||
//                    {
 | 
			
		||||
//                        var diffRoles = e.Before.Roles.Where(r => !e.After.Roles.Contains(r)).Select(r => "`" + r.Name + "`");
 | 
			
		||||
//                        str += $"**User's Roles changed ⚔➖**👤`{e.Before?.ToString()}`\n\tNo longer has {string.Join(", ", diffRoles)} role.";
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        Console.WriteLine("SEQUENCE NOT EQUAL BUT NO DIFF ROLES - REPORT TO KWOTH on #NADEKOLOG server");
 | 
			
		||||
//                        return;
 | 
			
		||||
//                    }
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                    return;
 | 
			
		||||
//                await ch.SendMessageAsync(str).ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
            private Task _client_UserJoined(IGuildUser usr)
 | 
			
		||||
            {
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(usr.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.UserJoined)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "spmom")
 | 
			
		||||
//                .Description($"Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.**| `{Prefix}spmom`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var specificConfig = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    specificConfig.SendPrivateMessageOnMention =
 | 
			
		||||
//                        !specificConfig.SendPrivateMessageOnMention;
 | 
			
		||||
//                    if (specificConfig.SendPrivateMessageOnMention)
 | 
			
		||||
//                        await channel.SendMessageAsync(":ok: I will send private messages " +
 | 
			
		||||
//                                                    "to mentioned offline users.").ConfigureAwait(false);
 | 
			
		||||
//                    else
 | 
			
		||||
//                        await channel.SendMessageAsync(":ok: I won't send private messages " +
 | 
			
		||||
//                                                    "to mentioned offline users anymore.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "logserver")
 | 
			
		||||
//                  .Description($"Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** | `{Prefix}logserver`")
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
//                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel;
 | 
			
		||||
//                      if (chId == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = e.Channel.Id;
 | 
			
		||||
//                          await channel.SendMessageAsync($"❗**I WILL BEGIN LOGGING SERVER ACTIVITY IN THIS CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      Channel ch;
 | 
			
		||||
//                      if ((ch = e.Server.TextChannels.Where(tc => tc.Id == chId).FirstOrDefault()) == null)
 | 
			
		||||
//                          return;
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
//                      SpecificConfigurations.Default.Of(e.Server.Id).LogServerChannel = null;
 | 
			
		||||
//                      await channel.SendMessageAsync($"❗**NO LONGER LOGGING IN {ch.Mention} CHANNEL**❗").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task _client_UserUnbanned(IUser usr, IGuild guild)
 | 
			
		||||
            {
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.UserUnbanned)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Prefix + "logignore")
 | 
			
		||||
//                .Description($"Toggles whether the {Prefix}logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!**| `{Prefix}logignore`")
 | 
			
		||||
//                .AddCheck(SimpleCheckers.OwnerOnly())
 | 
			
		||||
//                .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                    if (config.LogserverIgnoreChannels.Remove(e.Channel.Id))
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await channel.SendMessageAsync($"`{Prefix}logserver will stop ignoring this channel.`");
 | 
			
		||||
//                    }
 | 
			
		||||
//                    else
 | 
			
		||||
//                    {
 | 
			
		||||
//                        config.LogserverIgnoreChannels.Add(e.Channel.Id);
 | 
			
		||||
//                        await channel.SendMessageAsync($"`{Prefix}logserver will ignore this channel.`");
 | 
			
		||||
//                    }
 | 
			
		||||
//                });
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "userpresence")
 | 
			
		||||
//                  .Description($"Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.**| `{Prefix}userpresence`")
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
//                      var chId = SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel;
 | 
			
		||||
//                      if (chId == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = e.Channel.Id;
 | 
			
		||||
//                          await channel.SendMessageAsync($"**User presence notifications enabled.**").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      SpecificConfigurations.Default.Of(e.Server.Id).LogPresenceChannel = null;
 | 
			
		||||
//                      await channel.SendMessageAsync($"**User presence notifications disabled.**").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "voicepresence")
 | 
			
		||||
//                  .Description($"Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.**| `{Prefix}voicerpresence`")
 | 
			
		||||
//                  .Parameter("all", ParameterType.Optional)
 | 
			
		||||
//                  .AddCheck(SimpleCheckers.ManageServer())
 | 
			
		||||
//                  .Do(async e =>
 | 
			
		||||
//                  {
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//                      var config = SpecificConfigurations.Default.Of(e.Server.Id);
 | 
			
		||||
//                      if (all?.ToLower() == "all")
 | 
			
		||||
//                      {
 | 
			
		||||
//                          foreach (var voiceChannel in e.Server.VoiceChannels)
 | 
			
		||||
//                          {
 | 
			
		||||
//                              config.VoiceChannelLog.TryAdd(voiceChannel.Id, e.Channel.Id);
 | 
			
		||||
//                          }
 | 
			
		||||
//                          await channel.SendMessageAsync("Started logging user presence for **ALL** voice channels!").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
            private Task _client_UserBanned(IUser usr, IGuild guild)
 | 
			
		||||
            {
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.UserBanned)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
//                      if (umsg.Author.VoiceChannel == null)
 | 
			
		||||
//                      {
 | 
			
		||||
//                          await channel.SendMessageAsync("💢 You are not in a voice channel right now. If you are, please rejoin it.").ConfigureAwait(false);
 | 
			
		||||
//                          return;
 | 
			
		||||
//                      }
 | 
			
		||||
//                      ulong throwaway;
 | 
			
		||||
//                      if (!config.VoiceChannelLog.TryRemove(umsg.Author.VoiceChannel.Id, out throwaway))
 | 
			
		||||
//                      {
 | 
			
		||||
//                          config.VoiceChannelLog.TryAdd(umsg.Author.VoiceChannel.Id, e.Channel.Id);
 | 
			
		||||
//                          await channel.SendMessageAsync($"`Logging user updates for` {umsg.Author.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
//                      }
 | 
			
		||||
//                      else
 | 
			
		||||
//                          await channel.SendMessageAsync($"`Stopped logging user updates for` {umsg.Author.VoiceChannel.Mention} `voice channel.`").ConfigureAwait(false);
 | 
			
		||||
//                  });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task _client_MessageDeleted(ulong arg1, Optional<IMessage> imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var msg = (imsg.IsSpecified ? imsg.Value : null) as IUserMessage;
 | 
			
		||||
                if (msg == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var channel = msg.Channel as ITextChannel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.MessageDeleted)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task _client_MessageUpdated(Optional<IMessage> optmsg, IMessage imsg2)
 | 
			
		||||
            {
 | 
			
		||||
                var after = imsg2 as IUserMessage;
 | 
			
		||||
                if (after == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var channel = after.Channel as ITextChannel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting)
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.MessageUpdated)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var task = Task.Run(async () =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task _client_MessageReceived(IMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var msg = imsg as IUserMessage;
 | 
			
		||||
                if (msg == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var channel = msg.Channel as ITextChannel;
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                LogSetting logSetting;
 | 
			
		||||
                if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting) 
 | 
			
		||||
                    || !logSetting.IsLogging
 | 
			
		||||
                    || !logSetting.MessageReceived)
 | 
			
		||||
                    return Task.CompletedTask;
 | 
			
		||||
 | 
			
		||||
                var task = Task.Run(() =>
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                });
 | 
			
		||||
                
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private enum LogChannelType { Text, Voice, UserPresence };
 | 
			
		||||
            private ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text)
 | 
			
		||||
            {
 | 
			
		||||
                ulong id = 0;
 | 
			
		||||
                switch (logChannelType)
 | 
			
		||||
                {
 | 
			
		||||
                    case LogChannelType.Text:
 | 
			
		||||
                        id = logSetting.ChannelId;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case LogChannelType.Voice:
 | 
			
		||||
                        id = logSetting.VoicePresenceChannelId;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case LogChannelType.UserPresence:
 | 
			
		||||
                        id = logSetting.UserPresenceChannelId;
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                var channel = guild.GetTextChannel(id);
 | 
			
		||||
 | 
			
		||||
                if (channel == null)
 | 
			
		||||
                    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                    {
 | 
			
		||||
                        switch (logChannelType)
 | 
			
		||||
                        {
 | 
			
		||||
                            case LogChannelType.Text:
 | 
			
		||||
                                logSetting.IsLogging = false;
 | 
			
		||||
                                break;
 | 
			
		||||
                            case LogChannelType.Voice:
 | 
			
		||||
                                logSetting.LogVoicePresence = false;
 | 
			
		||||
                                break;
 | 
			
		||||
                            case LogChannelType.UserPresence:
 | 
			
		||||
                                logSetting.LogUserPresence = false;
 | 
			
		||||
                                break;
 | 
			
		||||
                        }
 | 
			
		||||
                        uow.Complete();
 | 
			
		||||
                        return null;
 | 
			
		||||
                    }
 | 
			
		||||
                else
 | 
			
		||||
                    return channel;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task LogServer(IUserMessage msg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
                GuildConfig config;
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
                    logSetting.IsLogging = !logSetting.IsLogging;
 | 
			
		||||
                    config.LogSetting = logSetting;
 | 
			
		||||
                    await uow.CompleteAsync();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (config.LogSetting.IsLogging)
 | 
			
		||||
                    await channel.SendMessageAsync("`Logging enabled.`").ConfigureAwait(false);
 | 
			
		||||
                else
 | 
			
		||||
                    await channel.SendMessageAsync("`Logging disabled.`").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            [RequireContext(ContextType.Guild)]
 | 
			
		||||
            public async Task LogIgnore(IUserMessage imsg)
 | 
			
		||||
            {
 | 
			
		||||
                var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
                int removed;
 | 
			
		||||
                using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
                {
 | 
			
		||||
                    var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
                    LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
                    removed = logSetting.IgnoredChannels.RemoveWhere(ilc => ilc.ChannelId == channel.Id);
 | 
			
		||||
                    if (removed == 0)
 | 
			
		||||
                        logSetting.IgnoredChannels.Add(new IgnoredLogChannel { ChannelId = channel.Id });
 | 
			
		||||
                    config.LogSetting = logSetting;
 | 
			
		||||
                    await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (removed == 0)
 | 
			
		||||
                    await channel.SendMessageAsync($"`Logging will now ignore {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
                else
 | 
			
		||||
                    await channel.SendMessageAsync($"`Logging will no longer ignore {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            //[RequireContext(ContextType.Guild)]
 | 
			
		||||
            //public async Task LogAdd(IUserMessage msg, string eventName)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
            //    eventName = eventName.ToLowerInvariant();
 | 
			
		||||
 | 
			
		||||
            //    switch (eventName)
 | 
			
		||||
            //    {
 | 
			
		||||
            //        case "messagereceived":
 | 
			
		||||
            //        case "messageupdated":
 | 
			
		||||
            //        case "messagedeleted":
 | 
			
		||||
            //        case "userjoined":
 | 
			
		||||
            //        case "userleft":
 | 
			
		||||
            //        case "userbanned":
 | 
			
		||||
            //        case "userunbanned":
 | 
			
		||||
            //        case "channelcreated":
 | 
			
		||||
            //        case "channeldestroyed":
 | 
			
		||||
            //        case "channelupdated":
 | 
			
		||||
            //            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            //            {
 | 
			
		||||
            //                var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
            //                LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
            //                logSetting.GetType().GetProperty(eventName).SetValue(logSetting, true);
 | 
			
		||||
            //                config.LogSetting = logSetting;
 | 
			
		||||
            //                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            //            }
 | 
			
		||||
            //            await channel.SendMessageAsync($"`Now logging {eventName} event.`").ConfigureAwait(false);
 | 
			
		||||
            //            break;
 | 
			
		||||
            //        default:
 | 
			
		||||
            //            await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false);
 | 
			
		||||
            //            break;
 | 
			
		||||
            //    }
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            //[RequireContext(ContextType.Guild)]
 | 
			
		||||
            //public async Task LogRemove(IUserMessage msg, string eventName)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
            //    eventName = eventName.ToLowerInvariant();
 | 
			
		||||
 | 
			
		||||
            //    switch (eventName)
 | 
			
		||||
            //    {
 | 
			
		||||
            //        case "messagereceived":
 | 
			
		||||
            //        case "messageupdated":
 | 
			
		||||
            //        case "messagedeleted":
 | 
			
		||||
            //        case "userjoined":
 | 
			
		||||
            //        case "userleft":
 | 
			
		||||
            //        case "userbanned":
 | 
			
		||||
            //        case "userunbanned":
 | 
			
		||||
            //        case "channelcreated":
 | 
			
		||||
            //        case "channeldestroyed":
 | 
			
		||||
            //        case "channelupdated":
 | 
			
		||||
            //            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            //            {
 | 
			
		||||
            //                var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
            //                LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
            //                logSetting.GetType().GetProperty(eventName).SetValue(logSetting, false);
 | 
			
		||||
            //                config.LogSetting = logSetting;
 | 
			
		||||
            //                await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            //            }
 | 
			
		||||
            //            await channel.SendMessageAsync($"`No longer logging {eventName} event.`").ConfigureAwait(false);
 | 
			
		||||
            //            break;
 | 
			
		||||
            //        default:
 | 
			
		||||
            //            await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false);
 | 
			
		||||
            //            break;
 | 
			
		||||
            //    }
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            //[RequireContext(ContextType.Guild)]
 | 
			
		||||
            //public async Task UserPresence(IUserMessage imsg)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            //    bool enabled;
 | 
			
		||||
            //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            //    {
 | 
			
		||||
            //        var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
            //        LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
            //        enabled = logSetting.LogUserPresence = !config.LogSetting.LogUserPresence;
 | 
			
		||||
            //        config.LogSetting = logSetting;
 | 
			
		||||
            //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
            //    if (enabled)
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Logging user presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
            //    else
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Stopped logging user presence updates.`").ConfigureAwait(false);
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            //[RequireContext(ContextType.Guild)]
 | 
			
		||||
            //public async Task VoicePresence(IUserMessage imsg)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            //    bool enabled;
 | 
			
		||||
            //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            //    {
 | 
			
		||||
            //        var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
            //        LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
            //        enabled = config.LogSetting.LogVoicePresence = !config.LogSetting.LogVoicePresence;
 | 
			
		||||
            //        config.LogSetting = logSetting;
 | 
			
		||||
            //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
            //    if (enabled)
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Logging voice presence updates in {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
            //    else
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Stopped logging voice presence updates.`").ConfigureAwait(false);
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias]
 | 
			
		||||
            //[RequireContext(ContextType.Guild)]
 | 
			
		||||
            //public async Task VoiPresIgnore(IUserMessage imsg, IVoiceChannel voiceChannel)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            //    int removed;
 | 
			
		||||
            //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            //    {
 | 
			
		||||
            //        var config = uow.GuildConfigs.For(channel.Guild.Id);
 | 
			
		||||
            //        LogSetting logSetting = GuildLogSettings.GetOrAdd(channel.Guild.Id, (id) => config.LogSetting);
 | 
			
		||||
            //        removed = logSetting.IgnoredVoicePresenceChannelIds.RemoveWhere(ivpc => ivpc.ChannelId == voiceChannel.Id);
 | 
			
		||||
            //        if (removed == 0)
 | 
			
		||||
            //            logSetting.IgnoredVoicePresenceChannelIds.Add(new IgnoredVoicePresenceChannel { ChannelId = voiceChannel.Id });
 | 
			
		||||
            //        config.LogSetting = logSetting;
 | 
			
		||||
            //        await uow.CompleteAsync().ConfigureAwait(false);
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
            //    if (removed == 0)
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Enabled logging voice presence updates for {voiceChannel.Name} ({voiceChannel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
            //    else
 | 
			
		||||
            //        await channel.SendMessageAsync($"`Disabled logging voice presence updates for {voiceChannel.Name} ({voiceChannel.Id}) channel.`").ConfigureAwait(false);
 | 
			
		||||
            //}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -17,7 +17,7 @@ namespace NadekoBot.Services
 | 
			
		||||
        private CommandService _commandService;
 | 
			
		||||
        private Logger _log;
 | 
			
		||||
 | 
			
		||||
        public event EventHandler<CommandExecutedEventArgs> CommandExecuted = async delegate { };
 | 
			
		||||
        public event EventHandler<CommandExecutedEventArgs> CommandExecuted = delegate { };
 | 
			
		||||
 | 
			
		||||
        public CommandHandler(DiscordSocketClient client, CommandService commandService)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -28,13 +28,14 @@ namespace NadekoBot.Services.Database.Models
 | 
			
		||||
        public bool SendChannelByeMessage { get; set; }
 | 
			
		||||
        public string ChannelByeMessageText { get; set; } = "%user% has left!";
 | 
			
		||||
 | 
			
		||||
        public LogSetting LogSetting { get; set; } = new LogSetting();
 | 
			
		||||
 | 
			
		||||
        //self assignable roles
 | 
			
		||||
        public bool ExclusiveSelfAssignedRoles { get; set; }
 | 
			
		||||
        public bool AutoDeleteSelfAssignedRoleMessages { get; set; }
 | 
			
		||||
        public float DefaultMusicVolume { get; set; } = 1.0f;
 | 
			
		||||
        public bool VoicePlusTextEnabled { get; set; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //stream notifications
 | 
			
		||||
        public List<FollowedStream> FollowedStreams { get; set; } = new List<FollowedStream>();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								src/NadekoBot/Services/Database/Models/IgnoredLogChannel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/NadekoBot/Services/Database/Models/IgnoredLogChannel.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Database.Models
 | 
			
		||||
{
 | 
			
		||||
    public class IgnoredLogChannel : DbEntity
 | 
			
		||||
    {
 | 
			
		||||
        public LogSetting LogSetting { get; set; }
 | 
			
		||||
        public ulong ChannelId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								src/NadekoBot/Services/Database/Models/LogSetting.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/NadekoBot/Services/Database/Models/LogSetting.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Database.Models
 | 
			
		||||
{
 | 
			
		||||
    public class LogSetting : DbEntity
 | 
			
		||||
    {
 | 
			
		||||
        public bool IsLogging { get; set; }
 | 
			
		||||
        public ulong ChannelId { get; set; }
 | 
			
		||||
        public HashSet<IgnoredLogChannel> IgnoredChannels { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool MessageReceived { get; set; }
 | 
			
		||||
        public bool MessageUpdated { get; set; }
 | 
			
		||||
        public bool MessageDeleted { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool UserJoined { get; set; } = true;
 | 
			
		||||
        public bool UserLeft { get; set; } = true;
 | 
			
		||||
        public bool UserBanned { get; set; } = true;
 | 
			
		||||
        public bool UserUnbanned { get; set; } = true;
 | 
			
		||||
        public bool UserUpdated { get; set; } = true;
 | 
			
		||||
 | 
			
		||||
        public bool ChannelCreated { get; set; } = true;
 | 
			
		||||
        public bool ChannelDestroyed { get; set; } = true;
 | 
			
		||||
        public bool ChannelUpdated { get; set; } = true;
 | 
			
		||||
 | 
			
		||||
        //userpresence
 | 
			
		||||
        public bool LogUserPresence { get; set; } = false;
 | 
			
		||||
        public ulong UserPresenceChannelId { get; set; }
 | 
			
		||||
 | 
			
		||||
        //voicepresence
 | 
			
		||||
        public bool LogVoicePresence { get; set; } = false;
 | 
			
		||||
        public ulong VoicePresenceChannelId { get; set; }
 | 
			
		||||
        public HashSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceChannelIds { get; set; }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Database.Models
 | 
			
		||||
{
 | 
			
		||||
    public class IgnoredVoicePresenceChannel : DbEntity
 | 
			
		||||
    {
 | 
			
		||||
        public LogSetting LogSetting { get; set; }
 | 
			
		||||
        public ulong ChannelId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -23,6 +23,11 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
        public DbSet<ConvertUnit> ConversionUnits { get; set; }
 | 
			
		||||
        public DbSet<TypingArticle> TypingArticles { get; set; }
 | 
			
		||||
 | 
			
		||||
        //logging
 | 
			
		||||
        public DbSet<LogSetting> LogSettings { get; set; }
 | 
			
		||||
        public DbSet<IgnoredLogChannel> IgnoredLogChannels { get; set; }
 | 
			
		||||
        public DbSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceCHannels { get; set; }
 | 
			
		||||
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            #region QUOTES
 | 
			
		||||
@@ -85,7 +90,20 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
                .HasIndex(c => c.UserId)
 | 
			
		||||
                .IsUnique();
 | 
			
		||||
            #endregion
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            #region LogSettings
 | 
			
		||||
 | 
			
		||||
            //var logSettingEntity = modelBuilder.Entity<LogSetting>();
 | 
			
		||||
 | 
			
		||||
            //logSettingEntity
 | 
			
		||||
            //    .HasMany(ls => ls.IgnoredChannels)
 | 
			
		||||
            //    .WithOne(ls => ls.LogSetting)
 | 
			
		||||
            //    .HasPrincipalKey(ls => ls.id;
 | 
			
		||||
 | 
			
		||||
            //logSettingEntity
 | 
			
		||||
            //    .HasMany(ls => ls.IgnoredVoicePresenceChannelIds)
 | 
			
		||||
            //    .WithOne(ls => ls.LogSetting);
 | 
			
		||||
            #endregion
 | 
			
		||||
        }
 | 
			
		||||
        protected abstract override void OnConfiguring(DbContextOptionsBuilder optionsBuilder);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,9 @@ namespace NadekoBot.Services.Database.Repositories.Impl
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public GuildConfig For(ulong guildId)
 | 
			
		||||
        {
 | 
			
		||||
            var config = _set.Include(gc=>gc.FollowedStreams)
 | 
			
		||||
            var config = _set.Include(gc => gc.FollowedStreams)
 | 
			
		||||
                             .Include(gc => gc.LogSetting)
 | 
			
		||||
                                .ThenInclude(ls=>ls.IgnoredChannels)
 | 
			
		||||
                             .FirstOrDefault(c => c.GuildId == guildId);
 | 
			
		||||
 | 
			
		||||
            if (config == null)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user