connection.py 3.49 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
        self.client.RegisterHandler('error',         self.handler_error)
81 82

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

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

95
    def handler_iq(self, connection, iq):
96
        self.handler.emit('room-iq', stanza=iq)
97

98
    def handler_error(self, connection, error):
99
        print "fion"
100 101
        sys.exit()

102 103
    def process(self, timeout=10):
        if self.online:
104 105 106
            try:self.client.Process(timeout)
            except:
                pass
107 108
        else:
            log.warning('disconnecting...')
109
            sys.exit()