Codifica i tuoi controlli di chat Twitch per i robot o per qualsiasi altra cosa!

Nodo di origine: 805836

Twitch Plays Pokémon ha fatto irruzione nell'allora nascente scena del live streaming nel 2014, consentendo agli spettatori di Twitch di prendere il comando di un emulatore di Game Boy che esegue Pokemon Red tramite semplici comandi di chat. Da allora, lo stesso concetto è stato applicato a tutto ciò che è sotto il sole. Altri videogiochi, l'installazione di Linux e persino il trading alla Borsa di New York sono stati tutti giocati tramite la chat di Twitch.

TwitchGioca a Pokémon ha iniziato una mania nel controllo in crowdsourcing di videogiochi, robot e quasi tutto il resto.

Tu, lettore assetato, ti stai chiedendo come puoi ottenere una fetta di questa deliziosa azione. Non temere, perché con un po' di codice sgangherato, puoi lasciare che la chat di Twitch prenda il sopravvento praticamente su qualsiasi cosa dentro, sopra o intorno al tuo computer.

È solo IRC

La cosa grandiosa della chat di Twitch è che funziona su IRC (Internet Relay Chat) vaniglia. Il protocollo esiste da sempre e le librerie esistono per semplificare l'interfacciamento. Proprio come lo streamer originale dietro Twitch Plays Pokemon, useremo Python perché è ottimo per piccoli esperimenti divertenti come questi. Detto questo, qualsiasi lingua andrà bene: basta applicare le stesse tecniche nella sintassi pertinente.

SimpleTwitch Comandante, come l'ho chiamato su Github, presuppone una certa familiarità con la programmazione di base di Python. Il codice ti consentirà di ricevere comandi dalla chat in due modi. I comandi dalla chat possono essere tabulati, e solo quello con il maggior numero di voti eseguito, oppure ogni singolo comando può essere eseguito direttamente. In realtà, ottenere questo codice per controllare il tuo robot, videogioco o vipera da compagnia dipende da te. Quello che stiamo facendo qui è interfacciarci con la chat di Twitch ed estrarre comandi in modo da poterlo fare come vuoi. Detto questo, per questo esempio, abbiamo impostato il codice per analizzare i comandi per un semplice robot con ruote. Immergiamoci.

Codice a piedi

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Con questo codice, anche tu puoi guardare come persone casuali da Internet guida il tuo robot dritto in un cespuglio.

La prima cosa da fare nel nostro codice è importare le librerie di cui abbiamo bisogno. Le biblioteche sono fantastiche, sono regali di programmatori di talento che ci semplificano la vita, o almeno speriamo che lo siano. In questo caso utilizziamo quattro librerie, ma puoi cavartela solo con le prime tre a seconda della tua applicazione. Il primo, e forse il più importante, è il socket libreria, che gestisce tutte le nostre comunicazioni di rete. Il emoji la libreria ci fornisce uno strumento accurato per eliminare gli emoji dai messaggi di chat, poiché possono diventare disordinati. APScheduler viene utilizzato per il nostro sistema di votazione dei comandi, che consente agli utenti di Twitch di votare l'azione desiderata anziché semplicemente lasciare passare ogni comando di Twitch.

class TwitchControl:

Questa istruzione imposta la classe per il nostro programma.

 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__() è una routine Python speciale chiamata quando un oggetto viene creato da una classe. In parole povere, quando chiamiamo TwitchControl, il codice in __init__() corre per primo. Qui stiamo creando variabili che memorizzano l'indirizzo del server di chat di Twitch, la porta e il nostro accesso a Twitch e i dettagli del canale. Il token oauth è il modo in cui il server Twitch sa chi si sta connettendo al canale di chat, e puoi generare il tuo qui.

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

Successivamente, creiamo una variabile speciale chiamata dizionario e le diamo il nome voteDict. I dizionari sono fantastici, in quanto ci consentono di archiviare i dati in piccole coppie ordinate. Nel nostro caso, abbiamo i nostri comandi desiderati e ognuno ha un numero accanto ad esso. Questo corrisponderà al numero di voti per ogni comando in chat. Inizializziamo questi a 0 per cominciare.

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

Le linee di cui sopra impostate APscheduler per eseguire una funzione a intervalli regolari di 2 secondi. Quella funzione va sotto il nome voteCount, e ad ogni intervallo di due secondi controlla voteDict per vedere quale comando ha ottenuto il maggior numero di voti in chat, quindi esegue il vincitore. Torneremo e daremo un'occhiata a voteCount tra un po'. Per ora, diamo un'occhiata al ciclo principale che viene eseguito una volta che tutto è stato inizializzato.

 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 volta entrati nel ciclo while, abbiamo bisogno di ricevere i dati dal server IRC. Se i dati sono "PING", rispondiamo con "PONG" come da pratica tipica IRC per mantenere attiva la connessione. In caso contrario, puliamo i dati con la funzione demojize, che sostituisce eventuali emoji nel messaggio con testo normale. Quindi utilizziamo le funzioni di stringa per suddividere il messaggio non elaborato dal server nei suoi componenti: il nome utente che ha inviato il messaggio e il contenuto effettivo del messaggio. A questo punto, possiamo cercare direttamente un comando e, se vogliamo che attivi direttamente i messaggi, possiamo farlo qui.

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

In alternativa, se vogliamo raccogliere comandi in chat e vedere quale è il più popolare, possiamo farlo anche noi. Ogni volta che viene rilevato uno dei seguenti comandi, il suo campo corrispondente nel voteDict dizionario è incrementato di 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 

Questo è tutto ciò che fa il nostro ciclo principale. Riceve i dati dal server IRC non appena entra, li elabora e incrementa il conteggio dei voti dai comandi in arrivo. Per agire effettivamente su quei voti, dobbiamo andare al ns voteCount funzione. Grazie al APscheduler routine che abbiamo impostato in precedenza, questo viene eseguito automaticamente ogni due secondi.

 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 è una funzione semplice, che utilizza le funzioni del dizionario integrate di Python per determinare il comando che ha ottenuto il maggior numero di voti. Nota che controlliamo anche per vedere se tutti i voti sono uguali a zero, in tal caso, non dobbiamo fare nulla, da qui il codice nullCheck. Una volta determinato il vincitore, è possibile eseguire il codice per il relativo comando.

Cosa scatenerai su Twitch?

C'è un po' più di standard per mettere insieme le cose, ma fondamentalmente, questi sono i blocchi che fanno funzionare tutto. Prendi la cosa reale da Github se desideri armeggiare a casa. Ovviamente, da qui, è semplicemente una questione di personalizzazione per modellare il codice in base al tuo scopo particolare. Se stai cercando di controllare un robot, metti i comandi per servi o motori nei punti necessari o invia istruzioni via seriale al tuo microcontrollore che gestisce tali attività. In alternativa, se stai lavorando con un gioco in un emulatore, fai in modo che il codice Python emuli semplicemente le pressioni dei pulsanti pertinenti.

Il codice non è in alcun modo ottimizzato; la scrittura di questo articolo ha richiesto circa il doppio del tempo rispetto alla scrittura del codice stesso. È probabile che si possano ottenere enormi vantaggi utilizzando un codice di gestione delle stringhe più idealizzato e altre modifiche simili. Ulteriore lavoro per racchiudere tutto questo in una libreria ordinata viene lasciato come esercizio per il lettore. Speriamo che questo ti porti sulla buona strada per divertirti con il crowdsourcing su Twitch! Come sempre, buon hackeraggio.

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

Timestamp:

Di più da Hackera un giorno