Compare commits

...

5 Commits

Author SHA1 Message Date
Ciaran Gultnieks 56e29c898a Better default for MUC nickname 2014-11-18 08:55:01 +00:00
Ciaran Gultnieks 635c0b4036 Detect and show MUC topic 2014-11-17 22:23:21 +00:00
Sébastien Leduc cf52f85ccf add an away_string to MUC to be able to add/remove aliases 2014-06-14 10:05:55 +02:00
Ciaran Gultnieks c356dbdc06 Set an away (always False) property on the MUC class
This allows aliases to be set for MUC-related JIDs. Without it,
attempting to do so causes a crash.
2014-06-12 23:49:56 +01:00
Sébastien Leduc 0b0a6d3bc6 merge with upstream version 1.6 2014-03-29 10:26:10 +01:00
1 changed files with 89 additions and 39 deletions

128
jabber.py
View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2012 Sebastien Helleu <flashcode@flashtux.org>
# Copyright (C) 2009-2013 Sebastien Helleu <flashcode@flashtux.org>
# Copyright (C) 2010 xt <xt@bash.no>
# Copyright (C) 2010 Aleksey V. Zapparov <ixti@member.fsf.org>
#
@ -26,6 +26,14 @@
# Happy chat, enjoy :)
#
# History:
# 2013-09-30, Nils Görs <freenode.nils_2>:
# version 1.6: add support of /secure for passwords and jid
# : fix stdout/stderr when no JID was set
# 2013-05-14, Billiam <billiamthesecond@gmail.com>:
# version 1.5: fix unicode encoding error in /jabber buddies
# 2013-05-03, Sebastien Helleu <flashcode@flashtux.org>:
# version 1.4: add tags in user messages: notify_xxx, no_highlight,
# nick_xxx, prefix_nick_xxx, log1
# 2012-05-12, Sebastian Rydberg <sr@rydbergtech.se>:
# version 1.3: Added support for fetching names from roster
# 2012-04-11, Sebastien Helleu <flashcode@flashtux.org>:
@ -79,7 +87,7 @@
SCRIPT_NAME = "jabber"
SCRIPT_AUTHOR = "Sebastien Helleu <flashcode@flashtux.org>"
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
@ -640,6 +658,9 @@ class Server:
else:
buddy = self.search_buddy_list(self.stringify_jid(jid), by='jid')
if not jid or not body:
subject = node.getSubject()
if subject:
buddy.chat.set_title(subject)
return
if not buddy:
buddy = self.add_buddy(jid=jid)
@ -668,22 +689,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 +760,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.
@ -772,6 +800,8 @@ class Server:
def add_muc(self, room, nickname):
""" Add a new buddy """
if not nickname:
nickname = self.option_string("jid").split('@')[0]
muc = MUC(jid=room, server=self)
resource = "%s/%s" % (room, nickname)
xmpp_room = xmpp.protocol.JID(resource)
@ -788,19 +818,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 +1023,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 +1054,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 +1078,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 +1093,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 +1119,24 @@ 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 set_title(self, title):
self.buffer_title = title
weechat.buffer_set(self.buffer, "title", self.buffer_title)
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. """
@ -1123,10 +1170,14 @@ class MUC:
self.domain = ''
self.resource = ''
self.alias = ''
self.away = False
self.buddies = []
self.parse_jid()
self.set_alias()
def away_string(self):
return ""
def add_buddy(self, jid=None):
buddy = Buddy(jid=jid, server=self)
buddy.resource = buddy.resource.encode("utf-8")
@ -1508,8 +1559,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:
@ -1665,7 +1717,7 @@ def jabber_cmd_room(data, buffer, args):
argv = args.split()
room = argv[0]
if len(argv) == 1:
nickname = "weechat" #TODO add a config parameter for default nickname
nickname = None
else:
nickname = argv[1]
@ -1851,10 +1903,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 +1998,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()