Skip to content

Instantly share code, notes, and snippets.

@crazygmr101
Created July 19, 2020 06:10
Show Gist options
  • Select an option

  • Save crazygmr101/1187959d877daf3379e14afbdf257117 to your computer and use it in GitHub Desktop.

Select an option

Save crazygmr101/1187959d877daf3379e14afbdf257117 to your computer and use it in GitHub Desktop.
import datetime
import discord
from discord.ext import commands
import re
import asyncio
import lib.checks
from discord.ext.commands import BucketType, Cooldown, CooldownMapping
class Filters(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
bot.add_listener(self.on_message)
self.regexes = []
self.sp = r"[\s\-.=_~|]*"
self.bot.loop.call_later(0, self.init_re)
self.emoji_cooldown1 = Cooldown(3, 60, BucketType.user)
self._buckets1 = CooldownMapping(self.emoji_cooldown1)
self.emoji_cooldown2 = Cooldown(2, 90, BucketType.user)
self._buckets2 = CooldownMapping(self.emoji_cooldown2)
self.emoji_cooldown3 = Cooldown(2, 120, BucketType.user)
self._buckets3 = CooldownMapping(self.emoji_cooldown3)
def init_re(self):
words = [ "cake", "verybadwords"]
repl = {
"i": "i1!",
"o": "o0",
"s": "5$s",
"a": "@a",
"e": "3e",
"l": "l1"
}
for i in words:
s = ""
for char in i:
if char in repl.keys():
s += f"[{repl[char]}]"
else:
s += char
s += "="
s.strip("=")
r = self.sp + self.sp.join(s.split("=")) + self.sp
self.regexes.append(r)
async def on_message(self, message: discord.Message):
if message.author.bot:
return
s = message.content
s2 = message.content.lower()
message.content = re.sub("[_~*]", "", message.content)
message.content = re.sub(r"[\s]+[\s]{2}", "", message.content)
if not lib.checks.istype(message.channel, lib.checks.SPAM) and not lib.checks.is_staff(message.author):
emoji_count = len(re.findall(r"<a?:[A-Za-z\-0-9_]+?:[0-9]+?>", message.content))
without_emojis = re.sub(r"<a?:[A-Za-z\-0-9_]+?:[0-9]+?>", "", message.content)
if emoji_count > 5:
await message.delete()
await message.channel.send("Don't spam emojis please :)", delete_after=20)
elif emoji_count > 3 and len(without_emojis) < 50:
current = message.created_at.replace(tzinfo=datetime.timezone.utc).timestamp()
bucket = self._buckets3.get_bucket(message, current)
retry_after = bucket.update_rate_limit(current)
if retry_after:
await message.delete()
elif emoji_count == 2 and len(without_emojis) < 30:
current = message.created_at.replace(tzinfo=datetime.timezone.utc).timestamp()
bucket = self._buckets2.get_bucket(message, current)
retry_after = bucket.update_rate_limit(current)
if retry_after:
await message.delete()
elif emoji_count == 1 and len(without_emojis) < 10:
current = message.created_at.replace(tzinfo=datetime.timezone.utc).timestamp()
bucket = self._buckets1.get_bucket(message, current)
retry_after = bucket.update_rate_limit(current)
if retry_after:
await message.delete()
for r in self.regexes:
if re.match(r, f" {s2} "):
a: discord.Member = message.author
await message.delete()
await self.bot.get_channel(700946998253191189).send(
f"```"
f"[FILTER {a.id}]\n"
f"User: {a.display_name}\n"
f"Message: {s}"
f"```"
)
def setup(bot: commands.Bot):
bot.add_cog(Filters(bot))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment