2023-08-07 21:29:22 -04:00
from typing import Union
import discord
from redbot . core import commands , checks , app_commands
class Say ( commands . Cog ) :
""" Allows you to send messages as the bot account. """
def __init__ ( self , bot ) :
self . bot = bot
async def send_to_target ( self , target : Union [ discord . Member , discord . TextChannel ] , interaction : discord . Interaction , message : str , secondary_message : str = None ) :
if isinstance ( target , discord . Member ) :
target_type = " member "
elif isinstance ( target , discord . TextChannel ) :
target_type = " textchannel "
try :
await target . send ( message )
2023-08-07 21:35:45 -04:00
if secondary_message is not None :
2023-08-07 21:29:22 -04:00
await target . send ( secondary_message )
await interaction . response . send_message ( content = f " Message sent to { target . mention } ! \n Message contents: \n ``` { message } ``` \n ``` { secondary_message } ``` " , ephemeral = True )
else :
2023-08-07 21:32:44 -04:00
await interaction . response . send_message ( content = f " Message sent to { target . mention } ! \n Message contents: \n ``` { message } ``` " , ephemeral = True )
2023-08-07 21:29:22 -04:00
except ( discord . HTTPException , discord . Forbidden ) as error :
2023-08-07 21:36:32 -04:00
if target_type == " member " :
await interaction . response . send_message ( content = " That user has their direct messages closed! " , ephemeral = True )
elif target_type == " textchannel " :
await interaction . response . send_message ( content = " I cannot access that channel! " , ephemeral = True )
2023-08-07 21:29:22 -04:00
class MessageModal ( discord . ui . Modal , title = " Sending message... " ) :
def __init__ ( self , target ) :
super ( ) . __init__ ( )
self . target = target
message = discord . ui . TextInput (
label = " Message Content " ,
placeholder = " I ' m contacting you about your cars extended warranty... " ,
style = discord . TextStyle . paragraph ,
max_length = 1750
)
secondary_message = discord . ui . TextInput (
label = " Secondary Message Content " ,
placeholder = " Typically used for images/image links. " ,
style = discord . TextStyle . short ,
required = False ,
max_length = 200
)
async def on_submit ( self , interaction : discord . Interaction ) :
2023-08-07 21:37:17 -04:00
await Say . send_to_target ( self , self . target , interaction , self . message , self . secondary_message )
2023-08-07 21:29:22 -04:00
send = app_commands . Group ( name = " send " , description = " Send a message as the bot user! " )
@send.command ( name = " user " , description = " Sends a direct message to a user. " )
async def user ( self , interaction : discord . Interaction , member : discord . Member , message : str = None ) :
""" Sends a direct message to a user. """
if message :
await Say . send_to_target ( self , member , interaction , message )
else :
await interaction . response . send_modal ( Say . MessageModal ( member ) )
@send.command ( name = " channel " , description = " Sends a message to a channel. " )
async def channel ( self , interaction : discord . Interaction , channel : discord . TextChannel , message : str = None ) :
""" Sends a message to a channel. """
if message :
await Say . send_to_target ( self , channel , interaction , message )
else :
await interaction . response . send_modal ( Say . MessageModal ( channel ) )