public static async Task OnMessageCreated(MessageCreateEventArgs args) { if (args.Author.IsBot) { return; } if (string.IsNullOrEmpty(args.Message.Content) || args.Message.Content.StartsWith(Config.CommandPrefix)) { return; } var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false); foreach (var msg in lastBotMessages) { if (BotShutupHandler.NeedToSilence(msg)) { return; } } lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, Config.ProductCodeLookupHistoryThrottle).ConfigureAwait(false); StringBuilder previousRepliesBuilder = null; foreach (var msg in lastBotMessages) { if (msg.Author.IsCurrent) { previousRepliesBuilder = previousRepliesBuilder ?? new StringBuilder(); previousRepliesBuilder.AppendLine(msg.Content); var embeds = msg.Embeds; if (embeds?.Count > 0) { foreach (var embed in embeds) { previousRepliesBuilder.AppendLine(embed.Title).AppendLine(embed.Description); } } } } var previousReplies = previousRepliesBuilder?.ToString() ?? ""; var codesToLookup = GetProductIds(args.Message.Content) .Where(c => !previousReplies.Contains(c, StringComparison.InvariantCultureIgnoreCase)) .Take(args.Channel.IsPrivate ? 50 : 5) .ToList(); if (codesToLookup.Count == 0) { return; } await args.Channel.TriggerTypingAsync().ConfigureAwait(false); var results = new List <(string code, Task <DiscordEmbed> task)>(codesToLookup.Count); foreach (var code in codesToLookup) { results.Add((code, args.Client.LookupGameInfoAsync(code))); } var formattedResults = new List <DiscordEmbed>(results.Count); foreach (var result in results) { try { formattedResults.Add(await result.task.ConfigureAwait(false)); } catch (Exception e) { Config.Log.Warn(e, $"Couldn't get product code info for {result.code}"); } } // get only results with unique titles formattedResults = formattedResults.GroupBy(e => e.Title).Select(g => g.First()).ToList(); DiscordEmoji sqvat = null; foreach (var result in formattedResults) { try { if (!args.Channel.IsPrivate && args.Message.Author.Id == 197163728867688448 && ( result.Title.Contains("africa", StringComparison.InvariantCultureIgnoreCase) || result.Title.Contains("afrika", StringComparison.InvariantCultureIgnoreCase) )) { sqvat = sqvat ?? DiscordEmoji.FromName(args.Client, ":sqvat:"); await args.Message.ReactWithAsync(args.Client, sqvat, "How about no (๑•ิཬ•ั๑)").ConfigureAwait(false); continue; } await args.Channel.SendMessageAsync(embed : result).ConfigureAwait(false); } catch (Exception e) { Config.Log.Warn(e, $"Couldn't post result for {result.Title}"); } } }
public static async Task OnMessageCreated(MessageCreateEventArgs args) { if (args.Author.IsBot) { return; } if (string.IsNullOrEmpty(args.Message.Content) || args.Message.Content.StartsWith(Config.CommandPrefix)) { return; } var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false); foreach (var msg in lastBotMessages) { if (BotShutupHandler.NeedToSilence(msg).needToChill) { return; } } lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, Config.ProductCodeLookupHistoryThrottle).ConfigureAwait(false); StringBuilder previousRepliesBuilder = null; foreach (var msg in lastBotMessages) { if (msg.Author.IsCurrent) { previousRepliesBuilder = previousRepliesBuilder ?? new StringBuilder(); previousRepliesBuilder.AppendLine(msg.Content); var embeds = msg.Embeds; if (embeds?.Count > 0) { foreach (var embed in embeds) { previousRepliesBuilder.AppendLine(embed.Title).AppendLine(embed.Description); } } } } var previousReplies = previousRepliesBuilder?.ToString() ?? ""; var idsFromPreviousReplies = GetIssueIdsFromLinks(previousReplies); var issuesToLookup = GetIssueIds(args.Message.Content) .Where(lnk => !idsFromPreviousReplies.Contains(lnk)) .Take(args.Channel.IsPrivate ? 50 : 5) .ToList(); if (issuesToLookup.Count == 0) { return; } await args.Message.ReactWithAsync(args.Client, Config.Reactions.PleaseWait).ConfigureAwait(false); var suffix = issuesToLookup.Count == 1 ? "" : "s"; try { var result = new StringBuilder($"Link{suffix} to the mentioned issue{suffix}:"); foreach (var issueId in issuesToLookup) { result.AppendLine().Append("https://github.com/RPCS3/rpcs3/issues/" + issueId); } await args.Channel.SendAutosplitMessageAsync(result, blockStart : null, blockEnd : null).ConfigureAwait(false); } finally { await args.Message.RemoveReactionAsync(Config.Reactions.PleaseWait).ConfigureAwait(false); } }