Code Monkey home page Code Monkey logo

siege-telegram-bot's Introduction

SIEGE Bot - Sistema Inteligente de Ensino de Geografia para o Telegram
by Micael Levi

Sobre a base de conhecimento em src/brain/prolog-controller/database

Os fatos disponíveis nos programas dispostos neste diretório são:

  • regiao(?Nome:string, ?QuantidadeEstados:int)
  • estado(?Nome:string, ?Sigla:string, ?NomeRegiao:string, ?NomeCapital:string)
  • tamanho(-EstadosEAreas:list(NomeEstado-Area))
  • municipio(?Nome:string, ?NomeEstado:string)
  • questao(?Pergunta:string, -RespostaDada:string, -UsernameAutor:string, -IdAutor:int, -Votos:int, -Ano:int)

Pensando nos fatos em termos de tabela, o esquema do banco de conhecimentos fica da seguinte forma no modelo relacional:

diagrama RIR

Visão geral da estrutura

estrutura


Instalação e Execução

crie um bot
    @BotFather    
instale clone este repositório
  git clone https://github.com/micalevisk/siege-telegram-bot  
🙏
    npm install    
  1. Altere o nome do arquivo .env.example para .env;
  2. Altere o conteúdo do arquivo renomeado para adicionar o token do seu bot (recuperado ao criar o bot);
  3. Execute npm start no terminal.

Perguntas que serão respondidas

As perguntas listadas a seguir contém apenas sentenças que o bot entenderá (InSeNsÍvEl aO cAsO)

  • as perguntas tenta ser o mais breve possível (sem gerar ambiguidade)
  • algumas palavras podem ser substituídas por seus sinônimos mais comuns (além de versões sem acentuação)
  • palavras entre colchetes indicam que estes são opcionais; a barra indica uma alternativa
  • os substantivos próprios devem iniciar em maiúsculo (como manda a gramática)
  • palavras em destaque são consideradas "variáveis"; representam apenas o conceito
  • a interrogação no final da pergunta é indiferente para a compreensão do bot
  • espaços excedentes são ignorados
  1. qual [é] [a] capital/sede/metrópole do/de/da Estado
  2. Município é [a] capital/sede/metrópole de qual/algum estado?
  3. Município é [a] capital/sede/metrópole do/de/da Estado
  4. Existe/Há algum estado cuja [a] capital/sede/metrópole tem/possua o mesmo nome do estado?
  5. O [estado [do/de/da]] Estado tem/possui quantas/quantos cidades/municípios?
  6. Estado/Município está/fica [localizado] em qual/que região?

Consultas para as perguntas (implementadas)

  • O símbolo '+' indica que a variável (que segue) deve ser uma entrada, i.e., ter valor.
  • As querys terminadas com ponto final já estão no formato exato, i.e., estão prontas para serem executadas.
no. query
1 capital(+Estado, NC)
2 capital(NE, +Município)
3 capital(+Estado, +Município)
4 findall(E, capital(E,E), +Quais), list_nonempty(+Quais, +Existe)
14 municipios(+Estado, Municipios), length(Municipios, QtdMunicipios)
17 regiao_de(+Nome, Regiao)

siege-telegram-bot's People

Contributors

micalevisk avatar

Watchers

 avatar

siege-telegram-bot's Issues

Alterar uso do comando "cancelar"

Como o comando /cancelar só está sendo utilizado quando o bot espera uma resposta (dada) do usuário, seria interessante usar uma mensagem de aviso de espera (em vez do alerta) e o inline-keyboards nessa mensagem.

Assim, além de editar a mensagem enviada para remover as (3) opções dadas (após a seleção da opção "ensinar"), editar o conteúdo de "Não sei te responder...\nmas você pode me ensinar, se quiser." para "😀 Opa! Estou esperando a sua resposta, tudo bem?" junto com a opção para cancelar tal espera.

Seria preciso remover o uso desse alerta para evitar redundância, em:

bot.action('ensinar', (ctx) => {
ctx.session.esperando_msg = true
return ctx.answerCbQuery('😀 Opa! Estou esperando a sua resposta, tudo bem?', true)
.then(() => ctx.editMessageText(ctx.session.ultima_resposta_dada, Extra.HTML()))
.catch((err) => {
ctx.session.esperando_msg = false
console.log('[bot-ensinar::error]', err)
return ctx.editMessageText('Desculpe, perdi sua mensagem...\n<b>Não</b> estou esperando sua resposta')
})
})

Melhorar usabilidade (conhecimento externo)

Uma forma de aumentar o acesso às perguntas do "conhecimento externo" seria, caso não encontre uma pergunta que case exatamente com a de alguma do conhecimento externo, procurar a que melhor se aproxima da intenção do usuário. Assim, a resposta que o bot dará seria algo como "você quis dizer ...".

Adicionar votação "segura"

Atualmente o sistema não evita votos repetidos de um usuário sobre a mesma pergunta [do conhecimento externo].

Deve-se pensar em uma estratégia que melhor se adeque ao sistema.
Uma ideia seria adicionar mais um atributo (uma lista) na Questao para inserir os ids dos usuários que já votaram nela

vide

%% questao(?Pergunta:string, +RespostaDada:string, +UsernameAutor:string, +IdAutor:int, +Votos:int, +Ano:int)

Adicionar opção para remoção da resposta dada

Por enquanto o autor de uma resposta dada não pode removê-la -- o que seria interessante.
Uma ideia para adicionar tal opção seria na própria resposta que o bot retorna quando o autor de uma resposta dada (conhecimento externo) realiza sua pergunta, como um [Inline keyboards], por exemplo:
inline-keyboards
eg

implementar classe RivescriptController

Para adicionar mais uma camada de abstração

  • vide o prolog-controller como exemplo
  • alterar o index.js main e do brain (atributos e uso inadequado de métodos do RS) visando a implementação

Não está tratando casos onde o usuário não possui username/nick

Em

^ atomics_to_string(["__[", Ano, "]__\n", "De acordo com @@", UsernameAutor, "@:\n\n", RT], RespostaDada)

rsBrain.setUservar(username, 'id', id)

deve-se tratar menções a usuários que não possuem username.

Em vez de salvar o nick, caso não existe, salvar o first_name.

pensar em como o bot pode enviar uma mensgem mencionando um usuário sem username

(Re)organizar módulos

As dependências desenvolvidas parecem estar desorganizadas e a estrutura atual não está visualmente/convecionalmente agradável. Seria interessante repensar na estrutura física e/ou arquitetura...

Em relação ao código, por fim, deve-se refatorar as funções (principalmente as utilitárias) visando o paradigma Funcional. Além de remover as funções que não estão sendo utilizadas pelo sistema.

criar testes

criar testes unitários para verificar as intenções em queries.rives; i.e., checar se estão saindo com as consultas corretas

Inserir documentação útil

No README principal, para expor a lógica do sistema, seria interessante:

  • inserir diagramas de sequência (e/ou atividade)
  • fazer/inserir benchmarks para verificar o tempo de resposta com e sem parser final (da resposta do RiveScript)
    ...

criar arquivo sinonimos.rive

arquivo que contém apenas declarações de arrays que podem ser usados nos padrões para apresentar alternativas (sinônimos ou palavras sem acentos)

Definir Intents

verificar nova arquitetura e definir as intents de acordo com as perguntas que o bot responde (prever inserção de novas)

fix manipulação dos conhecimentos externos

Os erros observados nas linhas:

console.log('~>>>', res) // FIXME: inserção da questão não está sendo escrito

console.log('->>>', res) // FIXME: alteração de VOTOS não está sendo escrita

são causados por causa do uso da regra absolute_file_name/2 do Swi-Prolog, que gera o caminho incorreto para o arquivo fatos_dinamicos.pl.lock.
Notei que o caminho gerado é o da raiz (sige-telegram-bot/) pois é o diretório do index.js que inicia todo o sistema...

absolute_file_name('fatos_dinamicos.pl.lock', Abs),

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.