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); }
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(); } }
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); }
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); } }