Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.47 KB | None | 0 0
  1. import pydantic
  2. import typing
  3. import enum
  4. from .objects import MessagesKeyboard
  5.  
  6.  
  7. class KeyboardData(pydantic.BaseModel):
  8.     one_time: typing.Optional[bool]
  9.     inline: typing.Optional[bool]
  10.     buttons: typing.Optional[MessagesKeyboard]
  11.  
  12.  
  13. class ServiceMessageData(pydantic.BaseModel):
  14.     source_act: typing.Optional[str]
  15.     source_mid: typing.Optional[str]
  16.     source_message: typing.Optional[str]
  17.     source_chat_local_id: typing.Optional[str]
  18.  
  19.  
  20. class MessageData(pydantic.BaseModel):
  21.     title: typing.Optional[str]
  22.     emoji: typing.Optional[str]
  23.     from_id: typing.Optional[str] = pydantic.Field(None, alias="from")
  24.     fwd_count: typing.Optional[int]
  25.     has_template: typing.Optional[str]
  26.     mentions: typing.Optional[list]
  27.     marked_users: typing.Optional[list]  # useless
  28.     keyboard: typing.Optional[KeyboardData]
  29.     service_message: typing.Optional[ServiceMessageData]
  30.  
  31.  
  32. class MessageEventObject(pydantic.BaseModel):
  33.     event_id: typing.Optional[int]
  34.     message_id: typing.Optional[int]
  35.     flags: typing.Optional[int]
  36.     peer_id: typing.Optional[int]
  37.     timestamp: typing.Optional[int]
  38.     text: typing.Optional[str]
  39.     message_data: typing.Optional[MessageData]
  40.     extra_message_data: typing.Optional[typing.Dict[str, str]]
  41.     random_id: typing.Optional[int]
  42.     conversation_message_id: typing.Optional[int]
  43.     edit_time: typing.Optional[int]
  44.  
  45.  
  46. class MessageEventModel(pydantic.BaseModel):
  47.     object: typing.Optional[MessageEventObject] = pydantic.Field(None)
  48.  
  49.  
  50. class SetFlagsEventObject(pydantic.BaseModel):
  51.     event_id: typing.Optional[int]
  52.     message_id: typing.Optional[int]
  53.     flags: typing.Optional[int]
  54.     peer_id: typing.Optional[int]
  55.  
  56.  
  57. class SetFlagsEventModel(pydantic.BaseModel):
  58.     object: SetFlagsEventObject = pydantic.Field(None)
  59.  
  60.  
  61. class ReadIncomingMessagesEventObject(pydantic.BaseModel):
  62.     event_id: typing.Optional[int]
  63.     message_id: typing.Optional[int]
  64.     peer_id: typing.Optional[int]
  65.     count: typing.Optional[int]
  66.  
  67.  
  68. class ReadIncomingMessagesModel(pydantic.BaseModel):
  69.     object: ReadIncomingMessagesEventObject = pydantic.Field(None)
  70.  
  71.  
  72. class ReadOutgoingMessagesEventObject(pydantic.BaseModel):
  73.     event_id: typing.Optional[int]
  74.     message_id: typing.Optional[int]
  75.     peer_id: typing.Optional[int]
  76.     count: typing.Optional[int]
  77.  
  78.  
  79. class ReadOutgoingMessagesModel(pydantic.BaseModel):
  80.     object: ReadOutgoingMessagesEventObject = pydantic.Field(None)
  81.  
  82.  
  83. class PlatformEnum(int, enum.Enum):
  84.     MOBILE_CLIENT = 1
  85.     IPHONE = 2
  86.     IPAD = 3
  87.     ANDROID = 4
  88.     WINDOWS_PHONE = 5
  89.     WINDOWS_EIGHT = 6
  90.     OFFICIAL_VK_OR_DESKTOP = 7
  91.  
  92.  
  93. class FriendOnlineEventObject(pydantic.BaseModel):
  94.     event_id: typing.Optional[int]
  95.     user_id: typing.Optional[int]
  96.     platform: typing.Optional[PlatformEnum]
  97.     timestamp: typing.Optional[int]
  98.     app_id: typing.Optional[int]
  99.  
  100.  
  101. class FriendOnlineModel(pydantic.BaseModel):
  102.     object: FriendOnlineEventObject = pydantic.Field(None)
  103.  
  104.  
  105. class TimeoutUserEnum(int, enum.Enum):
  106.     LEAVED_FROM_SITE = 0
  107.     OFFLINE_FIVE_MINUTES = 1
  108.  
  109.  
  110. class FriendOfflineEventObject(pydantic.BaseModel):
  111.     event_id: typing.Optional[int]
  112.     is_timeout: typing.Optional[TimeoutUserEnum]
  113.     platform: typing.Optional[PlatformEnum]
  114.     timestamp: typing.Optional[int]
  115.     app_id: typing.Optional[int]
  116.  
  117.  
  118. class FriendOfflineModel(pydantic.BaseModel):
  119.     object: FriendOfflineEventObject = pydantic.Field(None)
  120.  
  121.  
  122. class SeenMentionInChatEventObject(pydantic.BaseModel):
  123.     event_id: typing.Optional[int]
  124.     peer_id: typing.Optional[int]
  125.     flags: typing.Optional[int]
  126.  
  127.  
  128. class SeenMentionInChatModel(pydantic.BaseModel):
  129.     object: SeenMentionInChatEventObject = pydantic.Field(None)
  130.  
  131.  
  132. class NewMentionInChatEventObject(pydantic.BaseModel):
  133.     event_id: typing.Optional[int]
  134.     peer_id: typing.Optional[int]
  135.     flags: typing.Optional[int]
  136.  
  137.  
  138. class NewMentionInChatModel(pydantic.BaseModel):
  139.     object: NewMentionInChatEventObject = pydantic.Field(None)
  140.  
  141.  
  142. class DeletedAllMessagesInDialogEventObject(pydantic.BaseModel):
  143.     event_id: typing.Optional[int]
  144.     peer_id: typing.Optional[int]
  145.     last_message_id: typing.Optional[int]
  146.  
  147.  
  148. class DeletedAllMessagesInDialogModel(pydantic.BaseModel):
  149.     object: DeletedAllMessagesInDialogEventObject = pydantic.Field(None)
  150.  
  151.  
  152. class DropMessageCacheEventObject(pydantic.BaseModel):
  153.     event_id: typing.Optional[int]
  154.     message_id: typing.Optional[int]
  155.  
  156.  
  157. class DropMessageCacheModel(pydantic.BaseModel):
  158.     object: DropMessageCacheEventObject = pydantic.Field(None)
  159.  
  160.  
  161. class ChangedChatSettingsType(int, enum.Enum):
  162.     CHANGED_CHAT_TITLE = 1
  163.     CHANGED_CHAT_PICTURE = 2
  164.     NEW_ADMINISTRATOR = 3
  165.     CHANGED_RULES = 4
  166.     PIN_OR_UNPIN_MESSAGE = 5
  167.     JOIN_TO_CHAT = 6
  168.     LEAVE_FROM_CHAT = 7
  169.     KICK_FROM_CHAT = 8
  170.     REMOVED_ADMINISTRATOR = 9
  171.     SHOW_OR_REMOVED_KEYBOARD = 10
  172.  
  173.  
  174. class ChangedChatSettingsEventObject(pydantic.BaseModel):
  175.     event_id: typing.Optional[int]
  176.     type: typing.Optional[ChangedChatSettingsType]
  177.     peer_id: typing.Optional[int]
  178.     extra: typing.Optional[
  179.         int
  180.     ]  # https://github.com/danyadev/longpoll-doc#%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B5-52-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%87%D0%B0%D1%82%D0%B0
  181.  
  182.  
  183. class ChangedChatSettingsModel(pydantic.BaseModel):
  184.     object: ChangedChatSettingsEventObject = pydantic.Field(None)
  185.  
  186.  
  187. class TypingOrVoiceEventObject(pydantic.BaseModel):
  188.     event_id: typing.Optional[int]
  189.     peer_id: typing.Optional[int]
  190.     from_ids: typing.Optional[typing.List[int]]
  191.     from_ids_count: typing.Optional[int]
  192.     timestamp: typing.Optional[int]
  193.  
  194.  
  195. class TypingOrVoiceModel(pydantic.BaseModel):
  196.     object: TypingOrVoiceEventObject = pydantic.Field(None)
  197.  
  198.  
  199. class ChangedUnreadDialogsCountEventObject(pydantic.BaseModel):
  200.     event_id: typing.Optional[int]
  201.     count: typing.Optional[int]
  202.     count_with_notifications: typing.Optional[int]
  203.  
  204.  
  205. class ChangedUnreadDialogsCountModel(pydantic.BaseModel):
  206.     object: ChangedUnreadDialogsCountEventObject = pydantic.Field(None)
  207.  
  208.  
  209. class EventId:
  210.     MESSAGE_EVENT = (3, 4, 5, 18)
  211.     SET_FLAGS = 2
  212.     READ_INCOMING_MESSAGES = 6
  213.     READ_OUTGOING_MESSAGES = 7
  214.     FRIEND_ONLINE = 8
  215.     FRIEND_OFFLINE = 9
  216.     SEEN_MENTION_IN_CHAT = 10
  217.     NEW_MENTION_IN_CHAT = 12
  218.     DELETED_ALL_MESSAGES_IN_DIALOG = 13
  219.     DROP_MESSAGE_CACHE = 19
  220.     CHANGE_CHAT_SETTINGS = 52
  221.     USER_TYPING_OR_MAKING_VOICE_MESSAGE = (63, 64)
  222.     CHANGED_UNREAD_DIALOGS_COUNT = 80
  223.  
  224.     # events after this are very strange and not typed yet
  225.     CHANGED_USER_INVISIBLE_STATE: int = 81
  226.     CHANGED_PUSH_SETTINGS_IN_CHAT: int = 114
  227.     VOICE_CALL: int = 115  # ¯\_(ツ)_/¯
  228.  
  229.  
  230. _message_event = {
  231.     0: "event_id",
  232.     1: "message_id",
  233.     2: "flags",
  234.     3: "peer_id",
  235.     4: "timestamp",
  236.     5: "text",
  237.     6: "message_data",
  238.     7: "extra_message_data",
  239.     8: "random_id",
  240.     9: "conversation_message_id",
  241.     10: "edit_time",
  242. }
  243.  
  244. _set_flags_event = {
  245.     0: "event_id",
  246.     1: "message_id",
  247.     2: "flags",
  248.     3: "peer_id",
  249. }
  250.  
  251. _read_incoming_messages = {0: "event_id", 1: "peer_id", 2: "message_id",
  252.                            3: "count"}
  253.  
  254. _read_outgoing_messages = {0: "event_id", 1: "peer_id", 2: "message_id",
  255.                            3: "count"}
  256.  
  257. _friend_online = {
  258.     0: "event_id",
  259.     1: "user_id",
  260.     2: "platform",
  261.     3: "timestamp",
  262.     4: "app_id",
  263. }
  264.  
  265. _friend_offline = {
  266.     0: "event_id",
  267.     1: "user_id",
  268.     2: "is_timeout",
  269.     3: "timestamp",
  270.     4: "app_id",
  271.     5: "unexpected",
  272.     6: "unexpected"
  273. }
  274.  
  275. _seen_mention_in_chat = {
  276.     0: "event_id",
  277.     1: "peer_id",
  278.     2: "flags",
  279. }
  280.  
  281. _new_mention_in_chat = {
  282.     0: "event_id",
  283.     1: "peer_id",
  284.     2: "flags",
  285. }
  286.  
  287. _deleted_all_messages_in_chat = {
  288.     0: "event_id",
  289.     1: "peer_id",
  290.     2: "last_message_id",
  291. }
  292.  
  293. _drop_message_cache = {
  294.     0: "event_id",
  295.     1: "message_id",
  296. }
  297.  
  298. _changed_chat_settings = {0: "event_id", 1: "type", 2: "peer_id", 3: "extra"}
  299.  
  300. _typing_or_voice = {
  301.     0: "event_id",
  302.     1: "peer_id",
  303.     2: "from_ids",
  304.     3: "from_ids_count",
  305.     4: "timestamp",
  306. }
  307.  
  308. _changed_unread_dialogs_count = {
  309.     0: "event_id",
  310.     1: "count",
  311.     2: "count_with_notifications",
  312. }
  313.  
  314. _events_dict = {
  315.     EventId.MESSAGE_EVENT: _message_event,
  316.     EventId.SET_FLAGS: _set_flags_event,
  317.     EventId.READ_INCOMING_MESSAGES: _read_incoming_messages,
  318.     EventId.READ_OUTGOING_MESSAGES: _read_outgoing_messages,
  319.     EventId.FRIEND_ONLINE: _friend_online,
  320.     EventId.FRIEND_OFFLINE: _friend_offline,
  321.     EventId.SEEN_MENTION_IN_CHAT: _seen_mention_in_chat,
  322.     EventId.NEW_MENTION_IN_CHAT: _new_mention_in_chat,
  323.     EventId.DELETED_ALL_MESSAGES_IN_DIALOG: _deleted_all_messages_in_chat,
  324.     EventId.DROP_MESSAGE_CACHE: _drop_message_cache,
  325.     EventId.CHANGE_CHAT_SETTINGS: _changed_chat_settings,
  326.     EventId.CHANGED_UNREAD_DIALOGS_COUNT: _changed_unread_dialogs_count,
  327. }
  328.  
  329.  
  330. def get_event_object(raw_event: list):
  331.     event = {}
  332.     event_type = raw_event[0]
  333.  
  334.     if event_type in EventId.MESSAGE_EVENT:
  335.         for event_number, event_param in enumerate(raw_event):
  336.             event[
  337.                 _events_dict[EventId.MESSAGE_EVENT][event_number]
  338.             ] = event_param
  339.  
  340.         print(event)
  341.         return MessageEventModel(object=MessageEventObject(**event))
  342.     elif event_type == EventId.SET_FLAGS:
  343.         for event_number, event_param in enumerate(raw_event):
  344.             event[_events_dict[EventId.SET_FLAGS][
  345.                 event_number]] = event_param
  346.         return SetFlagsEventModel(object=(SetFlagsEventObject(**event)))
  347.     elif event_type == EventId.READ_INCOMING_MESSAGES:
  348.         for event_number, event_param in enumerate(raw_event):
  349.             event[
  350.                 _events_dict[EventId.READ_INCOMING_MESSAGES][event_number]
  351.             ] = event_param
  352.         return ReadIncomingMessagesModel(
  353.             object=(ReadIncomingMessagesEventObject(**event))
  354.         )
  355.     elif event_type == EventId.READ_OUTGOING_MESSAGES:
  356.         for event_number, event_param in enumerate(raw_event):
  357.             event[
  358.                 _events_dict[EventId.READ_OUTGOING_MESSAGES][event_number]
  359.             ] = event_param
  360.         return ReadOutgoingMessagesModel(
  361.             object=(ReadOutgoingMessagesEventObject(**event))
  362.         )
  363.     elif event_type == EventId.FRIEND_ONLINE:
  364.         for event_number, event_param in enumerate(raw_event):
  365.             event[
  366.                 _events_dict[EventId.FRIEND_ONLINE][event_number]
  367.             ] = event_param
  368.         return FriendOnlineModel(object=(FriendOnlineEventObject(**event)))
  369.     elif event_type == EventId.FRIEND_OFFLINE:
  370.         for event_number, event_param in enumerate(raw_event):
  371.             event[
  372.                 _events_dict[EventId.FRIEND_OFFLINE][event_number]
  373.             ] = event_param
  374.         return FriendOfflineModel(object=(FriendOfflineEventObject(**event)))
  375.     elif event_type == EventId.SEEN_MENTION_IN_CHAT:
  376.         for event_number, event_param in enumerate(raw_event):
  377.             event[
  378.                _events_dict[EventId.SEEN_MENTION_IN_CHAT][event_number]
  379.             ] = event_param
  380.         return SeenMentionInChatModel(
  381.             object=(SeenMentionInChatEventObject(**event))
  382.         )
  383.     elif event_type == EventId.NEW_MENTION_IN_CHAT:
  384.         for event_number, event_param in enumerate(raw_event):
  385.             event[
  386.                 _events_dict[EventId.NEW_MENTION_IN_CHAT][event_number]
  387.             ] = event_param
  388.         return NewMentionInChatModel(
  389.             object=(NewMentionInChatEventObject(**event)))
  390.     elif event_type == EventId.DELETED_ALL_MESSAGES_IN_DIALOG:
  391.         for event_number, event_param in enumerate(raw_event):
  392.             event[
  393.                 _events_dict[EventId.DELETED_ALL_MESSAGES_IN_DIALOG][
  394.                     event_number
  395.                 ]
  396.             ] = event_param
  397.         return DeletedAllMessagesInDialogModel(
  398.             object=(DeletedAllMessagesInDialogEventObject(**event))
  399.         )
  400.     elif event_type == EventId.DROP_MESSAGE_CACHE:
  401.         for event_number, event_param in enumerate(raw_event):
  402.             event[
  403.                 _events_dict[EventId.DROP_MESSAGE_CACHE][event_number]
  404.             ] = event_param
  405.         return DropMessageCacheModel(
  406.             object=(DropMessageCacheEventObject(**event)))
  407.     elif event_type == EventId.CHANGE_CHAT_SETTINGS:
  408.         for event_number, event_param in enumerate(raw_event):
  409.             event[
  410.                 _events_dict[EventId.CHANGE_CHAT_SETTINGS][event_number]
  411.             ] = event_param
  412.         return ChangedChatSettingsModel(
  413.             object=(ChangedChatSettingsEventObject(**event))
  414.         )
  415.     elif event_type in EventId.USER_TYPING_OR_MAKING_VOICE_MESSAGE:
  416.         for event_number, event_param in enumerate(raw_event):
  417.             event[
  418.                _events_dict[EventId.USER_TYPING_OR_MAKING_VOICE_MESSAGE][
  419.                     event_number
  420.                 ]
  421.             ] = event_param
  422.         return TypingOrVoiceModel(object=(TypingOrVoiceEventObject(**event)))
  423.     elif event_type == EventId.CHANGED_UNREAD_DIALOGS_COUNT:
  424.         for event_number, event_param in enumerate(raw_event):
  425.             event[
  426.                 _events_dict[EventId.CHANGED_UNREAD_DIALOGS_COUNT][
  427.                     event_number]
  428.             ] = event_param
  429.         return ChangedUnreadDialogsCountModel(
  430.             object=(ChangedUnreadDialogsCountEventObject(**event))
  431.         )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement