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

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import logging
  5. import msn
  6. from rfc822 import Message as RfcMsg
  7. from util import pythonize, Storage, isint, get, autoassign
  8. from util.auxencodings import fuzzydecode
  9.  
  10. class CommandProcessor(object):
  11.     
  12.     def __init__(self, log):
  13.         if not log:
  14.             pass
  15.         self.log = logging.getLogger(type(self).__name__)
  16.         self.process_cmd = Storage(success = self.on_message, error = self.on_error)
  17.  
  18.     
  19.     def on_message(self, msg):
  20.         if self.log:
  21.             self.log.log_s(1, 'Got message: %r', str(msg)[:100].strip('\r\n'))
  22.         
  23.         mname = 'recv_%s' % pythonize(msg.cmd)
  24.         getattr(self, mname, self.unknown_cmd)(msg)
  25.  
  26.     
  27.     def on_error(self, msg):
  28.         self.log.error('MSNError! %r', msg)
  29.  
  30.     
  31.     def unknown_cmd(self, msg):
  32.         self.log.warning('Received unknown message from transport. Message is <%r>', msg)
  33.  
  34.  
  35.  
  36. class MsgPayload(RfcMsg):
  37.     
  38.     def __len__(self):
  39.         return len(self.body())
  40.  
  41.  
  42.  
  43. class Message(object):
  44.     argnames = []
  45.     
  46.     def __init__(self, cmd, *args, **kws):
  47.         self.cmd = cmd.upper()
  48.         self.args = args
  49.         self.trid = int(kws.pop('trid', 0))
  50.         if not kws.pop('payload', None):
  51.             pass
  52.         self.payload = None
  53.  
  54.     
  55.     def length(self):
  56.         if self.is_payload:
  57.             return len(str(self.payload))
  58.         else:
  59.             return 0
  60.  
  61.     length = property(length)
  62.     
  63.     def is_trid(self):
  64.         if isint(self.trid):
  65.             pass
  66.         return bool(int(self.trid))
  67.  
  68.     is_trid = property(is_trid)
  69.     
  70.     def is_payload(self):
  71.         return self.payload is not None
  72.  
  73.     is_payload = property(is_payload)
  74.     
  75.     def is_error(self):
  76.         return bool(self.error_code)
  77.  
  78.     is_error = property(is_error)
  79.     
  80.     def error_str(self):
  81.         return msn.error_codes.get(self.error_code, 'Undocumented error')
  82.  
  83.     error_str = property(error_str)
  84.     
  85.     def error_code(self):
  86.         
  87.         try:
  88.             return int(self.cmd)
  89.         except:
  90.             return None
  91.  
  92.  
  93.     error_code = property(error_code)
  94.     
  95.     def __iter__(self):
  96.         return iter(self.args)
  97.  
  98.     
  99.     def __str__(self):
  100.         res = [
  101.             self.cmd]
  102.         if self.is_trid:
  103.             res.append(str(self.trid))
  104.         
  105.         res.extend(map(str, self.args))
  106.         if self.is_payload:
  107.             res.append(str(self.length) + '\r\n' + str(self.payload))
  108.         
  109.         return None + ' '.join(filter(None, res)) if not self.is_payload else ''
  110.  
  111.     
  112.     def __repr__(self):
  113.         err_str = None if self.is_error else ''
  114.         if type(self) is Message:
  115.             typestr = Message.__name__
  116.         else:
  117.             typestr = '%s(%s)' % (Message.__name__, type(self).__name__)
  118.         return None % ('<%s %s trid=%s, %sargs=%r, len(payload)=%s>', typestr, self.cmd, self.trid, err_str, self.args if self.is_payload else None)
  119.  
  120.     
  121.     def __getattr__(self, attr):
  122.         if attr in self.argnames:
  123.             return self.args[self.argnames.index(attr)]
  124.         else:
  125.             return object.__getattribute__(self, attr)
  126.  
  127.     
  128.     def get(self, key, default = sentinel):
  129.         
  130.         try:
  131.             return self[key]
  132.         except KeyError:
  133.             if default is sentinel:
  134.                 raise 
  135.             else:
  136.                 return default
  137.         except:
  138.             default is sentinel
  139.  
  140.  
  141.     
  142.     def __getitem__(self, *a):
  143.         return self.args.__getitem__(*a)
  144.  
  145.     
  146.     def from_net(cls, data, is_payload):
  147.         if is_payload:
  148.             (cmdline, payload) = data.split('\r\n', 1)
  149.         else:
  150.             cmdline = data
  151.             payload = None
  152.         cmdline = cmdline.strip('\r\n ')
  153.         dlist = cmdline.split(' ')
  154.         cmd = dlist.pop(0)
  155.         if dlist and isint(dlist[0]):
  156.             trid = int(dlist.pop(0))
  157.         else:
  158.             trid = 0
  159.         if is_payload:
  160.             
  161.             try:
  162.                 l = dlist.pop()
  163.             except IndexError:
  164.                 l = trid
  165.                 trid = 0
  166.  
  167.             
  168.             try:
  169.                 pass
  170.             except AssertionError:
  171.                 dlist.append(l)
  172.                 if not payload.strip():
  173.                     pass
  174.                 payload = None
  175.             except:
  176.                 None<EXCEPTION MATCH>AssertionError
  177.             
  178.  
  179.         None<EXCEPTION MATCH>AssertionError
  180.         args = tuple(dlist)
  181.         if cmd == 'MSG':
  182.             ctype = MsgPayload(payload).get('content-type', '').split(';')[0]
  183.             subcmd = msn.util.msgtypes.get(ctype, '')
  184.             cls = globals().get(cmd + subcmd, MSG)
  185.         else:
  186.             cls = globals().get(cmd, cls)
  187.         return cls(cmd, trid = trid, payload = payload, *args)
  188.  
  189.     from_net = classmethod(from_net)
  190.     
  191.     def copy(self):
  192.         return type(self)(self.cmd, trid = self.trid, payload = self.payload, *self.args)
  193.  
  194.  
  195.  
  196. class OUT(Message):
  197.     argnames = [
  198.         'reason']
  199.  
  200.  
  201. class MSG(Message):
  202.     argnames = 'name nick length'.split()
  203.     
  204.     def __init__(self, *a, **k):
  205.         if a[0] != 'MSG':
  206.             a = ('MSG',) + a
  207.         
  208.         Message.__init__(self, *a, **k)
  209.         self.type = msn.util.msgtypes.setdefault(self.payload['content-type'].split(';')[0], 'unknown')
  210.  
  211.     
  212.     def __getitem__(self, *a, **k):
  213.         
  214.         try:
  215.             return Message.__getitem__(self, *a, **k)
  216.         except:
  217.             return self.payload.__getitem__(*a, **k)
  218.  
  219.  
  220.     
  221.     def _get_payload(self):
  222.         return self._payload
  223.  
  224.     
  225.     def _set_payload(self, payload):
  226.         self._payload = MsgPayload(payload)
  227.  
  228.     payload = property(_get_payload, _set_payload)
  229.     
  230.     def from_net(self, data, is_payload):
  231.         data = data[4:]
  232.         res = Message.from_net(data, is_payload)
  233.         if res.trid:
  234.             tr = res.trid
  235.             res.trid = 0
  236.             res.args = ('%d' % tr,) + res.args
  237.         
  238.         return res
  239.  
  240.     
  241.     def __repr__(self):
  242.         super = Message.__repr__(self)
  243.         return '%s type=%s>' % (super.rstrip('>'), self.type)
  244.  
  245.  
  246.  
  247. class MSGdatacast(MSG):
  248.     
  249.     def _get_payload(self):
  250.         return MSG._get_payload(self)
  251.  
  252.     
  253.     def _set_payload(self, payload):
  254.         MSG._set_payload(self, payload)
  255.         self.contents = MsgPayload(self.payload.body())
  256.  
  257.     payload = property(_get_payload, _set_payload)
  258.     
  259.     def __getattr__(self, attr):
  260.         if attr in ('id', 'data'):
  261.             return get(self.contents, attr)
  262.         else:
  263.             return MSG.__getattr__(self, attr)
  264.  
  265.  
  266.  
  267. class UBM(Message):
  268.     
  269.     def __init__(self, *a, **k):
  270.         Message.__init__(self, *a, **k)
  271.         self.type = msn.util.msgtypes.setdefault(self.payload['content-type'].split(';')[0], 'unknown')
  272.  
  273.     
  274.     def _get_payload(self):
  275.         return self._payload
  276.  
  277.     
  278.     def _set_payload(self, payload):
  279.         self._payload = MsgPayload(payload)
  280.  
  281.     payload = property(_get_payload, _set_payload)
  282.     
  283.     def __getitem__(self, *a, **k):
  284.         
  285.         try:
  286.             return Message.__getitem__(self, *a, **k)
  287.         except:
  288.             return self.payload.__getitem__(*a, **k)
  289.  
  290.  
  291.  
  292.  
  293. class MSNSB_Message(Message):
  294.     
  295.     def __init__(self, contenttype, body, acktype = 'N', headers = { }, **moreheaders):
  296.         moreheaders.update(headers)
  297.         content = []
  298.         content.append('MIME-Version: 1.0')
  299.         content.append('Content-Type: text/x-%s' % contenttype)
  300.         for header in moreheaders.items():
  301.             content.append('%s: %s' % header)
  302.         
  303.         content.append('')
  304.         payload = '\r\n'.join(content) + body
  305.         Message.__init__(self, 'MSG', acktype, payload = payload)
  306.  
  307.  
  308.  
  309. class MSNTextMessage(object):
  310.     
  311.     def __init__(self, body, fontname = None, color = None, rightalign = False, bold = False, italic = False, underline = False, strike = False, charset = 0, family = 22):
  312.         autoassign(self, locals())
  313.         if isinstance(self.fontname, str):
  314.             self.fontname = self.fontname.decode('fuzzy utf8')
  315.         
  316.         if isinstance(self.body, str):
  317.             self.body = self.body.decode('fuzzy utf8')
  318.         
  319.         self.effects = ''
  320.         if self.bold:
  321.             self.effects += 'B'
  322.         
  323.         if self.italic:
  324.             self.effects += 'I'
  325.         
  326.         if self.underline:
  327.             self.effects += 'U'
  328.         
  329.         if self.strike:
  330.             self.effects += 'S'
  331.         
  332.         if self.color is not None:
  333.             (self.r, self.g, self.b) = self.color[:3]
  334.         else:
  335.             self.r = None
  336.             self.g = None
  337.             self.b = None
  338.         self._MSNTextMessage__html = u''
  339.  
  340.     
  341.     def __str__(self):
  342.         s = None([
  343.             None,
  344.             None,
  345.             u'\r\n'.join + 'MIME-Version: 1.0' + 'Content-Type: text/plain; charset=UTF-8' + 'X-MMS-IM-Format: ' if self.fontname is not None else '' if self.effects else '' if self.color else '' + 'CS=%(charset)d; PF=%(family)d',
  346.             '',
  347.             '%(body)s'])
  348.         return (s % vars(self)).encode('utf-8')
  349.  
  350.     
  351.     def from_net(cls, rfc822msg):
  352.         m = rfc822msg
  353.         fmt = m.get('X-MMS-IM-Format', '')
  354.         body = m.body().decode('fuzzy utf-8')
  355.         msg = cls(body)
  356.         if fmt:
  357.             fmt = msn.util.mime_to_dict(fmt)
  358.             
  359.             _g = lambda k: get(fmt, k, None)
  360.             fontname = _g('FN')
  361.             msg.fontname = (None,) if fontname is None else fontname.decode('url').decode('utf-8')
  362.             color = _g('CO')
  363.             effects = _g('EF')
  364.             charset = _g('CS')
  365.             family = _g('PF')
  366.             ralign = _g('RL')
  367.             if color is not None:
  368.                 
  369.                 try:
  370.                     color = int(msn.util.bgr_to_rgb(color), 16)
  371.                 except ValueError:
  372.                     color = None
  373.  
  374.                 r = (color & 16711680) >> 16
  375.                 g = (color & 65280) >> 8
  376.                 b = color & 255
  377.                 msg.color = (r, g, b)
  378.                 msg.r = r
  379.                 msg.g = g
  380.                 msg.b = b
  381.             
  382.             if charset is not None:
  383.                 msg.charset = int(charset, 16)
  384.             
  385.             if family is not None:
  386.                 msg.family = int(family)
  387.             
  388.             if ralign is not None:
  389.                 msg.rightalign = bool(int(ralign))
  390.             
  391.             if effects is not None:
  392.                 
  393.                 ef = lambda x: x in effects
  394.                 msg.bold = ef('B')
  395.                 msg.italic = ef('I')
  396.                 msg.underline = ef('U')
  397.                 msg.strike = ef('S')
  398.                 msg.effects = effects
  399.             
  400.         
  401.         return msg
  402.  
  403.     from_net = classmethod(from_net)
  404.     
  405.     def html(self):
  406.         if self._MSNTextMessage__html:
  407.             return self._MSNTextMessage__html
  408.         
  409.         tag = tag
  410.         import util.xml_tag
  411.         t = tag(u'font')
  412.         if self.fontname:
  413.             t[u'face'] = self.fontname
  414.         
  415.         if self.color:
  416.             t[u'color'] = u'#' + u''.join(map((lambda x: if not x:
  417. pass'%02x' % 0), self.color[:3]))
  418.         
  419.         if self.rightalign:
  420.             t[u'align'] = u'right'
  421.         
  422.         innermost = top = t
  423.         for attr in ('bold', 'italic', 'underline', 'strike'):
  424.             if getattr(self, attr):
  425.                 _tag = tag(attr[0])
  426.                 innermost += _tag
  427.                 innermost = _tag
  428.                 continue
  429.         
  430.         innermost._cdata = self.body
  431.         self._MSNTextMessage__html = top._to_xml(pretty = False).strip()
  432.         return self._MSNTextMessage__html
  433.  
  434.  
  435.