aboutsummaryrefslogtreecommitdiffstats
path: root/wee_slack.py
diff options
context:
space:
mode:
authorTrygve Aaberge <trygveaa@gmail.com>2020-02-10 01:17:35 +0100
committerTrygve Aaberge <trygveaa@gmail.com>2020-02-23 18:47:05 +0100
commit6238505ebd5665e53edd94b7a12e4a2e67e9b9e9 (patch)
tree3686786fb8ba7a485cf6c6c6b40a480b8dfe4f80 /wee_slack.py
parent39e9794c6600306c21d140b8a5cb3ca2f1043688 (diff)
downloadwee-slack-6238505ebd5665e53edd94b7a12e4a2e67e9b9e9.tar.gz
Pass team/channel to handle/process methods directly
Diffstat (limited to 'wee_slack.py')
-rw-r--r--wee_slack.py407
1 files changed, 177 insertions, 230 deletions
diff --git a/wee_slack.py b/wee_slack.py
index 0a866a3..39c259b 100644
--- a/wee_slack.py
+++ b/wee_slack.py
@@ -634,28 +634,31 @@ class EventRouter(object):
dbg("SET FROM NADA")
function_name = "unknown"
- # Here we are passing the actual objects. No more lookups.
- team = j.get("wee_slack_metadata_team")
+ request = j.get("wee_slack_request_metadata")
+ if request:
+ team = request.team
+ channel = request.channel
+ metadata = request.metadata
+ else:
+ team = j.get("wee_slack_metadata_team")
+ channel = None
+ metadata = {}
+
if team:
- kwargs["team"] = team
- if "user" in j:
- user_id = j["user"]["id"] if type(j["user"]) == dict else j["user"]
- kwargs["user"] = team.users.get(user_id)
if "channel" in j:
channel_id = j["channel"]["id"] if type(j["channel"]) == dict else j["channel"]
- kwargs["channel"] = team.channels.get(channel_id)
- if "subteam" in j:
- kwargs["subteam"] = team.subteams.get(j["subteam"]["id"])
- if "subteam_id" in j:
- kwargs["subteam"] = team.subteams.get(j["subteam_id"])
+ channel = team.channels.get(channel_id, channel)
+ if "user" in j:
+ user_id = j["user"]["id"] if type(j["user"]) == dict else j["user"]
+ metadata['user'] = team.users.get(user_id)
dbg("running {}".format(function_name))
if function_name.startswith("local_") and function_name in self.local_proc:
- self.local_proc[function_name](j, self, **kwargs)
+ self.local_proc[function_name](j, self, team, channel, metadata)
elif function_name in self.proc:
- self.proc[function_name](j, self, **kwargs)
+ self.proc[function_name](j, self, team, channel, metadata)
elif function_name in self.handlers:
- self.handlers[function_name](j, self, **kwargs)
+ self.handlers[function_name](j, self, team, channel, metadata)
else:
dbg("Callback not implemented for event: {}".format(function_name))
@@ -1151,31 +1154,28 @@ def stop_talking_to_slack():
class SlackRequest(object):
"""
- complete
Encapsulates a Slack api request. Valuable as an object that we can add to the queue and/or retry.
makes a SHA of the requst url and current time so we can re-tag this on the way back through.
"""
- def __init__(self, team, request, post_data=None, retries=3, token=None, **kwargs):
- if post_data is None:
- post_data = {}
- for key, value in kwargs.items():
- setattr(self, key, value)
+ def __init__(self, team, request, post_data=None, channel=None, metadata=None, retries=3, token=None):
if team is None and token is None:
raise ValueError("Both team and token can't be None")
+ self.team = team
+ self.request = request
+ self.post_data = post_data if post_data else {}
+ self.channel = channel
+ self.metadata = metadata if metadata else {}
+ self.retries = retries
+ self.token = token if token else team.token
self.tries = 0
self.start_time = time.time()
- self.domain = 'api.slack.com'
- self.request = request
self.request_normalized = re.sub(r'\W+', '', request)
- self.team = team
- self.token = token if token else team.token
- post_data["token"] = self.token
- self.post_data = post_data
+ self.domain = 'api.slack.com'
+ self.post_data['token'] = self.token
+ self.url = 'https://{}/api/{}?{}'.format(self.domain, self.request, urlencode(encode_to_utf8(self.post_data)))
self.params = {'useragent': 'wee_slack {}'.format(SCRIPT_VERSION)}
- self.url = 'https://{}/api/{}?{}'.format(self.domain, request, urlencode(encode_to_utf8(post_data)))
- self.response_id = sha1_hex("{}{}".format(self.url, self.start_time))
- self.retries = retries
+ self.response_id = sha1_hex('{}{}'.format(self.url, self.start_time))
def __repr__(self):
return ("SlackRequest(team={}, request='{}', post_data={}, retries={}, token='{}...', "
@@ -1467,7 +1467,7 @@ class SlackChannelCommon(object):
else:
return
data = {"channel": self.identifier, "timestamp": timestamp, "name": reaction}
- s = SlackRequest(self.team, method, data, reaction=reaction)
+ s = SlackRequest(self.team, method, data, channel=self, metadata={'reaction': reaction})
self.eventrouter.receive(s)
def edit_nth_previous_message(self, msg_id, old, new, flags):
@@ -1475,7 +1475,7 @@ class SlackChannelCommon(object):
if message is None:
return
if new == "" and old == "":
- s = SlackRequest(self.team, "chat.delete", {"channel": self.identifier, "ts": message['ts']}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, "chat.delete", {"channel": self.identifier, "ts": message['ts']}, channel=self)
self.eventrouter.receive(s)
else:
num_replace = 0 if 'g' in flags else 1
@@ -1485,7 +1485,8 @@ class SlackChannelCommon(object):
f |= re.DOTALL if 's' in flags else 0
new_message = re.sub(old, new, message["text"], num_replace, f)
if new_message != message["text"]:
- s = SlackRequest(self.team, "chat.update", {"channel": self.identifier, "ts": message['ts'], "text": new_message}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, "chat.update",
+ {"channel": self.identifier, "ts": message['ts'], "text": new_message}, channel=self)
self.eventrouter.receive(s)
def my_last_message(self, msg_id):
@@ -1669,7 +1670,8 @@ class SlackChannel(SlackChannelCommon):
def open(self, update_remote=True):
if update_remote:
if "join" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"], {"channel": self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"],
+ {"channel": self.identifier}, channel=self)
self.eventrouter.receive(s)
self.create_buffer()
self.active = True
@@ -1743,12 +1745,14 @@ class SlackChannel(SlackChannelCommon):
self.update_nicklist()
if "info" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"], {"channel": self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"],
+ {"channel": self.identifier}, channel=self)
self.eventrouter.receive(s)
if self.type == "im":
if "join" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"], {"users": self.user, "return_im": True}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"],
+ {"users": self.user, "return_im": True}, channel=self)
self.eventrouter.receive(s)
def clear_messages(self):
@@ -1762,10 +1766,11 @@ class SlackChannel(SlackChannelCommon):
self.channel_buffer = None
self.active = False
if update_remote and not self.eventrouter.shutting_down:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["leave"], {"channel": self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["leave"],
+ {"channel": self.identifier}, channel=self)
self.eventrouter.receive(s)
- def buffer_prnt(self, nick, text, timestamp=str(time.time()), tagset=None, tag_nick=None, history_message=False, extra_tags=None, **kwargs):
+ def buffer_prnt(self, nick, text, timestamp=str(time.time()), tagset=None, tag_nick=None, history_message=False, extra_tags=None):
data = "{}\t{}".format(format_nick(nick, self.last_line_from), text)
self.last_line_from = nick
ts = SlackTS(timestamp)
@@ -1805,9 +1810,7 @@ class SlackChannel(SlackChannelCommon):
message = linkify_text(message, self.team)
dbg(message)
if subtype == 'me_message':
- s = SlackRequest(self.team, "chat.meMessage",
- {"channel": self.identifier, "text": message},
- channel_identifier=self.identifier)
+ s = SlackRequest(self.team, "chat.meMessage", {"channel": self.identifier, "text": message}, channel=self)
self.eventrouter.receive(s)
else:
request = {"type": "message", "channel": self.identifier,
@@ -1840,7 +1843,8 @@ class SlackChannel(SlackChannelCommon):
self.clear_messages()
w.prnt_date_tags(self.channel_buffer, SlackTS().major,
tag(backlog=True, no_log=True), '\tgetting channel history...')
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["history"], {"channel": self.identifier, "count": BACKLOG_SIZE}, channel_identifier=self.identifier, clear=True)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["history"],
+ {"channel": self.identifier, "count": BACKLOG_SIZE}, channel=self, metadata={'clear': True})
if not slow_queue:
self.eventrouter.receive(s)
else:
@@ -1899,7 +1903,8 @@ class SlackChannel(SlackChannelCommon):
if ts > self.last_read:
self.last_read = ts
if update_remote:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["mark"], {"channel": self.identifier, "ts": ts}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["mark"],
+ {"channel": self.identifier, "ts": ts}, channel=self)
self.eventrouter.receive(s)
self.new_messages = False
@@ -2004,7 +2009,7 @@ class SlackDMChannel(SlackChannel):
def set_related_server(self, team):
super(SlackDMChannel, self).set_related_server(team)
if self.user not in self.team.users:
- s = SlackRequest(self.team, 'users.info', {'user': self.slack_name}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, 'users.info', {'user': self.slack_name}, channel=self)
self.eventrouter.receive(s)
def set_name(self, slack_name):
@@ -2047,11 +2052,13 @@ class SlackDMChannel(SlackChannel):
self.create_buffer()
self.get_history()
if "info" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"], {"name": self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"],
+ {"name": self.identifier}, channel=self)
self.eventrouter.receive(s)
if update_remote:
if "join" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"], {"users": self.user, "return_im": True}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["join"],
+ {"users": self.user, "return_im": True}, channel=self)
self.eventrouter.receive(s)
def rename(self):
@@ -2097,7 +2104,7 @@ class SlackPrivateChannel(SlackGroupChannel):
super(SlackPrivateChannel, self).set_related_server(team)
# Fetch members here (after the team is known) since they aren't
# included in rtm.start
- s = SlackRequest(team, 'conversations.members', {'channel': self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(team, 'conversations.members', {'channel': self.identifier}, channel=self)
self.eventrouter.receive(s)
@@ -2121,10 +2128,12 @@ class SlackMPDMChannel(SlackChannel):
self.active = True
self.get_history()
if "info" in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"], {"channel": self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]["info"],
+ {"channel": self.identifier}, channel=self)
self.eventrouter.receive(s)
if update_remote and 'join' in SLACK_API_TRANSLATOR[self.type]:
- s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]['join'], {'users': ','.join(self.members)}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, SLACK_API_TRANSLATOR[self.type]['join'],
+ {'users': ','.join(self.members)}, channel=self)
self.eventrouter.receive(s)
def set_name(self, slack_name):
@@ -2157,13 +2166,13 @@ class SlackSharedChannel(SlackChannel):
super(SlackSharedChannel, self).set_related_server(team)
# Fetch members here (after the team is known) since they aren't
# included in rtm.start
- s = SlackRequest(team, 'conversations.members', {'channel': self.identifier}, channel_identifier=self.identifier)
+ s = SlackRequest(team, 'conversations.members', {'channel': self.identifier}, channel=self)
self.eventrouter.receive(s)
def get_history(self, slow_queue=False):
# Get info for external users in the channel
for user in self.members - set(self.team.users.keys()):
- s = SlackRequest(self.team, 'users.info', {'user': user}, channel_identifier=self.identifier)
+ s = SlackRequest(self.team, 'users.info', {'user': user}, channel=self)
self.eventrouter.receive(s)
super(SlackSharedChannel, self).get_history(slow_queue)
@@ -2218,7 +2227,7 @@ class SlackThreadChannel(SlackChannelCommon):
w.buffer_set(self.channel_buffer, "unread", "")
w.buffer_set(self.channel_buffer, "hotlist", "-1")
- def buffer_prnt(self, nick, text, timestamp, tag_nick=None, **kwargs):
+ def buffer_prnt(self, nick, text, timestamp, tag_nick=None):
data = "{}\t{}".format(format_nick(nick, self.last_line_from), text)
self.last_line_from = nick
ts = SlackTS(timestamp)
@@ -2242,8 +2251,7 @@ class SlackThreadChannel(SlackChannelCommon):
self.buffer_prnt(message.sender, text, message.ts, tag_nick=message.sender_plain)
if len(self.parent_message.submessages) < self.parent_message.number_of_replies():
s = SlackRequest(self.team, "conversations.replies",
- {"channel": self.identifier, "ts": self.parent_message.ts},
- channel_identifier=self.identifier)
+ {"channel": self.identifier, "ts": self.parent_message.ts}, channel=self)
self.eventrouter.receive(s)
def main_message_keys_reversed(self):
@@ -2590,7 +2598,7 @@ class SlackTS(object):
###### New handlers
-def handle_rtmstart(login_data, eventrouter):
+def handle_rtmstart(login_data, eventrouter, team, channel, metadata):
"""
This handles the main entry call to slack, rtm.start
"""
@@ -2671,7 +2679,7 @@ def handle_rtmstart(login_data, eventrouter):
t.connect()
-def handle_rtmconnect(login_data, eventrouter):
+def handle_rtmconnect(login_data, eventrouter, team, channel, metadata):
metadata = login_data["wee_slack_request_metadata"]
team = metadata.team
team.connecting_rtm = False
@@ -2685,47 +2693,37 @@ def handle_rtmconnect(login_data, eventrouter):
team.connect()
-def handle_emojilist(emoji_json, eventrouter, **kwargs):
+def handle_emojilist(emoji_json, eventrouter, team, channel, metadata):
if emoji_json["ok"]:
- request_metadata = emoji_json["wee_slack_request_metadata"]
- request_metadata.team.emoji_completions.extend(emoji_json["emoji"].keys())
+ team.emoji_completions.extend(emoji_json["emoji"].keys())
-def handle_channelsinfo(channel_json, eventrouter, **kwargs):
- request_metadata = channel_json["wee_slack_request_metadata"]
- channel = request_metadata.team.channels[request_metadata.channel_identifier]
+def handle_channelsinfo(channel_json, eventrouter, team, channel, metadata):
channel.set_unread_count_display(channel_json['channel'].get('unread_count_display', 0))
channel.set_members(channel_json['channel']['members'])
-def handle_groupsinfo(group_json, eventrouter, **kwargs):
- request_metadata = group_json["wee_slack_request_metadata"]
- group = request_metadata.team.channels[request_metadata.channel_identifier]
- group.set_unread_count_display(group_json['group'].get('unread_count_display', 0))
+def handle_groupsinfo(group_json, eventrouter, team, channel, metadatas):
+ channel.set_unread_count_display(group_json['group'].get('unread_count_display', 0))
-def handle_conversationsopen(conversation_json, eventrouter, object_name='channel', **kwargs):
- request_metadata = conversation_json["wee_slack_request_metadata"]
- # Set unread count if the channel isn't new (channel_identifier exists)
- if hasattr(request_metadata, 'channel_identifier'):
- conversation = request_metadata.team.channels[request_metadata.channel_identifier]
+def handle_conversationsopen(conversation_json, eventrouter, team, channel, metadata, object_name='channel'):
+ # Set unread count if the channel isn't new
+ if channel:
unread_count_display = conversation_json[object_name].get('unread_count_display', 0)
- conversation.set_unread_count_display(unread_count_display)
+ channel.set_unread_count_display(unread_count_display)
-def handle_mpimopen(mpim_json, eventrouter, object_name='group', **kwargs):
- handle_conversationsopen(mpim_json, eventrouter, object_name, **kwargs)
+def handle_mpimopen(mpim_json, eventrouter, team, channel, metadata, object_name='group'):
+ handle_conversationsopen(mpim_json, eventrouter, team, channel, metadata, object_name)
-def handle_history(message_json, eventrouter, **kwargs):
- request_metadata = message_json["wee_slack_request_metadata"]
- kwargs['team'] = request_metadata.team
- kwargs['channel'] = kwargs['team'].channels[request_metadata.channel_identifier]
- if getattr(request_metadata, 'clear', False):
- kwargs['channel'].clear_messages()
- kwargs['channel'].got_history = True
+def handle_history(message_json, eventrouter, team, channel, metadata):
+ if metadata['clear']:
+ channel.clear_messages()
+ channel.got_history = True
for message in reversed(message_json["messages"]):
- process_message(message, eventrouter, history_message=True, **kwargs)
+ process_message(message, eventrouter, team, channel, metadata, history_message=True)
handle_channelshistory = handle_history
@@ -2735,18 +2733,12 @@ handle_imhistory = handle_history
handle_mpimhistory = handle_history
-def handle_conversationsreplies(message_json, eventrouter, **kwargs):
- request_metadata = message_json['wee_slack_request_metadata']
- kwargs['team'] = request_metadata.team
- kwargs['channel'] = kwargs['team'].channels[request_metadata.channel_identifier]
+def handle_conversationsreplies(message_json, eventrouter, team, channel, metadata):
for message in message_json['messages']:
- process_message(message, eventrouter, **kwargs)
+ process_message(message, eventrouter, team, channel, metadata)
-def handle_conversationsmembers(members_json, eventrouter, **kwargs):
- request_metadata = members_json['wee_slack_request_metadata']
- team = request_metadata.team
- channel = team.channels[request_metadata.channel_identifier]
+def handle_conversationsmembers(members_json, eventrouter, team, channel, metadata):
if members_json['ok']:
channel.set_members(members_json['members'])
else:
@@ -2754,13 +2746,11 @@ def handle_conversationsmembers(members_json, eventrouter, **kwargs):
.format(w.prefix('error'), channel.name, members_json['error']))
-def handle_usersinfo(user_json, eventrouter, **kwargs):
- request_metadata = user_json['wee_slack_request_metadata']
- team = request_metadata.team
- channel = team.channels[request_metadata.channel_identifier]
+def handle_usersinfo(user_json, eventrouter, team, channel, metadata):
user_info = user_json['user']
- user = SlackUser(team.identifier, **user_info)
- team.users[user_info['id']] = user
+ if not metadata.get('user'):
+ user = SlackUser(team.identifier, **user_info)
+ team.users[user_info['id']] = user
if channel.type == 'shared':
channel.update_nicklist(user_info['id'])
@@ -2769,35 +2759,28 @@ def handle_usersinfo(user_json, eventrouter, **kwargs):
channel.set_topic(create_user_status_string(user.profile))
-def handle_usergroupsuserslist(users_json, eventrouter, **kwargs):
- request_metadata = users_json['wee_slack_request_metadata']
- team = request_metadata.team
- header = 'Users in {}'.format(request_metadata.usergroup_handle)
+def handle_usergroupsuserslist(users_json, eventrouter, team, channel, metadata):
+ header = 'Users in {}'.format(metadata['usergroup_handle'])
users = [team.users[key] for key in users_json['users']]
return print_users_info(team, header, users)
-def handle_usersprofileset(json, eventrouter, **kwargs):
+def handle_usersprofileset(json, eventrouter, team, channel, metadata):
if not json['ok']:
w.prnt('', 'ERROR: Failed to set profile: {}'.format(json['error']))
-def handle_conversationsinvite(json, eventrouter, **kwargs):
- request_metadata = json['wee_slack_request_metadata']
- team = request_metadata.team
- nicks = ', '.join(request_metadata.nicks)
+def handle_conversationsinvite(json, eventrouter, team, channel, metadata):
+ nicks = ', '.join(metadata['nicks'])
if json['ok']:
- channel = team.channels.get(json['channel']['id'], request_metadata.channel)
w.prnt(team.channel_buffer, 'Invited {} to {}'.format(nicks, channel.name))
else:
w.prnt(team.channel_buffer, 'ERROR: Couldn\'t invite {} to {}. Error: {}'
- .format(nicks, request_metadata.channel.name, json['error']))
+ .format(nicks, channel.name, json['error']))
-def handle_chatcommand(json, eventrouter, **kwargs):
- request_metadata = json['wee_slack_request_metadata']
- team = request_metadata.team
- command = '{} {}'.format(request_metadata.command, request_metadata.command_args).rstrip()
+def handle_chatcommand(json, eventrouter, team, channel, metadata):
+ command = '{} {}'.format(metadata['command'], metadata['command_args']).rstrip()
response = unfurl_refs(json['response']) if 'response' in json else ''
if json['ok']:
response_text = 'Response: {}'.format(response) if response else 'No response'
@@ -2808,45 +2791,37 @@ def handle_chatcommand(json, eventrouter, **kwargs):
.format(command, json['error'], response_text))
-def handle_reactionsadd(json, eventrouter, **kwargs):
+def handle_reactionsadd(json, eventrouter, team, channel, metadata):
if not json['ok']:
- request_metadata = json['wee_slack_request_metadata']
- print_error("Couldn't add reaction {}: {}".format(request_metadata.reaction, json['error']))
+ print_error("Couldn't add reaction {}: {}".format(metadata['reaction'], json['error']))
-def handle_reactionsremove(json, eventrouter, **kwargs):
+def handle_reactionsremove(json, eventrouter, team, channel, metadata):
if not json['ok']:
- request_metadata = json['wee_slack_request_metadata']
- print_error("Couldn't remove reaction {}: {}".format(request_metadata.reaction, json['error']))
+ print_error("Couldn't remove reaction {}: {}".format(metadata['reaction'], json['error']))
###### New/converted process_ and subprocess_ methods
-def process_hello(message_json, eventrouter, **kwargs):
- kwargs['team'].subscribe_users_presence()
+def process_hello(message_json, eventrouter, team, channel, metadata):
+ team.subscribe_users_presence()
-def process_reconnect_url(message_json, eventrouter, **kwargs):
- kwargs['team'].set_reconnect_url(message_json['url'])
+def process_reconnect_url(message_json, eventrouter, team, channel, metadata):
+ team.set_reconnect_url(message_json['url'])
-def process_presence_change(message_json, eventrouter, **kwargs):
- if "user" in kwargs:
- # TODO: remove once it's stable
- user = kwargs["user"]
- team = kwargs["team"]
+def process_presence_change(message_json, eventrouter, team, channel, metadata):
+ users = [team.users[user_id] for user_id in message_json.get("users", [])]
+ if "user" in metadata:
+ users.append(metadata["user"])
+ for user in users:
team.update_member_presence(user, message_json["presence"])
- if "users" in message_json:
- team = kwargs["team"]
- for user_id in message_json["users"]:
- user = team.users[user_id]
- team.update_member_presence(user, message_json["presence"])
process_manual_presence_change = process_presence_change
-def process_pref_change(message_json, eventrouter, **kwargs):
- team = kwargs["team"]
+def process_pref_change(message_json, eventrouter, team, channel, metadata):
if message_json['name'] == 'muted_channels':
team.set_muted_channels(message_json['value'])
elif message_json['name'] == 'highlight_words':
@@ -2855,44 +2830,35 @@ def process_pref_change(message_json, eventrouter, **kwargs):
dbg("Preference change not implemented: {}\n".format(message_json['name']))
-def process_user_change(message_json, eventrouter, **kwargs):
+def process_user_change(message_json, eventrouter, team, channel, metadata):
"""
Currently only used to update status, but lots here we could do.
"""
- user = message_json['user']
- profile = user.get('profile')
- team = kwargs['team']
- team_user = team.users.get(user['id'])
- if team_user:
- team_user.update_status(profile.get('status_emoji'), profile.get('status_text'))
- dmchannel = team.find_channel_by_members({user['id']}, channel_type='im')
- if dmchannel:
- dmchannel.set_topic(create_user_status_string(profile))
-
-
-def process_user_typing(message_json, eventrouter, **kwargs):
- channel = kwargs["channel"]
- team = kwargs["team"]
+ user = metadata['user']
+ profile = message_json['user']['profile']
+ if user:
+ user.update_status(profile.get('status_emoji'), profile.get('status_text'))
+ dmchannel = team.find_channel_by_members({user.identifier}, channel_type='im')
+ if dmchannel:
+ dmchannel.set_topic(create_user_status_string(profile))
+
+
+def process_user_typing(message_json, eventrouter, team, channel, metadata):
if channel:
- channel.set_typing(team.users.get(message_json["user"]).name)
+ channel.set_typing(metadata["user"].name)
w.bar_item_update("slack_typing_notice")
-def process_team_join(message_json, eventrouter, **kwargs):
+def process_team_join(message_json, eventrouter, team, channel, metadata):
user = message_json['user']
- team = kwargs["team"]
team.users[user["id"]] = SlackUser(team.identifier, **user)
-def process_pong(message_json, eventrouter, **kwargs):
- team = kwargs["team"]
+def process_pong(message_json, eventrouter, team, channel, metadata):
team.last_pong_time = time.time()
-def process_message(message_json, eventrouter, store=True, history_message=False, **kwargs):
- channel = kwargs["channel"]
- team = kwargs["team"]
-
+def process_message(message_json, eventrouter, team, channel, metadata, history_message=False):
if SlackTS(message_json["ts"]) in channel.messages:
return
@@ -2903,11 +2869,10 @@ def process_message(message_json, eventrouter, store=True, history_message=False
subtype_functions = get_functions_with_prefix("subprocess_")
if subtype in subtype_functions:
- subtype_functions[subtype](message_json, eventrouter, channel, team, history_message)
+ subtype_functions[subtype](message_json, eventrouter, team, channel, history_message)
else:
message = SlackMessage(message_json, team, channel)
- if store:
- channel.store_message(message, team)
+ channel.store_message(message, team)
text = channel.render(message)
dbg("Rendered message: %s" % text)
@@ -2918,16 +2883,15 @@ def process_message(message_json, eventrouter, store=True, history_message=False
else:
prefix = message.sender
- channel.buffer_prnt(prefix, text, message.ts, tag_nick=message.sender_plain, history_message=history_message, **kwargs)
+ channel.buffer_prnt(prefix, text, message.ts, tag_nick=message.sender_plain, history_message=history_message)
channel.unread_count_display += 1
dbg("NORMAL REPLY {}".format(message_json))
if not history_message:
- download_files(message_json, **kwargs)
+ download_files(message_json, team)
-def download_files(message_json, **kwargs):
- team = kwargs["team"]
+def download_files(message_json, team):
download_location = config.files_download_location
if not download_location:
return
@@ -2965,7 +2929,7 @@ def download_files(message_json, **kwargs):
break
-def subprocess_thread_message(message_json, eventrouter, channel, team, history_message):
+def subprocess_thread_message(message_json, eventrouter, team, channel, history_message):
parent_ts = message_json.get('thread_ts')
if parent_ts:
parent_message = channel.messages.get(SlackTS(parent_ts))
@@ -2997,7 +2961,7 @@ def subprocess_thread_message(message_json, eventrouter, channel, team, history_
subprocess_thread_broadcast = subprocess_thread_message
-def subprocess_channel_join(message_json, eventrouter, channel, team, history_message):
+def subprocess_channel_join(message_json, eventrouter, team, channel, history_message):
prefix_join = w.prefix("join").strip()
message = SlackMessage(message_json, team, channel, override_sender=prefix_join)
channel.buffer_prnt(prefix_join, channel.render(message), message_json["ts"], tagset='join', tag_nick=message.get_sender()[1], history_message=history_message)
@@ -3005,7 +2969,7 @@ def subprocess_channel_join(message_json, eventrouter, channel, team, history_me
channel.store_message(message, team)
-def subprocess_channel_leave(message_json, eventrouter, channel, team, history_message):
+def subprocess_channel_leave(message_json, eventrouter, team, channel, history_message):
prefix_leave = w.prefix("quit").strip()
message = SlackMessage(message_json, team, channel, override_sender=prefix_leave)
channel.buffer_prnt(prefix_leave, channel.render(message), message_json["ts"], tagset='leave', tag_nick=message.get_sender()[1], history_message=history_message)
@@ -3013,7 +2977,7 @@ def subprocess_channel_leave(message_json, eventrouter, channel, team, history_m
channel.store_message(message, team)
-def subprocess_channel_topic(message_json, eventrouter, channel, team, history_message):
+def subprocess_channel_topic(message_json, eventrouter, team, channel, history_message):
prefix_topic = w.prefix("network").strip()
message = SlackMessage(message_json, team, channel, override_sender=prefix_topic)
channel.buffer_prnt(prefix_topic, channel.render(message), message_json["ts"], tagset="topic", tag_nick=message.get_sender()[1], history_message=history_message)
@@ -3026,7 +2990,7 @@ subprocess_group_leave = subprocess_channel_leave
subprocess_group_topic = subprocess_channel_topic
-def subprocess_message_replied(message_json, eventrouter, channel, team, history_message):
+def subprocess_message_replied(message_json, eventrouter, team, channel, history_message):
parent_ts = message_json["message"].get("thread_ts")
parent_message = channel.messages.get(SlackTS(parent_ts))
# Thread exists but is not open yet
@@ -3039,35 +3003,31 @@ def subprocess_message_replied(message_json, eventrouter, channel, team, history
elif any(team.myidentifier == r["user"] for r in message_json["message"]["replies"]):
parent_message.notify_thread(action="participant", sender_id=last_message["user"])
-def subprocess_message_changed(message_json, eventrouter, channel, team, history_message):
+
+def subprocess_message_changed(message_json, eventrouter, team, channel, history_message):
new_message = message_json.get("message")
channel.change_message(new_message["ts"], message_json=new_message)
-def subprocess_message_deleted(message_json, eventrouter, channel, team, history_message):
+
+def subprocess_message_deleted(message_json, eventrouter, team, channel, history_message):
message = "{}{}{}".format(
w.color(config.color_deleted), '(deleted)', w.color("reset"))
channel.change_message(message_json["deleted_ts"], text=message)
-def process_reply(message_json, eventrouter, **kwargs):
- team = kwargs["team"]
+def process_reply(message_json, eventrouter, team, channel, metadata):
reply_to = int(message_json["reply_to"])
original_message_json = team.ws_replies.pop(reply_to, None)
if original_message_json:
original_message_json.update(message_json)
channel = team.channels[original_message_json.get('channel')]
- process_message(original_message_json, eventrouter,
- channel=channel, team=team)
+ process_message(original_message_json, eventrouter, team=team, channel=channel, metadata={})
dbg("REPLY {}".format(message_json))
else:
dbg("Unexpected reply {}".format(message_json))
-def process_channel_marked(message_json, eventrouter, **kwargs):
- """
- complete
- """
- channel = kwargs["channel"]
+def process_channel_marked(message_json, eventrouter, team, channel, metadata):
ts = message_json.get("ts")
if ts:
channel.mark_read(ts=ts, force=True, update_remote=False)
@@ -3080,61 +3040,54 @@ process_im_marked = process_channel_marked
process_mpim_marked = process_channel_marked
-def process_channel_joined(message_json, eventrouter, **kwargs):
- item = message_json["channel"]
- kwargs['team'].channels[item["id"]].update_from_message_json(item)
- kwargs['team'].channels[item["id"]].open()
+def process_channel_joined(message_json, eventrouter, team, channel, metadata):
+ channel.update_from_message_json(message_json["channel"])
+ channel.open()
-def process_channel_created(message_json, eventrouter, **kwargs):
+def process_channel_created(message_json, eventrouter, team, channel, metadata):
item = message_json["channel"]
item['is_member'] = False
- c = SlackChannel(eventrouter, team=kwargs["team"], **item)
- kwargs['team'].channels[item["id"]] = c
- kwargs['team'].buffer_prnt('Channel created: {}'.format(c.slack_name))
+ channel = SlackChannel(eventrouter, team=team, **item)
+ team.channels[item["id"]] = channel
+ team.buffer_prnt('Channel created: {}'.format(channel.slack_name))
-def process_channel_rename(message_json, eventrouter, **kwargs):
- item = message_json["channel"]
- channel = kwargs['team'].channels[item["id"]]
+def process_channel_rename(message_json, eventrouter, team, channel, metadata):
channel.slack_name = message_json['channel']['name']
-def process_im_created(message_json, eventrouter, **kwargs):
- team = kwargs['team']
+def process_im_created(message_json, eventrouter, team, channel, metadata):
item = message_json["channel"]
- c = SlackDMChannel(eventrouter, team=team, users=team.users, **item)
- team.channels[item["id"]] = c
- kwargs['team'].buffer_prnt('IM channel created: {}'.format(c.name))
+ channel = SlackDMChannel(eventrouter, team=team, users=team.users, **item)
+ team.channels[item["id"]] = channel
+ team.buffer_prnt('IM channel created: {}'.format(channel.name))
-def process_im_open(message_json, eventrouter, **kwargs):
- channel = kwargs['channel']
- item = message_json
- kwargs['team'].channels[item["channel"]].check_should_open(True)
+def process_im_open(message_json, eventrouter, team, channel, metadata):
+ channel.check_should_open(True)
w.buffer_set(channel.channel_buffer, "hotlist", "2")
-def process_im_close(message_json, eventrouter, **kwargs):
- channel = kwargs['team'].channels[message_json["channel"]]
+def process_im_close(message_json, eventrouter, team, channel, metadata):
if channel.channel_buffer:
- w.prnt(kwargs['team'].channel_buffer,
+ w.prnt(team.channel_buffer,
'IM {} closed by another client or the server'.format(channel.name))
eventrouter.weechat_controller.unregister_buffer(channel.channel_buffer, False, True)
-def process_group_joined(message_json, eventrouter, **kwargs):
+def process_group_joined(message_json, eventrouter, team, channel, metadata):
item = message_json["channel"]
if item["name"].startswith("mpdm-"):
- c = SlackMPDMChannel(eventrouter, kwargs["team"].users, kwargs["team"].myidentifier, team=kwargs["team"], **item)
+ channel = SlackMPDMChannel(eventrouter, team.users, team.myidentifier, team=team, **item)
else:
- c = SlackGroupChannel(eventrouter, team=kwargs["team"], **item)
- kwargs['team'].channels[item["id"]] = c
- kwargs['team'].channels[item["id"]].open()
+ channel = SlackGroupChannel(eventrouter, team=team, **item)
+ team.channels[item["id"]] = channel
+ channel.open()
-def process_reaction_added(message_json, eventrouter, **kwargs):
- channel = kwargs['team'].channels.get(message_json["item"].get("channel"))
+def process_reaction_added(message_json, eventrouter, team, channel, metadata):
+ channel = team.channels.get(message_json["item"].get("channel"))
if message_json["item"].get("type") == "message":
ts = SlackTS(message_json['item']["ts"])
@@ -3146,8 +3099,8 @@ def process_reaction_added(message_json, eventrouter, **kwargs):
dbg("reaction to item type not supported: " + str(message_json))
-def process_reaction_removed(message_json, eventrouter, **kwargs):
- channel = kwargs['team'].channels.get(message_json["item"].get("channel"))
+def process_reaction_removed(message_json, eventrouter, team, channel, metadata):
+ channel = team.channels.get(message_json["item"].get("channel"))
if message_json["item"].get("type") == "message":
ts = SlackTS(message_json['item']["ts"])
@@ -3159,16 +3112,14 @@ def process_reaction_removed(message_json, eventrouter, **kwargs):
dbg("Reaction to item type not supported: " + str(message_json))
-def process_subteam_created(subteam_json, eventrouter, **kwargs):
- team = kwargs['team']
+def process_subteam_created(subteam_json, eventrouter, team, channel, metadata):
subteam_json_info = subteam_json['subteam']
is_member = team.myidentifier in subteam_json_info.get('users', [])
subteam = SlackSubteam(team.identifier, is_member=is_member, **subteam_json_info)
team.subteams[subteam_json_info['id']] = subteam
-def process_subteam_updated(subteam_json, eventrouter, **kwargs):
- team = kwargs['team']
+def process_subteam_updated(subteam_json, eventrouter, team, channel, metadata):
current_subteam_info = team.subteams[subteam_json['subteam']['id']]
is_member = team.myidentifier in subteam_json['subteam'].get('users', [])
new_subteam_info = SlackSubteam(team.identifier, is_member=is_member, **subteam_json['subteam'])
@@ -3184,8 +3135,7 @@ def process_subteam_updated(subteam_json, eventrouter, **kwargs):
team.buffer_prnt(message, message=True)
-def process_emoji_changed(message_json, eventrouter, **kwargs):
- team = kwargs['team']
+def process_emoji_changed(message_json, eventrouter, team, channel, metadata):
team.load_emoji_completions()
@@ -3635,9 +3585,8 @@ def invite_command_cb(data, current_buffer, args):
return w.WEECHAT_RC_OK_EAT
users.add(user)
- s = SlackRequest(team, "conversations.invite",
- {"channel": channel.identifier, "users": ",".join(users)},
- channel=channel, nicks=nicks)
+ s = SlackRequest(team, "conversations.invite", {"channel": channel.identifier, "users": ",".join(users)},
+ channel=channel, metadata={"nicks": nicks})
EVENTROUTER.receive(s)
return w.WEECHAT_RC_OK_EAT
@@ -3706,8 +3655,8 @@ def topic_command_cb(data, current_buffer, command):
w.prnt(channel.channel_buffer,
'Topic for {} is "{}"'.format(channel.name, channel.render_topic()))
else:
- s = SlackRequest(team, "conversations.setTopic", {"channel": channel.identifier,
- "topic": linkify_text(topic, team)})
+ s = SlackRequest(team, "conversations.setTopic",
+ {"channel": channel.identifier, "topic": linkify_text(topic, team)}, channel=channel)
EVENTROUTER.receive(s)
return w.WEECHAT_RC_OK_EAT
@@ -3917,8 +3866,8 @@ def command_usergroups(data, current_buffer, args):
usergroup_key = usergroups.get(args)
if usergroup_key:
- s = SlackRequest(team, "usergroups.users.list",
- {"usergroup": usergroup_key}, usergroup_handle=args)
+ s = SlackRequest(team, "usergroups.users.list", {"usergroup": usergroup_key},
+ metadata={'usergroup_handle': args})
EVENTROUTER.receive(s)
elif args:
w.prnt('', 'ERROR: Unknown usergroup handle: {}'.format(args))
@@ -4178,8 +4127,7 @@ def command_slash(data, current_buffer, args):
s = SlackRequest(team, "chat.command",
{"command": command, "text": text_linkified, 'channel': channel.identifier},
- channel_identifier=channel.identifier,
- command=command, command_args=text)
+ channel=channel, metadata={'command': command, 'command_args': text})
EVENTROUTER.receive(s)
return w.WEECHAT_RC_OK_EAT
@@ -4197,8 +4145,7 @@ def command_mute(data, current_buffer, args):
muted_str = "Muted" if channel.identifier in team.muted_channels else "Unmuted"
team.buffer_prnt("{} channel {}".format(muted_str, channel.name))
s = SlackRequest(team, "users.prefs.set",
- {"name": "muted_channels", "value": ",".join(team.muted_channels)},
- channel_identifier=channel.identifier)
+ {"name": "muted_channels", "value": ",".join(team.muted_channels)}, channel=channel)
EVENTROUTER.receive(s)
return w.WEECHAT_RC_OK_EAT
@@ -4280,7 +4227,7 @@ def command_upload(data, current_buffer, args):
if isinstance(channel, SlackThreadChannel):
post_data['thread_ts'] = channel.parent_message.ts
- url = SlackRequest(channel.team, 'files.upload', post_data).request_string()
+ url = SlackRequest(channel.team, 'files.upload', post_data, channel=channel).request_string()
options = [
'-s',
'-Ffile=@{}'.format(file_path),