diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c93621b4..5d58e4a19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. ## Unreleased -## Changes - ### Added - Added `.deleteemptyservers` command - Added `.curtr ` which lets you see full information about one of your own transactions with the specified id @@ -18,16 +16,7 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. - waifu.decay.minPrice - Unclaimed waifus with price lower than the one specified here will not be affected by the decay - Added `currency.transactionsLifetime` to `data/gambling.yml` Any transaction older than the number of days specified will be automatically deleted - Added `.stock` command to check stock prices and charts - -### Fixed -- Fixed an extra whitespace in usage part of command help if the command has no arguments -- Possible small fix for `.prune` ratelimiting -- `.gvc` should now properly trigger when a user is already in a gvc and changes his activity -- `.gvc` should now properly detect multiple activities -- Fixed reference to non-existent command in bot.yml -- Comment indentation in .yml files should now make more sense -- Fixed `.warn` punishments not being applied properly when using weighted warnings -- Fixed embed color when disabling `.antialt` +- Re-added `.qap / .queueautoplay` ### Changed - CustomReactions module (and customreactions db table) has been renamed to Expressions. @@ -41,6 +30,9 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. - Currency output format improvement (will use guild locale now for some commands) - `.crypto` will now also show CoinMarketCap rank - Waifus can now be claimed for much higher prices (int -> long) +- Several strings and commands related to music have been changed + - Changed `.ms / .movesong` to `.tm / .trackmove` but kept old aliases + - Changed ~~song~~ -> `track` throughout music module strings - Improved .curtrs (It will now have a lot more useful data in the database, show Tx ids, and be partially localized) - [dev] Reason renamed to Note - [dev] Added Type, Extra, OtherId fields to the database @@ -50,20 +42,30 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. - [dev] Permissionv2 db table renamed to Permissions - [dev] Moved FilterWordsChannelId to a separate table +### Fixed +- Fixed an extra whitespace in usage part of command help if the command has no arguments +- Possible small fix for `.prune` ratelimiting +- `.gvc` should now properly trigger when a user is already in a gvc and changes his activity +- `.gvc` should now properly detect multiple activities +- Fixed reference to non-existent command in bot.yml +- Comment indentation in .yml files should now make more sense +- Fixed `.warn` punishments not being applied properly when using weighted warnings +- Fixed embed color when disabling `.antialt` + ### Removed - Removed `.bce` - use `.config` or `.config bot` specifically for bot config - Removed obsolete placeholders: %users% %servers% %userfull% %username% %userdiscrim% %useravatar% %id% %uid% %chname% %cid% %sid% %members% %server_time% %shardid% %time% %mention% - Removed some obsolete commands and strings - Removed code which migrated 2.x to v3 credentials, settings, etc... -## [3.0.13] - 14.04.2021 +## [3.0.13] - 14.01.2022 ### Fixed - Fixed `.greetdm` causing ratelimits during raids - Fixed `.gelbooru` -## [3.0.12] - 06.01.2021 +## [3.0.12] - 06.01.2022 ### Fixed - `.smch` Fixed diff --git a/src/NadekoBot/Db/Models/MusicSettings.cs b/src/NadekoBot/Db/Models/MusicSettings.cs index 61ee02e2d..f43a4aceb 100644 --- a/src/NadekoBot/Db/Models/MusicSettings.cs +++ b/src/NadekoBot/Db/Models/MusicSettings.cs @@ -38,6 +38,11 @@ public class MusicPlayerSettings /// Selected quality preset for the music player /// public QualityPreset QualityPreset { get; set; } + + /// + /// Whether the bot will automatically queue related songs + /// + public bool AutoPlay { get; set; } } public enum QualityPreset diff --git a/src/NadekoBot/Migrations/20220213123633_music-autoplay.Designer.cs b/src/NadekoBot/Migrations/20220213123633_music-autoplay.Designer.cs new file mode 100644 index 000000000..1ad299faf --- /dev/null +++ b/src/NadekoBot/Migrations/20220213123633_music-autoplay.Designer.cs @@ -0,0 +1,2760 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NadekoBot.Services.Database; + +#nullable disable + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20220213123633_music-autoplay")] + partial class musicautoplay + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.2"); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubApplicants", b => + { + b.Property("ClubId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubApplicants"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubBans", b => + { + b.Property("ClubId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ClubId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ClubBans"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Discrim") + .HasColumnType("INTEGER"); + + b.Property("ImageUrl") + .HasColumnType("TEXT"); + + b.Property("MinimumLevelReq") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("TEXT"); + + b.Property("OwnerId") + .HasColumnType("INTEGER"); + + b.Property("Xp") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasAlternateKey("Name", "Discrim"); + + b.HasIndex("OwnerId") + .IsUnique(); + + b.ToTable("Clubs"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AvatarId") + .HasColumnType("TEXT"); + + b.Property("ClubId") + .HasColumnType("INTEGER"); + + b.Property("CurrencyAmount") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Discriminator") + .HasColumnType("TEXT"); + + b.Property("IsClubAdmin") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(false); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("datetime('now')"); + + b.Property("LastXpGain") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("datetime('now', '-1 years')"); + + b.Property("NotifyOnLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0); + + b.Property("TotalXp") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.HasIndex("ClubId"); + + b.HasIndex("CurrencyAmount"); + + b.HasIndex("TotalXp"); + + b.HasIndex("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiAltSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Action") + .HasColumnType("INTEGER"); + + b.Property("ActionDurationMinutes") + .HasColumnType("INTEGER"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("MinAge") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiAltSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Action") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("PunishDuration") + .HasColumnType("INTEGER"); + + b.Property("Seconds") + .HasColumnType("INTEGER"); + + b.Property("UserThreshold") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AntiSpamSettingId") + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Action") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("MessageThreshold") + .HasColumnType("INTEGER"); + + b.Property("MuteTime") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoCommand", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("ChannelName") + .HasColumnType("TEXT"); + + b.Property("CommandText") + .HasColumnType("TEXT"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("GuildName") + .HasColumnType("TEXT"); + + b.Property("Interval") + .HasColumnType("INTEGER"); + + b.Property("VoiceChannelId") + .HasColumnType("INTEGER"); + + b.Property("VoiceChannelName") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("AutoCommands"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AutoDelete") + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.HasIndex("GuildId"); + + b.ToTable("AutoTranslateChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Source") + .HasColumnType("TEXT"); + + b.Property("Target") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasAlternateKey("ChannelId", "UserId"); + + b.ToTable("AutoTranslateUsers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BanTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Text") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("BanTemplates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Blacklist"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Mapping") + .HasColumnType("TEXT"); + + b.Property("Trigger") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandAlias"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CommandName") + .HasColumnType("TEXT"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Seconds") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Amount") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Extra") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Note") + .HasColumnType("TEXT"); + + b.Property("OtherId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValueSql("NULL"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.DelMsgOnCmdChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("DelMsgOnCmdChannel"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordPermOverride", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Command") + .HasColumnType("TEXT"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Perm") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "Command") + .IsUnique(); + + b.ToTable("DiscordPermOverrides"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("ItemId") + .HasColumnType("INTEGER"); + + b.Property("ItemType") + .HasColumnType("INTEGER"); + + b.Property("XpSettingsId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("ExcludedItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FeedSub", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Url") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasAlternateKey("GuildConfigId", "Url"); + + b.ToTable("FeedSub"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Word") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterLinksChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterLinksChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterWordsChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterWordsChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GroupName", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId", "Number") + .IsUnique(); + + b.ToTable("GroupName"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AutoAssignRoleIds") + .HasColumnType("TEXT"); + + b.Property("AutoDeleteByeMessagesTimer") + .HasColumnType("INTEGER"); + + b.Property("AutoDeleteGreetMessagesTimer") + .HasColumnType("INTEGER"); + + b.Property("AutoDeleteSelfAssignedRoleMessages") + .HasColumnType("INTEGER"); + + b.Property("BoostMessage") + .HasColumnType("TEXT"); + + b.Property("BoostMessageChannelId") + .HasColumnType("INTEGER"); + + b.Property("BoostMessageDeleteAfter") + .HasColumnType("INTEGER"); + + b.Property("ByeMessageChannelId") + .HasColumnType("INTEGER"); + + b.Property("ChannelByeMessageText") + .HasColumnType("TEXT"); + + b.Property("ChannelGreetMessageText") + .HasColumnType("TEXT"); + + b.Property("CleverbotEnabled") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("DeleteMessageOnCommand") + .HasColumnType("INTEGER"); + + b.Property("DmGreetMessageText") + .HasColumnType("TEXT"); + + b.Property("ExclusiveSelfAssignedRoles") + .HasColumnType("INTEGER"); + + b.Property("FilterInvites") + .HasColumnType("INTEGER"); + + b.Property("FilterLinks") + .HasColumnType("INTEGER"); + + b.Property("FilterWords") + .HasColumnType("INTEGER"); + + b.Property("GameVoiceChannel") + .HasColumnType("INTEGER"); + + b.Property("GreetMessageChannelId") + .HasColumnType("INTEGER"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Locale") + .HasColumnType("TEXT"); + + b.Property("MuteRoleName") + .HasColumnType("TEXT"); + + b.Property("NotifyStreamOffline") + .HasColumnType("INTEGER"); + + b.Property("PermissionRole") + .HasColumnType("TEXT"); + + b.Property("Prefix") + .HasColumnType("TEXT"); + + b.Property("SendBoostMessage") + .HasColumnType("INTEGER"); + + b.Property("SendChannelByeMessage") + .HasColumnType("INTEGER"); + + b.Property("SendChannelGreetMessage") + .HasColumnType("INTEGER"); + + b.Property("SendDmGreetMessage") + .HasColumnType("INTEGER"); + + b.Property("TimeZoneId") + .HasColumnType("TEXT"); + + b.Property("VerboseErrors") + .HasColumnType("INTEGER"); + + b.Property("VerbosePermissions") + .HasColumnType("INTEGER"); + + b.Property("WarnExpireAction") + .HasColumnType("INTEGER"); + + b.Property("WarnExpireHours") + .HasColumnType("INTEGER"); + + b.Property("WarningsInitialized") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("WarnExpireHours"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("ItemType") + .HasColumnType("INTEGER"); + + b.Property("LogItemId") + .HasColumnType("INTEGER"); + + b.Property("LogSettingId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId", "LogItemId", "ItemType") + .IsUnique(); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("LogSettingId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredVoicePresenceCHannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ImageOnlyChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.ToTable("ImageOnlyChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelCreatedId") + .HasColumnType("INTEGER"); + + b.Property("ChannelDestroyedId") + .HasColumnType("INTEGER"); + + b.Property("ChannelUpdatedId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("LogOtherId") + .HasColumnType("INTEGER"); + + b.Property("LogUserPresenceId") + .HasColumnType("INTEGER"); + + b.Property("LogVoicePresenceId") + .HasColumnType("INTEGER"); + + b.Property("LogVoicePresenceTTSId") + .HasColumnType("INTEGER"); + + b.Property("MessageDeletedId") + .HasColumnType("INTEGER"); + + b.Property("MessageUpdatedId") + .HasColumnType("INTEGER"); + + b.Property("UserBannedId") + .HasColumnType("INTEGER"); + + b.Property("UserJoinedId") + .HasColumnType("INTEGER"); + + b.Property("UserLeftId") + .HasColumnType("INTEGER"); + + b.Property("UserMutedId") + .HasColumnType("INTEGER"); + + b.Property("UserUnbannedId") + .HasColumnType("INTEGER"); + + b.Property("UserUpdatedId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlayerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AutoDisconnect") + .HasColumnType("INTEGER"); + + b.Property("AutoPlay") + .HasColumnType("INTEGER"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("MusicChannelId") + .HasColumnType("INTEGER"); + + b.Property("PlayerRepeat") + .HasColumnType("INTEGER"); + + b.Property("QualityPreset") + .HasColumnType("INTEGER"); + + b.Property("Volume") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(100); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("MusicPlayerSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Author") + .HasColumnType("TEXT"); + + b.Property("AuthorId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.NadekoExpression", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AllowTarget") + .HasColumnType("INTEGER"); + + b.Property("AutoDeleteTrigger") + .HasColumnType("INTEGER"); + + b.Property("ContainsAnywhere") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("DmResponse") + .HasColumnType("INTEGER"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Reactions") + .HasColumnType("TEXT"); + + b.Property("Response") + .HasColumnType("TEXT"); + + b.Property("Trigger") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Expressions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.NsfwBlacklistedTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Tag") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("NsfwBlacklistedTags"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("IsCustomCommand") + .HasColumnType("INTEGER"); + + b.Property("PrimaryTarget") + .HasColumnType("INTEGER"); + + b.Property("PrimaryTargetId") + .HasColumnType("INTEGER"); + + b.Property("SecondaryTarget") + .HasColumnType("INTEGER"); + + b.Property("SecondaryTargetName") + .HasColumnType("TEXT"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlantedCurrency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Amount") + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("MessageId") + .HasColumnType("INTEGER"); + + b.Property("Password") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("MessageId") + .IsUnique(); + + b.ToTable("PlantedCurrency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("MusicPlaylistId") + .HasColumnType("INTEGER"); + + b.Property("Provider") + .HasColumnType("TEXT"); + + b.Property("ProviderType") + .HasColumnType("INTEGER"); + + b.Property("Query") + .HasColumnType("TEXT"); + + b.Property("Title") + .HasColumnType("TEXT"); + + b.Property("Uri") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Poll", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Question") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("Poll"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PollAnswer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("PollId") + .HasColumnType("INTEGER"); + + b.Property("Text") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("PollId"); + + b.ToTable("PollAnswer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PollVote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("PollId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("VoteIndex") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("PollId"); + + b.ToTable("PollVote"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AuthorId") + .HasColumnType("INTEGER"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Keyword") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Text") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.HasIndex("Keyword"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("EmoteName") + .HasColumnType("TEXT"); + + b.Property("ReactionRoleMessageId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ReactionRoleMessageId"); + + b.ToTable("ReactionRole"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRoleMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Exclusive") + .HasColumnType("INTEGER"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("MessageId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("ReactionRoleMessage"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("IsPrivate") + .HasColumnType("INTEGER"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("ServerId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("When") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("When"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChannelId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Interval") + .HasColumnType("TEXT"); + + b.Property("LastMessageId") + .HasColumnType("INTEGER"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("NoRedundant") + .HasColumnType("INTEGER"); + + b.Property("StartTimeOfDay") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Repeaters"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RewardedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AmountRewardedThisMonth") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("LastReward") + .HasColumnType("TEXT"); + + b.Property("PatreonUserId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("PatreonUserId") + .IsUnique(); + + b.ToTable("RewardedUsers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RotatingPlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Status") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("RotatingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Group") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("LevelRequirement") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AuthorId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Price") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.Property("RoleName") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("ShopEntry"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("ShopEntryId") + .HasColumnType("INTEGER"); + + b.Property("Text") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ShopEntryId"); + + b.ToTable("ShopEntryItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("SlowmodeIgnoredRole"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("SlowmodeIgnoredUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleBlacklistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleBlacklistedUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AddRoleId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Enabled") + .HasColumnType("INTEGER"); + + b.Property("FromRoleId") + .HasColumnType("INTEGER"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Keyword") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("StreamRoleSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleWhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Username") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleWhitelistedUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnbanTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("UnbanAt") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnbanTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("UnmuteAt") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnroleTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.Property("UnbanAt") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnroleTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserXpStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AwardedXp") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 307, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Xp") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AwardedXp"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.HasIndex("Xp"); + + b.HasIndex("UserId", "GuildId") + .IsUnique(); + + b.ToTable("UserXpStats"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.Property("VoiceChannelId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AffinityId") + .HasColumnType("INTEGER"); + + b.Property("ClaimerId") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Price") + .HasColumnType("INTEGER"); + + b.Property("WaifuId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("Price"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("ItemEmoji") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("WaifuInfoId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("WaifuInfoId"); + + b.ToTable("WaifuItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("NewId") + .HasColumnType("INTEGER"); + + b.Property("OldId") + .HasColumnType("INTEGER"); + + b.Property("UpdateType") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Warning", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Forgiven") + .HasColumnType("INTEGER"); + + b.Property("ForgivenBy") + .HasColumnType("TEXT"); + + b.Property("GuildId") + .HasColumnType("INTEGER"); + + b.Property("Moderator") + .HasColumnType("TEXT"); + + b.Property("Reason") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Weight") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(1L); + + b.HasKey("Id"); + + b.HasIndex("DateAdded"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("Warnings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Count") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("Punishment") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.Property("Time") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpCurrencyReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Amount") + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Level") + .HasColumnType("INTEGER"); + + b.Property("XpSettingsId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("XpCurrencyReward"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("Level") + .HasColumnType("INTEGER"); + + b.Property("Remove") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.Property("XpSettingsId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId", "Level") + .IsUnique(); + + b.ToTable("XpRoleReward"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateAdded") + .HasColumnType("TEXT"); + + b.Property("GuildConfigId") + .HasColumnType("INTEGER"); + + b.Property("ServerExcluded") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("XpSettings"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubApplicants", b => + { + b.HasOne("NadekoBot.Db.Models.ClubInfo", "Club") + .WithMany("Applicants") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Club"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubBans", b => + { + b.HasOne("NadekoBot.Db.Models.ClubInfo", "Club") + .WithMany("Bans") + .HasForeignKey("ClubId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Club"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubInfo", b => + { + b.HasOne("NadekoBot.Db.Models.DiscordUser", "Owner") + .WithOne() + .HasForeignKey("NadekoBot.Db.Models.ClubInfo", "OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.DiscordUser", b => + { + b.HasOne("NadekoBot.Db.Models.ClubInfo", "Club") + .WithMany("Users") + .HasForeignKey("ClubId"); + + b.Navigation("Club"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiAltSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithOne("AntiAltSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiAltSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + 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) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting", null) + .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) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AutoTranslateChannel", "Channel") + .WithMany("Users") + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.DelMsgOnCmdChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("DelMsgOnCmdChannels") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings", null) + .WithMany("ExclusionList") + .HasForeignKey("XpSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FeedSub", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithMany("FeedSubs") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterLinksChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("FilterLinksChannelIds") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterWordsChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .HasForeignKey("GuildConfigId"); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GroupName", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithMany("SelfAssignableRoleGroupNames") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("LogIgnores") + .HasForeignKey("LogSettingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("LogSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.Navigation("LogSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist", null) + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PollAnswer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Poll", null) + .WithMany("Answers") + .HasForeignKey("PollId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PollVote", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Poll", null) + .WithMany("Votes") + .HasForeignKey("PollId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRole", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ReactionRoleMessage", null) + .WithMany("ReactionRoles") + .HasForeignKey("ReactionRoleMessageId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRoleMessage", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithMany("ReactionRoleMessages") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("ShopEntries") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ShopEntry", null) + .WithMany("Items") + .HasForeignKey("ShopEntryId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("SlowmodeIgnoredRoles") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("SlowmodeIgnoredUsers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleBlacklistedUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.StreamRoleSettings", null) + .WithMany("Blacklist") + .HasForeignKey("StreamRoleSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("StreamRole") + .HasForeignKey("NadekoBot.Services.Database.Models.StreamRoleSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleWhitelistedUser", b => + { + b.HasOne("NadekoBot.Services.Database.Models.StreamRoleSettings", null) + .WithMany("Whitelist") + .HasForeignKey("StreamRoleSettingsId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnbanTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("UnbanTimer") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnroleTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("UnroleTimer") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Db.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Affinity"); + + b.Navigation("Claimer"); + + b.Navigation("Waifu"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.WaifuInfo", null) + .WithMany("Items") + .HasForeignKey("WaifuInfoId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Db.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Db.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("New"); + + b.Navigation("Old"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", null) + .WithMany("WarnPunishments") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpCurrencyReward", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings", "XpSettings") + .WithMany("CurrencyRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => + { + b.HasOne("NadekoBot.Services.Database.Models.XpSettings", "XpSettings") + .WithMany("RoleRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("XpSettings") + .HasForeignKey("NadekoBot.Services.Database.Models.XpSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GuildConfig"); + }); + + modelBuilder.Entity("NadekoBot.Db.Models.ClubInfo", b => + { + b.Navigation("Applicants"); + + b.Navigation("Bans"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateChannel", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Navigation("AntiAltSetting"); + + b.Navigation("AntiRaidSetting"); + + b.Navigation("AntiSpamSetting"); + + b.Navigation("CommandAliases"); + + b.Navigation("CommandCooldowns"); + + b.Navigation("DelMsgOnCmdChannels"); + + b.Navigation("FeedSubs"); + + b.Navigation("FilterInvitesChannelIds"); + + b.Navigation("FilterLinksChannelIds"); + + b.Navigation("FilterWordsChannelIds"); + + b.Navigation("FilteredWords"); + + b.Navigation("FollowedStreams"); + + b.Navigation("GenerateCurrencyChannelIds"); + + b.Navigation("MutedUsers"); + + b.Navigation("Permissions"); + + b.Navigation("ReactionRoleMessages"); + + b.Navigation("SelfAssignableRoleGroupNames"); + + b.Navigation("ShopEntries"); + + b.Navigation("SlowmodeIgnoredRoles"); + + b.Navigation("SlowmodeIgnoredUsers"); + + b.Navigation("StreamRole"); + + b.Navigation("UnbanTimer"); + + b.Navigation("UnmuteTimers"); + + b.Navigation("UnroleTimer"); + + b.Navigation("VcRoleInfos"); + + b.Navigation("WarnPunishments"); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Navigation("LogIgnores"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Poll", b => + { + b.Navigation("Answers"); + + b.Navigation("Votes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRoleMessage", b => + { + b.Navigation("ReactionRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => + { + b.Navigation("Items"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => + { + b.Navigation("Blacklist"); + + b.Navigation("Whitelist"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Navigation("Items"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => + { + b.Navigation("CurrencyRewards"); + + b.Navigation("ExclusionList"); + + b.Navigation("RoleRewards"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/NadekoBot/Migrations/20220213123633_music-autoplay.cs b/src/NadekoBot/Migrations/20220213123633_music-autoplay.cs new file mode 100644 index 000000000..4a9c9fe73 --- /dev/null +++ b/src/NadekoBot/Migrations/20220213123633_music-autoplay.cs @@ -0,0 +1,69 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace NadekoBot.Migrations +{ + public partial class musicautoplay : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + // these 2 settings weren't being used for a long time + migrationBuilder.DropColumn( + name: "AutoDeleteByeMessages", + table: "GuildConfigs"); + + migrationBuilder.DropColumn( + name: "AutoDeleteGreetMessages", + table: "GuildConfigs"); + + migrationBuilder.AlterColumn( + name: "Weight", + table: "Warnings", + type: "INTEGER", + nullable: false, + defaultValue: 1L, + oldClrType: typeof(int), + oldType: "INTEGER", + oldDefaultValue: 1); + + migrationBuilder.AddColumn( + name: "AutoPlay", + table: "MusicPlayerSettings", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AutoPlay", + table: "MusicPlayerSettings"); + + migrationBuilder.AlterColumn( + name: "Weight", + table: "Warnings", + type: "INTEGER", + nullable: false, + defaultValue: 1, + oldClrType: typeof(long), + oldType: "INTEGER", + oldDefaultValue: 1L); + + migrationBuilder.AddColumn( + name: "AutoDeleteByeMessages", + table: "GuildConfigs", + type: "INTEGER", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "AutoDeleteGreetMessages", + table: "GuildConfigs", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + } +} diff --git a/src/NadekoBot/Migrations/NadekoContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoContextModelSnapshot.cs index 9f79efcfd..998dc257e 100644 --- a/src/NadekoBot/Migrations/NadekoContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace NadekoBot.Migrations protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.1"); + modelBuilder.HasAnnotation("ProductVersion", "6.0.2"); modelBuilder.Entity("NadekoBot.Db.Models.ClubApplicants", b => { @@ -29,7 +29,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("ClubApplicants", (string)null); + b.ToTable("ClubApplicants"); }); modelBuilder.Entity("NadekoBot.Db.Models.ClubBans", b => @@ -44,7 +44,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("ClubBans", (string)null); + b.ToTable("ClubBans"); }); modelBuilder.Entity("NadekoBot.Db.Models.ClubInfo", b => @@ -86,7 +86,7 @@ namespace NadekoBot.Migrations b.HasIndex("OwnerId") .IsUnique(); - b.ToTable("Clubs", (string)null); + b.ToTable("Clubs"); }); modelBuilder.Entity("NadekoBot.Db.Models.DiscordUser", b => @@ -155,7 +155,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("DiscordUser", (string)null); + b.ToTable("DiscordUser"); }); modelBuilder.Entity("NadekoBot.Db.Models.FollowedStream", b => @@ -189,7 +189,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("FollowedStream", (string)null); + b.ToTable("FollowedStream"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiAltSetting", b => @@ -218,7 +218,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId") .IsUnique(); - b.ToTable("AntiAltSetting", (string)null); + b.ToTable("AntiAltSetting"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => @@ -250,7 +250,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId") .IsUnique(); - b.ToTable("AntiRaidSetting", (string)null); + b.ToTable("AntiRaidSetting"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => @@ -272,7 +272,7 @@ namespace NadekoBot.Migrations b.HasIndex("AntiSpamSettingId"); - b.ToTable("AntiSpamIgnore", (string)null); + b.ToTable("AntiSpamIgnore"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => @@ -304,7 +304,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId") .IsUnique(); - b.ToTable("AntiSpamSetting", (string)null); + b.ToTable("AntiSpamSetting"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoCommand", b => @@ -342,7 +342,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("AutoCommands", (string)null); + b.ToTable("AutoCommands"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateChannel", b => @@ -370,7 +370,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId"); - b.ToTable("AutoTranslateChannels", (string)null); + b.ToTable("AutoTranslateChannels"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.AutoTranslateUser", b => @@ -398,7 +398,7 @@ namespace NadekoBot.Migrations b.HasAlternateKey("ChannelId", "UserId"); - b.ToTable("AutoTranslateUsers", (string)null); + b.ToTable("AutoTranslateUsers"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.BanTemplate", b => @@ -421,7 +421,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId") .IsUnique(); - b.ToTable("BanTemplates", (string)null); + b.ToTable("BanTemplates"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistEntry", b => @@ -441,7 +441,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("Blacklist", (string)null); + b.ToTable("Blacklist"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => @@ -466,7 +466,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("CommandAlias", (string)null); + b.ToTable("CommandAlias"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => @@ -491,7 +491,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("CommandCooldown", (string)null); + b.ToTable("CommandCooldown"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => @@ -529,7 +529,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("CurrencyTransactions", (string)null); + b.ToTable("CurrencyTransactions"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.DelMsgOnCmdChannel", b => @@ -554,7 +554,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("DelMsgOnCmdChannel", (string)null); + b.ToTable("DelMsgOnCmdChannel"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.DiscordPermOverride", b => @@ -580,7 +580,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId", "Command") .IsUnique(); - b.ToTable("DiscordPermOverrides", (string)null); + b.ToTable("DiscordPermOverrides"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ExcludedItem", b => @@ -605,7 +605,7 @@ namespace NadekoBot.Migrations b.HasIndex("XpSettingsId"); - b.ToTable("ExcludedItem", (string)null); + b.ToTable("ExcludedItem"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.FeedSub", b => @@ -631,7 +631,7 @@ namespace NadekoBot.Migrations b.HasAlternateKey("GuildConfigId", "Url"); - b.ToTable("FeedSub", (string)null); + b.ToTable("FeedSub"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => @@ -653,7 +653,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("FilterChannelId", (string)null); + b.ToTable("FilterChannelId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => @@ -675,7 +675,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("FilteredWord", (string)null); + b.ToTable("FilteredWord"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterLinksChannelId", b => @@ -697,7 +697,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("FilterLinksChannelId", (string)null); + b.ToTable("FilterLinksChannelId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterWordsChannelId", b => @@ -719,7 +719,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("FilterWordsChannelId", (string)null); + b.ToTable("FilterWordsChannelId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => @@ -741,7 +741,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("GCChannelId", (string)null); + b.ToTable("GCChannelId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.GroupName", b => @@ -767,7 +767,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId", "Number") .IsUnique(); - b.ToTable("GroupName", (string)null); + b.ToTable("GroupName"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => @@ -779,15 +779,9 @@ namespace NadekoBot.Migrations b.Property("AutoAssignRoleIds") .HasColumnType("TEXT"); - b.Property("AutoDeleteByeMessages") - .HasColumnType("INTEGER"); - b.Property("AutoDeleteByeMessagesTimer") .HasColumnType("INTEGER"); - b.Property("AutoDeleteGreetMessages") - .HasColumnType("INTEGER"); - b.Property("AutoDeleteGreetMessagesTimer") .HasColumnType("INTEGER"); @@ -897,7 +891,7 @@ namespace NadekoBot.Migrations b.HasIndex("WarnExpireHours"); - b.ToTable("GuildConfigs", (string)null); + b.ToTable("GuildConfigs"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogItem", b => @@ -923,7 +917,7 @@ namespace NadekoBot.Migrations b.HasIndex("LogSettingId", "LogItemId", "ItemType") .IsUnique(); - b.ToTable("IgnoredLogChannels", (string)null); + b.ToTable("IgnoredLogChannels"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => @@ -945,7 +939,7 @@ namespace NadekoBot.Migrations b.HasIndex("LogSettingId"); - b.ToTable("IgnoredVoicePresenceCHannels", (string)null); + b.ToTable("IgnoredVoicePresenceCHannels"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ImageOnlyChannel", b => @@ -968,7 +962,7 @@ namespace NadekoBot.Migrations b.HasIndex("ChannelId") .IsUnique(); - b.ToTable("ImageOnlyChannels", (string)null); + b.ToTable("ImageOnlyChannels"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => @@ -1033,7 +1027,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId") .IsUnique(); - b.ToTable("LogSettings", (string)null); + b.ToTable("LogSettings"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlayerSettings", b => @@ -1045,6 +1039,9 @@ namespace NadekoBot.Migrations b.Property("AutoDisconnect") .HasColumnType("INTEGER"); + b.Property("AutoPlay") + .HasColumnType("INTEGER"); + b.Property("GuildId") .HasColumnType("INTEGER"); @@ -1067,7 +1064,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId") .IsUnique(); - b.ToTable("MusicPlayerSettings", (string)null); + b.ToTable("MusicPlayerSettings"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => @@ -1090,7 +1087,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("MusicPlaylists", (string)null); + b.ToTable("MusicPlaylists"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => @@ -1112,7 +1109,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("MutedUserId", (string)null); + b.ToTable("MutedUserId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.NadekoExpression", b => @@ -1150,7 +1147,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("Expressions", (string)null); + b.ToTable("Expressions"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.NsfwBlacklistedTag", b => @@ -1172,7 +1169,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId"); - b.ToTable("NsfwBlacklistedTags", (string)null); + b.ToTable("NsfwBlacklistedTags"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => @@ -1212,7 +1209,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("Permissions", (string)null); + b.ToTable("Permissions"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.PlantedCurrency", b => @@ -1249,7 +1246,7 @@ namespace NadekoBot.Migrations b.HasIndex("MessageId") .IsUnique(); - b.ToTable("PlantedCurrency", (string)null); + b.ToTable("PlantedCurrency"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => @@ -1283,7 +1280,7 @@ namespace NadekoBot.Migrations b.HasIndex("MusicPlaylistId"); - b.ToTable("PlaylistSong", (string)null); + b.ToTable("PlaylistSong"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Poll", b => @@ -1309,7 +1306,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId") .IsUnique(); - b.ToTable("Poll", (string)null); + b.ToTable("Poll"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.PollAnswer", b => @@ -1334,7 +1331,7 @@ namespace NadekoBot.Migrations b.HasIndex("PollId"); - b.ToTable("PollAnswer", (string)null); + b.ToTable("PollAnswer"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.PollVote", b => @@ -1359,7 +1356,7 @@ namespace NadekoBot.Migrations b.HasIndex("PollId"); - b.ToTable("PollVote", (string)null); + b.ToTable("PollVote"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => @@ -1395,7 +1392,7 @@ namespace NadekoBot.Migrations b.HasIndex("Keyword"); - b.ToTable("Quotes", (string)null); + b.ToTable("Quotes"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRole", b => @@ -1420,7 +1417,7 @@ namespace NadekoBot.Migrations b.HasIndex("ReactionRoleMessageId"); - b.ToTable("ReactionRole", (string)null); + b.ToTable("ReactionRole"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ReactionRoleMessage", b => @@ -1451,7 +1448,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("ReactionRoleMessage", (string)null); + b.ToTable("ReactionRoleMessage"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => @@ -1485,7 +1482,7 @@ namespace NadekoBot.Migrations b.HasIndex("When"); - b.ToTable("Reminders", (string)null); + b.ToTable("Reminders"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => @@ -1520,7 +1517,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("Repeaters", (string)null); + b.ToTable("Repeaters"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.RewardedUser", b => @@ -1549,7 +1546,7 @@ namespace NadekoBot.Migrations b.HasIndex("PatreonUserId") .IsUnique(); - b.ToTable("RewardedUsers", (string)null); + b.ToTable("RewardedUsers"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.RotatingPlayingStatus", b => @@ -1569,7 +1566,7 @@ namespace NadekoBot.Migrations b.HasKey("Id"); - b.ToTable("RotatingStatus", (string)null); + b.ToTable("RotatingStatus"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => @@ -1600,7 +1597,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildId", "RoleId") .IsUnique(); - b.ToTable("SelfAssignableRoles", (string)null); + b.ToTable("SelfAssignableRoles"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b => @@ -1640,7 +1637,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("ShopEntry", (string)null); + b.ToTable("ShopEntry"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b => @@ -1662,7 +1659,7 @@ namespace NadekoBot.Migrations b.HasIndex("ShopEntryId"); - b.ToTable("ShopEntryItem", (string)null); + b.ToTable("ShopEntryItem"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b => @@ -1684,7 +1681,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("SlowmodeIgnoredRole", (string)null); + b.ToTable("SlowmodeIgnoredRole"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b => @@ -1706,7 +1703,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("SlowmodeIgnoredUser", (string)null); + b.ToTable("SlowmodeIgnoredUser"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleBlacklistedUser", b => @@ -1731,7 +1728,7 @@ namespace NadekoBot.Migrations b.HasIndex("StreamRoleSettingsId"); - b.ToTable("StreamRoleBlacklistedUser", (string)null); + b.ToTable("StreamRoleBlacklistedUser"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleSettings", b => @@ -1763,7 +1760,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId") .IsUnique(); - b.ToTable("StreamRoleSettings", (string)null); + b.ToTable("StreamRoleSettings"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.StreamRoleWhitelistedUser", b => @@ -1788,7 +1785,7 @@ namespace NadekoBot.Migrations b.HasIndex("StreamRoleSettingsId"); - b.ToTable("StreamRoleWhitelistedUser", (string)null); + b.ToTable("StreamRoleWhitelistedUser"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.UnbanTimer", b => @@ -1813,7 +1810,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("UnbanTimer", (string)null); + b.ToTable("UnbanTimer"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => @@ -1838,7 +1835,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("UnmuteTimer", (string)null); + b.ToTable("UnmuteTimer"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.UnroleTimer", b => @@ -1866,7 +1863,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("UnroleTimer", (string)null); + b.ToTable("UnroleTimer"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.UserXpStats", b => @@ -1911,7 +1908,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId", "GuildId") .IsUnique(); - b.ToTable("UserXpStats", (string)null); + b.ToTable("UserXpStats"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => @@ -1936,7 +1933,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("VcRoleInfo", (string)null); + b.ToTable("VcRoleInfo"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => @@ -1954,7 +1951,7 @@ namespace NadekoBot.Migrations b.Property("DateAdded") .HasColumnType("TEXT"); - b.Property("Price") + b.Property("Price") .HasColumnType("INTEGER"); b.Property("WaifuId") @@ -1971,7 +1968,7 @@ namespace NadekoBot.Migrations b.HasIndex("WaifuId") .IsUnique(); - b.ToTable("WaifuInfo", (string)null); + b.ToTable("WaifuInfo"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuItem", b => @@ -1996,7 +1993,7 @@ namespace NadekoBot.Migrations b.HasIndex("WaifuInfoId"); - b.ToTable("WaifuItem", (string)null); + b.ToTable("WaifuItem"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => @@ -2028,7 +2025,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("WaifuUpdates", (string)null); + b.ToTable("WaifuUpdates"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.Warning", b => @@ -2058,10 +2055,10 @@ namespace NadekoBot.Migrations b.Property("UserId") .HasColumnType("INTEGER"); - b.Property("Weight") + b.Property("Weight") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") - .HasDefaultValue(1); + .HasDefaultValue(1L); b.HasKey("Id"); @@ -2071,7 +2068,7 @@ namespace NadekoBot.Migrations b.HasIndex("UserId"); - b.ToTable("Warnings", (string)null); + b.ToTable("Warnings"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b => @@ -2102,7 +2099,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId"); - b.ToTable("WarningPunishment", (string)null); + b.ToTable("WarningPunishment"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.XpCurrencyReward", b => @@ -2127,7 +2124,7 @@ namespace NadekoBot.Migrations b.HasIndex("XpSettingsId"); - b.ToTable("XpCurrencyReward", (string)null); + b.ToTable("XpCurrencyReward"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.XpRoleReward", b => @@ -2156,7 +2153,7 @@ namespace NadekoBot.Migrations b.HasIndex("XpSettingsId", "Level") .IsUnique(); - b.ToTable("XpRoleReward", (string)null); + b.ToTable("XpRoleReward"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.XpSettings", b => @@ -2179,7 +2176,7 @@ namespace NadekoBot.Migrations b.HasIndex("GuildConfigId") .IsUnique(); - b.ToTable("XpSettings", (string)null); + b.ToTable("XpSettings"); }); modelBuilder.Entity("NadekoBot.Db.Models.ClubApplicants", b => diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs index cbe0e4f3d..ad703723c 100644 --- a/src/NadekoBot/Modules/Music/Music.cs +++ b/src/NadekoBot/Modules/Music/Music.cs @@ -103,7 +103,7 @@ public sealed partial class Music : NadekoModule var (trackInfo, index) = await mp.TryEnqueueTrackAsync(query, ctx.User.ToString(), asNext, forcePlatform); if (trackInfo is null) { - await ReplyErrorLocalizedAsync(strs.song_not_found); + await ReplyErrorLocalizedAsync(strs.track_not_found); return; } @@ -111,7 +111,7 @@ public sealed partial class Music : NadekoModule { var embed = _eb.Create() .WithOkColor() - .WithAuthor(GetText(strs.queued_song) + " #" + (index + 1), MUSIC_ICON_URL) + .WithAuthor(GetText(strs.queued_track) + " #" + (index + 1), MUSIC_ICON_URL) .WithDescription($"{trackInfo.PrettyName()}\n{GetText(strs.queue)} ") .WithFooter(trackInfo.Platform.ToString()); @@ -248,7 +248,7 @@ public sealed partial class Music : NadekoModule [RequireContext(ContextType.Guild)] public async partial Task ListQueue() { - // show page with the current song + // show page with the current track if (!_service.TryGetMusicPlayer(ctx.Guild.Id, out var mp)) { await ReplyErrorLocalizedAsync(strs.no_player); @@ -291,8 +291,8 @@ public sealed partial class Music : NadekoModule add += "🔂 " + GetText(strs.repeating_track) + "\n"; else { - // if (mp.Autoplay) - // add += "↪ " + GetText(strs.autoplaying) + "\n"; + if (mp.AutoPlay) + add += "↪ " + GetText(strs.autoplaying) + "\n"; // if (mp.FairPlay && !mp.Autoplay) // add += " " + GetText(strs.fairplay) + "\n"; if (repeatType == PlayerRepeatType.Queue) @@ -339,7 +339,7 @@ public sealed partial class Music : NadekoModule if (videos.Count == 0) { - await ReplyErrorLocalizedAsync(strs.song_not_found); + await ReplyErrorLocalizedAsync(strs.track_not_found); return; } @@ -388,7 +388,7 @@ public sealed partial class Music : NadekoModule { if (index < 1) { - await ReplyErrorLocalizedAsync(strs.removed_song_error); + await ReplyErrorLocalizedAsync(strs.removed_track_error); return; } @@ -402,16 +402,16 @@ public sealed partial class Music : NadekoModule return; } - if (!mp.TryRemoveTrackAt(index - 1, out var song)) + if (!mp.TryRemoveTrackAt(index - 1, out var track)) { - await ReplyErrorLocalizedAsync(strs.removed_song_error); + await ReplyErrorLocalizedAsync(strs.removed_track_error); return; } var embed = _eb.Create() - .WithAuthor(GetText(strs.removed_song) + " #" + index, MUSIC_ICON_URL) - .WithDescription(song.PrettyName()) - .WithFooter(song.PrettyInfo()) + .WithAuthor(GetText(strs.removed_track) + " #" + index, MUSIC_ICON_URL) + .WithDescription(track.PrettyName()) + .WithFooter(track.PrettyInfo()) .WithErrorColor(); await _service.SendToOutputAsync(ctx.Guild.Id, embed); @@ -550,7 +550,7 @@ public sealed partial class Music : NadekoModule [Cmd] [RequireContext(ContextType.Guild)] - public async partial Task MoveSong(int from, int to) + public async partial Task TrackMove(int from, int to) { if (--from < 0 || --to < 0 || from == to) { @@ -578,7 +578,7 @@ public sealed partial class Music : NadekoModule var embed = _eb.Create() .WithTitle(track.Title.TrimTo(65)) - .WithAuthor(GetText(strs.song_moved), MUSIC_ICON_URL) + .WithAuthor(GetText(strs.track_moved), MUSIC_ICON_URL) .AddField(GetText(strs.from_position), $"#{from + 1}", true) .AddField(GetText(strs.to_position), $"#{to + 1}", true) .WithOkColor(); @@ -744,4 +744,15 @@ public sealed partial class Music : NadekoModule await _service.SetMusicQualityAsync(ctx.Guild.Id, preset); await ReplyConfirmLocalizedAsync(strs.music_quality_set(Format.Bold(preset.ToString()))); } + + [Cmd] + [RequireContext(ContextType.Guild)] + public async partial Task QueueAutoPlay() + { + var newValue = await _service.ToggleQueueAutoPlayAsync(ctx.Guild.Id); + if (newValue) + await ReplyConfirmLocalizedAsync(strs.music_autoplay_on); + else + await ReplyConfirmLocalizedAsync(strs.music_autoplay_off); + } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Music/Services/IMusicService.cs b/src/NadekoBot/Modules/Music/Services/IMusicService.cs index ba8d429d4..c591f507a 100644 --- a/src/NadekoBot/Modules/Music/Services/IMusicService.cs +++ b/src/NadekoBot/Modules/Music/Services/IMusicService.cs @@ -32,4 +32,5 @@ public interface IMusicService : IPlaceholderProvider Task ToggleAutoDisconnectAsync(ulong guildId); Task GetMusicQualityAsync(ulong guildId); Task SetMusicQualityAsync(ulong guildId, QualityPreset preset); + Task ToggleQueueAutoPlayAsync(ulong guildId); } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Music/Services/MusicService.cs b/src/NadekoBot/Modules/Music/Services/MusicService.cs index 1aec81015..d7cbbbd34 100644 --- a/src/NadekoBot/Modules/Music/Services/MusicService.cs +++ b/src/NadekoBot/Modules/Music/Services/MusicService.cs @@ -156,7 +156,12 @@ public sealed class MusicService : IMusicService _outputChannels[guildId] = (defaultChannel, overrideChannel); - var mp = new MusicPlayer(queue, resolver, proxy, settings.QualityPreset); + var mp = new MusicPlayer(queue, + resolver, + proxy, + _googleApiService, + settings.QualityPreset, + settings.AutoPlay); mp.SetRepeat(settings.PlayerRepeat); @@ -191,7 +196,7 @@ public sealed class MusicService : IMusicService _ = lastFinishedMessage?.DeleteAsync(); var embed = _eb.Create() .WithOkColor() - .WithAuthor(GetText(guildId, strs.finished_song), Music.MUSIC_ICON_URL) + .WithAuthor(GetText(guildId, strs.finished_track), Music.MUSIC_ICON_URL) .WithDescription(trackInfo.PrettyName()) .WithFooter(trackInfo.PrettyTotalTime()); @@ -207,7 +212,7 @@ public sealed class MusicService : IMusicService _ = lastPlayingMessage?.DeleteAsync(); var embed = _eb.Create() .WithOkColor() - .WithAuthor(GetText(guildId, strs.playing_song(index + 1)), Music.MUSIC_ICON_URL) + .WithAuthor(GetText(guildId, strs.playing_track(index + 1)), Music.MUSIC_ICON_URL) .WithDescription(trackInfo.PrettyName()) .WithFooter($"{mp.PrettyVolume()} | {trackInfo.PrettyInfo()}"); @@ -288,7 +293,7 @@ public sealed class MusicService : IMusicService public IEnumerable<(string Name, Func Func)> GetPlaceholders() { - // random song that's playing + // random track that's playing yield return ("%music.playing%", () => { var randomPlayingTrack = _players.Select(x => x.Value.GetCurrentTrack(out _)) @@ -438,5 +443,17 @@ public sealed class MusicService : IMusicService }, preset); + public async Task ToggleQueueAutoPlayAsync(ulong guildId) + { + var newValue = false; + await ModifySettingsInternalAsync(guildId, + (settings, _) => newValue = settings.AutoPlay = !settings.AutoPlay, + false); + + if (TryGetMusicPlayer(guildId, out var mp)) + mp.AutoPlay = newValue; + return newValue; + } + #endregion } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Music/_Common/IMusicPlayer.cs b/src/NadekoBot/Modules/Music/_Common/IMusicPlayer.cs index 0f409f269..e460242ff 100644 --- a/src/NadekoBot/Modules/Music/_Common/IMusicPlayer.cs +++ b/src/NadekoBot/Modules/Music/_Common/IMusicPlayer.cs @@ -10,6 +10,7 @@ public interface IMusicPlayer : IDisposable bool IsKilled { get; } int CurrentIndex { get; } public PlayerRepeatType Repeat { get; } + bool AutoPlay { get; set; } void Stop(); void Clear(); diff --git a/src/NadekoBot/Modules/Music/_Common/ITrackInfo.cs b/src/NadekoBot/Modules/Music/_Common/ITrackInfo.cs index 1f2791872..9e7bd141f 100644 --- a/src/NadekoBot/Modules/Music/_Common/ITrackInfo.cs +++ b/src/NadekoBot/Modules/Music/_Common/ITrackInfo.cs @@ -2,6 +2,7 @@ public interface ITrackInfo { + public string Id => string.Empty; public string Title { get; } public string Url { get; } public string Thumbnail { get; } diff --git a/src/NadekoBot/Modules/Music/_Common/Impl/MusicPlayer.cs b/src/NadekoBot/Modules/Music/_Common/Impl/MusicPlayer.cs index 6269d6fef..5da91a484 100644 --- a/src/NadekoBot/Modules/Music/_Common/Impl/MusicPlayer.cs +++ b/src/NadekoBot/Modules/Music/_Common/Impl/MusicPlayer.cs @@ -28,6 +28,7 @@ public sealed class MusicPlayer : IMusicPlayer private readonly IMusicQueue _queue; private readonly ITrackResolveProvider _trackResolveProvider; private readonly IVoiceProxy _proxy; + private readonly IGoogleApiService _googleApiService; private readonly ISongBuffer _songBuffer; private bool skipped; @@ -35,15 +36,21 @@ public sealed class MusicPlayer : IMusicPlayer private readonly Thread _thread; private readonly Random _rng; + public bool AutoPlay { get; set; } + public MusicPlayer( IMusicQueue queue, ITrackResolveProvider trackResolveProvider, IVoiceProxy proxy, - QualityPreset qualityPreset) + IGoogleApiService googleApiService, + QualityPreset qualityPreset, + bool autoPlay) { _queue = queue; _trackResolveProvider = trackResolveProvider; _proxy = proxy; + _googleApiService = googleApiService; + AutoPlay = autoPlay; _rng = new NadekoRandom(); _vc = GetVoiceClient(qualityPreset); @@ -265,7 +272,29 @@ public sealed class MusicPlayer : IMusicPlayer { cancellationTokenSource.Cancel(); // turn off green in vc + _ = OnCompleted?.Invoke(this, track); + + // todo update when settings are changed + if (AutoPlay && track.Platform == MusicPlatform.Youtube) + { + try + { + var relatedSongs = await _googleApiService.GetRelatedVideosAsync(track.TrackInfo.Id, 5); + var related = relatedSongs.Shuffle().FirstOrDefault(); + if (related is not null) + { + var relatedTrack = await _trackResolveProvider.QuerySongAsync(related, MusicPlatform.Youtube); + if (relatedTrack is not null) + EnqueueTrack(relatedTrack, "Autoplay"); + } + } + catch (Exception ex) + { + Log.Warning(ex, "Failed queueing a related song via autoplay"); + } + } + HandleQueuePostTrack(); skipped = false; diff --git a/src/NadekoBot/Modules/Music/_Common/Impl/RemoteTrackInfo.cs b/src/NadekoBot/Modules/Music/_Common/Impl/RemoteTrackInfo.cs index abfbe0c78..ba7ed17de 100644 --- a/src/NadekoBot/Modules/Music/_Common/Impl/RemoteTrackInfo.cs +++ b/src/NadekoBot/Modules/Music/_Common/Impl/RemoteTrackInfo.cs @@ -1,30 +1,15 @@ namespace NadekoBot.Modules.Music; -public sealed class RemoteTrackInfo : ITrackInfo +public sealed record RemoteTrackInfo( + string Id, + string Title, + string Url, + string Thumbnail, + TimeSpan Duration, + MusicPlatform Platform, + Func> _streamFactory) : ITrackInfo { - public string Title { get; } - public string Url { get; } - public string Thumbnail { get; } - public TimeSpan Duration { get; } - public MusicPlatform Platform { get; } - - private readonly Func> _streamFactory; - - public RemoteTrackInfo( - string title, - string url, - string thumbnail, - TimeSpan duration, - MusicPlatform platform, - Func> streamFactory) - { - _streamFactory = streamFactory; - Title = title; - Url = url; - Thumbnail = thumbnail; - Duration = duration; - Platform = platform; - } + private readonly Func> _streamFactory = _streamFactory; public async ValueTask GetStreamUrl() => await _streamFactory(); diff --git a/src/NadekoBot/Modules/Music/_Common/Resolvers/YtdlYoutubeResolver.cs b/src/NadekoBot/Modules/Music/_Common/Resolvers/YtdlYoutubeResolver.cs index 9e2fcd7e6..5eb7ee500 100644 --- a/src/NadekoBot/Modules/Music/_Common/Resolvers/YtdlYoutubeResolver.cs +++ b/src/NadekoBot/Modules/Music/_Common/Resolvers/YtdlYoutubeResolver.cs @@ -94,7 +94,9 @@ public sealed class YtdlYoutubeResolver : IYoutubeResolver } private ITrackInfo DataToInfo(in YtTrackData trackData) - => new RemoteTrackInfo(trackData.Title, + => new RemoteTrackInfo( + trackData.Id, + trackData.Title, $"https://youtube.com/watch?v={trackData.Id}", trackData.Thumbnail, trackData.Duration, diff --git a/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs b/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs index 58b596e04..8c3ef782b 100644 --- a/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs +++ b/src/NadekoBot/Modules/Searches/Crypto/CryptoCommands.cs @@ -4,8 +4,6 @@ using System.Globalization; namespace NadekoBot.Modules.Searches; -// todo weighted warnings fix -// todo autoplay/fairplay public partial class Searches { public partial class FinanceCommands : NadekoSubmodule diff --git a/src/NadekoBot/Modules/Searches/_Common/StreamNotifications/Providers/TwitchHelixProvider.cs b/src/NadekoBot/Modules/Searches/_Common/StreamNotifications/Providers/TwitchHelixProvider.cs index cf7fb3466..29324fd77 100644 --- a/src/NadekoBot/Modules/Searches/_Common/StreamNotifications/Providers/TwitchHelixProvider.cs +++ b/src/NadekoBot/Modules/Searches/_Common/StreamNotifications/Providers/TwitchHelixProvider.cs @@ -1,4 +1,5 @@ -#nullable disable +// #nullable disable +// using NadekoBot.Db.Models; // using System; // using System.Collections.Generic; // using System.Linq; @@ -10,6 +11,7 @@ // using NadekoBot.Services.Database.Models; // using NadekoBot.Extensions; // using Serilog; +// using TwitchLib.Api; // using JsonSerializer = System.Text.Json.JsonSerializer; // // namespace NadekoBot.Modules.Searches.Common.StreamNotifications.Providers @@ -25,33 +27,17 @@ // public override FollowedStream.FType Platform => FollowedStream.FType.Twitch; // // private (string Token, DateTime Expiry) _token = default; -// +// private readonly TwitchAPI _api; +// // public TwitchHelixProvider(IHttpClientFactory httpClientFactory) // { // _httpClientFactory = httpClientFactory; +// _api = new TwitchAPI(); // } // // private async Task EnsureTokenValidAsync() -// { -// if (_token != default && (DateTime.UtcNow - _token.Expiry) > TimeSpan.FromHours(1)) -// return; +// => await _api.Auth.GetAccessTokenAsync(); // -// const string clientId = string.Empty; -// const string clientSecret = string.Empty; -// -// var client = _httpClientFactory.CreateClient(); -// var res = await client.PostAsync("https://id.twitch.tv/oauth2/token" + -// $"?client_id={clientId}" + -// $"&client_secret={clientSecret}" + -// "&grant_type=client_credentials", new StringContent("")); -// -// var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement; -// -// _token = (data.GetProperty("access_token").GetString(), -// DateTime.UtcNow + TimeSpan.FromSeconds(data.GetProperty("expires_in").GetInt32())); -// -// } -// // public override Task IsValidUrl(string url) // { // var match = Regex.Match(url); diff --git a/src/NadekoBot/Services/IGoogleApiService.cs b/src/NadekoBot/Services/IGoogleApiService.cs index da9823be8..2fc154380 100644 --- a/src/NadekoBot/Services/IGoogleApiService.cs +++ b/src/NadekoBot/Services/IGoogleApiService.cs @@ -10,7 +10,7 @@ public interface IGoogleApiService Task> GetVideoLinksByKeywordAsync(string keywords, int count = 1); Task> GetVideoInfosByKeywordAsync(string keywords, int count = 1); Task> GetPlaylistIdsByKeywordsAsync(string keywords, int count = 1); - Task> GetRelatedVideosAsync(string url, int count = 1); + Task> GetRelatedVideosAsync(string id, int count = 1, string user = null); Task> GetPlaylistTracksAsync(string playlistId, int count = 50); Task> GetVideoDurationsAsync(IEnumerable videoIds); Task GetImageAsync(string query); diff --git a/src/NadekoBot/Services/Impl/GoogleApiService.cs b/src/NadekoBot/Services/Impl/GoogleApiService.cs index 1d916c74a..757cd543a 100644 --- a/src/NadekoBot/Services/Impl/GoogleApiService.cs +++ b/src/NadekoBot/Services/Impl/GoogleApiService.cs @@ -194,8 +194,7 @@ public class GoogleApiService : IGoogleApiService, INService return (await query.ExecuteAsync()).Items.Select(i => i.Id.PlaylistId); } - // todo future add quota users - public async Task> GetRelatedVideosAsync(string id, int count = 1) + public async Task> GetRelatedVideosAsync(string id, int count = 1, string user = null) { if (string.IsNullOrWhiteSpace(id)) throw new ArgumentNullException(nameof(id)); @@ -207,6 +206,7 @@ public class GoogleApiService : IGoogleApiService, INService query.MaxResults = count; query.RelatedToVideoId = id; query.Type = "video"; + query.QuotaUser = user; return (await query.ExecuteAsync()).Items.Select(i => "http://www.youtube.com/watch?v=" + i.Id.VideoId); } diff --git a/src/NadekoBot/data/aliases.yml b/src/NadekoBot/data/aliases.yml index fa85432bc..fb0227dbf 100644 --- a/src/NadekoBot/data/aliases.yml +++ b/src/NadekoBot/data/aliases.yml @@ -472,13 +472,19 @@ trackremove: - songremove - srm - trackremove -movesong: +- trm +trackmove: +- trackmove +- tm - movesong - ms queuerepeat: - queuerepeat - qrp - rpl +queueautoplay: +- queueautoplay +- qap save: - save streamrole: diff --git a/src/NadekoBot/data/strings/commands/commands.en-US.yml b/src/NadekoBot/data/strings/commands/commands.en-US.yml index 1d7b6e490..d452718fa 100644 --- a/src/NadekoBot/data/strings/commands/commands.en-US.yml +++ b/src/NadekoBot/data/strings/commands/commands.en-US.yml @@ -849,7 +849,7 @@ trackremove: - "5" - "all" - "" -movesong: +trackmove: desc: "Moves a song from one position to another." args: - "5 3" @@ -888,7 +888,7 @@ deleteplaylist: desc: "Deletes a saved playlist using its id. Works only if you made it or if you are the bot owner." args: - "5" -autoplay: +queueautoplay: desc: "Toggles autoplay - When the song is finished, automatically queue a related Youtube song. (Works only for Youtube songs and when queue is empty)" args: - "" diff --git a/src/NadekoBot/data/strings/responses/responses.en-US.json b/src/NadekoBot/data/strings/responses/responses.en-US.json index 468b18011..0853f6e27 100644 --- a/src/NadekoBot/data/strings/responses/responses.en-US.json +++ b/src/NadekoBot/data/strings/responses/responses.en-US.json @@ -354,10 +354,10 @@ "ttt_time_expired": "Time expired!", "ttt_users_move": "{0}'s move", "vs": "{0} vs {1}", - "attempting_to_queue": "Attempting to queue {0} songs...", + "attempting_to_queue": "Attempting to queue {0} tracks...", "dir_queue_complete": "Directory queue complete.", "fairplay": "Fairplay", - "finished_song": "Finished song", + "finished_track": "Track Finished", "fp_disabled": "Fair play disabled.", "fp_enabled": "Fair play enabled.", "from_position": "From position", @@ -366,8 +366,8 @@ "no_player": "No active music player.", "no_search_results": "No search results.", "player_queue": "Player queue - Page {0}/{1}", - "playing_song": "Playing song #{0}", - "playlists": "`#{0}` - **{1}** by *{2}* ({3} songs)", + "playing_track": "Playing track #{0}", + "playlists": "`#{0}` - **{1}** by *{2}* ({3} tracks)", "playlists_page": "Page {0} of saved playlists", "playlist_deleted": "Playlist deleted.", "playlist_delete_fail": "Failed to delete that playlist. It either doesn't exist, or you are not its author.", @@ -375,17 +375,20 @@ "playlist_queue_complete": "Playlist queue complete.", "playlist_saved": "Playlist saved", "queue": "Queue", - "queued_song": "Queued song", + "queued_track": "Queued track", "queue_cleared": "Music queue cleared.", - "removed_song": "Removed song", + "removed_track": "Removed track", "repeating_none": "Player will stop once the end of queue is reached.", "repeating_queue": "Player will repeat the queue.", "repeating_track": "Player will keep repeating the same track.", - "set_music_channel": "I will now output playing, finished, paused and removed songs in this channel.", - "unset_music_channel": "I will now output playing, finished, paused and removed songs of the newly created music players in the channel music was started from.", + "autoplaying": "Automatically adds related tracks.", + "set_music_channel": "I will now output playing, finished, paused and removed tracks in this channel.", + "unset_music_channel": "I will now output playing, finished, paused and removed tracks of the newly created music players in the channel music was started from.", "current_music_quality": "Currently set music quality is: {0}", "music_quality_set": "Music quality has been set to {0}. You will have to destroy and restart music player for the change to take effect.", - "song_moved": "Song moved", + "music_autoplay_on": "Music autoplay enabled. I will automatically queue related tracks after each track finishes playing.", + "music_autoplay_off": "Music autoplay disabled.", + "track_moved": "Track moved", "to_position": "To position", "volume_input_invalid": "Volume must be between 0 and 100", "volume_set": "Volume set to {0}%", @@ -731,7 +734,7 @@ "timezone_not_found": "Timezone not found. Use \"timezones\" command to see the list of available timezones.", "timezones_available": "Available Timezones", "perm_override": "Users will need {0} permission in order to run {1} command.", - "song_not_found": "No song found.", + "track_not_found": "No track found.", "define_unknown": "Can't find the definition for that term.", "verbose_errors_enabled": "Incorrectly used commands will now show errors.", "verbose_errors_disabled": "Incorrectly used commands will no longer show errors.", @@ -741,7 +744,7 @@ "module": "Module: {0}", "hangman_stopped": "Hangman game stopped.", "queue_stopped": "Player is stopped. Use {0} command to start playing.", - "removed_song_error": "Song on that index doesn't exist", + "removed_track_error": "Track on that index doesn't exist", "queue_shuffled": "Music queue has been shuffled.", "warnings_list": "List of all warned users on the server", "redacted_too_long": "Redacted because it's too long.", @@ -873,8 +876,8 @@ "rafflecur_joined": "User {0} joined the raffle", "rafflecur_already_joined": "You have already joined this raffle or the value you used is not valid.", "rafflecur_ended": "{0} raffle ended. {1} won {2}!", - "autodc_enable": "I will disconnect from the voice channel when there are no more songs to play.", - "autodc_disable": "I will no longer disconnect from the voice channel when there are no more songs to play.", + "autodc_enable": "I will disconnect from the voice channel when there are no more tracks to play.", + "autodc_disable": "I will no longer disconnect from the voice channel when there are no more tracks to play.", "timely_none": "Bot owner didn't specify a timely reward.", "timely_already_claimed": "You've already claimed your timely reward. You can get it again in {0}.", "timely": "You've claimed your {0}. You can claim again in {1}h",