leadguru-jobs 0.404.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.
- {leadguru_jobs-0.404.0.dist-info → leadguru_jobs-0.405.0.dist-info}/METADATA +5 -10
- leadguru_jobs-0.405.0.dist-info/RECORD +26 -0
- lgt_jobs/__init__.py +4 -4
- lgt_jobs/jobs/analytics.py +1 -1
- lgt_jobs/jobs/archive_leads.py +2 -2
- lgt_jobs/jobs/bot_stats_update.py +11 -10
- lgt_jobs/jobs/chat_history.py +6 -6
- lgt_jobs/jobs/inbox_leads.py +6 -5
- lgt_jobs/jobs/mass_message.py +2 -2
- lgt_jobs/jobs/send_code.py +1 -1
- lgt_jobs/jobs/send_slack_message.py +5 -5
- lgt_jobs/jobs/update_slack_profile.py +14 -12
- lgt_jobs/jobs/user_balance_update.py +5 -5
- lgt_jobs/jobs/workspace_connect.py +5 -7
- lgt_jobs/main.py +11 -9
- lgt_jobs/runner.py +9 -6
- lgt_jobs/smtp.py +1 -1
- leadguru_jobs-0.404.0.dist-info/RECORD +0 -49
- lgt_jobs/lgt_common/__init__.py +0 -0
- lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
- lgt_jobs/lgt_common/discord_client/discord_client.py +0 -58
- lgt_jobs/lgt_common/discord_client/methods.py +0 -15
- lgt_jobs/lgt_common/enums/__init__.py +0 -0
- lgt_jobs/lgt_common/enums/slack_errors.py +0 -6
- lgt_jobs/lgt_common/helpers.py +0 -18
- lgt_jobs/lgt_common/lgt_logging.py +0 -15
- lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
- lgt_jobs/lgt_common/pubsub/command.py +0 -14
- lgt_jobs/lgt_common/pubsub/messages.py +0 -37
- lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -51
- lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
- lgt_jobs/lgt_common/slack_client/methods.py +0 -46
- lgt_jobs/lgt_common/slack_client/slack_client.py +0 -392
- lgt_jobs/lgt_common/slack_client/web_client.py +0 -164
- lgt_jobs/lgt_data/__init__.py +0 -0
- lgt_jobs/lgt_data/analytics.py +0 -723
- lgt_jobs/lgt_data/engine.py +0 -223
- lgt_jobs/lgt_data/enums.py +0 -68
- lgt_jobs/lgt_data/helpers.py +0 -2
- lgt_jobs/lgt_data/model.py +0 -964
- lgt_jobs/lgt_data/mongo_repository.py +0 -980
- {leadguru_jobs-0.404.0.dist-info → leadguru_jobs-0.405.0.dist-info}/WHEEL +0 -0
- {leadguru_jobs-0.404.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)
|