home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / oscar / rendezvous / chat.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  4.2 KB  |  90 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from oscar.rendezvous.rendezvous import rdv_snac, rdv_types, rendezvous_tlvs as rdv_tlvs
  5. from oscar import capabilities
  6. from oscar.OscarUtil import tlv, s_tflv
  7. import oscar
  8. from util import callsback
  9. from common import profile
  10. from logging import getLogger
  11. log = getLogger('oscar.rdv.chat')
  12. from common.Protocol import ChatInviteException
  13. import hooks
  14. import struct
  15.  
  16. def invite(o, screenname, chatcookie, message = None, callback = None):
  17.     clen = len(chatcookie)
  18.     xdata = struct.pack('!HB%ds' % clen, 4, clen, chatcookie) + '\x00\x00'
  19.     if message is None:
  20.         message = 'Join me in this chat!'
  21.     
  22.     data = ''.join([
  23.         tlv(10, 2, 1),
  24.         tlv(15),
  25.         tlv(12, message),
  26.         tlv(rdv_tlvs.extended_data, xdata)])
  27.     snac = rdv_snac(screenname = screenname, capability = capabilities.by_name['chat_service'], type = rdv_types.request, data = data)
  28.     
  29.     def on_error(snac, exc):
  30.         
  31.         try:
  32.             (fam, fam_name) = ()
  33.             (errcode, errmsg) = exc.args
  34.             (_, _) = None
  35.         except Exception:
  36.             pass
  37.  
  38.         if (fam, errcode) == (4, 4):
  39.             reason = ChatInviteException.REASON_OFFLINE
  40.         elif (fam, errcode) == (4, 9):
  41.             reason = ChatInviteException.REASON_GROUPCHAT_UNSUPPORTED
  42.         else:
  43.             reason = ChatInviteException.REASON_UNKNOWN
  44.         callback.error(ChatInviteException(reason))
  45.         return True
  46.  
  47.     o.send_snac(*snac, **dict(req = True, cb = callback.success, err_cb = on_error))
  48.  
  49. invite = callsback(invite)
  50.  
  51. def unpack_chat_invite(data):
  52.     fmt = (('rendtlvs', 'named_tlvs', -1, rdv_tlvs),)
  53.     (rendtlvs, data) = oscar.unpack(fmt, data)
  54.     invite_msg = oscar.decode(rendtlvs.user_message, getattr(rendtlvs, 'encoding', 'ascii'))
  55.     xdata = rendtlvs.extended_data
  56.     cfmt = (('four', 'H'), ('cookie', 'pstring'))
  57.     (_four, chatcookie, _extra) = oscar.util.apply_format(cfmt, xdata)
  58.     return (invite_msg, chatcookie)
  59.  
  60.  
  61. class OscarChatConnection(object):
  62.     
  63.     def __init__(self, oscar, inviting_buddy):
  64.         self.oscar = oscar
  65.         self.buddy = inviting_buddy
  66.  
  67.     
  68.     def handlech2(self, message_type, data):
  69.         (invite_msg, chatcookie) = unpack_chat_invite(data)
  70.         
  71.         def on_yes():
  72.             netcall = netcall
  73.             import common
  74.             (None, netcall)((lambda : self.oscar.join_chat(cookie = chatcookie)))
  75.  
  76.         profile.on_chat_invite(protocol = self.oscar, buddy = self.buddy, message = invite_msg, room_name = chatcookie, on_yes = on_yes)
  77.  
  78.  
  79.  
  80. def chat_invite_handler(o, screenname, cookie):
  81.     return OscarChatConnection(o, o.get_buddy(screenname))
  82.  
  83.  
  84. def initialize():
  85.     log.info('\tloading rendezvous handler: chat service')
  86.     import oscar.rendezvous.peer as peer
  87.     peer.register_rdv_factory('chat_service', chat_invite_handler)
  88.  
  89. hooks.register('oscar.rdv.load', initialize)
  90.