Codifique sus propios controles de chat de Twitch para robots, ¡o para cualquier otra cosa!

Nodo de origen: 805836

Twitch Juegos Pokemon irrumpió en la entonces naciente escena de transmisión en vivo en 2014, permitiendo a los espectadores de Twitch tomar el mando de un emulador de Game Boy que ejecuta Pokemon Red a través de simples comandos de chat. Desde entonces, el mismo concepto se ha aplicado a todo lo que hay bajo el sol. Otros videojuegos, la instalación de Linux e incluso el comercio en la Bolsa de Valores de Nueva York han sido gameificados a través del chat de Twitch.

TwitchJuegosPokemon inició una locura en el control de colaboración colectiva de videojuegos, robots y casi todo lo demás.

Usted, lector sediento, se pregunta cómo puede obtener una porción de esta deliciosa acción. No temas, porque con un poco de código destartalado, puedes dejar que el chat de Twitch se haga cargo de casi cualquier cosa dentro, sobre o alrededor de tu computadora.

Es solo IRC

Lo mejor del chat de Twitch es que se ejecuta en IRC vanilla (Internet Relay Chat). El protocolo ha existido desde siempre y existen bibliotecas para facilitar la interconexión. Al igual que el transmisor original detrás de Twitch Plays Pokemon, usaremos Python porque es genial para pequeños experimentos divertidos como estos. Dicho esto, cualquier lenguaje funcionará bien, solo aplique las mismas técnicas en la sintaxis relevante.

Comandante de contracción simple, como lo he nombrado en Github, asume cierta familiaridad con la programación básica de Python. El código le permitirá recibir comandos del chat de dos formas. Los comandos del chat se pueden tabular y solo se puede ejecutar el que tenga la mayor cantidad de votos o cada comando individual. En realidad, depende de usted obtener este código para controlar su robot, videojuego o víbora mascota. Lo que estamos haciendo aquí es interactuar con el chat de Twitch y extraer comandos para que pueda hacer lo que quiera. Dicho esto, para este ejemplo, hemos configurado el código para analizar los comandos de un simple robot con ruedas. Vamos a sumergirnos.

Código caminando

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Con este código, usted también puede ver a personas al azar de Internet. Conduce tu robot directamente hacia un arbusto.

Lo primero que debemos hacer en nuestro código es importar las bibliotecas que necesitamos. Las bibliotecas son geniales, son regalos de programadores talentosos que nos hacen la vida más fácil, o al menos eso esperamos. Estamos usando cuatro bibliotecas en este caso, pero puede arreglárselas con solo las tres primeras dependiendo de su aplicación. El primero, y quizás el más importante, es el socket biblioteca, que maneja toda nuestra comunicación de la red. El emoji Library nos proporciona una herramienta genial para eliminar emojis de los mensajes de chat, ya que pueden ensuciarse. APScheduler se utiliza para nuestro sistema de votación de comandos, que permite a los usuarios de Twitch votar sobre la acción deseada en lugar de simplemente dejar pasar cada comando de Twitch.

class TwitchControl:

Esta declaración prepara la clase para nuestro programa.

 def __init__(self): self.server = 'irc.chat.twitch.tv' self.port = 6667 self.nickname = 'yourtwitchusername' self.token = 'oauth:youroauthkeyhere' self.channel = '#yourtwitchchannel' self.sched = BackgroundScheduler() self.sock = socket.socket() self.sock.connect((self.server,self.port)) self.sock.send(f"PASS {self.token}n".encode('utf-8')) self.sock.send(f"NICK {self.nickname}n".encode('utf-8')) self.sock.send(f"JOIN {self.channel}n".encode('utf-8')) 

__init__() es una rutina especial de Python que se llama cuando se crea un objeto a partir de una clase. En términos sencillos, cuando llamamos a TwitchControl, el código en __init__() corre primero. Aquí, estamos creando variables que almacenan la dirección del servidor de chat de Twitch, el puerto y nuestros detalles de inicio de sesión y canal de Twitch. El token de oauth es la forma en que el servidor de Twitch sabe quién se está conectando al canal de chat, y puedes generar el tuyo aquí.

 self.voteDict = {"null": 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} 

A continuación, creamos una variable especial llamada diccionario y le damos el nombre voteDict. Los diccionarios son geniales, ya que nos permiten almacenar datos en pequeños y prolijos pares. En nuestro caso, tenemos nuestros comandos deseados, y cada uno tiene un número al lado. Esto corresponderá al número de votos para cada comando en el chat. Para empezar, los inicializamos en 0.

 self.sched.add_job(self.voteCount, 'interval', seconds=2) self.sched.start() 

Las líneas anteriores configuradas APscheduler para ejecutar una función a intervalos regulares de 2 segundos. Esa función se llama voteCount, y en cada intervalo de dos segundos comprueba voteDict para ver qué comando obtuvo la mayor cantidad de votos en el chat y luego ejecuta el ganador. Regresaremos y veremos voteCount en un momento. Por ahora, veamos el bucle principal que se ejecuta una vez que todo se inicializa.

 def loop(self): while True: resp = self.sock.recv(2048).decode('utf-8') if resp.startswith('PING'): self.sock.send("PONGn".encode('utf-8')) elif len(resp) > 0: respClean = demojize(resp) print(respClean) msgComponents=respClean.split(" ",3) msgUser=msgComponents[0] #get username from message msgUser = msgUser[msgUser.find(':')+1: msgUser.find('!')] msgContent=msgComponents[3] #print message content 

Una vez que entremos en el ciclo while, necesitamos recibir datos del servidor IRC. Si los datos son "PING", respondemos con "PONG" según la práctica típica de IRC para mantener viva la conexión. De lo contrario, limpiamos los datos con la función demojize, que reemplaza cualquier emojis en el mensaje con texto sin formato. Luego usamos funciones de cadena para dividir el mensaje sin procesar del servidor en sus componentes: el nombre de usuario que envió el mensaje y el contenido real del mensaje. En este punto, podemos buscar directamente un comando, y si queremos que se active directamente en los mensajes, podemos hacerlo aquí.

 if msgContent.find("LIGHTS") >=0: print("Turning Lights On!") #code to turn lights on here 

Alternativamente, si queremos recopilar comandos en el chat y ver cuál se vota como el más popular, también podemos hacerlo. Cada vez que se detecta uno de los siguientes comandos, su campo correspondiente en el voteDict diccionario se incrementa en 1.

 if msgContent.find("FWD") >=0: self.voteDict["fwd"] = self.voteDict["fwd"] +1 if msgContent.find("REV") >=0: self.voteDict["rev"] = self.voteDict["rev"] +1 if msgContent.find("LEFT") >=0: self.voteDict["left"] = self.voteDict["left"] +1 if msgContent.find("RIGHT") >=0: self.voteDict["right"] = self.voteDict["right"] +1 

Eso es todo lo que hace nuestro bucle principal. Recibe datos del servidor IRC a medida que ingresa, los procesa e incrementa el recuento de votos de los comandos entrantes. Para actuar realmente sobre esos votos, tenemos que ir a nuestro voteCount función. Gracias a APscheduler rutina que configuramos antes, esto se ejecuta automáticamente cada dos segundos.

 def voteCount(self): #function responsible for checking votes and executing commands print('Counting votes and executing command') voteWinner = max(self.voteDict, key=self.voteDict.get) print("biggest vote:" + voteWinner) nullCheck=all(x==0 for x in self.voteDict.values()) if nullCheck: print('doing a nullo') elif voteWinner=="fwd": print('going Forward') #code to go forward here elif voteWinner=="rev": print('going Reverse') #code to go reverse here elif voteWinner=="left": print('going Left') #code to go left here elif voteWinner=="right": print('going Right') #code to go right here self.voteDict = {"null" : 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} 

voteCount es una función simple, que usa las funciones de diccionario incorporadas de Python para determinar el comando que tuvo más votos. Tenga en cuenta que también verificamos si todos los votos son iguales a cero; en ese caso, no debemos hacer nada, de ahí el código nullCheck. Una vez que se determina el ganador, se puede ejecutar el código del comando correspondiente.

¿Qué darás rienda suelta a Twitch?

Hay un poco más de repetición para unir las cosas, pero fundamentalmente, estos son los bloques que hacen que todo funcione. Coge lo real de Github si quieres jugar en casa. Obviamente, a partir de aquí, es simplemente una cuestión de personalización para adaptar el código a su propósito particular. Si está buscando controlar un robot, coloque sus comandos para servos o motores en los lugares necesarios, o envíe instrucciones en serie a su microcontrolador que maneja esas tareas. Alternativamente, si está trabajando con un juego en un emulador, haga que el código Python simplemente emule las pulsaciones de los botones relevantes.

El código no está optimizado de ninguna manera; escribir este artículo tomó aproximadamente el doble de tiempo que escribir el código en sí. Es probable que se obtengan grandes beneficios mediante el uso de un código de administración de cadenas más idealizado y otros ajustes similares. El trabajo adicional para envolver todo esto en una biblioteca ordenada se deja como ejercicio para el lector. ¡Esperamos que esto te ayude a tener un poco de diversión en Twitch gracias a la colaboración colectiva! Como siempre, feliz piratería.

Fuente: https://hackaday.com/2021/04/08/code-your-own-twitch-chat-controls-for-robots-or-just-about-anything-else/

Sello de tiempo:

Mas de Hackear un día