mirror of
https://github.com/RPCS3/discord-bot.git
synced 2024-11-23 10:19:39 +00:00
commit
54c47b7f11
@ -16,6 +16,7 @@ using DSharpPlus;
|
||||
using DSharpPlus.CommandsNext;
|
||||
using DSharpPlus.CommandsNext.Attributes;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.EventArgs;
|
||||
using DSharpPlus.Interactivity.Extensions;
|
||||
using PsnClient.POCOs;
|
||||
|
||||
@ -134,9 +135,6 @@ internal sealed partial class Psn
|
||||
var sqvat = ctx.Client.GetEmoji(":sqvat:", Config.Reactions.No)!;
|
||||
await ctx.Message.ReactWithAsync(sqvat).ConfigureAwait(false);
|
||||
}
|
||||
if (embeds.Count > 1 || embeds[0].Fields.Count > 0)
|
||||
embeds[^1] = embeds.Last().WithFooter("Note that you need to install ALL listed updates, one by one");
|
||||
|
||||
var resultMsgBuilder = new DiscordMessageBuilder()
|
||||
.WithEmbed(embeds[0])
|
||||
.WithReply(ctx.Message.Id);
|
||||
@ -221,5 +219,38 @@ internal sealed partial class Psn
|
||||
await Task.Delay(TimeSpan.FromHours(1), cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
internal static async Task OnCheckUpdatesButtonClick(DiscordClient client, ComponentInteractionCreateEventArgs e)
|
||||
{
|
||||
var btnId = e.Interaction.Data.CustomId;
|
||||
var parts = btnId.Split(':');
|
||||
if (parts.Length != 4)
|
||||
{
|
||||
Config.Log.Warn("Invalid interaction id: " + btnId);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var authorId = ulong.Parse(parts[1]);
|
||||
var refMsgId = ulong.Parse(parts[2]);
|
||||
var productCode = parts[3];
|
||||
if (e.User.Id != authorId)
|
||||
return;
|
||||
|
||||
e.Handled = true;
|
||||
await e.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate).ConfigureAwait(false);
|
||||
await e.Message.DeleteAsync().ConfigureAwait(false);
|
||||
var refMsg = await e.Channel.GetMessageAsync(refMsgId).ConfigureAwait(false);
|
||||
var cne = client.GetCommandsNext();
|
||||
var cmd = cne.FindCommand("psn check updates", out _);
|
||||
var context = cne.CreateContext(refMsg, Config.CommandPrefix, cmd, productCode);
|
||||
await cne.ExecuteCommandAsync(context).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Config.Log.Warn(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,52 +1,23 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
using CompatBot.Commands;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.CommandsNext;
|
||||
using DSharpPlus.EventArgs;
|
||||
|
||||
namespace CompatBot.EventHandlers;
|
||||
|
||||
internal static class GlobalButtonHandler
|
||||
{
|
||||
private const string ReplaceWithUpdatesPrefix = "replace with game updates:";
|
||||
|
||||
public static async Task OnComponentInteraction(DiscordClient sender, ComponentInteractionCreateEventArgs e)
|
||||
{
|
||||
if (e.Interaction.Type != InteractionType.Component
|
||||
|| e.Interaction.Data.ComponentType != ComponentType.Button
|
||||
|| e.Interaction.Data.CustomId is not {Length: >0})
|
||||
if (e.Interaction is not { Type: InteractionType.Component }
|
||||
or not { Data.ComponentType: ComponentType.Button }
|
||||
or not { Data.CustomId.Length: > 0 })
|
||||
return;
|
||||
|
||||
const string replaceWithUpdatesPrefix = "replace with game updates:";
|
||||
var btnId = e.Interaction.Data.CustomId;
|
||||
if (btnId.StartsWith(replaceWithUpdatesPrefix))
|
||||
{
|
||||
var parts = btnId.Split(':');
|
||||
if (parts.Length != 4)
|
||||
{
|
||||
Config.Log.Warn("Invalid interaction id: " + btnId);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var authorId = ulong.Parse(parts[1]);
|
||||
var refMsgId = ulong.Parse(parts[2]);
|
||||
var productCode = parts[3];
|
||||
if (e.User.Id != authorId)
|
||||
return;
|
||||
|
||||
e.Handled = true;
|
||||
await e.Interaction.CreateResponseAsync(InteractionResponseType.DeferredMessageUpdate).ConfigureAwait(false);
|
||||
await e.Message.DeleteAsync().ConfigureAwait(false);
|
||||
var refMsg = await e.Channel.GetMessageAsync(refMsgId).ConfigureAwait(false);
|
||||
var cne = sender.GetCommandsNext();
|
||||
var cmd = cne.FindCommand("psn check updates", out _);
|
||||
var context = cne.CreateContext(refMsg, Config.CommandPrefix, cmd, productCode);
|
||||
await cne.ExecuteCommandAsync(context).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Config.Log.Warn(ex);
|
||||
}
|
||||
}
|
||||
if (btnId.StartsWith(ReplaceWithUpdatesPrefix))
|
||||
await Psn.Check.OnCheckUpdatesButtonClick(sender, e);
|
||||
}
|
||||
}
|
@ -13,7 +13,6 @@ using CompatBot.Utils.ResultFormatters;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.EventArgs;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
|
||||
namespace CompatBot.EventHandlers;
|
||||
|
||||
@ -52,44 +51,51 @@ internal static class IsTheGamePlayableHandler
|
||||
if (!matches.Any())
|
||||
return;
|
||||
|
||||
var gameTitle = matches.Select(m => m.Groups["game_title_1"].Value)
|
||||
.Concat(matches.Select(m => m.Groups["game_title_2"].Value))
|
||||
.Concat(matches.Select(m => m.Groups["game_title_3"].Value))
|
||||
.FirstOrDefault(t => !string.IsNullOrEmpty(t));
|
||||
if (string.IsNullOrEmpty(gameTitle) || gameTitle.Length < 2)
|
||||
return;
|
||||
|
||||
gameTitle = CompatList.FixGameTitleSearch(gameTitle);
|
||||
if (gameTitle.Length < 4)
|
||||
return;
|
||||
|
||||
if (ProductCodeLookup.ProductCode.IsMatch(args.Message.Content))
|
||||
return;
|
||||
|
||||
var (_, info) = await LookupGameAsync(args.Channel, args.Message, gameTitle).ConfigureAwait(false);
|
||||
if (string.IsNullOrEmpty(info?.Status))
|
||||
return;
|
||||
|
||||
gameTitle = info.Title?.StripMarks();
|
||||
if (string.IsNullOrEmpty(gameTitle))
|
||||
return;
|
||||
|
||||
var botSpamChannel = await c.GetChannelAsync(Config.BotSpamId).ConfigureAwait(false);
|
||||
var status = info.Status.ToLowerInvariant();
|
||||
string msg;
|
||||
if (status == "unknown")
|
||||
msg = $"{args.Message.Author.Mention} {gameTitle} status is {status}";
|
||||
else
|
||||
try
|
||||
{
|
||||
if (status != "playable")
|
||||
status += " (not playable)";
|
||||
msg = $"{args.Message.Author.Mention} {gameTitle} is {status}";
|
||||
if (!string.IsNullOrEmpty(info.Date))
|
||||
msg += $" since {info.ToUpdated()}";
|
||||
var gameTitle = matches.Select(m => m.Groups["game_title_1"].Value)
|
||||
.Concat(matches.Select(m => m.Groups["game_title_2"].Value))
|
||||
.Concat(matches.Select(m => m.Groups["game_title_3"].Value))
|
||||
.FirstOrDefault(t => !string.IsNullOrEmpty(t));
|
||||
if (string.IsNullOrEmpty(gameTitle) || gameTitle.Length < 2)
|
||||
return;
|
||||
|
||||
gameTitle = CompatList.FixGameTitleSearch(gameTitle);
|
||||
if (gameTitle.Length < 4)
|
||||
return;
|
||||
|
||||
if (ProductCodeLookup.ProductCode.IsMatch(args.Message.Content))
|
||||
return;
|
||||
|
||||
var (_, info) = await LookupGameAsync(args.Channel, args.Message, gameTitle).ConfigureAwait(false);
|
||||
if (string.IsNullOrEmpty(info?.Status))
|
||||
return;
|
||||
|
||||
gameTitle = info.Title?.StripMarks();
|
||||
if (string.IsNullOrEmpty(gameTitle))
|
||||
return;
|
||||
|
||||
var botSpamChannel = await c.GetChannelAsync(Config.BotSpamId).ConfigureAwait(false);
|
||||
var status = info.Status.ToLowerInvariant();
|
||||
string msg;
|
||||
if (status == "unknown")
|
||||
msg = $"{args.Message.Author.Mention} {gameTitle} status is {status}";
|
||||
else
|
||||
{
|
||||
if (status != "playable")
|
||||
status += " (not playable)";
|
||||
msg = $"{args.Message.Author.Mention} {gameTitle} is {status}";
|
||||
if (!string.IsNullOrEmpty(info.Date))
|
||||
msg += $" since {info.ToUpdated()}";
|
||||
}
|
||||
msg += $"\nfor more results please use compatibility list (<https://rpcs3.net/compatibility>) or `{Config.CommandPrefix}c` command in {botSpamChannel.Mention} (`!c {gameTitle.Sanitize()}`)";
|
||||
await args.Channel.SendMessageAsync(msg).ConfigureAwait(false);
|
||||
CooldownBuckets[args.Channel.Id] = DateTime.UtcNow;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Config.Log.Error(e);
|
||||
}
|
||||
msg += $"\nfor more results please use compatibility list (<https://rpcs3.net/compatibility>) or `{Config.CommandPrefix}c` command in {botSpamChannel.Mention} (`!c {gameTitle.Sanitize()}`)";
|
||||
await args.Channel.SendMessageAsync(msg).ConfigureAwait(false);
|
||||
CooldownBuckets[args.Channel.Id] = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public static async Task<(string? productCode, TitleInfo? info)> LookupGameAsync(DiscordChannel channel, DiscordMessage message, string gameTitle)
|
||||
|
@ -82,7 +82,7 @@ internal static class ProductCodeLookup
|
||||
await FixAfrikaAsync(client, message, result.builder).ConfigureAwait(false);
|
||||
var messageBuilder = new DiscordMessageBuilder().WithEmbed(result.builder);
|
||||
if (LimitedToSpamChannel.IsSpamChannel(channel))
|
||||
messageBuilder.AddComponents(new DiscordButtonComponent(ButtonStyle.Secondary, $"replace with game updates:{message.Author.Id}:{message.Id}:{result.code}", "Check game updates instead", emoji: lookupEmoji));
|
||||
messageBuilder.AddComponents(new DiscordButtonComponent(ButtonStyle.Secondary, $"replace with game updates:{message.Author.Id}:{message.Id}:{result.code}", "Check for updates", emoji: lookupEmoji));
|
||||
await DiscordMessageExtensions.UpdateOrCreateMessageAsync(null, channel, messageBuilder).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -33,9 +33,9 @@ internal static class TitlePatchFormatter
|
||||
var pages = pkgs.Length / EmbedPager.MaxFields + (pkgs.Length % EmbedPager.MaxFields == 0 ? 0 : 1);
|
||||
if (pages > 1)
|
||||
embedBuilder.Title = $"{title} [Part 1 of {pages}]".Trim(EmbedPager.MaxFieldTitleLength);
|
||||
var desc = $"Total download size of all {pkgs.Length} packages is {pkgs.Sum(p => p.Size).AsStorageUnit()}";
|
||||
if (patch?.OfflineCacheTimestamp is DateTime cacheTimestamp)
|
||||
desc = $"{desc}\n(Offline cache, last updated {(DateTime.UtcNow - cacheTimestamp).AsTimeDeltaDescription()} ago)";
|
||||
var desc = $"ℹ️ Total download size of all {pkgs.Length} packages is {pkgs.Sum(p => p.Size).AsStorageUnit()}.\n" +
|
||||
"\n" +
|
||||
"⚠️ You **must** install updates starting with the first. You **can not** install only the latest update.";
|
||||
embedBuilder.Description = desc;
|
||||
var i = 0;
|
||||
do
|
||||
@ -64,6 +64,8 @@ internal static class TitlePatchFormatter
|
||||
embedBuilder.Description = "No update information available";
|
||||
if (!result.Any() || embedBuilder.Fields.Any())
|
||||
result.Add(embedBuilder);
|
||||
if (patch?.OfflineCacheTimestamp is DateTime cacheTimestamp)
|
||||
result[^1].WithFooter($"Offline cache, last updated {(DateTime.UtcNow - cacheTimestamp).AsTimeDeltaDescription()} ago");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user