Compare commits
5 Commits
029526b1c5
...
56e29c898a
Author | SHA1 | Date |
---|---|---|
Ciaran Gultnieks | 56e29c898a | |
Ciaran Gultnieks | 635c0b4036 | |
Sébastien Leduc | cf52f85ccf | |
Ciaran Gultnieks | c356dbdc06 | |
Sébastien Leduc | 0b0a6d3bc6 |
128
jabber.py
128
jabber.py
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue