Skip to content

Commit

Permalink
Use cache for filter words and raid phrases
Browse files Browse the repository at this point in the history
  • Loading branch information
SlimShadyIAm committed Feb 4, 2024
1 parent decd185 commit bdb03b9
Show file tree
Hide file tree
Showing 13 changed files with 44 additions and 31 deletions.
2 changes: 1 addition & 1 deletion cogs/commands/misc/canister.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ async def on_message(self, message):
if not pattern.match(message.content):
return

if find_triggered_filters(message.content, message.author) or find_triggered_raid_phrases(message.content, message.author):
if await find_triggered_filters(message.content, message.author) or await find_triggered_raid_phrases(message.content, message.author):
return

matches = pattern.findall(message.content)
Expand Down
2 changes: 1 addition & 1 deletion cogs/commands/misc/memes.py
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ async def aitext(self, ctx: GIRContext, prompt: str):
data = await resp.json()
text = data.get("choices")[0].get("text")
text = discord.utils.escape_markdown(text)
if find_triggered_filters(text, ctx.author) or find_triggered_raid_phrases(text, ctx.author):
if await find_triggered_filters(text, ctx.author) or await find_triggered_raid_phrases(text, ctx.author):
text = "A filter was triggered by this response. Please try a different prompt."

embed = discord.Embed(color=discord.Color.random())
Expand Down
10 changes: 5 additions & 5 deletions cogs/commands/mod/antiraid.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(self, bot):
async def raid(self, ctx: GIRContext, phrase: str) -> None:
# these are phrases that when said by a whitename, automatically bans them.
# for example: known scam URLs
done = guild_service.add_raid_phrase(phrase)
done = await guild_service.add_raid_phrase(phrase)
if not done:
raise commands.BadArgument("That phrase is already in the list.")
else:
Expand All @@ -47,7 +47,7 @@ async def batchraid(self, ctx: GIRContext) -> None:
phrases = [phrase.strip() for phrase in phrases if phrase.strip()]

phrases_contenders = set(phrases)
phrases_already_in_db = set([phrase.word for phrase in guild_service.get_guild().raid_phrases])
phrases_already_in_db = set([phrase.word for phrase in await guild_service.get_raid_phrases()])

duplicate_count = len(phrases_already_in_db & phrases_contenders) # count how many duplicates we have
new_phrases = list(phrases_contenders - phrases_already_in_db)
Expand All @@ -73,7 +73,7 @@ async def batchraid(self, ctx: GIRContext) -> None:

if do_add:
for phrase in new_phrases:
guild_service.add_raid_phrase(phrase)
await guild_service.add_raid_phrase(phrase)

await ctx.send_success(f"Added {len(new_phrases)} phrases to the raid filter.")
else:
Expand All @@ -87,11 +87,11 @@ async def batchraid(self, ctx: GIRContext) -> None:
async def removeraid(self, ctx: GIRContext, phrase: str) -> None:
word = phrase.lower()

words = guild_service.get_guild().raid_phrases
words = await guild_service.get_raid_phrases()
words = list(filter(lambda w: w.word.lower() == word.lower(), words))

if len(words) > 0:
guild_service.remove_raid_phrase(words[0].word)
await guild_service.remove_raid_phrase(words[0].word)
await ctx.send_success("Deleted!", delete_after=5)
else:
raise commands.BadArgument("That word is not a raid phrase.")
Expand Down
14 changes: 7 additions & 7 deletions cogs/commands/mod/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ async def add(self, ctx: GIRContext, notify: bool, bypass: int, phrase: str) ->
fw.notify = notify
fw.word = phrase

if not guild_service.add_filtered_word(fw):
if not await guild_service.add_filtered_word(fw):
raise commands.BadArgument("That word is already filtered!")

phrase = discord.utils.escape_markdown(phrase)
Expand All @@ -97,7 +97,7 @@ async def add(self, ctx: GIRContext, notify: bool, bypass: int, phrase: str) ->
@_filter.command(description="List filtered words", name="list")
@transform_context
async def _list(self, ctx: GIRContext):
filters = guild_service.get_guild().filter_words
filters = await guild_service.get_filtered_words()
if len(filters) == 0:
raise commands.BadArgument(
"The filterlist is currently empty. Please add a word using `/filter`.")
Expand All @@ -117,12 +117,12 @@ async def _list(self, ctx: GIRContext):
async def piracy(self, ctx: GIRContext, word: str):
word = word.lower()

words = guild_service.get_guild().filter_words
words = guild_service.get_filtered_words()
words = list(filter(lambda w: w.word.lower() == word.lower(), words))

if len(words) > 0:
words[0].piracy = not words[0].piracy
guild_service.update_filtered_word(words[0])
await guild_service.update_filtered_word(words[0])

await ctx.send_success("Marked as a piracy word!" if words[0].piracy else "Removed as a piracy word!")
else:
Expand All @@ -140,7 +140,7 @@ async def remove(self, ctx: GIRContext, word: str):
words = list(filter(lambda w: w.word.lower() == word.lower(), words))

if len(words) > 0:
guild_service.remove_filtered_word(words[0].word)
await guild_service.remove_filtered_word(words[0].word)
await ctx.send_success("Deleted!")
else:
await ctx.send_warning("That word is not filtered.", delete_after=5)
Expand Down Expand Up @@ -230,12 +230,12 @@ async def unignorechannellogs(self, ctx: GIRContext, channel: discord.TextChanne
async def falsepositive(self, ctx: GIRContext, *, word: str):
word = word.lower()

words = guild_service.get_guild().filter_words
words = guild_service.get_filtered_words()
words = list(filter(lambda w: w.word.lower() == word.lower(), words))

if len(words) > 0:
words[0].false_positive = not words[0].false_positive
if guild_service.update_filtered_word(words[0]):
if await guild_service.update_filtered_word(words[0]):
await ctx.send_success("Marked as potential false positive, we won't perform the enhanced checks on it!" if words[0].false_positive else "Removed as potential false positive.")
else:
raise commands.BadArgument(
Expand Down
2 changes: 1 addition & 1 deletion cogs/monitors/misc/songs.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ async def generate_view(self, message: discord.Message, link: str):
title = discord.utils.escape_markdown(title)
title = discord.utils.escape_mentions(title)

triggered_words = find_triggered_filters(
triggered_words = await find_triggered_filters(
title, message.author)

if triggered_words:
Expand Down
2 changes: 1 addition & 1 deletion cogs/monitors/mod/antiraid.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ async def raid_phrase_detected(self, message):
if gatekeeper.has(message.guild, message.author, 2):
return False

if find_triggered_raid_phrases(message.content, message.author) is not None:
if await find_triggered_raid_phrases(message.content, message.author) is not None:
await self.raid_ban(message.author)
return True

Expand Down
4 changes: 2 additions & 2 deletions cogs/monitors/mod/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ async def run_filter(self, message: discord.Message):
await self.detect_cij_or_eta(message)

async def nick_filter(self, member):
triggered_words = find_triggered_filters(
triggered_words = await find_triggered_filters(
member.display_name, member)

if not triggered_words:
Expand All @@ -112,7 +112,7 @@ async def nick_filter(self, member):
pass

async def bad_word_filter(self, message) -> bool:
triggered_words = find_triggered_filters(
triggered_words = await find_triggered_filters(
message.content, message.author)
if not triggered_words:
return
Expand Down
24 changes: 19 additions & 5 deletions data/services/guild_service.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from aiocache import cached, caches
from data.model import FilterWord, Guild, Tag, Giveaway
from utils import cfg

Expand Down Expand Up @@ -96,31 +97,44 @@ def add_giveaway(self, id: int, channel: int, name: str, entries: list, winners:
giveaway.previous_winners = prev_winners
giveaway.save()

def add_raid_phrase(self, phrase: str) -> bool:
async def add_raid_phrase(self, phrase: str) -> bool:
existing = self.get_guild().raid_phrases.filter(word=phrase)
if(len(existing) > 0):
return False
Guild.objects(_id=cfg.guild_id).update_one(push__raid_phrases=FilterWord(word=phrase, bypass=5, notify=True))
await self.get_raid_phrases.cache.clear()
return True

def remove_raid_phrase(self, phrase: str):
@cached(ttl=3600, key="guild_raid_phrases")
async def get_raid_phrases(self):
return self.get_guild().raid_phrases

async def remove_raid_phrase(self, phrase: str):
await self.get_raid_phrases.cache.clear()
Guild.objects(_id=cfg.guild_id).update_one(pull__raid_phrases__word=FilterWord(word=phrase).word)

def set_spam_mode(self, mode) -> None:
Guild.objects(_id=cfg.guild_id).update_one(set__ban_today_spam_accounts=mode)

def add_filtered_word(self, fw: FilterWord) -> None:
async def add_filtered_word(self, fw: FilterWord) -> None:
existing = self.get_guild().filter_words.filter(word=fw.word)
if(len(existing) > 0):
return False

Guild.objects(_id=cfg.guild_id).update_one(push__filter_words=fw)
await self.get_filtered_words.cache.clear()
return True

def remove_filtered_word(self, word: str):
@cached(ttl=3600, key="guild_filtered_words")
async def get_filtered_words(self) -> FilterWord:
return self.get_guild().filter_words

async def remove_filtered_word(self, word: str):
await self.get_filtered_words.cache.clear()
return Guild.objects(_id=cfg.guild_id).update_one(pull__filter_words__word=FilterWord(word=word).word)

def update_filtered_word(self, word: FilterWord):
async def update_filtered_word(self, word: FilterWord):
await self.get_filtered_words.cache.clear()
return Guild.objects(_id=cfg.guild_id, filter_words__word=word.word).update_one(set__filter_words__S=word)

def add_whitelisted_guild(self, id: int):
Expand Down
1 change: 0 additions & 1 deletion extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"cogs.commands.mod.modutils",
"cogs.monitors.misc.boosteremojis",
"cogs.monitors.misc.fixsocials",
"cogs.monitors.misc.role_assignment_buttons",
"cogs.monitors.misc.songs",
"cogs.monitors.mod.antiraid",
"cogs.monitors.mod.logging",
Expand Down
2 changes: 1 addition & 1 deletion main.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ async def interaction_check(self, interaction: discord.Interaction):
else:
message_content += str(option.get("value")) + " "

triggered_words = find_triggered_filters(
triggered_words = await find_triggered_filters(
message_content, interaction.user)

if triggered_words:
Expand Down
8 changes: 4 additions & 4 deletions utils/framework/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from utils.framework import gatekeeper


def find_triggered_filters(input, member: discord.Member) -> List[FilterWord]:
async def find_triggered_filters(input, member: discord.Member) -> List[FilterWord]:
"""
BAD WORD FILTER
"""
Expand All @@ -29,7 +29,7 @@ def find_triggered_filters(input, member: discord.Member) -> List[FilterWord]:
# reported = False

words_found = []
for word in db_guild.filter_words:
for word in await guild_service.get_filtered_words():
if gatekeeper.has(member.guild, member, word.bypass):
continue

Expand All @@ -50,7 +50,7 @@ def find_triggered_filters(input, member: discord.Member) -> List[FilterWord]:
return words_found


def find_triggered_raid_phrases(input, member):
async def find_triggered_raid_phrases(input, member):
symbols = (u"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
u"abBrdeex3nnKnmHonpcTyoxu4wwbbbeoRABBrDEEX3NNKNMHONPCTyOXU4WWbbbEOR")

Expand All @@ -62,7 +62,7 @@ def find_triggered_raid_phrases(input, member):
str.maketrans('', '', string.punctuation))

if folded_message:
for word in guild_service.get_guild().raid_phrases:
for word in await guild_service.get_raid_phrases():
if not gatekeeper.has(member.guild, member, word.bypass):
if (word.word.lower() in folded_message) or \
(not word.false_positive and word.word.lower() in folded_without_spaces) or \
Expand Down
2 changes: 1 addition & 1 deletion utils/views/autocompleters.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ async def filterwords_autocomplete(interaction: discord.Interaction, current: st
if not gatekeeper.has(interaction.guild, interaction.user, 5):
return []

words = [word.word for word in guild_service.get_guild().filter_words]
words = [word.word for word in await guild_service.get_filtered_words()]
words.sort()

return [app_commands.Choice(name=word, value=word) for word in words if str(word).startswith(str(current))][:25]
Expand Down
2 changes: 1 addition & 1 deletion utils/views/menus/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ async def ban(self, interaction: discord.Interaction, button: ui.Button):
except Exception:
await ctx.send_warning("I wasn't able to ban them.", delete_after=5)

done = guild_service.add_raid_phrase(self.domain)
done = await guild_service.add_raid_phrase(self.domain)
if done:
await ctx.send_success(f"{self.domain} was added to the raid phrase list.", delete_after=5)
else:
Expand Down

0 comments on commit bdb03b9

Please sign in to comment.