diff --git a/changes/1877.feature.md b/changes/1877.feature.md new file mode 100644 index 0000000000..d6f3029305 --- /dev/null +++ b/changes/1877.feature.md @@ -0,0 +1,2 @@ +- Add `message_link` property to `MessageReference` +- Add `channel_link` property to `MessageReference` diff --git a/hikari/messages.py b/hikari/messages.py index fde2a63546..8df6ed70d7 100644 --- a/hikari/messages.py +++ b/hikari/messages.py @@ -309,6 +309,28 @@ class MessageReference: a guild. """ + @property + def message_link(self) -> typing.Optional[str]: + """Generate a jump link to the referenced message. + + This will be [`None`][] for channel follow add messages. This may + point to a deleted message. + """ + if self.id is None: + return None + + guild_id_str = "@me" if self.guild_id is None else self.guild_id + return f"{urls.BASE_URL}/channels/{guild_id_str}/{self.channel_id}/{self.id}" + + @property + def channel_link(self) -> str: + """Generate a jump link to the channel the referenced message was sent in. + + This will always be a valid link. + """ + guild_id_str = "@me" if self.guild_id is None else self.guild_id + return f"{urls.BASE_URL}/channels/{guild_id_str}/{self.channel_id}" + @attrs_extensions.with_copy @attrs.define(hash=True, kw_only=True, weakref_slot=False) diff --git a/tests/hikari/test_messages.py b/tests/hikari/test_messages.py index 112a42af4a..027697c8de 100644 --- a/tests/hikari/test_messages.py +++ b/tests/hikari/test_messages.py @@ -134,6 +134,29 @@ def test_make_link_when_guild_is_none(self, message): assert message.make_link(None) == "https://discord.com/channels/@me/456/789" +@pytest.fixture +def message_reference(): + return messages.MessageReference( + app=None, guild_id=snowflakes.Snowflake(123), channel_id=snowflakes.Snowflake(456), id=snowflakes.Snowflake(789) + ) + + +class TestMessageReference: + def test_make_link_when_guild_is_not_none(self, message_reference): + assert message_reference.message_link == "https://discord.com/channels/123/456/789" + assert message_reference.channel_link == "https://discord.com/channels/123/456" + + def test_make_link_when_guild_is_none(self, message_reference): + message_reference.guild_id = None + assert message_reference.message_link == "https://discord.com/channels/@me/456/789" + assert message_reference.channel_link == "https://discord.com/channels/@me/456" + + def test_make_link_when_id_is_none(self, message_reference): + message_reference.id = None + assert message_reference.message_link is None + assert message_reference.channel_link == "https://discord.com/channels/123/456" + + @pytest.mark.asyncio class TestAsyncMessage: async def test_fetch_channel(self, message):