gajim-plural/core/core.py

232 lines
7.0 KiB
Python
Raw Normal View History

2003-10-22 22:23:45 +02:00
#!/usr/bin/env python
## core/core.py
##
## Gajim Team:
## - Yann Le Boulanger <asterix@crans.org>
## - Vincent Hanquez <tab@tuxfamily.org>
## - David Ferlier <david@yazzy.org>
2003-10-22 22:23:45 +02:00
##
## Copyright (C) 2003 Gajim Team
##
## 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 2 only.
##
## 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.
##
import sys
2003-11-30 16:50:23 +01:00
sys.path.append("..")
2003-10-22 22:23:45 +02:00
import time
2003-11-15 13:38:43 +01:00
import string
2003-10-22 22:23:45 +02:00
import logging
import common.hub
import common.jabber
import common.optparser
log = logging.getLogger('core.core')
log.setLevel(logging.DEBUG)
2003-11-30 16:50:23 +01:00
CONFPATH = "~/.gajimrc"
2003-10-22 22:23:45 +02:00
class GajimCore:
def __init__(self):
self.connected = 0
self.cfgParser = common.optparser.OptionsParser(CONFPATH)
self.hub = common.hub.GajimHub()
self.cfgParser.parseCfgFile()
# END __init__
def messageCB(self, con, msg):
self.hub.sendPlugin('MSG', (msg.getFrom().getBasic(), \
msg.getBody()))
# END messageCB
def presenceCB(self, con, prs):
who = str(prs.getFrom())
type = prs.getType()
if type == None: type = 'available'
2003-10-27 17:30:37 +01:00
log.debug("PresenceCB : %s" % type)
2003-10-22 22:23:45 +02:00
if type == 'available':
if prs.getShow():
show = prs.getShow()
else:
show = 'online'
self.hub.sendPlugin('NOTIFY', \
(prs.getFrom().getBasic(), show, prs.getStatus()))
2003-10-27 17:30:37 +01:00
elif type == 'unavailable':
self.hub.sendPlugin('NOTIFY', \
(prs.getFrom().getBasic(), 'offline', prs.getStatus()))
2003-10-27 17:30:37 +01:00
elif type == 'subscribe':
log.debug("subscribe request from %s" % who)
2003-11-15 13:38:43 +01:00
if self.cfgParser.Core_alwaysauth == 1 or string.find(who, "@") <= 0:
self.con.send(common.jabber.Presence(who, 'subscribed'))
2003-12-20 14:22:37 +01:00
if string.find(who, "@") <= 0:
self.hub.sendPlugin('NOTIFY', (who, 'offline', 'offline'))
else:
self.hub.sendPlugin('SUBSCRIBE', who)
2003-10-27 17:30:37 +01:00
elif type == 'subscribed':
jid = prs.getFrom()
self.hub.sendPlugin('SUBSCRIBED', {'jid':jid.getBasic(), \
'nom':jid.getNode()})
self.con.updateRosterItem(jid=jid.getBasic(), name=jid.getNode())
2003-10-27 17:30:37 +01:00
log.debug("we are now subscribed to %s" % who)
elif type == 'unsubscribe':
log.debug("unsubscribe request from %s" % who)
elif type == 'unsubscribed':
log.debug("we are now unsubscribed to %s" % who)
2003-10-22 22:23:45 +02:00
# END presenceCB
def disconnectedCB(self, con):
log.debug("disconnectedCB")
self.con.disconnect()
2003-10-22 22:23:45 +02:00
# END disconenctedCB
2003-11-30 23:40:24 +01:00
def connect(self, account):
hostname = self.cfgParser.__getattr__("%s" % account+"_hostname")
name = self.cfgParser.__getattr__("%s" % account+"_name")
password = self.cfgParser.__getattr__("%s" % account+"_password")
ressource = self.cfgParser.__getattr__("%s" % account+"_ressource")
2003-10-22 22:23:45 +02:00
self.con = common.jabber.Client(host = \
2003-11-30 23:40:24 +01:00
hostname, debug = False, log = sys.stderr)
2003-10-22 22:23:45 +02:00
try:
self.con.connect()
except IOError, e:
log.debug("Couldn't connect to %s %s" % (hostname, e))
return 0
2003-10-22 22:23:45 +02:00
else:
log.debug("Connected to server")
self.con.setMessageHandler(self.messageCB)
self.con.setPresenceHandler(self.presenceCB)
self.con.setDisconnectHandler(self.disconnectedCB)
#BUG in jabberpy library : if hostname is wrong : "boucle"
2003-11-30 23:40:24 +01:00
if self.con.auth(name, password, ressource):
2003-10-22 22:23:45 +02:00
self.con.requestRoster()
roster = self.con.getRoster().getRaw()
2003-11-02 22:39:40 +01:00
if not roster :
roster = {}
self.hub.sendPlugin('ROSTER', roster)
2003-10-22 22:23:45 +02:00
self.con.sendInitPresence()
self.connected = 1
else:
log.debug("Couldn't authentificate to %s" % hostname)
return 0
2003-10-22 22:23:45 +02:00
# END connect
def mainLoop(self):
while 1:
if not self.hub.queueIn.empty():
ev = self.hub.queueIn.get()
if ev[0] == 'QUIT':
if self.connected == 1:
self.con.disconnect()
2003-11-26 01:02:43 +01:00
self.hub.sendPlugin('QUIT', ())
2003-10-22 22:23:45 +02:00
return
2003-11-30 23:40:24 +01:00
#('STATUS', (status, account))
2003-10-22 22:23:45 +02:00
elif ev[0] == 'STATUS':
2003-11-30 23:40:24 +01:00
if (ev[1][0] != 'offline') and (self.connected == 0):
self.connect(ev[1][1])
elif (ev[1][0] == 'offline') and (self.connected == 1):
2003-10-22 22:23:45 +02:00
self.con.disconnect()
self.connected = 0
2003-11-30 23:40:24 +01:00
if ev[1][0] != 'offline':
2003-11-09 23:29:41 +01:00
p = common.jabber.Presence()
2003-11-30 23:44:05 +01:00
p.setShow(ev[1][0])
2003-11-09 23:29:41 +01:00
self.con.send(p)
2003-10-27 17:30:37 +01:00
#('MSG', (jid, msg))
2003-10-22 22:23:45 +02:00
elif ev[0] == 'MSG':
msg = common.jabber.Message(ev[1][0], ev[1][1])
msg.setType('chat')
self.con.send(msg)
2003-11-26 01:02:43 +01:00
self.hub.sendPlugin('MSGSENT', ev[1])
2003-10-27 17:30:37 +01:00
#('SUB', (jid, txt))
elif ev[0] == 'SUB':
log.debug('subscription request for %s' % ev[1][0])
self.con.send(common.jabber.Presence(ev[1][0], 'subscribe'))
2003-11-02 22:39:40 +01:00
#('REQ', jid)
elif ev[0] == 'AUTH':
self.con.send(common.jabber.Presence(ev[1], 'subscribed'))
#('DENY', jid)
elif ev[0] == 'DENY':
self.con.send(common.jabber.Presence(ev[1], 'unsubscribed'))
2003-10-27 17:30:37 +01:00
#('UNSUB', jid)
elif ev[0] == 'UNSUB':
delauth = self.cfgParser.Core_delauth
if not delauth: delauth = 1
delroster = self.cfgParser.Core_delroster
if not delroster: delroster = 1
if delauth:
self.con.send(common.jabber.Presence(ev[1], 'unsubscribe'))
if delroster:
self.con.removeRosterItem(ev[1])
2003-11-03 00:35:38 +01:00
#('UPDUSER', (jid, name, groups))
elif ev[0] == 'UPDUSER':
self.con.updateRosterItem(jid=ev[1][0], name=ev[1][1], groups=ev[1][2])
2003-11-12 22:51:38 +01:00
elif ev[0] == 'REQ_AGENTS':
agents = self.con.requestAgents()
2003-11-15 13:38:43 +01:00
self.hub.sendPlugin('AGENTS', agents)
elif ev[0] == 'REQ_AGENT_INFO':
self.con.requestRegInfo(ev[1])
agent_info = self.con.getRegInfo()
self.hub.sendPlugin('AGENT_INFO', (ev[1], agent_info))
elif ev[0] == 'REG_AGENT':
self.con.sendRegInfo(ev[1])
#('NEW_ACC', (hostname, login, password, name, ressource))
elif ev[0] == 'NEW_ACC':
c = common.jabber.Client(host = \
ev[1][0], debug = False, log = sys.stderr)
try:
c.connect()
except IOError, e:
log.debug("Couldn't connect to %s %s" % (hostname, e))
return 0
else:
log.debug("Connected to server")
c.requestRegInfo()
req = c.getRegInfo()
c.setRegInfo( 'username', ev[1][1])
c.setRegInfo( 'password', ev[1][2])
#FIXME: if users already exist, no error message :(
if not c.sendRegInfo():
print "error " + c.lastErr
else:
self.hub.sendPlugin('ACC_OK', ev[1])
2003-10-27 17:30:37 +01:00
else:
log.debug("Unknown Command")
2003-10-22 22:23:45 +02:00
elif self.connected == 1:
self.con.process(1)
time.sleep(0.1)
# END main
# END GajimCore
2003-11-30 16:50:23 +01:00
def loadPlugins(gc):
modStr = gc.cfgParser.Core_modules
2003-12-20 14:22:37 +01:00
if modStr :
mods = string.split (modStr, ' ')
2003-11-30 16:50:23 +01:00
2003-12-20 14:22:37 +01:00
for mod in mods:
modObj = gc.hub.newPlugin(mod)
gc.hub.register(mod, 'ROSTER')
gc.hub.register(mod, 'NOTIFY')
gc.hub.register(mod, 'MSG')
gc.hub.register(mod, 'SUBSCRIBED')
gc.hub.register(mod, 'SUBSCRIBE')
gc.hub.register(mod, 'AGENTS')
gc.hub.register(mod, 'AGENT_INFO')
gc.hub.register(mod, 'QUIT')
gc.hub.register(mod, 'ACC_OK')
modObj.load()
2003-11-30 16:50:23 +01:00
# END loadPLugins
2003-10-22 22:23:45 +02:00
def start():
gc = GajimCore()
2003-11-30 16:50:23 +01:00
loadPlugins(gc)
2003-10-22 22:23:45 +02:00
gc.mainLoop()
2003-11-30 16:50:23 +01:00
# END start