Example #1
0
        public static async Task OnMessageCreated(DiscordClient c, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if ("media".Equals(args.Channel.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                return;
            }

            var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);

            foreach (var msg in lastBotMessages)
            {
                if (BotReactionsHandler.NeedToSilence(msg).needToChill)
                {
                    return;
                }
            }

            lastBotMessages = await args.Channel.GetMessagesBeforeCachedAsync(args.Message.Id, Config.ProductCodeLookupHistoryThrottle).ConfigureAwait(false);

            StringBuilder previousRepliesBuilder = null;

            foreach (var msg in lastBotMessages)
            {
                if (msg.Author.IsCurrent)
                {
                    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;
            }

            var suffix = issuesToLookup.Count == 1 ? "" : "s";

            if (GithubClient.Client.RateLimitRemaining - issuesToLookup.Count >= 10)
            {
                foreach (var issueId in issuesToLookup)
                {
                    await Pr.LinkIssue(c, args.Message, issueId).ConfigureAwait(false);
                }
            }
            else
            {
                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);
            }
        }