From a9ba7b716607a94104e33cdbc689610a49b5efff Mon Sep 17 00:00:00 2001 From: SylveonDeko <59923820+SylveonDeko@users.noreply.github.com> Date: Sun, 13 Oct 2024 17:10:44 -0400 Subject: [PATCH] update all packages, add invite counting. --- .../Yml/CommentGatheringTypeInspector.cs | 17 + .../Common/Yml/CommentsObjectGraphVisitor.cs | 5 +- src/Mewdeko/Common/Yml/Rgba32Converter.cs | 8 +- src/Mewdeko/Common/Yml/UriConverter.cs | 5 +- src/Mewdeko/Controllers/BotStatus.cs | 9 +- src/Mewdeko/Database/MewdekoContext.cs | 18 +- .../20241011165238_SeparateSettings.cs | 3 +- .../20241013145247_Invites.Designer.cs | 4650 ++++++++++++++++ .../PostgreSql/20241013145247_Invites.cs | 58 + ...1013204914_InviteCountSettings.Designer.cs | 4678 +++++++++++++++++ .../20241013204914_InviteCountSettings.cs | 40 + .../MewdekoPostgresContextModelSnapshot.cs | 80 +- src/Mewdeko/Database/Models/Giveaways.cs | 1 - src/Mewdeko/Database/Models/GuildConfig.cs | 1 - src/Mewdeko/Database/Models/InviteCount.cs | 25 + .../Database/Models/InviteCountSettings.cs | 27 + src/Mewdeko/Database/Models/InvitedBy.cs | 25 + src/Mewdeko/Mewdeko.csproj | 52 +- .../Modules/OwnerOnly/InstanceManagement.cs | 59 + .../OwnerOnly/Services/BotInstanceService.cs | 220 + .../Services/ChannelCommandService.cs | 2 + src/Mewdeko/Modules/Utility/InviteCommands.cs | 231 +- .../Utility/Services/InviteCountService.cs | 379 ++ .../Modules/Utility/Services/InviteService.cs | 58 - src/Mewdeko/Services/Impl/BotCredentials.cs | 12 +- src/Mewdeko/Services/Impl/EventHandler.cs | 25 + src/Mewdeko/Services/Impl/StatsService.cs | 1 + src/Mewdeko/data/aliases.yml | 22 + .../data/strings/commands/commands.en-US.yml | 24 + .../strings/responses/responses.en-US.json | 22 + 30 files changed, 10556 insertions(+), 201 deletions(-) create mode 100644 src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.Designer.cs create mode 100644 src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.cs create mode 100644 src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.Designer.cs create mode 100644 src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.cs create mode 100644 src/Mewdeko/Database/Models/InviteCount.cs create mode 100644 src/Mewdeko/Database/Models/InviteCountSettings.cs create mode 100644 src/Mewdeko/Database/Models/InvitedBy.cs create mode 100644 src/Mewdeko/Modules/OwnerOnly/InstanceManagement.cs create mode 100644 src/Mewdeko/Modules/OwnerOnly/Services/BotInstanceService.cs create mode 100644 src/Mewdeko/Modules/Utility/Services/InviteCountService.cs delete mode 100644 src/Mewdeko/Modules/Utility/Services/InviteService.cs diff --git a/src/Mewdeko/Common/Yml/CommentGatheringTypeInspector.cs b/src/Mewdeko/Common/Yml/CommentGatheringTypeInspector.cs index db6ac2448..554c8cc6f 100644 --- a/src/Mewdeko/Common/Yml/CommentGatheringTypeInspector.cs +++ b/src/Mewdeko/Common/Yml/CommentGatheringTypeInspector.cs @@ -22,6 +22,18 @@ public CommentGatheringTypeInspector(ITypeInspector innerTypeDescriptor) innerTypeDescriptor ?? throw new ArgumentNullException(nameof(innerTypeDescriptor)); } + /// + public override string GetEnumName(Type enumType, string name) + { + return name; + } + + /// + public override string GetEnumValue(object enumValue) + { + return enumValue.ToString(); + } + /// public override IEnumerable GetProperties(Type type, object? container) { @@ -43,6 +55,8 @@ public CommentsPropertyDescriptor(IPropertyDescriptor baseDescriptor) /// public string Name { get; } + public bool AllowNulls { get; } + /// public Type Type { @@ -81,6 +95,9 @@ public ScalarStyle ScalarStyle } } + public bool Required { get; } + public Type? ConverterType { get; } + /// public bool CanWrite { diff --git a/src/Mewdeko/Common/Yml/CommentsObjectGraphVisitor.cs b/src/Mewdeko/Common/Yml/CommentsObjectGraphVisitor.cs index 4d3ad5311..5888ebb5a 100644 --- a/src/Mewdeko/Common/Yml/CommentsObjectGraphVisitor.cs +++ b/src/Mewdeko/Common/Yml/CommentsObjectGraphVisitor.cs @@ -19,8 +19,9 @@ public CommentsObjectGraphVisitor(IObjectGraphVisitor nextVisitor) { } + /// - public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, IEmitter context) + public override bool EnterMapping(IObjectDescriptor key, IObjectDescriptor value, IEmitter context, ObjectSerializer serializer) { if (value is CommentsObjectDescriptor commentsDescriptor && !string.IsNullOrWhiteSpace(commentsDescriptor.Comment)) @@ -29,6 +30,6 @@ public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor val context.Emit(new Comment(commentsDescriptor.Comment.Replace("\n", "\n# "), false)); } - return base.EnterMapping(key, value, context); + return base.EnterMapping(key, value, context, serializer); } } \ No newline at end of file diff --git a/src/Mewdeko/Common/Yml/Rgba32Converter.cs b/src/Mewdeko/Common/Yml/Rgba32Converter.cs index 66497f537..640cf2755 100644 --- a/src/Mewdeko/Common/Yml/Rgba32Converter.cs +++ b/src/Mewdeko/Common/Yml/Rgba32Converter.cs @@ -18,14 +18,14 @@ public bool Accepts(Type type) } /// - public object ReadYaml(IParser parser, Type type) + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { var scalar = parser.Consume(); return SKColor.Parse(scalar.Value); } /// - public void WriteYaml(IEmitter emitter, object? value, Type type) + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { var color = (SKColor)value; var val = (uint)((color.Blue << 0) | (color.Green << 8) | (color.Red << 16)); @@ -45,14 +45,14 @@ public bool Accepts(Type type) } /// - public object ReadYaml(IParser parser, Type type) + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { var scalar = parser.Consume(); return new CultureInfo(scalar.Value); } /// - public void WriteYaml(IEmitter emitter, object? value, Type type) + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { var ci = (CultureInfo)value; emitter.Emit(new Scalar(ci.Name)); diff --git a/src/Mewdeko/Common/Yml/UriConverter.cs b/src/Mewdeko/Common/Yml/UriConverter.cs index 4bed31c08..e4cf54421 100644 --- a/src/Mewdeko/Common/Yml/UriConverter.cs +++ b/src/Mewdeko/Common/Yml/UriConverter.cs @@ -16,16 +16,17 @@ public bool Accepts(Type type) } /// - public object ReadYaml(IParser parser, Type type) + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { var scalar = parser.Consume(); return new Uri(scalar.Value); } /// - public void WriteYaml(IEmitter emitter, object? value, Type type) + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { var uri = (Uri)value; emitter.Emit(new Scalar(uri.ToString())); } + } \ No newline at end of file diff --git a/src/Mewdeko/Controllers/BotStatus.cs b/src/Mewdeko/Controllers/BotStatus.cs index 6a2f99c39..7fbade8ff 100644 --- a/src/Mewdeko/Controllers/BotStatus.cs +++ b/src/Mewdeko/Controllers/BotStatus.cs @@ -24,6 +24,7 @@ public class BotStatus(DiscordShardedClient client, StatsService statsService, C [HttpGet] public async Task GetStatus() { + var creds = new BotCredentials(); var clients = client.Shards; var rest = client.Rest; var curUser = await rest.GetUserAsync(client.CurrentUser.Id); @@ -40,7 +41,8 @@ public async Task GetStatus() BotStatus = client.Status.ToString(), UserCount = clients.Select(x => x.Guilds.Sum(g => g.Users.Count)).Sum(), CommitHash = GetCommitHash(), - BotId = client.CurrentUser.Id + BotId = client.CurrentUser.Id, + InstanceUrl = $"http://localhost:{creds.ApiPort}" }; return Ok(toReturn); @@ -159,5 +161,10 @@ public class BotStatusModel /// The bots userId /// public ulong BotId { get; set; } + + /// + /// The api url of this instance. + /// + public string InstanceUrl { get; set; } } } \ No newline at end of file diff --git a/src/Mewdeko/Database/MewdekoContext.cs b/src/Mewdeko/Database/MewdekoContext.cs index 4ce475da2..39627c2ba 100644 --- a/src/Mewdeko/Database/MewdekoContext.cs +++ b/src/Mewdeko/Database/MewdekoContext.cs @@ -1,6 +1,4 @@ -using Mewdeko.Common.Attributes.DB; -using Mewdeko.Modules.OwnerOnly.Services; -using Mewdeko.Services.Impl; +using Mewdeko.Services.Impl; using Microsoft.EntityFrameworkCore; namespace Mewdeko.Database; @@ -26,6 +24,15 @@ public MewdekoContext(DbContextOptions options) : base(options) /// public DbSet GlobalUserBalances { get; set; } + /// + /// Gets or sets invite counts + /// + public DbSet InviteCounts { get; set; } + /// + /// Gets or sets invited by + /// + public DbSet InvitedBy { get; set; } + /// /// Gets or sets the lockdown channel permissions. /// @@ -421,6 +428,11 @@ public MewdekoContext(DbContextOptions options) : base(options) /// public DbSet BotInstances { get; set; } + /// + /// Settings for invite counting + /// + public DbSet InviteCountSettings { get; set; } + /// /// Configures the model that was discovered by convention from the entity types /// exposed in properties on your derived context. diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/20241011165238_SeparateSettings.cs b/src/Mewdeko/Database/Migrations/PostgreSql/20241011165238_SeparateSettings.cs index 9e499eb7a..294e06c89 100644 --- a/src/Mewdeko/Database/Migrations/PostgreSql/20241011165238_SeparateSettings.cs +++ b/src/Mewdeko/Database/Migrations/PostgreSql/20241011165238_SeparateSettings.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; #nullable disable diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.Designer.cs b/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.Designer.cs new file mode 100644 index 000000000..b5be8fdac --- /dev/null +++ b/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.Designer.cs @@ -0,0 +1,4650 @@ +// +using System; +using Mewdeko.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mewdeko.Database.Migrations.PostgreSql +{ + [DbContext(typeof(MewdekoPostgresContext))] + [Migration("20241013145247_Invites")] + partial class Invites + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mewdeko.Database.Models.Afk", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("WasTimed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.ToTable("AFK"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiAltSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("ActionDurationMinutes") + .HasColumnType("integer"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("MinAge") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiAltSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("IgnoreBots") + .HasColumnType("boolean"); + + b.Property("MaxMentionsInTimeWindow") + .HasColumnType("integer"); + + b.Property("MentionThreshold") + .HasColumnType("integer"); + + b.Property("MuteTime") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("TimeWindowSeconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiMassMentionSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AntiMassMentionSettingId") + .HasColumnType("integer"); + + b.Property("AntiSpamSettingId") + .HasColumnType("integer"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("AntiMassMentionSettingId"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("MessageThreshold") + .HasColumnType("integer"); + + b.Property("MuteTime") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoBanEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("AutoBanWords"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoBanRoles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AutoBanRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoCommand", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelName") + .HasColumnType("text"); + + b.Property("CommandText") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildName") + .HasColumnType("text"); + + b.Property("Interval") + .HasColumnType("integer"); + + b.Property("VoiceChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoiceChannelName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("AutoCommands"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoPublish", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BlacklistedUsers") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AutoPublish"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BanTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Text") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("BanTemplates"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ItemId") + .HasColumnType("numeric(20,0)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Blacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistedPermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Permission") + .HasColumnType("numeric(20,0)"); + + b.Property("PunishmentAction") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("BlacklistedPermissions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("PunishmentAction") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("BlacklistedRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BotReviews", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Review") + .IsRequired() + .HasColumnType("text"); + + b.Property("Stars") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("BotReviews"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ChatTriggers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowTarget") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ApplicationCommandDescription") + .HasColumnType("text"); + + b.Property("ApplicationCommandId") + .HasColumnType("numeric(20,0)"); + + b.Property("ApplicationCommandName") + .HasColumnType("text"); + + b.Property("ApplicationCommandType") + .HasColumnType("integer"); + + b.Property("AutoDeleteTrigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ContainsAnywhere") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("CrosspostingChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("CrosspostingWebhookUrl") + .HasColumnType("text"); + + b.Property("CustomPrefix") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DmResponse") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("EphemeralResponse") + .HasColumnType("boolean"); + + b.Property("GrantedRoles") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsRegex") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("NoRespond") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("OwnerOnly") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("PrefixType") + .HasColumnType("integer"); + + b.Property("ReactToTrigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("RemovedRoles") + .HasColumnType("text"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("RoleGrantType") + .HasColumnType("integer"); + + b.Property("Trigger") + .HasColumnType("text"); + + b.Property("UseCount") + .HasColumnType("numeric(20,0)"); + + b.Property("ValidTriggerTypes") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ChatTriggers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CommandName") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Seconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsSlash") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Module") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasDefaultValue(""); + + b.Property("NameOrId") + .HasColumnType("text"); + + b.Property("Trigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("CommandStats"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Confessions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessNumber") + .HasColumnType("numeric(20,0)"); + + b.Property("Confession") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Confessions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DelMsgOnCmdChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("State") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("DelMsgOnCmdChannel"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DiscordPermOverride", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Command") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Perm") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "Command") + .IsUnique(); + + b.ToTable("DiscordPermOverrides"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarId") + .HasColumnType("text"); + + b.Property("Bio") + .HasColumnType("text"); + + b.Property("Birthday") + .HasColumnType("timestamp without time zone"); + + b.Property("BirthdayDisplayMode") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Discriminator") + .HasColumnType("text"); + + b.Property("IsClubAdmin") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("IsDragon") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 305, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("ProfileColor") + .HasColumnType("bigint"); + + b.Property("ProfileImageUrl") + .HasColumnType("text"); + + b.Property("ProfilePrivacy") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("Pronouns") + .HasColumnType("text"); + + b.Property("PronounsClearedReason") + .HasColumnType("text"); + + b.Property("PronounsDisabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StatsOptOut") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SwitchFriendCode") + .HasColumnType("text"); + + b.Property("TotalXp") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.Property("ZodiacSign") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.HasIndex("TotalXp"); + + b.HasIndex("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ExcludedItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ItemId") + .HasColumnType("numeric(20,0)"); + + b.Property("ItemType") + .HasColumnType("integer"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("ExcludedItem"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FeedSub", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasAlternateKey("GuildConfigId", "Url"); + + b.ToTable("FeedSub"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterInvitesChannelIds", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterInvitesChannelIds"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterLinksChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterLinksChannelId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterWordsChannelIds", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterWordsChannelIds"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + 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("Mewdeko.Database.Models.GiveawayUsers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GiveawayId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GiveawayUsers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Giveaways", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BlacklistRoles") + .HasColumnType("text"); + + b.Property("BlacklistUsers") + .HasColumnType("text"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Emote") + .HasColumnType("text"); + + b.Property("Ended") + .HasColumnType("integer"); + + b.Property("Item") + .HasColumnType("text"); + + b.Property("MessageCountReq") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("RestrictTo") + .HasColumnType("text"); + + b.Property("ServerId") + .HasColumnType("numeric(20,0)"); + + b.Property("UseButton") + .HasColumnType("boolean"); + + b.Property("UseCaptcha") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.Property("Winners") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Giveaways"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GlobalUserBalance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Balance") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GlobalUserBalance"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GroupName", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AcceptChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("AcceptMessage") + .HasColumnType("text"); + + b.Property("AfkDel") + .HasColumnType("text"); + + b.Property("AfkDisabledChannels") + .HasColumnType("text"); + + b.Property("AfkLength") + .HasColumnType("integer"); + + b.Property("AfkMessage") + .HasColumnType("text"); + + b.Property("AfkTimeout") + .HasColumnType("integer"); + + b.Property("AfkType") + .HasColumnType("integer"); + + b.Property("ArchiveOnAccept") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnConsider") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnDeny") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnImplement") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("AutoAssignRoleId") + .HasColumnType("text"); + + b.Property("AutoBotRoleIds") + .HasColumnType("text"); + + b.Property("AutoDeleteByeMessages") + .HasColumnType("boolean"); + + b.Property("AutoDeleteByeMessagesTimer") + .HasColumnType("integer"); + + b.Property("AutoDeleteGreetMessages") + .HasColumnType("boolean"); + + b.Property("AutoDeleteGreetMessagesTimer") + .HasColumnType("integer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages") + .HasColumnType("boolean"); + + b.Property("BoostMessage") + .HasColumnType("text"); + + b.Property("BoostMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("BoostMessageDeleteAfter") + .HasColumnType("integer"); + + b.Property("ButtonRepostThreshold") + .HasColumnType("integer"); + + b.Property("ByeMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelByeMessageText") + .HasColumnType("text"); + + b.Property("ChannelGreetMessageText") + .HasColumnType("text"); + + b.Property("CleverbotChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("CommandLogChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessionBlacklist") + .HasColumnType("text"); + + b.Property("ConfessionChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessionLogChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConsiderChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConsiderMessage") + .HasColumnType("text"); + + b.Property("CurrencyEmoji") + .HasColumnType("text"); + + b.Property("CurrencyName") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteMessageOnCommand") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("DenyChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("DenyMessage") + .HasColumnType("text"); + + b.Property("DmGreetMessageText") + .HasColumnType("text"); + + b.Property("DmOnGiveawayWin") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("Emote1Style") + .HasColumnType("integer"); + + b.Property("Emote2Style") + .HasColumnType("integer"); + + b.Property("Emote3Style") + .HasColumnType("integer"); + + b.Property("Emote4Style") + .HasColumnType("integer"); + + b.Property("Emote5Style") + .HasColumnType("integer"); + + b.Property("EmoteMode") + .HasColumnType("integer"); + + b.Property("ExclusiveSelfAssignedRoles") + .HasColumnType("boolean"); + + b.Property("FilterInvites") + .HasColumnType("boolean"); + + b.Property("FilterLinks") + .HasColumnType("boolean"); + + b.Property("FilterWords") + .HasColumnType("boolean"); + + b.Property("GBAction") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GBEnabled") + .HasColumnType("integer"); + + b.Property("GEndMessage") + .HasColumnType("text"); + + b.Property("GRolesBlacklist") + .HasColumnType("text"); + + b.Property("GStartMessage") + .HasColumnType("text"); + + b.Property("GUsersBlacklist") + .HasColumnType("text"); + + b.Property("GWinMessage") + .HasColumnType("text"); + + b.Property("GameMasterRole") + .HasColumnType("numeric(20,0)"); + + b.Property("GameVoiceChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("GiveawayBanner") + .HasColumnType("text"); + + b.Property("GiveawayEmbedColor") + .HasColumnType("text"); + + b.Property("GiveawayEmote") + .HasColumnType("text"); + + b.Property("GiveawayEndMessage") + .HasColumnType("text"); + + b.Property("GiveawayPingRole") + .HasColumnType("numeric(20,0)"); + + b.Property("GiveawayWinEmbedColor") + .HasColumnType("text"); + + b.Property("GreetHook") + .HasColumnType("text"); + + b.Property("GreetMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("ImplementChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ImplementMessage") + .HasColumnType("text"); + + b.Property("JoinGraphColor") + .HasColumnType("bigint"); + + b.Property("Joins") + .HasColumnType("numeric(20,0)"); + + b.Property("LeaveGraphColor") + .HasColumnType("bigint"); + + b.Property("LeaveHook") + .HasColumnType("text"); + + b.Property("Leaves") + .HasColumnType("numeric(20,0)"); + + b.Property("Locale") + .HasColumnType("text"); + + b.Property("LogSettingId") + .HasColumnType("integer"); + + b.Property("MaxSuggestLength") + .HasColumnType("integer"); + + b.Property("MemberRole") + .HasColumnType("numeric(20,0)"); + + b.Property("MinMessageLength") + .HasColumnType("integer"); + + b.Property("MinSuggestLength") + .HasColumnType("integer"); + + b.Property("MiniWarnlogChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("MultiGreetType") + .HasColumnType("integer"); + + b.Property("MuteRoleName") + .HasColumnType("text"); + + b.Property("NotifyStreamOffline") + .HasColumnType("boolean"); + + b.Property("PermissionRole") + .HasColumnType("text"); + + b.Property("Prefix") + .HasColumnType("text"); + + b.Property("PreviewLinks") + .HasColumnType("integer"); + + b.Property("ReactChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("RepostThreshold") + .HasColumnType("integer"); + + b.Property("RewardAmount") + .HasColumnType("integer"); + + b.Property("RewardTimeoutSeconds") + .HasColumnType("integer"); + + b.Property("SendBoostMessage") + .HasColumnType("boolean"); + + b.Property("SendChannelByeMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SendChannelGreetMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SendDmGreetMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StaffRole") + .HasColumnType("numeric(20,0)"); + + b.Property("Star2") + .HasColumnType("text"); + + b.Property("StarboardAllowBots") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StarboardChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("StarboardCheckChannels") + .HasColumnType("text"); + + b.Property("StarboardRemoveOnBelowThreshold") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("StarboardRemoveOnDelete") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StarboardRemoveOnReactionsClear") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Stars") + .HasColumnType("integer"); + + b.Property("StatsOptOut") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SuggestButtonChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("SuggestButtonColor") + .HasColumnType("integer"); + + b.Property("SuggestButtonEmote") + .HasColumnType("text"); + + b.Property("SuggestButtonMessage") + .HasColumnType("text"); + + b.Property("SuggestButtonMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("SuggestButtonName") + .HasColumnType("text"); + + b.Property("SuggestButtonRepostThreshold") + .HasColumnType("integer"); + + b.Property("SuggestCommandsType") + .HasColumnType("integer"); + + b.Property("SuggestEmotes") + .HasColumnType("text"); + + b.Property("SuggestMessage") + .HasColumnType("text"); + + b.Property("SuggestionThreadType") + .HasColumnType("integer"); + + b.Property("TOpenMessage") + .HasColumnType("text"); + + b.Property("TicketCategory") + .HasColumnType("numeric(20,0)"); + + b.Property("TicketChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("TimeZoneId") + .HasColumnType("text"); + + b.Property("UseMessageCount") + .HasColumnType("boolean"); + + b.Property("UseStarboardBlacklist") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("VerboseErrors") + .HasColumnType("boolean"); + + b.Property("VerbosePermissions") + .HasColumnType("boolean"); + + b.Property("VoteEmbed") + .HasColumnType("text"); + + b.Property("VotesChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("VotesPassword") + .HasColumnType("text"); + + b.Property("WarnExpireAction") + .HasColumnType("integer"); + + b.Property("WarnExpireHours") + .HasColumnType("integer"); + + b.Property("WarnMessage") + .HasColumnType("text"); + + b.Property("WarningsInitialized") + .HasColumnType("boolean"); + + b.Property("WarnlogChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("XpImgUrl") + .HasColumnType("text"); + + b.Property("XpTxtRate") + .HasColumnType("integer"); + + b.Property("XpTxtTimeout") + .HasColumnType("integer"); + + b.Property("XpVoiceRate") + .HasColumnType("integer"); + + b.Property("XpVoiceTimeout") + .HasColumnType("integer"); + + b.Property("fwarn") + .HasColumnType("integer"); + + b.Property("invwarn") + .HasColumnType("integer"); + + b.Property("removeroles") + .HasColumnType("integer"); + + b.Property("snipeset") + .HasColumnType("boolean"); + + b.Property("sugchan") + .HasColumnType("numeric(20,0)"); + + b.Property("sugnum") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("WarnExpireHours"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildUserBalance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Balance") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GuildUserBalance"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.HighlightSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("HighlightsOn") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("IgnoredChannels") + .HasColumnType("text"); + + b.Property("IgnoredUsers") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("HighlightSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Highlights", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Highlights"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("LogSettingId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InviteCount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InviteCounts"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InvitedBy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("InviterId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InvitedBy"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.JoinLeaveLogs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsJoin") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("JoinLeaveLogs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LocalBotInstances", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BotUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.ToTable("BotInstances"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LockdownChannelPermissions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowPermissions") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DenyPermissions") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("TargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("TargetType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("LockdownChannelPermissions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelCreated") + .HasColumnType("bigint"); + + b.Property("ChannelCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelDestroyed") + .HasColumnType("bigint"); + + b.Property("ChannelDestroyedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelUpdated") + .HasColumnType("bigint"); + + b.Property("ChannelUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EventCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsLogging") + .HasColumnType("bigint"); + + b.Property("LogOtherId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogUserPresence") + .HasColumnType("bigint"); + + b.Property("LogUserPresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresence") + .HasColumnType("bigint"); + + b.Property("LogVoicePresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceTTSId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageDeleted") + .HasColumnType("bigint"); + + b.Property("MessageDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageUpdated") + .HasColumnType("bigint"); + + b.Property("MessageUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("NicknameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ServerUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserBanned") + .HasColumnType("bigint"); + + b.Property("UserBannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserJoined") + .HasColumnType("bigint"); + + b.Property("UserJoinedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserLeft") + .HasColumnType("bigint"); + + b.Property("UserLeftId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserMutedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserPresenceChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleAddedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleRemovedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUnbanned") + .HasColumnType("bigint"); + + b.Property("UserUnbannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUpdated") + .HasColumnType("bigint"); + + b.Property("UserUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UsernameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoicePresenceChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LoggingV2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelDestroyedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EventCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogOtherId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogUserPresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceTTSId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("NicknameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ServerUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserBannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserJoinedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserLeftId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserMutedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleAddedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleRemovedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUnbannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UsernameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("LoggingV2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MessageCount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("Count") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RecentTimestamps") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("MessageCounts"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MultiGreet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteTime") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1); + + b.Property("Disabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GreetBots") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("WebhookUrl") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("MultiGreets"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlayerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AutoDisconnect") + .HasColumnType("integer"); + + b.Property("AutoPlay") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MusicChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("PlayerRepeat") + .HasColumnType("integer"); + + b.Property("Volume") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(100); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("MusicPlayerSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Author") + .HasColumnType("text"); + + b.Property("AuthorId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("IsDefault") + .HasColumnType("boolean"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("roles") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.NsfwBlacklitedTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Tag") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("NsfwBlacklitedTag"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.OwnerOnly", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CurrencyEmote") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GptTokensUsed") + .HasColumnType("integer"); + + b.Property("Owners") + .HasColumnType("text"); + + b.Property("RewardAmount") + .HasColumnType("integer"); + + b.Property("RewardTimeoutSeconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("OwnerOnly"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("NextId") + .HasColumnType("integer"); + + b.Property("PrimaryTarget") + .HasColumnType("integer"); + + b.Property("PrimaryTargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("SecondaryTarget") + .HasColumnType("integer"); + + b.Property("SecondaryTargetName") + .HasColumnType("text"); + + b.Property("State") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("IsCustomCommand") + .HasColumnType("boolean"); + + b.Property("PrimaryTarget") + .HasColumnType("integer"); + + b.Property("PrimaryTargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("SecondaryTarget") + .HasColumnType("integer"); + + b.Property("SecondaryTargetName") + .HasColumnType("text"); + + b.Property("State") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.PollAnswers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("PollsId") + .HasColumnType("integer"); + + b.Property("Text") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("PollsId"); + + b.ToTable("PollAnswer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollVote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("PollId") + .HasColumnType("integer"); + + b.Property("PollsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoteIndex") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PollsId"); + + b.ToTable("PollVote"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Polls", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("PollType") + .HasColumnType("integer"); + + b.Property("Question") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("Poll"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PublishUserBlacklist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("User") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("PublishUserBlacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PublishWordBlacklist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("PublishWordBlacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorId") + .HasColumnType("numeric(20,0)"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Keyword") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.Property("UseCount") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.HasIndex("Keyword"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmoteName") + .HasColumnType("text"); + + b.Property("ReactionRoleMessageId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ReactionRoleMessageId"); + + b.ToTable("ReactionRole"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Exclusive") + .HasColumnType("boolean"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("ReactionRoleMessage"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("IsPrivate") + .HasColumnType("boolean"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("ServerId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("When"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Interval") + .HasColumnType("text"); + + b.Property("LastMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("NoRedundant") + .HasColumnType("boolean"); + + b.Property("StartTimeOfDay") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleConnectionAuthStorage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RefreshToken") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Token") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AuthCodes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleGreet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteTime") + .HasColumnType("integer"); + + b.Property("Disabled") + .HasColumnType("boolean"); + + b.Property("GreetBots") + .HasColumnType("boolean"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("WebhookUrl") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("RoleGreets"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleMonitoringSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DefaultPunishmentAction") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("RoleMonitoringSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleStateSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClearOnBan") + .HasColumnType("boolean"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeniedRoles") + .HasColumnType("text"); + + b.Property("DeniedUsers") + .HasColumnType("text"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IgnoreBots") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("RoleStateSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RotatingPlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("RotatingStatus"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Group") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LevelRequirement") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ServerRecoveryStore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RecoveryKey") + .HasColumnType("text"); + + b.Property("TwoFactorKey") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("ServerRecoveryStore"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StarboardPosts", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("PostId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Starboard"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StatusRolesTable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("ReaddRemoved") + .HasColumnType("boolean"); + + b.Property("RemoveAdded") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("StatusChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("StatusEmbed") + .HasColumnType("text"); + + b.Property("ToAdd") + .HasColumnType("text"); + + b.Property("ToRemove") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("StatusRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleBlacklistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleBlacklistedUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AddRoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("FromRoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Keyword") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("StreamRoleSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleWhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleWhitelistedUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestThreads", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("SuggestThreads"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestVotes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmotePicked") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("SuggestVotes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestionsModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CurrentState") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmoteCount1") + .HasColumnType("integer"); + + b.Property("EmoteCount2") + .HasColumnType("integer"); + + b.Property("EmoteCount3") + .HasColumnType("integer"); + + b.Property("EmoteCount4") + .HasColumnType("integer"); + + b.Property("EmoteCount5") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeCount") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeUser") + .HasColumnType("numeric(20,0)"); + + b.Property("Suggestion") + .HasColumnType("text"); + + b.Property("SuggestionId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Suggestions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Template", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardedColor") + .HasColumnType("text"); + + b.Property("AwardedFontSize") + .HasColumnType("integer"); + + b.Property("AwardedX") + .HasColumnType("integer"); + + b.Property("AwardedY") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("OutputSizeX") + .HasColumnType("integer"); + + b.Property("OutputSizeY") + .HasColumnType("integer"); + + b.Property("ShowAwarded") + .HasColumnType("boolean"); + + b.Property("ShowTimeOnLevel") + .HasColumnType("boolean"); + + b.Property("TemplateBarId") + .HasColumnType("integer"); + + b.Property("TemplateClubId") + .HasColumnType("integer"); + + b.Property("TemplateGuildId") + .HasColumnType("integer"); + + b.Property("TemplateUserId") + .HasColumnType("integer"); + + b.Property("TimeOnLevelColor") + .HasColumnType("text"); + + b.Property("TimeOnLevelFontSize") + .HasColumnType("integer"); + + b.Property("TimeOnLevelFormat") + .HasColumnType("text"); + + b.Property("TimeOnLevelX") + .HasColumnType("integer"); + + b.Property("TimeOnLevelY") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TemplateBarId"); + + b.HasIndex("TemplateClubId"); + + b.HasIndex("TemplateGuildId"); + + b.HasIndex("TemplateUserId"); + + b.ToTable("Template"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateBar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BarColor") + .HasColumnType("text"); + + b.Property("BarDirection") + .HasColumnType("integer"); + + b.Property("BarLength") + .HasColumnType("integer"); + + b.Property("BarPointAx") + .HasColumnType("integer"); + + b.Property("BarPointAy") + .HasColumnType("integer"); + + b.Property("BarPointBx") + .HasColumnType("integer"); + + b.Property("BarPointBy") + .HasColumnType("integer"); + + b.Property("BarTransparency") + .HasColumnType("smallint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ShowBar") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateBar"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateClub", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClubIconSizeX") + .HasColumnType("integer"); + + b.Property("ClubIconSizeY") + .HasColumnType("integer"); + + b.Property("ClubIconX") + .HasColumnType("integer"); + + b.Property("ClubIconY") + .HasColumnType("integer"); + + b.Property("ClubNameColor") + .HasColumnType("text"); + + b.Property("ClubNameFontSize") + .HasColumnType("integer"); + + b.Property("ClubNameX") + .HasColumnType("integer"); + + b.Property("ClubNameY") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ShowClubIcon") + .HasColumnType("boolean"); + + b.Property("ShowClubName") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateClub"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateGuild", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildLevelColor") + .HasColumnType("text"); + + b.Property("GuildLevelFontSize") + .HasColumnType("integer"); + + b.Property("GuildLevelX") + .HasColumnType("integer"); + + b.Property("GuildLevelY") + .HasColumnType("integer"); + + b.Property("GuildRankColor") + .HasColumnType("text"); + + b.Property("GuildRankFontSize") + .HasColumnType("integer"); + + b.Property("GuildRankX") + .HasColumnType("integer"); + + b.Property("GuildRankY") + .HasColumnType("integer"); + + b.Property("ShowGuildLevel") + .HasColumnType("boolean"); + + b.Property("ShowGuildRank") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateGuild"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("FontSize") + .HasColumnType("integer"); + + b.Property("IconSizeX") + .HasColumnType("integer"); + + b.Property("IconSizeY") + .HasColumnType("integer"); + + b.Property("IconX") + .HasColumnType("integer"); + + b.Property("IconY") + .HasColumnType("integer"); + + b.Property("ShowIcon") + .HasColumnType("boolean"); + + b.Property("ShowText") + .HasColumnType("boolean"); + + b.Property("TextColor") + .HasColumnType("text"); + + b.Property("TextX") + .HasColumnType("integer"); + + b.Property("TextY") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("TemplateUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("TransactionHistory"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnbanTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UnbanAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnbanTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UnmuteAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnroleTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("UnbanAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnroleTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UserRoleStates", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("SavedRoles") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("UserRoleStates"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UserXpStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardedXp") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 307, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + 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("Mewdeko.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoiceChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.VoteRoles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Timer") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("VoteRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Votes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BotId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Votes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Warning", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Forgiven") + .HasColumnType("boolean"); + + b.Property("ForgivenBy") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Moderator") + .HasColumnType("text"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("DateAdded"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("Warnings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Warning2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Forgiven") + .HasColumnType("boolean"); + + b.Property("ForgivenBy") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Moderator") + .HasColumnType("text"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Warnings2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Punishment") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Punishment") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WhitelistedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("WhitelistedRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("WhitelistedUsers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpCurrencyReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("XpCurrencyReward"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpRoleReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId", "Level") + .IsUnique(); + + b.ToTable("XpRoleReward"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("NotifyMessage") + .HasColumnType("text"); + + b.Property("ServerExcluded") + .HasColumnType("boolean"); + + b.Property("XpRoleRewardExclusive") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("XpSettings"); + }); + + modelBuilder.Entity("TicketButton", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Emoji") + .IsRequired() + .HasColumnType("text"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("OpenMessage") + .IsRequired() + .HasColumnType("text"); + + b.Property("TicketPanelId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TicketPanelId"); + + b.ToTable("TicketButtons"); + }); + + modelBuilder.Entity("TicketPanel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageJson") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TicketPanels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiAltSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiAltSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiAltSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiMassMentionSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiMassMentionSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiRaidSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiRaidSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("Mewdeko.Database.Models.AntiMassMentionSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("AntiMassMentionSettingId"); + + b.HasOne("Mewdeko.Database.Models.AntiSpamSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiSpamSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandAlias", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandCooldown", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DelMsgOnCmdChannel", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("DelMsgOnCmdChannels") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ExcludedItem", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", null) + .WithMany("ExclusionList") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FeedSub", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FeedSubs") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterInvitesChannelIds", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterLinksChannelId", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterLinksChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterWordsChannelIds", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilteredWord", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FollowedStream", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GroupName", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("SelfAssignableRoleGroupNames") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildConfig", b => + { + b.HasOne("Mewdeko.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.Navigation("LogSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("Mewdeko.Database.Models.LogSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MutedUserId", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.NsfwBlacklitedTag", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("NsfwBlacklistedTags") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.HasOne("Mewdeko.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("Mewdeko.Database.Models.Permission", "NextId"); + + b.Navigation("Next"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permissionv2", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PlaylistSong", b => + { + b.HasOne("Mewdeko.Database.Models.MusicPlaylist", null) + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollAnswers", b => + { + b.HasOne("Mewdeko.Database.Models.Polls", null) + .WithMany("Answers") + .HasForeignKey("PollsId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollVote", b => + { + b.HasOne("Mewdeko.Database.Models.Polls", null) + .WithMany("Votes") + .HasForeignKey("PollsId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRole", b => + { + b.HasOne("Mewdeko.Database.Models.ReactionRoleMessage", null) + .WithMany("ReactionRoles") + .HasForeignKey("ReactionRoleMessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("ReactionRoleMessages") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Repeater", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleBlacklistedUser", b => + { + b.HasOne("Mewdeko.Database.Models.StreamRoleSettings", null) + .WithMany("Blacklist") + .HasForeignKey("StreamRoleSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("StreamRole") + .HasForeignKey("Mewdeko.Database.Models.StreamRoleSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleWhitelistedUser", b => + { + b.HasOne("Mewdeko.Database.Models.StreamRoleSettings", null) + .WithMany("Whitelist") + .HasForeignKey("StreamRoleSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Template", b => + { + b.HasOne("Mewdeko.Database.Models.TemplateBar", "TemplateBar") + .WithMany() + .HasForeignKey("TemplateBarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateClub", "TemplateClub") + .WithMany() + .HasForeignKey("TemplateClubId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateGuild", "TemplateGuild") + .WithMany() + .HasForeignKey("TemplateGuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateUser", "TemplateUser") + .WithMany() + .HasForeignKey("TemplateUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TemplateBar"); + + b.Navigation("TemplateClub"); + + b.Navigation("TemplateGuild"); + + b.Navigation("TemplateUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnbanTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnbanTimer") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnmuteTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnroleTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnroleTimer") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.VcRoleInfo", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("WarnPunishments") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment2", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("WarnPunishments2") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpCurrencyReward", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", "XpSettings") + .WithMany("CurrencyRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpRoleReward", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", "XpSettings") + .WithMany("RoleRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("XpSettings") + .HasForeignKey("Mewdeko.Database.Models.XpSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TicketButton", b => + { + b.HasOne("TicketPanel", null) + .WithMany("Buttons") + .HasForeignKey("TicketPanelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildConfig", b => + { + b.Navigation("AntiAltSetting") + .IsRequired(); + + b.Navigation("AntiMassMentionSetting") + .IsRequired(); + + b.Navigation("AntiRaidSetting") + .IsRequired(); + + b.Navigation("AntiSpamSetting") + .IsRequired(); + + 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("GuildRepeaters"); + + b.Navigation("MutedUsers"); + + b.Navigation("NsfwBlacklistedTags"); + + b.Navigation("Permissions"); + + b.Navigation("ReactionRoleMessages"); + + b.Navigation("SelfAssignableRoleGroupNames"); + + b.Navigation("StreamRole"); + + b.Navigation("UnbanTimer"); + + b.Navigation("UnmuteTimers"); + + b.Navigation("UnroleTimer"); + + b.Navigation("VcRoleInfos"); + + b.Navigation("WarnPunishments"); + + b.Navigation("WarnPunishments2"); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LogSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlaylist", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.Navigation("Previous") + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Polls", b => + { + b.Navigation("Answers"); + + b.Navigation("Votes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.Navigation("ReactionRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.Navigation("Blacklist"); + + b.Navigation("Whitelist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.Navigation("CurrencyRewards"); + + b.Navigation("ExclusionList"); + + b.Navigation("RoleRewards"); + }); + + modelBuilder.Entity("TicketPanel", b => + { + b.Navigation("Buttons"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.cs b/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.cs new file mode 100644 index 000000000..a31c15fc3 --- /dev/null +++ b/src/Mewdeko/Database/Migrations/PostgreSql/20241013145247_Invites.cs @@ -0,0 +1,58 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mewdeko.Database.Migrations.PostgreSql +{ + /// + public partial class Invites : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "InviteCounts", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "numeric(20,0)", nullable: false), + GuildId = table.Column(type: "numeric(20,0)", nullable: false), + Count = table.Column(type: "integer", nullable: false), + DateAdded = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_InviteCounts", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "InvitedBy", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column(type: "numeric(20,0)", nullable: false), + InviterId = table.Column(type: "numeric(20,0)", nullable: false), + GuildId = table.Column(type: "numeric(20,0)", nullable: false), + DateAdded = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_InvitedBy", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "InviteCounts"); + + migrationBuilder.DropTable( + name: "InvitedBy"); + } + } +} diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.Designer.cs b/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.Designer.cs new file mode 100644 index 000000000..fe415dfa0 --- /dev/null +++ b/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.Designer.cs @@ -0,0 +1,4678 @@ +// +using System; +using Mewdeko.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mewdeko.Database.Migrations.PostgreSql +{ + [DbContext(typeof(MewdekoPostgresContext))] + [Migration("20241013204914_InviteCountSettings")] + partial class InviteCountSettings + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Mewdeko.Database.Models.Afk", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("WasTimed") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.ToTable("AFK"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiAltSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("ActionDurationMinutes") + .HasColumnType("integer"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("MinAge") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiAltSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("IgnoreBots") + .HasColumnType("boolean"); + + b.Property("MaxMentionsInTimeWindow") + .HasColumnType("integer"); + + b.Property("MentionThreshold") + .HasColumnType("integer"); + + b.Property("MuteTime") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("TimeWindowSeconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiMassMentionSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AntiMassMentionSettingId") + .HasColumnType("integer"); + + b.Property("AntiSpamSettingId") + .HasColumnType("integer"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("AntiMassMentionSettingId"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("MessageThreshold") + .HasColumnType("integer"); + + b.Property("MuteTime") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoBanEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("AutoBanWords"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoBanRoles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AutoBanRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoCommand", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelName") + .HasColumnType("text"); + + b.Property("CommandText") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildName") + .HasColumnType("text"); + + b.Property("Interval") + .HasColumnType("integer"); + + b.Property("VoiceChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoiceChannelName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("AutoCommands"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AutoPublish", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BlacklistedUsers") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AutoPublish"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BanTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Text") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("BanTemplates"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ItemId") + .HasColumnType("numeric(20,0)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Blacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistedPermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Permission") + .HasColumnType("numeric(20,0)"); + + b.Property("PunishmentAction") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("BlacklistedPermissions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BlacklistedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("PunishmentAction") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("BlacklistedRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.BotReviews", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Review") + .IsRequired() + .HasColumnType("text"); + + b.Property("Stars") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("BotReviews"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ChatTriggers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowTarget") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ApplicationCommandDescription") + .HasColumnType("text"); + + b.Property("ApplicationCommandId") + .HasColumnType("numeric(20,0)"); + + b.Property("ApplicationCommandName") + .HasColumnType("text"); + + b.Property("ApplicationCommandType") + .HasColumnType("integer"); + + b.Property("AutoDeleteTrigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ContainsAnywhere") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("CrosspostingChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("CrosspostingWebhookUrl") + .HasColumnType("text"); + + b.Property("CustomPrefix") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DmResponse") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("EphemeralResponse") + .HasColumnType("boolean"); + + b.Property("GrantedRoles") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsRegex") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("NoRespond") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("OwnerOnly") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("PrefixType") + .HasColumnType("integer"); + + b.Property("ReactToTrigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Reactions") + .HasColumnType("text"); + + b.Property("RemovedRoles") + .HasColumnType("text"); + + b.Property("Response") + .HasColumnType("text"); + + b.Property("RoleGrantType") + .HasColumnType("integer"); + + b.Property("Trigger") + .HasColumnType("text"); + + b.Property("UseCount") + .HasColumnType("numeric(20,0)"); + + b.Property("ValidTriggerTypes") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ChatTriggers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CommandName") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Seconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsSlash") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Module") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasDefaultValue(""); + + b.Property("NameOrId") + .HasColumnType("text"); + + b.Property("Trigger") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("CommandStats"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Confessions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessNumber") + .HasColumnType("numeric(20,0)"); + + b.Property("Confession") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Confessions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DelMsgOnCmdChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("State") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("DelMsgOnCmdChannel"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DiscordPermOverride", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Command") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Perm") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "Command") + .IsUnique(); + + b.ToTable("DiscordPermOverrides"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarId") + .HasColumnType("text"); + + b.Property("Bio") + .HasColumnType("text"); + + b.Property("Birthday") + .HasColumnType("timestamp without time zone"); + + b.Property("BirthdayDisplayMode") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Discriminator") + .HasColumnType("text"); + + b.Property("IsClubAdmin") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("IsDragon") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 305, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("ProfileColor") + .HasColumnType("bigint"); + + b.Property("ProfileImageUrl") + .HasColumnType("text"); + + b.Property("ProfilePrivacy") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("Pronouns") + .HasColumnType("text"); + + b.Property("PronounsClearedReason") + .HasColumnType("text"); + + b.Property("PronounsDisabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StatsOptOut") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SwitchFriendCode") + .HasColumnType("text"); + + b.Property("TotalXp") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.Property("ZodiacSign") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.HasIndex("TotalXp"); + + b.HasIndex("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ExcludedItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ItemId") + .HasColumnType("numeric(20,0)"); + + b.Property("ItemType") + .HasColumnType("integer"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("ExcludedItem"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FeedSub", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasAlternateKey("GuildConfigId", "Url"); + + b.ToTable("FeedSub"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterInvitesChannelIds", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterInvitesChannelIds"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterLinksChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterLinksChannelId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterWordsChannelIds", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilterWordsChannelIds"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + 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("Mewdeko.Database.Models.GiveawayUsers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GiveawayId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GiveawayUsers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Giveaways", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BlacklistRoles") + .HasColumnType("text"); + + b.Property("BlacklistUsers") + .HasColumnType("text"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Emote") + .HasColumnType("text"); + + b.Property("Ended") + .HasColumnType("integer"); + + b.Property("Item") + .HasColumnType("text"); + + b.Property("MessageCountReq") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("RestrictTo") + .HasColumnType("text"); + + b.Property("ServerId") + .HasColumnType("numeric(20,0)"); + + b.Property("UseButton") + .HasColumnType("boolean"); + + b.Property("UseCaptcha") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.Property("Winners") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Giveaways"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GlobalUserBalance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Balance") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GlobalUserBalance"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GroupName", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AcceptChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("AcceptMessage") + .HasColumnType("text"); + + b.Property("AfkDel") + .HasColumnType("text"); + + b.Property("AfkDisabledChannels") + .HasColumnType("text"); + + b.Property("AfkLength") + .HasColumnType("integer"); + + b.Property("AfkMessage") + .HasColumnType("text"); + + b.Property("AfkTimeout") + .HasColumnType("integer"); + + b.Property("AfkType") + .HasColumnType("integer"); + + b.Property("ArchiveOnAccept") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnConsider") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnDeny") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("ArchiveOnImplement") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("AutoAssignRoleId") + .HasColumnType("text"); + + b.Property("AutoBotRoleIds") + .HasColumnType("text"); + + b.Property("AutoDeleteByeMessages") + .HasColumnType("boolean"); + + b.Property("AutoDeleteByeMessagesTimer") + .HasColumnType("integer"); + + b.Property("AutoDeleteGreetMessages") + .HasColumnType("boolean"); + + b.Property("AutoDeleteGreetMessagesTimer") + .HasColumnType("integer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages") + .HasColumnType("boolean"); + + b.Property("BoostMessage") + .HasColumnType("text"); + + b.Property("BoostMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("BoostMessageDeleteAfter") + .HasColumnType("integer"); + + b.Property("ButtonRepostThreshold") + .HasColumnType("integer"); + + b.Property("ByeMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelByeMessageText") + .HasColumnType("text"); + + b.Property("ChannelGreetMessageText") + .HasColumnType("text"); + + b.Property("CleverbotChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("CommandLogChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessionBlacklist") + .HasColumnType("text"); + + b.Property("ConfessionChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConfessionLogChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConsiderChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ConsiderMessage") + .HasColumnType("text"); + + b.Property("CurrencyEmoji") + .HasColumnType("text"); + + b.Property("CurrencyName") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteMessageOnCommand") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("DenyChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("DenyMessage") + .HasColumnType("text"); + + b.Property("DmGreetMessageText") + .HasColumnType("text"); + + b.Property("DmOnGiveawayWin") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("Emote1Style") + .HasColumnType("integer"); + + b.Property("Emote2Style") + .HasColumnType("integer"); + + b.Property("Emote3Style") + .HasColumnType("integer"); + + b.Property("Emote4Style") + .HasColumnType("integer"); + + b.Property("Emote5Style") + .HasColumnType("integer"); + + b.Property("EmoteMode") + .HasColumnType("integer"); + + b.Property("ExclusiveSelfAssignedRoles") + .HasColumnType("boolean"); + + b.Property("FilterInvites") + .HasColumnType("boolean"); + + b.Property("FilterLinks") + .HasColumnType("boolean"); + + b.Property("FilterWords") + .HasColumnType("boolean"); + + b.Property("GBAction") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GBEnabled") + .HasColumnType("integer"); + + b.Property("GEndMessage") + .HasColumnType("text"); + + b.Property("GRolesBlacklist") + .HasColumnType("text"); + + b.Property("GStartMessage") + .HasColumnType("text"); + + b.Property("GUsersBlacklist") + .HasColumnType("text"); + + b.Property("GWinMessage") + .HasColumnType("text"); + + b.Property("GameMasterRole") + .HasColumnType("numeric(20,0)"); + + b.Property("GameVoiceChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("GiveawayBanner") + .HasColumnType("text"); + + b.Property("GiveawayEmbedColor") + .HasColumnType("text"); + + b.Property("GiveawayEmote") + .HasColumnType("text"); + + b.Property("GiveawayEndMessage") + .HasColumnType("text"); + + b.Property("GiveawayPingRole") + .HasColumnType("numeric(20,0)"); + + b.Property("GiveawayWinEmbedColor") + .HasColumnType("text"); + + b.Property("GreetHook") + .HasColumnType("text"); + + b.Property("GreetMessageChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("ImplementChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("ImplementMessage") + .HasColumnType("text"); + + b.Property("JoinGraphColor") + .HasColumnType("bigint"); + + b.Property("Joins") + .HasColumnType("numeric(20,0)"); + + b.Property("LeaveGraphColor") + .HasColumnType("bigint"); + + b.Property("LeaveHook") + .HasColumnType("text"); + + b.Property("Leaves") + .HasColumnType("numeric(20,0)"); + + b.Property("Locale") + .HasColumnType("text"); + + b.Property("LogSettingId") + .HasColumnType("integer"); + + b.Property("MaxSuggestLength") + .HasColumnType("integer"); + + b.Property("MemberRole") + .HasColumnType("numeric(20,0)"); + + b.Property("MinMessageLength") + .HasColumnType("integer"); + + b.Property("MinSuggestLength") + .HasColumnType("integer"); + + b.Property("MiniWarnlogChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("MultiGreetType") + .HasColumnType("integer"); + + b.Property("MuteRoleName") + .HasColumnType("text"); + + b.Property("NotifyStreamOffline") + .HasColumnType("boolean"); + + b.Property("PermissionRole") + .HasColumnType("text"); + + b.Property("Prefix") + .HasColumnType("text"); + + b.Property("PreviewLinks") + .HasColumnType("integer"); + + b.Property("ReactChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("RepostThreshold") + .HasColumnType("integer"); + + b.Property("RewardAmount") + .HasColumnType("integer"); + + b.Property("RewardTimeoutSeconds") + .HasColumnType("integer"); + + b.Property("SendBoostMessage") + .HasColumnType("boolean"); + + b.Property("SendChannelByeMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SendChannelGreetMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SendDmGreetMessage") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StaffRole") + .HasColumnType("numeric(20,0)"); + + b.Property("Star2") + .HasColumnType("text"); + + b.Property("StarboardAllowBots") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StarboardChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("StarboardCheckChannels") + .HasColumnType("text"); + + b.Property("StarboardRemoveOnBelowThreshold") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("StarboardRemoveOnDelete") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("StarboardRemoveOnReactionsClear") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("Stars") + .HasColumnType("integer"); + + b.Property("StatsOptOut") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("SuggestButtonChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("SuggestButtonColor") + .HasColumnType("integer"); + + b.Property("SuggestButtonEmote") + .HasColumnType("text"); + + b.Property("SuggestButtonMessage") + .HasColumnType("text"); + + b.Property("SuggestButtonMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("SuggestButtonName") + .HasColumnType("text"); + + b.Property("SuggestButtonRepostThreshold") + .HasColumnType("integer"); + + b.Property("SuggestCommandsType") + .HasColumnType("integer"); + + b.Property("SuggestEmotes") + .HasColumnType("text"); + + b.Property("SuggestMessage") + .HasColumnType("text"); + + b.Property("SuggestionThreadType") + .HasColumnType("integer"); + + b.Property("TOpenMessage") + .HasColumnType("text"); + + b.Property("TicketCategory") + .HasColumnType("numeric(20,0)"); + + b.Property("TicketChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("TimeZoneId") + .HasColumnType("text"); + + b.Property("UseMessageCount") + .HasColumnType("boolean"); + + b.Property("UseStarboardBlacklist") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(true); + + b.Property("VerboseErrors") + .HasColumnType("boolean"); + + b.Property("VerbosePermissions") + .HasColumnType("boolean"); + + b.Property("VoteEmbed") + .HasColumnType("text"); + + b.Property("VotesChannel") + .HasColumnType("numeric(20,0)"); + + b.Property("VotesPassword") + .HasColumnType("text"); + + b.Property("WarnExpireAction") + .HasColumnType("integer"); + + b.Property("WarnExpireHours") + .HasColumnType("integer"); + + b.Property("WarnMessage") + .HasColumnType("text"); + + b.Property("WarningsInitialized") + .HasColumnType("boolean"); + + b.Property("WarnlogChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("XpImgUrl") + .HasColumnType("text"); + + b.Property("XpTxtRate") + .HasColumnType("integer"); + + b.Property("XpTxtTimeout") + .HasColumnType("integer"); + + b.Property("XpVoiceRate") + .HasColumnType("integer"); + + b.Property("XpVoiceTimeout") + .HasColumnType("integer"); + + b.Property("fwarn") + .HasColumnType("integer"); + + b.Property("invwarn") + .HasColumnType("integer"); + + b.Property("removeroles") + .HasColumnType("integer"); + + b.Property("snipeset") + .HasColumnType("boolean"); + + b.Property("sugchan") + .HasColumnType("numeric(20,0)"); + + b.Property("sugnum") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("WarnExpireHours"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildUserBalance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Balance") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("GuildUserBalance"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.HighlightSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("HighlightsOn") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("IgnoredChannels") + .HasColumnType("text"); + + b.Property("IgnoredUsers") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("HighlightSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Highlights", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Highlights"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("LogSettingId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InviteCount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InviteCounts"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InviteCountSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MinAccountAge") + .HasColumnType("interval"); + + b.Property("RemoveInviteOnLeave") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("InviteCountSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InvitedBy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("InviterId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InvitedBy"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.JoinLeaveLogs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsJoin") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("JoinLeaveLogs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LocalBotInstances", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BotUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.ToTable("BotInstances"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LockdownChannelPermissions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowPermissions") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DenyPermissions") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("TargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("TargetType") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("LockdownChannelPermissions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelCreated") + .HasColumnType("bigint"); + + b.Property("ChannelCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelDestroyed") + .HasColumnType("bigint"); + + b.Property("ChannelDestroyedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelUpdated") + .HasColumnType("bigint"); + + b.Property("ChannelUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EventCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsLogging") + .HasColumnType("bigint"); + + b.Property("LogOtherId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogUserPresence") + .HasColumnType("bigint"); + + b.Property("LogUserPresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresence") + .HasColumnType("bigint"); + + b.Property("LogVoicePresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceTTSId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageDeleted") + .HasColumnType("bigint"); + + b.Property("MessageDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageUpdated") + .HasColumnType("bigint"); + + b.Property("MessageUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("NicknameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ServerUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserBanned") + .HasColumnType("bigint"); + + b.Property("UserBannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserJoined") + .HasColumnType("bigint"); + + b.Property("UserJoinedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserLeft") + .HasColumnType("bigint"); + + b.Property("UserLeftId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserMutedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserPresenceChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleAddedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleRemovedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUnbanned") + .HasColumnType("bigint"); + + b.Property("UserUnbannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUpdated") + .HasColumnType("bigint"); + + b.Property("UserUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UsernameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoicePresenceChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LoggingV2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AvatarUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelDestroyedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EventCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogOtherId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogUserPresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceId") + .HasColumnType("numeric(20,0)"); + + b.Property("LogVoicePresenceTTSId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("NicknameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ServerUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadCreatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadDeletedId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserBannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserJoinedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserLeftId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserMutedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleAddedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserRoleRemovedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUnbannedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.Property("UsernameUpdatedId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("LoggingV2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MessageCount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("Count") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RecentTimestamps") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("MessageCounts"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MultiGreet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteTime") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(1); + + b.Property("Disabled") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GreetBots") + .ValueGeneratedOnAdd() + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("WebhookUrl") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("MultiGreets"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlayerSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AutoDisconnect") + .HasColumnType("integer"); + + b.Property("AutoPlay") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MusicChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("PlayerRepeat") + .HasColumnType("integer"); + + b.Property("Volume") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(100); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("MusicPlayerSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Author") + .HasColumnType("text"); + + b.Property("AuthorId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("IsDefault") + .HasColumnType("boolean"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("roles") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.NsfwBlacklitedTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Tag") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("NsfwBlacklitedTag"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.OwnerOnly", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CurrencyEmote") + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GptTokensUsed") + .HasColumnType("integer"); + + b.Property("Owners") + .HasColumnType("text"); + + b.Property("RewardAmount") + .HasColumnType("integer"); + + b.Property("RewardTimeoutSeconds") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("OwnerOnly"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("NextId") + .HasColumnType("integer"); + + b.Property("PrimaryTarget") + .HasColumnType("integer"); + + b.Property("PrimaryTargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("SecondaryTarget") + .HasColumnType("integer"); + + b.Property("SecondaryTargetName") + .HasColumnType("text"); + + b.Property("State") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("IsCustomCommand") + .HasColumnType("boolean"); + + b.Property("PrimaryTarget") + .HasColumnType("integer"); + + b.Property("PrimaryTargetId") + .HasColumnType("numeric(20,0)"); + + b.Property("SecondaryTarget") + .HasColumnType("integer"); + + b.Property("SecondaryTargetName") + .HasColumnType("text"); + + b.Property("State") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + 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("Mewdeko.Database.Models.PollAnswers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("PollsId") + .HasColumnType("integer"); + + b.Property("Text") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("PollsId"); + + b.ToTable("PollAnswer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollVote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("PollId") + .HasColumnType("integer"); + + b.Property("PollsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoteIndex") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PollsId"); + + b.ToTable("PollVote"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Polls", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("PollType") + .HasColumnType("integer"); + + b.Property("Question") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.ToTable("Poll"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PublishUserBlacklist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("User") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("PublishUserBlacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PublishWordBlacklist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Word") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("PublishWordBlacklist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorId") + .HasColumnType("numeric(20,0)"); + + b.Property("AuthorName") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Keyword") + .IsRequired() + .HasColumnType("text"); + + b.Property("Text") + .IsRequired() + .HasColumnType("text"); + + b.Property("UseCount") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.HasIndex("Keyword"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmoteName") + .HasColumnType("text"); + + b.Property("ReactionRoleMessageId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ReactionRoleMessageId"); + + b.ToTable("ReactionRole"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Exclusive") + .HasColumnType("boolean"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("ReactionRoleMessage"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("IsPrivate") + .HasColumnType("boolean"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("ServerId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("When") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("When"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Interval") + .HasColumnType("text"); + + b.Property("LastMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("NoRedundant") + .HasColumnType("boolean"); + + b.Property("StartTimeOfDay") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleConnectionAuthStorage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp without time zone"); + + b.Property("RefreshToken") + .HasColumnType("text"); + + b.Property("Scopes") + .HasColumnType("text"); + + b.Property("Token") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("AuthCodes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleGreet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeleteTime") + .HasColumnType("integer"); + + b.Property("Disabled") + .HasColumnType("boolean"); + + b.Property("GreetBots") + .HasColumnType("boolean"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("WebhookUrl") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("RoleGreets"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleMonitoringSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DefaultPunishmentAction") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("RoleMonitoringSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RoleStateSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClearOnBan") + .HasColumnType("boolean"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("DeniedRoles") + .HasColumnType("text"); + + b.Property("DeniedUsers") + .HasColumnType("text"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IgnoreBots") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("RoleStateSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.RotatingPlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("RotatingStatus"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Group") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LevelRequirement") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ServerRecoveryStore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RecoveryKey") + .HasColumnType("text"); + + b.Property("TwoFactorKey") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("ServerRecoveryStore"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StarboardPosts", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("PostId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Starboard"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StatusRolesTable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("ReaddRemoved") + .HasColumnType("boolean"); + + b.Property("RemoveAdded") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("text"); + + b.Property("StatusChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("StatusEmbed") + .HasColumnType("text"); + + b.Property("ToAdd") + .HasColumnType("text"); + + b.Property("ToRemove") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("StatusRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleBlacklistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleBlacklistedUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AddRoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("FromRoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Keyword") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("StreamRoleSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleWhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("StreamRoleSettingsId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("Username") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("StreamRoleSettingsId"); + + b.ToTable("StreamRoleWhitelistedUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestThreads", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("ThreadChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("SuggestThreads"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestVotes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmotePicked") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("SuggestVotes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.SuggestionsModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CurrentState") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("EmoteCount1") + .HasColumnType("integer"); + + b.Property("EmoteCount2") + .HasColumnType("integer"); + + b.Property("EmoteCount3") + .HasColumnType("integer"); + + b.Property("EmoteCount4") + .HasColumnType("integer"); + + b.Property("EmoteCount5") + .HasColumnType("integer"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeCount") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeMessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("StateChangeUser") + .HasColumnType("numeric(20,0)"); + + b.Property("Suggestion") + .HasColumnType("text"); + + b.Property("SuggestionId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Suggestions"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Template", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardedColor") + .HasColumnType("text"); + + b.Property("AwardedFontSize") + .HasColumnType("integer"); + + b.Property("AwardedX") + .HasColumnType("integer"); + + b.Property("AwardedY") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("OutputSizeX") + .HasColumnType("integer"); + + b.Property("OutputSizeY") + .HasColumnType("integer"); + + b.Property("ShowAwarded") + .HasColumnType("boolean"); + + b.Property("ShowTimeOnLevel") + .HasColumnType("boolean"); + + b.Property("TemplateBarId") + .HasColumnType("integer"); + + b.Property("TemplateClubId") + .HasColumnType("integer"); + + b.Property("TemplateGuildId") + .HasColumnType("integer"); + + b.Property("TemplateUserId") + .HasColumnType("integer"); + + b.Property("TimeOnLevelColor") + .HasColumnType("text"); + + b.Property("TimeOnLevelFontSize") + .HasColumnType("integer"); + + b.Property("TimeOnLevelFormat") + .HasColumnType("text"); + + b.Property("TimeOnLevelX") + .HasColumnType("integer"); + + b.Property("TimeOnLevelY") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TemplateBarId"); + + b.HasIndex("TemplateClubId"); + + b.HasIndex("TemplateGuildId"); + + b.HasIndex("TemplateUserId"); + + b.ToTable("Template"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateBar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BarColor") + .HasColumnType("text"); + + b.Property("BarDirection") + .HasColumnType("integer"); + + b.Property("BarLength") + .HasColumnType("integer"); + + b.Property("BarPointAx") + .HasColumnType("integer"); + + b.Property("BarPointAy") + .HasColumnType("integer"); + + b.Property("BarPointBx") + .HasColumnType("integer"); + + b.Property("BarPointBy") + .HasColumnType("integer"); + + b.Property("BarTransparency") + .HasColumnType("smallint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ShowBar") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateBar"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateClub", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClubIconSizeX") + .HasColumnType("integer"); + + b.Property("ClubIconSizeY") + .HasColumnType("integer"); + + b.Property("ClubIconX") + .HasColumnType("integer"); + + b.Property("ClubIconY") + .HasColumnType("integer"); + + b.Property("ClubNameColor") + .HasColumnType("text"); + + b.Property("ClubNameFontSize") + .HasColumnType("integer"); + + b.Property("ClubNameX") + .HasColumnType("integer"); + + b.Property("ClubNameY") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("ShowClubIcon") + .HasColumnType("boolean"); + + b.Property("ShowClubName") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateClub"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateGuild", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildLevelColor") + .HasColumnType("text"); + + b.Property("GuildLevelFontSize") + .HasColumnType("integer"); + + b.Property("GuildLevelX") + .HasColumnType("integer"); + + b.Property("GuildLevelY") + .HasColumnType("integer"); + + b.Property("GuildRankColor") + .HasColumnType("text"); + + b.Property("GuildRankFontSize") + .HasColumnType("integer"); + + b.Property("GuildRankX") + .HasColumnType("integer"); + + b.Property("GuildRankY") + .HasColumnType("integer"); + + b.Property("ShowGuildLevel") + .HasColumnType("boolean"); + + b.Property("ShowGuildRank") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("TemplateGuild"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TemplateUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("FontSize") + .HasColumnType("integer"); + + b.Property("IconSizeX") + .HasColumnType("integer"); + + b.Property("IconSizeY") + .HasColumnType("integer"); + + b.Property("IconX") + .HasColumnType("integer"); + + b.Property("IconY") + .HasColumnType("integer"); + + b.Property("ShowIcon") + .HasColumnType("boolean"); + + b.Property("ShowText") + .HasColumnType("boolean"); + + b.Property("TextColor") + .HasColumnType("text"); + + b.Property("TextX") + .HasColumnType("integer"); + + b.Property("TextY") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("TemplateUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.TransactionHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasColumnType("bigint"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("TransactionHistory"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnbanTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UnbanAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnbanTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("UnmuteAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnroleTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("UnbanAt") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnroleTimer"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UserRoleStates", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("SavedRoles") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("UserRoleStates"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UserXpStats", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AwardedXp") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("LastLevelUp") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp without time zone") + .HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 307, DateTimeKind.Local)); + + b.Property("NotifyOnLevelUp") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + 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("Mewdeko.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("VoiceChannelId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.VoteRoles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Timer") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("VoteRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Votes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BotId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Votes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Warning", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Forgiven") + .HasColumnType("boolean"); + + b.Property("ForgivenBy") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Moderator") + .HasColumnType("text"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("DateAdded"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("Warnings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Warning2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Forgiven") + .HasColumnType("boolean"); + + b.Property("ForgivenBy") + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Moderator") + .HasColumnType("text"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("Warnings2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Punishment") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("Punishment") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("WarningPunishment2"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WhitelistedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("WhitelistedRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WhitelistedUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("WhitelistedUsers"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpCurrencyReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Amount") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId"); + + b.ToTable("XpCurrencyReward"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpRoleReward", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("XpSettingsId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("XpSettingsId", "Level") + .IsUnique(); + + b.ToTable("XpRoleReward"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildConfigId") + .HasColumnType("integer"); + + b.Property("NotifyMessage") + .HasColumnType("text"); + + b.Property("ServerExcluded") + .HasColumnType("boolean"); + + b.Property("XpRoleRewardExclusive") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("XpSettings"); + }); + + modelBuilder.Entity("TicketButton", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("Emoji") + .IsRequired() + .HasColumnType("text"); + + b.Property("Label") + .IsRequired() + .HasColumnType("text"); + + b.Property("OpenMessage") + .IsRequired() + .HasColumnType("text"); + + b.Property("TicketPanelId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TicketPanelId"); + + b.ToTable("TicketButtons"); + }); + + modelBuilder.Entity("TicketPanel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageJson") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TicketPanels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiAltSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiAltSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiAltSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiMassMentionSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiMassMentionSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiRaidSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiRaidSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("Mewdeko.Database.Models.AntiMassMentionSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("AntiMassMentionSettingId"); + + b.HasOne("Mewdeko.Database.Models.AntiSpamSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("AntiSpamSetting") + .HasForeignKey("Mewdeko.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandAlias", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.CommandCooldown", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.DelMsgOnCmdChannel", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("DelMsgOnCmdChannels") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ExcludedItem", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", null) + .WithMany("ExclusionList") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FeedSub", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FeedSubs") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterInvitesChannelIds", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterLinksChannelId", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterLinksChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilterWordsChannelIds", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FilteredWord", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.FollowedStream", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GroupName", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("SelfAssignableRoleGroupNames") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildConfig", b => + { + b.HasOne("Mewdeko.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.Navigation("LogSetting"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("Mewdeko.Database.Models.LogSetting", null) + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MutedUserId", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.NsfwBlacklitedTag", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("NsfwBlacklistedTags") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.HasOne("Mewdeko.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("Mewdeko.Database.Models.Permission", "NextId"); + + b.Navigation("Next"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permissionv2", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PlaylistSong", b => + { + b.HasOne("Mewdeko.Database.Models.MusicPlaylist", null) + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollAnswers", b => + { + b.HasOne("Mewdeko.Database.Models.Polls", null) + .WithMany("Answers") + .HasForeignKey("PollsId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.PollVote", b => + { + b.HasOne("Mewdeko.Database.Models.Polls", null) + .WithMany("Votes") + .HasForeignKey("PollsId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRole", b => + { + b.HasOne("Mewdeko.Database.Models.ReactionRoleMessage", null) + .WithMany("ReactionRoles") + .HasForeignKey("ReactionRoleMessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("ReactionRoleMessages") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Repeater", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleBlacklistedUser", b => + { + b.HasOne("Mewdeko.Database.Models.StreamRoleSettings", null) + .WithMany("Blacklist") + .HasForeignKey("StreamRoleSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("StreamRole") + .HasForeignKey("Mewdeko.Database.Models.StreamRoleSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleWhitelistedUser", b => + { + b.HasOne("Mewdeko.Database.Models.StreamRoleSettings", null) + .WithMany("Whitelist") + .HasForeignKey("StreamRoleSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Template", b => + { + b.HasOne("Mewdeko.Database.Models.TemplateBar", "TemplateBar") + .WithMany() + .HasForeignKey("TemplateBarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateClub", "TemplateClub") + .WithMany() + .HasForeignKey("TemplateClubId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateGuild", "TemplateGuild") + .WithMany() + .HasForeignKey("TemplateGuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Mewdeko.Database.Models.TemplateUser", "TemplateUser") + .WithMany() + .HasForeignKey("TemplateUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TemplateBar"); + + b.Navigation("TemplateClub"); + + b.Navigation("TemplateGuild"); + + b.Navigation("TemplateUser"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnbanTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnbanTimer") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnmuteTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.UnroleTimer", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("UnroleTimer") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.VcRoleInfo", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("WarnPunishments") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.WarningPunishment2", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithMany("WarnPunishments2") + .HasForeignKey("GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpCurrencyReward", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", "XpSettings") + .WithMany("CurrencyRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpRoleReward", b => + { + b.HasOne("Mewdeko.Database.Models.XpSettings", "XpSettings") + .WithMany("RoleRewards") + .HasForeignKey("XpSettingsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.HasOne("Mewdeko.Database.Models.GuildConfig", null) + .WithOne("XpSettings") + .HasForeignKey("Mewdeko.Database.Models.XpSettings", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TicketButton", b => + { + b.HasOne("TicketPanel", null) + .WithMany("Buttons") + .HasForeignKey("TicketPanelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiMassMentionSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.AntiSpamSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.GuildConfig", b => + { + b.Navigation("AntiAltSetting") + .IsRequired(); + + b.Navigation("AntiMassMentionSetting") + .IsRequired(); + + b.Navigation("AntiRaidSetting") + .IsRequired(); + + b.Navigation("AntiSpamSetting") + .IsRequired(); + + 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("GuildRepeaters"); + + b.Navigation("MutedUsers"); + + b.Navigation("NsfwBlacklistedTags"); + + b.Navigation("Permissions"); + + b.Navigation("ReactionRoleMessages"); + + b.Navigation("SelfAssignableRoleGroupNames"); + + b.Navigation("StreamRole"); + + b.Navigation("UnbanTimer"); + + b.Navigation("UnmuteTimers"); + + b.Navigation("UnroleTimer"); + + b.Navigation("VcRoleInfos"); + + b.Navigation("WarnPunishments"); + + b.Navigation("WarnPunishments2"); + + b.Navigation("XpSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.LogSetting", b => + { + b.Navigation("IgnoredChannels"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.MusicPlaylist", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Permission", b => + { + b.Navigation("Previous") + .IsRequired(); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.Polls", b => + { + b.Navigation("Answers"); + + b.Navigation("Votes"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.ReactionRoleMessage", b => + { + b.Navigation("ReactionRoles"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.StreamRoleSettings", b => + { + b.Navigation("Blacklist"); + + b.Navigation("Whitelist"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.XpSettings", b => + { + b.Navigation("CurrencyRewards"); + + b.Navigation("ExclusionList"); + + b.Navigation("RoleRewards"); + }); + + modelBuilder.Entity("TicketPanel", b => + { + b.Navigation("Buttons"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.cs b/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.cs new file mode 100644 index 000000000..9398be954 --- /dev/null +++ b/src/Mewdeko/Database/Migrations/PostgreSql/20241013204914_InviteCountSettings.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Mewdeko.Database.Migrations.PostgreSql +{ + /// + public partial class InviteCountSettings : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "InviteCountSettings", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + GuildId = table.Column(type: "numeric(20,0)", nullable: false), + RemoveInviteOnLeave = table.Column(type: "boolean", nullable: false), + MinAccountAge = table.Column(type: "interval", nullable: false), + IsEnabled = table.Column(type: "boolean", nullable: false), + DateAdded = table.Column(type: "timestamp without time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_InviteCountSettings", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "InviteCountSettings"); + } + } +} diff --git a/src/Mewdeko/Database/Migrations/PostgreSql/MewdekoPostgresContextModelSnapshot.cs b/src/Mewdeko/Database/Migrations/PostgreSql/MewdekoPostgresContextModelSnapshot.cs index 6159aedb6..93dcb3055 100644 --- a/src/Mewdeko/Database/Migrations/PostgreSql/MewdekoPostgresContextModelSnapshot.cs +++ b/src/Mewdeko/Database/Migrations/PostgreSql/MewdekoPostgresContextModelSnapshot.cs @@ -17,7 +17,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.8") + .HasAnnotation("ProductVersion", "8.0.10") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -1785,6 +1785,84 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("IgnoredLogChannels"); }); + modelBuilder.Entity("Mewdeko.Database.Models.InviteCount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InviteCounts"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InviteCountSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsEnabled") + .HasColumnType("boolean"); + + b.Property("MinAccountAge") + .HasColumnType("interval"); + + b.Property("RemoveInviteOnLeave") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("InviteCountSettings"); + }); + + modelBuilder.Entity("Mewdeko.Database.Models.InvitedBy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateAdded") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("InviterId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("InvitedBy"); + }); + modelBuilder.Entity("Mewdeko.Database.Models.JoinLeaveLogs", b => { b.Property("Id") diff --git a/src/Mewdeko/Database/Models/Giveaways.cs b/src/Mewdeko/Database/Models/Giveaways.cs index e4d6d5a34..563a44c6c 100644 --- a/src/Mewdeko/Database/Models/Giveaways.cs +++ b/src/Mewdeko/Database/Models/Giveaways.cs @@ -1,5 +1,4 @@ using System.ComponentModel; -using Mewdeko.Common.Attributes.DB; namespace Mewdeko.Database.Models; diff --git a/src/Mewdeko/Database/Models/GuildConfig.cs b/src/Mewdeko/Database/Models/GuildConfig.cs index 7c1799d46..bc7287bb7 100644 --- a/src/Mewdeko/Database/Models/GuildConfig.cs +++ b/src/Mewdeko/Database/Models/GuildConfig.cs @@ -1,6 +1,5 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; -using Mewdeko.Common.Attributes.DB; using Mewdeko.Database.Common; #pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. diff --git a/src/Mewdeko/Database/Models/InviteCount.cs b/src/Mewdeko/Database/Models/InviteCount.cs new file mode 100644 index 000000000..a61e055f5 --- /dev/null +++ b/src/Mewdeko/Database/Models/InviteCount.cs @@ -0,0 +1,25 @@ +using LinqToDB.Mapping; + +namespace Mewdeko.Database.Models; + +/// +/// Represents an invite count entry in the database. +/// +[Table("InviteCounts")] +public class InviteCount : DbEntity +{ + /// + /// Gets or sets the user ID associated with this invite count. + /// + public ulong UserId { get; set; } + + /// + /// Gets or sets the guild ID associated with this invite count. + /// + public ulong GuildId { get; set; } + + /// + /// Gets or sets the number of invites for this user in this guild. + /// + public int Count { get; set; } +} \ No newline at end of file diff --git a/src/Mewdeko/Database/Models/InviteCountSettings.cs b/src/Mewdeko/Database/Models/InviteCountSettings.cs new file mode 100644 index 000000000..d7c018dda --- /dev/null +++ b/src/Mewdeko/Database/Models/InviteCountSettings.cs @@ -0,0 +1,27 @@ +namespace Mewdeko.Database.Models; + +/// +/// Settings for invite counting +/// +public class InviteCountSettings : DbEntity +{ + /// + /// The guild id these settings are for + /// + public ulong GuildId { get; set; } + + /// + /// Whether to remove an invite when a user leaves. + /// + public bool RemoveInviteOnLeave { get; set; } + + /// + /// Minimum account age for an invite to be counted. + /// + public TimeSpan MinAccountAge { get; set; } + + /// + /// Whether invite tracking is enabled. + /// + public bool IsEnabled { get; set; } +} \ No newline at end of file diff --git a/src/Mewdeko/Database/Models/InvitedBy.cs b/src/Mewdeko/Database/Models/InvitedBy.cs new file mode 100644 index 000000000..849f82a74 --- /dev/null +++ b/src/Mewdeko/Database/Models/InvitedBy.cs @@ -0,0 +1,25 @@ +using LinqToDB.Mapping; + +namespace Mewdeko.Database.Models; + +/// +/// Represents an invited by entry in the database. +/// +[Table("InvitedBy")] +public class InvitedBy : DbEntity +{ + /// + /// Gets or sets the user ID of the invited user. + /// + public ulong UserId { get; set; } + + /// + /// Gets or sets the user ID of the inviter. + /// + public ulong InviterId { get; set; } + + /// + /// Gets or sets the guild ID associated with this invite. + /// + public ulong GuildId { get; set; } +} \ No newline at end of file diff --git a/src/Mewdeko/Mewdeko.csproj b/src/Mewdeko/Mewdeko.csproj index a252d07b9..a58627b35 100644 --- a/src/Mewdeko/Mewdeko.csproj +++ b/src/Mewdeko/Mewdeko.csproj @@ -32,8 +32,8 @@ - - + + @@ -42,19 +42,19 @@ - + - + - + - + - + @@ -62,18 +62,18 @@ - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -85,34 +85,34 @@ - + - + - - - + + + - - - - + + + + - + diff --git a/src/Mewdeko/Modules/OwnerOnly/InstanceManagement.cs b/src/Mewdeko/Modules/OwnerOnly/InstanceManagement.cs new file mode 100644 index 000000000..da1257c7b --- /dev/null +++ b/src/Mewdeko/Modules/OwnerOnly/InstanceManagement.cs @@ -0,0 +1,59 @@ +using Discord.Commands; +using Fergun.Interactive; +using LinqToDB.EntityFrameworkCore; +using Mewdeko.Common.Attributes.TextCommands; +using Mewdeko.Database.DbContextStuff; +using Mewdeko.Modules.OwnerOnly.Services; + +namespace Mewdeko.Modules.OwnerOnly; + +/// +/// Manages instances for use with the dashboard +/// +[OwnerOnly] +public class InstanceManagement(InteractiveService interactiveService, DbContextProvider provider) : MewdekoModuleBase +{ + /// + /// Adds an instance to be managed from the dashboard + /// + /// + [Cmd, Aliases] + public async Task AddInstance([Remainder] string instanceUrl) + { + try + { + var uri = new Uri(instanceUrl); + var added = await Service.AddInstanceAsync(uri); + if (added.Item1) + { + var eb = new EmbedBuilder() + .WithTitle($"{GetText("instance_added")} {added.Item2.BotName}") + .WithThumbnailUrl(added.Item2.BotAvatar) + .WithDescription($"{GetText("instance_status")} {added.Item2.BotStatus}" + + $"\n {GetText("instance_version", added.Item2.BotVersion)}" + + $"\n {GetText("instance_command_count", added.Item2.CommandsCount)}" + + $"\n {GetText("instance_modules_count", added.Item2.ModulesCount)}" + + $"\n {GetText("instance_user_count", added.Item2.UserCount)}") + .WithOkColor(); + await ctx.Channel.SendMessageAsync(embed: eb.Build()); + + } + else + await ErrorLocalizedAsync("instance_not_added", added.Item3); + } + catch (UriFormatException) + { + await ErrorLocalizedAsync("invalid_instance_url"); + } + } + + /// + /// Lists all added instances for use with dashboard management + /// + [Cmd, Alias] + public async Task ListInstances() + { + await using var db = await provider.GetContextAsync(); + var instances = await db.BotInstances.ToListAsyncLinqToDB(); + } +} \ No newline at end of file diff --git a/src/Mewdeko/Modules/OwnerOnly/Services/BotInstanceService.cs b/src/Mewdeko/Modules/OwnerOnly/Services/BotInstanceService.cs new file mode 100644 index 000000000..1037b6b8a --- /dev/null +++ b/src/Mewdeko/Modules/OwnerOnly/Services/BotInstanceService.cs @@ -0,0 +1,220 @@ +using System.Net.Http; +using System.Threading; +using LinqToDB.EntityFrameworkCore; +using Mewdeko.Common.ModuleBehaviors; +using Mewdeko.Controllers; +using Mewdeko.Database.DbContextStuff; +using Mewdeko.Services.Impl; +using Newtonsoft.Json; +using Serilog; + +namespace Mewdeko.Modules.OwnerOnly.Services; + +/// +/// Service for managing instances via redis +/// +public class BotInstanceService(IDataCache cache, DbContextProvider provider, IHttpClientFactory factory) + : INService, IReadyExecutor +{ + /// + public async Task OnReadyAsync() + { + var creds = new BotCredentials(); + if (!creds.IsMasterInstance) + return; + var periodic = new PeriodicTimer(TimeSpan.FromHours(1)); + do + { + await using var db = await provider.GetContextAsync(); + var toPush = new List(); + var instances = await db.BotInstances.ToListAsyncLinqToDB(); + if (instances.Count == 0) + return; + + foreach (var instance in instances) + { + using var client = factory.CreateClient(); + var response = await client.GetAsync($"{instance.BotUrl}/BotStatus"); + + if (!response.IsSuccessStatusCode) continue; + var actualResponse = await response.Content.ReadAsStringAsync(); + var botStatus = JsonConvert.DeserializeObject(actualResponse); + toPush.Add(botStatus); + } + + if (toPush.Count == 0) continue; + var redisDb = cache.Redis.GetDatabase(); + await redisDb.StringSetAsync("bot_api_instances", JsonConvert.SerializeObject(toPush)); + } while (await periodic.WaitForNextTickAsync(CancellationToken.None)); + } + + + /// + /// Adds an instance to the cache/db + /// + /// + /// + public async Task<(bool, BotStatus.BotStatusModel?, RejectionReason?)> AddInstanceAsync(Uri instanceUrl) + { + var creds = new BotCredentials(); + if (!creds.IsMasterInstance) + return (false, null, RejectionReason.NotMaster); + + await using var db = await provider.GetContextAsync(); + var instances = await db.BotInstances.ToListAsyncLinqToDB(); + if (instances.Any(x => x.BotUrl == instanceUrl.ToString())) + return (false, null, RejectionReason.InstanceAlreadyExists); + + var redisDb = cache.Redis.GetDatabase(); + List instanceList; + + try + { + var redisStatus = await redisDb.StringGetAsync("bot_api_instances"); + instanceList = redisStatus.HasValue + ? JsonConvert.DeserializeObject>(redisStatus) + : []; + } + catch (Exception e) + { + Log.Error(e, "Error deserializing the instance list from Redis."); + return (false, null, RejectionReason.How); + } + + var (botStatus, rejectionReason) = await GetBotStatusAsync(instanceUrl); + if (botStatus == null) + return (false, null, rejectionReason); + + instanceList.Add(botStatus); + + try + { + var serializedList = JsonConvert.SerializeObject(instanceList); + await redisDb.StringSetAsync("bot_api_instances", serializedList); + } + catch (Exception e) + { + Log.Error(e, "Error serializing the instance list to Redis."); + return (false, null, RejectionReason.How); + } + + return (true, botStatus, null); + } + + /// + /// Removes an instance from the cache/db + /// + /// + /// + public async Task<(bool, RejectionReason?)> RemoveInstanceAsync(Uri instanceUrl) + { + var creds = new BotCredentials(); + if (!creds.IsMasterInstance) + return (false, RejectionReason.NotMaster); + + await using var db = await provider.GetContextAsync(); + var instances = await db.BotInstances.ToListAsyncLinqToDB(); + if (instances.All(x => x.BotUrl != instanceUrl.ToString())) + return (false, RejectionReason.InstanceNotFound); + + var redisDb = cache.Redis.GetDatabase(); + List instanceList; + + try + { + var redisStatus = await redisDb.StringGetAsync("bot_api_instances"); + if (!redisStatus.HasValue) + return (false, RejectionReason.InstanceNotFoundInCache); + + instanceList = JsonConvert.DeserializeObject>(redisStatus); + } + catch (Exception e) + { + Log.Error(e, "Error deserializing the instance list from Redis."); + return (false, RejectionReason.How); + } + + // Find and remove the instance + var instanceToRemove = instanceList.FirstOrDefault(x => x.InstanceUrl == instanceUrl.ToString()); + if (instanceToRemove == null) + return (false, RejectionReason.InstanceNotFoundInCache); + + instanceList.Remove(instanceToRemove); + + try + { + var serializedList = JsonConvert.SerializeObject(instanceList); + await redisDb.StringSetAsync("bot_api_instances", serializedList); + } + catch (Exception e) + { + Log.Error(e, "Error serializing the instance list to Redis."); + return (false, RejectionReason.How); + } + + return (true, null); + } + + + private async Task<(BotStatus.BotStatusModel, RejectionReason?)> GetBotStatusAsync(Uri instanceUrl) + { + var client = factory.CreateClient(); + + try + { + var response = await client.GetAsync(instanceUrl); + if (!response.IsSuccessStatusCode) + return (null, RejectionReason.InstanceNotFound); + + var content = await response.Content.ReadAsStringAsync(); + var botStatus = JsonConvert.DeserializeObject(content); + return (botStatus, null); + } + catch (JsonException) + { + return (null, RejectionReason.InstanceSentWrongData); + } + catch (Exception e) + { + Log.Error(e, "Unexpected error when fetching bot status."); + return (null, RejectionReason.How); + } + } + + + /// + /// The reason an instance was not added to the list. + /// + public enum RejectionReason + { + /// + /// The bot used to add an instance is not the master bot. + /// + NotMaster, + + /// + /// The instance is already in the list. + /// + InstanceAlreadyExists, + + /// + /// The instance is unresponsive or not found. + /// + InstanceNotFound, + + /// + /// When attempting to add, the instance sent the wrong data back. + /// + InstanceSentWrongData, + + /// + /// Instance was not found in the redis cache + /// + InstanceNotFoundInCache, + + /// + /// Actually how did you get here???? + /// + How + } +} \ No newline at end of file diff --git a/src/Mewdeko/Modules/Server Management/Services/ChannelCommandService.cs b/src/Mewdeko/Modules/Server Management/Services/ChannelCommandService.cs index ab6895e15..4477e4ec4 100644 --- a/src/Mewdeko/Modules/Server Management/Services/ChannelCommandService.cs +++ b/src/Mewdeko/Modules/Server Management/Services/ChannelCommandService.cs @@ -57,6 +57,8 @@ public async Task OnReadyAsync() var guildId = guild.Id; var isInRedis = redisJoinBlockedGuilds.Any(g => g == (RedisValue)guildId.ToString()); var isInDb = dbLockdownGuilds.Contains(guildId); + if (!isInRedis && !isInDb) + continue; lockdownGuilds[guildId] = isInRedis switch { diff --git a/src/Mewdeko/Modules/Utility/InviteCommands.cs b/src/Mewdeko/Modules/Utility/InviteCommands.cs index ba0a82bc9..9cdc7368b 100644 --- a/src/Mewdeko/Modules/Utility/InviteCommands.cs +++ b/src/Mewdeko/Modules/Utility/InviteCommands.cs @@ -1,5 +1,4 @@ using Discord.Commands; -using Discord.Rest; using Fergun.Interactive; using Fergun.Interactive.Pagination; using Mewdeko.Common.Attributes.TextCommands; @@ -10,152 +9,196 @@ namespace Mewdeko.Modules.Utility; public partial class Utility { /// - /// Commands for creating and managing server invites. + /// Provides commands for managing and viewing invite-related information. /// - /// The service for embed pagination. - /// The Discord client. [Group] - public class InviteCommands(InteractiveService serv, DiscordShardedClient client) : MewdekoSubmodule + public class InviteCommands : MewdekoSubmodule { + private readonly InteractiveService interactiveService; + /// - /// Creates a new invite to the server with customizable options such as expiry time and maximum use count. + /// Initializes a new instance of the class. /// - /// Arguments to customize the invite, including expiry, max uses, and more. - /// A task that represents the asynchronous operation. + /// The interactive service for handling paginated responses. + public InviteCommands(InteractiveService serv) + { + interactiveService = serv; + } + + /// + /// Displays the number of invites for a user. + /// + /// The user to check invites for. If null, checks for the command user. [Cmd] [Aliases] [RequireContext(ContextType.Guild)] - [BotPerm(ChannelPermission.CreateInstantInvite)] - [UserPerm(ChannelPermission.CreateInstantInvite)] - [MewdekoOptions(typeof(InviteService.Options))] - public async Task InviteCreate(params string[] args) + public async Task Invites(IUser user = null) { - var (opts, success) = OptionsParser.ParseFrom(new InviteService.Options(), args); - if (!success) - return; - - var ch = (ITextChannel)ctx.Channel; - var invite = await ch.CreateInviteAsync(opts.Expire, opts.MaxUses, opts.Temporary, opts.Unique) - .ConfigureAwait(false); - - await ctx.Channel.SendConfirmAsync($"{ctx.User.Mention} https://discord.gg/{invite.Code}") - .ConfigureAwait(false); + user ??= Context.User; + var invites = await Service.GetInviteCount(user.Id, Context.Guild.Id); + await ReplyConfirmLocalizedAsync("user_invite_count", user, invites); } /// - /// Retrieves detailed information about an existing invite, including member count and guild features. + /// Displays the current invite settings for the guild. /// - /// The invite code or link to gather information about. - /// A task that represents the asynchronous operation. [Cmd] [Aliases] [RequireContext(ContextType.Guild)] - public async Task InviteInfo(string text) + [UserPerm(GuildPermission.ManageGuild)] + public async Task InviteSettings() { - RestGuild? guild = null; - var invinfo = await client.Rest.GetInviteAsync(text).ConfigureAwait(false); - if (!invinfo.GuildId.HasValue) - { - await ctx.Channel.SendErrorAsync( - "That invite was not found. Please make sure it's valid and not a vanity.", Config); - return; - } + var settings = await Service.GetInviteCountSettingsAsync(Context.Guild.Id); + await ReplyConfirmLocalizedAsync("invite_settings", + GetEnDis(settings.IsEnabled), + GetEnDis(settings.RemoveInviteOnLeave), + settings.MinAccountAge); + } - try - { - guild = await client.Rest.GetGuildAsync(invinfo.GuildId.Value).ConfigureAwait(false); - } - catch - { - // ignored - } + /// + /// Toggles invite tracking for the guild. + /// + [Cmd] + [Aliases] + [RequireContext(ContextType.Guild)] + [UserPerm(GuildPermission.ManageGuild)] + public async Task ToggleInviteTracking() + { + var newState = await Service.SetInviteTrackingEnabledAsync(Context.Guild.Id, + !(await Service.GetInviteCountSettingsAsync(Context.Guild.Id)).IsEnabled); + await ReplyConfirmLocalizedAsync(newState ? "invite_tracking_enabled" : "invite_tracking_disabled"); + } - var eb = new EmbedBuilder().WithOkColor().WithTitle(invinfo.GuildName).WithThumbnailUrl(guild?.IconUrl) - .WithDescription( - $"Online: {invinfo.PresenceCount}\nTotal Count: {invinfo.MemberCount}") - .AddField("Full Link", invinfo.Url, true) - .AddField("Channel", - $"[{invinfo.ChannelName}](https://discord.com/channels/{invinfo.GuildId}/{invinfo.ChannelId})", - true).AddField("Inviter", - $"{invinfo.Inviter.Mention} ({invinfo.Inviter.Id})", true); - if (guild is not null) - { - eb.AddField("Partnered", guild.Features.HasFeature(GuildFeature.Partnered), true) - .AddField("Server Created", - $"{TimestampTag.FromDateTime(guild.CreatedAt.DateTime)}", true) - .AddField("Verified", guild.Features.HasFeature(GuildFeature.Verified), true).AddField("Discovery", - guild.Features.HasFeature(GuildFeature.Discoverable), true); - } + /// + /// Toggles whether invites should be removed when a user leaves the guild. + /// + [Cmd] + [Aliases] + [RequireContext(ContextType.Guild)] + [UserPerm(GuildPermission.ManageGuild)] + public async Task ToggleRemoveInviteOnLeave() + { + var newState = await Service.SetRemoveInviteOnLeaveAsync(Context.Guild.Id, + !(await Service.GetInviteCountSettingsAsync(Context.Guild.Id)).RemoveInviteOnLeave); + await ReplyConfirmLocalizedAsync(newState + ? "remove_invite_on_leave_enabled" + : "remove_invite_on_leave_disabled"); + } - eb.AddField("Expires", - invinfo.MaxAge.HasValue - ? TimestampTag.FromDateTime( - DateTime.UtcNow.Add(TimeSpan.FromDays(invinfo.MaxAge.Value))) - : "Permanent", true); - await ctx.Channel.SendMessageAsync(embed: eb.Build()).ConfigureAwait(false); + /// + /// Sets the minimum account age required for an invite to be counted. + /// + /// The minimum age in days. + [Cmd] + [Aliases] + [RequireContext(ContextType.Guild)] + [UserPerm(GuildPermission.ManageGuild)] + public async Task SetMinAccountAge(int days) + { + var minAge = TimeSpan.FromDays(days); + await Service.SetMinAccountAgeAsync(Context.Guild.Id, minAge); + await ReplyConfirmLocalizedAsync("min_account_age_set", days); } /// - /// Lists all active invites for the server, including their usage and creator information. + /// Displays a leaderboard of users with the most invites. /// - /// A task that represents the asynchronous operation. [Cmd] [Aliases] [RequireContext(ContextType.Guild)] - [BotPerm(GuildPermission.ManageGuild)] - public async Task InviteList() + public async Task InviteLeaderboard() { - var invites = await ctx.Guild.GetInvitesAsync().ConfigureAwait(false); + var leaderboard = await Service.GetInviteLeaderboardAsync(Context.Guild); + + if (leaderboard.Count == 0) + { + await ReplyErrorLocalizedAsync("no_invite_data"); + return; + } var paginator = new LazyPaginatorBuilder() - .AddUser(ctx.User) + .AddUser(Context.User) .WithPageFactory(PageFactory) .WithFooter(PaginatorFooter.PageNumber | PaginatorFooter.Users) - .WithMaxPageIndex(invites.Count / 10) + .WithMaxPageIndex(leaderboard.Count / 20) .WithDefaultEmotes() .WithActionOnCancellation(ActionOnStop.DeleteMessage) .Build(); - await serv.SendPaginatorAsync(paginator, Context.Channel, TimeSpan.FromMinutes(60)).ConfigureAwait(false); + await interactiveService.SendPaginatorAsync(paginator, Context.Channel, TimeSpan.FromMinutes(60)) + .ConfigureAwait(false); + return; async Task PageFactory(int page) { await Task.CompletedTask.ConfigureAwait(false); - var i = 1; - var invs = invites.OrderByDescending(x => x.Uses).Skip(page * 9).Take(9); - if (!invs.Any()) - return new PageBuilder().WithErrorColor().WithDescription(GetText("no_invites")); - return invs.Aggregate(new PageBuilder().WithOkColor(), - (acc, inv) => acc.AddField( - $"#{i++} {inv.Inviter.ToString().TrimTo(15)} ({inv.Uses} / {(inv.MaxUses == 0 ? "∞" : inv.MaxUses?.ToString())})", - inv.Url)); + return new PageBuilder().WithOkColor() + .WithTitle(GetText("invite_leaderboard_title")) + .WithDescription(string.Join("\n", leaderboard.Skip(page * 20).Take(20) + .Select((x, i) => $"{i + 1 + page * 20}. {x.Username} - {x.InviteCount} invites"))); } } /// - /// Deletes an invite from the server based on its index in the invite list. + /// Displays who invited a specific user to the guild. /// - /// The index of the invite to delete, starting from 1. - /// A task that represents the asynchronous operation. + /// The user to check. If null, checks for the command user. [Cmd] [Aliases] [RequireContext(ContextType.Guild)] - [BotPerm(ChannelPermission.ManageChannels)] - [UserPerm(ChannelPermission.ManageChannels)] - public async Task InviteDelete(int index) + public async Task WhoInvited(IUser user = null) { - if (--index < 0) - return; - var ch = (ITextChannel)ctx.Channel; + user ??= Context.User; + var inviter = await Service.GetInviter(user.Id, Context.Guild); - var invites = await ch.GetInvitesAsync().ConfigureAwait(false); + if (inviter == null) + await ReplyErrorLocalizedAsync("no_inviter_found", user.Username); + else + await ReplyConfirmLocalizedAsync("inviter_found", user.Username, inviter.Username); + } - if (invites.Count <= index) + /// + /// Displays a list of users invited by a specific user. + /// + /// The user whose invites to check. If null, checks for the command user. + [Cmd] + [Aliases] + [RequireContext(ContextType.Guild)] + public async Task InvitedUsers(IUser user = null) + { + user ??= Context.User; + var invitedUsers = await Service.GetInvitedUsers(user.Id, Context.Guild); + + if (invitedUsers.Count == 0) + { + await ReplyErrorLocalizedAsync("no_invited_users", user.Username); return; - var inv = invites.ElementAt(index); - await inv.DeleteAsync().ConfigureAwait(false); + } - await ReplyAsync(GetText("invite_deleted", Format.Bold(inv.Code))).ConfigureAwait(false); + var paginator = new LazyPaginatorBuilder() + .AddUser(Context.User) + .WithPageFactory(PageFactory) + .WithFooter(PaginatorFooter.PageNumber | PaginatorFooter.Users) + .WithMaxPageIndex(invitedUsers.Count / 20) + .WithDefaultEmotes() + .WithActionOnCancellation(ActionOnStop.DeleteMessage) + .Build(); + + await interactiveService.SendPaginatorAsync(paginator, Context.Channel, TimeSpan.FromMinutes(60)) + .ConfigureAwait(false); + return; + + async Task PageFactory(int page) + { + await Task.CompletedTask.ConfigureAwait(false); + return new PageBuilder().WithOkColor() + .WithTitle(GetText("invited_users_title", user.Username)) + .WithDescription(string.Join("\n", + invitedUsers.Skip(page * 20).Take(20).Select(x => x.ToString()))); + } } + + private string GetEnDis(bool endis) + => endis ? "Enabled" : "Disabled"; } } \ No newline at end of file diff --git a/src/Mewdeko/Modules/Utility/Services/InviteCountService.cs b/src/Mewdeko/Modules/Utility/Services/InviteCountService.cs new file mode 100644 index 000000000..938805f11 --- /dev/null +++ b/src/Mewdeko/Modules/Utility/Services/InviteCountService.cs @@ -0,0 +1,379 @@ +using Mewdeko.Common.ModuleBehaviors; +using Mewdeko.Database.DbContextStuff; +using Microsoft.EntityFrameworkCore; + +namespace Mewdeko.Modules.Utility.Services; + +/// +/// Invite Count Service +/// +public class InviteCountService : INService, IReadyExecutor +{ + private readonly DbContextProvider db; + private readonly DiscordShardedClient client; + private readonly ConcurrentDictionary> guildInvites = new(); + private readonly ConcurrentDictionary inviteCountSettings = new(); + + /// + /// Service for counting invites + /// + /// + /// + public InviteCountService(EventHandler handler, DbContextProvider db, DiscordShardedClient client) + { + this.db = db; + this.client = client; + + handler.JoinedGuild += UpdateGuildInvites; + handler.UserJoined += OnUserJoined; + handler.UserLeft += OnUserLeft; + handler.InviteCreated += OnInviteCreated; + handler.InviteDeleted += OnInviteDeleted; + } + + private async Task OnUserLeft(IGuild guild, IUser user) + { + var settings = await GetInviteCountSettingsAsync(guild.Id); + if (!settings.IsEnabled || !settings.RemoveInviteOnLeave) return; + + await using var uow = await db.GetContextAsync(); + + var invitedBy = await uow.InvitedBy + .FirstOrDefaultAsync(x => x.UserId == user.Id && x.GuildId == guild.Id); + + if (invitedBy != null) + { + var inviterCount = await uow.InviteCounts + .FirstOrDefaultAsync(x => x.UserId == invitedBy.InviterId && x.GuildId == guild.Id); + + if (inviterCount is { Count: > 0 }) + { + inviterCount.Count--; + } + + // Remove the InvitedBy record + uow.InvitedBy.Remove(invitedBy); + } + + await uow.SaveChangesAsync(); + } + + /// + /// Gets invite count settings for the guild + /// + /// + /// + public async Task GetInviteCountSettingsAsync(ulong guildId) + { + if (inviteCountSettings.TryGetValue(guildId, out var cachedSettings)) + { + return cachedSettings; + } + + await using var uow = await db.GetContextAsync(); + var settings = await uow.InviteCountSettings.FirstOrDefaultAsync(x => x.GuildId == guildId); + + if (settings == null) + { + settings = new InviteCountSettings + { + GuildId = guildId, + RemoveInviteOnLeave = false, + MinAccountAge = TimeSpan.Zero, + IsEnabled = true + }; + uow.InviteCountSettings.Add(settings); + await uow.SaveChangesAsync(); + } + + inviteCountSettings[guildId] = settings; + return settings; + } + + private async Task UpdateInviteCountSettingsAsync(ulong guildId, Action updateAction) + { + await using var uow = await db.GetContextAsync(); + var settings = await uow.InviteCountSettings.FirstOrDefaultAsync(x => x.GuildId == guildId); + + if (settings == null) + { + settings = new InviteCountSettings { GuildId = guildId }; + uow.InviteCountSettings.Add(settings); + } + + updateAction(settings); + uow.InviteCountSettings.Update(settings); + await uow.SaveChangesAsync(); + + inviteCountSettings[guildId] = settings; + } + + /// + /// Sets whether invite tracking is enabled or disabled + /// + /// + /// + /// + public async Task SetInviteTrackingEnabledAsync(ulong guildId, bool isEnabled) + { + await UpdateInviteCountSettingsAsync(guildId, settings => settings.IsEnabled = isEnabled); + return isEnabled; + } + + /// + /// Sets whether invite count gets removed when a user leaves + /// + /// + /// + /// + public async Task SetRemoveInviteOnLeaveAsync(ulong guildId, bool removeOnLeave) + { + await UpdateInviteCountSettingsAsync(guildId, settings => settings.RemoveInviteOnLeave = removeOnLeave); + return removeOnLeave; + } + + /// + /// Sets the minimum account age for an invite to get counted + /// + /// + /// + /// + public async Task SetMinAccountAgeAsync(ulong guildId, TimeSpan minAge) + { + await UpdateInviteCountSettingsAsync(guildId, settings => settings.MinAccountAge = minAge); + return minAge; + } + + + private async Task OnUserJoined(IGuildUser user) + { + if (inviteCountSettings.TryGetValue(user.Guild.Id, out var settings)) + if (!settings.IsEnabled) + return; + var guild = user.Guild; + var newInvites = await guild.GetInvitesAsync(); + var usedInvite = FindUsedInvite(guild.Id, newInvites); + + if (usedInvite != null) + { + await UpdateInviteCount(usedInvite.Inviter.Id, guild.Id); + await UpdateInvitedBy(user.Id, usedInvite.Inviter.Id, guild.Id); + } + + await UpdateGuildInvites(user.Guild); + } + + private Task OnInviteCreated(IInvite invite) + { + if (!this.guildInvites.TryGetValue(invite.Guild.Id, out var concurrentDictionary)) + { + concurrentDictionary = new ConcurrentDictionary(); + this.guildInvites[invite.Guild.Id] = concurrentDictionary; + } + + concurrentDictionary[invite.Code] = invite as IInviteMetadata; + return Task.CompletedTask; + } + + private Task OnInviteDeleted(IGuildChannel channel, string code) + { + if (this.guildInvites.TryGetValue(channel.Guild.Id, out var invites)) + { + invites.TryRemove(code, out _); + } + return Task.CompletedTask; + } + + + private async Task UpdateGuildInvites(IGuild guild) + { + try + { + var invites = await guild.GetInvitesAsync(); + guildInvites[guild.Id] = new ConcurrentDictionary( + invites.ToDictionary(x => x.Code, x => x)); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to update invites for guild {guild.Id}: {ex.Message}"); + } + } + + private IInvite? FindUsedInvite(ulong guildId, IEnumerable newInvites) + { + if (!guildInvites.TryGetValue(guildId, out var oldInvites)) + return null; + + foreach (var newInvite in newInvites) + { + if (!oldInvites.TryGetValue(newInvite.Code, out var oldInvite)) continue; + if (newInvite.Uses > oldInvite.Uses) + return newInvite; + } + + return null; + } + + private async Task UpdateInviteCount(ulong inviterId, ulong guildId) + { + await using var uow = await db.GetContextAsync(); + var inviter = await uow.InviteCounts.FirstOrDefaultAsync(x => x.UserId == inviterId && x.GuildId == guildId); + + if (inviter == null) + { + inviter = new InviteCount + { + UserId = inviterId, + GuildId = guildId, + Count = 1 + }; + uow.InviteCounts.Add(inviter); + } + else + { + inviter.Count++; + } + + await uow.SaveChangesAsync(); + } + + private async Task UpdateInvitedBy(ulong userId, ulong inviterId, ulong guildId) + { + await using var uow = await db.GetContextAsync(); + var invitedUser = new InvitedBy + { + UserId = userId, + InviterId = inviterId, + GuildId = guildId + }; + + uow.InvitedBy.Add(invitedUser); + await uow.SaveChangesAsync(); + } + + /// + /// Gets the invite count for a user + /// + /// + /// + /// + public async Task GetInviteCount(ulong userId, ulong guildId) + { + await using var uow = await db.GetContextAsync(); + var inviteCount = await uow.InviteCounts + .Where(x => x.UserId == userId && x.GuildId == guildId) + .Select(x => x.Count) + .FirstOrDefaultAsync(); + + return inviteCount; + } + + /// + /// Gets who invited a user + /// + /// + /// + /// + public async Task GetInviter(ulong userId, IGuild guild) + { + await using var uow = await db.GetContextAsync(); + var inviterId = await uow.InvitedBy + .Where(x => x.UserId == userId && x.GuildId == guild.Id) + .Select(x => x.InviterId) + .FirstOrDefaultAsync(); + + return inviterId != 0 ? await guild.GetUserAsync(inviterId) : null; + } + + /// + /// Gets all users invited by a user + /// + /// + /// + /// + public async Task> GetInvitedUsers(ulong inviterId, IGuild guild) + { + await using var uow = await db.GetContextAsync(); + var invitedUserIds = await uow.InvitedBy + .Where(x => x.InviterId == inviterId && x.GuildId == guild.Id) + .Select(x => x.UserId) + .ToListAsync(); + + var invitedUsers = new List(); + foreach (var userId in invitedUserIds) + { + var user = await guild.GetUserAsync(userId); + if (user != null) + invitedUsers.Add(user); + } + + return invitedUsers; + } + + /// + /// Gets the invite leaderboard + /// + /// + /// + /// + /// + public async Task> GetInviteLeaderboardAsync(IGuild guild, int page = 1, int pageSize = 10) + { + await using var uow = await db.GetContextAsync(); + var leaderboard = await uow.InviteCounts + .Where(x => x.GuildId == guild.Id) + .OrderByDescending(x => x.Count) + .Skip((page - 1) * pageSize) + .Take(pageSize) + .Select(x => new { x.UserId, x.Count }) + .ToListAsync(); + + + var result = new List<(ulong UserId, string Username, int InviteCount)>(); + foreach (var entry in leaderboard) + { + var user = await guild.GetUserAsync(entry.UserId); + var username = user?.Username ?? "Unknown User"; + result.Add((entry.UserId, username, entry.Count)); + } + + return result; + } + + /// + public async Task OnReadyAsync() + { + var guilds = client.Guilds.ToHashSet(); + var guildIds = client.Guilds.Select(g => g.Id).ToHashSet(); + + await using var uow = await db.GetContextAsync(); + var allSettings = await uow.InviteCountSettings + .Where(s => guildIds.Contains(s.GuildId)) + .ToDictionaryAsync(s => s.GuildId); + + var mergedSettings = guildIds.ToDictionary( + guildId => guildId, + guildId => allSettings.TryGetValue(guildId, out var settings) + ? settings + : new InviteCountSettings + { + GuildId = guildId, + RemoveInviteOnLeave = true, + IsEnabled = true + } + ); + + foreach (var kvp in mergedSettings) + { + inviteCountSettings[kvp.Key] = kvp.Value; + } + + var newSettings = mergedSettings.Values.Where(s => !allSettings.ContainsKey(s.GuildId)); + uow.InviteCountSettings.AddRange(newSettings); + await uow.SaveChangesAsync(); + foreach (var i in guilds) + { + await UpdateGuildInvites(i); + } + } +} \ No newline at end of file diff --git a/src/Mewdeko/Modules/Utility/Services/InviteService.cs b/src/Mewdeko/Modules/Utility/Services/InviteService.cs deleted file mode 100644 index 134ad0faa..000000000 --- a/src/Mewdeko/Modules/Utility/Services/InviteService.cs +++ /dev/null @@ -1,58 +0,0 @@ -using CommandLine; - -namespace Mewdeko.Modules.Utility.Services; - -/// -/// Service for managing invites. -/// Implements the INService interface. -/// -public class InviteService : INService -{ - /// - /// Options for the InviteService commands. - /// Implements the IMewdekoCommandOptions interface. - /// - public class Options : IMewdekoCommandOptions - { - /// - /// Gets or sets the maximum number of times the invite can be used. - /// - [Option('m', "max-uses", Required = false, Default = 0, - HelpText = "Maximum number of times the invite can be used. Default 0 (never).")] - public int MaxUses { get; set; } - - /// - /// Gets or sets the flag for unique invites. - /// - [Option('u', "unique", Required = false, Default = false, - HelpText = - "Not setting this flag will result in bot getting the existing invite with the same settings if it exists, instead of creating a new one.")] - public bool Unique { get; set; } = false; - - /// - /// Gets or sets the flag for temporary invites. - /// - [Option('t', "temporary", Required = false, Default = false, - HelpText = "If this flag is set, the user will be kicked from the guild once they close their client.")] - public bool Temporary { get; set; } = false; - - /// - /// Gets or sets the time for the invite to expire. - /// - [Option('e', "expire", Required = false, Default = 0, - HelpText = "Time in seconds to expire the invite. Default 0 (no expiry).")] - public int Expire { get; set; } - - /// - /// Normalizes the options for the invite. - /// - public void NormalizeOptions() - { - if (MaxUses < 0) - MaxUses = 0; - - if (Expire < 0) - Expire = 0; - } - } -} \ No newline at end of file diff --git a/src/Mewdeko/Services/Impl/BotCredentials.cs b/src/Mewdeko/Services/Impl/BotCredentials.cs index add6181b7..6ace8f9b1 100644 --- a/src/Mewdeko/Services/Impl/BotCredentials.cs +++ b/src/Mewdeko/Services/Impl/BotCredentials.cs @@ -82,10 +82,10 @@ public BotCredentials() /// public string PsqlConnectionString { get; set; } - // /// - // /// Gets or sets whether this is the master mewdeko instance - // /// - // public bool IsMasterInstance { get; set; } = false; + /// + /// Gets or sets whether this is the master mewdeko instance + /// + public bool IsMasterInstance { get; set; } = false; /// /// Gets or sets a value indicating whether to use global currency. @@ -395,7 +395,7 @@ private void UpdateCredentials(object sender, FileSystemEventArgs e) ShardRunCommand = data[nameof(ShardRunCommand)]; ShardRunArguments = data[nameof(ShardRunArguments)]; CleverbotApiKey = data[nameof(CleverbotApiKey)]; - // IsMasterInstance = Convert.ToBoolean(data[nameof(IsMasterInstance)]); + IsMasterInstance = Convert.ToBoolean(data[nameof(IsMasterInstance)]); LocationIqApiKey = data[nameof(LocationIqApiKey)]; SpotifyClientId = data[nameof(SpotifyClientId)]; SpotifyClientSecret = data[nameof(SpotifyClientSecret)]; @@ -540,7 +540,7 @@ private class CredentialsModel : IBotCredentials public string RedisOptions { get; set; } = "127.0.0.1,syncTimeout=3000"; public int ApiPort { get; set; } = 5001; public bool SkipApiKey { get; set; } = false; - // public bool IsMasterInstance { get; set; } = false; + public bool IsMasterInstance { get; set; } = false; public RestartConfig RestartCommand { get; } = null; public string RedisConnections { get; } = "127.0.0.1:6379"; public string LastFmApiKey { get; } = ""; diff --git a/src/Mewdeko/Services/Impl/EventHandler.cs b/src/Mewdeko/Services/Impl/EventHandler.cs index 3f1ec93c1..f669bf491 100644 --- a/src/Mewdeko/Services/Impl/EventHandler.cs +++ b/src/Mewdeko/Services/Impl/EventHandler.cs @@ -50,6 +50,22 @@ public EventHandler(DiscordShardedClient client) client.AuditLogCreated += ClientOnAuditLogCreated; client.GuildAvailable += ClientOnGuildAvailable; client.LeftGuild += ClientOnLeftGuild; + client.InviteCreated += ClientOnInviteCreated; + client.InviteDeleted += ClientOnInviteDeleted; + } + + private Task ClientOnInviteDeleted(SocketGuildChannel arg1, string arg2) + { + if (InviteDeleted != null) + _ = InviteDeleted(arg1, arg2); + return Task.CompletedTask; + } + + private Task ClientOnInviteCreated(SocketInvite arg) + { + if (InviteCreated is not null) + _ = InviteCreated(arg); + return Task.CompletedTask; } private Task ClientOnLeftGuild(SocketGuild arg) @@ -109,6 +125,15 @@ public delegate Task AsyncEventHandler public event AsyncEventHandler? MessageReceived; + /// + /// Occurs when a message is received. + /// + public event AsyncEventHandler? InviteCreated; + /// + /// Occurs when an invite gets deleted + /// + public event AsyncEventHandler? InviteDeleted; + /// /// Occurs when a guild event is created. /// diff --git a/src/Mewdeko/Services/Impl/StatsService.cs b/src/Mewdeko/Services/Impl/StatsService.cs index 06ce807d6..d3ba3260c 100644 --- a/src/Mewdeko/Services/Impl/StatsService.cs +++ b/src/Mewdeko/Services/Impl/StatsService.cs @@ -125,6 +125,7 @@ await cache.Redis.GetDatabase().StringSetAsync($"{client.CurrentUser.Id}_topguil catch { Log.Error("Failed to update top guilds: {0}"); + return; } } while (await periodicTimer.WaitForNextTickAsync()); }); diff --git a/src/Mewdeko/data/aliases.yml b/src/Mewdeko/data/aliases.yml index 2db7c81b1..59783a8f3 100644 --- a/src/Mewdeko/data/aliases.yml +++ b/src/Mewdeko/data/aliases.yml @@ -16,6 +16,28 @@ banbyhash: debugembed: - debugembed - embeddebug +invites: + - invites +invitesettings: + - invitesettings + - inviteconfig +toggleinvitetracking: + - toggleinvitetracking +toggleremoveinviteonleave: + - toggleremoveinviteonleave + - triol +setminaccountage: + - setminaccountage + - inviteminage +inviteleaderboard: + - inviteleaderboard + - inviteslb +whoinvited: + - whoinvited + - invitedby +invitedusers: + - invitedusers + - userinvites purgeuser: - purgeuser - pruneuser diff --git a/src/Mewdeko/data/strings/commands/commands.en-US.yml b/src/Mewdeko/data/strings/commands/commands.en-US.yml index 55d08c015..bd2ff1353 100644 --- a/src/Mewdeko/data/strings/commands/commands.en-US.yml +++ b/src/Mewdeko/data/strings/commands/commands.en-US.yml @@ -13,6 +13,30 @@ gpingrole: - "roleid" - "@role" desc: "Sets the role to ping when a giveaway starts" +invites: + args: + - "@user" + desc: "Displays the number of invites for you or the specified user." +invitesettings: + desc: "Shows the current invite tracking settings for the server." +toggleinvitetracking: + desc: "Enables or disables invite tracking for the server." +toggleremoveinviteonleave: + desc: "Toggles whether invites should be removed when a user leaves the server." +setminaccountage: + args: + - "days" + desc: "Sets the minimum account age required for an invite to be counted." +inviteleaderboard: + desc: "Displays a leaderboard of users with the most invites." +whoinvited: + args: + - "@user" + desc: "Shows who invited the specified user or yourself to the server." +invitedusers: + args: + - "@user" + desc: "Lists the users invited by you or the specified user." usermessages: args: - "user" diff --git a/src/Mewdeko/data/strings/responses/responses.en-US.json b/src/Mewdeko/data/strings/responses/responses.en-US.json index a8e71ae52..886d8e39c 100644 --- a/src/Mewdeko/data/strings/responses/responses.en-US.json +++ b/src/Mewdeko/data/strings/responses/responses.en-US.json @@ -11,6 +11,16 @@ "ban_in_role_partial_success": "Banned {0} users with the role {1}, but failed to ban {2} users.", "nameban_no_users_found": "No users found matching the specified name pattern.", "lockdown_perm_ban_missing": "Bot cannot ban members.", + "instance_status": "Instance Status", + "instances_none": "No instances found. Please add one and try again.", + "instance_not_found": "That instance was not found. Please remove and", + "user_invite_count": "{0} has {1} invites.", + "instance_latency": "Instance Latency: {0}ms", + "instance_added": "Instance Added", + "instance_version": "Instance Version: {0}", + "instance_command_count": "Commands Count: {0}", + "instance_modules_count": "Modules Count: {0}", + "instance_user_count": "User Count {0}", "lockdown_in_progress": "{0} Lockdown is in progress...", "lockdown_perm_check_fail": "Lockdown failed due to missing permissions: {0}", "lockdown_joins_enabled": "Lockdown for joins has been enabled in {0}. Action taken: {1}", @@ -20,6 +30,18 @@ "lockdown_full_enabled": "Full lockdown has been enabled in {0}. Action taken: {1}", "lockdown_lift_in_progress": "{0} Lifting the lockdown...", "lockdown_joins_disabled": "Lockdown for joins has been disabled in {0}.", + "invite_settings": "Invite tracking is {0}, remove on leave is {1}, minimum account age is {2}.", + "invite_tracking_enabled": "Invite tracking has been enabled.", + "invite_tracking_disabled": "Invite tracking has been disabled.", + "remove_invite_on_leave_enabled": "Removing invites on leave has been enabled.", + "remove_invite_on_leave_disabled": "Removing invites on leave has been disabled.", + "min_account_age_set": "Minimum account age for invite tracking set to {0} days.", + "no_invite_data": "No invite data found for this server.", + "invite_leaderboard_title": "Invite Leaderboard", + "no_inviter_found": "No inviter found for {0}.", + "inviter_found": "{0} was invited by {1}.", + "no_invited_users": "{0} hasn't invited any users.", + "invited_users_title": "Users Invited by {0}", "no_lockdown_joins": "No lockdown for joins is currently active.", "lockdown_readonly_disabled": "Read-only lockdown has been disabled in {0}.", "lockdown_perm_kick_missing": "Bot cannot kick members.",