Add missing files
darcs-hash:20080307112037-86b55-93200cd35de19726d8db256800761bf419a14110.gz
This commit is contained in:
191
src/jmc/jabber/feeder.py
Normal file
191
src/jmc/jabber/feeder.py
Normal file
@@ -0,0 +1,191 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## feeder.py
|
||||
## Login : David Rousselie <dax@happycoders.org>
|
||||
## Started on Wed Mar 5 19:15:04:42 2008 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 JMC Feeder and Sender implementation
|
||||
"""
|
||||
|
||||
__revision__ = "$Id: feeder.py,v 1.1 2008/03/05 20:24:07 dax Exp $"
|
||||
|
||||
import logging
|
||||
|
||||
from pyxmpp.jid import JID
|
||||
|
||||
from jcl.model.account import PresenceAccount
|
||||
from jcl.jabber.feeder import Feeder, MessageSender, \
|
||||
HeadlineSender, FeederHandler
|
||||
from jcl.model import account
|
||||
|
||||
from jmc.model.account import MailAccount
|
||||
|
||||
class MailFeeder(Feeder):
|
||||
"""Email check"""
|
||||
|
||||
def __init__(self, component):
|
||||
"""MailFeeder constructor"""
|
||||
Feeder.__init__(self, component)
|
||||
self.__logger = logging.getLogger("jmc.jabber.component.MailFeeder")
|
||||
|
||||
def initialize_live_email(self, _account):
|
||||
"""For live email checking account, mark emails received while
|
||||
offline as read.
|
||||
Return a boolean to continue mail checking or not
|
||||
(if waiting for password).
|
||||
"""
|
||||
if _account.password is None:
|
||||
if not _account.waiting_password_reply:
|
||||
account_manager = self.component.account_manager
|
||||
self.component.send_stanzas(\
|
||||
account_manager.ask_password(_account,
|
||||
_account.default_lang_class))
|
||||
return False
|
||||
try:
|
||||
_account.connect()
|
||||
_account.mark_all_as_read()
|
||||
_account.disconnect()
|
||||
_account.first_check = False
|
||||
_account.error = None
|
||||
return True
|
||||
except Exception, e:
|
||||
if _account.connected:
|
||||
try:
|
||||
_account.disconnect()
|
||||
except:
|
||||
# We have done everything we could
|
||||
_account.connected = False
|
||||
self.component.send_error(_account, e)
|
||||
return False
|
||||
|
||||
def feed(self, _account):
|
||||
"""Check for new emails for given MailAccount and return a list of
|
||||
those emails or a summary.
|
||||
"""
|
||||
self.__logger.debug("MailFeeder.feed")
|
||||
result = []
|
||||
if _account.first_check and _account.live_email_only:
|
||||
continue_checking = self.initialize_live_email(_account)
|
||||
if not continue_checking:
|
||||
return result
|
||||
_account.lastcheck += 1
|
||||
if _account.lastcheck == _account.interval:
|
||||
_account.lastcheck = 0
|
||||
action = _account.action
|
||||
if action != PresenceAccount.DO_NOTHING:
|
||||
try:
|
||||
if _account.password is None:
|
||||
account_manager = self.component.account_manager
|
||||
self.component.send_stanzas(\
|
||||
account_manager.ask_password(_account,
|
||||
_account.default_lang_class))
|
||||
return result
|
||||
self.__logger.debug("Checking " + _account.name)
|
||||
self.__logger.debug("\t" + _account.login \
|
||||
+ "@" + _account.host)
|
||||
_account.connect()
|
||||
mail_list = _account.get_new_mail_list()
|
||||
default_lang_class = _account.default_lang_class
|
||||
if action == MailAccount.RETRIEVE:
|
||||
# TODO : use generator (yield)
|
||||
mail_index = _account.get_next_mail_index(mail_list)
|
||||
while mail_index is not None:
|
||||
(body, email_from) = _account.get_mail(mail_index)
|
||||
result.append((email_from,
|
||||
default_lang_class.new_mail_subject\
|
||||
% (email_from),
|
||||
body))
|
||||
mail_index = _account.get_next_mail_index(mail_list)
|
||||
elif action == MailAccount.DIGEST:
|
||||
body = ""
|
||||
new_mail_count = 0
|
||||
mail_index = _account.get_next_mail_index(mail_list)
|
||||
while mail_index is not None:
|
||||
(tmp_body, from_email) = \
|
||||
_account.get_mail_summary(mail_index)
|
||||
body += tmp_body
|
||||
body += "\n----------------------------------\n"
|
||||
mail_index = _account.get_next_mail_index(mail_list)
|
||||
new_mail_count += 1
|
||||
if body != "":
|
||||
result.append((None,
|
||||
default_lang_class.new_digest_subject\
|
||||
% (new_mail_count),
|
||||
body))
|
||||
else:
|
||||
raise Exception("Unkown action: " + str(action) \
|
||||
+ "\nPlease reconfigure account.")
|
||||
_account.disconnect()
|
||||
_account.error = None
|
||||
self.__logger.debug("\nCHECK_MAIL ends " + _account.jid)
|
||||
except Exception, e:
|
||||
if _account.connected:
|
||||
try:
|
||||
_account.disconnect()
|
||||
except:
|
||||
# We have done everything we could
|
||||
_account.connected = False
|
||||
self.component.send_error(_account, e)
|
||||
return result
|
||||
|
||||
class MailSender(HeadlineSender):
|
||||
"""Send emails messages to jabber users"""
|
||||
|
||||
def create_full_email_message(self, email_from, email_subject,
|
||||
email_body, to_account):
|
||||
"""
|
||||
Create a jabber message with email data and XEP-XXX addresses (TODO)
|
||||
"""
|
||||
message = MessageSender.create_message(self, to_account,
|
||||
(email_subject, email_body))
|
||||
msg_node = message.get_node()
|
||||
addresses_node = msg_node.newChild(None, "addresses", None)
|
||||
address_ns = addresses_node.newNs("http://jabber.org/protocol/address",
|
||||
None)
|
||||
addresses_node.setNs(address_ns)
|
||||
replyto_address_node = addresses_node.newChild(address_ns, "address",
|
||||
None)
|
||||
replyto_address_node.setProp("type", "replyto")
|
||||
replyto_jid = email_from.replace('@', '%', 1) + "@" \
|
||||
+ unicode(JID(to_account.jid).domain)
|
||||
replyto_address_node.setProp("jid", replyto_jid)
|
||||
return message
|
||||
|
||||
def create_message(self, to_account, data):
|
||||
"""Send given emails (in data) as Jabber messages"""
|
||||
email_from, subject, body = data
|
||||
if to_account.action == MailAccount.RETRIEVE:
|
||||
message = self.create_full_email_message(email_from, subject, body,
|
||||
to_account)
|
||||
elif to_account.action == MailAccount.DIGEST:
|
||||
message = HeadlineSender.create_message(self, to_account,
|
||||
(subject, body))
|
||||
else:
|
||||
message = None
|
||||
return message
|
||||
|
||||
class MailFeederHandler(FeederHandler):
|
||||
def filter(self, stanza, lang_class):
|
||||
"""
|
||||
Return only email account type to check mail from
|
||||
"""
|
||||
accounts = account.get_all_accounts(account_class=MailAccount)
|
||||
return accounts
|
||||
31
src/jmc/jabber/tests/presence.py
Normal file
31
src/jmc/jabber/tests/presence.py
Normal file
@@ -0,0 +1,31 @@
|
||||
##
|
||||
## presence.py
|
||||
## Login : <dax@happycoders.org>
|
||||
## Started on Thu Dec 6 08:19:59 2007 David Rousselie
|
||||
## $Id$
|
||||
##
|
||||
## Copyright (C) 2007 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
|
||||
##
|
||||
|
||||
import unittest
|
||||
|
||||
def suite():
|
||||
test_suite = unittest.TestSuite()
|
||||
#test_suite.addTest(unittest.makeSuite(_TestCase, 'test'))
|
||||
return test_suite
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(defaultTest='suite')
|
||||
Reference in New Issue
Block a user