home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 June / maximum-cd-2009-06.iso / DiscContents / digsby_setup.exe / lib / common / Conversation.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-02-26  |  8.9 KB  |  262 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from logging import getLogger
  6. from actions import ActionMeta
  7. from Buddy import get_bname
  8. from Queue import Queue
  9. from common import pref, profile, netcall
  10. from datetime import datetime
  11. from util.observe import Observable, ObservableList, observable_dict
  12. from util import format_xhtml, traceguard
  13. import hooks
  14. log = getLogger('common.conversation')
  15. AUTORESP = _('[Auto-Response] ')
  16.  
  17. class Conversation(Observable):
  18.     __metaclass__ = ActionMeta
  19.     AUTORESP = AUTORESP
  20.     
  21.     def __init__(self):
  22.         Observable.__init__(self)
  23.         self.room_list = ObservableList()
  24.         self.protocol = None
  25.         self.messages = Queue()
  26.         self.autoresponded = False
  27.         self.typing_status = observable_dict()
  28.         self.just_had_error = False
  29.  
  30.     
  31.     def icon(self):
  32.         if self.ischat:
  33.             skin = skin
  34.             import gui
  35.             return skin.get('serviceicons.digsby')
  36.         else:
  37.             return self.buddy.icon
  38.  
  39.     icon = property(icon)
  40.     
  41.     def send_message(self, message, *args, **kwargs):
  42.         if not isinstance(message, unicode):
  43.             raise TypeError
  44.         
  45.         message = hooks.reduce('digsby.im.msg.send', message)
  46.         echonow = pref('messaging.echo_immediately', type = bool, default = True)
  47.         
  48.         def error(e = (None, None)):
  49.             log.info('Error sending message: %r', message)
  50.             log.info('Message error callback received %r: %r', type(e), e)
  51.             if self.just_had_error:
  52.                 return None
  53.             
  54.             emsg = getattr(e, 'error_message', '')
  55.             if emsg:
  56.                 self.system_message(emsg, content_type = 'text/plain')
  57.             else:
  58.                 self.system_message(_('Some of the messages you sent may not have been received.'), content_type = 'text/plain')
  59.             self.just_had_error = True
  60.  
  61.         
  62.         def message_sent():
  63.             self.just_had_error = False
  64.  
  65.         
  66.         def echo_message(msg = (None, (None,), None)):
  67.             if not msg:
  68.                 pass
  69.             echomsg = message
  70.             if kwargs.get('auto', False):
  71.                 if 'has_autotext' not in kwargs:
  72.                     kwargs.update(has_autotext = True)
  73.                 
  74.             
  75.             self.sent_message(echomsg, **kwargs)
  76.  
  77.         if echonow:
  78.             
  79.             def success(msg = (None,)):
  80.                 message_sent()
  81.  
  82.             echo_message()
  83.         else:
  84.             
  85.             def success(msg = (None, None)):
  86.                 message_sent()
  87.                 echo_message(msg)
  88.  
  89.         conn = profile.connection
  90.         if conn is not None:
  91.             conn.send_message_intercept(self.buddy, message)
  92.         
  93.         (None, None, None, None, None, netcall)((lambda : self._send_message(message, success = success, error = error, *args, **kwargs)))
  94.         if not self.ischat:
  95.             b = self.buddy
  96.             if b is not None and b is not self.protocol.self_buddy:
  97.                 profile.blist.add_tofrom('im', b, self.protocol)
  98.             
  99.         
  100.  
  101.     
  102.     def system_message(self, message, **opts):
  103.         log.debug('System message: message=%r, opts=%r', message, opts)
  104.         opts['buddy'] = None
  105.         opts['type'] = 'status'
  106.         self._message(message = message, **opts)
  107.  
  108.     
  109.     def buddy_says(self, buddy, message, **options):
  110.         if not isinstance(message, unicode):
  111.             raise TypeError, 'buddy_says needs unicode got type %r: %r' % (type(message), message)
  112.         
  113.         
  114.         try:
  115.             timestamp = options.get('timestamp', None)
  116.             if timestamp is None:
  117.                 timestamp = datetime.utcnow()
  118.             
  119.             Message = Message
  120.             import common.message
  121.             messageobj = Message(buddy = buddy, message = message, timestamp = timestamp)
  122.             plugin_hub = plugin_hub
  123.             import plugin_manager
  124.             type = options.get('type', None)
  125.             plugin_hub.act('digsby.im.msg.pre', messageobj, type)
  126.             if messageobj.message != '':
  127.                 self._message(buddy, messageobj.message, **options)
  128.         except Exception:
  129.             e = None
  130.             log.error('Failed to parse message %r', e)
  131.             self._message(buddy, message, **options)
  132.  
  133.  
  134.     
  135.     def _message(self, buddy, message, **options):
  136.         if not options.get('offline', True):
  137.             options.pop('timestamp', None)
  138.         
  139.         if options.get('offline', False):
  140.             self.autoresponded = True
  141.         
  142.         timestamp = options.pop('timestamp', None)
  143.         if timestamp is None:
  144.             timestamp = datetime.utcnow()
  145.         
  146.         Message = Message
  147.         import common.message
  148.         messageobj = Message(buddy = buddy, message = message, timestamp = timestamp, conversation = self, **options)
  149.         plugin_hub = plugin_hub
  150.         import plugin_manager
  151.         plugin_hub.act('digsby.im.msg.async', self, messageobj, options.get('type', None))
  152.         profile = profile
  153.         import common
  154.         profile.on_message(messageobj)
  155.  
  156.     
  157.     def received_message(self, buddy, message, **options):
  158.         if not isinstance(message, unicode):
  159.             raise TypeError('message argument must be unicode')
  160.         
  161.         self.buddy_says(buddy, message, type = 'incoming', **options)
  162.  
  163.     
  164.     def sent_message(self, message, format = None, **options):
  165.         if not isinstance(message, unicode):
  166.             raise TypeError('message argument must be unicode')
  167.         
  168.         buddy = self.self_buddy
  169.         if options.get('content_type', 'text/plain') != 'text/html':
  170.             message = message.encode('xml')
  171.             options['content_type'] = 'text/html'
  172.         
  173.         if format:
  174.             traceguard.__enter__()
  175.             
  176.             try:
  177.                 message = format_xhtml(message, format)
  178.             finally:
  179.                 pass
  180.  
  181.         
  182.         self.autoresponded = True
  183.         self.buddy_says(buddy, message, type = 'outgoing', **options)
  184.  
  185.     
  186.     def incoming_message(self, autoresp = True):
  187.         status = profile.status.for_account(self.protocol)
  188.         StatusMessage = StatusMessage
  189.         import common
  190.         get_default_format = get_default_format
  191.         import gui.uberwidgets.formattedinput
  192.         if all((autoresp, status.away, not (status.invisible), status != StatusMessage.Offline, pref('messaging.when_away.autorespond', False), not (self.autoresponded))):
  193.             if status.message:
  194.                 self.autoresponded = True
  195.                 import wx
  196.                 
  197.                 def later():
  198.                     if getattr(status, '_a_href', False):
  199.                         content_type = 'text/html'
  200.                     else:
  201.                         content_type = 'text/plain'
  202.                     self.autorespond(status.message, content_type = content_type, format = get_default_format())
  203.  
  204.                 later = (None, None, wx.CallAfter)(later)
  205.             
  206.         
  207.  
  208.     
  209.     def __contains__(self, buddy):
  210.         bname = get_bname(buddy)
  211.         buddy = self.buddies[bname]
  212.         return buddy in self.room_list
  213.  
  214.     
  215.     def tingle(self):
  216.         self.system_message('Your digsby sense is tingling!')
  217.  
  218.     
  219.     def buddy(self):
  220.         r = self.room_list[:]
  221.         while self.self_buddy in r:
  222.             r.remove(self.self_buddy)
  223.         if len(r) == 1:
  224.             return r[0]
  225.         elif self.room_list:
  226.             pass
  227.         
  228.         return self.self_buddy
  229.  
  230.     buddy = property(buddy)
  231.     
  232.     def send_typing_status(self, status):
  233.         raise NotImplementedError
  234.  
  235.     
  236.     def exit(self):
  237.         raise NotImplementedError
  238.  
  239.     
  240.     def autorespond(self, msg, format = None, **kws):
  241.         if not self.ischat:
  242.             if self.buddy.isbot:
  243.                 log.info('Not sending autoresponse to bot: %r', self.buddy)
  244.                 return None
  245.             
  246.             if 'has_autotext' not in kws:
  247.                 kws.update(has_autotext = True)
  248.             
  249.             self.send_message(AUTORESP + msg, auto = True, format = format, **kws)
  250.         
  251.  
  252.  
  253. if __name__ == '__main__':
  254.     convo = Conversation()
  255.     
  256.     def convo_changed(source, attr, old, new):
  257.         print attr, old, new
  258.  
  259.     convo.add_observer(convo_changed)
  260.     convo.last_message = 'test message'
  261.  
  262.