2020-04-15 19:54:29 -04:00
import discord
import io
2021-05-23 21:42:35 -04:00
import re
2020-04-15 19:54:29 -04:00
import sys
2021-05-23 21:42:35 -04:00
SPOILER_REGEX = re . compile ( r ' spoil| \ bcw \ b ' , re . IGNORECASE )
2020-04-15 19:54:29 -04:00
client = discord . Client ( )
2020-10-05 15:14:49 -04:00
def mentions_me ( message ) :
return client . user in message . mentions or [ client . user ] in [ role . members for role in message . role_mentions ]
2020-04-15 19:54:29 -04:00
@client.event
async def on_ready ( ) :
print ( ' logged in as {0.user} ' . format ( client ) , file = sys . stderr )
@client.event
async def on_message ( message ) :
if message . author == client . user :
return
2021-05-23 21:42:35 -04:00
if ( ( SPOILER_REGEX . search ( message . content ) or mentions_me ( message ) )
2020-04-15 19:54:29 -04:00
and message . attachments
and not any ( a . is_spoiler ( ) for a in message . attachments ) ) :
2021-05-09 15:48:56 -04:00
pluralkit = False
if message . webhook_id is not None :
try :
webhook = await client . fetch_webhook ( message . webhook_id )
except discord . Forbidden as e :
print ( ' error fetching message webhook: {0} ' . format ( e ) , file = sys . stderr )
await message . channel . send ( " I can ' t inspect the webhook on this message because I don ' t have the permissions I need. This is important so I can interact properly with messages sent by PluralKit. Admins, please make sure I have the Manage Webhooks permission in all channels where people want to use me. " )
return
except discord . DiscordException as e :
print ( ' error fetching message webhook: {0} ' . format ( e ) , file = sys . stderr )
return
if webhook . user is not None and webhook . user . name == " PluralKit " :
pluralkit = True
# If this is a message that's being reposted by PluralKit,
# assume we already caught and reposted the original, and
# just delete this one without reposting a spoilered version
if not pluralkit :
attachments = [ ]
try :
for a in message . attachments :
f = await a . to_file ( )
f . filename = ' SPOILER_ ' + f . filename
attachments . append ( f )
except discord . DiscordException as e :
print ( ' error reading attachments: {0} ' . format ( e ) , file = sys . stderr )
return
try :
await message . channel . send ( " {0} says: {1} " . format ( message . author . mention , message . content ) , files = attachments )
except discord . DiscordException as e :
print ( ' error sending message: {0} ' . format ( e ) , file = sys . stderr )
return
2020-04-15 19:54:29 -04:00
try :
await message . delete ( )
2020-11-16 18:27:25 -05:00
except discord . Forbidden as e :
print ( ' error deleting message: {0} ' . format ( e ) )
await message . channel . send ( " I can ' t delete the original unspoiled message because I don ' t have the permissions I need. Admins, please make sure I have the Manage Messages permission in all channels where people want to use me. " )
return
except discord . DiscordException as e :
2020-04-15 19:54:29 -04:00
print ( ' error deleting message: {0} ' . format ( e ) )
return
2020-10-05 15:14:49 -04:00
elif mentions_me ( message ) :
2021-05-23 21:42:35 -04:00
await message . channel . send ( " upload an image and put ' spoil ' or ' cw ' (doesn ' t have to be lowercase) anywhere in the description, and I ' ll spoiler it for you. to delete your post, add a :x: react to it. " )
2021-03-23 22:45:28 -04:00
@client.event
async def on_reaction_add ( reaction , user ) :
if ( reaction . message . author == client . user
and str ( reaction . emoji ) == ' ❌ '
and reaction . message . content . startswith ( ' {0} says: ' . format ( user . mention ) ) ) :
try :
await reaction . message . delete ( )
except discord . DiscordException as e :
print ( ' error deleting my own message: {0} ' . format ( e ) )
2020-04-15 19:54:29 -04:00
with open ( ' token ' ) as f :
token = f . read ( ) . strip ( )
client . run ( token )