El reto
El objetivo de este desafío es crear un chatbot que pueda ejecutarse en las salas de chat de Stack Exchange. Su bot debe poder detectar cuándo un usuario publica comandos específicos y responder a ellos. Esta es la lista de comandos y lo que debe hacer su bot:
!!newest
: muestra el título (sin enlace, pero el título) de la última pregunta publicada en este sitio (codegolf.SE).!!metanewest
: muestra el título de la pregunta más reciente publicada en el sitio meta (meta.codegolf.SE).!!questioncount
: muestra el recuento de preguntas actual.!!metaquestioncount
: genera el recuento de preguntas actual en el meta sitio.!!tag tagname
: muestra el extracto de la etiqueta (la breve descripción) de la etiqueta que se proporciona como primer parámetro.!!metatag tagname
: igual que el anterior, pero para el meta sitio.!!featured
: genera el recuento de preguntas que actualmente tienen una recompensa.!!metafeatured
: genera el recuento de preguntas que tienen la etiqueta [destacado] en Meta.
Reglas
- Debe escribir un programa completo, no un fragmento o función.
- En caso de que sea necesario, puede solicitar nombre de usuario y contraseña como entrada (solicitando entrada, STDIN, argumentos de línea de comandos). Esto será necesario si usa, por ejemplo, Python o Ruby, pero no será necesario si usa JavaScript y ejecuta el script en la página de la sala de chat.
- Puede usar bibliotecas externas para hacer cosas como WebSockets. Estas bibliotecas no tienen que contar para su recuento de caracteres.
Usted puede usar una envoltura externa de chat (pero no tiene que, a escribir su propia se anima), y luego de que tiene que contar para el recuento de caracteres. Tampoco se le permite cambiar el código del contenedor. Si lo usa, lo usa sin modificaciones y todos los caracteres deben contarse (eso es una penalización por no escribir su propio contenedor).
Solo el código del envoltorio tiene que contar. Si hay otros archivos como ejemplos, estos no tienen que contar.
- No se pueden usar acortadores de URL u otras formas que puedan acortar las URL: el desafío es jugar un chatbot, no jugar una URL.
- No hay solicitudes web, excepto las necesarias para chatear y obtener la información necesaria para responder a los comandos.
- El uso de las "lagunas" estándar no está permitido.
- Si alguien envía un comando, es necesario responder con un mensaje de chat de este formato:
@user response
. Entonces, si escribo el comando!!featured
y hay 5 preguntas destacadas, su bot debería publicar@ProgramFOX 5
. - Si pruebo tu bot, lo ejecutaré desde mi cuenta de chatbot y lo ejecutaré en esta sala de chat . Siempre probaré los bots en esa sala, por lo que no es necesario proporcionar la ID de la sala como entrada, siempre será 14697. Esta ID no se proporcionará como entrada, debe estar codificada.
- Si no se encuentra el comando, salida
@user The command [command] does not exist
. Reemplace[command]
por el nombre del comando no existente. Si se proporcionan argumentos al comando, no muestre los argumentos, solo el nombre del comando. - Si un comando tiene muchos argumentos, ignore los argumentos que no son necesarios.
- Si un comando no tiene suficientes argumentos, salida
@user You have not provided enough arguments
- El sistema evita que se publiquen mensajes duplicados dentro de un rango de tiempo corto. Entonces, cuando pruebe su bot, nunca ejecutaré dos comandos que den la misma salida sucesivamente (lo que significa que no tiene que implementar un sistema que diferencie los mensajes si son duplicados, agregando un punto, por ejemplo).
- El sistema evita que se publiquen demasiados mensajes dentro de un rango de tiempo corto, por lo tanto, cuando realice las pruebas, nunca enviaré demasiados comandos dentro de un rango de tiempo corto, lo que significa que su bot no tiene que ocuparse de esto (esperando un tiempo antes de publicar, por ejemplo).
- Esto es code-golf , el programa con la menor cantidad de bytes gana.
Empezando
Aquí hay información para comenzar a escribir su bot. No tiene que usar esto, pero puede ser una guía.
- Para iniciar sesión, primero inicie sesión en un proveedor de OpenID. Esto siempre será Stack Exchange OpenID (
https://openid.stackexchange.com
). El formulario de inicio de sesión se encuentra enhttps://openid.stackexchange.com/account/login
, y proporciona el nombre de usuario y la contraseña allí. - Luego, inicie sesión en
stackexchange.com
. El formulario de inicio de sesión se encuentra enhttps://stackexchange.com/users/login
. Elija Stack Exchange como proveedor de OpenID. - Después de hacer eso, inicia sesión para chatear. El formulario de inicio de sesión para eso se encuentra en
http://stackexchange.com/users/chat-login
. Elija Stack Exchange como proveedor de OpenID. - Entonces necesitas conseguir tu
fkey
. Para eso, vayahttp://chat.stackexchange.com/chats/join/favorite
y obtenga elfkey
de un campo de entrada oculto. - Para publicar un mensaje, envíe una solicitud
http://chat.stackexchange.com/chats/14697/messages/new
y proporcione dos parámetros POST: untext
parámetro que contiene el texto del mensaje y unfkey
parámetro que contiene elfkey
. Para ver cuándo se publica un nuevo mensaje, puede usar WebSockets (pero no tiene que hacerlo, siéntase libre de usar algo más si es más corto). Consulte esta respuesta de Meta Stack Exchange :
Charla
(wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)
El hash se puede recuperar PUBLICANDO el ID de la sala y la tecla f
http://chat.stackexchange.com/ws-auth
El timethingy es la clave de tiempo del json devuelto por
/chats/<roomno>/events
.La identificación del evento cuando se publica un mensaje es
1
.- Es útil mirar los contenedores de chat existentes, como StackExchange-Chatty de Doorknob y ChatExchange de Manishearth , para ver cómo funciona exactamente.
metafeatured
que significara preguntas abundantes sobre meta, pero ... gracias :-)Respuestas:
JavaScript + jQuery,
13621258 bytesGolfé usando un minificador:
Debe ejecutar la secuencia de comandos directamente en el navegador (utilizando los trabajos jQuery de Stack Exchange):
Se podía jugar mucho más al golf, pero no podía molestarse.
Sin golf:
fuente
update
ylatestMessage
.0==e.items.length
con1>e.items.length
porque la longitud nunca será inferior a cero.