Files
jcl/src/jcl/jabber/feeder.py
David Rousselie 73bf2ff246 make AccountManager configurable in Component constructor
darcs-hash:20071011203937-86b55-e5a939ee0bfc2d63ee44c9e6793b7fecbb922ee6.gz
2007-10-11 22:39:37 +02:00

161 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
##
## component.py
## Login : David Rousselie <dax@happycoders.org>
## Started on Wed Aug 9 21:04:42 2006 David Rousselie
## $Id$
##
## Copyright (C) 2006 David Rousselie
## 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; either version 2 of the License, or
## (at your option) any later version.
##
## 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, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
"""FeederComponent with default Feeder and Sender
implementation"""
__revision__ = "$Id: feeder.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
import logging
from jcl.jabber import Handler
from jcl.jabber.component import JCLComponent, AccountManager
from jcl.lang import Lang
import jcl.model as model
from jcl.model import account
from pyxmpp.message import Message
class FeederComponent(JCLComponent):
"""
Implement a feeder sender behavior based on the
regular interval behavior of JCLComponent
feed data from given Feeder and send it to user
through the given Sender.
"""
def __init__(self,
jid,
secret,
server,
port,
config,
config_file,
lang=Lang(),
account_manager_class=AccountManager):
JCLComponent.__init__(self,
jid,
secret,
server,
port,
config,
config_file,
lang=lang,
account_manager_class=account_manager_class)
# Define default feeder and sender, can be override
self.handler = FeederHandler(Feeder(self), Sender(self))
self.check_interval = 1
self.__logger = logging.getLogger("jcl.jabber.FeederComponent")
def handle_tick(self):
"""Implement main feed/send behavior"""
model.db_connect()
self.handler.handle(\
None, self.lang.get_default_lang_class(),
self.handler.filter(None,
self.lang.get_default_lang_class()))
model.db_disconnect()
class Feeder(object):
"""Abstract feeder class"""
def __init__(self, component = None):
self.component = component
def feed(self, _account):
"""Feed data for given account"""
raise NotImplementedError
class Sender(object):
"""Abstract sender class"""
def __init__(self, component = None):
self.component = component
def send(self, to_account, subject, body):
"""Send data (subject and body) to given account"""
raise NotImplementedError
class MessageSender(Sender):
"""Send data as Jabber Message"""
def create_message(self, to_account, data):
"""Create message to send"""
subject, body = data
return Message(from_jid=to_account.jid,
to_jid=to_account.user.jid,
subject=subject,
body=body)
def send(self, to_account, data):
"""Implement abstract method from Sender class and send
data as Jabber message.
"""
self.component.stream.send(self.create_message(to_account,
data))
class HeadlineSender(MessageSender):
"""Send data as Jabber Headline"""
def create_message(self, to_account, data):
"""Create headline to send"""
subject, body = data
return Message(from_jid=to_account.jid,
to_jid=to_account.user.jid,
subject=subject,
stanza_type="headline",
body=body)
class FeederHandler(Handler):
"""
Filter (nothing by default) and call sender for each message from
Feeder.
"""
def __init__(self, feeder, sender):
"""DefaultFeederHandler constructor"""
self.feeder = feeder
self.sender = sender
def filter(self, stanza, lang_class):
"""
Filter account to be processed by the handler
return all accounts.
"""
accounts = account.get_all_accounts()
return accounts
def handle(self, stanza, lang_class, data):
"""
Apply actions to do on given accounts
Do nothing by default.
"""
for _account in data:
if _account.enabled:
for data in self.feeder.feed(_account):
self.sender.send(_account, data)
return []