debut de vcard : les avatars
This commit is contained in:
parent
949ef991d9
commit
d72780d58d
6 changed files with 107 additions and 3 deletions
2
README
2
README
|
@ -70,6 +70,8 @@ the Creative Commons BY license (http://creativecommons.org/licenses/by/2.0/)
|
||||||
= People =
|
= People =
|
||||||
Erwan Briand - Handler and MultiUserChat classes
|
Erwan Briand - Handler and MultiUserChat classes
|
||||||
Gaëtan Ribémont (http://www.bonbref.com) - Logo design
|
Gaëtan Ribémont (http://www.bonbref.com) - Logo design
|
||||||
|
= Project =
|
||||||
|
Gajim - send_vcard method
|
||||||
|
|
||||||
======================
|
======================
|
||||||
The code
|
The code
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 6.6 KiB |
|
@ -20,8 +20,8 @@
|
||||||
import sys
|
import sys
|
||||||
# disable any printout (this would mess the display)
|
# disable any printout (this would mess the display)
|
||||||
stderr = sys.stderr
|
stderr = sys.stderr
|
||||||
sys.stdout = open('/dev/null', 'w')
|
# sys.stdout = open('/dev/null', 'w')
|
||||||
sys.stderr = open('/dev/null', 'w')
|
# sys.stderr = open('/dev/null', 'w')
|
||||||
|
|
||||||
from connection import Connection
|
from connection import Connection
|
||||||
from multiuserchat import MultiUserChat
|
from multiuserchat import MultiUserChat
|
||||||
|
|
35
src/common.py
Normal file
35
src/common.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2010, Florent Le Coz <louizatakk@fedoraproject.org>
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation version 3 of the License.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# various useful functions
|
||||||
|
|
||||||
|
import base64
|
||||||
|
import os
|
||||||
|
import mimetypes
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
def get_base64_from_file(path):
|
||||||
|
if not os.path.isfile(path):
|
||||||
|
return (None, None, "File does not exist")
|
||||||
|
size = os.path.getsize(path)
|
||||||
|
if size > 16384:
|
||||||
|
return (None, None,"File is too big")
|
||||||
|
fd = open(path, 'rb')
|
||||||
|
data = fd.read()
|
||||||
|
encoded = base64.encodestring(data)
|
||||||
|
sha1 = hashlib.sha1(data).hexdigest()
|
||||||
|
mime_type = mimetypes.guess_type(path)[0]
|
||||||
|
return (encoded, mime_type, sha1)
|
|
@ -52,7 +52,7 @@ class Connection(threading.Thread):
|
||||||
if not self.authenticate():
|
if not self.authenticate():
|
||||||
logger.error('Could not authenticate to server')
|
logger.error('Could not authenticate to server')
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
self.client.sendInitPresence()
|
self.client.sendInitPresence(requestRoster=0)
|
||||||
self.online = 1 # 2 when confirmation of auth is received
|
self.online = 1 # 2 when confirmation of auth is received
|
||||||
self.register_handlers()
|
self.register_handlers()
|
||||||
while 1:
|
while 1:
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
|
|
||||||
from xmpp import NS_MUC_ADMIN, NS_MUC
|
from xmpp import NS_MUC_ADMIN, NS_MUC
|
||||||
from xmpp.protocol import Presence, Iq, Message, JID
|
from xmpp.protocol import Presence, Iq, Message, JID
|
||||||
|
import xmpp
|
||||||
|
import common
|
||||||
|
import threading
|
||||||
|
|
||||||
from handler import Handler
|
from handler import Handler
|
||||||
from config import config
|
from config import config
|
||||||
|
@ -34,9 +37,72 @@ def is_jid(jid):
|
||||||
if JID(jid).getNode() != '':
|
if JID(jid).getNode() != '':
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class VcardSender(threading.Thread):
|
||||||
|
"""
|
||||||
|
avatar sending is really slow (don't know why...)
|
||||||
|
use a thread to send it...
|
||||||
|
"""
|
||||||
|
def __init__(self, connection):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.connection = connection
|
||||||
|
self.handler = Handler()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.send_vcard()
|
||||||
|
|
||||||
|
def send_vcard(self):
|
||||||
|
"""
|
||||||
|
Method stolen from Gajim (thanks)
|
||||||
|
## Copyright (C) 2006 Dimitur Kirov <dkirov AT gmail.com>
|
||||||
|
## Junglecow J <junglecow AT gmail.com>
|
||||||
|
## Copyright (C) 2006-2007 Tomasz Melcer <liori AT exroot.org>
|
||||||
|
## Travis Shirk <travis AT pobox.com>
|
||||||
|
## Nikos Kouremenos <kourem AT gmail.com>
|
||||||
|
## Copyright (C) 2006-2008 Yann Leboulanger <asterix AT lagaule.org>
|
||||||
|
## Copyright (C) 2007 Julien Pivotto <roidelapluie AT gmail.com>
|
||||||
|
## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com>
|
||||||
|
## Jean-Marie Traissard <jim AT lapin.org>
|
||||||
|
## Stephan Erb <steve-e AT h3c.de>
|
||||||
|
## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org>
|
||||||
|
(one of these people coded this method, probably)
|
||||||
|
"""
|
||||||
|
if not self.connection:
|
||||||
|
return
|
||||||
|
vcard = {
|
||||||
|
"FN":"Poezio tester",
|
||||||
|
}
|
||||||
|
photo_file_path = config.get('photo', '../data/poezio_80.png')
|
||||||
|
(image, mime_type, sha1) = common.get_base64_from_file(photo_file_path)
|
||||||
|
if image:
|
||||||
|
vcard['PHOTO'] = {"TYPE":mime_type,"BINVAL":image}
|
||||||
|
iq = xmpp.Iq(typ = 'set')
|
||||||
|
iq2 = iq.setTag(xmpp.NS_VCARD + ' vCard')
|
||||||
|
for i in vcard:
|
||||||
|
if i == 'jid':
|
||||||
|
continue
|
||||||
|
if isinstance(vcard[i], dict):
|
||||||
|
iq3 = iq2.addChild(i)
|
||||||
|
for j in vcard[i]:
|
||||||
|
iq3.addChild(j).setData(vcard[i][j])
|
||||||
|
elif isinstance(vcard[i], list):
|
||||||
|
for j in vcard[i]:
|
||||||
|
iq3 = iq2.addChild(i)
|
||||||
|
for k in j:
|
||||||
|
iq3.addChild(k).setData(j[k])
|
||||||
|
else:
|
||||||
|
iq2.addChild(i).setData(vcard[i])
|
||||||
|
# id_ = self.connect.getAnId()
|
||||||
|
# iq.setID(id_)
|
||||||
|
self.connection.send(iq)
|
||||||
|
iq = xmpp.Iq(typ = 'set')
|
||||||
|
iq2 = iq.setTag(xmpp.NS_VCARD_UPDATE)
|
||||||
|
iq2.addChild('PHOTO').setData(sha1)
|
||||||
|
self.connection.send(iq)
|
||||||
|
|
||||||
class MultiUserChat(object):
|
class MultiUserChat(object):
|
||||||
def __init__(self, connection):
|
def __init__(self, connection):
|
||||||
self.connection = connection
|
self.connection = connection
|
||||||
|
self.vcard_sender = VcardSender(self.connection)
|
||||||
|
|
||||||
self.rooms = []
|
self.rooms = []
|
||||||
self.rn = {}
|
self.rn = {}
|
||||||
|
@ -64,6 +130,7 @@ class MultiUserChat(object):
|
||||||
else:
|
else:
|
||||||
nick = config.get('default_nick', 'poezio')
|
nick = config.get('default_nick', 'poezio')
|
||||||
self.handler.emit('join-room', room=roomname, nick=nick)
|
self.handler.emit('join-room', room=roomname, nick=nick)
|
||||||
|
self.vcard_sender.start()
|
||||||
|
|
||||||
def send_message(self, room, message):
|
def send_message(self, room, message):
|
||||||
mes = Message(to=room)
|
mes = Message(to=room)
|
||||||
|
|
Loading…
Reference in a new issue