PyroFork: Add get_forum_topic and get_forum_topic_by_id methods

Signed-off-by: wulan17 <galihgustip@gmail.com>
This commit is contained in:
wulan17 2023-01-03 15:24:19 +07:00
parent b1354d5579
commit e15e3d7d50
No known key found for this signature in database
GPG key ID: A1EF50E174745C55
4 changed files with 168 additions and 0 deletions

View file

@ -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

View file

@ -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,

View file

@ -0,0 +1,70 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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)

View file

@ -0,0 +1,92 @@
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
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