├── README.md └── SimpleTwitchCommander.py /README.md: -------------------------------------------------------------------------------- 1 | # SimpleTwitchCommander 2 | A simple IRC scraper to command robots, games, or anything else by reading Twitch chat. With Python! 3 | 4 | Can be used to take direct actions (as in "LIGHTS") or to take a democratic vote on commands (as in "FWD", "REV", "LEFT", "RIGHT") as shown in the example code. 5 | 6 | If you use this for a cool project or stream, let me know on Twitter - @whatuptkhere 7 | 8 | Programmed in Python 3.8 9 | Relies on libraries: socket, emoji, apscheduler 10 | 11 | 12 | -------------------------------------------------------------------------------- /SimpleTwitchCommander.py: -------------------------------------------------------------------------------- 1 | import socket 2 | from emoji import demojize 3 | from apscheduler.schedulers.background import BackgroundScheduler 4 | 5 | 6 | class TwitchControl: 7 | # define relevant constants here 8 | 9 | 10 | def __init__(self): 11 | self.server = 'irc.chat.twitch.tv' 12 | self.port = 6667 13 | self.nickname = 'yourtwitchusername' 14 | self.token = 'oauth:youroauthkeyhere' 15 | self.channel = '#yourtwitchchannel' 16 | 17 | 18 | 19 | self.sched = BackgroundScheduler() 20 | 21 | self.sock = socket.socket() 22 | self.sock.connect((self.server,self.port)) 23 | self.sock.send(f"PASS {self.token}\n".encode('utf-8')) 24 | self.sock.send(f"NICK {self.nickname}\n".encode('utf-8')) 25 | self.sock.send(f"JOIN {self.channel}\n".encode('utf-8')) 26 | 27 | 28 | 29 | self.voteDict = {"null": 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} 30 | 31 | 32 | self.sched.add_job(self.voteCount, 'interval', seconds=2) 33 | self.sched.start() 34 | 35 | 36 | def loop(self): 37 | 38 | while True: 39 | resp = self.sock.recv(2048).decode('utf-8') 40 | if resp.startswith('PING'): 41 | self.sock.send("PONG\n".encode('utf-8')) 42 | elif len(resp) > 0: 43 | respClean = demojize(resp) 44 | print(respClean) 45 | msgComponents=respClean.split(" ",3) 46 | 47 | msgUser=msgComponents[0] #get username from message 48 | msgUser = msgUser[msgUser.find(':')+1: msgUser.find('!')] 49 | msgContent=msgComponents[3] #print message content 50 | 51 | if msgContent.find("FLAG") >=0: 52 | print("Wave the flag!") 53 | donorUser=(msgContent[1 : msgContent.find(' ')]) 54 | subprocess.call('espeak -v +f3 -s 140 "Thank you for the donation "' + donorUser + ' 2>/dev/null', shell=True) 55 | 56 | 57 | if msgContent.find("FWD") >=0: 58 | self.voteDict["fwd"] = self.voteDict["fwd"] +1 59 | if msgContent.find("REV") >=0: 60 | self.voteDict["rev"] = self.voteDict["rev"] +1 61 | if msgContent.find("LEFT") >=0: 62 | self.voteDict["left"] = self.voteDict["left"] +1 63 | if msgContent.find("RIGHT") >=0: 64 | self.voteDict["right"] = self.voteDict["right"] +1 65 | 66 | def voteCount(self): #function responsible for checking votes and executing commands 67 | print('Counting votes and executing command') 68 | voteWinner = max(self.voteDict, key=self.voteDict.get) 69 | print("biggest vote:" + voteWinner) 70 | nullCheck=all(x==0 for x in self.voteDict.values()) 71 | 72 | if nullCheck: 73 | print('doing a nullo') 74 | 75 | elif voteWinner=="fwd": 76 | print('going Forward') 77 | #code to go forward here 78 | elif voteWinner=="rev": 79 | print('going Reverse') 80 | #code to go reverse here 81 | elif voteWinner=="left": 82 | print('going Left') 83 | #code to go left here 84 | elif voteWinner=="right": 85 | print('going Right') 86 | #code to go right here 87 | self.voteDict = {"null" : 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} #reset votes to 0 88 | 89 | 90 | def close(self): 91 | print('closing I think') 92 | self.sched.shutdown() 93 | 94 | def __enter__(self): 95 | return self 96 | 97 | def __exit__(self, *_, **__): 98 | self.close() 99 | 100 | def main(argv=None): 101 | TwitchControl().loop() 102 | 103 | main() 104 | --------------------------------------------------------------------------------