3131
3232from . import utils
3333from .enums import try_enum , InteractionType , InteractionResponseType
34- from .errors import InteractionResponded , HTTPException , ClientException
34+ from .errors import InteractionResponded , HTTPException , ClientException , InvalidArgument
3535from .channel import PartialMessageable , ChannelType
36-
36+ from . file import File
3737from .user import User
3838from .member import Member
3939from .message import Message , Attachment
5555 )
5656 from .guild import Guild
5757 from .state import ConnectionState
58- from .file import File
5958 from .mentions import AllowedMentions
6059 from aiohttp import ClientSession
6160 from .embeds import Embed
@@ -463,6 +462,8 @@ async def send_message(
463462 tts : bool = False ,
464463 ephemeral : bool = False ,
465464 allowed_mentions : AllowedMentions = None ,
465+ file : File = None ,
466+ files : List [File ] = None ,
466467 delete_after : float = None
467468 ) -> None :
468469 """|coro|
@@ -493,6 +494,10 @@ async def send_message(
493494 delete_after: :class:`float`
494495 If provided, the number of seconds to wait in the background
495496 before deleting the message we just sent.
497+ file: :class:`File`
498+ The file to upload.
499+ files: :class:`List[File]`
500+ A list of files to upload. Must be a maximum of 10.
496501
497502 Raises
498503 -------
@@ -535,15 +540,36 @@ async def send_message(
535540 if allowed_mentions :
536541 payload ['allowed_mentions' ] = allowed_mentions .to_dict ()
537542
543+ if file is not None and files is not None :
544+ raise InvalidArgument ('cannot pass both file and files parameter to send()' )
545+
546+ if file is not None :
547+ if not isinstance (file , File ):
548+ raise InvalidArgument ('file parameter must be File' )
549+ else :
550+ files = [file ]
551+
552+ if files is not None :
553+ if len (files ) > 10 :
554+ raise InvalidArgument ('files parameter must be a list of up to 10 elements' )
555+ elif not all (isinstance (file , File ) for file in files ):
556+ raise InvalidArgument ('files parameter must be a list of File' )
557+
538558 parent = self ._parent
539559 adapter = async_context .get ()
540- await adapter .create_interaction_response (
541- parent .id ,
542- parent .token ,
543- session = parent ._session ,
544- type = InteractionResponseType .channel_message .value ,
545- data = payload ,
546- )
560+ try :
561+ await adapter .create_interaction_response (
562+ parent .id ,
563+ parent .token ,
564+ session = parent ._session ,
565+ type = InteractionResponseType .channel_message .value ,
566+ data = payload ,
567+ files = files
568+ )
569+ finally :
570+ if files :
571+ for file in files :
572+ file .close ()
547573
548574 if view is not MISSING :
549575 if ephemeral and view .timeout is None :
@@ -784,4 +810,4 @@ async def inner_call(delay: float = delay):
784810
785811 asyncio .create_task (inner_call ())
786812 else :
787- await self ._state ._interaction .delete_original_message ()
813+ await self ._state ._interaction .delete_original_message ()
0 commit comments