diff --git a/Discord.Net b/Discord.Net
index 58766448..80384323 160000
--- a/Discord.Net
+++ b/Discord.Net
@@ -1 +1 @@
-Subproject commit 58766448d79ac9adec228f341f258aa262a3f278
+Subproject commit 80384323790471d254c7db5c237a49dc62624378
diff --git a/NuGet.Config b/NuGet.Config
index d40268d3..e482807c 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -2,5 +2,6 @@
+
diff --git a/docs/Commands List.md b/docs/Commands List.md
index 1d354c4a..ed71757c 100644
--- a/docs/Commands List.md
+++ b/docs/Commands List.md
@@ -125,6 +125,14 @@ Command and aliases | Description | Usage
### Gambling
Command and aliases | Description | Usage
----------------|--------------|-------
+`$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend atleast 10% more than her current value unless she set `$affinity` towards you. | `$claim 50 @Himesama`
+`$divorce` | Releases your claim on a specific waifu. You will get some of the money you've spent back unless that waifu has an affinity towards you. 6 hours cooldown. | `$divorce @CheatingSloot`
+`$affinity` | Sets your affinity towards someone you want to be claimed by. Setting affinity will reduce their `$claim` on you by 20%. You can leave second argument empty to clear your affinity. 30 minutes cooldown. | `$affinity @MyHusband` or `$affinity`
+`$waifus` `$waifulb` | Shows top 9 waifus. | `$waifus`
+`$waifuinfo` `$waifustats` | Shows waifu stats for a target person. Defaults to you if no user is provided. | `$waifuinfo @MyCrush` or `$waifuinfo`
+`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot Owner only.** | `$slotstats`
+`$slottest` | Tests to see how much slots payout for X number of plays. **Bot Owner only.** | `$slottest 1000`
+`$slot` | Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user. | `$slot 5`
`$flip` | Flips coin(s) - heads or tails, and shows an image. | `$flip` or `$flip 3`
`$betflip` `$bf` | Bet to guess will the result be heads or tails. Guessing awards you 1.8x the currency you've bet. | `$bf 5 heads` or `$bf 3 t`
`$draw` | Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. | `$draw` or `$draw 5`
@@ -132,6 +140,7 @@ Command and aliases | Description | Usage
`$roll` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. Y can be a letter 'F' if you want to roll fate dice instead of dnd. | `$roll` or `$roll 7` or `$roll 3d5` or `$roll 5dF`
`$rolluo` | Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. | `$rolluo` or `$rolluo 7` or `$rolluo 3d5`
`$nroll` | Rolls in a given range. | `$nroll 5` (rolls 0-5) or `$nroll 5-15`
+`$startevent` | Starts one of the events seen on public nadeko. **Bot Owner only.** | `$startevent flowerreaction`
`$race` | Starts a new animal race. | `$race`
`$joinrace` `$jr` | Joins a new race. You can specify an amount of currency for betting (optional). You will get YourBet*(participants-1) back if you win. | `$jr` or `$jr 5`
`$raffle` | Prints a name and ID of a random user from the online list from the (optional) role. | `$raffle` or `$raffle RoleName`
@@ -206,7 +215,6 @@ Command and aliases | Description | Usage
`!!localplaylst` `!!lopl` | Queues all songs from a directory. **Bot Owner only.** | `!!lopl C:/music/classical`
`!!radio` `!!ra` | Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: ) | `!!ra radio link here`
`!!local` `!!lo` | Queues a local file by specifying a full path. **Bot Owner only.** | `!!lo C:/music/mysong.mp3`
-`!!move` `!!mv` | Moves the bot to your voice channel. (works only if music is already playing) | `!!mv`
`!!remove` `!!rm` | Remove a song by its # in the queue, or 'all' to remove whole queue. | `!!rm 5`
`!!movesong` `!!ms` | Moves a song from one position to another. | `!!ms 5>3`
`!!setmaxqueue` `!!smq` | Sets a maximum queue size. Supply 0 or no argument to have no limit. | `!!smq 50` or `!!smq`
@@ -226,7 +234,7 @@ Command and aliases | Description | Usage
Command and aliases | Description | Usage
----------------|--------------|-------
`~hentai` | Shows a hentai image from a random website (gelbooru or danbooru or konachan or atfbooru or yandere) with a given tag. Tag is optional but preferred. Only 1 tag allowed. | `~hentai yuri`
-`~autohentai` | Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tags. 20 seconds minimum. Provide no arguments to disable. | `~autohentai 30 yuri|tail|long_hair` or `~autohentai`
+`~autohentai` | Posts a hentai every X seconds with a random tag from the provided tags. Use `|` to separate tags. 20 seconds minimum. Provide no arguments to disable. **Requires ManageMessages channel permission.** | `~autohentai 30 yuri|tail|long_hair` or `~autohentai`
`~hentaibomb` | Shows a total 5 images (from gelbooru, danbooru, konachan, yandere and atfbooru). Tag is optional but preferred. | `~hentaibomb yuri`
`~danbooru` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~danbooru yuri+kissing`
`~yandere` | Shows a random image from yandere with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~yandere tag1+tag2`
@@ -249,6 +257,7 @@ Command and aliases | Description | Usage
`;chnlfilterwords` `;cfw` | Toggles automatic deleting of messages containing banned words on the channel. Does not negate the ;srvrfilterwords enabled setting. Does not affect bot owner. | `;cfw`
`;fw` | Adds or removes (if it exists) a word from the list of filtered words. Use`;sfw` or `;cfw` to toggle filtering. | `;fw poop`
`;lstfilterwords` `;lfw` | Shows a list of filtered words. | `;lfw`
+`;cmdcosts` | Shows a list of command costs. Paginated with 9 command per page. | `;cmdcosts` or `;cmdcosts 2`
`;cmdcooldown` `;cmdcd` | Sets a cooldown per user for a command. Set to 0 to remove the cooldown. | `;cmdcd "some cmd" 5`
`;allcmdcooldowns` `;acmdcds` | Shows a list of all commands and their respective cooldowns. | `;acmdcds`
`;ubl` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot Owner only.** | `;ubl add @SomeUser` or `;ubl rem 12312312313`
diff --git a/scripts/Latest.bat b/scripts/Latest.bat
index 8d59ec86..a4f9e15b 100644
--- a/scripts/Latest.bat
+++ b/scripts/Latest.bat
@@ -1,5 +1,5 @@
@ECHO off
-TITLE Downloading NadekoBot, please wait
+TITLE Downloading Latest Build of NadekoBot...
::Setting convenient to read variables which don't delete the windows temp folder
SET root=%~dp0
CD /D %root%
@@ -24,30 +24,43 @@ ECHO Downloading Nadeko...
ECHO.
git clone -b dev --recursive --depth 1 --progress https://github.com/Kwoth/NadekoBot.git >nul
IF %ERRORLEVEL% EQU 128 (GOTO :giterror)
-TITLE Installing NadekoBot, please wait
+TITLE Installing NadekoBot, please wait...
ECHO.
-ECHO Installing...
+ECHO Installing Discord.Net(1/4)...
::Building Nadeko
CD /D %build1%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(2/4)...
CD /D %build2%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(3/4)...
CD /D %build3%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(4/4)...
CD /D %build4%
dotnet restore >nul 2>&1
+ECHO.
+ECHO Discord.Net installation completed successfully...
+ECHO.
+ECHO Installing NadekoBot...
CD /D %build5%
dotnet restore >nul 2>&1
dotnet build --configuration Release >nul 2>&1
+ECHO.
+ECHO NadekoBot installation completed successfully...
::Attempts to backup old files if they currently exist in the same folder as the batch file
IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
:freshinstall
::Moves the NadekoBot folder to keep things tidy
+ ECHO.
+ ECHO Moving files, Please wait...
ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
- GOTO :end
+ IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:backupinstall
- TITLE Backing up old files
+ TITLE Backing up old files...
+ ECHO.
+ ECHO Moving and Backing up old files...
::Recursively copies all files and folders from NadekoBot to NadekoBot_Old
ROBOCOPY "%root%NadekoBot" "%root%NadekoBot_Old" /MIR >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
@@ -70,7 +83,7 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
RMDIR "%root%NadekoBot\" /S /Q >nul 2>&1
ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
- GOTO :end
+ IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:dotnet
::Terminates the batch script if it can't run dotnet --version
TITLE Error!
@@ -102,6 +115,25 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
PAUSE >nul 2>&1
CD /D "%root%"
GOTO :EOF
+:64BIT
+ECHO.
+ECHO Your System Architecture is 64bit...
+GOTO end
+:32BIT
+ECHO.
+ECHO Your System Architecture is 32bit...
+timeout /t 5
+ECHO.
+ECHO Downloading libsodium.dll and opus.dll...
+SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\libsodium.dll"
+bitsadmin.exe /transfer "Downloading libsodium.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll "%FILENAME%"
+ECHO libsodium.dll downloaded.
+ECHO.
+timeout /t 5
+SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\opus.dll"
+bitsadmin.exe /transfer "Downloading opus.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll "%FILENAME%"
+ECHO opus.dll downloaded.
+GOTO end
:end
::Normal execution of end of script
TITLE Installation complete!
diff --git a/scripts/Stable.bat b/scripts/Stable.bat
index a2016889..f55fc958 100644
--- a/scripts/Stable.bat
+++ b/scripts/Stable.bat
@@ -1,5 +1,5 @@
@ECHO off
-TITLE Downloading NadekoBot, please wait
+TITLE Downloading Stable Build of NadekoBot...
::Setting convenient to read variables which don't delete the windows temp folder
SET root=%~dp0
CD /D %root%
@@ -24,30 +24,43 @@ ECHO Downloading Nadeko...
ECHO.
git clone -b master --recursive --depth 1 --progress https://github.com/Kwoth/NadekoBot.git >nul
IF %ERRORLEVEL% EQU 128 (GOTO :giterror)
-TITLE Installing NadekoBot, please wait
+TITLE Installing NadekoBot, please wait...
ECHO.
-ECHO Installing...
+ECHO Installing Discord.Net(1/4)...
::Building Nadeko
CD /D %build1%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(2/4)...
CD /D %build2%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(3/4)...
CD /D %build3%
dotnet restore >nul 2>&1
+ECHO Installing Discord.Net(4/4)...
CD /D %build4%
dotnet restore >nul 2>&1
+ECHO.
+ECHO Discord.Net installation completed successfully...
+ECHO.
+ECHO Installing NadekoBot...
CD /D %build5%
dotnet restore >nul 2>&1
dotnet build --configuration Release >nul 2>&1
+ECHO.
+ECHO NadekoBot installation completed successfully...
::Attempts to backup old files if they currently exist in the same folder as the batch file
IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
:freshinstall
::Moves the NadekoBot folder to keep things tidy
+ ECHO.
+ ECHO Moving files, Please wait...
ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
- GOTO :end
+ IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:backupinstall
- TITLE Backing up old files
+ TITLE Backing up old files...
+ ECHO.
+ ECHO Moving and Backing up old files...
::Recursively copies all files and folders from NadekoBot to NadekoBot_Old
ROBOCOPY "%root%NadekoBot" "%root%NadekoBot_Old" /MIR >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
@@ -70,7 +83,7 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
RMDIR "%root%NadekoBot\" /S /Q >nul 2>&1
ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1
IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror)
- GOTO :end
+ IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:dotnet
::Terminates the batch script if it can't run dotnet --version
TITLE Error!
@@ -102,6 +115,25 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall)
PAUSE >nul 2>&1
CD /D "%root%"
GOTO :EOF
+:64BIT
+ECHO.
+ECHO Your System Architecture is 64bit...
+GOTO end
+:32BIT
+ECHO.
+ECHO Your System Architecture is 32bit...
+timeout /t 5
+ECHO.
+ECHO Downloading libsodium.dll and opus.dll...
+SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\libsodium.dll"
+bitsadmin.exe /transfer "Downloading libsodium.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll "%FILENAME%"
+ECHO libsodium.dll downloaded.
+ECHO.
+timeout /t 5
+SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\opus.dll"
+bitsadmin.exe /transfer "Downloading opus.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll "%FILENAME%"
+ECHO opus.dll downloaded.
+GOTO end
:end
::Normal execution of end of script
TITLE Installation complete!
diff --git a/src/NadekoBot/Migrations/20170112185538_currency-modifications.cs b/src/NadekoBot/Migrations/20170112185538_currency-modifications.cs
index 3f2f8c22..e29e5c8c 100644
--- a/src/NadekoBot/Migrations/20170112185538_currency-modifications.cs
+++ b/src/NadekoBot/Migrations/20170112185538_currency-modifications.cs
@@ -30,7 +30,7 @@ namespace NadekoBot.Migrations
name: "Betroll91Multiplier",
table: "BotConfig",
nullable: false,
- defaultValue: 3f);
+ defaultValue: 4f);
migrationBuilder.AddColumn(
name: "CurrencyDropAmount",
diff --git a/src/NadekoBot/Migrations/20170122044958_waifus.Designer.cs b/src/NadekoBot/Migrations/20170122044958_waifus.Designer.cs
new file mode 100644
index 00000000..46eebfab
--- /dev/null
+++ b/src/NadekoBot/Migrations/20170122044958_waifus.Designer.cs
@@ -0,0 +1,1089 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using NadekoBot.Services.Database;
+using NadekoBot.Services.Database.Models;
+using NadekoBot.Modules.Music.Classes;
+
+namespace NadekoBot.Migrations
+{
+ [DbContext(typeof(NadekoContext))]
+ [Migration("20170122044958_waifus")]
+ partial class waifus
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+ modelBuilder
+ .HasAnnotation("ProductVersion", "1.1.0-rtm-22752");
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Action");
+
+ b.Property("GuildConfigId");
+
+ b.Property("Seconds");
+
+ b.Property("UserThreshold");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId")
+ .IsUnique();
+
+ b.ToTable("AntiRaidSetting");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AntiSpamSettingId");
+
+ b.Property("ChannelId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AntiSpamSettingId");
+
+ b.ToTable("AntiSpamIgnore");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Action");
+
+ b.Property("GuildConfigId");
+
+ b.Property("MessageThreshold");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId")
+ .IsUnique();
+
+ b.ToTable("AntiSpamSetting");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("ItemId");
+
+ b.Property("Type");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.ToTable("BlacklistItem");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BetflipMultiplier");
+
+ b.Property("Betroll100Multiplier");
+
+ b.Property("Betroll67Multiplier");
+
+ b.Property("Betroll91Multiplier");
+
+ b.Property("BufferSize");
+
+ b.Property("CurrencyDropAmount");
+
+ b.Property("CurrencyGenerationChance");
+
+ b.Property("CurrencyGenerationCooldown");
+
+ b.Property("CurrencyName");
+
+ b.Property("CurrencyPluralName");
+
+ b.Property("CurrencySign");
+
+ b.Property("DMHelpString");
+
+ b.Property("ErrorColor");
+
+ b.Property("ForwardMessages");
+
+ b.Property("ForwardToAllOwners");
+
+ b.Property("HelpString");
+
+ b.Property("MigrationVersion");
+
+ b.Property("MinimumBetAmount");
+
+ b.Property("OkColor");
+
+ b.Property("RemindMessageFormat");
+
+ b.Property("RotatingStatuses");
+
+ b.Property("TriviaCurrencyReward");
+
+ b.HasKey("Id");
+
+ b.ToTable("BotConfig");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BaseDestroyed");
+
+ b.Property("CallUser");
+
+ b.Property("ClashWarId");
+
+ b.Property("SequenceNumber");
+
+ b.Property("Stars");
+
+ b.Property("TimeAdded");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClashWarId");
+
+ b.ToTable("ClashCallers");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("EnemyClan");
+
+ b.Property("GuildId");
+
+ b.Property("Size");
+
+ b.Property("StartedAt");
+
+ b.Property("WarState");
+
+ b.HasKey("Id");
+
+ b.ToTable("ClashOfClans");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("CommandName");
+
+ b.Property("GuildConfigId");
+
+ b.Property("Seconds");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("CommandCooldown");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("CommandName");
+
+ b.Property("Price");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.HasIndex("Price")
+ .IsUnique();
+
+ b.ToTable("CommandPrice");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("InternalTrigger");
+
+ b.Property("Modifier");
+
+ b.Property("UnitType");
+
+ b.HasKey("Id");
+
+ b.ToTable("ConversionUnits");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Amount");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("Currency");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Amount");
+
+ b.Property("Reason");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.ToTable("CurrencyTransactions");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("GuildId");
+
+ b.Property("IsRegex");
+
+ b.Property("OwnerOnly");
+
+ b.Property("Response");
+
+ b.Property("Trigger");
+
+ b.HasKey("Id");
+
+ b.ToTable("CustomReactions");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordUser", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AvatarId");
+
+ b.Property("Discriminator");
+
+ b.Property("UserId");
+
+ b.Property("Username");
+
+ b.HasKey("Id");
+
+ b.HasAlternateKey("UserId");
+
+ b.ToTable("DiscordUser");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Amount");
+
+ b.Property("Name");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("Donators");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("Text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.ToTable("EightBallResponses");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("GuildConfigId");
+
+ b.Property("GuildConfigId1");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.HasIndex("GuildConfigId1");
+
+ b.ToTable("FilterChannelId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("GuildConfigId");
+
+ b.Property("Word");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("FilteredWord");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("GuildConfigId");
+
+ b.Property("GuildId");
+
+ b.Property("Type");
+
+ b.Property("Username");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("FollowedStream");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("GuildConfigId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("GCChannelId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AutoAssignRoleId");
+
+ b.Property("AutoDeleteByeMessages");
+
+ b.Property("AutoDeleteByeMessagesTimer");
+
+ b.Property("AutoDeleteGreetMessages");
+
+ b.Property("AutoDeleteGreetMessagesTimer");
+
+ b.Property("AutoDeleteSelfAssignedRoleMessages");
+
+ b.Property("ByeMessageChannelId");
+
+ b.Property("ChannelByeMessageText");
+
+ b.Property("ChannelGreetMessageText");
+
+ b.Property("CleverbotEnabled");
+
+ b.Property("DefaultMusicVolume");
+
+ b.Property("DeleteMessageOnCommand");
+
+ b.Property("DmGreetMessageText");
+
+ b.Property("ExclusiveSelfAssignedRoles");
+
+ b.Property("FilterInvites");
+
+ b.Property("FilterWords");
+
+ b.Property("GreetMessageChannelId");
+
+ b.Property("GuildId");
+
+ b.Property("LogSettingId");
+
+ b.Property("MuteRoleName");
+
+ b.Property("PermissionRole");
+
+ b.Property("RootPermissionId");
+
+ b.Property("SendChannelByeMessage");
+
+ b.Property("SendChannelGreetMessage");
+
+ b.Property("SendDmGreetMessage");
+
+ b.Property("VerbosePermissions");
+
+ b.Property("VoicePlusTextEnabled");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildId")
+ .IsUnique();
+
+ b.HasIndex("LogSettingId");
+
+ b.HasIndex("RootPermissionId");
+
+ b.ToTable("GuildConfigs");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("GuildConfigId");
+
+ b.Property("GuildId");
+
+ b.Property("Interval");
+
+ b.Property("Message");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("GuildRepeater");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("LogSettingId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("LogSettingId");
+
+ b.ToTable("IgnoredLogChannels");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("LogSettingId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("LogSettingId");
+
+ b.ToTable("IgnoredVoicePresenceCHannels");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelCreated");
+
+ b.Property("ChannelCreatedId");
+
+ b.Property("ChannelDestroyed");
+
+ b.Property("ChannelDestroyedId");
+
+ b.Property("ChannelId");
+
+ b.Property("ChannelUpdated");
+
+ b.Property("ChannelUpdatedId");
+
+ b.Property("IsLogging");
+
+ b.Property("LogOtherId");
+
+ b.Property("LogUserPresence");
+
+ b.Property("LogUserPresenceId");
+
+ b.Property("LogVoicePresence");
+
+ b.Property("LogVoicePresenceId");
+
+ b.Property("LogVoicePresenceTTSId");
+
+ b.Property("MessageDeleted");
+
+ b.Property("MessageDeletedId");
+
+ b.Property("MessageUpdated");
+
+ b.Property("MessageUpdatedId");
+
+ b.Property("UserBanned");
+
+ b.Property("UserBannedId");
+
+ b.Property("UserJoined");
+
+ b.Property("UserJoinedId");
+
+ b.Property("UserLeft");
+
+ b.Property("UserLeftId");
+
+ b.Property("UserMutedId");
+
+ b.Property("UserPresenceChannelId");
+
+ b.Property("UserUnbanned");
+
+ b.Property("UserUnbannedId");
+
+ b.Property("UserUpdated");
+
+ b.Property("UserUpdatedId");
+
+ b.Property("VoicePresenceChannelId");
+
+ b.HasKey("Id");
+
+ b.ToTable("LogSettings");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("ModuleName");
+
+ b.Property("Prefix");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.ToTable("ModulePrefixes");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Author");
+
+ b.Property("AuthorId");
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.ToTable("MusicPlaylists");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("GuildConfigId");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildConfigId");
+
+ b.ToTable("MutedUserId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("NextId");
+
+ b.Property("PrimaryTarget");
+
+ b.Property("PrimaryTargetId");
+
+ b.Property("SecondaryTarget");
+
+ b.Property("SecondaryTargetName");
+
+ b.Property("State");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NextId")
+ .IsUnique();
+
+ b.ToTable("Permission");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("Status");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.ToTable("PlayingStatus");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("MusicPlaylistId");
+
+ b.Property("Provider");
+
+ b.Property("ProviderType");
+
+ b.Property("Query");
+
+ b.Property("Title");
+
+ b.Property("Uri");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MusicPlaylistId");
+
+ b.ToTable("PlaylistSong");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AuthorId");
+
+ b.Property("AuthorName")
+ .IsRequired();
+
+ b.Property("GuildId");
+
+ b.Property("Keyword")
+ .IsRequired();
+
+ b.Property("Text")
+ .IsRequired();
+
+ b.HasKey("Id");
+
+ b.ToTable("Quotes");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("BotConfigId");
+
+ b.Property("Icon");
+
+ b.Property("Name");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BotConfigId");
+
+ b.ToTable("RaceAnimals");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("ChannelId");
+
+ b.Property("IsPrivate");
+
+ b.Property("Message");
+
+ b.Property("ServerId");
+
+ b.Property("UserId");
+
+ b.Property("When");
+
+ b.HasKey("Id");
+
+ b.ToTable("Reminders");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("GuildId");
+
+ b.Property("RoleId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("GuildId", "RoleId")
+ .IsUnique();
+
+ b.ToTable("SelfAssignableRoles");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("UserId");
+
+ b.Property("type");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("PokeGame");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("AffinityId");
+
+ b.Property("ClaimerId");
+
+ b.Property("Price");
+
+ b.Property("WaifuId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AffinityId");
+
+ b.HasIndex("ClaimerId");
+
+ b.HasIndex("WaifuId")
+ .IsUnique();
+
+ b.ToTable("WaifuInfo");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("NewId");
+
+ b.Property("OldId");
+
+ b.Property("UpdateType");
+
+ b.Property("UserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NewId");
+
+ b.HasIndex("OldId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("WaifuUpdates");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig")
+ .WithOne("AntiRaidSetting")
+ .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting")
+ .WithMany("IgnoredChannels")
+ .HasForeignKey("AntiSpamSettingId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig")
+ .WithOne("AntiSpamSetting")
+ .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ 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.CommandCooldown", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("CommandCooldowns")
+ .HasForeignKey("GuildConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
+ .WithMany("CommandPrices")
+ .HasForeignKey("BotConfigId");
+ });
+
+ 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.FilterChannelId", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("FilterInvitesChannelIds")
+ .HasForeignKey("GuildConfigId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("FilterWordsChannelIds")
+ .HasForeignKey("GuildConfigId1");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("FilteredWords")
+ .HasForeignKey("GuildConfigId");
+ });
+
+ 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.GCChannelId", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("GenerateCurrencyChannelIds")
+ .HasForeignKey("GuildConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
+ .WithMany()
+ .HasForeignKey("LogSettingId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission")
+ .WithMany()
+ .HasForeignKey("RootPermissionId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildRepeater", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("GuildRepeaters")
+ .HasForeignKey("GuildConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
+ .WithMany("IgnoredChannels")
+ .HasForeignKey("LogSettingId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting")
+ .WithMany("IgnoredVoicePresenceChannelIds")
+ .HasForeignKey("LogSettingId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
+ .WithMany("ModulePrefixes")
+ .HasForeignKey("BotConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
+ .WithMany("MutedUsers")
+ .HasForeignKey("GuildConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next")
+ .WithOne("Previous")
+ .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId");
+ });
+
+ 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.PlaylistSong", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist")
+ .WithMany("Songs")
+ .HasForeignKey("MusicPlaylistId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
+ .WithMany("RaceAnimals")
+ .HasForeignKey("BotConfigId");
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity")
+ .WithMany()
+ .HasForeignKey("AffinityId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer")
+ .WithMany()
+ .HasForeignKey("ClaimerId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu")
+ .WithOne()
+ .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+
+ modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b =>
+ {
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New")
+ .WithMany()
+ .HasForeignKey("NewId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old")
+ .WithMany()
+ .HasForeignKey("OldId");
+
+ b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User")
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade);
+ });
+ }
+ }
+}
diff --git a/src/NadekoBot/Migrations/20170122044958_waifus.cs b/src/NadekoBot/Migrations/20170122044958_waifus.cs
new file mode 100644
index 00000000..4396ae77
--- /dev/null
+++ b/src/NadekoBot/Migrations/20170122044958_waifus.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace NadekoBot.Migrations
+{
+ public partial class waifus : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "DiscordUser",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ AvatarId = table.Column(nullable: true),
+ Discriminator = table.Column(nullable: true),
+ UserId = table.Column(nullable: false),
+ Username = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_DiscordUser", x => x.Id);
+ table.UniqueConstraint("AK_DiscordUser_UserId", x => x.UserId);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WaifuInfo",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ AffinityId = table.Column(nullable: true),
+ ClaimerId = table.Column(nullable: true),
+ Price = table.Column(nullable: false),
+ WaifuId = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WaifuInfo", x => x.Id);
+ table.ForeignKey(
+ name: "FK_WaifuInfo_DiscordUser_AffinityId",
+ column: x => x.AffinityId,
+ principalTable: "DiscordUser",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_WaifuInfo_DiscordUser_ClaimerId",
+ column: x => x.ClaimerId,
+ principalTable: "DiscordUser",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ table.ForeignKey(
+ name: "FK_WaifuInfo_DiscordUser_WaifuId",
+ column: x => x.WaifuId,
+ principalTable: "DiscordUser",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WaifuUpdates",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
+ NewId = table.Column(nullable: true),
+ OldId = table.Column(nullable: true),
+ UpdateType = table.Column