From e15e3d7d500d2639c5563ba51260995c6280fafa Mon Sep 17 00:00:00 2001 From: wulan17 Date: Tue, 3 Jan 2023 15:24:19 +0700 Subject: [PATCH] PyroFork: Add get_forum_topic and get_forum_topic_by_id methods Signed-off-by: wulan17 --- compiler/docs/compiler.py | 2 + pyrogram/methods/chats/__init__.py | 4 + pyrogram/methods/chats/get_forum_topics.py | 70 ++++++++++++++ .../methods/chats/get_forum_topics_by_id.py | 92 +++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 pyrogram/methods/chats/get_forum_topics.py create mode 100644 pyrogram/methods/chats/get_forum_topics_by_id.py diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py index 19f98a5e..97b1bf44 100644 --- a/compiler/docs/compiler.py +++ b/compiler/docs/compiler.py @@ -219,6 +219,8 @@ def pyrogram_api(): get_chat_members_count get_dialogs get_dialogs_count + get_forum_topics + get_forum_topics_by_id set_chat_username get_nearby_chats archive_chats diff --git a/pyrogram/methods/chats/__init__.py b/pyrogram/methods/chats/__init__.py index 56e20892..176a55a5 100644 --- a/pyrogram/methods/chats/__init__.py +++ b/pyrogram/methods/chats/__init__.py @@ -44,6 +44,8 @@ from .get_chat_members_count import GetChatMembersCount from .get_chat_online_count import GetChatOnlineCount from .get_dialogs import GetDialogs from .get_dialogs_count import GetDialogsCount +from .get_forum_topics import GetForumTopics +from .get_forum_topics_by_id import GetForumTopicsByID from .get_nearby_chats import GetNearbyChats from .get_send_as_chats import GetSendAsChats from .join_chat import JoinChat @@ -88,6 +90,8 @@ class Chats( SetChatUsername, SetChatPermissions, GetDialogsCount, + GetForumTopics, + GetForumTopicsByID, ArchiveChats, UnarchiveChats, CreateGroup, diff --git a/pyrogram/methods/chats/get_forum_topics.py b/pyrogram/methods/chats/get_forum_topics.py new file mode 100644 index 00000000..5101c17b --- /dev/null +++ b/pyrogram/methods/chats/get_forum_topics.py @@ -0,0 +1,70 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Union, Optional, AsyncGenerator + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import utils + +log = logging.getLogger(__name__) + + +class GetForumTopics: + async def get_forum_topics( + self: "pyrogram.Client", + chat_id: Union[int, str], + limit: int = 0 + ) -> Optional[AsyncGenerator["types.ForumTopic", None]]: + """Get one or more topic from a chat by using topic identifiers. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved topics) you can simply use "me" or "self". + For a contact that exists in your Telegram address book you can use his phone number (str). + + limit (``int``, *optional*): + Limits the number of topics to be retrieved. + + Returns: + ``Generator``: On success, a generator yielding :obj:`~pyrogram.types.ForumTopic` objects is returned. + + Example: + .. code-block:: python + + # get all forum topics + async for topic in app.get_forum_topics(chat_id): + print(topic) + + Raises: + ValueError: In case of invalid arguments. + """ + + peer = await self.resolve_peer(chat_id) + + rpc = raw.functions.channels.GetForumTopics(channel=peer, offset_date=0, offset_id=0, offset_topic=0, limit=limit) + + r = await self.invoke(rpc, sleep_threshold=-1) + + for _topic in r.topics: + yield types.ForumTopic._parse(_topic) diff --git a/pyrogram/methods/chats/get_forum_topics_by_id.py b/pyrogram/methods/chats/get_forum_topics_by_id.py new file mode 100644 index 00000000..5460cb3f --- /dev/null +++ b/pyrogram/methods/chats/get_forum_topics_by_id.py @@ -0,0 +1,92 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +import logging +from typing import Union, List, Iterable + +import pyrogram +from pyrogram import raw +from pyrogram import types +from pyrogram import utils + +log = logging.getLogger(__name__) + + +class GetForumTopicsByID: + async def get_forum_topics_by_id( + self: "pyrogram.Client", + chat_id: Union[int, str], + topic_ids: Union[int, Iterable[int]] + ) -> Union["types.ForumTopic", List["types.ForumTopic"]]: + """Get one or more topic from a chat by using topic identifiers. + + .. include:: /_includes/usable-by/users.rst + + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved topics) you can simply use "me" or "self". + For a contact that exists in your Telegram address book you can use his phone number (str). + + topic_ids (``int`` | Iterable of ``int``, *optional*): + Pass a single topic identifier or an iterable of topic ids (as integers) to get the information of the + topic themselves. + + Returns: + :obj:`~pyrogram.types.ForumTopic` | List of :obj:`~pyrogram.types.ForumTopic`: In case *topic_ids* was not + a list, a single topic is returned, otherwise a list of topics is returned. + + Example: + .. code-block:: python + + # Get one topic + await app.get_forum_topics_by_id(chat_id, 12345) + + # Get more than one topic (list of topics) + await app.get_forum_topics_by_id(chat_id, [12345, 12346]) + + Raises: + ValueError: In case of invalid arguments. + """ + ids, ids_type = ( + (topic_ids, int) if topic_ids + else (None, None) + ) + + if ids is None: + raise ValueError("No argument supplied. Either pass topic_ids") + + peer = await self.resolve_peer(chat_id) + + is_iterable = not isinstance(ids, int) + ids = list(ids) if is_iterable else [ids] + ids = [i for i in ids] + + rpc = raw.functions.channels.GetForumTopicsByID(channel=peer, topics=ids) + + r = await self.invoke(rpc, sleep_threshold=-1) + + if is_iterable: + topic_list = [] + for topic in r.topics: + topic_list.append(types.ForumTopic._parse(topic)) + topics = types.List(topic_list) + else: + topics = types.ForumTopic._parse(r.topics[0]) + + return topics