diff --git a/CHANGES/1049.feature.rst b/CHANGES/1049.feature.rst
new file mode 100644
index 00000000..c54bef04
--- /dev/null
+++ b/CHANGES/1049.feature.rst
@@ -0,0 +1,4 @@
+Added following methods to ``User`` class:
+
+- ``User.mention_markdown(...)``
+- ``User.mention_html(...)``
diff --git a/aiogram/types/user.py b/aiogram/types/user.py
index 64eb5c73..f9e8af24 100644
--- a/aiogram/types/user.py
+++ b/aiogram/types/user.py
@@ -2,13 +2,14 @@ from __future__ import annotations
from typing import Optional
+from ..utils.link import create_tg_link
+from ..utils import markdown
from .base import TelegramObject
class User(TelegramObject):
"""
This object represents a Telegram user or bot.
-
Source: https://core.telegram.org/bots/api#user
"""
@@ -40,3 +41,17 @@ class User(TelegramObject):
if self.last_name:
return f"{self.first_name} {self.last_name}"
return self.first_name
+
+ @property
+ def url(self) -> str:
+ return create_tg_link("user", id=self.id)
+
+ def mention_markdown(self, name: Optional[str] = None) -> str:
+ if name is None:
+ name = self.full_name
+ return markdown.link(name, self.url)
+
+ def mention_html(self, name: Optional[str] = None) -> str:
+ if name is None:
+ name = self.full_name
+ return markdown.hlink(name, self.url)
diff --git a/tests/test_api/test_types/test_user.py b/tests/test_api/test_types/test_user.py
index bda3f94e..c57c0704 100644
--- a/tests/test_api/test_types/test_user.py
+++ b/tests/test_api/test_types/test_user.py
@@ -18,3 +18,35 @@ class TestUser:
def test_full_name(self, first: str, last: str, result: bool):
user = User(id=42, is_bot=False, first_name=first, last_name=last)
assert user.full_name == result
+
+ @pytest.mark.parametrize(
+ "first,last,name",
+ [
+ ["User", None, "bebra"],
+ ["", None, "telegram"],
+ [" ", None, "queue🤬"],
+ ["User", "Name", "Alex"],
+ ["User", " ", "aslo "],
+ [" ", " ", "telebot"],
+ ],
+ )
+ def test_get_mention_markdown(self, first: str, last: str, name: str):
+ user = User(id=42, is_bot=False, first_name=first, last_name=last)
+ assert user.mention_markdown() == f"[{user.full_name}](tg://user?id=42)"
+ assert user.mention_markdown(name=name) == f"[{name}](tg://user?id=42)"
+
+ @pytest.mark.parametrize(
+ "first,last,name",
+ [
+ ["User", None, "bebra"],
+ ["", None, "telegram"],
+ [" ", None, "queue🤬"],
+ ["User", "Name", "Alex"],
+ ["User", " ", "aslo "],
+ [" ", " ", "telebot"],
+ ],
+ )
+ def test_get_mention_html(self, first: str, last: str, name: str):
+ user = User(id=42, is_bot=False, first_name=first, last_name=last)
+ assert user.mention_html() == f'{user.full_name}'
+ assert user.mention_html(name=name) == f'{name}'