def match_rule(rule, expression, pre_context, post_context): symbols = {} aeval = Interpreter() if not obtain_symbols(symbols,rule[1],expression): return False if not obtain_symbols(symbols,rule[0],pre_context): return False if not obtain_symbols(symbols,rule[2],post_context): return False aeval.symtable = symbols if rule[3] != None: conditions = rule[3].replace(" ","").split(",") for cond in conditions: if not aeval(cond): return False sfinal = "" res_split = split_symbols(rule[4]) for r in res_split: if r.find("(")>=0: sfinal += r[:r.find("(")+1] temp = aeval(r[r.find("(")+1:-1]) if type(temp)==tuple: sfinal += str(temp[0]) for t in temp[1:]: sfinal += "," sfinal += str(t) else: sfinal += str(temp) sfinal += ")" else: sfinal += r return sfinal
def match_rule(rule, expression, pre_context, post_context): symbols = {} aeval = Interpreter() if not obtain_symbols(symbols, rule[1], expression): return False if not obtain_symbols(symbols, rule[0], pre_context): return False if not obtain_symbols(symbols, rule[2], post_context): return False aeval.symtable = symbols if rule[3] != None: conditions = rule[3].replace(" ", "").split(",") for cond in conditions: if not aeval(cond): return False sfinal = "" res_split = split_symbols(rule[4]) for r in res_split: if r.find("(") >= 0: sfinal += r[:r.find("(") + 1] temp = aeval(r[r.find("(") + 1:-1]) if type(temp) == tuple: sfinal += str(temp[0]) for t in temp[1:]: sfinal += "," sfinal += str(t) else: sfinal += str(temp) sfinal += ")" else: sfinal += r return sfinal
def evaluate(bot, update, bot_globals, cmd=None, symbols=None): """safely evaluates simple python code and generates plots""" def no_flood(u): bot_globals['last_commands'][u] = time.time() - bot_globals['MESSAGE_TIMEOUT'] * 2 global INTERPRETERS user = update.message.from_user message_user = user.username if user.username is not None else user.name err = 'Invalid input:\n\n' expr = cmd if cmd else clean(update.message.text) if expr == '': update.message.text = '/eval_info' + bot.name.lower() no_flood(message_user) call_macro(bot, update, bot_globals) return if len(expr) > EVAL_MAX_INPUT: update.message.reply_text(err + 'Maximum input length exceeded.') return name = update.message.from_user.name interp = Interpreter(max_time=100000) if EVAL_MEMORY and name in INTERPRETERS.keys(): interp.symtable = {**INTERPRETERS[name], **Interpreter().symtable} bot_globals['logger'].debug('Loaded interpreter "{}": {}'.format(name, INTERPRETERS[name])) quoted = update.message.reply_to_message preceding = '' if quoted is None else quoted.text them = '' if quoted is None else quoted.from_user.name if not symbols: symbols = {} chat = update.message.chat symbols = {**symbols, **{'MY_NAME': name, 'THEIR_NAME': them, 'PRECEDING': preceding, 'GROUP': (chat.title if chat.username is None else '@' + chat.username), 'REPLY': True, 'TIME': tuple(datetime.now().timetuple()), 'gamma': gamma}} interp.symtable = {**interp.symtable, **symbols} timeout = MOD_TIMEOUT if is_mod(message_user) else EVAL_TIMEOUT with stopit.ThreadingTimeout(timeout): result = interp(expr) str_result = str(result).strip() if 'PLOT_TYPE' in interp.symtable.keys() and isinstance(interp.symtable['PLOT_TYPE'], str): plot_type = interp.symtable['PLOT_TYPE'] plot_args = interp.symtable['PLOT_ARGS'] if 'PLOT_ARGS' in interp.symtable.keys() and \ isinstance(interp.symtable['PLOT_ARGS'], tuple) else tuple() plot_kwargs = interp.symtable['PLOT_KWARGS'] if 'PLOT_KWARGS' in interp.symtable.keys() and \ isinstance(interp.symtable['PLOT_KWARGS'], dict) else dict() if plot_type in {'plot', 'scatter', 'contour', 'hist', 'contourf'}: try: getattr(plt, plot_type)(*plot_args, **plot_kwargs) plt.savefig('temp.jpeg') plt.clf() except Exception as e: del interp.symtable['PLOT_TYPE'] str_result = err + 'Error in pyplot: ' + e.__class__.__name__ else: del interp.symtable['PLOT_TYPE'] str_result = err + 'Unsupported plot type.' elif 'PLOT_TYPE' in interp.symtable.keys(): del interp.symtable['PLOT_TYPE'] str_result = err + 'Plot type must be a string.' reply = interp.symtable['REPLY'] if EVAL_MEMORY and cmd is None and not any(p in set(interp.symtable.keys()) for p in ('PLOT_TYPE', 'PLOT_ARGS', 'PLOT_KWARGS')): INTERPRETERS[name] = {k: v for k, v in interp.symtable.items() if k not in Interpreter().symtable.keys() and k not in symbols.keys()} bot_globals['logger'].debug('Saved interpreter "{}": {}'.format(name, INTERPRETERS[name])) errors = set([e.get_error()[0] for e in interp.error]) if errors: update.message.reply_text(text=err + ' ,'.join(errors)) else: if len(str_result) > EVAL_MAX_OUTPUT: str_result = str_result[:EVAL_MAX_OUTPUT] + '...' if 'PLOT_TYPE' in interp.symtable.keys(): if result is None: str_result = '' if reply: if quoted is None: update.message.reply_photo(photo=open('temp.jpeg', 'rb'), caption=str_result) else: quoted.reply_photo(photo=open('temp.jpeg', 'rb'), caption=str_result) else: bot.send_photo(photo=open('temp.jpeg', 'rb'), caption=str_result, chat_id=update.message.chat.id) else: if not str_result: str_result = 'None' if reply: if quoted is None: update.message.reply_text(text=str_result) else: quoted.reply_text(text=str_result) else: bot.send_message(text=str_result, chat_id=update.message.chat.id)