Robotlar İçin Kendi Twitch Sohbet Kontrollerinizi Kodlayın - Veya Başka Bir Şey Hakkında!

Kaynak Düğüm: 805836

Plays Pokemon seğirme 2014'te yeni ortaya çıkan canlı yayın sahnesine çıkarak Twitch izleyicilerinin Pokemon Red çalıştıran bir Game Boy öykünücüsünün komutasını basit sohbet komutlarıyla almasına izin verdi. O zamandan beri, aynı konsept güneşin altındaki her şeye uygulandı. Diğer video oyunları, Linux kurulumu ve hatta New York Menkul Kıymetler Borsası'nda ticaret, Twitch sohbeti aracılığıyla oyunlaştırılmıştır.

TwitchPlaysPokemon video oyunlarının, robotların ve hemen hemen her şeyin kitle kaynaklı kontrolünde bir çılgınlık başlattı.

Siz, susamış okuyucu, bu lezzetli aksiyondan nasıl bir pay alabileceğinizi merak ediyorsunuz. Korkmayın, biraz harap kodla Twitch sohbetinin bilgisayarınızın içinde, üzerinde veya çevresinde hemen hemen her şeyi ele geçirmesine izin verebilirsiniz.

Sadece IRC'dir

Twitch sohbetinin en güzel yanı, vanilya IRC (Internet Relay Chat) üzerinde çalışmasıdır. Protokol sonsuza kadar var olmuştur ve arayüz oluşturmayı kolaylaştırmak için kütüphaneler mevcuttur. Twitch Plays Pokemon'un arkasındaki orijinal yayıncı gibi, Python'u kullanacağız çünkü bunun gibi eğlenceli küçük deneyler için harika. Bununla birlikte, herhangi bir dil iyi olacaktır - aynı teknikleri ilgili sözdiziminde uygulamanız yeterlidir.

SimpleTwitchKomutanı, Github'da adlandırdığım gibi, temel Python programlamaya biraz aşinalık olduğunu varsayar. Kod, sohbetten iki şekilde komut almanızı sağlar. Sohbetten gelen komutlar tablo haline getirilebilir ve yalnızca en çok oyu alan komut veya her komut doğrudan uygulanabilir. Aslında robotunuzu, video oyununuzu veya evcil hayvan engerekinizi kontrol etmek için bu kodu almak size kalmış. Burada yaptığımız şey, Twitch sohbeti ile arayüz oluşturmak ve istediğiniz her şeyi yapabilmeniz için komutları çekmek. Bununla birlikte, bu örnek için, basit bir tekerlekli robot için komutları ayrıştırmak üzere kodu ayarladık. Hadi dalalım.

Kod Yürüyüşü

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Bu kod ile siz de internetten rastgele insanları izleyebilirsiniz. robotunuzu doğrudan bir çalıya sürün.

Kodumuzda yapılacak ilk şey, ihtiyacımız olan kütüphaneleri içe aktarmaktır. Kütüphaneler harikadır, hayatımızı kolaylaştıran yetenekli programcıların hediyeleridir - ya da en azından öyle olduğunu umuyoruz. Bu durumda dört kitaplık kullanıyoruz, ancak uygulamanıza bağlı olarak yalnızca ilk üçüyle idare edebilirsiniz. Bunlardan ilki ve belki de en önemlisi, socket tüm ağ iletişimimizi yöneten kütüphane. bu emoji kitaplık, dağınık hale gelebileceğinden, sohbet mesajlarından emojileri çıkarmak için bize temiz bir araç sağlar. APScheduler Twitch kullanıcılarının her Twitch komutunun geçmesine izin vermek yerine istedikleri eylemi oylamalarına izin veren komut oylama sistemimiz için kullanılır.

class TwitchControl:

Bu ifade programımızın sınıfını oluşturur.

 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__() bir sınıftan bir nesne oluşturulduğunda çağrılan özel bir Python rutinidir. Açık bir ifadeyle, çağırdığımızda TwitchControl, içindeki kod __init__() önce koşar. Burada, Twitch'in sohbet sunucusunun adresini, bağlantı noktasını ve Twitch oturum açma ve kanal ayrıntılarımızı saklayan değişkenler oluşturuyoruz. Oauth belirteci, Twitch sunucusunun sohbet kanalına kimin bağlandığını bilmesidir. ve burada kendinizinkini oluşturabilirsiniz.

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

Ardından, sözlük adında özel bir değişken oluşturuyoruz ve ona adını veriyoruz. voteDict. Sözlükler harikadır, çünkü verileri düzgün küçük çiftler halinde saklamamıza izin verirler. Bizim durumumuzda istediğimiz komutlar var ve her birinin yanında bir numara var. Bu, sohbetteki her komut için oy sayısına karşılık gelir. Başlamak için bunları 0'da başlatıyoruz.

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

Yukarıdaki satırlar kuruldu APscheduler bir işlevi düzenli 2 saniye aralıklarla çalıştırmak için. Bu işlev adıyla gider voteCount, ve her iki saniyede bir kontrol eder voteDict sohbette hangi komutun en çok oyu aldığını görmek ve ardından kazananı yürütmek için. Birazdan geri dönüp oy Sayısı'na bakacağız. Şimdilik, her şey başlatıldığında çalışan ana döngüye bakalım.

 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 

while döngüsüne girdikten sonra, IRC sunucusundan veri almamız gerekiyor. Veri "PING" ise, bağlantıyı canlı tutmak için tipik IRC uygulamasına göre "PONG" ile yanıt veririz. Aksi takdirde, mesajdaki herhangi bir emojiyi düz metinle değiştiren demojize işleviyle verileri temizliyoruz. Ardından, sunucudan gelen ham mesajı bileşenlerine ayırmak için dize işlevlerini kullanırız: mesajı gönderen kullanıcı adı ve gerçek mesaj içeriği. Bu noktada, doğrudan bir komut için arama yapabiliriz ve bunun doğrudan mesajları tetiklemesini istiyorsak, burada yapabiliriz.

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

Alternatif olarak, sohbette komutları toplamak ve hangisinin en popüler olarak oylandığını görmek istiyorsak, bunu da yapabiliriz. Aşağıdaki komutlardan biri her algılandığında, ilgili alan voteDict sözlük 1 artırılır.

 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 

Ana döngümüzün yaptığı tek şey bu. IRC sunucusundan gelen verileri alır, işler ve gelen komutlardan oy sayısını artırır. Bu oylara göre hareket etmek için, bizim voteCount işlev. sayesinde APscheduler daha önce kurduğumuz rutin, bu otomatik olarak her iki saniyede bir çalışır.

 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} 

oyCount, en çok oyu alan komutu belirlemek için Python'un yerleşik sözlük işlevlerini kullanan basit bir işlevdir. Ayrıca tüm oyların sıfıra eşit olup olmadığını kontrol ettiğimizi unutmayın - bu durumda hiçbir şey yapmamalıyız, dolayısıyla nullCheck kodu. Kazanan belirlendikten sonra ilgili komutun kodu çalıştırılabilir.

Twitch'te Neleri Ortaya Çıkaracaksınız?

İşleri bir araya getirmek için biraz daha fazla bilgi var, ancak temelde bunlar her şeyin çalışmasını sağlayan bloklardır. Evde tamirat yapmak istiyorsanız Github'dan gerçek şeyi alın. Açıkçası, buradan, kodu özel amacınıza göre şekillendirmek sadece bir özelleştirme meselesidir. Bir robotu kontrol etmek istiyorsanız, servolar veya motorlar için komutlarınızı gerekli noktalara koyun veya bu görevleri yapan mikrodenetleyicinize seri üzerinden talimatları gönderin. Alternatif olarak, bir öykünücüde bir oyunla çalışıyorsanız, Python kodunun ilgili düğme basmalarını taklit etmesini sağlayın.

Kod hiçbir şekilde optimize edilmemiştir; bu makaleyi yazmak, kodun kendisini yazmaktan yaklaşık iki kat daha uzun sürdü. Daha idealleştirilmiş dizi yönetimi kodu ve bu tür diğer ince ayarlar kullanılarak elde edilecek büyük olasılıkla büyük kazanımlar vardır. Tüm bunları düzenli bir kütüphanede toplamaya yönelik daha fazla çalışma, okuyucu için bir alıştırma olarak bırakılmıştır. Umarım bu, sizi Twitch'te kitle kaynaklı eğlenceye giden yolda iyileştirir! Her zaman olduğu gibi, mutlu hackler.

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

Zaman Damgası:

Den fazla Bir Gün Hack