aboutsummaryrefslogtreecommitdiffstats
path: root/wee_slack.py
diff options
context:
space:
mode:
Diffstat (limited to 'wee_slack.py')
-rw-r--r--wee_slack.py182
1 files changed, 94 insertions, 88 deletions
diff --git a/wee_slack.py b/wee_slack.py
index 13054ad..cc4086e 100644
--- a/wee_slack.py
+++ b/wee_slack.py
@@ -463,7 +463,7 @@ class Channel(object):
def send_message(self, message):
message = self.linkify_text(message)
dbg(message)
- request = {"type": "message", "channel": self.identifier, "text": message, "myserver": self.server.domain}
+ request = {"type": "message", "channel": self.identifier, "text": message, "_server": self.server.domain}
self.server.send_to_websocket(request)
def linkify_text(self, message):
@@ -637,7 +637,7 @@ class Channel(object):
if text is not None:
self.messages[message_index].change_text(text)
- text = render_message(self.messages[message_index].message_json)
+ text = render_message(self.messages[message_index].message_json, True)
#if there is only one message with this timestamp, modify it directly.
#we do this because time resolution in weechat is less than slack
@@ -1159,7 +1159,7 @@ def slack_websocket_cb(server, fd):
data = servers.find(server).ws.recv()
message_json = json.loads(data)
# this magic attaches json that helps find the right dest
- message_json['myserver'] = server
+ message_json['_server'] = server
except:
return w.WEECHAT_RC_OK
# dispatch here
@@ -1183,7 +1183,7 @@ def slack_websocket_cb(server, fd):
def process_reply(message_json):
global unfurl_ignore_alt_text
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
identifier = message_json["reply_to"]
item = server.message_buffer.pop(identifier)
if "type" in item:
@@ -1200,7 +1200,7 @@ def process_pong(message_json):
def process_pref_change(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
if message_json['name'] == u'muted_channels':
muted = message_json['value'].split(',')
for c in server.channels:
@@ -1213,7 +1213,7 @@ def process_pref_change(message_json):
def process_team_join(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
item = message_json["user"]
server.add_user(User(server, item["name"], item["id"], item["presence"]))
server.buffer_prnt(server.buffer, "New user joined: {}".format(item["name"]))
@@ -1222,7 +1222,7 @@ def process_manual_presence_change(message_json):
process_presence_change(message_json)
def process_presence_change(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
identifier = message_json.get("user", server.nick)
if message_json["presence"] == 'active':
server.users.find(identifier).set_active()
@@ -1245,7 +1245,7 @@ def process_group_marked(message_json):
def process_channel_created(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
item = message_json["channel"]
if server.channels.find(message_json["channel"]["name"]):
server.channels.find(message_json["channel"]["name"]).open(False)
@@ -1256,24 +1256,24 @@ def process_channel_created(message_json):
def process_channel_left(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
server.channels.find(message_json["channel"]).close(False)
def process_channel_join(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = server.channels.find(message_json["channel"])
channel.user_join(message_json["user"])
def process_channel_topic(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = server.channels.find(message_json["channel"])
channel.set_topic(message_json["topic"])
def process_channel_joined(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
if server.channels.find(message_json["channel"]["name"]):
server.channels.find(message_json["channel"]["name"]).open(False)
else:
@@ -1282,24 +1282,24 @@ def process_channel_joined(message_json):
def process_channel_leave(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = server.channels.find(message_json["channel"])
channel.user_leave(message_json["user"])
def process_channel_archive(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = server.channels.find(message_json["channel"])
channel.detach_buffer()
def process_group_left(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
server.channels.find(message_json["channel"]).close(False)
def process_group_joined(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
if server.channels.find(message_json["channel"]["name"]):
server.channels.find(message_json["channel"]["name"]).open(False)
else:
@@ -1313,12 +1313,12 @@ def process_group_archive(message_json):
def process_im_close(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
server.channels.find(message_json["channel"]).close(False)
def process_im_open(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
server.channels.find(message_json["channel"]).open(False)
@@ -1330,7 +1330,7 @@ def process_im_marked(message_json):
def process_im_created(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
item = message_json["channel"]
channel_name = server.users.find(item["user"]).name
if server.channels.find(channel_name):
@@ -1342,7 +1342,7 @@ def process_im_created(message_json):
def process_user_typing(message_json):
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = server.channels.find(message_json["channel"])
if channel:
channel.set_typing(server.users.find(message_json["user"]).name)
@@ -1406,8 +1406,13 @@ def modify_buffer_line(buffer, new_line, time):
line_pointer = w.hdata_move(struct_hdata_line, line_pointer, -1)
return w.WEECHAT_RC_OK
-def render_message(message_json):
- server = servers.find(message_json["myserver"])
+def render_message(message_json, force=False):
+ global unfurl_ignore_alt_text
+ #If we already have a rendered version in the object, just return that.
+ if not force and message_json.get("_rendered_text", ""):
+ return message_json["_rendered_text"]
+ else:
+ server = servers.find(message_json["_server"])
# move message properties down to root of json object
message_json = unwrap_message(message_json)
@@ -1418,14 +1423,15 @@ def render_message(message_json):
if message_json['text'] is not None:
text = message_json["text"]
else:
- text = ""
+ text = u""
else:
- text = ""
+ text = u""
- text = unfurl_refs(text, ignore_alt_text=unfurl_ignore_alt_text)
+ text = unfurl_refs(text, ignore_alt_text=False)
+ #text = unfurl_refs(text, ignore_alt_text=unfurl_ignore_alt_text)
+
+ text += unwrap_attachments(message_json)
- if "attachments" in message_json:
- text += u" --- {}".format(unwrap_attachments(message_json))
text = text.lstrip()
text = text.replace("\t", " ")
@@ -1434,21 +1440,39 @@ def render_message(message_json):
if "reactions" in message_json:
text += create_reaction_string(message_json["reactions"])
- #w.prnt("", "rendered message")
+ message_json["_rendered_text"] = text
return text
+def unwrap_message(message_json):
+ if "message" in message_json:
+ w.prnt("", "message nested..." + str(message_json))
+ if "attachments" in message_json["message"]:
+ w.prnt("", "attachment found in strange place...")
+ if "text" in message_json["message"]:
+ if "text" in message_json:
+ message_json["text"] += message_json["message"]["text"]
+ dbg("added text!")
+ else:
+ message_json["text"] = message_json["message"]["text"]
+ if "fallback" in message_json["message"]:
+ if "fallback" in message_json:
+ message_json["fallback"] += message_json["message"]["fallback"]
+ else:
+ message_json["fallback"] = message_json["message"]["fallback"]
+ return message_json
+
+
def process_message(message_json, cache=True):
- global unfurl_ignore_alt_text
- try:
+# try:
# send these messages elsewhere
known_subtypes = ['channel_join', 'channel_leave', 'channel_topic']
if "subtype" in message_json and message_json["subtype"] in known_subtypes:
proc[message_json["subtype"]](message_json)
- server = servers.find(message_json["myserver"])
+ server = servers.find(message_json["_server"])
channel = channels.find(message_json["channel"])
#do not process messages in unexpected channels
@@ -1458,70 +1482,52 @@ def process_message(message_json, cache=True):
return
- if message_json.get("rendered_text", ""):
- text = message_json["rendered_text"]
- #w.prnt("", "used rendered version..")
- else:
- text = render_message(message_json)
- message_json['rendered_text'] = text
- #w.prnt("", "no version..")
-
-
time = message_json['ts']
- name = get_user(message_json, server)
- name = name.encode('utf-8')
-
-
-
- if message_json.get("subtype", "") == "message_changed" and "edited" in message_json["message"]:
- channel.change_message(message_json["message"]["ts"], text + " (edited)")
- cache=False
- elif message_json.get("subtype", "") == "message_deleted":
- channel.change_message(message_json["deleted_ts"], text + "(deleted)")
- cache = False
- elif message_json.get("subtype", "") == "channel_leave":
- channel.buffer_prnt(w.prefix("quit").rstrip(), text, time)
- elif message_json.get("subtype", "") == "channel_join":
- channel.buffer_prnt(w.prefix("join").rstrip(), text, time)
- elif message_json.get("subtype", "") == "channel_topic":
- channel.buffer_prnt(w.prefix("network").rstrip(), text, time)
- else:
+
+ #The default case is no subtype - just process the message
+ if "subtype" not in message_json:
+ text = render_message(message_json)
+ name = get_user(message_json, server)
+ name = name.encode('utf-8')
channel.buffer_prnt(name, text, time)
+ #There is a subtype
+ else:
+ text = render_message(message_json)
+ if message_json.get("subtype", "") == "message_changed" and "edited" in message_json["message"]:
+ text = render_message(message_json["message"])
+ channel.change_message(message_json["message"]["ts"], text + " (edited)")
+ cache=False
+
+ elif message_json.get("subtype", "") == "message_deleted":
+ channel.change_message(message_json["deleted_ts"], text + "(deleted)")
+ cache = False
+
+ elif message_json.get("subtype", "") == "channel_leave":
+ channel.buffer_prnt(w.prefix("quit").rstrip(), text, time)
+ elif message_json.get("subtype", "") == "channel_join":
+ channel.buffer_prnt(w.prefix("join").rstrip(), text, time)
+ elif message_json.get("subtype", "") == "channel_topic":
+ channel.buffer_prnt(w.prefix("network").rstrip(), text, time)
if cache:
channel.cache_message(message_json)
- except Exception:
- if channel and ("text" in message_json) and message_json['text'] is not None:
- channel.buffer_prnt('unknown', message_json['text'])
- dbg("cannot process message {}\n{}".format(message_json, traceback.format_exc()))
-
-def unwrap_message(message_json):
- if "message" in message_json:
- if "attachments" in message_json["message"]:
- message_json["attachments"] = message_json["message"]["attachments"]
- if "text" in message_json["message"]:
- if "text" in message_json:
- message_json["text"] += message_json["message"]["text"]
- dbg("added text!")
- else:
- message_json["text"] = message_json["message"]["text"]
- if "fallback" in message_json["message"]:
- if "fallback" in message_json:
- message_json["fallback"] += message_json["message"]["fallback"]
- else:
- message_json["fallback"] = message_json["message"]["fallback"]
- return message_json
-
+# except Exception:
+# if channel and ("text" in message_json) and message_json['text'] is not None:
+# channel.buffer_prnt('unknown', message_json['text'])
+# dbg("cannot process message {}\n{}".format(message_json, traceback.format_exc()))
def unwrap_attachments(message_json):
- attachment_text = ''
- for attachment in message_json["attachments"]:
- if "fallback" in attachment:
- attachment_text += attachment["fallback"]
-# attachment_text = attachment_text.encode('ascii', 'ignore')
+ if "attachments" in message_json:
+ attachment_text = u' --- '
+ for attachment in message_json["attachments"]:
+ if "fallback" in attachment:
+ attachment_text += attachment["fallback"]
+ else:
+ attachment_text = ''
return attachment_text
+
def resolve_ref(ref):
if ref.startswith('@U'):
if users.find(ref[1:]):
@@ -1550,7 +1556,7 @@ def unfurl_ref(ref, ignore_alt_text=False):
display_text = ref.split('|')[1]
else:
url, desc = ref.split('|', 1)
- display_text = "{} ({})".format(url, desc)
+ display_text = u"{} ({})".format(url, desc)
else:
display_text = resolve_ref(ref)
return display_text
@@ -1561,7 +1567,7 @@ def unfurl_refs(text, ignore_alt_text=False):
"""
if text and text.find('<') > -1:
end = 0
- newtext = ""
+ newtext = u""
while text.find('<') > -1:
# Prepend prefix
newtext += text[:text.find('<')]
@@ -1809,7 +1815,7 @@ def url_processor_cb(data, command, return_code, out, err):
if "messages" in my_json:
messages = my_json["messages"].reverse()
for message in my_json["messages"]:
- message["myserver"] = servers.find(token).domain
+ message["_server"] = servers.find(token).domain
message["channel"] = servers.find(token).channels.find(channel).identifier
process_message(message)
if "channel" in my_json: