diff --git a/jabber.py b/jabber.py index ba38abb..81a9387 100644 --- a/jabber.py +++ b/jabber.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2009-2012 Sebastien Helleu +# Copyright (C) 2009-2013 Sebastien Helleu # Copyright (C) 2010 xt # Copyright (C) 2010 Aleksey V. Zapparov # @@ -26,6 +26,14 @@ # Happy chat, enjoy :) # # History: +# 2013-09-30, Nils Görs : +# version 1.6: add support of /secure for passwords and jid +# : fix stdout/stderr when no JID was set +# 2013-05-14, Billiam : +# version 1.5: fix unicode encoding error in /jabber buddies +# 2013-05-03, Sebastien Helleu : +# version 1.4: add tags in user messages: notify_xxx, no_highlight, +# nick_xxx, prefix_nick_xxx, log1 # 2012-05-12, Sebastian Rydberg : # version 1.3: Added support for fetching names from roster # 2012-04-11, Sebastien Helleu : @@ -79,7 +87,7 @@ SCRIPT_NAME = "jabber" SCRIPT_AUTHOR = "Sebastien Helleu " -SCRIPT_VERSION = "1.3" +SCRIPT_VERSION = "1.6" SCRIPT_LICENSE = "GPL3" SCRIPT_DESC = "Jabber/XMPP protocol for WeeChat" SCRIPT_COMMAND = SCRIPT_NAME @@ -458,7 +466,16 @@ class Server: weechat.buffer_set(self.buffer, "nicklist_display_groups", "1") weechat.buffer_set(self.buffer, "display", "auto") self.disconnect() - self.buddy = Buddy(jid=self.option_string("jid"), server=self) + + if not eval_expression(self.option_string("jid")): + weechat.prnt(self.buffer, "%sjabber: JID must contain at least domain name" + % weechat.prefix("error")) + self.ping_up = False + self.client = None + return self.is_connected() + + self.buddy = Buddy(jid=eval_expression(self.option_string("jid")), server=self) + server = self.option_string("server") port = self.option_integer("port") self.client = xmpp.Client(server=self.buddy.domain, debug=[]) @@ -485,9 +502,11 @@ class Server: res = self.buddy.resource if not res: res = "WeeChat" + auth = self.client.auth(self.buddy.username, - self.option_string("password"), + eval_expression(self.option_string("password")), res) + if auth: weechat.prnt(self.buffer, "jabber: authentication ok (using %s)" % auth) @@ -603,7 +622,6 @@ class Server: if name: buddy.set_name(name.encode("utf-8")) buddy.set_status(status=status, away=away) - self.update_nicklist(buddy=buddy, action=action) return @@ -668,22 +686,25 @@ class Server: self.disconnect() if weechat.config_boolean(self.options['autoreconnect']): autoreconnect_delay = 30 - weechat.command('', '/wait %s /%s connect %s' %(\ - autoreconnect_delay, SCRIPT_COMMAND, self.name)) + weechat.command('', '/wait %s /%s connect %s' % + (autoreconnect_delay, SCRIPT_COMMAND, self.name)) def recv_message(self, buddy, message): """ Receive a message from buddy. """ - weechat.prnt_date_tags(self.buffer, 0, "notify_private", + weechat.prnt_date_tags(self.buffer, 0, + "notify_private,nick_%s,prefix_nick_%s,log1" % + (buddy.alias, + weechat.config_string(weechat.config_get("weechat.color.chat_nick_other"))), "%s%s\t%s" % (weechat.color("chat_nick_other"), buddy.alias, message)) def print_status(self, nickname, status): - ''' Print a status in server window and in chat ''' - weechat.prnt_date_tags(self.buffer, 0, 'no_highlight', "%s%s has status %s" % (\ - weechat.prefix("action"), - nickname, - status)) + """ Print a status in server window and in chat. """ + weechat.prnt_date_tags(self.buffer, 0, "no_highlight", "%s%s has status %s" % + (weechat.prefix("action"), + nickname, + status)) for chat in self.chats: if nickname in chat.buddy.alias: chat.print_status(status) @@ -736,9 +757,13 @@ class Server: sender = self.buddy.alias except: sender = self.jid - weechat.prnt(self.buffer, "%s%s\t%s" % (weechat.color("chat_nick_self"), - sender, - message.strip())) + weechat.prnt_date_tags(self.buffer, 0, + "notify_none,no_highlight,nick_%s,prefix_nick_%s,log1" % + (sender, + weechat.config_string(weechat.config_get("weechat.color.chat_nick_self"))), + "%s%s\t%s" % (weechat.color("chat_nick_self"), + sender, + message.strip())) def set_away(self, message): """ Set/unset away on server. @@ -788,19 +813,20 @@ class Server: len_max = { 'alias': 5, 'jid': 5 } lines = [] - for buddy in sorted(self.buddies, key=lambda x: str(x.jid)): + for buddy in sorted(self.buddies, key=lambda x: x.jid.getStripped().encode('utf-8')): alias = '' if buddy.alias != buddy.bare_jid: alias = buddy.alias + buddy_jid_string = buddy.jid.getStripped().encode('utf-8') lines.append( { - 'jid': str(buddy.jid), + 'jid': buddy_jid_string, 'alias': alias, 'status': buddy.away_string(), }) if len(alias) > len_max['alias']: len_max['alias'] = len(alias) - if len(str(buddy.jid)) > len_max['jid']: - len_max['jid'] = len(str(buddy.jid)) + if len(buddy_jid_string) > len_max['jid']: + len_max['jid'] = len(buddy_jid_string) prnt_format = " %s%-" + str(len_max['jid']) + "s %-" + str(len_max['alias']) + "s %s" weechat.prnt(self.buffer, prnt_format % ('', 'JID', 'Alias', 'Status')) for line in lines: @@ -992,6 +1018,13 @@ class Server: for name, option in self.options.items(): weechat.config_option_free(option) +def eval_expression(option_name): + """ Return a evaluated expression """ + if int(version) >= 0x00040200: + return weechat.string_eval_expression(option_name,{},{},{}) + else: + return option_name + def jabber_search_server_by_name(name): """ Search a server by name. """ global jabber_servers @@ -1016,7 +1049,7 @@ def jabber_search_context(buffer): return context def jabber_search_context_by_name(server_name): - ''' Search for buffer given name of server ''' + """Search for buffer given name of server. """ bufname = "%s.server.%s" % (SCRIPT_NAME, server_name) return jabber_search_context(weechat.buffer_search("python", bufname)) @@ -1040,9 +1073,6 @@ class Chat: "jabber_buffer_close_cb", "") self.buffer_title = self.buddy.alias if self.buffer: - weechat.buffer_set(self.buffer, "nicklist", "1") - weechat.buffer_set(self.buffer, "nicklist_display_groups", "1") - weechat.buffer_set(self.buffer, "display", "auto") weechat.buffer_set(self.buffer, "title", self.buffer_title) weechat.buffer_set(self.buffer, "short_name", self.buddy.alias) weechat.buffer_set(self.buffer, "localvar_set_type", "private") @@ -1058,7 +1088,10 @@ class Chat: if buddy.alias != self.buffer_title: self.buffer_title = buddy.alias weechat.buffer_set(self.buffer, "title", "%s" % self.buffer_title) - weechat.prnt_date_tags(self.buffer, 0, "notify_private", + weechat.prnt_date_tags(self.buffer, 0, + "notify_private,nick_%s,prefix_nick_%s,log1" % + (buddy.alias, + weechat.config_string(weechat.config_get("weechat.color.chat_nick_other"))), "%s%s\t%s" % (weechat.color("chat_nick_other"), buddy.alias, message)) @@ -1081,15 +1114,19 @@ class Chat: self.server.send_message(self.buddy, message) # On a MUC we will receive our messages if not isinstance(self.buddy, MUC): - weechat.prnt(self.buffer, "%s%s\t%s" % (weechat.color("chat_nick_self"), - self.server.buddy.alias, - message)) + weechat.prnt_date_tags(self.buffer, 0, + "notify_none,no_highlight,nick_%s,prefix_nick_%s,log1" % + (self.server.buddy.alias, + weechat.config_string(weechat.config_get("weechat.color.chat_nick_self"))), + "%s%s\t%s" % (weechat.color("chat_nick_self"), + self.server.buddy.alias, + message)) def print_status(self, status): - ''' Print a status message in chat ''' - weechat.prnt(self.buffer, "%s%s has status %s" % (\ - weechat.prefix("action"), - self.buddy.alias, - status)) + """ Print a status message in chat. """ + weechat.prnt(self.buffer, "%s%s has status %s" % + (weechat.prefix("action"), + self.buddy.alias, + status)) def close_buffer(self): """ Close chat buffer. """ @@ -1508,8 +1545,9 @@ def jabber_list_servers_chats(name): connected = "" if server.sock >= 0: connected = "(connected)" + weechat.prnt("", " %s - %s %s %s" % (server.name, - server.option_string("jid"), conn_server, connected)) + eval_expression(server.option_string("jid")), conn_server, connected)) for chat in server.chats: weechat.prnt("", " chat with %s" % (chat.buddy)) else: @@ -1851,10 +1889,6 @@ class AliasCommand(object): weechat.prnt("", prnt_format % ('Alias', 'JID')) for alias, jid in sorted(jabber_jid_aliases.items()): weechat.prnt("", prnt_format % (alias, jid)) - #FIXME \\\ - import sys - weechat.prnt('', "jabber: sys.version: %s" % (sys.version)) # FIXME - #FIXME /// return def parse(self): @@ -1950,6 +1984,8 @@ if __name__ == "__main__" and import_ok: if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "jabber_unload_script", ""): + + version = weechat.info_get("version_number", "") or 0 jabber_hook_commands_and_completions() jabber_config_init() jabber_config_read()