Exemplo n.º 1
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if (!args.Author.IsWhitelisted(args.Client, args.Message.Channel.Guild))
            {
                return;
            }

            if (!NeedToSilence(args.Message))
            {
                return;
            }

            var botMember = args.Guild?.CurrentMember ?? args.Client.GetMember(args.Client.CurrentUser);

            if (!args.Channel.PermissionsFor(botMember).HasPermission(Permissions.ReadMessageHistory))
            {
                await args.Message.ReactWithAsync(args.Client, DiscordEmoji.FromUnicode("🙅"), @"No can do, boss ¯\\_(ツ)\_/¯").ConfigureAwait(false);

                return;
            }

            await args.Message.ReactWithAsync(args.Client, DiscordEmoji.FromUnicode("😟"), "Okay (._.)").ConfigureAwait(false);

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

            if (lastBotMessages.OrderByDescending(m => m.CreationTimestamp).FirstOrDefault(m => m.Author.IsCurrent) is DiscordMessage msg)
            {
                await msg.DeleteAsync("asked to shut up").ConfigureAwait(false);
            }
        }
Exemplo n.º 2
0
        public static async Task OnMessageCreated(DiscordClient _, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            /*
             * (╯°□°)╯︵ ┻━┻
             * (ノ ゜Д゜)ノ ︵ ┻━┻
             * (ノಠ益ಠ)ノ彡┻━┻
             * ‎(ノಥ益ಥ)ノ ┻━┻
             * (ノಥДಥ)ノ︵┻━┻・/
             * (ノ^_^)ノ┻━┻
             * (/¯◡ ‿ ◡)/¯ ~ ┻━┻
             *
             * this might look the same, but only because of the font choice
             *
             * ┻━┻
             * ┻━┻
             */
            try
            {
                var content = args.Message.Content;

                if (content.Contains("🎲") && Regex.IsMatch(content, @"(🎲|\s)+"))
                {
                    var count = 1;
                    var idx   = content.IndexOf("🎲");
                    while (idx < content.Length && (idx = content.IndexOf("🎲", idx + 1)) > 0)
                    {
                        count++;
                    }
                    await Misc.RollImpl(args.Message, $"{count}d6").ConfigureAwait(false);

                    return;
                }

                if (content.Trim() == "🥠")
                {
                    await Fortune.ShowFortune(args.Message, args.Author).ConfigureAwait(false);

                    return;
                }

                if (!(content.Contains("┻━┻") ||
                      content.Contains("┻━┻")))
                {
                    return;
                }

                var tableIdx = content.IndexOf("┻━┻", StringComparison.Ordinal);
                if (tableIdx < 0)
                {
                    tableIdx = content.IndexOf("┻━┻", StringComparison.Ordinal);
                }
                var faceIdx = content[..tableIdx].LastIndexOfAny(OpenParen);
Exemplo n.º 3
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();
            }
        }
Exemplo n.º 4
0
        public static async Task OnMessageCreated(DiscordClient _, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

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

            if ((args.Message.Author as DiscordMember)?.Roles.Any() ?? false)
            {
                return;
            }

            if (LogLine.IsMatch(args.Message.Content))
            {
                var    brokenDump = false;
                string msg        = "";
                if (args.Message.Content.Contains("LDR:"))
                {
                    brokenDump = true;
                    if (args.Message.Content.Contains("fs::file is null"))
                    {
                        msg = $"{args.Message.Author.Mention} this error usually indicates a missing `.rap` license file.\n";
                    }
                    else if (args.Message.Content.Contains("Invalid or unsupported file format"))
                    {
                        msg = $"{args.Message.Author.Mention} this error usually indicates an encrypted or corrupted game dump.\n";
                    }
                    else
                    {
                        brokenDump = false;
                    }
                }
                var logUploadExplain = await PostLogHelpHandler.GetExplanationAsync("log").ConfigureAwait(false);

                if (brokenDump)
                {
                    msg += "Please follow the quickstart guide to get a proper dump of a digital title.\n" +
                           "Also please upload the full RPCS3 log instead of pasting only a section which may be completely irrelevant.\n" +
                           logUploadExplain.Text;
                }
                else
                {
                    msg = $"{args.Message.Author.Mention} please upload the full RPCS3 log instead of pasting only a section which may be completely irrelevant." +
                          logUploadExplain.Text;
                }
                await args.Channel.SendMessageAsync(msg, logUploadExplain.Attachment, logUploadExplain.AttachmentFilename).ConfigureAwait(false);
            }
        }
Exemplo n.º 5
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if (args.Channel.IsPrivate)
            {
                return;
            }

            if (args.Author.IsCurrent)
            {
                return;
            }

            if (args.Author.Id == 197163728867688448ul)
            {
                return;
            }

            if (!MessageQueue.TryGetValue(args.Channel.Id, out var queue))
            {
                MessageQueue[args.Channel.Id] = queue = new ConcurrentQueue <DiscordMessage>();
            }
            queue.Enqueue(args.Message);
            while (queue.Count > 4)
            {
                queue.TryDequeue(out _);
            }
            var content = args.Message.Content;

            if (string.IsNullOrEmpty(content))
            {
                return;
            }

            if (Throttling.TryGetValue(args.Channel.Id, out object mark) && mark != null)
            {
                return;
            }

            var similarList = queue.Where(msg => content.Equals(msg.Content, StringComparison.InvariantCultureIgnoreCase)).ToList();

            if (similarList.Count > 2 && similarList.Select(msg => msg.Author.Id).Distinct().Count() > new Random().Next(2, 5))
            {
                Throttling.Set(args.Channel.Id, similarList, ThrottleDuration);
                var botMsg = await args.Channel.SendMessageAsync(content.ToLowerInvariant()).ConfigureAwait(false);

                similarList.Add(botMsg);
            }
        }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
0
        private static async Task <bool> IsClean(DiscordClient client, DiscordMessage message)
        {
            if (DefaultHandlerFilter.IsFluff(message))
            {
                return(true);
            }

            if (message.Author.IsWhitelisted(client, message.Channel.Guild))
            {
                return(true);
            }

            string trigger  = null;
            var    severity = ReportSeverity.Low;

            try
            {
                trigger = await PiracyStringProvider.FindTriggerAsync(message.Content);

                if (trigger == null)
                {
                    return(true);
                }

                await message.Channel.DeleteMessageAsync(message, $"Mention of piracy trigger '{trigger}'").ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Config.Log.Warn(e, $"Couldn't delete message in {message.Channel.Name}");
                severity = ReportSeverity.High;
            }
            try
            {
                var rules = await client.GetChannelAsync(Config.BotRulesChannelId).ConfigureAwait(false);

                await Task.WhenAll(
                    message.Channel.SendMessageAsync($"{message.Author.Mention} Please follow the {rules.Mention} and do not discuss piracy on this server. Repeated offence may result in a ban."),
                    client.ReportAsync("Mention of piracy", message, trigger, message.Content, severity),
                    Warnings.AddAsync(client, message, message.Author.Id, message.Author.Username, client.CurrentUser, "Mention of piracy", message.Content.Sanitize())
                    ).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Config.Log.Warn(e, $"Couldn't finish piracy trigger actions for a message in {message.Channel.Name}");
            }
            return(false);
        }
Exemplo n.º 8
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            var matches = BuildLinks.Matches(args.Message.Content);

            if (matches.Count == 0)
            {
                return;
            }

            await args.Message.ReactWithAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);

            try
            {
                var lookedUp = 0;
                foreach (Match match in matches)
                {
                    if (lookedUp > 0 && global::GithubClient.Client.RateLimitRemaining < Math.Max(20, global::GithubClient.Client.RateLimit / 2))
                    {
                        await args.Message.RespondAsync("Further lookups are rate limited by github API").ConfigureAwait(false);

                        break;
                    }

                    if (lookedUp > 4)
                    {
                        break;
                    }

                    int?pr = null;
                    if (match.Groups["build_id"].Value is string buildId && !string.IsNullOrEmpty(buildId))
                    {
                        var buildInfo = await AppveyorClient.GetBuildInfoAsync("https://ci.appveyor.com/api/projects/rpcs3/rpcs3/build/" + buildId, Config.Cts.Token).ConfigureAwait(false);

                        pr = buildInfo?.Build?.PullRequestId;
                    }
                    else if (match.Groups["build_number"].Value is string buildNum && int.TryParse(buildNum, out var build))
                    {
                        var buildInfo = await AppveyorClient.GetBuildInfoAsync(build, Config.Cts.Token).ConfigureAwait(false);

                        pr = buildInfo?.Build?.PullRequestId;
                    }
Exemplo n.º 9
0
        public static async Task OnMessageCreated(DiscordClient _, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            /*
             * (╯°□°)╯︵ ┻━┻
             * (ノ ゜Д゜)ノ ︵ ┻━┻
             * (ノಠ益ಠ)ノ彡┻━┻
             * ‎(ノಥ益ಥ)ノ ┻━┻
             * (ノಥДಥ)ノ︵┻━┻・/
             * (ノ^_^)ノ┻━┻
             * (/¯◡ ‿ ◡)/¯ ~ ┻━┻
             *
             * this might look the same, but only because of the font choice
             *
             * ┻━┻
             * ┻━┻
             */
            try
            {
                var content = args.Message.Content;
                if (!(content.Contains("┻━┻") ||
                      content.Contains("┻━┻")))
                {
                    return;
                }

                var tableIdx = content.IndexOf("┻━┻");
                if (tableIdx < 0)
                {
                    tableIdx = content.IndexOf("┻━┻");
                }
                var faceIdx = content[..tableIdx].LastIndexOfAny(OpenParen);
Exemplo n.º 10
0
        public static async Task OnMessageCreated(DiscordClient c, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args?.Message))
            {
                return;
            }

#if !DEBUG
            if (!(args.Channel.Id == Config.BotGeneralChannelId ||
                  args.Channel.Name.Equals("help", StringComparison.InvariantCultureIgnoreCase)))
            {
                return;
            }

            if (CooldownBuckets.TryGetValue(args.Channel.Id, out var lastCheck) &&
                DateTime.UtcNow - lastCheck < CooldownThreshold)
            {
                return;
            }

            if (args.Author.IsSmartlisted(c, args.Guild))
            {
                return;
            }
#endif

            var matches = GameNameStatusMention1.Matches(args.Message.Content);
            if (!matches.Any())
            {
                return;
            }

            var gameTitle = matches.Select(m => m.Groups["game_title_1"].Value)
                            .Concat(matches.Select(m => m.Groups["game_title_2"].Value))
                            .Concat(matches.Select(m => m.Groups["game_title_3"].Value))
                            .FirstOrDefault(t => !string.IsNullOrEmpty(t));
            if (string.IsNullOrEmpty(gameTitle) || gameTitle.Length < 2)
            {
                return;
            }

            gameTitle = CompatList.FixGameTitleSearch(gameTitle);
            if (gameTitle.Length < 4)
            {
                return;
            }

            if (ProductCodeLookup.ProductCode.IsMatch(args.Message.Content))
            {
                return;
            }

            var(_, info) = await LookupGameAsync(args.Channel, args.Message, gameTitle).ConfigureAwait(false);

            if (string.IsNullOrEmpty(info?.Status))
            {
                return;
            }

            gameTitle = info.Title?.StripMarks();
            if (string.IsNullOrEmpty(gameTitle))
            {
                return;
            }

            var botSpamChannel = await c.GetChannelAsync(Config.BotSpamId).ConfigureAwait(false);

            var    status = info.Status.ToLowerInvariant();
            string msg;
            if (status == "unknown")
            {
                msg = $"{args.Message.Author.Mention} {gameTitle} status is {status}";
            }
            else
            {
                if (status != "playable")
                {
                    status += " (not playable)";
                }
                msg = $"{args.Message.Author.Mention} {gameTitle} is {status}";
                if (!string.IsNullOrEmpty(info.Date))
                {
                    msg += $" since {info.ToUpdated()}";
                }
            }
            msg += $"\nfor more results please use compatibility list (<https://rpcs3.net/compatibility>) or `{Config.CommandPrefix}c` command in {botSpamChannel.Mention} (`!c {gameTitle.Sanitize()}`)";
            await args.Channel.SendMessageAsync(msg).ConfigureAwait(false);

            CooldownBuckets[args.Channel.Id] = DateTime.UtcNow;
        }
Exemplo n.º 11
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);
            }
        }
Exemplo n.º 12
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if (args.Message.Channel.IsPrivate)
            {
                return;
            }

#if DEBUG
            if (args.Message.Content == "emoji test")
            {
                var badEmojis = new List <DiscordEmoji>(SadReactions.Concat(ThankYouReactions));
                var posted    = 0;
                var line      = 1;
                var msg       = await args.Channel.SendMessageAsync("Line " + line).ConfigureAwait(false);

                for (var i = 0; i < 5; i++)
                {
                    var tmp = new List <DiscordEmoji>();
                    foreach (var emoji in badEmojis)
                    {
                        try
                        {
                            await msg.CreateReactionAsync(emoji).ConfigureAwait(false);

                            if (++posted == 15)
                            {
                                line++;
                                posted = 0;
                                msg    = await args.Channel.SendMessageAsync("Line " + line).ConfigureAwait(false);
                            }
                        }
                        catch (Exception e)
                        {
                            Config.Log.Debug(e);
                            tmp.Add(emoji);
                        }
                    }
                    badEmojis = tmp;
                    if (badEmojis.Any())
                    {
                        await Task.Delay(1000).ConfigureAwait(false);
                    }
                }
                if (badEmojis.Any())
                {
                    await args.Channel.SendMessageAsync("Bad emojis: " + string.Concat(badEmojis)).ConfigureAwait(false);
                }
                else
                {
                    await args.Channel.SendMessageAsync("Everything looks fine").ConfigureAwait(false);
                }
                return;
            }
#endif

            var(needToSilence, needToThank) = NeedToSilence(args.Message);
            if (!(needToSilence || needToThank))
            {
                return;
            }

            if (needToThank)
            {
                DiscordEmoji emoji;
                string       thankYouMessage;
                lock (theDoor)
                {
                    emoji           = ThankYouReactions[rng.Next(ThankYouReactions.Length)];
                    thankYouMessage = LimitedToSpamChannel.IsSpamChannel(args.Channel) ? ThankYouMessages[rng.Next(ThankYouMessages.Length)] : null;
                }
                await args.Message.ReactWithAsync(emoji, thankYouMessage).ConfigureAwait(false);
            }
            if (needToSilence)
            {
                DiscordEmoji emoji;
                string       sadMessage;
                lock (theDoor)
                {
                    emoji      = SadReactions[rng.Next(SadReactions.Length)];
                    sadMessage = SadMessages[rng.Next(SadMessages.Length)];
                }
                await args.Message.ReactWithAsync(emoji, sadMessage).ConfigureAwait(false);

                if (args.Author.IsSmartlisted(args.Client, args.Message.Channel.Guild))
                {
                    var botMember = args.Guild?.CurrentMember ?? args.Client.GetMember(args.Client.CurrentUser);
                    if (args.Channel.PermissionsFor(botMember).HasPermission(Permissions.ReadMessageHistory))
                    {
                        var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.Add(-Config.ShutupTimeLimit)).ConfigureAwait(false);

                        if (lastBotMessages.OrderByDescending(m => m.CreationTimestamp).FirstOrDefault(m => m.Author.IsCurrent) is DiscordMessage msg)
                        {
                            await msg.DeleteAsync("asked to shut up").ConfigureAwait(false);
                        }
                    }
                    else
                    {
                        await args.Message.ReactWithAsync(DiscordEmoji.FromUnicode("🙅"), @"No can do, boss ¯\\_(ツ)\_/¯").ConfigureAwait(false);
                    }
                }
            }
        }
Exemplo n.º 13
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if (args.Channel.IsPrivate)
            {
                return;
            }

            if (args.Author.IsCurrent)
            {
                return;
            }

            if (args.Author.Id == 197163728867688448ul)
            {
                return;
            }

            if (!MessageQueue.TryGetValue(args.Channel.Id, out var queue))
            {
                MessageQueue[args.Channel.Id] = queue = new ConcurrentQueue <DiscordMessage>();
            }
            queue.Enqueue(args.Message);
            while (queue.Count > 10)
            {
                queue.TryDequeue(out _);
            }
            var content = args.Message.Content;

            if (string.IsNullOrEmpty(content))
            {
                return;
            }

            if (Throttling.TryGetValue(args.Channel.Id, out List <DiscordMessage> mark) && content.Equals(mark.FirstOrDefault()?.Content, StringComparison.OrdinalIgnoreCase))
            {
                mark.Add(args.Message);
                Config.Log.Debug($"Bailed out of repeating '{content}' due to throttling");
                return;
            }

            var similarList = queue.Where(msg => content.Equals(msg.Content, StringComparison.OrdinalIgnoreCase)).ToList();

            if (similarList.Count > 2)
            {
                var uniqueUsers = similarList.Select(msg => msg.Author.Id).Distinct().Count();
                if (uniqueUsers > 2)
                {
                    Throttling.Set(args.Channel.Id, similarList, ThrottleDuration);
                    var msgContent = GetAvgContent(similarList.Select(m => m.Content).ToList());
                    var botMsg     = await args.Channel.SendMessageAsync(msgContent).ConfigureAwait(false);

                    similarList.Add(botMsg);
                }
                else
                {
                    Config.Log.Debug($"Bailed out of repeating '{content}' due to {uniqueUsers} unique users");
                }
            }
        }
Exemplo n.º 14
0
        private static async Task CheckMessageForInvitesAsync(DiscordClient client, DiscordMessage message)
        {
            if (DefaultHandlerFilter.IsFluff(message))
            {
                return;
            }

            if (message.Author.IsWhitelisted(client, message.Channel.Guild))
            {
                return;
            }

            if (message.Reactions.Any(r => r.Emoji == Config.Reactions.Moderated && r.IsMe))
            {
                return;
            }

            var(hasInvalidResults, invites) = await client.GetInvitesAsync(message.Content).ConfigureAwait(false);

            if (!hasInvalidResults && invites.Count == 0)
            {
                return;
            }

            if (hasInvalidResults)
            {
                try
                {
                    await message.DeleteAsync("Not a white-listed discord invite link").ConfigureAwait(false);

                    await client.ReportAsync("An unapproved discord invite", message, "In invalid or expired invite", null, ReportSeverity.Low).ConfigureAwait(false);

                    await message.Channel.SendMessageAsync($"{message.Author.Mention} please refrain from posting invites that were not approved by a moderator, especially expired or invalid.").ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    Config.Log.Warn(e);
                    await client.ReportAsync("An unapproved discord invite", message, "In invalid or expired invite", null, ReportSeverity.Medium).ConfigureAwait(false);

                    await message.ReactWithAsync(
                        client,
                        Config.Reactions.Moderated,
                        $"{message.Author.Mention} please remove this expired or invalid invite, and refrain from posting it again until you have recieved an approval from a moderator.",
                        true
                        ).ConfigureAwait(false);
                }
                return;
            }

            foreach (var invite in invites)
            {
                if (!await InviteWhitelistProvider.IsWhitelistedAsync(invite).ConfigureAwait(false))
                {
                    try
                    {
                        await message.DeleteAsync("Not a white-listed discord invite link").ConfigureAwait(false);

                        await client.ReportAsync("An unapproved discord invite", message, $"Invite {invite.Code} was resolved to the {invite.Guild.Name} server", null, ReportSeverity.Low).ConfigureAwait(false);

                        await message.Channel.SendMessageAsync($"{message.Author.Mention} invites to the {invite.Guild.Name.Sanitize()} server are not whitelisted.\n" +
                                                               $"Please refrain from posting it again until you have recieved an approval from a moderator.").ConfigureAwait(false);
                    }
                    catch (Exception e)
                    {
                        Config.Log.Warn(e);
                        await client.ReportAsync("An unapproved discord invite", message, $"Invite {invite.Code} was resolved to the {invite.Guild.Name} server", null, ReportSeverity.Medium).ConfigureAwait(false);

                        await message.ReactWithAsync(
                            client,
                            Config.Reactions.Moderated,
                            $"{message.Author.Mention} invites to the {invite.Guild.Name.Sanitize()} server are not whitelisted.\n" +
                            $"Please remove it and refrain from posting it again until you have recieved an approval from a moderator.",
                            true
                            ).ConfigureAwait(false);
                    }
                    return;
                }
            }
        }
Exemplo n.º 15
0
        public static async Task OnMessageCreated(DiscordClient c, MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            if (args.Message.Channel.IsPrivate)
            {
                return;
            }

#if DEBUG
            if (args.Message.Content == "emoji test")
            {
                var badEmojis = new List <DiscordEmoji>(SadReactions.Concat(ThankYouReactions));
                var posted    = 0;
                var line      = 1;
                var msg       = await args.Channel.SendMessageAsync("Line " + line).ConfigureAwait(false);

                for (var i = 0; i < 5; i++)
                {
                    var tmp = new List <DiscordEmoji>();
                    foreach (var emoji in badEmojis)
                    {
                        try
                        {
                            await msg.CreateReactionAsync(emoji).ConfigureAwait(false);

                            if (++posted == 15)
                            {
                                line++;
                                posted = 0;
                                msg    = await args.Channel.SendMessageAsync("Line " + line).ConfigureAwait(false);
                            }
                        }
                        catch (Exception e)
                        {
                            Config.Log.Debug(e);
                            tmp.Add(emoji);
                        }
                    }
                    badEmojis = tmp;
                    if (badEmojis.Any())
                    {
                        await Task.Delay(1000).ConfigureAwait(false);
                    }
                }
                if (badEmojis.Any())
                {
                    await args.Channel.SendMessageAsync("Bad emojis: " + string.Concat(badEmojis)).ConfigureAwait(false);
                }
                else
                {
                    await args.Channel.SendMessageAsync("Everything looks fine").ConfigureAwait(false);
                }
                return;
            }
#endif

            if (!string.IsNullOrEmpty(args.Message.Content) && Paws.Matches(args.Message.Content) is MatchCollection mc)
            {
                using var db = new BotDb();
                var matchedGroups = (from m in mc
                                     from Group g in m.Groups
                                     where g.Success && !string.IsNullOrEmpty(g.Value)
                                     select g.Name
                                     ).Distinct()
                                    .ToArray();
                if (matchedGroups.Contains("kot"))
                {
                    if (!db.Kot.Any(k => k.UserId == args.Author.Id))
                    {
                        db.Kot.Add(new Kot {
                            UserId = args.Author.Id
                        });
                        await db.SaveChangesAsync().ConfigureAwait(false);
                    }
                }
                if (matchedGroups.Contains("doggo"))
                {
                    if (!db.Doggo.Any(d => d.UserId == args.Author.Id))
                    {
                        db.Doggo.Add(new Doggo {
                            UserId = args.Author.Id
                        });
                        await db.SaveChangesAsync().ConfigureAwait(false);
                    }
                }
            }

            var(needToSilence, needToThank) = NeedToSilence(args.Message);
            if (!(needToSilence || needToThank))
            {
                return;
            }

            if (needToThank)
            {
                DiscordEmoji emoji;
                string       thankYouMessage;
                lock (theDoor)
                {
                    emoji           = ThankYouReactions[rng.Next(ThankYouReactions.Length)];
                    thankYouMessage = LimitedToSpamChannel.IsSpamChannel(args.Channel) ||
                                      LimitedToOfftopicChannel.IsOfftopicChannel(args.Channel)
                        ? ThankYouMessages[rng.Next(ThankYouMessages.Length)]
                        : null;
                }
                await args.Message.ReactWithAsync(emoji, thankYouMessage).ConfigureAwait(false);
            }
            if (needToSilence)
            {
                DiscordEmoji emoji;
                string       sadMessage;
                lock (theDoor)
                {
                    emoji      = SadReactions[rng.Next(SadReactions.Length)];
                    sadMessage = SadMessages[rng.Next(SadMessages.Length)];
                }
                await args.Message.ReactWithAsync(emoji, sadMessage).ConfigureAwait(false);

                if (args.Author.IsSmartlisted(c, args.Message.Channel.Guild))
                {
                    var botMember = args.Guild?.CurrentMember ?? c.GetMember(c.CurrentUser);
                    if (args.Channel.PermissionsFor(botMember).HasPermission(Permissions.ReadMessageHistory))
                    {
                        var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.Add(-Config.ShutupTimeLimitInMin)).ConfigureAwait(false);

                        if (lastBotMessages.OrderByDescending(m => m.CreationTimestamp).FirstOrDefault(m => m.Author.IsCurrent) is DiscordMessage msg)
                        {
                            await msg.DeleteAsync("asked to shut up").ConfigureAwait(false);
                        }
                    }
                    else
                    {
                        await args.Message.ReactWithAsync(DiscordEmoji.FromUnicode("🙅"), @"No can do, boss ¯\\_(ツ)\_/¯").ConfigureAwait(false);
                    }
                }
            }
        }
Exemplo n.º 16
0
        public static async Task OnMessageCreated(MessageCreateEventArgs args)
        {
            if (DefaultHandlerFilter.IsFluff(args.Message))
            {
                return;
            }

            /*
             * (╯°□°)╯︵ ┻━┻
             * (ノ ゜Д゜)ノ ︵ ┻━┻
             * (ノಠ益ಠ)ノ彡┻━┻
             * ‎(ノಥ益ಥ)ノ ┻━┻
             * (ノಥДಥ)ノ︵┻━┻・/
             * (ノ^_^)ノ┻━┻
             * (/¯◡ ‿ ◡)/¯ ~ ┻━┻
             *
             * this might look the same, but only because of the font choice
             *
             * ┻━┻
             * ┻━┻
             */
            try
            {
                var content = args.Message.Content;
                if (!(content.Contains("┻━┻") ||
                      content.Contains("┻━┻")))
                {
                    return;
                }

                var tableIdx = content.IndexOf("┻━┻");
                if (tableIdx < 0)
                {
                    tableIdx = content.IndexOf("┻━┻");
                }
                var faceIdx = content.Substring(0, tableIdx).LastIndexOfAny(OpenParen);
                var face    = content.Substring(faceIdx, tableIdx - faceIdx);
                if (face.Length > 30)
                {
                    return;
                }

                var reverseFace = face
                                  .Replace("(╯", "╯(").Replace("(ノ", "ノ(").Replace("(ノ", "ノ(").Replace("(/¯", @"\_/(")
                                  .Replace(")╯", "╯)").Replace(")ノ", "ノ)").Replace(")ノ", "ノ)").Replace(")/¯", @"\_/)")

                                  .Replace("(╯", "╯(").Replace("(ノ", "ノ(").Replace("(ノ", "ノ(").Replace("(/¯", @"\_/(")
                                  .Replace(")╯", "╯)").Replace(")ノ", "ノ)").Replace(")ノ", "ノ)").Replace(")/¯", @"\_/)")

                                  .Replace("ʕ╯", "╯ʕ").Replace("ʕノ", "ノʕ").Replace("ʕノ", "ノʕ").Replace("ʕ/¯", @"\_/ʕ")
                                  .Replace("ʔ╯", "╯ʔ").Replace("ʔノ", "ノʔ").Replace("ʔノ", "ノʔ").Replace("ʔ/¯", @"\_/ʔ")

                                  .TrimEnd('︵', '彡', ' ', ' ', '~', '~');
                if (reverseFace == face)
                {
                    return;
                }

                var faceLength = reverseFace.Length;
                if (faceLength > 5 + 4)
                {
                    reverseFace = $"{reverseFace.Substring(0, 2)}ಠ益ಠ{reverseFace.Substring(faceLength - 2, 2)}";
                }
                await args.Channel.SendMessageAsync("┬─┬ " + reverseFace.Sanitize()).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Config.Log.Warn(e);
            }
        }