leadguru-jobs 0.414.0__py3-none-any.whl → 0.415.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.414.0.dist-info → leadguru_jobs-0.415.0.dist-info}/METADATA +5 -10
  2. leadguru_jobs-0.415.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 +9 -9
  7. lgt_jobs/jobs/chat_history.py +52 -57
  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 +24 -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.414.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 -62
  22. lgt_jobs/lgt_common/discord_client/methods.py +0 -16
  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 -167
  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 -956
  41. lgt_jobs/lgt_data/mongo_repository.py +0 -1015
  42. {leadguru_jobs-0.414.0.dist-info → leadguru_jobs-0.415.0.dist-info}/WHEEL +0 -0
  43. {leadguru_jobs-0.414.0.dist-info → leadguru_jobs-0.415.0.dist-info}/top_level.txt +0 -0
@@ -1,62 +0,0 @@
1
- import loguru
2
- import requests
3
- from requests import Response
4
- from lgt_jobs.lgt_common.discord_client.methods import DiscordMethods
5
-
6
-
7
- class DiscordClient:
8
- base_url = 'https://discord.com/api/'
9
- discord_api_version = 'v9/'
10
- token: str
11
- headers: dict
12
-
13
- def __init__(self, token: str = None):
14
- self.token = token
15
- self.headers = {"Authorization": self.token}
16
-
17
- def login(self, login: str, password: str, captcha_key: str = None) -> dict:
18
- payload = {
19
- 'login': login,
20
- 'password': password,
21
- 'captcha_key': captcha_key,
22
- "undelete": False,
23
- "login_source": "",
24
- "gift_code_sku_id": None
25
- }
26
- response = requests.post(f"{self.base_url}{self.discord_api_version}{DiscordMethods.LOGIN.value}", json=payload)
27
- if response.status_code == 400 or response.status_code == 200:
28
- return response.json()
29
- return {}
30
-
31
- def get_servers(self) -> list | dict:
32
- response = requests.get(f"{self.base_url}{DiscordMethods.USER_GUILDS.value}", headers=self.headers)
33
- return self.__response(response).json()
34
-
35
- def get_dms(self) -> list | dict:
36
- response = requests.get(f"{self.base_url}{DiscordMethods.USER_DMS.value}", headers=self.headers)
37
- return self.__response(response).json()
38
-
39
- def get_current_user(self) -> dict:
40
- response = requests.get(f"{self.base_url}{DiscordMethods.USER.value}", headers=self.headers)
41
- if response.status_code != 200:
42
- self.__log_error(response)
43
- return response.json()
44
-
45
- def get_channels(self, guild_id: str) -> list | dict:
46
- response = requests.get(f"{self.base_url}{DiscordMethods.guild_channels(guild_id)}", headers=self.headers)
47
- return self.__response(response).json()
48
-
49
- def get_invite_link(self, channel_id: str) -> Response:
50
- response = requests.post(f'{self.base_url}{self.discord_api_version}'
51
- f'{DiscordMethods.channels_invites(channel_id)}', headers=self.headers)
52
- return self.__response(response)
53
-
54
- @staticmethod
55
- def __log_error(response: Response):
56
- loguru.logger.warning(f"[DiscordClient WARNING]: {response.url}, {response.status_code}, {response.content}")
57
-
58
- @staticmethod
59
- def __response(response: Response):
60
- if response.status_code != 200:
61
- DiscordClient.__log_error(response)
62
- return response
@@ -1,16 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class DiscordMethods(str, Enum):
5
- USER_GUILDS = 'users/@me/guilds'
6
- USER_DMS = 'users/@me/channels'
7
- USER = 'users/@me'
8
- LOGIN = 'auth/login'
9
-
10
- @staticmethod
11
- def guild_channels(guild_id: str):
12
- return f'guilds/{guild_id}/channels'
13
-
14
- @staticmethod
15
- def channels_invites(channel_id: str):
16
- return f'channels/{channel_id}/invites'
File without changes
@@ -1,6 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class SlackErrors(str, Enum):
5
- INVALID_AUTH = 'invalid_auth'
6
- TWO_FACTOR_REQUIRED = 'two_factor_setup_required'
@@ -1,18 +0,0 @@
1
- import re
2
-
3
-
4
- def update_credentials(credentials, token, cookies):
5
- credentials.token = token
6
- credentials.cookies = cookies
7
- credentials.invalid_creds = False
8
- return credentials
9
-
10
-
11
- def get_formatted_bot_name(name):
12
- bot_name = name
13
- bot_name.replace(" ", "_") \
14
- .replace(".", "dot_") \
15
- .replace("#", "") \
16
- .replace("+", "_plus")
17
-
18
- return re.sub(r'[^A-Za-z0-9]', "", bot_name).lower()
@@ -1,15 +0,0 @@
1
- import sys
2
- from loguru import logger as log
3
-
4
- log.remove()
5
- log.add(sys.stdout, format="{time} {name} {level} {message}", level="INFO",
6
- filter=lambda record: record['level'] == 'INFO')
7
- log.add(sys.stderr, format="{time} {name} {level} {message}", level="WARNING",
8
- filter=lambda record: record['level'] == 'WARNING')
9
- log.add(sys.stderr, format="{time} {name} {level} {message}", level="ERROR",
10
- filter=lambda record: record['level'] in ['ERROR', 'FATAL', 'CRITICAL'])
11
-
12
-
13
- log.info('Logger has been configured')
14
-
15
- log = log
File without changes
@@ -1,14 +0,0 @@
1
- import enum
2
- from typing import Optional
3
- from pydantic import BaseModel, Extra
4
-
5
-
6
- class TelegramCommandType(enum.Enum):
7
- AUTH_VERIFICATION_CODE = 1
8
- HARD_RESET = 1
9
-
10
-
11
- class TelegramCommand(BaseModel, extra=Extra.ignore):
12
- bot_id: str
13
- type: int
14
- data: Optional[str]
@@ -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)