Kodeerige oma Twitchi vestluse juhtnupud robotite jaoks – või lihtsalt millegi muu jaoks!

Allikasõlm: 805836

Twitch mängib Pokemone 2014. aastal toona tekkivale otseülekande stseenile, lastes Twitchi vaatajatel lihtsate vestluskäskude abil juhtida Game Boy emulaatorit, milles töötab Pokemon Red. Sellest ajast peale on sama kontseptsiooni rakendatud kõigele päikese all. Muud videomängud, Linuxi installimine ja isegi New Yorgi börsil kauplemine on kõik Twitchi vestluse kaudu mängitud.

TwitchPlaysPokemon alustas hullusega videomängude, robotite ja peaaegu kõige muu juhtimises.

Sina, janune lugeja, mõtled, kuidas saaksid sellest maitsvast aktsioonist osa. Ärge kartke, sest pisut segase koodiga saate lasta Twitchi vestlusel üle võtta peaaegu kõik arvutis, arvutis või selle ümbruses.

See on lihtsalt IRC

Twitchi vestluse suurepärane asi on see, et see töötab vanilla IRC-l (Internet Relay Chat). Protokoll on eksisteerinud igavesti ja liidese hõlbustamiseks on olemas raamatukogud. Täpselt nagu Twitch Plays Pokemoni taga olev algne striimer, kasutame ka Pythonit, sest see on suurepärane selliste lõbusate väikeste katsete jaoks. Seda arvestades saab iga keel hästi hakkama – lihtsalt rakendage vastavas süntaksis samu tehnikaid.

SimpleTwitchCommander, nagu ma seda Githubis nimetasin, eeldab Pythoni põhiprogrammeerimise tundmist. Kood võimaldab teil vestlusest käske võtta kahel viisil. Vestluse käske saab tabelitesse lisada ja täita saab ainult kõige rohkem hääli saanud käsku või otse toimida iga üksiku käsuga. Selle koodi hankimine oma roboti, videomängu või lemmiklooma rästiku juhtimiseks on tegelikult teie enda otsustada. See, mida me siin teeme, on Twitchi vestlusega liidestamine ja käskude väljavõtmine, et saaksite teha seda, mida soovite. Seda arvestades oleme selle näite jaoks seadistanud koodi lihtsa ratastega roboti käskude sõelumiseks. Sukeldume sisse.

Koodi kõndimine

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Selle koodiga saate vaadata ka juhuslike inimestena Internetist aja oma robot otse põõsasse.

Esimene asi, mida meie koodis teha, on importida vajalikud teegid. Raamatukogud on suurepärased, need on andekate programmeerijate kingitused, mis muudavad meie elu lihtsamaks – või vähemalt loodame, et on. Sel juhul kasutame nelja teeki, kuid olenevalt teie rakendusest saate hakkama vaid kolme esimese teekiga. Esimene ja võib-olla kõige olulisem on socket raamatukogu, mis haldab kogu meie võrgusuhtlust. The emoji raamatukogu pakub meile korralikku tööriista emotikonide eemaldamiseks vestlussõnumitest, kuna need võivad segadusse minna. APScheduler kasutatakse meie käskude hääletussüsteemis, mis võimaldab Twitchi kasutajatel hääletada soovitud toimingu üle, selle asemel, et lasta lihtsalt läbi iga Twitchi käskluse.

class TwitchControl:

See avaldus määrab meie programmi klassi.

 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__() on Pythoni spetsiaalne rutiin, mida kutsutakse välja, kui klassist luuakse objekt. Lihtsamalt öeldes, kui me helistame TwitchControl, kood sees __init__() jookseb esimesena. Siin loome muutujad, mis salvestavad Twitchi vestlusserveri aadressi, pordi ning meie Twitchi sisselogimise ja kanali üksikasjad. Oauth-märk on see, kuidas Twitchi server teab, kes vestluskanaliga ühenduse loob, ja siin saate luua oma.

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

Järgmisena loome spetsiaalse muutuja nimega sõnaraamat ja anname sellele nime voteDict. Sõnastikud on suurepärased, kuna need võimaldavad meil andmeid korralike väikeste paaridena salvestada. Meie puhul on meil soovitud käsud ja igaühe kõrval on number. See vastab iga vestluse käsu häälte arvule. Alustuseks lähtestame need väärtusega 0.

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

Ülaltoodud read seadistatud APscheduler funktsiooni käivitamiseks korrapäraste 2-sekundiliste intervallidega. See funktsioon läheb nime järgi voteCountja iga kahesekundilise intervalli järel kontrollib voteDict et näha, milline käsk sai vestluses enim hääli, ja seejärel käivitab võitja. Tuleme tagasi ja vaatame mõne aja pärast VovoCounti. Praegu vaatame peamist tsüklit, mis töötab pärast seda, kui kõik on lähtestatud.

 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 

Kui jõuame while-tsüklisse, peame saama andmeid IRC-serverist. Kui andmed on "PING", vastame tüüpilise IRC tava kohaselt "PONG", et ühendus püsiks. Vastasel juhul puhastame andmed demojize funktsiooniga, mis asendab sõnumis kõik emotikonid lihttekstiga. Seejärel kasutame stringifunktsioone, et jagada serveri toorsõnum selle komponentideks: sõnumi saatnud kasutajanimi ja sõnumi tegelik sisu. Siinkohal saame otsida otse käsku ja kui tahame, et see käivitaks otse sõnumite kaudu, saame seda teha siin.

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

Teise võimalusena saame seda teha, kui tahame vestluses käsklusi koguda ja näha, milline on kõige populaarsem. Iga kord, kui tuvastatakse üks järgmistest käskudest, kuvatakse selle vastav väli voteDict sõnastikku suurendatakse 1 võrra.

 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 

See on kõik, mida meie põhiahel teeb. See saab andmeid IRC-serverist, kui need saabuvad, töötleb neid ja suurendab sissetulevate käskude häälte arvu. Nende häälte põhjal tegelikult tegutsemiseks peame minema oma voteCount funktsiooni. Tänu sellele, APscheduler rutiin, mille me varem seadistasime, käivitub see automaatselt iga kahe sekundi järel.

 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 on lihtne funktsioon, mis kasutab Pythoni sisseehitatud sõnastiku funktsioone, et määrata kõige rohkem hääli saanud käsk. Pange tähele, et kontrollime ka seda, kas kõik hääled on nullid – sel juhul ei tohi me midagi teha, seega nullChecki kood. Kui võitja on selgunud, saab käivitada vastava käsu koodi.

Mida sa Twitchis valla võtad?

Asjade ühendamiseks on pisut rohkem plaati, kuid põhimõtteliselt on need plokid, mis panevad kõik tööle. Kui soovite kodus nokitseda, haarake Githubist ehtsad asjad. Ilmselgelt on siin lihtsalt koodi kohandamise küsimus, et kujundada kood vastavalt teie konkreetsele eesmärgile. Kui soovite robotit juhtida, pange oma servo- või mootorikäsud vajalikesse kohtadesse või saatke juhised järjestikku oma mikrokontrollerile, mis neid ülesandeid täidab. Teise võimalusena, kui töötate mänguga emulaatoris, laske Pythoni koodil lihtsalt vastavaid nupuvajutusi emuleerida.

Kood ei ole kuidagi optimeeritud; selle artikli kirjutamine võttis umbes kaks korda kauem aega kui koodi enda kirjutamine. Ideaalsema stringihalduskoodi ja muude selliste näpunäidete kasutamisel on tõenäoliselt tohutu kasu. Edasine töö selle kõige korralikku raamatukogusse pakkimisel jääb lugejale harjutuseks. Loodetavasti aitab see teil Twitchis lõbusalt aega veeta! Nagu alati, head häkkimist.

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

Ajatempel:

Veel alates Hack A Day