Mã điều khiển trò chuyện trên Twitch của riêng bạn cho rô bốt - Hoặc chỉ về bất cứ điều gì khác!

Nút nguồn: 805836

Twitch chơi Pokemon bùng nổ trong bối cảnh phát trực tiếp mới ra đời vào năm 2014, cho phép người xem Twitch điều khiển trình giả lập Game Boy chạy Pokemon Red thông qua các lệnh trò chuyện đơn giản. Kể từ đó, khái niệm tương tự đã được áp dụng cho mọi thứ dưới ánh mặt trời. Các trò chơi điện tử khác, cài đặt Linux và thậm chí giao dịch trên Sàn giao dịch chứng khoán New York đều đã được trò chơi hóa thông qua trò chuyện Twitch.

TwitchPlaysPokemon đã bắt đầu một cơn sốt trong việc kiểm soát trò chơi điện tử, rô-bốt và mọi thứ khác dựa trên nguồn lực cộng đồng.

Bạn, độc giả khát khao, đang tự hỏi làm thế nào bạn có thể có được một phần của hành động hấp dẫn này. Đừng lo, vì với một chút mã xiêu vẹo, bạn có thể để trò chuyện Twitch chiếm lấy hầu hết mọi thứ trong, trên hoặc xung quanh máy tính của bạn.

Nó chỉ là IRC

Điều tuyệt vời về trò chuyện Twitch là nó chạy trên vanilla IRC (Trò chuyện chuyển tiếp qua Internet). Giao thức đã tồn tại mãi mãi và các thư viện tồn tại để giúp việc giao tiếp trở nên dễ dàng. Giống như người phát trực tiếp ban đầu đằng sau Twitch Plays Pokemon, chúng tôi sẽ sử dụng Python vì nó rất tuyệt cho những thử nghiệm nhỏ thú vị như thế này. Như đã nói, bất kỳ ngôn ngữ nào cũng sẽ hoạt động tốt — chỉ cần áp dụng các kỹ thuật tương tự trong cú pháp có liên quan.

Chỉ huy Twitch đơn giản, như tôi đã đặt tên cho nó trên Github, giả sử đã quen thuộc với lập trình Python cơ bản. Mã này sẽ cho phép bạn nhận lệnh từ cuộc trò chuyện theo hai cách. Các lệnh từ cuộc trò chuyện có thể được lập bảng và chỉ lệnh có nhiều phiếu bầu nhất được thực thi hoặc mọi lệnh đơn lẻ mới có thể được thực hiện trực tiếp. Trên thực tế, việc lấy mã này để điều khiển rô-bốt, trò chơi điện tử hoặc viper thú cưng của bạn là tùy thuộc vào bạn. Những gì chúng tôi đang làm ở đây là giao tiếp với trò chuyện Twitch và rút ra các lệnh để bạn có thể khiến nó làm bất cứ điều gì bạn muốn. Như đã nói, đối với ví dụ này, chúng tôi đã thiết lập mã để phân tích lệnh cho một rô-bốt có bánh xe đơn giản. Hãy đi sâu vào.

Mã đi bộ

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Với mã này, bạn cũng có thể xem những người ngẫu nhiên từ Internet lái thẳng robot của bạn vào bụi rậm.

Điều đầu tiên cần làm trong mã của chúng tôi là nhập các thư viện chúng tôi cần. Thư viện rất tuyệt, chúng là món quà từ những lập trình viên tài năng giúp cuộc sống của chúng ta dễ dàng hơn — hoặc ít nhất chúng ta hy vọng là như vậy. Chúng tôi đang sử dụng bốn thư viện trong trường hợp này, nhưng bạn có thể sử dụng chỉ với ba thư viện đầu tiên tùy thuộc vào ứng dụng của bạn. Đầu tiên, và có lẽ là quan trọng nhất, là socket thư viện, xử lý tất cả các giao tiếp mạng của chúng tôi. Các emoji thư viện cung cấp cho chúng tôi một công cụ gọn gàng để loại bỏ biểu tượng cảm xúc khỏi tin nhắn trò chuyện vì chúng có thể trở nên lộn xộn. APScheduler được sử dụng cho hệ thống biểu quyết lệnh của chúng tôi, cho phép người dùng Twitch bỏ phiếu cho hành động mong muốn của họ thay vì chỉ cho phép mọi lệnh Twitch thông qua.

class TwitchControl:

Câu lệnh này thiết lập lớp cho chương trình của chúng ta.

 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__() là một thủ tục Python đặc biệt được gọi khi một đối tượng được tạo từ một lớp. Nói một cách đơn giản, khi chúng ta kêu gọi TwitchControl, mã trong __init__() chạy đầu tiên. Ở đây, chúng tôi đang tạo các biến lưu trữ địa chỉ máy chủ trò chuyện của Twitch, cổng cũng như thông tin đăng nhập Twitch và thông tin chi tiết về kênh của chúng tôi. Mã thông báo oauth là cách máy chủ Twitch biết ai đang kết nối với kênh trò chuyện, và bạn có thể tạo của riêng bạn ở đây.

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

Tiếp theo, chúng tôi tạo một biến đặc biệt gọi là từ điển và đặt tên cho nó voteDict. Từ điển rất tuyệt vì chúng cho phép chúng ta lưu trữ dữ liệu theo từng cặp nhỏ gọn gàng. Trong trường hợp của chúng tôi, chúng tôi có các lệnh mong muốn và mỗi lệnh có một số bên cạnh. Điều này sẽ tương ứng với số lượt bình chọn cho mỗi lệnh trong trò chuyện. Chúng tôi khởi tạo những thứ này ở 0 để bắt đầu.

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

Các dòng trên thiết lập APscheduler để chạy một chức năng trong khoảng thời gian 2 giây thông thường. Chức năng đó đi theo tên voteCount, và ở mỗi khoảng thời gian hai giây, nó sẽ kiểm tra voteDict để xem lệnh nào nhận được nhiều phiếu bầu nhất trong cuộc trò chuyện, sau đó thực hiện lệnh chiến thắng. Chúng tôi sẽ quay lại và xem số phiếu bầu trong giây lát. Bây giờ, hãy xem vòng lặp chính chạy sau khi mọi thứ được khởi tạo.

 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 

Khi chúng tôi vào vòng lặp while, chúng tôi cần nhận dữ liệu từ máy chủ IRC. Nếu dữ liệu là “PING”, chúng tôi sẽ phản hồi bằng “PONG” theo thông lệ IRC điển hình để duy trì kết nối. Mặt khác, chúng tôi làm sạch dữ liệu bằng chức năng demojize, thay thế bất kỳ biểu tượng cảm xúc nào trong tin nhắn bằng văn bản thuần túy. Sau đó, chúng tôi sử dụng các hàm chuỗi để chia nhỏ tin nhắn thô từ máy chủ thành các thành phần của nó: tên người dùng đã gửi tin nhắn và nội dung tin nhắn thực tế. Tại thời điểm này, chúng tôi có thể trực tiếp tìm kiếm một lệnh và nếu chúng tôi muốn lệnh đó kích hoạt trực tiếp từ các thông báo, chúng tôi có thể thực hiện tại đây.

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

Ngoài ra, nếu chúng tôi muốn thu thập các lệnh trong trò chuyện và xem lệnh nào được bình chọn phổ biến nhất, chúng tôi cũng có thể làm điều đó. Mỗi khi một trong các lệnh sau được phát hiện, trường tương ứng của nó trong voteDict từ điển được tăng thêm 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 

Đó là tất cả những gì vòng lặp chính của chúng ta làm. Nó nhận dữ liệu từ máy chủ IRC khi nó đến, xử lý dữ liệu đó và tăng số phiếu bầu từ các lệnh đến. Để thực sự hành động dựa trên những phiếu bầu đó, chúng ta cần đi đến voteCount chức năng. Nhờ sự APscheduler chúng tôi đã thiết lập trước đó, điều này sẽ tự động chạy hai giây một lần.

 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 là một hàm đơn giản, sử dụng các hàm từ điển sẵn có của Python để xác định lệnh có nhiều phiếu bầu nhất. Lưu ý rằng chúng tôi cũng kiểm tra xem liệu tất cả phiếu bầu có bằng XNUMX hay không — trong trường hợp đó, chúng tôi không được làm gì cả, do đó mã nullCheck. Khi người chiến thắng được xác định, mã cho lệnh có liên quan có thể được thực thi.

Bạn sẽ giải phóng gì trên Twitch?

Có thêm một chút bản tóm tắt để xâu chuỗi mọi thứ lại với nhau, nhưng về cơ bản, đây là những khối khiến mọi thứ hoạt động. Lấy đồ thật từ Github nếu bạn muốn mày mò ở nhà. Rõ ràng, từ đây, vấn đề đơn giản chỉ là tùy chỉnh để định hình mã theo mục đích cụ thể của bạn. Nếu bạn đang tìm cách điều khiển rô-bốt, hãy đặt lệnh cho động cơ servo hoặc động cơ ở những điểm cần thiết hoặc gửi hướng dẫn qua nối tiếp tới bộ vi điều khiển của bạn để xử lý các tác vụ đó. Ngoài ra, nếu bạn đang làm việc với một trò chơi trong trình giả lập, hãy để mã Python chỉ cần mô phỏng các lần nhấn nút có liên quan.

Mã không có cách nào được tối ưu hóa; viết bài báo này mất khoảng gấp đôi thời gian viết mã. Có khả năng đạt được những lợi ích to lớn bằng cách sử dụng mã quản lý chuỗi được lý tưởng hóa hơn và các điều chỉnh khác như vậy. Công việc tiếp theo trong việc gói gọn tất cả những thứ này trong một thư viện gọn gàng được để lại như một bài tập cho người đọc. Hy vọng rằng điều này sẽ giúp bạn có được niềm vui từ cộng đồng trên Twitch! Như mọi khi, chúc bạn hack vui vẻ.

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

Dấu thời gian:

Thêm từ Hack một ngày