def init_cli(self): print(log_str.info(u"Iniciando em modo interativo...")) try: stdscr = curses.initscr() self.log_cli(stdscr, log_str.info(u"Iniciando %s...\n" % (u"MateBot"))) self.matebot_local = local.local({ 'mode': "cli", 'config': self.config }) except Exception as e: print(log_str.debug(u"Excecao: %s\nEncerrando abruptamente." % (e))) exit() while True: try: if self.matebot_local.loop_cli(stdscr) > 0: self.cli_croak(stdscr) return else: stdscr.addstr(u"\n") stdscr.refresh() except KeyboardInterrupt: self.cli_croak(stdscr) return except Exception as e: self.cli_croak(stdscr) print( log_str.err(u"%s morta(o) por exceção: %s" % (u"MateBot", e))) raise continue
def init_telepot(self): print(log_str.info( u"O nosso token do @BotFather é '{}', \ os ids de usuária(o)s administradora(e)s são '{}'. \ O nome de usuário da(o) administrador(a) é '{}'.".format( self.config['token'], self.config['users']['alpha'], self.config['info']['admin']) )) try: self.bot = telepot.Bot(self.config['token']) ## TODO Reler o manual do telepot e fazer uma coisa mais inteligente self.bot.message_loop(self.rcv) except Exception as e: self.log(log_str.err(u"Erro do Telegram/Telepot: %s\nEncerrando abruptamente." % (e))) exit() try: print(log_str.info(u"Iniciando %s..." % (self.bot.getMe()['first_name']))) self.log(log_str.info(u"%s online!" % (self.bot.getMe()['first_name']))) except Exception as e: print(log_str.err(u"Problema de conexão. Verifique se este computador está conectado na rede.\nExceção: %s" % (e))) raise self.matebot_local = local.local({'config':self.config,'bot':self.bot}) while True: try: self.matebot_local.loop() except KeyboardInterrupt: self.log(log_str.info(u"Gentilmente encerrando %s..." % (self.bot.getMe()['first_name']))) return except Exception as e: self.log(log_str.err(u"%s morta(o) por exceção: %s" % (self.bot.getMe()['first_name'], e))) raise continue
def __init__(self, mode, config_file): self.config_dir = 'instance' ## Compatiblidade com v0.0.13 # ~ if not os.path.isdir(self.config_dir): # ~ print(log_str.warn( # ~ u"""O diretório 'instance' não existe. O diretório 'config' não vai \ # ~ mais ser utilizado nas próximas versões. Leia o README.md e atualize o \ # ~ arquivo de configuração.""")) # ~ self.config_dir = 'config' # ~ self.config_file = u"%s/.%s.cfg" % (self.config_dir, config_file) # ~ if not os.path.isfile(self.config_file): # ~ print(log_str.err( # ~ u"""Problema com o arquivo de configuração.\nVossa excelência lerdes o \ # ~ manual antes de tentar usar este bot?\nCertificai-vos de que as \ # ~ instruções do arquivo README.md, seção 'Configurando' foram lidas e \ # ~ obedecidas.\nEncerrando abruptamente.""")) # ~ exit() try: from instance.config import Config config = Config() self.config = config.bots[config_file] except Exception as e: print(log_str.debug(str(e))) self.config = None ## Compatibilidade com v0.0.14 if self.config is None: try: self.config = configparser.ConfigParser() except NameError: self.config = ConfigParser.ConfigParser() print(log_str.info(u"Tentando iniciar MateBot...")) try: self.config.read(self.config_file) except Exception as e: try: self.config_file = u"config/.%s.cfg" % (config_file) self.config = configparser.ConfigParser() self.config.read(self.config_file) except Exception as e: print(log_str.err( u"""Problema com o arquivo de configuração.\nVossa excelência lerdes o \ manual antes de tentar usar este bot?\nCertificai-vos de que as \ instruções do arquivo README.md, seção 'Configurando' foram lidas e \ obedecidas.\nEncerrando abruptamente.\nMais informações: %s %s""" % (type(e), str(e)))) exit() self.interativo = 0 ## TODO usar getattr if mode == "telepot": self.init_telepot() # elif mode == "cli": # self.init_cli() else: ## TODO mudar esta frase quando esta informação se tornar incorreta print(log_str.info(u"Por enquanto o único modo de operação é telepot")) exit()
def cli_croak(self, stdscr): self.log_cli( stdscr, log_str.info(u"Gentilmente encerrando %s..." % (u"MateBot"))) curses.nocbreak() stdscr.keypad(False) curses.echo() curses.endwin() print(log_str.info(u"Tchau!"))
def rcv(self, msg): # self.log(log_str.rcv(str(msg['chat']['id']), str(msg))) self.log(log_str.rcv(str(msg['chat']['id']), json.dumps(msg, sort_keys=True, indent=2))) glance = telepot.glance(msg) if glance[0] == 'text': chat_id = self.config['users']['alpha'][0] command_list = list() try: from_id = int(msg['from']['id']) chat_id = int(msg['chat']['id']) message_id = int(msg['message_id']) command_list = msg['text'] except Exception as e: self.log(log_str.err(u'Erro do Telepot tentando receber mensagem: %s' % (e))) if self.interativo > 0: args.update automatico(args) elif command_list[0][0] == '/': self.log(log_str.cmd(command_list)) response = comandos.parse( { 'chat_id': chat_id, 'from_id': from_id, 'message_id': message_id, 'command_list': command_list, 'bot': self.bot, 'config': self.config, 'command_type': 'grupo', } ) try: ## Log if str(response['type']) == 'erro': self.log(log_str.err(response['debug'])) elif str(response['type']) == 'feedback': self.log('#feedback enviado de %s por %s:\n\n%s' % (chat_id, from_id, response['feedback'])) elif str(response['type']) == "whisper": self.log('#whisper enviado de %s por %s para %s:\n\n%s' % (chat_id, from_id, response['to_id'], response['response'])) else: self.log(log_str.info(response['debug'])) ## Enviando resultado do comando ## TODO solução temporária, isto serve para controlar exibição em HTML ou Markdown. ## TODO https://core.telegram.org/bots/api#sendmessage if not 'parse_mode' in response: response.update(parse_mode = None) print(log_str.debug(u"parse_mode nao exisitia!")) ## TODO mais solução temporária if not 'reply_to_message_id' in response: response.update(reply_to_message_id = False) print(log_str.debug(u"reply_to_message_id nao exisitia!")) if str(response['type']) == 'nada': self.log(u"#nada\n\nresponse:\n%s\n\ndebug:\n%s" % (response['response'], response['debug'])) pass elif str(response['type']) == 'feedback': self.enviarMensagem([chat_id, chat_id], response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == "image": self.enviarImagem((chat_id, chat_id), response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == 'qrcode': self.enviarImagem((chat_id, chat_id), response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == 'video': self.log(log_str.info(response['debug'])) elif str(response['type']) == 'mensagem': if response['multi']: for chunk in response['response'].split('$$$EOF$$$'): self.enviarMensagem([chat_id, chat_id], chunk, response['parse_mode'], response['reply_to_message_id']) else: self.enviarMensagem([from_id, chat_id], response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == 'grupo': if response['multi']: for chunk in response['response'].split('$$$EOF$$$'): self.enviarMensagem([chat_id, chat_id], chunk, response['parse_mode'], response['reply_to_message_id']) else: self.enviarMensagem([chat_id, chat_id], response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == 'erro': self.enviarMensagem([chat_id, chat_id], response['response'], response['parse_mode'], response['reply_to_message_id']) elif str(response['type']) == 'whisper': self.enviarMensagem([response['to_id'], chat_id], response['response'], response['parse_mode'], False) elif str(response['type']) == 'comando': ## TODO não lembro qual era a relevância disto # mensagem = comandos.parse(chat_id, from_id, [''.join(['/', response['response'][0]]), response['response'][1:]]) self.enviarMensagem([chat_id, from_id], mensagem['response'], response['parse_mode'], response['reply_to_message_id']) else: self.enviarMensagem([str(self.config['users']['alpha'][0]), str(self.config['users']['alpha'][0])], log_str.debug(response['debug']), response['parse_mode'], response['reply_to_message_id']) except Exception as e: raise self.log(log_str.debug(u'%s de %s para %s falhou.\nResponse: %s\nException: %s' % (command_list, from_id, chat_id, response, e)))