mirror of
https://github.com/TeamPGM/pyrogram.git
synced 2024-11-16 12:51:18 +00:00
Add support for service messages
This commit is contained in:
parent
527c5450d2
commit
91133812a7
@ -727,6 +727,24 @@ class Client:
|
||||
)
|
||||
else:
|
||||
continue
|
||||
elif isinstance(message, types.MessageService):
|
||||
m = utils.parse_message_service(message, users, chats)
|
||||
|
||||
if isinstance(message.action, types.MessageActionPinMessage):
|
||||
pm = self.get_messages(m.chat.id, [message.reply_to_msg_id])
|
||||
|
||||
message = pm.messages[0]
|
||||
|
||||
if isinstance(message, types.Message):
|
||||
m.pinned_message = utils.parse_message(
|
||||
message,
|
||||
{i.id: i for i in pm.users},
|
||||
{i.id: i for i in pm.chats}
|
||||
)
|
||||
else:
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
|
||||
|
@ -43,6 +43,15 @@ def parse_user(user: types.User):
|
||||
) if user else None
|
||||
|
||||
|
||||
def parse_chat(peer: types.PeerUser or types.PeerChat or types.PeerChannel, users: dict, chats: dict):
|
||||
if isinstance(peer, types.PeerUser):
|
||||
return parse_user_chat(users[peer.user_id])
|
||||
elif isinstance(peer, types.PeerChat):
|
||||
return parse_chat_chat(chats[peer.chat_id])
|
||||
else:
|
||||
return parse_channel_chat(chats[peer.channel_id])
|
||||
|
||||
|
||||
def parse_user_chat(user: types.User):
|
||||
return pyrogram.Chat(
|
||||
id=user.id,
|
||||
@ -58,7 +67,7 @@ def parse_chat_chat(chat: types.Chat):
|
||||
id=-chat.id,
|
||||
type="group",
|
||||
title=chat.title,
|
||||
all_members_are_administrators=chat.admins_enabled
|
||||
all_members_are_administrators=not chat.admins_enabled
|
||||
)
|
||||
|
||||
|
||||
@ -72,15 +81,6 @@ def parse_channel_chat(channel: types.Channel):
|
||||
|
||||
|
||||
def parse_message(message: types.Message, users: dict, chats: dict):
|
||||
from_user = users.get(message.from_id, None) # type: types.User
|
||||
|
||||
if isinstance(message.to_id, types.PeerUser):
|
||||
chat = parse_user_chat(users[message.to_id.user_id])
|
||||
elif isinstance(message.to_id, types.PeerChat):
|
||||
chat = parse_chat_chat(chats[message.to_id.chat_id])
|
||||
else:
|
||||
chat = parse_channel_chat(chats[message.to_id.channel_id])
|
||||
|
||||
entities = parse_entities(message.entities)
|
||||
|
||||
forward_from = None
|
||||
@ -104,8 +104,8 @@ def parse_message(message: types.Message, users: dict, chats: dict):
|
||||
return pyrogram.Message(
|
||||
message_id=message.id,
|
||||
date=message.date,
|
||||
chat=chat,
|
||||
from_user=parse_user(from_user),
|
||||
chat=parse_chat(message.to_id, users, chats),
|
||||
from_user=parse_user(users.get(message.from_id, None)),
|
||||
text=message.message or None if message.media is None else None,
|
||||
caption=message.message or None if message.media is not None else None,
|
||||
entities=entities or None if message.media is None else None,
|
||||
@ -118,3 +118,46 @@ def parse_message(message: types.Message, users: dict, chats: dict):
|
||||
forward_date=forward_date,
|
||||
edit_date=message.edit_date
|
||||
)
|
||||
|
||||
|
||||
def parse_message_service(message: types.MessageService, users: dict, chats: dict):
|
||||
action = message.action
|
||||
|
||||
new_chat_members = None
|
||||
left_chat_member = None
|
||||
new_chat_title = None
|
||||
delete_chat_photo = None
|
||||
migrate_to_chat_id = None
|
||||
migrate_from_chat_id = None
|
||||
group_chat_created = None
|
||||
|
||||
if isinstance(action, types.MessageActionChatAddUser):
|
||||
new_chat_members = [parse_user(users[i]) for i in action.users]
|
||||
elif isinstance(action, types.MessageActionChatJoinedByLink):
|
||||
new_chat_members = [parse_user(users[action.inviter_id])]
|
||||
elif isinstance(action, types.MessageActionChatDeleteUser):
|
||||
left_chat_member = parse_user(users[action.user_id])
|
||||
elif isinstance(action, types.MessageActionChatEditTitle):
|
||||
new_chat_title = action.title
|
||||
elif isinstance(action, types.MessageActionChatDeletePhoto):
|
||||
delete_chat_photo = True
|
||||
elif isinstance(action, types.MessageActionChatMigrateTo):
|
||||
migrate_to_chat_id = action.channel_id
|
||||
elif isinstance(action, types.MessageActionChannelMigrateFrom):
|
||||
migrate_from_chat_id = action.chat_id
|
||||
elif isinstance(action, types.MessageActionChatCreate):
|
||||
group_chat_created = True
|
||||
|
||||
return pyrogram.Message(
|
||||
message_id=message.id,
|
||||
date=message.date,
|
||||
chat=parse_chat(message.to_id, users, chats),
|
||||
from_user=parse_user(users.get(message.from_id, None)),
|
||||
new_chat_members=new_chat_members,
|
||||
left_chat_member=left_chat_member,
|
||||
new_chat_title=new_chat_title,
|
||||
delete_chat_photo=delete_chat_photo,
|
||||
migrate_to_chat_id=migrate_to_chat_id,
|
||||
migrate_from_chat_id=migrate_from_chat_id,
|
||||
group_chat_created=group_chat_created
|
||||
)
|
||||
|
@ -1,53 +1 @@
|
||||
# Pyrogram - Telegram MTProto API Client Library for Python
|
||||
# Copyright (C) 2017-2018 Dan Tès <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/>.
|
||||
|
||||
try:
|
||||
import tgcrypto
|
||||
except ImportError as e:
|
||||
e.msg = (
|
||||
"TgCrypto is missing and Pyrogram can't run without. "
|
||||
"Please install it using \"pip3 install tgcrypto\". "
|
||||
"More info: https://docs.pyrogram.ml/resources/TgCrypto"
|
||||
)
|
||||
|
||||
raise e
|
||||
|
||||
|
||||
class AES:
|
||||
@classmethod
|
||||
def ige_encrypt(cls, data: bytes, key: bytes, iv: bytes) -> bytes:
|
||||
return tgcrypto.ige_encrypt(data, key, iv)
|
||||
|
||||
@classmethod
|
||||
def ige_decrypt(cls, data: bytes, key: bytes, iv: bytes) -> bytes:
|
||||
return tgcrypto.ige_decrypt(data, key, iv)
|
||||
|
||||
@staticmethod
|
||||
def ctr_decrypt(data: bytes, key: bytes, iv: bytes, offset: int) -> bytes:
|
||||
replace = int.to_bytes(offset // 16, 4, "big")
|
||||
iv = iv[:-4] + replace
|
||||
|
||||
return tgcrypto.ctr_decrypt(data, key, iv)
|
||||
|
||||
@staticmethod
|
||||
def xor(a: bytes, b: bytes) -> bytes:
|
||||
return int.to_bytes(
|
||||
int.from_bytes(a, "big") ^ int.from_bytes(b, "big"),
|
||||
len(a),
|
||||
"big",
|
||||
)
|
||||
# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-2018 Dan Tès <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/>.
try:
import tgcrypto
except ImportError as e:
e.msg = (
"TgCrypto is missing and Pyrogram can't run without. "
"Please install it using \"pip3 install tgcrypto\". "
"More info: https://docs.pyrogram.ml/resources/TgCrypto"
)
raise e
class AES:
@classmethod
def ige_encrypt(cls, data: bytes, key: bytes, iv: bytes) -> bytes:
return tgcrypto.ige_encrypt(data, key, iv)
@classmethod
def ige_decrypt(cls, data: bytes, key: bytes, iv: bytes) -> bytes:
return tgcrypto.ige_decrypt(data, key, iv)
@staticmethod
def ctr_decrypt(data: bytes, key: bytes, iv: bytes, offset: int) -> bytes:
replace = int.to_bytes(offset // 16, 4, "big")
iv = iv[:-4] + replace
return tgcrypto.ctr_decrypt(data, key, iv)
@staticmethod
def xor(a: bytes, b: bytes) -> bytes:
return int.to_bytes(
int.from_bytes(a, "big") ^ int.from_bytes(b, "big"),
len(a),
"big",
)
|
Loading…
Reference in New Issue
Block a user