Skip to content
This repository has been archived by the owner on Mar 4, 2022. It is now read-only.

Commit

Permalink
v0.0.11.6 Contribuições da Vegga
Browse files Browse the repository at this point in the history
  • Loading branch information
Iuri Guilherme committed Jun 28, 2019
1 parent 369c111 commit 39da8f6
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 69 deletions.
6 changes: 4 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,7 @@
*~
*.cfg
*.py[cod]
venv
virtualenv
venv/
virtualenv/
Pipfile.lock

1 change: 1 addition & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ v0.0.8.2, 2018-06-01 -- Adicionando comando para enviar mensagens
v0.0.8.3, 2018-06-10 -- Acrescentando contribuições do ClimoBikeBot
v0.0.9.b, 2018-06-20 -- Dicionários everywhere
v0.0.11.3, 2018-09-07 -- Sincronizando MateBot com Vegga
v0.0.11.6, 2019-06-28 -- Arquivos de configuração
20 changes: 20 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
telepot = "*"
pypng = "*"
totalvoice = "*"
pytz = "*"
requests = "*"
dataset = "*"
PyMySQL = "*"
PyQRCode = "*"
Babel = "*"

[requires]
python_version = "3.5"
14 changes: 7 additions & 7 deletions config/matebot.cfg.example
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,25 @@ btc: 1AG2SX3n9iFQiZExiyS3M5qCuZT5GhArn
## o plugin 'telegram' nesta lista.
[plugins_listas]
## Lista de plugins ativos para todo mundo
geral: ["telegram","donate","feedback","qrencode","hashes"]
geral: ["telegram","donate","feedback","qrencode","hashes","archive","piplugin"]
## Plugins ativos somente para administrador
admin: ["admin","totalvoice","start","workrave","tesouro"]
## Plugins ativos somente para matehackers
matehackers: ["hackerspace"]
## Plugins ativos para configuração local
local: ["hackerspace"]

## Lista de usuários e grupos 'geral' não são necessárias, porque o controle de
## acesso 'geral' serve para todo e qualquer id de usuária(o) ou grupo.
## Inclua em 'local' todos ids de usuário e de grupos. Para descobrir o id,
## mande mensagem para o bot e observe o console.
## (Opcional) coloque em 'admin' o id do telegram da(o)s administradoras(es) do
## bot, e/ou de um ou mais grupo de administração do bot.
[plugins_usuarios]
admin: [1]
matehackers: [1,2,3,4]
workrave: [3]
tesouro: [4]
local: [1,2,3,4]

[plugins_grupos]
admin: [-1]
matehackers: [-2]
local: [-2,-3,-4]

## (Opcional) (Plugin) Totalvoice
[totalvoice]
Expand Down
92 changes: 61 additions & 31 deletions matebot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
## Documentação do telepot em https://telepot.readthedocs.io/en/latest/
## Documentação do matehackers em https://matehackers.org/

import os, json
import os, json, urllib3

try:
import configparser
Expand Down Expand Up @@ -35,39 +35,56 @@

class bot():

def __init__(self):
self.config_file = str("config/.matebot.cfg")
def __init__(self, mode, config_file):
self.config_file = u"config/.%s.cfg" % (config_file)
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)
print(log_str.info(u"O nosso token do @BotFather é '%s', os ids de usuária(o)s administradora(e)s são '%s' e os ids dos grupos administradores são '%s'. O nome de usuário da(o) administrador(a) é '%s'." % (self.config['botfather']['token'], json.loads(self.config.get('plugins_usuarios', 'admin')), json.loads(self.config.get('plugins_grupos', 'admin')), self.config['info']['telegram_admin'])))
except Exception as e:
print(log_str.err(str(u"Problema com o arquivo de configuração. Vossa excelência lerdes o manual antes de tentar usar este bot?\nO problema aparentemente foi o seguinte:\n%s %s\n\nCertificai-vos de que as instruções do arquivo README.md, seção 'Configurando' foram lidas e obedecidas.\nEncerrado abruptamente.\n\n" % (type(e), e))))
return
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), 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 init_telepot(self):
print(log_str.info(u"O nosso token do @BotFather é '%s', os ids de usuária(o)s administradora(e)s são '%s' e os ids dos grupos administradores são '%s'. O nome de usuário da(o) administrador(a) é '%s'." % (self.config['botfather']['token'], json.loads(self.config.get('plugins_usuarios', 'admin')), json.loads(self.config.get('plugins_grupos', 'admin')), self.config['info']['telegram_admin'])))
try:
self.bot = telepot.Bot(self.config['botfather']['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)))
return

self.log(log_str.info(u'Iniciando %s...' % (self.bot.getMe()['first_name'])))
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 1:
while True:
try:
self.matebot_local.loop()
except KeyboardInterrupt:
self.log(log_str.info(u'Gentilmente encerrando %s...' % (self.bot.getMe()['first_name'])))
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)))
self.log(log_str.err(u"%s morta(o) por exceção: %s" % (self.bot.getMe()['first_name'], e)))
raise
continue

Expand All @@ -83,14 +100,20 @@ def enviarMensagem(self, ids_list, reply='Nada.', parse_mode=None):
self.bot.sendMessage(ids_list[0], reply, parse_mode=str(parse_mode))
except telepot.exception.TelegramError as e:
self.log(log_str.err(u'Erro do Telegram tentando enviar mensagem para %s: %s' % (ids_list[0], e)))
if e.args[2]['error_code'] == 401:
if e.error_code == 401:
print(log_str.err(u'Não autorizado. Vossa excelência usou o token correto durante a configuração? Fale com o @BotFather no telegram e crie um bot antes de tentar novamente.'))
exit()
elif e.args[2]['error_code'] == 400:
limit = 4000
for chunk in [reply[i:i+limit] for i in range(0, len(reply), limit)]:
self.bot.sendMessage(ids_list[0], chunk, parse_mode=str(parse_mode))
elif e.args[2]['error_code'] == 403:
elif e.error_code == 400:
if e.description == 'Bad Request: message must be non-empty':
pass
elif e.description == 'Forbidden: bot was blocked by the user':
limit = 4000
for chunk in [reply[i:i+limit] for i in range(0, len(reply), limit)]:
self.bot.sendMessage(ids_list[0], chunk, parse_mode=str(parse_mode))
else:
self.bot.sendMessage(ids_list[1], u"Nao consegui enviar mensagem :(", parse_mode=str(parse_mode))
self.log(log_str.debug(u'Não consegui enviar %s para %s. Avisei %s' % (reply, ids_list[0], ','.join(str(ids_list[1])))))
elif e.error_code == 403:
mensagem = u'Eu não consigo te mandar mensagem aqui. Clica em @%s para ativar as mensagens particulares e eu poder te responder!' % (self.bot.getMe()['username'])
## Log [SEND]
try:
Expand All @@ -102,7 +125,7 @@ def enviarMensagem(self, ids_list, reply='Nada.', parse_mode=None):
self.bot.sendMessage(ids_list[1], mensagem, parse_mode=str(parse_mode))
except telepot.exception.TelegramError as e1:
self.log(log_str.err(u'Erro do Telegram tentando enviar mensagem para %s: %s' % (ids_list[1], e1)))
if e.args[2]['error_code'] == 400:
if e.error_code == 400 and e.description == 'Forbidden: bot was blocked by the user':
limit = 4000
for chunk in [reply[i:i+limit] for i in range(0, len(reply), limit)]:
self.bot.sendMessage(ids_list[1], chunk, parse_mode=str(parse_mode))
Expand All @@ -120,7 +143,7 @@ def enviarImagem(self, ids_list, params, parse_mode):
except Exception as e:
## Log [SEND]
self.log(log_str.err(u'Erro tentando enviar imagem para %s: %s' % (ids_list[0], e)))
if int(e.args[2]['error_code']) == 403:
if e.error_code == 403:
## Tenta enviar imagem para segunda opção
try:
if self.bot.sendPhoto(ids_list[1], photo=open(params['photo'][1], 'r'), caption=params['text']):
Expand All @@ -135,18 +158,18 @@ def log(self, reply):
if str(grupo_admin) != str(-1):
self.bot.sendMessage(grupo_admin, reply)
except telepot.exception.TelegramError as e:
if e.args[2]['error_code'] == 401:
print(log_str.err(u'Não autorizado. Vossa excelência usou o token correto durante a configuração? Fale com o @BotFather no telegram e crie um bot antes de tentar novamente.'))
if e.error_code == 401:
print(log_str.err(u"Não autorizado. Vossa excelência usou o token correto durante a configuração? Fale com o @BotFather no telegram e crie um bot antes de tentar novamente."))
exit()
if e.args[2]['error_code'] == 400:
print(log_str.debug(u'Grupo de admin incorreto ou não existe. Se a intenção era enviar mensagens de depuração e log para um grupo, então os dados no item "admin" da seção "plugins_grupos" do arquivo de configuração estão errados, incorretos, equivocados.\nExceção ao tentar enviar erro ao grupo de admin: %s' % (e)))
elif e.args[2]['error_code'] == 403:
print(log_str.debug(u'Fomos bloqueados pelo grupo de admin!\nExceção ao tentar enviar erro ao grupo de admin: %s' % (e)))
if e.error_code == 400:
print(log_str.debug(u"Grupo de admin não existe ou não fomos adicionados. Se a intenção era enviar mensagens de depuração e log para um grupo, então os dados no item 'admin' da seção 'plugins_grupos' do arquivo de configuração estão errados, incorretos, equivocados. Ou então nós nunca fomos adicionados no grupo, ou ainda fomos expulsos.\nExceção ao tentar enviar erro ao grupo de admin: %s" % (e)))
elif e.error_code == 403:
print(log_str.debug(u"Fomos bloqueados pelo grupo de admin!\nExceção ao tentar enviar erro ao grupo de admin: %s" % (e)))
else:
print(log_str.debug(u'Erro do Telegram tentando enviar mensagem para o grupo de admin: %s' % (e)))
print(log_str.debug(u"Erro do Telegram tentando enviar mensagem para o grupo de admin: %s" % (e)))
raise
except Exception as e:
print(log_str.debug(u'Exceção excepcional que não conseguimos tratar tampouco prever: %s' % (e)))
print(log_str.debug(u"Exceção excepcional que não conseguimos tratar tampouco prever: %s" % (e)))
raise

def rcv(self, msg):
Expand All @@ -158,16 +181,21 @@ def rcv(self, msg):
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 command_list[0][0] == '/':
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,
Expand All @@ -184,8 +212,10 @@ def rcv(self, msg):
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.
response.update(parse_mode = None)
## 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!"))
if str(response['type']) == 'nada':
pass
elif str(response['type']) == 'feedback':
Expand Down
74 changes: 48 additions & 26 deletions matebot/comandos.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,37 @@
def parse(args):
config = args['config']
try:
## TODO mover tudo isto para um formato ainda mais automático que permita o escalonamento de plugins
## TODO mover tudo isto para um formato ainda mais automático que permita o
## escalonamento de plugins
## TODO tentar entender o que eu quis dizer na frase acima
## TODO eu acho que eu quis dizer é que toda vez que se cria um bot novo,
## tem que inventar este arquivo tudo de novo. solução proposta fazer
## alguma coisa que sirva para todos hipotéticos bots, e este arquivo não
## precise ser editado pelo mantenedor da instância do bot.
plugins_disponiveis = json.loads(config['plugins_listas']['geral'])
plugins_admin = json.loads(config['plugins_listas']['admin'])
plugins_matehackers = json.loads(config['plugins_listas']['matehackers'])
plugins_local = json.loads(config['plugins_listas']['local'])

bot_dict = {'handle': u"matebot", 'name': u"MateBot"}
if 'bot' in args.keys():
bot_dict = {
'handle': args['bot'].getMe()['username'],
'name': args['bot'].getMe()['first_name'],
}
args.update(
{
'info_dict': dict(config.items('info')),
'bot_dict': {'handle': args['bot'].getMe()['username'], 'name': args['bot'].getMe()['first_name']},
'bot_dict': bot_dict,
'addr_dict': dict(config.items('donate')),
'plugins_list': plugins_disponiveis,
}
)
args.update(command_type = 'grupo')
if (int(args['chat_id']) > 0):
args.update(command_type = 'mensagem')

if not args['command_type'] == "curses":
args.update(command_type = 'grupo')
if (int(args['chat_id']) > 0):
args.update(command_type = 'mensagem')

except Exception as e:
raise
return {
Expand All @@ -39,24 +54,37 @@ def parse(args):
## Grupo de administração
if args['chat_id'] in json.loads(config['plugins_grupos']['admin']):
args.update(plugins_list = args['plugins_list'] + plugins_admin)
## Grupo Matehackers
if args['chat_id'] in json.loads(config['plugins_grupos']['matehackers']):
args.update(plugins_list = args['plugins_list'] + plugins_matehackers)
## Usuária(o)s Matehackers
if args['chat_id'] in json.loads(config['plugins_usuarios']['matehackers']):
args.update(plugins_list = args['plugins_list'] + plugins_matehackers)
## Grupo comum
## Grupos inseridos por configuração local
if args['chat_id'] in json.loads(config['plugins_grupos']['local']):
args.update(plugins_list = args['plugins_list'] + plugins_local)
## Usuária(o)s inserida(o)s por configuração local
if args['chat_id'] in json.loads(config['plugins_usuarios']['local']):
args.update(plugins_list = args['plugins_list'] + plugins_local)
## Outro grupo
if int(args['chat_id']) < 0:
pass
## Usuário comum
## Outra(o) usuária(o)
if int(args['chat_id']) > 0:
pass

comando = str(args['command_list'].split(' ')[0].split('/', 1)[1].split('@', 1)[0])


## TODO Comentando jeito antigo
# comando = str(args['command_list'].split(' ')[0].split('/', 1)[1].split('@', 1)[0])
comando = str(args['command_list'].split(' ')[0])
## TODO presumindo telegram
if not args['command_type'] == "curses":
comando = str(comando.split('/', 1)[1].split('@', 1)[0])
args.update(command_list = args['command_list'].split(' ')[1::])

response = u"Vossa excelência não terdes autorização para usar este comando, ou o comando não existe."
debug = u"Nada aconteceu. args: %s" % (str(args))

for plugin in args['plugins_list']:
try:
return getattr(importlib.import_module('.'.join(['plugins', plugin])), comando)(args)
## TODO Usar a linha abaixo assim que todos comandos forem atualizados
# return getattr(importlib.import_module('.'.join(['plugins', plugin])), '_'.join([u"cmd", comando]))(args)
except AttributeError as e:
print(log_str.err(e))
pass
Expand All @@ -65,19 +93,13 @@ def parse(args):
pass
except Exception as e:
raise
return {
'status': False,
'type': 'erro',
'response': u'Erro processando o comando. Os desenvolvedores foram ou deveriam ter sido avisados.',
'debug': u'Exceção %s, command_list: %s' % (str(e), str(args['command_list'])),
'multi': False,
'parse_mode': None,
}
response = u"Erro processando o comando. Os desenvolvedores foram ou deveriam ter sido avisados."
debug = u"Exceção %s, command_list: %s" % (str(e), str(args['command_list']))
return {
'status': False,
'type': 'erro',
'response': u'Vossa excelência não terdes autorização para usar este comando, ou o comando não existe.',
'debug': u'Nada aconteceu. command_list: %s' % (str(args['command_list'])),
'type': "erro",
'response': response,
'debug': debug,
'multi': False,
'parse_mode': None,
}
Expand Down
9 changes: 7 additions & 2 deletions matebot/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ def loop_blog(self):
pass

def loop(self):
time.sleep(datetime.timedelta(days=1).total_seconds())
self.loop_blog()
try:
time.sleep(datetime.timedelta(days=1).total_seconds())
# self.loop_blog()
print(u"Terminou mais um loop")
except Exception as e:
print(log_str.debug(e))
pass

0 comments on commit 39da8f6

Please sign in to comment.