Check for an existing webhook made by the bot first.

Otherwise, it'd create a new one and in case of failures or database corruptions,
you'd hit the webhook limit quickly.

This was a feature pre-rewrite but got lost in translation.
This commit is contained in:
Ske 2018-11-30 20:39:10 +01:00
parent 10746ae807
commit 4337430823
2 changed files with 18 additions and 6 deletions

View File

@ -79,7 +79,7 @@ def run():
return return
# Second pass: do proxy matching # Second pass: do proxy matching
await proxy.try_proxy_message(conn, message, logger) await proxy.try_proxy_message(conn, message, logger, client.user)
@client.event @client.event
async def on_raw_message_delete(payload: discord.RawMessageDeleteEvent): async def on_raw_message_delete(payload: discord.RawMessageDeleteEvent):
@ -127,6 +127,9 @@ def run():
traceback_str = "```python\n...{}```".format(traceback.format_exc()[- (2000 - len("```python\n...```")):]) traceback_str = "```python\n...{}```".format(traceback.format_exc()[- (2000 - len("```python\n...```")):])
await log_channel.send(content=traceback_str, embed=embed) await log_channel.send(content=traceback_str, embed=embed)
# Print it to stderr anyway, though
logging.getLogger("pluralkit").exception("Exception while handling event {}".format(event_name))
bot_token = os.environ["TOKEN"] bot_token = os.environ["TOKEN"]
if not bot_token: if not bot_token:
print("No token specified. Please pass a valid Discord bot token in the TOKEN environment variable.", print("No token specified. Please pass a valid Discord bot token in the TOKEN environment variable.",

View File

@ -71,7 +71,7 @@ def match_proxy_tags(members: List[db.ProxyMember], message_text: str):
return member, match return member, match
async def get_or_create_webhook_for_channel(conn, channel: discord.TextChannel): async def get_or_create_webhook_for_channel(conn, bot_user: discord.User, channel: discord.TextChannel):
# First, check if we have one saved in the DB # First, check if we have one saved in the DB
webhook_from_db = await db.get_webhook(conn, channel.id) webhook_from_db = await db.get_webhook(conn, channel.id)
if webhook_from_db: if webhook_from_db:
@ -83,6 +83,15 @@ async def get_or_create_webhook_for_channel(conn, channel: discord.TextChannel):
hook._adapter.store_user = hook._adapter._store_user hook._adapter.store_user = hook._adapter._store_user
return fix_webhook(hook) return fix_webhook(hook)
# If not, we check to see if there already exists one we've missed
for existing_hook in await channel.webhooks():
existing_hook_creator = existing_hook.user.id if existing_hook.user else None
is_mine = existing_hook.name == "PluralKit Proxy Webhook" and existing_hook_creator == bot_user.id
if is_mine:
# We found one we made, let's add that to the DB just to be sure
await db.add_webhook(conn, channel.id, existing_hook.id, existing_hook.token)
return fix_webhook(existing_hook)
# If not, we create one and save it # If not, we create one and save it
created_webhook = await channel.create_webhook(name="PluralKit Proxy Webhook") created_webhook = await channel.create_webhook(name="PluralKit Proxy Webhook")
@ -105,9 +114,9 @@ async def make_attachment_file(message: discord.Message):
async def do_proxy_message(conn, original_message: discord.Message, proxy_member: db.ProxyMember, async def do_proxy_message(conn, original_message: discord.Message, proxy_member: db.ProxyMember,
inner_text: str, logger: ChannelLogger): inner_text: str, logger: ChannelLogger, bot_user: discord.User):
# Send the message through the webhook # Send the message through the webhook
webhook = await get_or_create_webhook_for_channel(conn, original_message.channel) webhook = await get_or_create_webhook_for_channel(conn, bot_user, original_message.channel)
try: try:
sent_message = await webhook.send( sent_message = await webhook.send(
@ -151,7 +160,7 @@ async def do_proxy_message(conn, original_message: discord.Message, proxy_member
await original_message.delete() await original_message.delete()
async def try_proxy_message(conn, message: discord.Message, logger: ChannelLogger) -> bool: async def try_proxy_message(conn, message: discord.Message, logger: ChannelLogger, bot_user: discord.User) -> bool:
# Don't bother proxying in DMs with the bot # Don't bother proxying in DMs with the bot
if isinstance(message.channel, discord.abc.PrivateChannel): if isinstance(message.channel, discord.abc.PrivateChannel):
return False return False
@ -175,7 +184,7 @@ async def try_proxy_message(conn, message: discord.Message, logger: ChannelLogge
# So, we now have enough information to successfully proxy a message # So, we now have enough information to successfully proxy a message
async with conn.transaction(): async with conn.transaction():
await do_proxy_message(conn, message, member, inner_text, logger) await do_proxy_message(conn, message, member, inner_text, logger, bot_user)
return True return True