leadguru-jobs 0.403.0__py3-none-any.whl → 0.405.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {leadguru_jobs-0.403.0.dist-info → leadguru_jobs-0.405.0.dist-info}/METADATA +5 -10
  2. leadguru_jobs-0.405.0.dist-info/RECORD +26 -0
  3. lgt_jobs/__init__.py +4 -4
  4. lgt_jobs/jobs/analytics.py +1 -1
  5. lgt_jobs/jobs/archive_leads.py +2 -2
  6. lgt_jobs/jobs/bot_stats_update.py +11 -10
  7. lgt_jobs/jobs/chat_history.py +6 -6
  8. lgt_jobs/jobs/inbox_leads.py +6 -5
  9. lgt_jobs/jobs/mass_message.py +2 -2
  10. lgt_jobs/jobs/send_code.py +1 -1
  11. lgt_jobs/jobs/send_slack_message.py +5 -5
  12. lgt_jobs/jobs/update_slack_profile.py +14 -12
  13. lgt_jobs/jobs/user_balance_update.py +5 -5
  14. lgt_jobs/jobs/workspace_connect.py +5 -7
  15. lgt_jobs/main.py +11 -9
  16. lgt_jobs/runner.py +9 -6
  17. lgt_jobs/smtp.py +1 -1
  18. leadguru_jobs-0.403.0.dist-info/RECORD +0 -49
  19. lgt_jobs/lgt_common/__init__.py +0 -0
  20. lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
  21. lgt_jobs/lgt_common/discord_client/discord_client.py +0 -58
  22. lgt_jobs/lgt_common/discord_client/methods.py +0 -15
  23. lgt_jobs/lgt_common/enums/__init__.py +0 -0
  24. lgt_jobs/lgt_common/enums/slack_errors.py +0 -6
  25. lgt_jobs/lgt_common/helpers.py +0 -18
  26. lgt_jobs/lgt_common/lgt_logging.py +0 -15
  27. lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
  28. lgt_jobs/lgt_common/pubsub/command.py +0 -14
  29. lgt_jobs/lgt_common/pubsub/messages.py +0 -37
  30. lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -51
  31. lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
  32. lgt_jobs/lgt_common/slack_client/methods.py +0 -46
  33. lgt_jobs/lgt_common/slack_client/slack_client.py +0 -392
  34. lgt_jobs/lgt_common/slack_client/web_client.py +0 -164
  35. lgt_jobs/lgt_data/__init__.py +0 -0
  36. lgt_jobs/lgt_data/analytics.py +0 -723
  37. lgt_jobs/lgt_data/engine.py +0 -223
  38. lgt_jobs/lgt_data/enums.py +0 -68
  39. lgt_jobs/lgt_data/helpers.py +0 -2
  40. lgt_jobs/lgt_data/model.py +0 -960
  41. lgt_jobs/lgt_data/mongo_repository.py +0 -980
  42. {leadguru_jobs-0.403.0.dist-info → leadguru_jobs-0.405.0.dist-info}/WHEEL +0 -0
  43. {leadguru_jobs-0.403.0.dist-info → leadguru_jobs-0.405.0.dist-info}/top_level.txt +0 -0
@@ -1,37 +0,0 @@
1
- import os
2
- import time
3
- from google.cloud import pubsub_v1
4
- from loguru import logger
5
-
6
- project_id = os.environ.get('PUBSUB_PROJECT_ID')
7
-
8
-
9
- def publish_message2_pubsub(topic_name, message_json):
10
- def callback(message_future):
11
- try:
12
- pubsub_result = message_future.result()
13
- # When timeout is unspecified, the exception method waits indefinitely.
14
- if message_future.exception(timeout=60):
15
- logger.error(f'Publishing message on {topic_name} threw an Exception {message_future.exception()}.')
16
- else:
17
- logger.info('lgt-metric:lgt-slack-aggregator:pub-sub:message-sent')
18
- logger.info(pubsub_result)
19
- except Exception:
20
- logger.error(f'Error has happening during getting result of future message')
21
-
22
- attempt = 0
23
- while True:
24
- try:
25
- publisher = pubsub_v1.PublisherClient()
26
- topic_path = publisher.topic_path(project_id, topic_name)
27
- logger.info(f'Json: {message_json}')
28
- message = publisher.publish(topic_path, data=bytes(message_json, "utf8"))
29
- message.add_done_callback(callback)
30
- result = message.result()
31
- logger.info(f'Message has been sent {result}')
32
- return
33
- except:
34
- attempt = attempt + 1
35
- if attempt >= 3:
36
- raise
37
- time.sleep(3)
@@ -1,51 +0,0 @@
1
- from google.cloud import pubsub_v1
2
- from google.api_core.exceptions import GoogleAPICallError
3
- from google.auth.transport.grpc import *
4
-
5
-
6
- class PubSubFactory:
7
-
8
- def __init__(self, project_id):
9
- self.project_id = project_id
10
- self.publisher = pubsub_v1.PublisherClient()
11
- self.subscriber = pubsub_v1.SubscriberClient()
12
-
13
- def get_topic_path(self, topic_name):
14
- return self.publisher.api.topic_path(self.project_id, f'{topic_name}')
15
-
16
- def get_subscription_path(self, subscriber_name, topic_name):
17
- return self.subscriber.api.subscription_path(self.project_id, f'{topic_name}_{subscriber_name}')
18
-
19
- def create_topic_if_doesnt_exist(self, topic_name) -> pubsub_v1.types.pubsub_gapic_types.Topic:
20
- topic_path = self.get_topic_path(topic_name)
21
- try:
22
- return self.publisher.api.get_topic(topic=topic_path)
23
- except GoogleAPICallError as ex:
24
- if ex.grpc_status_code == grpc.StatusCode.NOT_FOUND:
25
- return self.publisher.api.create_topic(name=topic_path)
26
- else:
27
- raise
28
-
29
- def delete_topic(self, topic_name: str):
30
- topic_path = self.get_topic_path(topic_name)
31
- self.publisher.api.delete_topic(topic=topic_path)
32
-
33
- def delete_subscriber(self, subscriber_name: str, topic_name: str):
34
- subscription_path = self.get_subscription_path(subscriber_name, topic_name)
35
- self.subscriber.api.delete_subscription(subscription=subscription_path)
36
-
37
- def create_subscription_if_doesnt_exist(self, subscriber_name, topic_name,
38
- ack_deadline_seconds=60) -> pubsub_v1.types.pubsub_gapic_types.Subscription:
39
- subscription_path = self.get_subscription_path(subscriber_name, topic_name)
40
- self.create_topic_if_doesnt_exist(topic_name)
41
-
42
- try:
43
- return self.subscriber.api.get_subscription(subscription=subscription_path)
44
- except GoogleAPICallError as ex:
45
- if ex.grpc_status_code == grpc.StatusCode.NOT_FOUND:
46
- return self.subscriber.api.create_subscription(name=subscription_path,
47
- topic=self.get_topic_path(topic_name),
48
- push_config=None,
49
- ack_deadline_seconds=ack_deadline_seconds)
50
- else:
51
- raise
File without changes
@@ -1,46 +0,0 @@
1
- class SlackMethods:
2
- profile_set = 'users.profile.set'
3
- profile_get = 'users.profile.get'
4
- profile_set_photo = 'users.setPhoto'
5
- set_sections = 'users.profile.setSections'
6
- users_list = 'users.list'
7
- users_info = 'users.info'
8
- users_get_presence = 'users.getPresence'
9
- list_users = "users.list"
10
-
11
- conversations_join = 'conversations.join'
12
- conversations_leave = 'conversations.leave'
13
- conversations_list = 'conversations.list'
14
- conversations_open = 'conversations.open'
15
- conversations_history = 'conversations.history'
16
- conversations_replies = 'conversations.replies'
17
- conversations_info = 'conversations.info'
18
-
19
- chat_delete = 'chat.delete'
20
- chat_update = 'chat.update'
21
- chat_post_message = 'chat.postMessage'
22
- chat_schedule_message = "chat.scheduleMessage"
23
- chat_attachments = "chat.unfurlLink"
24
-
25
- rtm_connect = 'rtm.connect'
26
-
27
- reactions_get = 'reactions.get'
28
- create_shared_invite = 'users.admin.createSharedInvite'
29
- send_invite_by_email = 'users.admin.inviteBulk'
30
- alternative_invite_by_email = 'users.inviteRequests.create'
31
-
32
- upload_file = 'files.upload'
33
- download_file = 'files.download'
34
- delete_file = 'files.delete'
35
- share_files = 'files.share'
36
-
37
- check_email = 'signup.checkEmail'
38
- confirm_email = 'signup.confirmEmail'
39
-
40
- confirm_code = 'signin.confirmCode'
41
- find_workspaces = 'signin.findWorkspaces'
42
-
43
- auth_test = 'auth.test'
44
-
45
- team_profile_get = 'team.profile.get'
46
- team_info = 'team.info'
@@ -1,392 +0,0 @@
1
- import requests
2
- import aiohttp
3
- import asyncio
4
- import websockets
5
- import json
6
- import io
7
- from urllib import parse
8
- from requests import Response
9
- from websockets.client import WebSocketClientProtocol
10
- from .methods import SlackMethods
11
-
12
-
13
- class SlackClient:
14
- base_url = 'https://slack.com/api/'
15
- token: str
16
- cookies: dict
17
- socket: WebSocketClientProtocol
18
- headers: dict
19
-
20
- def __init__(self, token: str, cookies):
21
- self.token = token
22
- self.headers = {"Authorization": f"Bearer {self.token}"}
23
- if isinstance(cookies, list):
24
- self.cookies = {cookie['name']: cookie['value'] for cookie in cookies}
25
- else:
26
- self.cookies = cookies
27
-
28
- def join_channels(self, channels):
29
- loop = asyncio.new_event_loop()
30
- asyncio.set_event_loop(loop)
31
- tasks = asyncio.gather(*[self.join_channel_async(channel) for channel in channels])
32
- results = loop.run_until_complete(tasks)
33
- loop.close()
34
- return results
35
-
36
- def leave_channels(self, channels):
37
- loop = asyncio.new_event_loop()
38
- asyncio.set_event_loop(loop)
39
- tasks = asyncio.gather(*[self.leave_channel_async(channel) for channel in channels])
40
- results = loop.run_until_complete(tasks)
41
- loop.close()
42
- return results
43
-
44
- async def join_channel_async(self, channel):
45
- async with aiohttp.ClientSession() as session:
46
- url = f'{self.base_url}{SlackMethods.conversations_join}?{self.__channel_payload(channel)}'
47
- async with session.post(url=url, cookies=self.cookies) as response:
48
- return await response.json()
49
-
50
- async def leave_channel_async(self, channel):
51
- async with aiohttp.ClientSession() as session:
52
- url = f'{self.base_url}{SlackMethods.conversations_leave}?{self.__channel_payload(channel)}'
53
- async with session.post(url=url, cookies=self.cookies) as response:
54
- return await response.json()
55
-
56
- def upload_file(self, file, file_name):
57
- payload = {"content": file, "filename": file_name}
58
- return requests.post(f"{self.base_url}{SlackMethods.upload_file}", data=payload,
59
- headers=self.headers, cookies=self.cookies).json()
60
-
61
- def download_file(self, file_url) -> Response:
62
- return requests.get(file_url, headers=self.headers, cookies=self.cookies)
63
-
64
- def delete_file(self, file_id: str):
65
- payload = {"file": file_id}
66
- return requests.post(f"{self.base_url}{SlackMethods.delete_file}", data=payload,
67
- headers=self.headers, cookies=self.cookies).json()
68
-
69
- def share_files(self, files_ids: list, channel: str, text: str = None) -> dict:
70
- payload = {
71
- "files": ','.join(files_ids),
72
- "channel": channel,
73
- }
74
- if text:
75
- payload["blocks"] = json.dumps([{"type": "rich_text", "elements": [
76
- {"type": "rich_text_section", "elements": [{"type": "text", "text": text}]}]}])
77
-
78
- return requests.post(f"{self.base_url}{SlackMethods.share_files}", data=payload,
79
- headers=self.headers, cookies=self.cookies).json()
80
-
81
- def get_profile(self, user_id: str = None):
82
- url = f'{self.base_url}{SlackMethods.profile_get}'
83
- payload = {}
84
- if user_id:
85
- payload['user'] = user_id
86
- return requests.post(url=url, cookies=self.cookies, headers=self.headers, json=payload).json()
87
-
88
- def get_team_profile(self):
89
- url = f'{self.base_url}{SlackMethods.team_profile_get}'
90
- return requests.post(url=url, cookies=self.cookies, headers=self.headers).json()
91
-
92
- def get_team_info(self):
93
- url = f'{self.base_url}{SlackMethods.team_info}'
94
- return requests.get(url=url, cookies=self.cookies, headers=self.headers).json()
95
-
96
- def update_profile(self, profile):
97
- url = f'{self.base_url}{SlackMethods.profile_set}'
98
- return requests.post(url=url, headers=self.headers, cookies=self.cookies, json={'profile': profile}).json()
99
-
100
- def update_section(self, user_id: str, section_id: str, element_id: str, text: str):
101
- url = f'{self.base_url}{SlackMethods.set_sections}'
102
- payload = {
103
- 'token': self.token,
104
- 'user': user_id,
105
- 'section': section_id,
106
- 'elements': json.dumps([{"element_id": element_id, "text": {"text": text}}]),
107
- }
108
- return requests.post(url=url, headers=self.headers, cookies=self.cookies, data=payload).json()
109
-
110
- def update_profile_photo(self, photo_url):
111
- url = f'{self.base_url}{SlackMethods.profile_set_photo}'
112
- with requests.get(photo_url) as img_resp:
113
- if img_resp.status_code != 200:
114
- raise Exception(f"Invalid url: {photo_url}")
115
- image = io.BytesIO(img_resp.content)
116
-
117
- files = {"image": image}
118
- headers = {"Authorization": f"Bearer {self.token}"}
119
-
120
- return requests.post(url=url, files=files, headers=headers, cookies=self.cookies, verify=False).json()
121
-
122
- def get_conversations_list(self):
123
- payload = {'types': ','.join(["public_channel", "private_channel"])}
124
- base_url = f'{self.base_url}{SlackMethods.conversations_list}?limit=1000'
125
- page = requests.post(url=base_url, cookies=self.cookies, data=payload, headers=self.headers).json()
126
- result = page.copy()
127
- if page["ok"]:
128
- while page.get("response_metadata", {}).get("next_cursor"):
129
- url = base_url + f'&cursor={page.get("response_metadata", {}).get("next_cursor")}'
130
- page = requests.post(url=url, cookies=self.cookies, data=payload, headers=self.headers).json()
131
- if page['ok']:
132
- result['channels'].extend(page['channels'])
133
- result["channels"] = [ch for ch in result["channels"]
134
- if ch.get('is_channel')
135
- and not ch.get('is_archived')
136
- and not ch.get('is_frozen')]
137
-
138
- return result
139
-
140
- def get_im_list(self):
141
- url = f'{self.base_url}{SlackMethods.conversations_list}?{self.__conversation_list_payload(["im"])}'
142
- return requests.get(url=url, cookies=self.cookies).json()
143
-
144
- def im_open(self, user: str):
145
- url = f'{self.base_url}{SlackMethods.conversations_open}?{self.__im_open_payload(user)}'
146
- return requests.post(url=url, cookies=self.cookies).json()
147
-
148
- def delete_message(self, channel: str, ts: str):
149
- url = f'{self.base_url}{SlackMethods.chat_delete}?{self.__delete_message_payload(channel, ts)}'
150
- return requests.post(url=url, cookies=self.cookies).json()
151
-
152
- def conversations_info(self, channel: str):
153
- url = f'{self.base_url}{SlackMethods.conversations_info}?{self.__conversation_info_payload(channel)}'
154
- return requests.post(url=url, cookies=self.cookies).json()
155
-
156
- def update_message(self, channel: str, ts: str, text: str, file_ids: str):
157
- url = f'{self.base_url}{SlackMethods.chat_update}?{self.__update_message_payload(channel, ts, text, file_ids)}'
158
- return requests.post(url=url, cookies=self.cookies).json()
159
-
160
- def conversations_history(self, channel: str, ts: str = None):
161
- url = f'{self.base_url}{SlackMethods.conversations_history}?{self.__channel_payload(channel, ts)}'
162
- return requests.get(url=url, cookies=self.cookies).json()
163
-
164
- def conversations_replies(self, channel: str, ts: str):
165
- url = f'{self.base_url}{SlackMethods.conversations_replies}?{self.__ts_payload(channel, ts)}'
166
- return requests.get(url=url, cookies=self.cookies).json()
167
-
168
- def get_presense(self, user: str = None):
169
- url = f'{self.base_url}{SlackMethods.users_get_presence}?{self.__presense_payload(user)}'
170
- return requests.get(url=url, cookies=self.cookies).json()
171
-
172
- def post_message(self, channel: str, text: str):
173
- import uuid
174
- payload = {
175
- 'channel': channel,
176
- 'text': text,
177
- 'client_msg_id': str(uuid.uuid4())
178
- }
179
- url = f'{self.base_url}{SlackMethods.chat_post_message}'
180
- return requests.post(url=url, cookies=self.cookies, headers=self.headers, data=payload).json()
181
-
182
- def post_message_schedule(self, channel: str, text: str, post_at: int):
183
- url = (f'{self.base_url}{SlackMethods.chat_schedule_message}?'
184
- f'{self.__post_scheduled_message_payload(channel, text, post_at)}')
185
- return requests.post(url=url, cookies=self.cookies).json()
186
-
187
- def users_list(self, cursor=None, limit: int = 1000):
188
- url = f'{self.base_url}{SlackMethods.users_list}?{self.__token_payload()}'
189
- if cursor:
190
- url += f'&cursor={cursor}'
191
-
192
- if limit:
193
- url += f'&limit={limit}'
194
-
195
- return requests.get(url=url, cookies=self.cookies).json()
196
-
197
- def user_info(self, user: str):
198
- url = f'{self.base_url}{SlackMethods.users_info}?{self.__user_info_payload(user)}'
199
- return requests.get(url=url, cookies=self.cookies).json()
200
-
201
- def get_reactions(self, channel: str, ts: str):
202
- url = f'{self.base_url}{SlackMethods.reactions_get}?{self.__get_reactions_payload(channel, ts)}'
203
- return requests.get(url=url, cookies=self.cookies).json()
204
-
205
- def get_attachments(self, channel: str, msg_id: str, url: str):
206
- payload = {
207
- 'token': self.token,
208
- 'channel': channel,
209
- 'client_msg_id': msg_id,
210
- 'url': url
211
- }
212
- url = f'{self.base_url}{SlackMethods.chat_attachments}'
213
- response = requests.post(url=url, cookies=self.cookies, data=payload)
214
- if response.status_code != 200:
215
- return
216
- return response.json().get('attachments')
217
-
218
- def check_email(self, email: str, user_agent: str) -> bool:
219
- payload = {'email': email}
220
- headers = {'User-Agent': user_agent}
221
- response = requests.post(f"{self.base_url}/{SlackMethods.check_email}", params=payload, headers=headers)
222
- if response.status_code != 200:
223
- return False
224
- return response.json()['ok']
225
-
226
- def confirm_email(self, email: str, user_agent: str, locale: str = 'en-US') -> bool:
227
- payload = {'email': email, 'locale': locale}
228
- headers = {'User-Agent': user_agent}
229
- response = requests.post(f"{self.base_url}/{SlackMethods.confirm_email}", params=payload, headers=headers)
230
- if response.status_code != 200:
231
- return False
232
- return response.json()['ok']
233
-
234
- def confirm_code(self, email: str, code: str, user_agent: str) -> requests.Response:
235
- payload = {'email': email, 'code': code}
236
- headers = {'User-Agent': user_agent}
237
- return requests.post(f"{self.base_url}/{SlackMethods.confirm_code}", params=payload, headers=headers)
238
-
239
- def find_workspaces(self, user_agent: str) -> requests.Response:
240
- headers = {'User-Agent': user_agent}
241
- response = requests.post(f"{self.base_url}/{SlackMethods.find_workspaces}",
242
- cookies=self.cookies, headers=headers)
243
- return response
244
-
245
- def create_shared_invite(self):
246
- expiration = '36000'
247
- max_signups = '100'
248
- payload = {
249
- 'expiration': expiration,
250
- 'max_signups': max_signups
251
- }
252
- headers = {"Authorization": f"Bearer {self.token}"}
253
- response = requests.post(f"{self.base_url}/{SlackMethods.create_shared_invite}", headers=headers,
254
- cookies=self.cookies, params=payload)
255
- return response
256
-
257
- def send_slack_invite_to_workspace(self, email):
258
- payload = {"invites": [{'email': email, "type": "regular", "mode": "manual"}]}
259
- headers = {"Authorization": f"Bearer {self.token}"}
260
- response = requests.post(f"{self.base_url}/{SlackMethods.send_invite_by_email}", headers=headers,
261
- cookies=self.cookies, json=payload)
262
- if not response.json()['ok']:
263
- payload = {"requests": payload["invites"]}
264
- response = requests.post(f"{self.base_url}/{SlackMethods.alternative_invite_by_email}", headers=headers,
265
- cookies=self.cookies, json=payload)
266
- return response
267
-
268
- def test_auth(self):
269
- headers = {"Authorization": f"Bearer {self.token}"}
270
- return requests.post(f"{self.base_url}/{SlackMethods.auth_test}", headers=headers,
271
- cookies=self.cookies)
272
-
273
- def rtm_connect(self, callback):
274
- loop = asyncio.new_event_loop()
275
- loop.run_until_complete(self.__consumer(callback))
276
- loop.run_forever()
277
-
278
- async def __consumer(self, callback):
279
- url = f'{self.base_url}{SlackMethods.rtm_connect}?{self.__token_payload()}'
280
- response = requests.get(url=url, cookies=self.cookies).json()
281
- web_socket_url = response['url']
282
- async with websockets.connect(uri=web_socket_url) as websocket:
283
- self.socket = websocket
284
- async for message in websocket:
285
- await callback(json.loads(message))
286
-
287
- def __token_payload(self):
288
- return parse.urlencode({'token': self.token})
289
-
290
- def __user_info_payload(self, user):
291
- payload = {
292
- 'token': self.token,
293
- 'user': user
294
- }
295
- return parse.urlencode(payload)
296
-
297
- def __post_scheduled_message_payload(self, channel, text, post_at):
298
- payload = {
299
- 'token': self.token,
300
- 'channel': channel,
301
- 'text': text,
302
- 'post_at': post_at
303
- }
304
- return parse.urlencode(payload)
305
-
306
- def __update_message_payload(self, channel, ts, text, file_ids):
307
- payload = {
308
- 'parse': 'none',
309
- 'token': self.token,
310
- 'channel': channel,
311
- 'ts': ts,
312
- 'text': text,
313
- 'file_ids': file_ids
314
- }
315
- return parse.urlencode(payload)
316
-
317
- def __conversation_info_payload(self, channel):
318
- payload = {
319
- 'token': self.token,
320
- 'channel': channel,
321
- 'include_num_members': "true"
322
- }
323
- return parse.urlencode(payload)
324
-
325
- def __delete_message_payload(self, channel, ts):
326
- payload = {
327
- 'token': self.token,
328
- 'channel': channel,
329
- 'ts': ts
330
- }
331
- return parse.urlencode(payload)
332
-
333
- def __conversation_list_payload(self, types: list):
334
- payload = {
335
- 'token': self.token,
336
- 'types': ','.join(types)
337
- }
338
- return parse.urlencode(payload)
339
-
340
- def __im_open_payload(self, user: str):
341
- payload = {
342
- 'token': self.token,
343
- 'users': user,
344
- 'types': 'im'
345
- }
346
- return parse.urlencode(payload)
347
-
348
- def __update_profile_payload(self, profile):
349
- payload = {
350
- 'token': self.token,
351
- 'profile': profile
352
- }
353
- return parse.urlencode(payload)
354
-
355
- def __channel_payload(self, channel, ts=None):
356
- payload = {
357
- 'token': self.token,
358
- 'channel': channel
359
- }
360
-
361
- if ts:
362
- payload["ts"] = ts
363
- payload["limit"] = 1
364
- payload["inclusive"] = True
365
-
366
- return parse.urlencode(payload)
367
-
368
- def __presense_payload(self, user: str = None):
369
- payload = {
370
- 'token': self.token,
371
- }
372
-
373
- if user:
374
- payload["user"] = user
375
- return parse.urlencode(payload)
376
-
377
- def __ts_payload(self, channel: str, ts: str):
378
- payload = {
379
- 'token': self.token,
380
- 'channel': channel,
381
- 'ts': ts
382
- }
383
- return parse.urlencode(payload)
384
-
385
- def __get_reactions_payload(self, channel, ts):
386
- payload = {
387
- 'token': self.token,
388
- 'full': True,
389
- 'channel': channel,
390
- 'timestamp': ts
391
- }
392
- return parse.urlencode(payload)