outside-fetcher/tasks/channel_history.py

120 lines
3.2 KiB
Python
Raw Normal View History

2019-11-03 22:11:45 +01:00
import pyrogram
2019-11-04 15:08:33 +01:00
import json
2019-11-04 16:58:31 +01:00
import typing
from .mtproto_task_abstraction import MtProtoTask
2019-11-05 19:48:14 +01:00
from .webhook import WebHookDataForward
2019-11-03 22:11:45 +01:00
from pyrogram.api.types import ChannelMessagesFilterEmpty
from pyrogram.api.types.updates import ChannelDifference, ChannelDifferenceTooLong, ChannelDifferenceEmpty
from pyrogram.api.functions.updates.get_channel_difference import GetChannelDifference
from pyrogram.client.types.messages_and_media import Message as MessagePyrogram
2019-11-04 15:08:33 +01:00
class JsonSerializerFixes:
@staticmethod
def user(obj):
obj.type = "private"
return obj
@staticmethod
def user_type(obj):
obj.type = "channel" if obj.id < 0 else "private"
return obj
class JsonSerializer:
fixes = {
"from_user": {
"new_name": "from",
"patch": JsonSerializerFixes.user
},
"user": {
"new_name": "user",
"patch": JsonSerializerFixes.user_type
}
}
@staticmethod
def default(obj):
if isinstance(obj, bytes):
return repr(obj)
cls = JsonSerializer
result = {}
for name in filter(lambda x: not x.startswith("_"), obj.__dict__):
value = getattr(obj, name)
if value is None:
continue
if name in cls.fixes:
value = cls.fixes[name]["patch"](value)
name = cls.fixes[name]["new_name"]
result[name] = value
return result
2019-11-04 16:58:31 +01:00
class ChannelHistoryReadTask(MtProtoTask):
2019-11-05 19:48:14 +01:00
_channel: pyrogram.Chat
_client: pyrogram.Client
_pts: int
_webhook: str
2019-11-04 15:08:33 +01:00
2019-11-03 22:11:45 +01:00
def setup(self, client: pyrogram.Client, channel: pyrogram.Chat, webhook: str):
2019-11-05 19:48:14 +01:00
self._pts = False
self._client = client
self._channel = channel
self._webhook = webhook
async def process(self) -> typing.Union[bool, int]:
response = await self._client.send(
2019-11-03 22:11:45 +01:00
GetChannelDifference(
2019-11-05 19:48:14 +01:00
channel=self._channel,
2019-11-03 22:11:45 +01:00
filter=ChannelMessagesFilterEmpty(),
2019-11-05 19:48:14 +01:00
pts=self._pts if self._pts else 0xFFFFFFF,
2019-11-03 22:11:45 +01:00
limit=0xFFFFFFF,
force=True
)
)
if isinstance(response, ChannelDifference):
2019-11-05 19:48:14 +01:00
self._pts = response.pts
2019-11-03 22:11:45 +01:00
users = {i.id: i for i in response.users}
chats = {i.id: i for i in response.chats}
for message in response.new_messages:
2019-11-05 19:48:14 +01:00
message = await MessagePyrogram._parse(self._client, message, users, chats)
2019-11-04 15:08:33 +01:00
data = json.dumps(
2019-11-05 19:48:14 +01:00
{"update_id": 1, "message": message},
default=JsonSerializer.default,
ensure_ascii=True,
allow_nan=False,
check_circular=True,
sort_keys=False
)
2019-11-05 19:48:14 +01:00
forwarder = WebHookDataForward()
forwarder.setup(self._webhook, data)
await self.future(forwarder)
2019-11-03 22:11:45 +01:00
if not response.final:
return 1
return response.timeout
if isinstance(response, ChannelDifferenceEmpty):
2019-11-05 19:48:14 +01:00
self._pts = response.pts
2019-11-03 22:11:45 +01:00
return response.timeout
if isinstance(response, ChannelDifferenceTooLong):
return False