home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / msn / p10 / MSNP10Notification.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  10.8 KB  |  310 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import logging
  5. from uuid import UUID
  6. from util import callsback
  7. from util.primitives.funcs import get
  8. import msn
  9. from msn import Message
  10. from msn.p9 import Notification as Super
  11. log = logging.getLogger('msn.p10.ns')
  12. defcb = dict(trid = True, callback = sentinel)
  13.  
  14. class GroupId(UUID):
  15.     
  16.     def __init__(self, id, *a, **k):
  17.         if isinstance(id, UUID):
  18.             id = str(id)
  19.         
  20.         
  21.         try:
  22.             UUID.__init__(self, id, *a, **k)
  23.         except Exception:
  24.             e = None
  25.             print 'error initializing contact id: ', a, k
  26.             raise e
  27.  
  28.  
  29.     
  30.     def __repr__(self):
  31.         return '<GroupId: %s>' % UUID.__repr__(self)
  32.  
  33.     
  34.     def __eq__(self, other):
  35.         return str(other) == str(self)
  36.  
  37.     
  38.     def __ne__(self, other):
  39.         return not self.__eq__(other)
  40.  
  41.     
  42.     def __hash__(self):
  43.         return hash(str(self))
  44.  
  45.  
  46.  
  47. class ContactId(UUID):
  48.     
  49.     def __init__(self, *a, **k):
  50.         
  51.         try:
  52.             UUID.__init__(self, *a, **k)
  53.         except Exception:
  54.             e = None
  55.             print 'error initializing contact id: ', a, k
  56.             raise e
  57.  
  58.  
  59.     
  60.     def __repr__(self):
  61.         return '<ContactId: %s>' % UUID.__repr__(self)
  62.  
  63.     
  64.     def __eq__(self, other):
  65.         return str(other) == str(self)
  66.  
  67.     
  68.     def __ne__(self, other):
  69.         return not self.__eq__(other)
  70.  
  71.  
  72.  
  73. def _rtrim_utf8url_bytes(s, maxlen):
  74.     
  75.     encode = lambda s: msn.util.url_encode(s.encode('utf-8'))
  76.     bytes = encode(s)
  77.     while len(bytes) > maxlen:
  78.         s = s[:-1]
  79.         bytes = encode(s)
  80.     return bytes
  81.  
  82.  
  83. class MSNP10Notification(Super):
  84.     cid_class = ContactId
  85.     events = Super.events | set(('contact_id_recv',))
  86.     versions = [
  87.         'MSNP10']
  88.     MAX_MFN_LENGTH = 387
  89.     
  90.     def _set_display_name(self, new_alias, callback):
  91.         self.send_prp('MFN', _rtrim_utf8url_bytes(new_alias, self.MAX_MFN_LENGTH), callback)
  92.  
  93.     
  94.     def _set_remote_alias(self, buddy, new_alias, callback):
  95.         self.send_sbp(buddy.guid, 'MFN', _rtrim_utf8url_bytes(new_alias, self.MAX_MFN_LENGTH), callback)
  96.  
  97.     
  98.     def recv_syn(self, msg):
  99.         (__, __, num_buddies, num_groups) = msg.args
  100.         self.event('contact_list_details', int(num_buddies), int(num_groups))
  101.  
  102.     
  103.     def recv_lsg(self, msg):
  104.         log.debug('got lsg: %r', msg)
  105.         if msg.trid:
  106.             msg.args = [
  107.                 str(msg.trid)] + msg.args
  108.             msg.trid = 0
  109.         
  110.         
  111.         try:
  112.             (name, group_id) = msg.args[:2]
  113.         except ValueError:
  114.             e = None
  115.             if msg.args:
  116.                 
  117.                 try:
  118.                     group_id = GroupId(msg.args[0])
  119.                 except Exception:
  120.                     e2 = None
  121.                     name = msg.args[0]
  122.                     import uuid
  123.                     group_id = str(uuid.uuid4())
  124.  
  125.                 name = ''
  126.             else:
  127.                 return None
  128.             msg.args
  129.  
  130.         self.event('group_receive', name.decode('url').decode('fuzzy utf8'), GroupId(group_id))
  131.  
  132.     
  133.     def recv_lst(self, msg):
  134.         args = list(msg.args)
  135.         
  136.         try:
  137.             list_flags = int(args[-1])
  138.             groups = []
  139.             args.pop()
  140.         except ValueError:
  141.             groups = map(GroupId, args[-1].split(','))
  142.             list_flags = int(args[-2])
  143.             args.pop()
  144.             args.pop()
  145.  
  146.         split_args = []
  147.         for arg in args:
  148.             split = arg.split('=', 1)
  149.             if len(split) != 2:
  150.                 split_args[-1][-1] += ' ' + split[0]
  151.                 continue
  152.             split_args.append(split)
  153.         
  154.         
  155.         try:
  156.             info = dict(split_args)
  157.         except ValueError:
  158.             log.error('This data is so screwed up, maybe you can do something with it: %r', msg)
  159.             return None
  160.  
  161.         (name, nick, guid) = (lambda .0: for k in .0:
  162. info.get(k, ''))('NFC')
  163.         nick = nick.decode('url').decode('fuzzy utf8')
  164.         self._last_bname = name
  165.         self.event('recv_contact', name, list_flags, groups, None, guid)
  166.         self.event('contact_alias', name, nick)
  167.         if guid:
  168.             self.event('contact_id_recv', name, ContactId(guid))
  169.         
  170.  
  171.     
  172.     def recv_adc(self, msg):
  173.         l_id = msg.args[0]
  174.         info = list(msg.args[1:])
  175.         if l_id == 'FL':
  176.             if '=' not in info[-1]:
  177.                 g_id = GroupId(info.pop())
  178.             else:
  179.                 g_id = None
  180.         else:
  181.             g_id = None
  182.         
  183.         has_equals = lambda i: '=' in i
  184.         d = (dict,)((lambda .0: for arg in .0:
  185. if has_equals(arg):
  186. arg.split('=', 1)continue)(info))
  187.         (name, nick, guid) = (lambda .0: for k in .0:
  188. d.get(k, ''))(list('NFC'))
  189.         nick = nick.decode('url').decode('fuzzy utf8')
  190.         list_flags = dict(FL = 1, AL = 2, BL = 4, RL = 8, PL = 16)[l_id]
  191.         if guid:
  192.             guid = ContactId(guid)
  193.             id = guid
  194.         else:
  195.             id = name
  196.         self.event('on_contact_add', name, id, list_flags, [
  197.             g_id])
  198.         if name and guid:
  199.             self.event('contact_id_recv', name, guid)
  200.         
  201.         if name:
  202.             self.event('contact_alias', name, nick)
  203.         
  204.  
  205.     
  206.     def recv_rem(self, msg):
  207.         l_id = msg.args[0]
  208.         
  209.         try:
  210.             c_id = ContactId(msg.args[1])
  211.         except ValueError:
  212.             c_id = msg.args[1]
  213.  
  214.         g_id = get(msg.args, 2, None)
  215.         if g_id is not None:
  216.             g_id = GroupId(g_id)
  217.         
  218.         self.event('contact_remove', c_id, l_id, g_id)
  219.  
  220.     
  221.     def recv_adg(self, msg):
  222.         log.debug('got adg')
  223.         (name, g_id) = msg.args
  224.         name = name.decode('url').decode('fuzzy utf8')
  225.         g_id = GroupId(g_id)
  226.         self.event('group_add', name, g_id)
  227.  
  228.     
  229.     def _remove_group(self, groupid, callback = None):
  230.         self.send_rmg(groupid, callback = callback)
  231.  
  232.     
  233.     def recv_rmg(self, msg):
  234.         log.debug('got rmg')
  235.         (g_id,) = msg.args
  236.         g_id = GroupId(g_id)
  237.         self.event('group_remove', g_id)
  238.  
  239.     
  240.     def recv_reg(self, msg):
  241.         log.debug('got reg')
  242.         (g_id, name) = msg.args
  243.         g_id = GroupId(g_id)
  244.         name = name.decode('url').decode('fuzzy utf8')
  245.         self.event('group_rename', g_id, name)
  246.  
  247.     
  248.     def recv_rea(self, msg):
  249.         raise msn.WrongVersionException
  250.  
  251.     
  252.     def recv_add(self, msg):
  253.         raise msn.WrongVersionException
  254.  
  255.     
  256.     def send_syn(self):
  257.         log.debug('sending syn')
  258.         self.socket.send(Message('SYN', '0', '0'), **defcb)
  259.  
  260.     
  261.     def send_adc(self, l_id, bname, bid, g_id = '', callback = None):
  262.         bname = getattr(bname, 'name', bname)
  263.         binfo = 'N=%s' % bname
  264.         if l_id == 'FL':
  265.             binfo += ' F=%s' % bname
  266.         
  267.         if g_id and bid:
  268.             binfo = 'C=%s' % bid
  269.         
  270.         if not g_id:
  271.             pass
  272.         adc_message = Message('ADC', l_id, binfo, '')
  273.         adc_message.retries = 5
  274.         adc_message.timeout = 4
  275.         self.socket.send(adc_message, trid = True, callback = callback)
  276.  
  277.     send_adc = callsback(send_adc)
  278.     send_add = send_adc
  279.     
  280.     def send_rem(self, l_id, bname, bid, g_id = '', callback = None):
  281.         if l_id == 'FL':
  282.             id = bid
  283.         else:
  284.             id = bname
  285.         if g_id is None:
  286.             g_id = ''
  287.         
  288.         if not id or g_id:
  289.             log.info('Didnt get an id or gid. returning from send_rem. traceback to follow...')
  290.             import traceback
  291.             traceback.print_stack()
  292.             callback.success()
  293.             return None
  294.         self.socket.send(Message('REM', l_id, id, g_id), trid = True, callback = callback)
  295.  
  296.     send_rem = callsback(send_rem)
  297.     
  298.     def send_prp(self, prp_type, new_val, callback):
  299.         self.socket.send(Message('PRP', prp_type, new_val), trid = True, callback = callback)
  300.  
  301.     
  302.     def send_sbp(self, b_guid, prp_type, new_val, callback):
  303.         self.socket.send(Message('SBP', b_guid, prp_type, new_val), trid = True, callback = callback)
  304.  
  305.     
  306.     def send_rea(self, *args, **kwargs):
  307.         raise msn.WrongVersionException
  308.  
  309.  
  310.