Codeer je eigen Twitch-chatbediening voor robots – of voor iets anders!

Bronknooppunt: 805836

Twitch speelt Pokemon barstte in 2014 los in de toen nog opkomende livestreaming-scene, waardoor Twitch-kijkers de leiding konden nemen over een Game Boy-emulator met Pokemon Red via eenvoudige chatopdrachten. Sindsdien wordt hetzelfde concept toegepast op alles onder de zon. Andere videogames, het installeren van Linux en zelfs handelen op de New York Stock Exchange zijn allemaal via Twitch-chat mogelijk gemaakt.

TwitchSpeeltPokemon begon een rage in crowdsourced controle van videogames, robots en zo ongeveer al het andere.

Jij, dorstige lezer, vraagt ​​je af hoe je een stukje van deze heerlijke actie kunt bemachtigen. Wees niet bang, want met een beetje bouwvallige code kun je Twitch-chat vrijwel alles op, op of rond je computer laten overnemen.

Het is gewoon IRC

Het mooie van Twitch-chat is dat het op standaard IRC (Internet Relay Chat) draait. Het protocol bestaat altijd al en er bestaan ​​bibliotheken om de interface gemakkelijk te maken. Net als de originele streamer achter Twitch Plays Pokemon gaan we Python gebruiken omdat het geweldig is voor leuke kleine experimenten als deze. Dat gezegd hebbende, zal elke taal het prima doen - pas gewoon dezelfde technieken toe in de relevante syntaxis.

SimpleTwitchCommander, zoals ik het op Github heb genoemd, veronderstelt enige bekendheid met de basisprogrammering van Python. Met de code kunt u op twee manieren opdrachten uit de chat overnemen. Commando's uit de chat kunnen in tabelvorm worden weergegeven, en alleen degene met de meeste stemmen kan worden uitgevoerd, of er kan direct op elk afzonderlijk commando worden gereageerd. Het is aan jou om deze code daadwerkelijk te verkrijgen om je robot, videogame of huisdierenadder te besturen. Wat we hier doen is communiceren met Twitch-chat en opdrachten eruit halen, zodat je hem kunt laten doen wat je wilt. Dat gezegd hebbende, hebben we voor dit voorbeeld de code ingesteld om opdrachten voor een eenvoudige robot op wielen te ontleden. Laten we erin duiken.

Code wandelen

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Met deze code kun jij ook als willekeurige mensen vanaf internet kijken drijf je robot rechtstreeks een struik in.

Het eerste dat we in onze code moeten doen, is de bibliotheken importeren die we nodig hebben. Bibliotheken zijn geweldig, het zijn cadeautjes van getalenteerde programmeurs die ons leven gemakkelijker maken – of dat hopen we tenminste. In dit geval gebruiken we vier bibliotheken, maar afhankelijk van uw toepassing kunt u volstaan ​​met alleen de eerste drie. De eerste en misschien wel belangrijkste is de socket bibliotheek, die al onze netwerkcommunicatie afhandelt. De emoji bibliotheek biedt ons een handig hulpmiddel om emoji's uit chatberichten te verwijderen, omdat ze rommelig kunnen worden. APScheduler wordt gebruikt voor ons commandostemsysteem, waarmee Twitch-gebruikers kunnen stemmen op de gewenste actie in plaats van simpelweg elk Twitch-commando door te laten.

class TwitchControl:

Met deze verklaring wordt de klasse voor ons programma ingesteld.

 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__() is een speciale Python-routine die wordt aangeroepen wanneer een object wordt gemaakt op basis van een klasse. In duidelijke bewoordingen: als we een beroep doen TwitchControl, de code erin __init__() loopt als eerste. Hier maken we variabelen die het adres van de chatserver van Twitch, de poort en onze Twitch-inlog- en kanaalgegevens opslaan. Het oauth-token is hoe de Twitch-server weet wie verbinding maakt met het chatkanaal, en u kunt hier uw eigen genereren.

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

Vervolgens maken we een speciale variabele, een woordenboek genaamd, en geven deze de naam voteDict. Woordenboeken zijn geweldig, omdat ze ons in staat stellen gegevens in nette kleine paren op te slaan. In ons geval hebben we de gewenste opdrachten, en elke opdracht heeft een nummer ernaast. Dit komt overeen met het aantal stemmen voor elke opdracht in de chat. We initialiseren deze om te beginnen op 0.

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

De bovenstaande lijnen zijn ingesteld APscheduler om een ​​functie uit te voeren met regelmatige tussenpozen van 2 seconden. Die functie draagt ​​de naam voteCount, en elke twee seconden wordt er gecontroleerd voteDict om te zien welk commando de meeste stemmen heeft gekregen in de chat, en voert vervolgens de winnaar uit. We komen zo terug en kijken naar voteCount. Laten we voorlopig eens kijken naar de hoofdlus die wordt uitgevoerd zodra alles is geïnitialiseerd.

 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 

Zodra we in de while-lus terechtkomen, moeten we gegevens ontvangen van de IRC-server. Als de gegevens “PING” zijn, reageren we met “PONG” volgens de typische IRC-praktijk om de verbinding in leven te houden. Anders reinigen we de gegevens met de demojize-functie, die alle emoji's in het bericht vervangt door platte tekst. Vervolgens gebruiken we stringfuncties om het onbewerkte bericht van de server op te splitsen in zijn componenten: de gebruikersnaam die het bericht heeft verzonden en de daadwerkelijke berichtinhoud. Op dit punt kunnen we direct op zoek gaan naar een commando, en als we willen dat dit direct berichten activeert, kunnen we dat hier doen.

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

Als alternatief, als we opdrachten in de chat willen verzamelen en willen zien welke het populairst is, kunnen we dat ook doen. Elke keer dat een van de volgende opdrachten wordt gedetecteerd, wordt het overeenkomstige veld in de voteDict woordenboek wordt verhoogd met 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 

Dat is alles wat onze hoofdlus doet. Het ontvangt gegevens van de IRC-server zodra deze binnenkomen, verwerkt deze en verhoogt het aantal stemmen op basis van inkomende opdrachten. Om daadwerkelijk actie te ondernemen op basis van die stemmen, moeten we naar onze voteCount functie. Dankzij de APscheduler routine die we eerder hebben opgezet, deze wordt automatisch elke twee seconden uitgevoerd.

 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 is een eenvoudige functie, die de ingebouwde woordenboekfuncties van Python gebruikt om het commando te bepalen dat de meeste stemmen heeft gekregen. Merk op dat we ook controleren of alle stemmen gelijk zijn aan nul. In dat geval hoeven we niets te doen, vandaar de code nullCheck. Zodra de winnaar is bepaald, kan de code voor het betreffende commando worden uitgevoerd.

Wat ga je loslaten op Twitch?

Er is wat meer standaardwerk om dingen aan elkaar te rijgen, maar in wezen zijn dit de blokken die ervoor zorgen dat alles werkt. Pak het echte werk van Github als je thuis wilt sleutelen. Vanzelfsprekend is het vanaf hier eenvoudigweg een kwestie van maatwerk om de code aan uw specifieke doel aan te passen. Als je een robot wilt besturen, plaats dan je commando's voor servo's of motoren op de benodigde plekken, of stuur instructies serieel naar je microcontroller die deze taken afhandelt. Als alternatief, als je met een game in een emulator werkt, kun je de Python-code eenvoudigweg de relevante knopdrukken laten emuleren.

De code is op geen enkele manier geoptimaliseerd; het schrijven van dit artikel duurde ongeveer twee keer zo lang als het schrijven van de code zelf. Er valt waarschijnlijk enorme winst te behalen door meer geïdealiseerde stringbeheercode en andere soortgelijke aanpassingen te gebruiken. Verder werk om dit alles in een nette bibliotheek te verpakken, wordt als oefening voor de lezer overgelaten. Hopelijk ben je hiermee goed op weg om wat crowdsourced plezier te beleven op Twitch! Zoals altijd, veel hackplezier.

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

Tijdstempel:

Meer van Hack een dag