Fix to v+t, finished typing articles?
This commit is contained in:
		
							
								
								
									
										432
									
								
								src/NadekoBot/Migrations/20160901010812_second.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										432
									
								
								src/NadekoBot/Migrations/20160901010812_second.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,432 @@
 | 
			
		||||
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("20160901010812_second")]
 | 
			
		||||
    partial class second
 | 
			
		||||
    {
 | 
			
		||||
        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
            modelBuilder
 | 
			
		||||
                .HasAnnotation("ProductVersion", "1.0.0-rtm-21431");
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<int?>("BotConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("ItemId");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.HasIndex("BotConfigId");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("BlacklistItem");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<ulong>("BufferSize");
 | 
			
		||||
 | 
			
		||||
                    b.Property<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.TypingArticle", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Author");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Text");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("TypingArticles");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("Blacklist")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar")
 | 
			
		||||
                        .WithMany("Bases")
 | 
			
		||||
                        .HasForeignKey("ClashWarId")
 | 
			
		||||
                        .OnDelete(DeleteBehavior.Cascade);
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
                        .WithMany("EightBallResponses")
 | 
			
		||||
                        .HasForeignKey("BotConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
 | 
			
		||||
                        .WithMany("FollowedStreams")
 | 
			
		||||
                        .HasForeignKey("GuildConfigId");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.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");
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								src/NadekoBot/Migrations/20160901010812_second.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/NadekoBot/Migrations/20160901010812_second.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
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");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -363,6 +363,20 @@ namespace NadekoBot.Migrations
 | 
			
		||||
                    b.ToTable("SelfAssignableRoles");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.Property<int>("Id")
 | 
			
		||||
                        .ValueGeneratedOnAdd();
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Author");
 | 
			
		||||
 | 
			
		||||
                    b.Property<string>("Text");
 | 
			
		||||
 | 
			
		||||
                    b.HasKey("Id");
 | 
			
		||||
 | 
			
		||||
                    b.ToTable("TypingArticles");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
            modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
 | 
			
		||||
                {
 | 
			
		||||
                    b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
////todo Add flags for every event
 | 
			
		||||
//namespace NadekoBot.Modules.Administration
 | 
			
		||||
//{
 | 
			
		||||
//    internal class LogCommand : DiscordCommand
 | 
			
		||||
//    public class LogCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】";
 | 
			
		||||
 | 
			
		||||
@@ -373,7 +373,7 @@
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "spmom")
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ namespace NadekoBot.Modules.Administration
 | 
			
		||||
            public VoicePlusTextCommands()
 | 
			
		||||
            {
 | 
			
		||||
                NadekoBot.Client.UserUpdated += UserUpdatedEventHandler;
 | 
			
		||||
                voicePlusTextCache = new ConcurrentDictionary<ulong, bool>();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            private Task UserUpdatedEventHandler(IGuildUser before, IGuildUser after)
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
 | 
			
		||||
                private ConcurrentQueue<string> animals { get; }
 | 
			
		||||
 | 
			
		||||
                public bool Fail { get; internal set; }
 | 
			
		||||
                public bool Fail { get; set; }
 | 
			
		||||
 | 
			
		||||
                public List<Participant> participants = new List<Participant>();
 | 
			
		||||
                private ulong serverId;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,14 @@ namespace NadekoBot.Modules.Gambling
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public Task Roll(IUserMessage umsg, [Remainder] string arg = null) =>
 | 
			
		||||
            InternalRoll(umsg, arg, true);
 | 
			
		||||
            publicRoll(umsg, arg, true);
 | 
			
		||||
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public Task Rolluo(IUserMessage umsg, [Remainder] string arg = null) =>
 | 
			
		||||
            InternalRoll(umsg, arg, false);
 | 
			
		||||
            publicRoll(umsg, arg, false);
 | 
			
		||||
        //todo drawing
 | 
			
		||||
        private async Task InternalRoll(IUserMessage umsg, string arg, bool ordered)
 | 
			
		||||
        private async Task publicRoll(IUserMessage umsg, string arg, bool ordered)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)umsg.Channel;
 | 
			
		||||
            var r = new Random();
 | 
			
		||||
 
 | 
			
		||||
@@ -11,11 +11,11 @@
 | 
			
		||||
////todo drawing
 | 
			
		||||
//namespace NadekoBot.Modules.Gambling
 | 
			
		||||
//{
 | 
			
		||||
//    internal class DrawCommand : DiscordCommand
 | 
			
		||||
//    public class DrawCommand : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
//        public DrawCommand(DiscordModule module) : base(module) { }
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "draw")
 | 
			
		||||
//                .Description($"Draws a card from the deck.If you supply number [x], she draws up to 5 cards from the deck. | `{Prefix}draw [x]`")
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
 | 
			
		||||
//        private SemaphoreSlim locker = new SemaphoreSlim(1,1);
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "pick")
 | 
			
		||||
//                .Description($"Picks a flower planted in this channel. | `{Prefix}pick`")
 | 
			
		||||
 
 | 
			
		||||
@@ -1,196 +1,190 @@
 | 
			
		||||
//using Discord;
 | 
			
		||||
//using Discord.Commands;
 | 
			
		||||
//using NadekoBot.Classes;
 | 
			
		||||
//using NadekoBot.DataModels;
 | 
			
		||||
//using NadekoBot.Extensions;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Concurrent;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Diagnostics;
 | 
			
		||||
//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 System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
////todo DB
 | 
			
		||||
////todo Rewrite?
 | 
			
		||||
//namespace NadekoBot.Modules.Games
 | 
			
		||||
//{
 | 
			
		||||
//    public static class SentencesProvider
 | 
			
		||||
//    {
 | 
			
		||||
//        internal static string GetRandomSentence()
 | 
			
		||||
//        {
 | 
			
		||||
//            var data = DbHandler.Instance.GetAllRows<TypingArticle>();
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                return data.ToList()[new Random().Next(0, data.Count())].Text;
 | 
			
		||||
//            }
 | 
			
		||||
//            catch
 | 
			
		||||
//            {
 | 
			
		||||
//                return "Failed retrieving data from parse. Owner didn't add any articles to type using `typeadd`.";
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
namespace NadekoBot.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class TypingGame
 | 
			
		||||
    {
 | 
			
		||||
        public const float WORD_VALUE = 4.5f;
 | 
			
		||||
        private readonly ITextChannel channel;
 | 
			
		||||
        public string CurrentSentence;
 | 
			
		||||
        public bool IsActive;
 | 
			
		||||
        private readonly Stopwatch sw;
 | 
			
		||||
        private readonly List<ulong> finishedUserIds;
 | 
			
		||||
 | 
			
		||||
//    public class TypingGame
 | 
			
		||||
//    {
 | 
			
		||||
//        public const float WORD_VALUE = 4.5f;
 | 
			
		||||
//        private readonly Channel channel;
 | 
			
		||||
//        public string CurrentSentence;
 | 
			
		||||
//        public bool IsActive;
 | 
			
		||||
//        private readonly Stopwatch sw;
 | 
			
		||||
//        private readonly List<ulong> finishedUserIds;
 | 
			
		||||
        public TypingGame(ITextChannel channel)
 | 
			
		||||
        {
 | 
			
		||||
            this.channel = channel;
 | 
			
		||||
            IsActive = false;
 | 
			
		||||
            sw = new Stopwatch();
 | 
			
		||||
            finishedUserIds = new List<ulong>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//        public TypingGame(Channel channel)
 | 
			
		||||
//        {
 | 
			
		||||
//            this.channel = channel;
 | 
			
		||||
//            IsActive = false;
 | 
			
		||||
//            sw = new Stopwatch();
 | 
			
		||||
//            finishedUserIds = new List<ulong>();
 | 
			
		||||
//        }
 | 
			
		||||
        public ITextChannel Channel { get; set; }
 | 
			
		||||
 | 
			
		||||
//        public Channel Channell { get; internal set; }
 | 
			
		||||
        public async Task<bool> Stop()
 | 
			
		||||
        {
 | 
			
		||||
            if (!IsActive) return false;
 | 
			
		||||
            NadekoBot.Client.MessageReceived -= AnswerReceived;
 | 
			
		||||
            finishedUserIds.Clear();
 | 
			
		||||
            IsActive = false;
 | 
			
		||||
            sw.Stop();
 | 
			
		||||
            sw.Reset();
 | 
			
		||||
            await channel.SendMessageAsync("Typing contest stopped").ConfigureAwait(false);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//        internal async Task<bool> Stop()
 | 
			
		||||
//        {
 | 
			
		||||
//            if (!IsActive) return false;
 | 
			
		||||
//            NadekoBot.Client.MessageReceived -= AnswerReceived;
 | 
			
		||||
//            finishedUserIds.Clear();
 | 
			
		||||
//            IsActive = false;
 | 
			
		||||
//            sw.Stop();
 | 
			
		||||
//            sw.Reset();
 | 
			
		||||
//            await channel.Send("Typing contest stopped").ConfigureAwait(false);
 | 
			
		||||
//            return true;
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
//        internal async Task Start()
 | 
			
		||||
//        {
 | 
			
		||||
//            while (true)
 | 
			
		||||
//            {
 | 
			
		||||
//                if (IsActive) return; // can't start running game
 | 
			
		||||
//                IsActive = true;
 | 
			
		||||
//                CurrentSentence = SentencesProvider.GetRandomSentence();
 | 
			
		||||
//                var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f);
 | 
			
		||||
//                await channel.SendMessageAsync($":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false);
 | 
			
		||||
        public async Task Start()
 | 
			
		||||
        {
 | 
			
		||||
            while (true)
 | 
			
		||||
            {
 | 
			
		||||
                if (IsActive) return; // can't start running game
 | 
			
		||||
                IsActive = true;
 | 
			
		||||
                CurrentSentence = GetRandomSentence();
 | 
			
		||||
                var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f);
 | 
			
		||||
                await channel.SendMessageAsync($":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//                var msg = await channel.SendMessageAsync("Starting new typing contest in **3**...").ConfigureAwait(false);
 | 
			
		||||
//                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
//                await msg.Edit("Starting new typing contest in **2**...").ConfigureAwait(false);
 | 
			
		||||
//                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
//                await msg.Edit("Starting new typing contest in **1**...").ConfigureAwait(false);
 | 
			
		||||
//                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
//                await msg.Edit($":book:**{CurrentSentence.Replace(" ", " \x200B")}**:book:").ConfigureAwait(false);
 | 
			
		||||
//                sw.Start();
 | 
			
		||||
//                HandleAnswers();
 | 
			
		||||
                var msg = await channel.SendMessageAsync("Starting new typing contest in **3**...").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
                await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **2**...").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
                await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **1**...").ConfigureAwait(false);
 | 
			
		||||
                await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
                await msg.ModifyAsync(m => m.Content = $":book:**{CurrentSentence.Replace(" ", " \x200B")}**:book:").ConfigureAwait(false);
 | 
			
		||||
                sw.Start();
 | 
			
		||||
                HandleAnswers();
 | 
			
		||||
 | 
			
		||||
//                while (i > 0)
 | 
			
		||||
//                {
 | 
			
		||||
//                    await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
//                    i--;
 | 
			
		||||
//                    if (!IsActive)
 | 
			
		||||
//                        return;
 | 
			
		||||
//                }
 | 
			
		||||
                while (i > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    await Task.Delay(1000).ConfigureAwait(false);
 | 
			
		||||
                    i--;
 | 
			
		||||
                    if (!IsActive)
 | 
			
		||||
                        return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
//                await Stop().ConfigureAwait(false);
 | 
			
		||||
//            }
 | 
			
		||||
//        }
 | 
			
		||||
                await Stop().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//        private void HandleAnswers()
 | 
			
		||||
//        {
 | 
			
		||||
//            NadekoBot.Client.MessageReceived += AnswerReceived;
 | 
			
		||||
//        }
 | 
			
		||||
        public string GetRandomSentence()
 | 
			
		||||
        {
 | 
			
		||||
            using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
            {
 | 
			
		||||
                return uow.TypingArticles.GetRandom()?.Text ?? "No typing articles found. Use `>typeadd` command to add a new article for typing.";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
//        private async void AnswerReceived(object sender, MessageEventArgs e)
 | 
			
		||||
//        {
 | 
			
		||||
//            try
 | 
			
		||||
//            {
 | 
			
		||||
//                if (e.Channel == null || e.Channel.Id != channel.Id || umsg.Author.Id == NadekoBot.Client.CurrentUser.Id) return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//                var guess = e.Message.RawText;
 | 
			
		||||
        private void HandleAnswers()
 | 
			
		||||
        {
 | 
			
		||||
            NadekoBot.Client.MessageReceived += AnswerReceived;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//                var distance = CurrentSentence.LevenshteinDistance(guess);
 | 
			
		||||
//                var decision = Judge(distance, guess.Length);
 | 
			
		||||
//                if (decision && !finishedUserIds.Contains(umsg.Author.Id))
 | 
			
		||||
//                {
 | 
			
		||||
//                    finishedUserIds.Add(umsg.Author.Id);
 | 
			
		||||
//                    await channel.Send($"{umsg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false);
 | 
			
		||||
//                    if (finishedUserIds.Count % 2 == 0)
 | 
			
		||||
//                    {
 | 
			
		||||
//                        await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false);
 | 
			
		||||
//                    }
 | 
			
		||||
//                }
 | 
			
		||||
//            }
 | 
			
		||||
//            catch { }
 | 
			
		||||
//        }
 | 
			
		||||
        private async Task AnswerReceived(IMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var msg = imsg as IUserMessage;
 | 
			
		||||
            if (msg == null)
 | 
			
		||||
                return;
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                if (channel== null || channel.Id != channel.Id || msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return;
 | 
			
		||||
 | 
			
		||||
//        private bool Judge(int errors, int textLength) => errors <= textLength / 25;
 | 
			
		||||
                var guess = msg.Content;
 | 
			
		||||
 | 
			
		||||
//    }
 | 
			
		||||
                var distance = CurrentSentence.LevenshteinDistance(guess);
 | 
			
		||||
                var decision = Judge(distance, guess.Length);
 | 
			
		||||
                if (decision && !finishedUserIds.Contains(msg.Author.Id))
 | 
			
		||||
                {
 | 
			
		||||
                    finishedUserIds.Add(msg.Author.Id);
 | 
			
		||||
                    await channel.SendMessageAsync($"{msg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false);
 | 
			
		||||
                    if (finishedUserIds.Count % 2 == 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch { }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//    internal class SpeedTyping : DiscordCommand
 | 
			
		||||
//    {
 | 
			
		||||
        private bool Judge(int errors, int textLength) => errors <= textLength / 25;
 | 
			
		||||
 | 
			
		||||
//        public static ConcurrentDictionary<ulong, TypingGame> RunningContests;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//        public SpeedTyping(DiscordModule module) : base(module)
 | 
			
		||||
//        {
 | 
			
		||||
//            RunningContests = new ConcurrentDictionary<ulong, TypingGame>();
 | 
			
		||||
//        }
 | 
			
		||||
    [Group]
 | 
			
		||||
    public class SpeedTypingCommands
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
//        public Func<CommandEventArgs, Task> DoFunc() =>
 | 
			
		||||
//            async e =>
 | 
			
		||||
//            {
 | 
			
		||||
//                var game = RunningContests.GetOrAdd(umsg.Author.Server.Id, id => new TypingGame(e.Channel));
 | 
			
		||||
        public static ConcurrentDictionary<ulong, TypingGame> RunningContests;
 | 
			
		||||
 | 
			
		||||
//                if (game.IsActive)
 | 
			
		||||
//                {
 | 
			
		||||
//                    await channel.SendMessageAsync(
 | 
			
		||||
//                            $"Contest already running in " +
 | 
			
		||||
//                            $"{game.Channell.Mention} channel.")
 | 
			
		||||
//                                .ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//                else
 | 
			
		||||
//                {
 | 
			
		||||
//                    await game.Start().ConfigureAwait(false);
 | 
			
		||||
//                }
 | 
			
		||||
//            };
 | 
			
		||||
        public SpeedTypingCommands()
 | 
			
		||||
        {
 | 
			
		||||
            RunningContests = new ConcurrentDictionary<ulong, TypingGame>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//        private Func<CommandEventArgs, Task> QuitFunc() =>
 | 
			
		||||
//            async e =>
 | 
			
		||||
//            {
 | 
			
		||||
//                TypingGame game;
 | 
			
		||||
//                if (RunningContests.TryRemove(umsg.Author.Server.Id, out game))
 | 
			
		||||
//                {
 | 
			
		||||
//                    await game.Stop().ConfigureAwait(false);
 | 
			
		||||
//                    return;
 | 
			
		||||
//                }
 | 
			
		||||
//                await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false);
 | 
			
		||||
//            };
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task TypeStart(IUserMessage msg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)msg.Channel;
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "typestart")
 | 
			
		||||
//                .Description($"Starts a typing contest. | `{Prefix}typestart`")
 | 
			
		||||
//                .Do(DoFunc());
 | 
			
		||||
            var game = RunningContests.GetOrAdd(channel.Guild.Id, id => new TypingGame(channel));
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "typestop")
 | 
			
		||||
//                .Description($"Stops a typing contest on the current channel. | `{Prefix}typestop`")
 | 
			
		||||
//                .Do(QuitFunc());
 | 
			
		||||
            if (game.IsActive)
 | 
			
		||||
            {
 | 
			
		||||
                await channel.SendMessageAsync(
 | 
			
		||||
                        $"Contest already running in " +
 | 
			
		||||
                        $"{game.Channel.Mention} channel.")
 | 
			
		||||
                            .ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                await game.Start().ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "typeadd")
 | 
			
		||||
//                .Description($"Adds a new article to the typing contest. Owner only. | `{Prefix}typeadd wordswords`")
 | 
			
		||||
//                .Parameter("text", ParameterType.Unparsed)
 | 
			
		||||
//                .Do(async e =>
 | 
			
		||||
//                {
 | 
			
		||||
//                    if (!NadekoBot.IsOwner(umsg.Author.Id) || string.IsNullOrWhiteSpace(text)) return;
 | 
			
		||||
        [LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        [RequireContext(ContextType.Guild)]
 | 
			
		||||
        public async Task TypeStop(IUserMessage imsg)
 | 
			
		||||
        {
 | 
			
		||||
            var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
            TypingGame game;
 | 
			
		||||
            if (RunningContests.TryRemove(channel.Guild.Id, out game))
 | 
			
		||||
            {
 | 
			
		||||
                await game.Stop().ConfigureAwait(false);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
//                    DbHandler.Instance.Connection.Insert(new TypingArticle
 | 
			
		||||
//                    {
 | 
			
		||||
//                        Text = text,
 | 
			
		||||
//                        DateAdded = DateTime.Now
 | 
			
		||||
//                    });
 | 
			
		||||
        ////todo owner only
 | 
			
		||||
        //[LocalizedCommand, LocalizedDescription, LocalizedSummary]
 | 
			
		||||
        //[RequireContext(ContextType.Guild)]
 | 
			
		||||
        //public async Task Typeadd(IUserMessage imsg, [Remainder] string text)
 | 
			
		||||
        //{
 | 
			
		||||
        //    var channel = (ITextChannel)imsg.Channel;
 | 
			
		||||
 | 
			
		||||
//                    await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false);
 | 
			
		||||
//                });
 | 
			
		||||
//        }
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
        //    using (var uow = DbHandler.UnitOfWork())
 | 
			
		||||
        //    {
 | 
			
		||||
        //        uow.TypingArticles.Add(new Services.Database.Models.TypingArticle
 | 
			
		||||
        //        {
 | 
			
		||||
        //            Author = imsg.Author.Username,
 | 
			
		||||
        //            Text = text
 | 
			
		||||
        //        });
 | 
			
		||||
        //    }
 | 
			
		||||
 | 
			
		||||
        //    await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false);
 | 
			
		||||
        //}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ namespace NadekoBot.Modules.Games.Trivia
 | 
			
		||||
            return list[rand];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal void Reload()
 | 
			
		||||
        public void Reload()
 | 
			
		||||
        {
 | 
			
		||||
            var arr = JArray.Parse(File.ReadAllText("data/triviaquestions.json"));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -234,7 +234,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal void ClearQueue()
 | 
			
		||||
        public void ClearQueue()
 | 
			
		||||
        {
 | 
			
		||||
            actionQueue.Enqueue(() =>
 | 
			
		||||
            {
 | 
			
		||||
@@ -256,7 +256,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal Task MoveToVoiceChannel(IVoiceChannel voiceChannel)
 | 
			
		||||
        public Task MoveToVoiceChannel(IVoiceChannel voiceChannel)
 | 
			
		||||
        {
 | 
			
		||||
            if (audioClient?.ConnectionState != ConnectionState.Connected)
 | 
			
		||||
                throw new InvalidOperationException("Can't move while bot is not connected to voice channel.");
 | 
			
		||||
@@ -264,13 +264,13 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
            return PlaybackVoiceChannel.ConnectAsync();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong;
 | 
			
		||||
        public bool ToggleRepeatSong() => this.RepeatSong = !this.RepeatSong;
 | 
			
		||||
 | 
			
		||||
        internal bool ToggleRepeatPlaylist() => this.RepeatPlaylist = !this.RepeatPlaylist;
 | 
			
		||||
        public bool ToggleRepeatPlaylist() => this.RepeatPlaylist = !this.RepeatPlaylist;
 | 
			
		||||
 | 
			
		||||
        internal bool ToggleAutoplay() => this.Autoplay = !this.Autoplay;
 | 
			
		||||
        public bool ToggleAutoplay() => this.Autoplay = !this.Autoplay;
 | 
			
		||||
 | 
			
		||||
        internal void ThrowIfQueueFull()
 | 
			
		||||
        public void ThrowIfQueueFull()
 | 
			
		||||
        {
 | 
			
		||||
            if (MaxQueueSize == 0)
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -16,18 +16,18 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
{
 | 
			
		||||
    public class SongInfo
 | 
			
		||||
    {
 | 
			
		||||
        public string Provider { get; internal set; }
 | 
			
		||||
        public MusicType ProviderType { get; internal set; }
 | 
			
		||||
        public string Provider { get; set; }
 | 
			
		||||
        public MusicType ProviderType { get; set; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Will be set only if the providertype is normal
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string Query { get; internal set; }
 | 
			
		||||
        public string Title { get; internal set; }
 | 
			
		||||
        public string Uri { get; internal set; }
 | 
			
		||||
        public string Query { get; set; }
 | 
			
		||||
        public string Title { get; set; }
 | 
			
		||||
        public string Uri { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class Song
 | 
			
		||||
    {
 | 
			
		||||
        public StreamState State { get; internal set; }
 | 
			
		||||
        public StreamState State { get; set; }
 | 
			
		||||
        public string PrettyName =>
 | 
			
		||||
            $"**【 {SongInfo.Title.TrimTo(55)} 】**`{(SongInfo.Provider ?? "-")}` `by {QueuerName}`";
 | 
			
		||||
        public SongInfo SongInfo { get; }
 | 
			
		||||
@@ -80,7 +80,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken)
 | 
			
		||||
        public async Task Play(IAudioClient voiceClient, CancellationToken cancelToken)
 | 
			
		||||
        {
 | 
			
		||||
            var filename = Path.Combine(Music.MusicDataPath, DateTime.Now.UnixTimestamp().ToString());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ namespace NadekoBot.Modules.Music.Classes
 | 
			
		||||
        public bool IsSoundCloudLink(string url) =>
 | 
			
		||||
            System.Text.RegularExpressions.Regex.IsMatch(url, "(.*)(soundcloud.com|snd.sc)(.*)");
 | 
			
		||||
 | 
			
		||||
        internal async Task<SoundCloudVideo> GetVideoByQueryAsync(string query)
 | 
			
		||||
        public async Task<SoundCloudVideo> GetVideoByQueryAsync(string query)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(query))
 | 
			
		||||
                throw new ArgumentNullException(nameof(query));
 | 
			
		||||
 
 | 
			
		||||
@@ -204,7 +204,7 @@ namespace NadekoBot.Modules.NSFW
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        internal static async Task<string> GetE621ImageLink(string tags)
 | 
			
		||||
        public static async Task<string> GetE621ImageLink(string tags)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "convert")
 | 
			
		||||
//                .Description($"Convert quantities from>to. | `{Prefix}convert m>km 1000`")
 | 
			
		||||
 
 | 
			
		||||
@@ -113,7 +113,7 @@ namespace NadekoBot.Modules.Searches
 | 
			
		||||
//            public float StatScore { get; set; }
 | 
			
		||||
//        }
 | 
			
		||||
 | 
			
		||||
//        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
//        {
 | 
			
		||||
//            cgb.CreateCommand(Module.Prefix + "lolchamp")
 | 
			
		||||
//                  .Description($"Shows League Of Legends champion statistics. If there are spaces/apostrophes or in the name - omit them. Optional second parameter is a role. |`{Prefix}lolchamp Riven` or `{Prefix}lolchamp Annie sup`")
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
////todo rewrite
 | 
			
		||||
//namespace NadekoBot.Modules.Trello
 | 
			
		||||
//{
 | 
			
		||||
//    internal class Trello : DiscordModule
 | 
			
		||||
//    public class Trello : DiscordModule
 | 
			
		||||
//    {
 | 
			
		||||
//        private readonly Timer t = new Timer { Interval = 2000 };
 | 
			
		||||
//        public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Trello;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace NadekoBot.Resources {
 | 
			
		||||
        
 | 
			
		||||
        private static global::System.Globalization.CultureInfo resourceCulture;
 | 
			
		||||
        
 | 
			
		||||
        internal CommandStrings() {
 | 
			
		||||
        public CommandStrings() {
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace NadekoBot.Resources {
 | 
			
		||||
        
 | 
			
		||||
        private static global::System.Globalization.CultureInfo resourceCulture;
 | 
			
		||||
        
 | 
			
		||||
        internal ResponseStrings() {
 | 
			
		||||
        public ResponseStrings() {
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ namespace NadekoBot.Services.Database.Models
 | 
			
		||||
        public ulong ChannelId { get; set; }
 | 
			
		||||
 | 
			
		||||
        [NotMapped]
 | 
			
		||||
        public ITextChannel Channel { get; internal set; }
 | 
			
		||||
        public ITextChannel Channel { get; set; }
 | 
			
		||||
 | 
			
		||||
        public List<ClashCaller> Bases { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								src/NadekoBot/Services/Database/Models/TypingArticle.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/NadekoBot/Services/Database/Models/TypingArticle.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 TypingArticle : DbEntity
 | 
			
		||||
    {
 | 
			
		||||
        public string Author { get; set; }
 | 
			
		||||
        public string Text { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -20,6 +20,7 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
        public DbSet<BotConfig> BotConfig { get; set; }
 | 
			
		||||
        public DbSet<Repeater> Repeaters { get; set; }
 | 
			
		||||
        public DbSet<Currency> Currency { get; set; }
 | 
			
		||||
        public DbSet<TypingArticle> TypingArticles { get; set; }
 | 
			
		||||
 | 
			
		||||
        protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Database.Repositories
 | 
			
		||||
{
 | 
			
		||||
    public interface ITypingArticlesRepository : IRepository <TypingArticle>
 | 
			
		||||
    {
 | 
			
		||||
        TypingArticle GetRandom();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
using NadekoBot.Services.Database.Models;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Services.Database.Repositories.Impl
 | 
			
		||||
{
 | 
			
		||||
    public class TypingArticlesRepository : Repository<TypingArticle>, ITypingArticlesRepository
 | 
			
		||||
    {
 | 
			
		||||
        private Random _rand = null;
 | 
			
		||||
        private Random rand => _rand ?? (_rand = new Random());
 | 
			
		||||
        public TypingArticlesRepository(DbContext context) : base(context)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public TypingArticle GetRandom()
 | 
			
		||||
        {
 | 
			
		||||
            var skip = (int)(rand.NextDouble() * _set.Count());
 | 
			
		||||
            return _set.Skip(skip).FirstOrDefault();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -39,6 +39,9 @@ namespace NadekoBot.Services.Database
 | 
			
		||||
        private ICurrencyRepository _currency;
 | 
			
		||||
        public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context));
 | 
			
		||||
 | 
			
		||||
        private ITypingArticlesRepository _typingArticles;
 | 
			
		||||
        public ITypingArticlesRepository TypingArticles => _typingArticles ?? (_typingArticles = new TypingArticlesRepository(_context));
 | 
			
		||||
 | 
			
		||||
        public UnitOfWork(NadekoContext context)
 | 
			
		||||
        {
 | 
			
		||||
            _context = context;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes
 | 
			
		||||
{
 | 
			
		||||
    internal class SpecificConfigurations
 | 
			
		||||
    public class SpecificConfigurations
 | 
			
		||||
    {
 | 
			
		||||
        public static SpecificConfigurations Default { get; } = new SpecificConfigurations();
 | 
			
		||||
        public static bool Instantiated { get; private set; }
 | 
			
		||||
@@ -73,7 +73,7 @@ namespace NadekoBot.Classes
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal class ServerSpecificConfig : INotifyPropertyChanged
 | 
			
		||||
    public class ServerSpecificConfig : INotifyPropertyChanged
 | 
			
		||||
    {
 | 
			
		||||
        [JsonProperty("VoicePlusTextEnabled")]
 | 
			
		||||
        private bool voicePlusTextEnabled;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal class Announcement : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public long ServerId { get; set; } = 0;
 | 
			
		||||
        public bool Greet { get; set; } = false;
 | 
			
		||||
        public bool GreetPM { get; set; } = false;
 | 
			
		||||
        [JsonProperty("greetChannel")]
 | 
			
		||||
        public long GreetChannelId { get; set; } = 0;
 | 
			
		||||
        public string GreetText { get; set; } = "Welcome %user%!";
 | 
			
		||||
        public bool Bye { get; set; } = false;
 | 
			
		||||
        public bool ByePM { get; set; } = false;
 | 
			
		||||
        [JsonProperty("byeChannel")]
 | 
			
		||||
        public long ByeChannelId { get; set; } = 0;
 | 
			
		||||
        public string ByeText { get; set; } = "%user% has left the server.";
 | 
			
		||||
        public bool DeleteGreetMessages { get; set; } = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class Command : IDataModel {
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
        public string UserName { get; set; }
 | 
			
		||||
        public long ServerId { get; set; }
 | 
			
		||||
        public string ServerName { get; set; }
 | 
			
		||||
        public long ChannelId { get; set; }
 | 
			
		||||
        public string ChannelName { get; set; }
 | 
			
		||||
        public string CommandName { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class CurrencyState : IDataModel {
 | 
			
		||||
        public long Value { get; set; }
 | 
			
		||||
        [SQLite.Unique]
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class CurrencyTransaction : IDataModel {
 | 
			
		||||
        public string Reason { get; set; }
 | 
			
		||||
        public int Value { get; set; }
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class Donator : IDataModel {
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
        public string UserName { get; set; }
 | 
			
		||||
        public int Amount { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
using SQLite;
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal abstract class IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        [PrimaryKey, AutoIncrement]
 | 
			
		||||
        public int? Id { get; set; }
 | 
			
		||||
        [Newtonsoft.Json.JsonProperty("createdAt")]
 | 
			
		||||
        public DateTime DateAdded { get; set; } = DateTime.Now;
 | 
			
		||||
        public IDataModel() { }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    class Incident : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public long ServerId { get; set; }
 | 
			
		||||
        public long ChannelId { get; set; }
 | 
			
		||||
        public string Text { get; set; }
 | 
			
		||||
        public bool Read { get; set; } = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal class MusicPlaylist : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public long CreatorId { get; set; }
 | 
			
		||||
        public string CreatorName { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal class PlaylistSongInfo : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public int PlaylistId { get; set; }
 | 
			
		||||
        public int SongInfoId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    class UserPokeTypes : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
        public string type { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class Request : IDataModel {
 | 
			
		||||
        public string UserName { get; set; }
 | 
			
		||||
        public long UserId { get; set; }
 | 
			
		||||
        public string ServerName { get; set; }
 | 
			
		||||
        public long ServerId { get; set; }
 | 
			
		||||
        [Newtonsoft.Json.JsonProperty("Request")]
 | 
			
		||||
        public string RequestText { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
using SQLite;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal class SongInfo : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public string Provider { get; internal set; }
 | 
			
		||||
        public int ProviderType { get; internal set; }
 | 
			
		||||
        public string Title { get; internal set; }
 | 
			
		||||
        public string Uri { get; internal set; }
 | 
			
		||||
        [Unique]
 | 
			
		||||
        public string Query { get; internal set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class Stats : IDataModel {
 | 
			
		||||
        public int ConnectedServers { get; set; }
 | 
			
		||||
        public int OnlineUsers { get; set; }
 | 
			
		||||
        public TimeSpan Uptime { get; set; }
 | 
			
		||||
        public int RealOnlineUsers { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels
 | 
			
		||||
{
 | 
			
		||||
    internal class TestDataModel : IDataModel
 | 
			
		||||
    {
 | 
			
		||||
        public long TestNumber { get; set; }
 | 
			
		||||
        public string TestString { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class TypingArticle : IDataModel {
 | 
			
		||||
        public string Text { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
namespace NadekoBot.DataModels {
 | 
			
		||||
    internal class UserQuote : IDataModel {
 | 
			
		||||
        public string UserName { get; set; }
 | 
			
		||||
        public string Keyword { get; set; }
 | 
			
		||||
        public string Text { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels
 | 
			
		||||
{
 | 
			
		||||
    public class AnimeResult
 | 
			
		||||
    {
 | 
			
		||||
        public int id;
 | 
			
		||||
        public string airing_status;
 | 
			
		||||
        public string title_english;
 | 
			
		||||
        public int total_episodes;
 | 
			
		||||
        public string description;
 | 
			
		||||
        public string image_url_lge;
 | 
			
		||||
 | 
			
		||||
        public override string ToString() =>
 | 
			
		||||
            "`Title:` **" + title_english +
 | 
			
		||||
            "**\n`Status:` " + airing_status +
 | 
			
		||||
            "\n`Episodes:` " + total_episodes +
 | 
			
		||||
            "\n`Link:` http://anilist.co/anime/" + id +
 | 
			
		||||
            "\n`Synopsis:` " + description.Substring(0, description.Length > 500 ? 500 : description.Length) + "..." +
 | 
			
		||||
            "\n`img:` " + image_url_lge;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,246 +0,0 @@
 | 
			
		||||
using Discord;
 | 
			
		||||
using NadekoBot.Extensions;
 | 
			
		||||
using Newtonsoft.Json;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Runtime.Serialization;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels
 | 
			
		||||
{
 | 
			
		||||
    public class Configuration
 | 
			
		||||
    {
 | 
			
		||||
        [JsonIgnore]
 | 
			
		||||
        public static readonly Dictionary<string, List<string>> DefaultCustomReactions = new Dictionary<string, List<string>>
 | 
			
		||||
        {
 | 
			
		||||
            {@"\o\", new List<string>()
 | 
			
		||||
            { "/o/" } },
 | 
			
		||||
            {"/o/", new List<string>()
 | 
			
		||||
            { @"\o\" } },
 | 
			
		||||
            {"moveto", new List<string>() {
 | 
			
		||||
                @"(👉 ͡° ͜ʖ ͡°)👉 %target%" } },
 | 
			
		||||
            {"comeatmebro", new List<string>() {
 | 
			
		||||
                "%target% (ง’̀-‘́)ง" } },
 | 
			
		||||
            {"e", new List<string>() {
 | 
			
		||||
                "%user% did it 😒 🔫",
 | 
			
		||||
                "%target% did it 😒 🔫" } },
 | 
			
		||||
            {"%mention% insult", new List<string>() {
 | 
			
		||||
                "%target% You are a poop.",
 | 
			
		||||
                "%target% You're a jerk.",
 | 
			
		||||
                "%target% I will eat you when I get my powers back."
 | 
			
		||||
                 } },
 | 
			
		||||
            {"%mention% praise", new List<string>()
 | 
			
		||||
            {
 | 
			
		||||
                "%target% You are cool.",
 | 
			
		||||
                "%target% You are nice!",
 | 
			
		||||
                "%target% You did a good job.",
 | 
			
		||||
                "%target% You did something nice.",
 | 
			
		||||
                "%target% is awesome!",
 | 
			
		||||
                "%target% Wow."
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% pat", new List<string>() {
 | 
			
		||||
                "http://i.imgur.com/IiQwK12.gif",
 | 
			
		||||
                "http://i.imgur.com/JCXj8yD.gif",
 | 
			
		||||
                "http://i.imgur.com/qqBl2bm.gif",
 | 
			
		||||
                "http://i.imgur.com/eOJlnwP.gif",
 | 
			
		||||
                "https://45.media.tumblr.com/229ec0458891c4dcd847545c81e760a5/tumblr_mpfy232F4j1rxrpjzo1_r2_500.gif",
 | 
			
		||||
                "https://media.giphy.com/media/KZQlfylo73AMU/giphy.gif",
 | 
			
		||||
                "https://media.giphy.com/media/12hvLuZ7uzvCvK/giphy.gif",
 | 
			
		||||
                "http://gallery1.anivide.com/_full/65030_1382582341.gif",
 | 
			
		||||
                "https://49.media.tumblr.com/8e8a099c4eba22abd3ec0f70fd087cce/tumblr_nxovj9oY861ur1mffo1_500.gif ",
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% cry", new List<string>()
 | 
			
		||||
            {
 | 
			
		||||
                "http://i.imgur.com/Xg3i1Qy.gif",
 | 
			
		||||
                "http://i.imgur.com/3K8DRrU.gif",
 | 
			
		||||
                "http://i.imgur.com/k58BcAv.gif",
 | 
			
		||||
                "http://i.imgur.com/I2fLXwo.gif"
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% are you real?", new List<string>()
 | 
			
		||||
            {
 | 
			
		||||
                "%user%, I will be soon."
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% are you there?", new List<string>()
 | 
			
		||||
            {
 | 
			
		||||
                "Yes. :)"
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% draw", new List<string>() {
 | 
			
		||||
                "Sorry, I don't gamble, type $draw for that function."
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% bb", new List<string>()
 | 
			
		||||
            {
 | 
			
		||||
                "Bye %target%"
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% call", new List<string>() {
 | 
			
		||||
                "Calling %target%"
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% disguise", new List<string>() {
 | 
			
		||||
                "https://cdn.discordapp.com/attachments/140007341880901632/156721710458994690/Cc5mixjUYAADgBs.jpg",
 | 
			
		||||
                "https://cdn.discordapp.com/attachments/140007341880901632/156721715831898113/hqdefault.jpg",
 | 
			
		||||
                "https://cdn.discordapp.com/attachments/140007341880901632/156721724430352385/okawari_01_haruka_weird_mask.jpg",
 | 
			
		||||
                "https://cdn.discordapp.com/attachments/140007341880901632/156721728763068417/mustache-best-girl.png"
 | 
			
		||||
 | 
			
		||||
            } },
 | 
			
		||||
            {"%mention% inv", new List<string>() {
 | 
			
		||||
                "To invite your bot, click on this link -> <https://discordapp.com/oauth2/authorize?client_id=%target%&scope=bot&permissions=66186303>"
 | 
			
		||||
            } },
 | 
			
		||||
            { "%mention% threaten", new List<string>() {
 | 
			
		||||
                "You wanna die, %target%?"
 | 
			
		||||
            } },
 | 
			
		||||
            { "%mention% archer", new List<string>() {
 | 
			
		||||
                "http://i.imgur.com/Bha9NhL.jpg"
 | 
			
		||||
            } }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        public bool DontJoinServers { get; set; } = false;
 | 
			
		||||
        public bool ForwardMessages { get; set; } = true;
 | 
			
		||||
        public bool ForwardToAllOwners { get; set; } = false;
 | 
			
		||||
        public bool IsRotatingStatus { get; set; } = false;
 | 
			
		||||
        public int BufferSize { get; set; } = 4.MiB();
 | 
			
		||||
 | 
			
		||||
        public string[] RaceAnimals { get; internal set; } = {
 | 
			
		||||
                "🐼",
 | 
			
		||||
                "🐻",
 | 
			
		||||
                "🐧",
 | 
			
		||||
                "🐨",
 | 
			
		||||
                "🐬",
 | 
			
		||||
                "🐞",
 | 
			
		||||
                "🦀",
 | 
			
		||||
                "🦄" };
 | 
			
		||||
 | 
			
		||||
        [JsonIgnore]
 | 
			
		||||
        public List<Quote> Quotes { get; set; } = new List<Quote>();
 | 
			
		||||
 | 
			
		||||
        [JsonIgnore]
 | 
			
		||||
        public List<PokemonType> PokemonTypes { get; set; } = new List<PokemonType>();
 | 
			
		||||
 | 
			
		||||
        public string RemindMessageFormat { get; set; } = "❗⏰**I've been told to remind you to '%message%' now by %user%.**⏰❗";
 | 
			
		||||
 | 
			
		||||
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
 | 
			
		||||
        public Dictionary<string, List<string>> CustomReactions { get; set; }
 | 
			
		||||
 | 
			
		||||
        public List<string> RotatingStatuses { get; set; } = new List<string>();
 | 
			
		||||
        public CommandPrefixesModel CommandPrefixes { get; set; } = new CommandPrefixesModel();
 | 
			
		||||
        public HashSet<ulong> ServerBlacklist { get; set; } = new HashSet<ulong>();
 | 
			
		||||
        public HashSet<ulong> ChannelBlacklist { get; set; } = new HashSet<ulong>();
 | 
			
		||||
 | 
			
		||||
        public HashSet<ulong> UserBlacklist { get; set; } = new HashSet<ulong>() {
 | 
			
		||||
            105309315895693312,
 | 
			
		||||
            119174277298782216,
 | 
			
		||||
            143515953525817344
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        [OnDeserialized]
 | 
			
		||||
        internal void OnDeserialized(StreamingContext context)
 | 
			
		||||
        {
 | 
			
		||||
            if (CustomReactions == null)
 | 
			
		||||
            {
 | 
			
		||||
                CustomReactions = DefaultCustomReactions;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        [OnSerializing]
 | 
			
		||||
        internal void OnSerializing(StreamingContext context)
 | 
			
		||||
        {
 | 
			
		||||
            if (CustomReactions == null)
 | 
			
		||||
            {
 | 
			
		||||
                CustomReactions = DefaultCustomReactions;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string[] _8BallResponses { get; set; } =
 | 
			
		||||
            {
 | 
			
		||||
                "Most definitely yes",
 | 
			
		||||
                "For sure",
 | 
			
		||||
                "As I see it, yes",
 | 
			
		||||
                "My sources say yes",
 | 
			
		||||
                "Yes",
 | 
			
		||||
                "Most likely",
 | 
			
		||||
                "Perhaps",
 | 
			
		||||
                "Maybe",
 | 
			
		||||
                "Not sure",
 | 
			
		||||
                "It is uncertain",
 | 
			
		||||
                "Ask me again later",
 | 
			
		||||
                "Don't count on it",
 | 
			
		||||
                "Probably not",
 | 
			
		||||
                "Very doubtful",
 | 
			
		||||
                "Most likely no",
 | 
			
		||||
                "Nope",
 | 
			
		||||
                "No",
 | 
			
		||||
                "My sources say no",
 | 
			
		||||
                "Dont even think about it",
 | 
			
		||||
                "Definitely no",
 | 
			
		||||
                "NO - It may cause disease contraction"
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
        public string CurrencySign { get; set; } = "🌸";
 | 
			
		||||
        public string CurrencyName { get; set; } = "NadekoFlower";
 | 
			
		||||
        public string DMHelpString { get; set; } = "Type `-h` for help.";
 | 
			
		||||
        public string HelpString { get; set; } = @"You can use `{0}modules` command to see a list of all modules.
 | 
			
		||||
You can use `{0}commands ModuleName`
 | 
			
		||||
(for example `{0}commands Administration`) to see a list of all of the commands in that module.
 | 
			
		||||
For a specific command help, use `{0}h ""Command name""` (for example `-h ""!m q""`)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
**LIST OF COMMANDS CAN BE FOUND ON THIS LINK**
 | 
			
		||||
<https://github.com/Kwoth/NadekoBot/blob/master/commandlist.md>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Nadeko Support Server: <https://discord.gg/0ehQwTK2RBjAxzEY>";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class CommandPrefixesModel
 | 
			
		||||
    {
 | 
			
		||||
        public string Administration { get; set; } = ".";
 | 
			
		||||
        public string Searches { get; set; } = "~";
 | 
			
		||||
        public string NSFW { get; set; } = "~";
 | 
			
		||||
        public string Conversations { get; set; } = "<@{0}>";
 | 
			
		||||
        public string ClashOfClans { get; set; } = ",";
 | 
			
		||||
        public string Help { get; set; } = "-";
 | 
			
		||||
        public string Music { get; set; } = "!!";
 | 
			
		||||
        public string Trello { get; set; } = "trello ";
 | 
			
		||||
        public string Games { get; set; } = ">";
 | 
			
		||||
        public string Gambling { get; set; } = "$";
 | 
			
		||||
        public string Permissions { get; set; } = ";";
 | 
			
		||||
        public string Programming { get; set; } = "%";
 | 
			
		||||
        public string Pokemon { get; set; } = ">";
 | 
			
		||||
        public string Utility { get; set; } = ".";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class ConfigHandler
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly SemaphoreSlim configLock = new SemaphoreSlim(1, 1);
 | 
			
		||||
        public static async Task SaveConfig()
 | 
			
		||||
        {
 | 
			
		||||
            await configLock.WaitAsync();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                File.WriteAllText("data/config.json", JsonConvert.SerializeObject(NadekoBot.Config, Formatting.Indented));
 | 
			
		||||
            }
 | 
			
		||||
            finally
 | 
			
		||||
            {
 | 
			
		||||
                configLock.Release();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool IsBlackListed(MessageEventArgs evArgs) => IsUserBlacklisted(evArgs.User.Id) ||
 | 
			
		||||
                                                                      (!evArgs.Channel.IsPrivate &&
 | 
			
		||||
                                                                       (IsChannelBlacklisted(evArgs.Channel.Id) || IsServerBlacklisted(evArgs.Server.Id)));
 | 
			
		||||
 | 
			
		||||
        public static bool IsServerBlacklisted(ulong id) => NadekoBot.Config.ServerBlacklist.Contains(id);
 | 
			
		||||
 | 
			
		||||
        public static bool IsChannelBlacklisted(ulong id) => NadekoBot.Config.ChannelBlacklist.Contains(id);
 | 
			
		||||
 | 
			
		||||
        public static bool IsUserBlacklisted(ulong id) => NadekoBot.Config.UserBlacklist.Contains(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class Quote
 | 
			
		||||
    {
 | 
			
		||||
        public string Author { get; set; }
 | 
			
		||||
        public string Text { get; set; }
 | 
			
		||||
 | 
			
		||||
        public override string ToString() =>
 | 
			
		||||
            $"{Text}\n\t*-{Author}*";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
using System.IO;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels {
 | 
			
		||||
    public class LocalizedStrings {
 | 
			
		||||
        public string[] Insults { get; set; } = {
 | 
			
		||||
            " You are a poop.", " You're a jerk.",
 | 
			
		||||
            " I will eat you when I get my powers back."
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        public string[] Praises { get; set; } = {
 | 
			
		||||
            " You are cool.",
 | 
			
		||||
            " You are nice!",
 | 
			
		||||
            " You did a good job.",
 | 
			
		||||
            " You did something nice.",
 | 
			
		||||
            " is awesome!",
 | 
			
		||||
            " Wow."
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        public static string[] GetAvailableLocales() {
 | 
			
		||||
            Directory.CreateDirectory("data/locales");
 | 
			
		||||
            return Directory.GetFiles("data/locales");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //public static void HandleLocalization() {
 | 
			
		||||
        //    var locales = LocalizedStrings.GetAvailableLocales();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //    Console.WriteLine("Pick a language:\n" +
 | 
			
		||||
        //                      "1. English");
 | 
			
		||||
        //    for (var i = 0; i < locales.Length; i++) {
 | 
			
		||||
        //        Console.WriteLine((i + 2) + ". " + Path.GetFileNameWithoutExtension(locales[i]));
 | 
			
		||||
        //    }
 | 
			
		||||
        //    File.WriteAllText("data/locales/english.json", JsonConvert.SerializeObject(new LocalizedStrings(), Formatting.Indented));
 | 
			
		||||
        //    try {
 | 
			
		||||
        //        Console.WriteLine($"Type in a number from {1} to {locales.Length + 1}\n");
 | 
			
		||||
        //        var input = Console.ReadLine();
 | 
			
		||||
        //        if (input != "1")
 | 
			
		||||
        //            Locale = LocalizedStrings.LoadLocale(locales[int.Parse(input) - 2]);
 | 
			
		||||
        //    } catch (Exception ex) {
 | 
			
		||||
        //        Console.ForegroundColor = ConsoleColor.Red;
 | 
			
		||||
        //        Console.WriteLine(ex);
 | 
			
		||||
        //        Console.ReadKey();
 | 
			
		||||
        //        return;
 | 
			
		||||
        //    }
 | 
			
		||||
        //}
 | 
			
		||||
 | 
			
		||||
        public static LocalizedStrings LoadLocale(string localeFile) =>
 | 
			
		||||
            Newtonsoft.Json.JsonConvert.DeserializeObject<LocalizedStrings>(File.ReadAllText(localeFile));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels
 | 
			
		||||
{
 | 
			
		||||
    class MagicItem
 | 
			
		||||
    {
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public string Description { get; set; }
 | 
			
		||||
        public override string ToString() =>
 | 
			
		||||
            $"✨`{Name}`\n\t*{Description}*";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels
 | 
			
		||||
{
 | 
			
		||||
    public class PokemonType
 | 
			
		||||
    {
 | 
			
		||||
        public PokemonType(string n, string i, string[] m, List<PokemonMultiplier> multi)
 | 
			
		||||
        {
 | 
			
		||||
            Name = n;
 | 
			
		||||
            Icon = i;
 | 
			
		||||
            Moves = m;
 | 
			
		||||
            Multipliers = multi;
 | 
			
		||||
        }
 | 
			
		||||
        public string Name { get; set; }
 | 
			
		||||
        public List<PokemonMultiplier> Multipliers { get; set; }
 | 
			
		||||
        public string Icon { get; set; }
 | 
			
		||||
        public string[] Moves { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class PokemonMultiplier
 | 
			
		||||
    {
 | 
			
		||||
        public PokemonMultiplier(string t, double m)
 | 
			
		||||
        {
 | 
			
		||||
            Type = t;
 | 
			
		||||
            Multiplication = m;
 | 
			
		||||
        }
 | 
			
		||||
        public string Type { get; set; }
 | 
			
		||||
        public double Multiplication { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,155 +0,0 @@
 | 
			
		||||
// ReSharper disable InconsistentNaming
 | 
			
		||||
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Classes.JSONModels
 | 
			
		||||
{
 | 
			
		||||
    public class Credentials
 | 
			
		||||
    {
 | 
			
		||||
        public string Token { get; set; } = "";
 | 
			
		||||
        public string ClientId { get; set; } = "170254782546575360";
 | 
			
		||||
        public ulong BotId { get; set; } = 1231231231231;
 | 
			
		||||
        public ulong[] OwnerIds { get; set; } = { 123123123123, 5675675679845 };
 | 
			
		||||
        public string GoogleAPIKey { get; set; } = "";
 | 
			
		||||
        public string SoundCloudClientID { get; set; } = "";
 | 
			
		||||
        public string MashapeKey { get; set; } = "";
 | 
			
		||||
        public string LOLAPIKey { get; set; } = "";
 | 
			
		||||
        public string TrelloAppKey { get; set; } = "";
 | 
			
		||||
        public string CarbonKey { get; set; } = "";
 | 
			
		||||
        public string OsuAPIKey { get; set; } = "";
 | 
			
		||||
    }
 | 
			
		||||
    [DebuggerDisplay("{items[0].id.playlistId}")]
 | 
			
		||||
    public class YoutubePlaylistSearch
 | 
			
		||||
    {
 | 
			
		||||
        public YtPlaylistItem[] items { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class YtPlaylistItem
 | 
			
		||||
    {
 | 
			
		||||
        public YtPlaylistId id { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class YtPlaylistId
 | 
			
		||||
    {
 | 
			
		||||
        public string kind { get; set; }
 | 
			
		||||
        public string playlistId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    [DebuggerDisplay("{items[0].id.videoId}")]
 | 
			
		||||
    public class YoutubeVideoSearch
 | 
			
		||||
    {
 | 
			
		||||
        public YtVideoItem[] items { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class YtVideoItem
 | 
			
		||||
    {
 | 
			
		||||
        public YtVideoId id { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class YtVideoId
 | 
			
		||||
    {
 | 
			
		||||
        public string kind { get; set; }
 | 
			
		||||
        public string videoId { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class PlaylistItemsSearch
 | 
			
		||||
    {
 | 
			
		||||
        public string nextPageToken { get; set; }
 | 
			
		||||
        public PlaylistItem[] items { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class PlaylistItem
 | 
			
		||||
    {
 | 
			
		||||
        public YtVideoId contentDetails { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #region wikpedia example
 | 
			
		||||
    //    {
 | 
			
		||||
    //    "batchcomplete": true,
 | 
			
		||||
    //    "query": {
 | 
			
		||||
    //        "normalized": [
 | 
			
		||||
    //            {
 | 
			
		||||
    //                "from": "u3fn92fb32f9yb329f32",
 | 
			
		||||
    //                "to": "U3fn92fb32f9yb329f32"
 | 
			
		||||
    //            }
 | 
			
		||||
    //        ],
 | 
			
		||||
    //        "pages": [
 | 
			
		||||
    //            {
 | 
			
		||||
    //                "ns": 0,
 | 
			
		||||
    //                "title": "U3fn92fb32f9yb329f32",
 | 
			
		||||
    //                "missing": true,
 | 
			
		||||
    //                "contentmodel": "wikitext",
 | 
			
		||||
    //                "pagelanguage": "en",
 | 
			
		||||
    //                "pagelanguagehtmlcode": "en",
 | 
			
		||||
    //                "pagelanguagedir": "ltr",
 | 
			
		||||
    //                "fullurl": "https://en.wikipedia.org/wiki/U3fn92fb32f9yb329f32",
 | 
			
		||||
    //                "editurl": "https://en.wikipedia.org/w/index.php?title=U3fn92fb32f9yb329f32&action=edit",
 | 
			
		||||
    //                "canonicalurl": "https://en.wikipedia.org/wiki/U3fn92fb32f9yb329f32"
 | 
			
		||||
    //            }
 | 
			
		||||
    //        ]
 | 
			
		||||
    //    }
 | 
			
		||||
    //}
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    public class WikipediaApiModel
 | 
			
		||||
    {
 | 
			
		||||
        public WikipediaQuery Query { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class WikipediaQuery
 | 
			
		||||
    {
 | 
			
		||||
        public WikipediaPage[] Pages { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class WikipediaPage
 | 
			
		||||
    {
 | 
			
		||||
        public bool Missing { get; set; } = false;
 | 
			
		||||
        public string FullUrl { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class WoWJoke
 | 
			
		||||
    {
 | 
			
		||||
        public string Question { get; set; }
 | 
			
		||||
        public string Answer { get; set; }
 | 
			
		||||
        public override string ToString() => $"`{Question}`\n\n**{Answer}**";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//{
 | 
			
		||||
// "kind": "youtube#searchListResponse",
 | 
			
		||||
// "etag": "\"kiOs9cZLH2FUp6r6KJ8eyq_LIOk/hCJTmyH_v57mh_MvnUFSTHfjzBs\"",
 | 
			
		||||
// "nextPageToken": "CAEQAA",
 | 
			
		||||
// "regionCode": "RS",
 | 
			
		||||
// "pageInfo": {
 | 
			
		||||
//  "totalResults": 4603,
 | 
			
		||||
//  "resultsPerPage": 1
 | 
			
		||||
// },
 | 
			
		||||
// "items": [
 | 
			
		||||
//  {
 | 
			
		||||
//   "kind": "youtube#searchResult",
 | 
			
		||||
//   "etag": "\"kiOs9cZLH2FUp6r6KJ8eyq_LIOk/iD1S35mk0xOfwTB_8lpPZ9u-Vzc\"",
 | 
			
		||||
//   "id": {
 | 
			
		||||
//    "kind": "youtube#playlist",
 | 
			
		||||
//    "playlistId": "PLs_KC2CCxJVMfOBnIyW5Kbu_GciNiYNAI"
 | 
			
		||||
//   },
 | 
			
		||||
//   "snippet": {
 | 
			
		||||
//    "publishedAt": "2016-04-14T11:35:29.000Z",
 | 
			
		||||
//    "channelId": "UCMLwm18Qa20L2L-HGpgC3jQ",
 | 
			
		||||
//    "title": "Popular Videos - Otorimonogatari & mousou express",
 | 
			
		||||
//    "description": "",
 | 
			
		||||
//    "thumbnails": {
 | 
			
		||||
//     "default": {
 | 
			
		||||
//      "url": "https://i.ytimg.com/vi/2FeptLky2mU/default.jpg",
 | 
			
		||||
//      "width": 120,
 | 
			
		||||
//      "height": 90
 | 
			
		||||
//     },
 | 
			
		||||
//     "medium": {
 | 
			
		||||
//      "url": "https://i.ytimg.com/vi/2FeptLky2mU/mqdefault.jpg",
 | 
			
		||||
//      "width": 320,
 | 
			
		||||
//      "height": 180
 | 
			
		||||
//     },
 | 
			
		||||
//     "high": {
 | 
			
		||||
//      "url": "https://i.ytimg.com/vi/2FeptLky2mU/hqdefault.jpg",
 | 
			
		||||
//      "width": 480,
 | 
			
		||||
//      "height": 360
 | 
			
		||||
//     }
 | 
			
		||||
//    },
 | 
			
		||||
//    "channelTitle": "Otorimonogatari - Topic",
 | 
			
		||||
//    "liveBroadcastContent": "none"
 | 
			
		||||
//   }
 | 
			
		||||
//  }
 | 
			
		||||
// ]
 | 
			
		||||
//}
 | 
			
		||||
@@ -9,7 +9,7 @@ using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.CustomReactions
 | 
			
		||||
{
 | 
			
		||||
    internal class CustomReactionsModule : DiscordModule
 | 
			
		||||
    public class CustomReactionsModule : DiscordModule
 | 
			
		||||
    {
 | 
			
		||||
        public override string Prefix { get; } = "";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,6 @@ namespace NadekoBot.Classes
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Initializes the CommandBuilder with values using CommandGroupBuilder
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        internal abstract void Init(CommandGroupBuilder cgb);
 | 
			
		||||
        public abstract void Init(CommandGroupBuilder cgb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
 | 
			
		||||
namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    internal class PermissionChecker : IPermissionChecker
 | 
			
		||||
    public class PermissionChecker : IPermissionChecker
 | 
			
		||||
    {
 | 
			
		||||
        public static PermissionChecker Instance { get; } = new PermissionChecker();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
{
 | 
			
		||||
    internal static class PermissionHelper
 | 
			
		||||
    public static class PermissionHelper
 | 
			
		||||
    {
 | 
			
		||||
        public static bool ValidateBool(string passedArg)
 | 
			
		||||
        {
 | 
			
		||||
@@ -37,7 +37,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static string ValidateModule(string mod)
 | 
			
		||||
        public static string ValidateModule(string mod)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(mod))
 | 
			
		||||
                throw new ArgumentNullException(nameof(mod));
 | 
			
		||||
@@ -50,7 +50,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            throw new ArgumentException("That module does not exist.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static string ValidateCommand(string commandText)
 | 
			
		||||
        public static string ValidateCommand(string commandText)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(commandText))
 | 
			
		||||
                throw new ArgumentNullException(nameof(commandText));
 | 
			
		||||
@@ -65,7 +65,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            throw new NullReferenceException("That command does not exist.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Role ValidateRole(Server server, string roleName)
 | 
			
		||||
        public static Role ValidateRole(Server server, string roleName)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(roleName))
 | 
			
		||||
                throw new ArgumentNullException(nameof(roleName));
 | 
			
		||||
@@ -78,7 +78,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return role;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Channel ValidateChannel(Server server, string channelName)
 | 
			
		||||
        public static Channel ValidateChannel(Server server, string channelName)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(channelName))
 | 
			
		||||
                throw new ArgumentNullException(nameof(channelName));
 | 
			
		||||
@@ -88,7 +88,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return channel;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static User ValidateUser(Server server, string userName)
 | 
			
		||||
        public static User ValidateUser(Server server, string userName)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(userName))
 | 
			
		||||
                throw new ArgumentNullException(nameof(userName));
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            Console.WriteLine("Permission initialization complete.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Permissions GetRolePermissionsById(Server server, ulong id)
 | 
			
		||||
        public static Permissions GetRolePermissionsById(Server server, ulong id)
 | 
			
		||||
        {
 | 
			
		||||
            ServerPermissions serverPerms;
 | 
			
		||||
            if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
 | 
			
		||||
@@ -52,7 +52,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return toReturn;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Permissions GetUserPermissionsById(Server server, ulong id)
 | 
			
		||||
        public static Permissions GetUserPermissionsById(Server server, ulong id)
 | 
			
		||||
        {
 | 
			
		||||
            ServerPermissions serverPerms;
 | 
			
		||||
            if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
 | 
			
		||||
@@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return toReturn;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Permissions GetChannelPermissionsById(Server server, ulong id)
 | 
			
		||||
        public static Permissions GetChannelPermissionsById(Server server, ulong id)
 | 
			
		||||
        {
 | 
			
		||||
            ServerPermissions serverPerms;
 | 
			
		||||
            if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
 | 
			
		||||
@@ -74,13 +74,13 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return toReturn;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static Permissions GetServerPermissions(Server server)
 | 
			
		||||
        public static Permissions GetServerPermissions(Server server)
 | 
			
		||||
        {
 | 
			
		||||
            ServerPermissions serverPerms;
 | 
			
		||||
            return !PermissionsDict.TryGetValue(server.Id, out serverPerms) ? null : serverPerms.Permissions;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel)
 | 
			
		||||
        public static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel)
 | 
			
		||||
        {
 | 
			
		||||
            var server = user.Server;
 | 
			
		||||
            ServerPermissions serverPerms = PermissionsDict.GetOrAdd(server.Id, id => new ServerPermissions(id, server.Name));
 | 
			
		||||
@@ -174,7 +174,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            return serverPerms.PermissionsControllerRole;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static async Task SetPermissionsRole(Server server, string roleName)
 | 
			
		||||
        public static async Task SetPermissionsRole(Server server, string roleName)
 | 
			
		||||
        {
 | 
			
		||||
            var serverPerms = PermissionsDict.GetOrAdd(server.Id,
 | 
			
		||||
                new ServerPermissions(server.Id, server.Name));
 | 
			
		||||
@@ -183,7 +183,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            await WriteServerToJson(serverPerms).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static async Task SetVerbosity(Server server, bool val)
 | 
			
		||||
        public static async Task SetVerbosity(Server server, bool val)
 | 
			
		||||
        {
 | 
			
		||||
            var serverPerms = PermissionsDict.GetOrAdd(server.Id,
 | 
			
		||||
                new ServerPermissions(server.Id, server.Name));
 | 
			
		||||
@@ -192,7 +192,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            await WriteServerToJson(serverPerms).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static async Task CopyRolePermissions(Role fromRole, Role toRole)
 | 
			
		||||
        public static async Task CopyRolePermissions(Role fromRole, Role toRole)
 | 
			
		||||
        {
 | 
			
		||||
            var server = fromRole.Server;
 | 
			
		||||
            var serverPerms = PermissionsDict.GetOrAdd(server.Id,
 | 
			
		||||
@@ -210,7 +210,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            await WriteServerToJson(serverPerms).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static async Task CopyChannelPermissions(Channel fromChannel, Channel toChannel)
 | 
			
		||||
        public static async Task CopyChannelPermissions(Channel fromChannel, Channel toChannel)
 | 
			
		||||
        {
 | 
			
		||||
            var server = fromChannel.Server;
 | 
			
		||||
            var serverPerms = PermissionsDict.GetOrAdd(server.Id,
 | 
			
		||||
@@ -228,7 +228,7 @@ namespace NadekoBot.Modules.Permissions.Classes
 | 
			
		||||
            await WriteServerToJson(serverPerms).ConfigureAwait(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal static async Task CopyUserPermissions(User fromUser, User toUser)
 | 
			
		||||
        public static async Task CopyUserPermissions(User fromUser, User toUser)
 | 
			
		||||
        {
 | 
			
		||||
            var server = fromUser.Server;
 | 
			
		||||
            var serverPerms = PermissionsDict.GetOrAdd(server.Id,
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Permissions
 | 
			
		||||
{
 | 
			
		||||
    internal class FilterInvitesCommand : DiscordCommand
 | 
			
		||||
    public class FilterInvitesCommand : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|app\.com\/invite)\/(?<id>([\w]{16}|(?:[\w]+-?){3})))");
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +49,7 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterInvites;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "chnlfilterinv")
 | 
			
		||||
                .Alias(Module.Prefix + "cfi")
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Permissions
 | 
			
		||||
{
 | 
			
		||||
    internal class FilterWords : DiscordCommand
 | 
			
		||||
    public class FilterWords : DiscordCommand
 | 
			
		||||
    {
 | 
			
		||||
        public FilterWords(DiscordModule module) : base(module)
 | 
			
		||||
        {
 | 
			
		||||
@@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Permissions
 | 
			
		||||
            return serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perms) && perms.FilterWords;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        public override void Init(CommandGroupBuilder cgb)
 | 
			
		||||
        {
 | 
			
		||||
            cgb.CreateCommand(Module.Prefix + "chnlfilterwords")
 | 
			
		||||
                .Alias(Module.Prefix + "cfw")
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Permissions
 | 
			
		||||
{
 | 
			
		||||
    internal class PermissionModule : DiscordModule
 | 
			
		||||
    public class PermissionModule : DiscordModule
 | 
			
		||||
    {
 | 
			
		||||
        public override string Prefix { get; } = NadekoBot.Config.CommandPrefixes.Permissions;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user