connection.py 3.25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/python
# -*- coding:utf-8 -*-
#
# Copyright 2010 Le Coz Florent <louizatakk@fedoraproject.org>
#
# This file is part of Poezio.
#
# Poezio 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.
#
# Poezio 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 Poezio.  If not, see <http://www.gnu.org/licenses/>.

import sys

import xmpp
from config import config
24
from logging import logger
25 26 27 28 29 30
from threading import Thread
from multiuserchat import MultiUserChat
from handler import Handler

class Connection(Thread):
    """
31 32
    Receives everything from Jabber and emits the
    appropriate signals
33 34 35 36 37 38 39 40 41
    """
    def __init__(self, server, resource):
        Thread.__init__(self)
        self.handler = Handler()

        self.server = server
        self.resource = resource
        self.online = 0         # 1:connected, 2:auth confirmed
        self.jid = ''           # we don't know our jid yet (anon account)
42
        self.port = config.get('port', 5222)
43
        self.client = xmpp.Client(self.server, debug=[])
44 45 46

    def run(self):
        """
47
        run in a thread
48 49 50
        connect to server
        """
        if not self.connect_to_server(self.server, self.port):
51
            logger.error('Could not connect to server')
52 53
            sys.exit(-1)
        if not self.authenticate():
54
            logger.error('Could not authenticate to server')
55 56 57 58
            sys.exit(-1)
        self.client.sendInitPresence()
        self.online = 1      # 2 when confirmation of auth is received
        self.register_handlers()
59 60
        while 1:
            self.process()
61 62 63 64 65 66 67 68 69 70 71 72 73

    def connect_to_server(self, server, port):
        # TODO proxy stuff
        return self.client.connect((server, port))

    def authenticate(self, anon=True):
        if anon:
            return self.client.auth(None, None, self.resource)
        else:
            log.error('Non-anonymous connections not handled currently')
            return None

    def register_handlers(self):
74 75 76
        """
        register handlers from xmpppy signals
        """
77 78
        self.client.RegisterHandler('message', self.handler_message)
        self.client.RegisterHandler('presence', self.handler_presence)
79
        self.client.RegisterHandler('iq',         self.handler_iq)
80 81

    def handler_presence(self, connection, presence):
82
        fro = presence.getFrom()
83 84 85 86
        to = presence.getAttr('to')
        if fro == to:           # own presence
            self.online = 2
            self.jid = to
87
            self.handler.emit('on-connected')
88
            return
89
        self.handler.emit('room-presence', stanza=presence)
90

91 92
    def handler_message(self, connection, message):
        self.handler.emit('room-message', stanza=message)
93

94 95 96 97 98 99 100 101
    def handler_iq(self, connection, iq):
        pass

    def process(self, timeout=10):
        if self.online:
            self.client.Process(timeout)
        else:
            log.warning('disconnecting...')
102
            sys.exit()