From defb52403f268b19d34d09d47c0340af6f2bcce4 Mon Sep 17 00:00:00 2001 From: Janet Taylor Date: Thu, 16 Nov 2023 13:04:26 -0500 Subject: [PATCH 1/4] #771 message links and dates in slots boards --- .../Features/Guilds/Bot/GetSlotsScores.cs | 11 +- .../Features/SlotScores/Bot/AddScore.cs | 6 + ...3_AddMessageToSlotsLeaderboard.Designer.cs | 1120 +++++++++++++++++ ...1116171333_AddMessageToSlotsLeaderboard.cs | 58 + .../Migrations/ClemBotContextModelSnapshot.cs | 14 + .../ClemBot.Api.Data/Models/SlotScore.cs | 4 + ClemBot.Bot/bot/api/guild_route.py | 2 +- ClemBot.Bot/bot/api/slots_score_route.py | 16 +- ClemBot.Bot/bot/cogs/random_cog/slots_cog.py | 77 +- ClemBot.Bot/bot/models/guild_models.py | 4 + 10 files changed, 1268 insertions(+), 44 deletions(-) create mode 100644 ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.Designer.cs create mode 100644 ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.cs diff --git a/ClemBot.Api/ClemBot.Api.Core/Features/Guilds/Bot/GetSlotsScores.cs b/ClemBot.Api/ClemBot.Api.Core/Features/Guilds/Bot/GetSlotsScores.cs index 236792f4..94173130 100644 --- a/ClemBot.Api/ClemBot.Api.Core/Features/Guilds/Bot/GetSlotsScores.cs +++ b/ClemBot.Api/ClemBot.Api.Core/Features/Guilds/Bot/GetSlotsScores.cs @@ -1,6 +1,7 @@ using ClemBot.Api.Common; using ClemBot.Api.Data.Contexts; using Microsoft.EntityFrameworkCore; +using NodaTime; namespace ClemBot.Api.Core.Features.Guilds.Bot; @@ -25,6 +26,9 @@ public record Score public ulong HighScore { get; init; } public ulong UserId { get; init; } + public LocalDateTime TimeOccurred { get; init; } + public ulong? MessageId { get; init; } + public ulong? ChannelId { get; init; } } public class QueryHandler : IRequestHandler> @@ -43,7 +47,7 @@ public async Task> Handle(Query request, CancellationToken ca .QueryIfElse(() => request.Leader, q => q.OrderByDescending(y => y.Score), q => q.OrderBy(y => y.Score)) - .Select(z => new { z.Score, z.UserId }) + .Select(z => new { z.Score, z.UserId, z.Time, z.MessageId, z.ChannelId }) .Take(request.Limit) .ToListAsync(); @@ -52,7 +56,10 @@ public async Task> Handle(Query request, CancellationToken ca Scores = scores.Select(x => new Score { HighScore = x.Score, - UserId = x.UserId + UserId = x.UserId, + TimeOccurred = x.Time, + MessageId = x.MessageId, + ChannelId = x.ChannelId }) }); } diff --git a/ClemBot.Api/ClemBot.Api.Core/Features/SlotScores/Bot/AddScore.cs b/ClemBot.Api/ClemBot.Api.Core/Features/SlotScores/Bot/AddScore.cs index 35b4de66..813291f2 100644 --- a/ClemBot.Api/ClemBot.Api.Core/Features/SlotScores/Bot/AddScore.cs +++ b/ClemBot.Api/ClemBot.Api.Core/Features/SlotScores/Bot/AddScore.cs @@ -19,6 +19,10 @@ public class Command : IRequest> public ulong GuildId { get; set; } public ulong UserId { get; set; } + + public ulong MessageId { get; set; } + + public ulong ChannelId { get; set; } } public record Handler(ClemBotContext _context, IMediator _mediator) @@ -32,6 +36,8 @@ public async Task> Handle(Command request, CancellationToken ca GuildId = request.GuildId, UserId = request.UserId, Time = SystemClock.Instance.InZone(DateTimeZone.Utc).GetCurrentLocalDateTime(), + MessageId = request.MessageId, + ChannelId = request.ChannelId }; _context.SlotScores.Add(score); diff --git a/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.Designer.cs b/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.Designer.cs new file mode 100644 index 00000000..719af563 --- /dev/null +++ b/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.Designer.cs @@ -0,0 +1,1120 @@ +ο»Ώ// +using System; +using ClemBot.Api.Common.Enums; +using ClemBot.Api.Data.Contexts; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using NodaTime; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace ClemBot.Api.Data.Migrations +{ + [DbContext(typeof(ClemBotContext))] + [Migration("20231116171333_AddMessageToSlotsLeaderboard")] + partial class AddMessageToSlotsLeaderboard + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "bot_auth_claims", new[] { "designated_channel_view", "designated_channel_modify", "custom_prefix_set", "welcome_message_view", "welcome_message_modify", "tag_add", "tag_delete", "tag_transfer", "assignable_roles_add", "assignable_roles_delete", "delete_message", "emote_add", "claims_view", "claims_modify", "manage_class_add", "moderation_warn", "moderation_ban", "moderation_mute", "moderation_purge", "moderation_infraction_view", "moderation_infraction_view_self", "dashboard_view", "dashboard_edit", "guild_settings_view", "guild_settings_edit", "custom_tag_prefix_set", "command_restrictions_edit", "bypass_disabled_commands", "manage_emote_boards" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "command_restriction_type", new[] { "white_list", "black_list" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "config_settings", new[] { "allow_embed_links" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "designated_channels", new[] { "message_log", "moderation_log", "user_join_log", "user_leave_log", "starboard", "server_join_log", "bot_dm_log" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "infraction_type", new[] { "ban", "mute", "warn" }); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("ChannelEmoteBoard", b => + { + b.Property("ChannelsId") + .HasColumnType("numeric(20,0)"); + + b.Property("EmoteBoardsId") + .HasColumnType("integer"); + + b.HasKey("ChannelsId", "EmoteBoardsId"); + + b.HasIndex("EmoteBoardsId"); + + b.ToTable("ChannelEmoteBoard"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Channel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsThread") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("boolean") + .HasComputedColumnSql("\"Channels\".\"ParentId\" IS NOT null", true); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.HasIndex("ParentId"); + + b.ToTable("Channels"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.ClaimsMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Claim") + .HasColumnType("bot_auth_claims"); + + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("ClaimsMappings"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CommandInvocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("CommandName") + .IsRequired() + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.ToTable("CommandInvocations"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CommandRestriction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("CommandName") + .IsRequired() + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("RestrictionType") + .HasColumnType("command_restriction_type"); + + b.Property("SilentlyFail") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("GuildId"); + + b.ToTable("CommandRestrictions"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CustomPrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Prefix") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("CustomPrefixs"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CustomTagPrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("TagPrefix") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("CustomTagPrefixs"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.DesignatedChannelMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("Type") + .HasColumnType("designated_channels"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.ToTable("DesignatedChannelMappings"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoard", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AllowBotPosts") + .HasColumnType("boolean"); + + b.Property("Emote") + .IsRequired() + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("ReactionThreshold") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("EmoteBoards"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("EmoteBoardPostId") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("EmoteBoardPostId"); + + b.ToTable("EmoteBoardMessages"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardPost", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("EmoteBoardId") + .HasColumnType("integer"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("EmoteBoardId"); + + b.HasIndex("UserId"); + + b.ToTable("EmoteBoardPosts"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardPostReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("EmoteBoardPostId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("EmoteBoardPostId"); + + b.ToTable("EmoteBoardPostReactions"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Guild", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("numeric(20,0)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OwnerId") + .HasColumnType("numeric(20,0)"); + + b.Property("WelcomeMessage") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Guilds"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.GuildSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Setting") + .HasColumnType("config_settings"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("GuildSettings"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.GuildUser", b => + { + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("GuildId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("GuildUser"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Infraction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AuthorId") + .HasColumnType("numeric(20,0)"); + + b.Property("Duration") + .HasColumnType("timestamp without time zone"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("Reason") + .HasColumnType("text"); + + b.Property("SubjectId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("Type") + .HasColumnType("infraction_type"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.HasIndex("GuildId"); + + b.HasIndex("SubjectId"); + + b.ToTable("Infractions"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Message", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("numeric(20,0)"); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.MessageContent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id"); + + b.HasIndex("MessageId"); + + b.ToTable("MessageContents"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("Dispatched") + .HasColumnType("boolean"); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("numeric(20,0)"); + + b.Property("Admin") + .HasColumnType("boolean"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsAssignable") + .HasColumnType("boolean"); + + b.Property("IsAutoAssigned") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.ToTable("Roles"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.RoleUser", b => + { + b.Property("RoleId") + .HasColumnType("numeric(20,0)"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("RoleId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.SlotScore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + + b.Property("Score") + .HasColumnType("numeric(20,0)"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("SlotScores"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("GuildId") + .HasColumnType("numeric(20,0)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Time") + .HasColumnType("timestamp without time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("GuildId"); + + b.HasIndex("UserId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.TagUse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + + b.Property("TagId") + .HasColumnType("integer"); + + b.Property("Time") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("numeric(20,0)"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId"); + + b.HasIndex("TagId"); + + b.HasIndex("UserId"); + + b.ToTable("TagUses"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("numeric(20,0)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ChannelEmoteBoard", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", null) + .WithMany() + .HasForeignKey("ChannelsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.EmoteBoard", null) + .WithMany() + .HasForeignKey("EmoteBoardsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Channel", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("Channels") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.Channel", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.Navigation("Guild"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.ClaimsMapping", b => + { + b.HasOne("ClemBot.Api.Data.Models.Role", "Role") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CommandRestriction", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId"); + + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany() + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CustomPrefix", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("CustomPrefixes") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.CustomTagPrefix", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("CustomTagPrefixes") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.DesignatedChannelMapping", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany("DesignatedChannels") + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoard", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany() + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardMessage", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.EmoteBoardPost", "EmoteBoardPost") + .WithMany("Messages") + .HasForeignKey("EmoteBoardPostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("EmoteBoardPost"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardPost", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.EmoteBoard", "EmoteBoard") + .WithMany() + .HasForeignKey("EmoteBoardId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany("EmoteBoardPosts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("EmoteBoard"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardPostReaction", b => + { + b.HasOne("ClemBot.Api.Data.Models.EmoteBoardPost", "EmoteBoardPost") + .WithMany("Reactions") + .HasForeignKey("EmoteBoardPostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EmoteBoardPost"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.GuildSetting", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("GuildSettings") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.GuildUser", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("GuildUsers") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany("GuildUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Infraction", b => + { + b.HasOne("ClemBot.Api.Data.Models.User", "Author") + .WithMany() + .HasForeignKey("AuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("Infractions") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "Subject") + .WithMany() + .HasForeignKey("SubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Guild"); + + b.Navigation("Subject"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Message", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany("Messages") + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("Messages") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany("Messages") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("Guild"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.MessageContent", b => + { + b.HasOne("ClemBot.Api.Data.Models.Message", "Message") + .WithMany("Contents") + .HasForeignKey("MessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Message"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Reminder", b => + { + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Role", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("Roles") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.RoleUser", b => + { + b.HasOne("ClemBot.Api.Data.Models.Role", "Role") + .WithMany("RoleUsers") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany("RoleUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.SlotScore", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId"); + + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany() + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("Guild"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Tag", b => + { + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") + .WithMany("Tags") + .HasForeignKey("GuildId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany("Tags") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Guild"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.TagUse", b => + { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.Tag", "Tag") + .WithMany("TagUses") + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ClemBot.Api.Data.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Channel"); + + b.Navigation("Tag"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Channel", b => + { + b.Navigation("DesignatedChannels"); + + b.Navigation("Messages"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.EmoteBoardPost", b => + { + b.Navigation("Messages"); + + b.Navigation("Reactions"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Guild", b => + { + b.Navigation("Channels"); + + b.Navigation("CustomPrefixes"); + + b.Navigation("CustomTagPrefixes"); + + b.Navigation("GuildSettings"); + + b.Navigation("GuildUsers"); + + b.Navigation("Infractions"); + + b.Navigation("Messages"); + + b.Navigation("Roles"); + + b.Navigation("Tags"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Message", b => + { + b.Navigation("Contents"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Role", b => + { + b.Navigation("Claims"); + + b.Navigation("RoleUsers"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.Tag", b => + { + b.Navigation("TagUses"); + }); + + modelBuilder.Entity("ClemBot.Api.Data.Models.User", b => + { + b.Navigation("EmoteBoardPosts"); + + b.Navigation("GuildUsers"); + + b.Navigation("Messages"); + + b.Navigation("RoleUsers"); + + b.Navigation("Tags"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.cs b/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.cs new file mode 100644 index 00000000..c0fab202 --- /dev/null +++ b/ClemBot.Api/ClemBot.Api.Data/Migrations/20231116171333_AddMessageToSlotsLeaderboard.cs @@ -0,0 +1,58 @@ +ο»Ώusing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ClemBot.Api.Data.Migrations +{ + /// + public partial class AddMessageToSlotsLeaderboard : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ChannelId", + table: "SlotScores", + type: "numeric(20,0)", + nullable: true); + + migrationBuilder.AddColumn( + name: "MessageId", + table: "SlotScores", + type: "numeric(20,0)", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_SlotScores_ChannelId", + table: "SlotScores", + column: "ChannelId"); + + migrationBuilder.AddForeignKey( + name: "FK_SlotScores_Channels_ChannelId", + table: "SlotScores", + column: "ChannelId", + principalTable: "Channels", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_SlotScores_Channels_ChannelId", + table: "SlotScores"); + + migrationBuilder.DropIndex( + name: "IX_SlotScores_ChannelId", + table: "SlotScores"); + + migrationBuilder.DropColumn( + name: "ChannelId", + table: "SlotScores"); + + migrationBuilder.DropColumn( + name: "MessageId", + table: "SlotScores"); + } + } +} diff --git a/ClemBot.Api/ClemBot.Api.Data/Migrations/ClemBotContextModelSnapshot.cs b/ClemBot.Api/ClemBot.Api.Data/Migrations/ClemBotContextModelSnapshot.cs index eb043607..4a1870fb 100644 --- a/ClemBot.Api/ClemBot.Api.Data/Migrations/ClemBotContextModelSnapshot.cs +++ b/ClemBot.Api/ClemBot.Api.Data/Migrations/ClemBotContextModelSnapshot.cs @@ -570,9 +570,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("ChannelId") + .HasColumnType("numeric(20,0)"); + b.Property("GuildId") .HasColumnType("numeric(20,0)"); + b.Property("MessageId") + .HasColumnType("numeric(20,0)"); + b.Property("Score") .HasColumnType("numeric(20,0)"); @@ -584,6 +590,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); + b.HasIndex("ChannelId"); + b.HasIndex("GuildId"); b.HasIndex("UserId"); @@ -970,6 +978,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("ClemBot.Api.Data.Models.SlotScore", b => { + b.HasOne("ClemBot.Api.Data.Models.Channel", "Channel") + .WithMany() + .HasForeignKey("ChannelId"); + b.HasOne("ClemBot.Api.Data.Models.Guild", "Guild") .WithMany() .HasForeignKey("GuildId") @@ -982,6 +994,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("Channel"); + b.Navigation("Guild"); b.Navigation("User"); diff --git a/ClemBot.Api/ClemBot.Api.Data/Models/SlotScore.cs b/ClemBot.Api/ClemBot.Api.Data/Models/SlotScore.cs index a317df90..d64e9d10 100644 --- a/ClemBot.Api/ClemBot.Api.Data/Models/SlotScore.cs +++ b/ClemBot.Api/ClemBot.Api.Data/Models/SlotScore.cs @@ -10,10 +10,14 @@ public class SlotScore public ulong Score { get; set; } public LocalDateTime Time { get; set; } + public ulong? MessageId { get; set; } public Guild Guild { get; set; } = null!; public ulong GuildId { get; set; } public User User { get; set; } = null!; public ulong UserId { get; set; } + + public ulong? ChannelId { get; set; } + public Channel? Channel { get; set; } = null!; } diff --git a/ClemBot.Bot/bot/api/guild_route.py b/ClemBot.Bot/bot/api/guild_route.py index 790bf3b3..cc8a0896 100644 --- a/ClemBot.Bot/bot/api/guild_route.py +++ b/ClemBot.Bot/bot/api/guild_route.py @@ -44,7 +44,7 @@ async def get_all_guilds(self) -> list[Guild]: async def get_guild_slot_scores( self, guild_id: int, limit: int, leader: bool - ) -> list[SlotScore]: + ) -> t.List[SlotScore]: resp = await self._client.get( f"bot/Guilds/{guild_id}/SlotScores", params={"leader": str(leader), "limit": limit} ) diff --git a/ClemBot.Bot/bot/api/slots_score_route.py b/ClemBot.Bot/bot/api/slots_score_route.py index 77438915..746a9521 100644 --- a/ClemBot.Bot/bot/api/slots_score_route.py +++ b/ClemBot.Bot/bot/api/slots_score_route.py @@ -9,8 +9,20 @@ def __init__(self, api_client: ApiClient): super().__init__(api_client) async def add_slot_score( - self, score: int, guild_id: int, user_id: int, **kwargs: t.Any + self, + score: int, + guild_id: int, + user_id: int, + message_id: int, + channel_id: int, + **kwargs: t.Any ) -> None: - json = {"Score": score, "GuildId": guild_id, "UserId": user_id} + json = { + "Score": score, + "GuildId": guild_id, + "UserId": user_id, + "MessageId": message_id, + "ChannelId": channel_id, + } await self._client.post("bot/slotscores", data=json, **kwargs) diff --git a/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py b/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py index 84d4141f..70569dba 100644 --- a/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py +++ b/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py @@ -3,6 +3,7 @@ import random import typing as t from collections import Counter +from datetime import datetime from typing import List, Tuple, Union import discord @@ -12,6 +13,8 @@ import bot.extensions as ext from bot.clem_bot import ClemBot from bot.consts import Colors +from bot.models.guild_models import SlotScore +from bot.utils import helpers from bot.utils.helpers import chunk_sequence from bot.utils.logging_utils import get_logger @@ -117,6 +120,30 @@ class SlotsCog(commands.Cog): def __init__(self, bot: ClemBot) -> None: self.bot = bot + async def format_board_embed( + self, ctx: ext.ClemBotCtx, scores: List[SlotScore], title: str, emoji: str + ): + embed = discord.Embed(title=title, colour=Colors.ClemsonOrange) + + if len(scores) == 0: + embed.add_field(name="Scores", value="No scores found.") + for i, score in enumerate(scores): + user = await self.bot.fetch_user(score.user_id) + + if not user: + continue + msg = f"Achieved on {score.time_occurred.strftime('%B %d, %Y')}" + if score.message_id and score.channel_id: + msg += f" [here](https://discord.com/channels/{ctx.guild.id}/{score.channel_id}/{score.message_id})" + embed.add_field( + name=f"{emoji} {i + 1: >3}. {user.name} - {score.high_score}", + value=msg + "\n", + inline=False, + ) + + embed.set_footer(text=str(ctx.author), icon_url=ctx.author.display_avatar.url) + return embed + @ext.group(aliases=["slotmachine"], invoke_without_command=True, case_insensitive=True) @commands.cooldown(1, SLOTS_COMMAND_COOLDOWN, commands.BucketType.user) @ext.long_help("A slot machine inside discord with a chance to win fame and fortune") @@ -134,58 +161,30 @@ async def slots(self, ctx: ext.ClemBotCtx) -> None: embed.add_field(name="**SCORE!!**", value=score[1], inline=False) await msg.edit(embed=embed) - await self.bot.slots_score_route.add_slot_score(score[1], ctx.guild.id, ctx.author.id) + await self.bot.slots_score_route.add_slot_score( + score[1], ctx.guild.id, ctx.author.id, msg.id, msg.channel.id + ) @slots.command(aliases=["top", "winners"]) async def leaderboard(self, ctx: ext.ClemBotCtx) -> None: scores = await self.bot.guild_route.get_guild_slot_scores(ctx.guild.id, 10, True) - scores_str = "" - if len(scores) == 0: - scores_str = "No scores found" - - for i, score in enumerate(scores): - user = self.bot.get_user(score.user_id) - - if not user: - continue - - scores_str += f"{i+1: >3}. {user.name}: {score.high_score}\n" - - embed = discord.Embed( - title="πŸ’Ž ClemBot Slot Machine Leaderboard πŸ’Ž", colour=Colors.ClemsonOrange + await ctx.send( + embed=await self.format_board_embed( + ctx, scores, "πŸ’Ž ClemBot Slot Machine Leaderboard πŸ’Ž", "πŸ‘‘" + ) ) - embed.add_field(name="Leaderboard", value=f"```{scores_str}```") - embed.set_footer(text=str(ctx.author), icon_url=ctx.author.display_avatar.url) - - await ctx.send(embed=embed) - @slots.command(aliases=["bottom", "losers"]) async def loserboard(self, ctx: ext.ClemBotCtx) -> None: scores = await self.bot.guild_route.get_guild_slot_scores(ctx.guild.id, 10, False) - scores_str = "" - if len(scores) == 0: - scores_str = "No scores found" - - for i, score in enumerate(scores): - user = self.bot.get_user(score.user_id) - - if not user: - continue - - scores_str += f"{i+1: >3}. {user.name}: {score.high_score}\n" - - embed = discord.Embed( - title="πŸ’© ClemBot Slot Machine Loserboard πŸ’©", colour=Colors.ClemsonOrange + await ctx.send( + embed=await self.format_board_embed( + ctx, scores, "πŸ’© ClemBot Slot Machine Loserboard πŸ’©", "🀑" + ) ) - embed.add_field(name="Loserboard", value=f"```{scores_str}```") - embed.set_footer(text=str(ctx.author), icon_url=ctx.author.display_avatar.url) - - await ctx.send(embed=embed) - def _calculate_score( self, paylines: np.ndarray[t.Any, t.Any] ) -> tuple[list[str | list[str]], int]: diff --git a/ClemBot.Bot/bot/models/guild_models.py b/ClemBot.Bot/bot/models/guild_models.py index cfbaab2b..8e962fef 100644 --- a/ClemBot.Bot/bot/models/guild_models.py +++ b/ClemBot.Bot/bot/models/guild_models.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Optional from bot.models.clem_bot_model import ClemBotModel @@ -12,3 +13,6 @@ class Guild(ClemBotModel): class SlotScore(ClemBotModel): high_score: int user_id: int + time_occurred: datetime + message_id: Optional[int] + channel_id: Optional[int] From ffebdb084ec5cb6305a863dedfa249e0a4be4b68 Mon Sep 17 00:00:00 2001 From: Janet Taylor Date: Tue, 21 Nov 2023 09:41:45 -0500 Subject: [PATCH 2/4] lint --- ClemBot.Bot/bot/cogs/random_cog/slots_cog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py b/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py index 70569dba..d03d85a0 100644 --- a/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py +++ b/ClemBot.Bot/bot/cogs/random_cog/slots_cog.py @@ -122,7 +122,7 @@ def __init__(self, bot: ClemBot) -> None: async def format_board_embed( self, ctx: ext.ClemBotCtx, scores: List[SlotScore], title: str, emoji: str - ): + ) -> discord.Embed: embed = discord.Embed(title=title, colour=Colors.ClemsonOrange) if len(scores) == 0: From 4ce613750236b32c1f6841fa0c565844469d0934 Mon Sep 17 00:00:00 2001 From: Janet Taylor Date: Tue, 28 Nov 2023 13:56:17 -0500 Subject: [PATCH 3/4] quick fix: insert scheme into url if not present in ping cog --- ClemBot.Bot/bot/cogs/ping_pong_cog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ClemBot.Bot/bot/cogs/ping_pong_cog.py b/ClemBot.Bot/bot/cogs/ping_pong_cog.py index 9c6809ea..80ede066 100644 --- a/ClemBot.Bot/bot/cogs/ping_pong_cog.py +++ b/ClemBot.Bot/bot/cogs/ping_pong_cog.py @@ -42,6 +42,8 @@ async def handle_external_ping(self, ctx: ext.ClemBotCtx, url: str) -> None: start = time.perf_counter() color = Colors.Error message = None + if not url.startswith("http"): + url = "https://" + url try: async with aiohttp.ClientSession() as session: await session.get(url, timeout=timeout) From c217325096101181b0a1e5c574dfc5f3632449d7 Mon Sep 17 00:00:00 2001 From: Janet Taylor Date: Fri, 8 Dec 2023 11:23:14 -0500 Subject: [PATCH 4/4] revert change --- ClemBot.Bot/bot/api/guild_route.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ClemBot.Bot/bot/api/guild_route.py b/ClemBot.Bot/bot/api/guild_route.py index cc8a0896..790bf3b3 100644 --- a/ClemBot.Bot/bot/api/guild_route.py +++ b/ClemBot.Bot/bot/api/guild_route.py @@ -44,7 +44,7 @@ async def get_all_guilds(self) -> list[Guild]: async def get_guild_slot_scores( self, guild_id: int, limit: int, leader: bool - ) -> t.List[SlotScore]: + ) -> list[SlotScore]: resp = await self._client.get( f"bot/Guilds/{guild_id}/SlotScores", params={"leader": str(leader), "limit": limit} )