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

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