コード例 #1
0
        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}");
                }
            }
        }
コード例 #2
0
        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);
            }
        }