123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #-*- coding: utf-8 -*-
- #
- # author : Djeman
- # Updated by Shani-08 (https://github.com/Shani-08/ShaniXBMCWork2)
-
- import re
-
- class AADecoder(object):
- def __init__(self, aa_encoded_data):
- self.encoded_str = aa_encoded_data.replace('/*´∇`*/','')
-
- self.b = ["(c^_^o)", "(゚Θ゚)", "((o^_^o) - (゚Θ゚))", "(o^_^o)",
- "(゚ー゚)", "((゚ー゚) + (゚Θ゚))", "((o^_^o) +(o^_^o))", "((゚ー゚) + (o^_^o))",
- "((゚ー゚) + (゚ー゚))", "((゚ー゚) + (゚ー゚) + (゚Θ゚))", "(゚Д゚) .゚ω゚ノ", "(゚Д゚) .゚Θ゚ノ",
- "(゚Д゚) ['c']", "(゚Д゚) .゚ー゚ノ", "(゚Д゚) .゚Д゚ノ", "(゚Д゚) [゚Θ゚]"]
-
- def is_aaencoded(self):
- idx = self.encoded_str.find("゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); ")
- if idx == -1:
- return False
-
- if self.encoded_str.find("(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');", idx) == -1:
- return False
-
- return True
-
- def base_repr(self, number, base=2, padding=0):
- digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- if base > len(digits):
- base = len(digits)
-
- num = abs(number)
- res = []
- while num:
- res.append(digits[num % base])
- num //= base
- if padding:
- res.append('0' * padding)
- if number < 0:
- res.append('-')
- return ''.join(reversed(res or '0'))
-
- def decode_char(self, enc_char, radix):
- end_char = "+ "
- str_char = ""
- while enc_char != '':
- found = False
-
- if not found:
- for i in range(len(self.b)):
- enc_char=enc_char.replace(self.b[i], str(i))
-
- startpos=0
- findClose=True
- balance=1
- result=[]
- if enc_char.startswith('('):
- l=0
-
- for t in enc_char[1:]:
- l+=1
- if findClose and t==')':
- balance-=1;
- if balance==0:
- result+=[enc_char[startpos:l+1]]
- findClose=False
- continue
- elif not findClose and t=='(':
- startpos=l
- findClose=True
- balance=1
- continue
- elif t=='(':
- balance+=1
-
-
- if result is None or len(result)==0:
- return ""
- else:
-
- for r in result:
- value = self.decode_digit(r, radix)
- if value == "":
- return ""
- else:
- str_char += value
-
- return str_char
-
- enc_char = enc_char[len(end_char):]
-
- return str_char
-
-
-
- def decode_digit(self, enc_int, radix):
-
- rr = '(\(.+?\)\))\+'
- rerr=enc_int.split('))+')
- v = ''
-
- #new mode
-
- for c in rerr:
-
- if len(c)>0:
- if c.strip().endswith('+'):
- c=c.strip()[:-1]
-
- startbrackets=len(c)-len(c.replace('(',''))
- endbrackets=len(c)-len(c.replace(')',''))
-
- if startbrackets>endbrackets:
- c+=')'*startbrackets-endbrackets
-
- c = c.replace('!+[]','1')
- c = c.replace('-~','1+')
- c = c.replace('[]','0')
-
- v+=str(eval(c))
-
- return v
-
- mode = 0
- value = 0
-
- while enc_int != '':
- found = False
- for i in range(len(self.b)):
- if enc_int.find(self.b[i]) == 0:
- if mode == 0:
- value += i
- else:
- value -= i
- enc_int = enc_int[len(self.b[i]):]
- found = True
- break
-
- if not found:
- return ""
-
- enc_int = re.sub('^\s+|\s+$', '', enc_int)
- if enc_int.find("+") == 0:
- mode = 0
- else:
- mode = 1
-
- enc_int = enc_int[1:]
- enc_int = re.sub('^\s+|\s+$', '', enc_int)
-
- return self.base_repr(value, radix)
-
- def decode(self):
-
- self.encoded_str = re.sub('^\s+|\s+$', '', self.encoded_str)
-
- # get data
- pattern = (r"\(゚Д゚\)\[゚o゚\]\+ (.+?)\(゚Д゚\)\[゚o゚\]\)")
- result = re.search(pattern, self.encoded_str, re.DOTALL)
- if result is None:
- print "AADecoder: data not found"
- return False
-
- data = result.group(1)
-
- # hex decode string
- begin_char = "(゚Д゚)[゚ε゚]+"
- alt_char = "(o゚ー゚o)+ "
-
- out = ''
-
- while data != '':
- # Check new char
- if data.find(begin_char) != 0:
- print "AADecoder: data not found"
- return False
-
- data = data[len(begin_char):]
-
- # Find encoded char
- enc_char = ""
- if data.find(begin_char) == -1:
- enc_char = data
- data = ""
- else:
- enc_char = data[:data.find(begin_char)]
- data = data[len(enc_char):]
-
-
- radix = 8
- # Detect radix 16 for utf8 char
- if enc_char.find(alt_char) == 0:
- enc_char = enc_char[len(alt_char):]
- radix = 16
-
- str_char = self.decode_char(enc_char, radix)
-
- if str_char == "":
- print "no match : "
- print data + "\nout = " + out + "\n"
- return False
-
- out += chr(int(str_char, radix))
-
- if out == "":
- print "no match : " + data
- return False
-
- return out
|