2010-01-10 20:14:17 +00:00
#!/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/>.
2010-03-24 16:44:55 +00:00
from gettext import ( bindtextdomain , textdomain , bind_textdomain_codeset ,
gettext as _ )
bindtextdomain ( ' poezio ' )
textdomain ( ' poezio ' )
bind_textdomain_codeset ( ' poezio ' , ' utf-8 ' )
import locale
locale . setlocale ( locale . LC_ALL , ' ' )
2010-01-10 20:14:17 +00:00
import sys
import xmpp
from config import config
2010-01-26 17:10:37 +00:00
from logging import logger
2010-01-10 20:14:17 +00:00
from handler import Handler
2010-03-18 19:43:44 +00:00
from common import exception_handler
2010-02-11 04:59:58 +00:00
import threading
2010-03-18 19:43:44 +00:00
import thread
2010-01-10 20:14:17 +00:00
2010-02-11 04:59:58 +00:00
class Connection ( threading . Thread ) :
2010-01-10 20:14:17 +00:00
"""
2010-01-21 01:54:50 +00:00
Receives everything from Jabber and emits the
appropriate signals
2010-01-10 20:14:17 +00:00
"""
def __init__ ( self , server , resource ) :
2010-02-11 04:59:58 +00:00
threading . Thread . __init__ ( self )
2010-01-10 20:14:17 +00:00
self . handler = Handler ( )
2010-03-18 19:43:44 +00:00
self . daemon = True # exit the program when this exits
2010-01-10 20:14:17 +00:00
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)
2010-01-26 19:33:40 +00:00
self . port = config . get ( ' port ' , 5222 )
2010-01-26 17:10:37 +00:00
self . client = xmpp . Client ( self . server , debug = [ ] )
2010-01-10 20:14:17 +00:00
def run ( self ) :
"""
2010-01-21 01:54:50 +00:00
run in a thread
2010-01-10 20:14:17 +00:00
connect to server
"""
2010-03-18 19:43:44 +00:00
sys . excepthook = exception_handler
2010-01-10 20:14:17 +00:00
if not self . connect_to_server ( self . server , self . port ) :
2010-03-24 16:44:55 +00:00
self . handler . emit ( ' error ' , msg = ' Could not connect to server ' )
2010-01-10 20:14:17 +00:00
sys . exit ( - 1 )
if not self . authenticate ( ) :
2010-03-24 16:44:55 +00:00
self . handler . emit ( ' error ' , msg = ' Could not authenticate to server ' )
2010-01-10 20:14:17 +00:00
sys . exit ( - 1 )
2010-02-13 15:18:39 +00:00
self . client . sendInitPresence ( requestRoster = 0 )
2010-01-10 20:14:17 +00:00
self . online = 1 # 2 when confirmation of auth is received
self . register_handlers ( )
2010-01-12 14:57:58 +00:00
while 1 :
self . process ( )
2010-01-10 20:14:17 +00:00
def connect_to_server ( self , server , port ) :
2010-02-16 13:37:08 +00:00
if config . get ( ' use_proxy ' , ' false ' ) == ' true ' :
return self . client . connect ( ( server , port ) ,
{ ' host ' : config . get ( " proxy_server " , " " ) ,
' port ' : config . get ( " proxy_port " , 1080 ) ,
' user ' : config . get ( " proxy_user " , " " ) ,
' password ' : config . get ( " proxy_password " , " " )
} )
else :
return self . client . connect ( ( server , port ) )
2010-01-10 20:14:17 +00:00
def authenticate ( self , anon = True ) :
if anon :
2010-03-24 16:44:55 +00:00
try :
self . client . auth ( None , " " , self . resource )
return True
except TypeError :
self . handler . emit ( ' error ' , msg = _ ( ' Error: Could not authenticate. Please make sure the server you chose ( %s ) supports anonymous authentication ' % ( config . get ( ' server ' , ' ' ) ) ) ) # TODO msg
return None
2010-01-10 20:14:17 +00:00
else :
log . error ( ' Non-anonymous connections not handled currently ' )
return None
def register_handlers ( self ) :
2010-01-21 01:54:50 +00:00
"""
register handlers from xmpppy signals
"""
2010-02-14 03:51:03 +00:00
self . client . RegisterHandler ( ' iq ' , self . on_get_time , typ = ' get ' , ns = " urn:xmpp:time " )
self . client . RegisterHandler ( ' iq ' , self . on_get_version , typ = ' get ' , ns = xmpp . NS_VERSION )
2010-03-18 19:43:44 +00:00
self . client . RegisterHandler ( ' presence ' , self . handler_presence )
self . client . RegisterHandler ( ' message ' , self . handler_message )
2010-03-19 03:30:51 +00:00
# self.client.RegisterHandler('message', self.handler_delayed_message, ns=xmpp.NS_DELAY)
2010-01-10 20:14:17 +00:00
def handler_presence ( self , connection , presence ) :
2010-01-21 01:54:50 +00:00
fro = presence . getFrom ( )
2010-01-10 20:14:17 +00:00
to = presence . getAttr ( ' to ' )
if fro == to : # own presence
self . online = 2
self . jid = to
2010-01-29 16:24:44 +00:00
self . handler . emit ( ' on-connected ' , jid = fro )
2010-01-10 20:14:17 +00:00
return
2010-01-21 01:54:50 +00:00
self . handler . emit ( ' room-presence ' , stanza = presence )
2010-03-19 03:30:51 +00:00
raise xmpp . protocol . NodeProcessed
2010-01-10 20:14:17 +00:00
2010-03-18 19:43:44 +00:00
def handler_delayed_message ( self , connection , message ) :
2010-03-19 03:30:51 +00:00
self . handler . emit ( ' room-delayed-message ' , stanza = message )
raise xmpp . protocol . NodeProcessed
2010-03-18 19:43:44 +00:00
2010-01-21 01:54:50 +00:00
def handler_message ( self , connection , message ) :
self . handler . emit ( ' room-message ' , stanza = message )
2010-03-19 03:30:51 +00:00
raise xmpp . protocol . NodeProcessed
2010-01-12 14:57:58 +00:00
2010-01-27 23:02:12 +00:00
def handler_error ( self , connection , error ) :
2010-01-31 05:33:54 +00:00
pass
2010-01-27 23:02:12 +00:00
2010-01-10 20:14:17 +00:00
def process ( self , timeout = 10 ) :
if self . online :
2010-03-18 19:43:44 +00:00
self . client . Process ( timeout )
2010-01-10 20:14:17 +00:00
else :
log . warning ( ' disconnecting... ' )
2010-01-21 01:54:50 +00:00
sys . exit ( )
2010-02-14 03:51:03 +00:00
def on_get_version ( self , connection , iq ) :
self . handler . emit ( ' send-version ' , iq_obj = iq )
def on_get_time ( self , connection , iq ) :
self . handler . emit ( ' send-time ' , iq_obj = iq )