O desafio
O objetivo deste desafio é criar um chatbot que possa ser executado nas salas de chat do Stack Exchange. Seu bot precisa ser capaz de detectar quando comandos específicos são postados por um usuário e responder a ele. Esta é a lista de comandos e o que seu bot deve fazer:
!!newest
: gera o título (sem link, mas o título) da pergunta mais recente publicada neste site (codegolf.SE).!!metanewest
: gera o título da pergunta mais recente publicada no site meta (meta.codegolf.SE).!!questioncount
: gera a contagem atual de perguntas.!!metaquestioncount
: gera a contagem de perguntas atual no meta site.!!tag tagname
: gera o trecho da tag (a breve descrição) da tag fornecida como o primeiro parâmetro.!!metatag tagname
: o mesmo que acima, mas para o meta site.!!featured
: gera a contagem de perguntas que atualmente possuem uma recompensa.!!metafeatured
: gera a contagem de perguntas que possuem a tag [featured] no Meta.
Regras
- Você deve escrever um programa completo, não um trecho ou função.
- Caso seja necessário, você pode solicitar nome de usuário e senha como entrada (solicitando entrada, STDIN, argumentos da linha de comando). Isso será necessário se você usar, por exemplo, Python ou Ruby, mas não será necessário se você usar JavaScript e executar o script na própria página da sala de bate-papo.
- Você tem permissão para usar bibliotecas externas para fazer coisas como WebSockets. Essas bibliotecas não precisam contar para a contagem de caracteres.
Você pode usar um invólucro de bate-papo externo (mas não é necessário, escrever o seu próprio é incentivado) e, em seguida, é necessário contar a contagem de caracteres. Você também não tem permissão para alterar o código do wrapper. Se você usá-lo, use-o sem modificações e todos os caracteres deverão ser contados (isso é uma penalidade por não escrever seu próprio invólucro).
Somente o código do wrapper em si precisa contar. Se houver outros arquivos, como exemplos, eles não precisam contar.
- Não há uso de encurtadores de URL ou de outras maneiras que os tornem mais curtos: o desafio é jogar no chatbot, não jogar no URL.
- Não há solicitações da web, exceto as necessárias para conversar e obter as informações necessárias para responder aos comandos.
- O uso das "brechas" padrão não é permitido.
- Se alguém postar um comando, você precisa responder com uma mensagem de chat deste formato:
@user response
. Então, se eu escrever o comando!!featured
e houver 5 perguntas em destaque, seu bot deverá postar@ProgramFOX 5
. - Se eu testar seu bot, executarei na minha conta do chatbot e nesta sala de bate-papo . Sempre testarei os bots nessa sala, portanto, não é necessário fornecer o ID da sala como entrada, sempre será 14697. Esse ID não será fornecido como entrada, deve ser codificado.
- Se o comando não for encontrado, produza
@user The command [command] does not exist
. Substitua[command]
pelo nome do comando não existente. Se argumentos forem fornecidos ao comando, não os produza, apenas o nome do comando. - Se um comando tiver muitos argumentos, ignore os argumentos que não são necessários.
- Se um comando não tiver argumentos suficientes, produza
@user You have not provided enough arguments
- O sistema impede que mensagens duplicadas sejam postadas dentro de um curto período de tempo. Portanto, ao testar seu bot, nunca executarei dois comandos que fornecem a mesma saída sucessivamente (o que significa que você não precisa implementar um sistema que torne as mensagens diferentes se forem duplicadas, adicionando um ponto, por exemplo).
- O sistema evita que muitas mensagens sejam postadas em um curto intervalo de tempo; portanto, ao testar, nunca enviarei muitos comandos em um curto intervalo de tempo, o que significa que seu bot não precisa cuidar disso (aguardando algum tempo) antes de postar, por exemplo).
- Isso é código-golfe , o programa com a menor quantidade de bytes vence.
Começando
Aqui estão algumas informações para começar a escrever seu bot. Você não precisa usar isso, mas pode ser uma orientação.
- Para fazer login, primeiro faça login em um provedor OpenID. Sempre será OpenID da pilha (Exchange Exchange
https://openid.stackexchange.com
). O formulário de login está localizado emhttps://openid.stackexchange.com/account/login
e fornece o nome de usuário e a senha. - Em seguida, faça o login em
stackexchange.com
. O formulário de login está localizado emhttps://stackexchange.com/users/login
. Escolha Stack Exchange como provedor OpenID. - Depois de fazer isso, faça login para conversar. O formulário de login para isso está localizado em
http://stackexchange.com/users/chat-login
. Escolha Stack Exchange como provedor OpenID. - Então você precisa obter o seu
fkey
. Para isso, acessehttp://chat.stackexchange.com/chats/join/favorite
e obtenha ofkey
de um campo de entrada oculto. - Para postar uma mensagem, envie uma solicitação
http://chat.stackexchange.com/chats/14697/messages/new
e forneça dois parâmetros POST: umtext
parâmetro que contém o texto da mensagem e umfkey
parâmetro que contém ofkey
. Para ver quando uma nova mensagem é postada, você pode usar o WebSockets (mas não precisa, fique à vontade para usar outra coisa, se for mais curta). Por favor, veja esta resposta do Meta Stack Exchange :
Bate-papo
(wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)
O hash pode ser buscado postando o ID da sala e fkey para
http://chat.stackexchange.com/ws-auth
O timethingy é a chave de tempo do json retornado por
/chats/<roomno>/events
.O ID do evento quando uma mensagem é publicada é
1
.- É útil examinar os wrappers de bate-papo existentes, como StackExchange-Chatty da Doorknob e ChatExchange da Manishearth , para ver como ele funciona exatamente.
metafeatured
significaria perguntas bountied na meta, mas ... obrigado :-)