Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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)