aboutsummaryrefslogtreecommitdiffstats
path: root/wee_slack.py
diff options
context:
space:
mode:
Diffstat (limited to 'wee_slack.py')
-rw-r--r--wee_slack.py107
1 files changed, 75 insertions, 32 deletions
diff --git a/wee_slack.py b/wee_slack.py
index 8822724..1bd671f 100644
--- a/wee_slack.py
+++ b/wee_slack.py
@@ -75,7 +75,7 @@ def dbg(message, fout=False, main_buffer=False):
if fout:
file('/tmp/debug.log', 'a+').writelines(message + '\n')
if main_buffer:
- w.prnt("", message)
+ w.prnt("", "slack: " + message)
else:
if slack_debug is not None:
w.prnt(slack_debug, message)
@@ -253,7 +253,15 @@ class SlackServer(object):
self.message_buffer.pop(message_id)
return True
else:
- w.prnt("", "\n!! slack.com login error: " + login_data["error"] + "\n Please check your API token with\n \"/set plugins.var.python.slack_extension.slack_api_token (token)\"\n\n ")
+ token_start = self.token[:10]
+ error = """
+!! slack.com login error: {}
+ The problematic token starts with {}
+ Please check your API token with
+ "/set plugins.var.python.slack_extension.slack_api_token (token)"
+
+""".format(login_data["error"], token_start)
+ w.prnt("", error)
self.connected = False
def print_connection_info(self, login_data):
@@ -436,7 +444,7 @@ class Channel(object):
if channel_buffer != main_weechat_buffer:
self.channel_buffer = channel_buffer
w.buffer_set(self.channel_buffer, "localvar_set_nick", self.server.nick)
-# w.buffer_set(self.channel_buffer, "highlight_words", self.server.nick)
+ w.buffer_set(self.channel_buffer, "highlight_words", self.server.nick)
else:
self.channel_buffer = None
channels.update_hashtable()
@@ -536,22 +544,23 @@ class Channel(object):
def linkify_text(self, message):
message = message.split(' ')
for item in enumerate(message):
- if item[1].startswith('@') and len(item[1]) > 1:
- named = re.match('.*[@#]([\w.]+\w)(\W*)', item[1]).groups()
- if named[0] in ["group", "channel", "here"]:
- message[item[0]] = "<!{}>".format(named[0])
- if self.server.users.find(named[0]):
- message[item[0]] = "<@{}>{}".format(self.server.users.find(named[0]).identifier, named[1])
- if item[1].startswith('#') and self.server.channels.find(item[1]):
- named = re.match('.*[@#](\w+)(\W*)', item[1]).groups()
- if self.server.channels.find(named[0]):
- message[item[0]] = "<#{}|{}>{}".format(self.server.channels.find(named[0]).identifier, named[0], named[1])
+ targets = re.match('.*([@#])([\w.]+\w)(\W*)', item[1])
+ if targets and targets.groups()[0] == '@':
+ named = targets.groups()
+ if named[1] in ["group", "channel", "here"]:
+ message[item[0]] = "<!{}>".format(named[1])
+ if self.server.users.find(named[1]):
+ message[item[0]] = "<@{}>{}".format(self.server.users.find(named[1]).identifier, named[2])
+ if targets and targets.groups()[0] == '#':
+ named = targets.groups()
+ if self.server.channels.find(named[1]):
+ message[item[0]] = "<#{}|{}>{}".format(self.server.channels.find(named[1]).identifier, named[1], named[2])
dbg(message)
return " ".join(message)
def set_topic(self, topic):
- topic = topic.encode('utf-8')
- w.buffer_set(self.channel_buffer, "title", topic)
+ self.topic = topic.encode('utf-8')
+ w.buffer_set(self.channel_buffer, "title", self.topic)
def open(self, update_remote=True):
self.create_buffer()
@@ -631,13 +640,13 @@ class Channel(object):
elif message.find(self.server.nick.encode('utf-8')) > -1:
tags = ",notify_highlight,log1"
elif user != self.server.nick and self.name in self.server.users:
- tags = ",notify_private,notify_message,log1"
+ tags = ",notify_private,notify_message,log1,irc_privmsg"
elif self.muted:
tags = ",no_highlight,notify_none,logger_backlog_end"
elif user in [x.strip() for x in w.prefix("join"), w.prefix("quit")]:
tags = ",irc_smart_filter"
else:
- tags = ",notify_message,log1"
+ tags = ",notify_message,log1,irc_privmsg"
#don't write these to local log files
#tags += ",no_log"
time_int = int(time_float)
@@ -853,6 +862,9 @@ class User(object):
return [self.name, "@" + self.name, self.identifier]
def set_active(self):
+ if self.deleted:
+ return
+
self.presence = "active"
for channel in self.server.channels:
if channel.has_user(self.identifier):
@@ -863,6 +875,9 @@ class User(object):
buffer_list_update_next()
def set_inactive(self):
+ if self.deleted:
+ return
+
self.presence = "away"
for channel in self.server.channels:
if channel.has_user(self.identifier):
@@ -946,18 +961,19 @@ class Message(object):
if "reactions" in self.message_json:
found = False
for r in self.message_json["reactions"]:
- if r["name"] == reaction:
- r["users"].add(user)
+ if r["name"] == reaction and user not in r["users"]:
+ r["users"].append(user)
found = True
+
if not found:
- self.message_json["reactions"].append({u"name": reaction, u"users": {user}})
+ self.message_json["reactions"].append({u"name": reaction, u"users": [user]})
else:
- self.message_json["reactions"] = [{u"name": reaction, u"users": {user}}]
+ self.message_json["reactions"] = [{u"name": reaction, u"users": [user]}]
def remove_reaction(self, reaction, user):
if "reactions" in self.message_json:
for r in self.message_json["reactions"]:
- if r["name"] == reaction:
+ if r["name"] == reaction and user in r["users"]:
r["users"].remove(user)
else:
pass
@@ -971,6 +987,16 @@ class Message(object):
def __lt__(self, other):
return self.ts < other.ts
+# Only run this function if we're in a slack buffer, else ignore
+def slack_buffer_or_ignore(f):
+ @wraps(f)
+ def wrapper(current_buffer, *args, **kwargs):
+ server = servers.find(current_domain_name())
+ if not server:
+ return w.WEECHAT_RC_OK
+ return f(current_buffer, *args, **kwargs)
+ return wrapper
+
def slack_command_cb(data, current_buffer, args):
a = args.split(' ', 1)
@@ -986,6 +1012,7 @@ def slack_command_cb(data, current_buffer, args):
return w.WEECHAT_RC_OK
+@slack_buffer_or_ignore
def me_command_cb(data, current_buffer, args):
if channels.find(current_buffer):
channel = channels.find(current_buffer)
@@ -995,6 +1022,7 @@ def me_command_cb(data, current_buffer, args):
return w.WEECHAT_RC_OK
+@slack_buffer_or_ignore
def join_command_cb(data, current_buffer, args):
args = args.split()
if len(args) < 2:
@@ -1005,6 +1033,7 @@ def join_command_cb(data, current_buffer, args):
else:
return w.WEECHAT_RC_OK
+@slack_buffer_or_ignore
def part_command_cb(data, current_buffer, args):
if channels.find(current_buffer) or servers.find(current_buffer):
args = args.split()
@@ -1025,7 +1054,7 @@ def slack_buffer_required(f):
server = servers.find(current_domain_name())
if not server:
w.prnt(current_buffer, "This command must be used in a slack buffer")
- return
+ return w.WEECHAT_RC_ERROR
return f(current_buffer, *args, **kwargs)
return wrapper
@@ -1059,7 +1088,8 @@ def command_register(current_buffer, args):
else:
w.prnt(current_buffer, "Failed! Error is: " + d['error'])
-@slack_buffer_required
+
+@slack_buffer_or_ignore
def msg_command_cb(data, current_buffer, args):
dbg("msg_command_cb")
aargs = args.split(None, 2)
@@ -1105,16 +1135,16 @@ def command_talk(current_buffer, args):
server = servers.find(current_domain_name())
if server:
channel = server.channels.find(args)
- if not channel:
- channel.open()
- else:
+ if channel is None:
user = server.users.find(args)
if user:
user.create_dm_channel()
else:
server.buffer_prnt("User or channel {} not found.".format(args))
- if w.config_get_plugin('switch_buffer_on_join') != '0':
- w.buffer_set(channel.channel_buffer, "display", "1")
+ else:
+ channel.open()
+ if w.config_get_plugin('switch_buffer_on_join') != '0':
+ w.buffer_set(channel.channel_buffer, "display", "1")
return True
else:
return False
@@ -1333,11 +1363,18 @@ def command_openweb(current_buffer, args):
w.buffer_set(channel_buffer, "title", data["topic"])
return w.WEECHAT_RC_OK
+@slack_buffer_or_ignore
def topic_command_cb(data, current_buffer, args):
- if command_topic(current_buffer, args.split(None, 1)[1]):
+ n = len(args.split())
+ if n < 2:
+ channel = channels.find(current_buffer)
+ if channel:
+ w.prnt(current_buffer, 'Topic for {} is "{}"'.format(channel.name, channel.topic))
+ return w.WEECHAT_RC_OK_EAT
+ elif command_topic(current_buffer, args.split(None, 1)[1]):
return w.WEECHAT_RC_OK_EAT
else:
- return w.WEECHAT_RC_OK
+ return w.WEECHAT_RC_ERROR
def command_topic(current_buffer, args):
"""
@@ -1693,6 +1730,9 @@ def render_message(message_json, force=False):
text = text.lstrip()
text = text.replace("\t", " ")
+ text = text.replace("&lt;", "<")
+ text = text.replace("&gt;", ">")
+ text = text.replace("&amp;", "&")
text = text.encode('utf-8')
if "reactions" in message_json:
@@ -2144,6 +2184,9 @@ def cache_load():
j = json.loads(line)
message_cache[j["channel"]].append(line)
dbg("Completed loading messages from cache.", main_buffer=True)
+ except ValueError:
+ w.prnt("", "Failed to load cache file, probably illegal JSON.. Ignoring")
+ pass
except IOError:
w.prnt("", "cache file not found")
pass
@@ -2330,7 +2373,7 @@ if __name__ == "__main__":
users = SearchList()
w.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_changed_cb", "")
- w.hook_timer(3000, 0, 0, "slack_connection_persistence_cb", "")
+ w.hook_timer(30000, 0, 0, "slack_connection_persistence_cb", "")
# attach to the weechat hooks we need
w.hook_timer(1000, 0, 0, "typing_update_cb", "")