diff options
Diffstat (limited to 'wee_slack.py')
-rw-r--r-- | wee_slack.py | 107 |
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("<", "<") + text = text.replace(">", ">") + text = text.replace("&", "&") 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", "") |