aboutsummaryrefslogtreecommitdiff
path: root/discord/abc.py
diff options
context:
space:
mode:
Diffstat (limited to 'discord/abc.py')
-rw-r--r--discord/abc.py44
1 files changed, 38 insertions, 6 deletions
diff --git a/discord/abc.py b/discord/abc.py
index 91da74df..4968ce1b 100644
--- a/discord/abc.py
+++ b/discord/abc.py
@@ -39,6 +39,7 @@ from .invite import Invite
from .file import File
from .voice_client import VoiceClient, VoiceProtocol
from . import utils
+from .message_reference import _MessageType, MessageReference
class _Undefined:
def __repr__(self):
@@ -802,7 +803,8 @@ class Messageable(metaclass=abc.ABCMeta):
async def send(self, content=None, *, tts=False, embed=None, file=None,
files=None, delete_after=None, nonce=None,
- allowed_mentions=None):
+ allowed_mentions=None, reference=None,
+ mention_author=None):
"""|coro|
Sends a message to the destination with the content given.
@@ -848,6 +850,19 @@ class Messageable(metaclass=abc.ABCMeta):
.. versionadded:: 1.4
+ reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`]
+ A reference to the :class:`~discord.Message` to which you are replying, this can be created using
+ :meth:`~discord.Message.to_reference` or passed directly as a :class:`~discord.Message`. You can control
+ whether this mentions the author of the referenced message using the :attr:`~discord.AllowedMentions.replied_user`
+ attribute of ``allowed_mentions`` or by setting ``mention_author``.
+
+ .. versionadded:: 1.6
+
+ mention_author: Optional[:class:`bool`]
+ If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``.
+
+ .. versionadded:: 1.6
+
Raises
--------
~discord.HTTPException
@@ -855,8 +870,10 @@ class Messageable(metaclass=abc.ABCMeta):
~discord.Forbidden
You do not have the proper permissions to send the message.
~discord.InvalidArgument
- The ``files`` list is not of the appropriate size or
- you specified both ``file`` and ``files``.
+ The ``files`` list is not of the appropriate size,
+ you specified both ``file`` and ``files``,
+ or the ``reference`` object is not a :class:`~discord.Message`
+ or :class:`~discord.MessageReference`.
Returns
---------
@@ -878,6 +895,18 @@ class Messageable(metaclass=abc.ABCMeta):
else:
allowed_mentions = state.allowed_mentions and state.allowed_mentions.to_dict()
+ if mention_author is not None:
+ allowed_mentions = allowed_mentions or {}
+ allowed_mentions['replied_user'] = mention_author
+
+ if reference is not None:
+ if isinstance(reference, _MessageType):
+ if not isinstance(reference, MessageReference):
+ reference = reference.to_reference()
+ reference = reference.to_dict()
+ else:
+ raise InvalidArgument('reference parameter must be Message or MessageReference')
+
if file is not None and files is not None:
raise InvalidArgument('cannot pass both file and files parameter to send()')
@@ -887,7 +916,8 @@ class Messageable(metaclass=abc.ABCMeta):
try:
data = await state.http.send_files(channel.id, files=[file], allowed_mentions=allowed_mentions,
- content=content, tts=tts, embed=embed, nonce=nonce)
+ content=content, tts=tts, embed=embed, nonce=nonce,
+ message_reference=reference)
finally:
file.close()
@@ -899,13 +929,15 @@ class Messageable(metaclass=abc.ABCMeta):
try:
data = await state.http.send_files(channel.id, files=files, content=content, tts=tts,
- embed=embed, nonce=nonce, allowed_mentions=allowed_mentions)
+ embed=embed, nonce=nonce, allowed_mentions=allowed_mentions,
+ message_reference=reference)
finally:
for f in files:
f.close()
else:
data = await state.http.send_message(channel.id, content, tts=tts, embed=embed,
- nonce=nonce, allowed_mentions=allowed_mentions)
+ nonce=nonce, allowed_mentions=allowed_mentions,
+ message_reference=reference)
ret = state.create_message(channel=channel, data=data)
if delete_after is not None: