Add business_info attribute to Chat type

This commit is contained in:
KurimuzonAkuma 2024-03-08 16:21:22 +03:00
parent 351fda3208
commit deffcbf357
10 changed files with 439 additions and 1 deletions

View File

@ -415,6 +415,12 @@ def pyrogram_api():
categories = dict(
users_chats="""
Users & Chats
BusinessInfo
BusinessMessage
BusinessRecipients
BusinessSchedule
BusinessWeeklyOpen
BusinessWorkingHours
User
Chat
ChatPreview

View File

@ -16,6 +16,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from .business_schedule import BusinessSchedule
from .chat_action import ChatAction
from .chat_event_action import ChatEventAction
from .chat_member_status import ChatMemberStatus
@ -35,6 +36,7 @@ from .stories_privacy_rules import StoriesPrivacyRules
from .user_status import UserStatus
__all__ = [
'BusinessSchedule',
'ChatAction',
'ChatEventAction',
'ChatMemberStatus',

View File

@ -0,0 +1,33 @@
# 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/>.
from pyrogram import raw
from .auto_name import AutoName
class BusinessSchedule(AutoName):
"""Business away enumeration used in :obj:`~pyrogram.types.BusinessInfo`."""
ALWAYS = raw.types.BusinessAwayMessageScheduleAlways
"Send always"
OUTSIDE_WORK_HOURS = raw.types.BusinessAwayMessageScheduleOutsideWorkHours
"Outside of Business Hours"
CUSTOM = raw.types.BusinessAwayMessageScheduleCustom
"Custom Schedule"

View File

@ -16,6 +16,11 @@
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from .business_info import BusinessInfo
from .business_message import BusinessMessage
from .business_recipients import BusinessRecipients
from .business_weekly_open import BusinessWeeklyOpen
from .business_working_hours import BusinessWorkingHours
from .chat import Chat
from .chat_admin_with_invite_links import ChatAdminWithInviteLinks
from .chat_color import ChatColor
@ -44,6 +49,11 @@ from .video_chat_scheduled import VideoChatScheduled
from .video_chat_started import VideoChatStarted
__all__ = [
"BusinessInfo",
"BusinessMessage",
"BusinessRecipients",
"BusinessWeeklyOpen",
"BusinessWorkingHours",
"Chat",
"ChatMember",
"ChatPermissions",

View File

@ -0,0 +1,81 @@
# 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/>.
from typing import Optional
from pyrogram import types, raw
from ..object import Object
class BusinessInfo(Object):
"""Business information of a user.
Parameters:
address (``str``, *optional*):
Address of the business.
location (:obj:`~pyrogram.types.Location`, *optional*):
Location of the business on the map.
greeting_message (:obj:`~pyrogram.types.BusinessMessage`, *optional*):
Greeting message of the business.
away_message (:obj:`~pyrogram.types.BusinessMessage`, *optional*):
Away message of the business.
working_hours (:obj:`~pyrogram.types.BusinessWorkingHours`, *optional*):
Working hours of the business.
"""
def __init__(
self,
*,
address: str = None,
location: "types.Location" = None,
greeting_message: "types.BusinessMessage" = None,
away_message: "types.BusinessMessage" = None,
working_hours: "types.BusinessWorkingHours" = None,
):
self.address = address
self.location = location
self.greeting_message = greeting_message
self.away_message = away_message
self.working_hours = working_hours
@staticmethod
def _parse(
client,
user: "raw.types.UserFull" = None,
users: dict = None
) -> Optional["BusinessInfo"]:
working_hours = getattr(user, "business_work_hours", None)
location = getattr(user, "business_location", None)
greeting_message = getattr(user, "business_greeting_message", None)
away_message = getattr(user, "business_away_message", None)
if not any((working_hours, location, greeting_message, away_message)):
return None
return BusinessInfo(
address=getattr(location, "address", None),
location=types.Location._parse(client, getattr(location, "geo_point", None)),
greeting_message=types.BusinessMessage._parse(client, greeting_message, users),
away_message=types.BusinessMessage._parse(client, away_message, users),
working_hours=types.BusinessWorkingHours._parse(working_hours),
)

View File

@ -0,0 +1,111 @@
# 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/>.
from datetime import datetime
from typing import Optional, Union, List
from pyrogram import types, enums, raw, utils
from ..object import Object
class BusinessMessage(Object):
"""Business working hours.
Parameters:
shortcut_id (``int``):
ID of the shortcut.
is_greeting (``bool``, *optional*):
True, if the message is a greeting message.
is_away (``bool``, *optional*):
True, if the message is an away message.
no_activity_days (``int``, *optional*):
Period of inactivity after which the greeting message should be sent again.
offline_only (``bool``, *optional*):
Dont send the away message if you've recently been online.
recipients (List of :obj:`~pyrogram.types.User`, *optional*):
Recipients of the message.
schedule (:obj:`~pyrogram.enums.BusinessSchedule`, *optional*):
Schedule of the away message to be sent.
start_date (``datetime``, *optional*):
Start date of the away message.
end_date (``datetime``, *optional*):
End date of the away message.
"""
def __init__(
self,
*,
shortcut_id: int,
is_greeting: bool = None,
is_away: bool = None,
no_activity_days: int = None,
offline_only: bool = None,
recipients: List["types.User"] = None,
schedule: "enums.BusinessSchedule" = None,
start_date: datetime = None,
end_date: datetime = None,
):
self.shortcut_id = shortcut_id
self.is_greeting = is_greeting
self.is_away = is_away
self.no_activity_days = no_activity_days
self.offline_only = offline_only
self.recipients = recipients
self.schedule = schedule
self.start_date = start_date
self.end_date = end_date
@staticmethod
def _parse(
client,
message: Union["raw.types.BusinessGreetingMessage", "raw.types.BusinessAwayMessage"] = None,
users: dict = None
) -> Optional["BusinessMessage"]:
if not message:
return None
schedule = None
if isinstance(message, raw.types.BusinessAwayMessage):
if isinstance(message.schedule, raw.types.BusinessAwayMessageScheduleAlways):
schedule = enums.BusinessSchedule.ALWAYS
elif isinstance(message.schedule, raw.types.BusinessAwayMessageScheduleOutsideWorkHours):
schedule = enums.BusinessSchedule.OUTSIDE_WORK_HOURS
elif isinstance(message.schedule, raw.types.BusinessAwayMessageScheduleCustom):
schedule = enums.BusinessSchedule.CUSTOM
return BusinessMessage(
shortcut_id=message.shortcut_id,
is_greeting=isinstance(message, raw.types.BusinessGreetingMessage),
is_away=isinstance(message, raw.types.BusinessAwayMessage),
no_activity_days=getattr(message, "no_activity_days", None),
offline_only=getattr(message, "offline_only", None),
recipients=types.BusinessRecipients._parse(client, message.recipients, users),
schedule=schedule,
start_date=utils.timestamp_to_datetime(message.schedule.start_date) if schedule == enums.BusinessSchedule.CUSTOM else None,
end_date=utils.timestamp_to_datetime(message.schedule.end_date) if schedule == enums.BusinessSchedule.CUSTOM else None
)

View File

@ -0,0 +1,78 @@
# 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/>.
from typing import List
from pyrogram import types, raw
from ..object import Object
class BusinessRecipients(Object):
"""Business recipients.
Parameters:
existing_chats (``bool``, *optional*):
True, if the message should be sent to existing chats.
new_chats (``bool``, *optional*):
True, if the message should be sent to new chats.
contacts (``bool``, *optional*):
True, if the message should be sent to contacts.
non_contacts (``bool``, *optional*):
True, if the message should be sent to non-contacts.
exclude_selected (``bool``, *optional*):
True, if the message should be sent to non-selected contacts.
users (List of :obj:`~pyrogram.types.User`, *optional*):
Recipients of the message.
"""
def __init__(
self,
*,
existing_chats: bool = None,
new_chats: bool = None,
contacts: bool = None,
non_contacts: bool = None,
exclude_selected: bool = None,
users: List[int] = None
):
self.existing_chats = existing_chats
self.new_chats = new_chats
self.contacts = contacts
self.non_contacts = non_contacts
self.exclude_selected = exclude_selected
self.users = users
@staticmethod
def _parse(
client,
recipients: "raw.types.BusinessRecipients",
users: dict = None
) -> "BusinessRecipients":
return BusinessRecipients(
existing_chats=getattr(recipients, "existing_chats", None),
new_chats=getattr(recipients, "new_chats", None),
contacts=getattr(recipients, "contacts", None),
non_contacts=getattr(recipients, "non_contacts", None),
exclude_selected=getattr(recipients, "exclude_selected", None),
users=types.List(types.User._parse(client, users[i]) for i in recipients.users) or None if getattr(recipients, "users", None) else None
)

View File

@ -0,0 +1,49 @@
# 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/>.
from pyrogram import raw
from ..object import Object
class BusinessWeeklyOpen(Object):
"""Business weekly open hours.
Parameters:
start_minute (``int``):
Start minute of the working day.
end_minute (``int``):
End minute of the working day.
"""
def __init__(
self,
*,
start_minute: int,
end_minute: int,
):
self.start_minute = start_minute
self.end_minute = end_minute
@staticmethod
def _parse(weekly_open: "raw.types.BusinessWeeklyOpen" = None) -> "BusinessWeeklyOpen":
return BusinessWeeklyOpen(
start_minute=weekly_open.start_minute,
end_minute=weekly_open.end_minute,
)

View File

@ -0,0 +1,62 @@
# 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/>.
from typing import Optional, List
from pyrogram import types, raw
from ..object import Object
class BusinessWorkingHours(Object):
"""Business working hours.
Parameters:
timezone (``str``):
Timezone of the business.
working_hours (List of :obj:`~pyrogram.types.BusinessWeeklyOpen`):
Working hours of the business.
is_open_now (``bool``, *optional*):
True, if the business is open now.
"""
def __init__(
self,
*,
timezone: str,
working_hours: List["types.BusinessWeeklyOpen"],
is_open_now: bool = None
):
self.timezone = timezone
self.is_open_now = is_open_now
self.working_hours = working_hours
@staticmethod
def _parse(work_hours: "raw.types.BusinessWorkHours" = None) -> Optional["BusinessWorkingHours"]:
if not work_hours:
return None
return BusinessWorkingHours(
timezone=work_hours.timezone_id,
working_hours=types.List(
types.BusinessWeeklyOpen._parse(i) for i in work_hours.weekly_open
),
is_open_now=getattr(work_hours, "open_now", None),
)

View File

@ -171,6 +171,9 @@ class Chat(Object):
profile_color (:obj:`~pyrogram.types.ChatColor`, *optional*):
Chat profile color.
business_info (:obj:`~pyrogram.types.BusinessInfo`, *optional*):
Business information of a chat.
"""
def __init__(
@ -217,7 +220,8 @@ class Chat(Object):
available_reactions: Optional["types.ChatReactions"] = None,
level: int = None,
reply_color: "types.ChatColor" = None,
profile_color: "types.ChatColor" = None
profile_color: "types.ChatColor" = None,
business_info: "types.BusinessInfo" = None
):
super().__init__(client)
@ -262,6 +266,7 @@ class Chat(Object):
self.level = level
self.reply_color = reply_color
self.profile_color = profile_color
self.business_info = business_info
@staticmethod
def _parse_user_chat(client, user: raw.types.User) -> "Chat":
@ -384,6 +389,7 @@ class Chat(Object):
parsed_chat = Chat._parse_user_chat(client, users[full_user.id])
parsed_chat.bio = full_user.about
parsed_chat.folder_id = getattr(full_user, "folder_id", None)
parsed_chat.business_info = types.BusinessInfo._parse(client, full_user, users)
if full_user.pinned_msg_id:
parsed_chat.pinned_message = await client.get_messages(