예제 #1
0
        public static async Task <(string productCode, TitleInfo info)> LookupGameAsync(DiscordChannel channel, DiscordMessage message, string gameTitle)
        {
            var lastBotMessages = await channel.GetMessagesBeforeAsync(message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);

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

            try
            {
                var requestBuilder       = RequestBuilder.Start().SetSearch(gameTitle);
                var searchCompatListTask = Client.GetCompatResultAsync(requestBuilder, Config.Cts.Token);
                var localList            = CompatList.GetLocalCompatResult(requestBuilder);
                var status = await searchCompatListTask.ConfigureAwait(false);

                status = status.Append(localList);
                if ((status.ReturnCode == 0 || status.ReturnCode == 2) && status.Results.Any())
                {
                    var sortedList     = status.GetSortedList();
                    var bestMatch      = sortedList.First();
                    var listWithStatus = sortedList
                                         .TakeWhile(i => Math.Abs(i.score - bestMatch.score) < double.Epsilon)
                                         .Where(i => !string.IsNullOrEmpty(i.info.Status) && i.info.Status != "Unknown")
                                         .ToList();
                    if (listWithStatus.Count > 0)
                    {
                        bestMatch = listWithStatus.First();
                    }
                    var(code, info, score) = bestMatch;
                    Config.Log.Debug($"Looked up \"{gameTitle}\", got \"{info?.Title}\" with score {score}");
                    if (score < Config.GameTitleMatchThreshold)
                    {
                        return(null, null);
                    }

                    if (!string.IsNullOrEmpty(info?.Title))
                    {
                        StatsStorage.GameStatCache.TryGetValue(info.Title, out int stat);
                        StatsStorage.GameStatCache.Set(info.Title, ++stat, StatsStorage.CacheTime);
                    }

                    return(code, info);
                }
            }
            catch (Exception e)
            {
                Config.Log.Warn(e);
            }
            return(null, null);
        }
예제 #2
0
        public static async Task OnMessageCreated(DiscordClient _, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args?.Message))
            {
                return;
            }

#if !DEBUG
            if (!"help".Equals(args?.Channel?.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                return;
            }

            if (DateTime.UtcNow - lastMention < ThrottlingThreshold)
            {
                return;
            }
#endif

            var match = UploadLogMention.Match(args.Message.Content);
            if (!match.Success || string.IsNullOrEmpty(match.Groups["help"].Value))
            {
                return;
            }

            if (!await TheDoor.WaitAsync(0).ConfigureAwait(false))
            {
                return;
            }

            try
            {
                var explanation = await GetExplanationAsync(string.IsNullOrEmpty(match.Groups["vulkan"].Value)? "log" : "vulkan-1").ConfigureAwait(false);

                var lastBotMessages = await args.Channel.GetMessagesBeforeCachedAsync(args.Message.Id, 10).ConfigureAwait(false);

                foreach (var msg in lastBotMessages)
                {
                    if (BotReactionsHandler.NeedToSilence(msg).needToChill ||
                        (msg.Author.IsCurrent && msg.Content == explanation.Text))
                    {
                        return;
                    }
                }

                await args.Channel.SendMessageAsync(explanation.Text, explanation.Attachment, explanation.AttachmentFilename).ConfigureAwait(false);

                lastMention = DateTime.UtcNow;
            }
            finally
            {
                TheDoor.Release();
            }
        }
예제 #3
0
        public static async Task OnMessageCreated(DiscordClient c, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                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 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 LookupAndPostProductCodeEmbedAsync(c, args.Message, codesToLookup).ConfigureAwait(false);
        }
        public static async Task <(string productCode, TitleInfo info)> LookupGameAsync(DiscordChannel channel, DiscordMessage message, string gameTitle)
        {
            var lastBotMessages = await channel.GetMessagesBeforeAsync(message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);

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

            try
            {
                var requestBuilder = RequestBuilder.Start().SetSearch(gameTitle);
                var status         = await Client.GetCompatResultAsync(requestBuilder, Config.Cts.Token).ConfigureAwait(false);

                if ((status.ReturnCode == 0 || status.ReturnCode == 2) && status.Results.Any())
                {
                    var(code, info, score) = status.GetSortedList().First();
                    Config.Log.Debug($"Looked up \"{gameTitle}\", got \"{info?.Title}\" with score {score}");
                    if (score < 0.51)
                    {
                        return(null, null);
                    }

                    if (!string.IsNullOrEmpty(info?.Title))
                    {
                        StatsStorage.GameStatCache.TryGetValue(info.Title, out int stat);
                        StatsStorage.GameStatCache.Set(info.Title, ++stat, StatsStorage.CacheTime);
                    }

                    return(code, info);
                }
            }
            catch (Exception e)
            {
                Config.Log.Warn(e);
            }
            return(null, null);
        }
예제 #5
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);
            }
        }