Skip to content

Commit

Permalink
Refactor filters and handle webhooks better
Browse files Browse the repository at this point in the history
  • Loading branch information
greeeen-dev committed Feb 3, 2025
1 parent 1f51891 commit ab7f12c
Show file tree
Hide file tree
Showing 12 changed files with 66 additions and 115 deletions.
36 changes: 28 additions & 8 deletions cogs/bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@
import aiohttp
from aiomultiprocess import Worker

# import ujson if installed
# Import ujson if installed for json speedup
try:
import ujson as json # pylint: disable=import-error
except:
pass

# Import uvloop if installed for asyncio speedup
try:
import uvloop # pylint: disable=import-error
except:
Expand Down Expand Up @@ -1392,9 +1393,9 @@ async def delete_discord(msgs):

try:
try:
webhook = self.__bot.bridge.webhook_cache.get_webhook([
webhook = self.__bot.bridge.webhook_cache.get_webhook(
f'{self.__bot.db["rooms"][msg.room]["discord"][f"{guild.id}"][0]}'
])
)
except:
try:
webhook = await self.__bot.fetch_webhook(self.__bot.db['rooms'][msg.room]['discord'][key][0])
Expand Down Expand Up @@ -1581,6 +1582,7 @@ async def can_send(self, room, message, content, files, source='discord'):

if source == 'discord':
is_bot = message.author.bot and not message.author.id == self.__bot.user.id
webhook_id = message.webhook_id
author = message.author.id
server = message.guild.id
name = message.author.name
Expand All @@ -1593,11 +1595,17 @@ async def can_send(self, room, message, content, files, source='discord'):
is_bot = support.is_bot(
support.author(message)
) and not support.get_id(support.author(message)) == support.bot_id()
webhook_id = None
author = support.get_id(support.author(message))
server = support.get_id(support.server(message))
name = support.name(support.author(message))
avatar = support.avatar(support.author(message))

try:
webhook_id = support.webhook_id(message)
except platform_base.MissingImplementation:
pass

nsfw = False
try:
nsfw = support.is_nsfw(support.channel(message)) or support.is_nsfw(support.server(message))
Expand Down Expand Up @@ -1664,9 +1672,18 @@ async def can_send(self, room, message, content, files, source='discord'):

filter_obj = self.filters[bridge_filter]

message_data = {
'author': str(author),
'bot': is_bot,
'webhook_id': webhook_id,
'content': content,
'files': files,
'data': data
}

try:
result = await self.__bot.loop.run_in_executor(
None, lambda: filter_obj.check(str(author), is_bot, content, files, data)
None, lambda: filter_obj.check(message_data, data)
)
except base_filter.MissingFilter:
continue
Expand Down Expand Up @@ -2966,8 +2983,7 @@ async def tbsend(msg_author,url,color,useremoji,reply,content, files, destguild)
webhook=should_resend or system or extbridge,
prehook=message.id,
room=room,
reply=replying,
external_bridged=extbridge,
reply=replying
))
if datetime.datetime.now().day != self.msg_stats_reset:
self.msg_stats = {}
Expand Down Expand Up @@ -5851,9 +5867,13 @@ async def on_message(self, message):
):
# webhook msg
try:
hook = await self.bot.fetch_webhook(message.webhook_id)
try:
hook = self.bot.bridge.webhook_cache.get_webhook(f'{message.webhook_id}')
except:
hook = await self.bot.fetch_webhook(message.webhook_id)

extbridge = True
if not hook.user.id in self.bot.db['external_bridge'] or hook.user.id==self.bot.user.id:
if hook.user.id==self.bot.user.id:
raise ValueError()
except:
return
Expand Down
87 changes: 0 additions & 87 deletions cogs/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -1370,93 +1370,6 @@ async def delrule(
await self.bot.loop.run_in_executor(None, lambda: self.bot.db.save_data())
await ctx.send(f'{self.bot.ui_emojis.success} {selector.get("success")}')

@commands.command(hidden=True,description="Allows given user's webhooks to be bridged.")
@restrictions_legacy.admin()
async def addbridge(self,ctx,*,userid):
selector = language.get_selector(ctx)

try:
userid = int(userid.replace('<@','',1).replace('!','',1).replace('>','',1))
user = self.bot.get_user(userid)
if not user or userid==self.bot.user.id:
raise ValueError()
if userid in self.bot.db['external_bridge']:
return await ctx.send(f'{self.bot.ui_emojis.error} {selector.get("already_exists")}')
except:
return await ctx.send(f'{self.bot.ui_emojis.error} {selector.rawget("invalid_user","commons.moderation")}')
embed = nextcord.Embed(
title=f'{self.bot.ui_emojis.warning} {selector.fget("allow_title",values={"username":user.name})}',
description=selector.get("allow_body"),
color=self.bot.colors.warning
)
components = ui.MessageComponents()
components.add_rows(
ui.ActionRow(
nextcord.ui.Button(label=selector.get("accept"),style=nextcord.ButtonStyle.green,custom_id='allow'),
nextcord.ui.Button(label=selector.rawget("cancel","commons.navigation"),style=nextcord.ButtonStyle.gray)
)
)
msg = await ctx.send(embed=embed,view=components)

def check(interaction):
if not interaction.message:
return False
return interaction.message.id == msg.id and interaction.user.id == ctx.author.id

try:
interaction = await self.bot.wait_for("interaction", check=check, timeout=30.0)
except:
return await msg.edit(view=None)
await interaction.response.edit_message(view=None)
if not interaction.data['custom_id']=='allow':
return
self.bot.db['external_bridge'].append(userid)
await self.bot.loop.run_in_executor(None, lambda: self.bot.db.save_data())
return await ctx.send(f'# {self.bot.ui_emojis.success} {selector.get("success_title")}\n{selector.get("success_body")}')

@commands.command(hidden=True,description='Prevents given user\'s webhooks from being bridged.')
@restrictions_legacy.admin()
async def delbridge(self, ctx, *, userid):
selector = language.get_selector(ctx)
try:
userid = int(userid.replace('<@', '', 1).replace('!', '', 1).replace('>', '', 1))
user = self.bot.get_user(userid)
if not user:
raise ValueError()
if not userid in self.bot.db['external_bridge']:
return await ctx.send(f'{self.bot.ui_emojis.error} {selector.get("not_whitelist")}')
except:
return await ctx.send(f'{self.bot.ui_emojis.error} Invalid user!')
embed = nextcord.Embed(
title=f'{self.bot.ui_emojis.warning} {selector.fget("remove_title",values={"username":user.name})}',
description=selector.get("remove_body"),
color=self.bot.colors.warning
)
components = ui.MessageComponents()
components.add_row(
ui.ActionRow(
nextcord.ui.Button(label=selector.get("accept"), style=nextcord.ButtonStyle.red, custom_id='allow'),
nextcord.ui.Button(label=selector.rawget("cancel","commons.navigation"), style=nextcord.ButtonStyle.gray)
)
)
msg = await ctx.send(embed=embed, view=components)

def check(interaction):
if not interaction.message:
return False
return interaction.message.id == msg.id and interaction.user.id == ctx.author.id

try:
interaction = await self.bot.wait_for("interaction", check=check, timeout=30.0)
except:
return await msg.edit(view=None)
await interaction.response.edit_message(view=None)
if not interaction.data['custom_id'] == 'allow':
return
self.bot.db['external_bridge'].remove(userid)
await self.bot.loop.run_in_executor(None, lambda: self.bot.db.save_data())
return await ctx.send(f'# {self.bot.ui_emojis.success} {selector.get("success_title")}\n{selector.get("success_body")}')

@config.subcommand(
name='toggle-emoji',
description=language.desc('config.toggle-emoji'),
Expand Down
4 changes: 2 additions & 2 deletions filters/bots.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ def __init__(self):
'A filter that blocks bot messages (excluding system messages).'
)

def check(self, _user, is_bot, content, _files, _data) -> FilterResult:
return FilterResult(not is_bot, None, message='Bots may not talk in this Room.')
def check(self, message, data) -> FilterResult:
return FilterResult(not message['bot'], None, message='Bots may not talk in this Room.')
4 changes: 2 additions & 2 deletions filters/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ def __init__(self):
'A filter that blocks files from being bridged.'
)

def check(self, _user, _is_bot, _content, files, _data) -> FilterResult:
return FilterResult(files == 0, None, message='Attachments are not allowed here.')
def check(self, message, data) -> FilterResult:
return FilterResult(message['files'] == 0, None, message='Attachments are not allowed here.')
4 changes: 2 additions & 2 deletions filters/invites.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ def __init__(self):
'A filter that blocks server invites.'
)

def check(self, _user, _is_bot, content, _files, _data) -> FilterResult:
def check(self, message, data) -> FilterResult:
keywords = [
'discord.gg/', 'discord.com/invite/', 'discordapp.com/invite/'
]

contains = [keyword for keyword in keywords if keyword in content]
contains = [keyword for keyword in keywords if keyword in message['content']]
return FilterResult(len(contains) == 0, None, message='Server invites are not allowed here.')
4 changes: 2 additions & 2 deletions filters/links.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ def find_urls(self, text):
url = re.findall(regex, text)
return [x[0] for x in url]

def check(self, _user, _is_bot, content, _files, _data) -> FilterResult:
return FilterResult(len(self.find_urls(content)) == 0, None, message='URLs are not allowed here.')
def check(self, message, data) -> FilterResult:
return FilterResult(len(self.find_urls(message['content'])) == 0, None, message='URLs are not allowed here.')
4 changes: 2 additions & 2 deletions filters/maxchars.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ def __init__(self):
)
)

def check(self, user, _is_bot, content, _files, data) -> FilterResult:
def check(self, message, data) -> FilterResult:
return FilterResult(
len(content) <= data['config']['limit'], data,
len(message['content']) <= data['config']['limit'], data,
message=f'Your message should be {data["config"]["limit"]} characters or less.'
)
14 changes: 8 additions & 6 deletions filters/slowmode.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,18 @@ def __init__(self):
)
)

def check(self, user, _is_bot, content, _files, data) -> FilterResult:
if user in data['data']:
if time.time() < data['data'][user]:
def check(self, message, data) -> FilterResult:
if message['author'] in data['data']:
if time.time() < data['data'][message['author']]:
return FilterResult(
False, data,
message=f'Slowmode is enabled. Try again in {round(data["data"][user] - time.time())} seconds.'
message=f'Slowmode is enabled. Try again in {round(
data["data"][message['author']] - time.time()
)} seconds.'
)
else:
data['data'].update({user: time.time() + data['config']['slowdown']})
data['data'].update({message['author']: time.time() + data['config']['slowdown']})
return FilterResult(True, data)
else:
data['data'].update({user: time.time() + data['config']['slowdown']})
data['data'].update({message['author']: time.time() + data['config']['slowdown']})
return FilterResult(True, data)
6 changes: 4 additions & 2 deletions filters/swearing.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ def __init__(self):
'Keep your chat family-friendly!'
)

def check(self, _user, _is_bot, content, _files, _data) -> FilterResult:
return FilterResult(not profanity.contains_profanity(content), None, message='No swearing allowed!')
def check(self, message, data) -> FilterResult:
return FilterResult(
not profanity.contains_profanity(message['content']), None, message='No swearing allowed!'
)
15 changes: 15 additions & 0 deletions filters/webhooks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from utils.base_filter import FilterResult, BaseFilter

class Filter(BaseFilter):
def __init__(self):
super().__init__(
'bots',
'Webhooks Filter',
(
'A filter that blocks webhook messages. Webhooks created by Unifier will always be blocked regardless '+
'of this filter.'
)
)

def check(self, message, data) -> FilterResult:
return FilterResult(not message['webhook_id'], None, message='Webhook messages may not talk in this Room.')
1 change: 0 additions & 1 deletion release-notes/v3.8.0-b.1.md

This file was deleted.

2 changes: 1 addition & 1 deletion utils/base_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,6 @@ def add_config(self, config_id, config: FilterConfig):

self.__configs.update({config_id: config})

def check(self, user, is_bot, content, files, data) -> FilterResult:
def check(self, message, data) -> FilterResult:
"""Checks if a content is allowed or not allowed by the filter."""
raise MissingFilter()

0 comments on commit ab7f12c

Please sign in to comment.