108 lines
4.2 KiB
Python
108 lines
4.2 KiB
Python
##Twitch Chat Randomizer
|
|
|
|
import os
|
|
import asyncio
|
|
import websockets
|
|
import requests
|
|
from colorama import Fore
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
messages_dict = {}
|
|
keyword = 'Name:'
|
|
EXPRESS_SERVER_URL = 'http://localhost:5000/api/selected'
|
|
|
|
async def connect_to_twitch():
|
|
uri = "wss://irc-ws.chat.twitch.tv:443"
|
|
token = os.getenv("TWITCH_OAUTH_TOKEN")
|
|
nickname = os.getenv("TWITCH_BOT_NICKNAME")
|
|
channel = os.getenv("TWITCH_CHANNEL").lstrip('#')
|
|
|
|
if not token or not nickname or not channel:
|
|
print(Fore.RED + "Missing one or more environment variables. Please check TWITCH_OAUTH_TOKEN, TWITCH_BOT_NICKNAME, and TWITCH_CHANNEL.")
|
|
return
|
|
|
|
print(f"Token: {token}")
|
|
print(f"Nickname: {nickname}")
|
|
print(f"Channel: {channel}")
|
|
|
|
while True:
|
|
try:
|
|
print(Fore.BLUE + "Attempting to connect to Twitch IRC...")
|
|
async with websockets.connect(uri) as websocket:
|
|
print(Fore.BLUE + "Connection established. Sending authentication...")
|
|
await websocket.send(f"PASS {token}")
|
|
print(Fore.BLUE + "Sent PASS")
|
|
await websocket.send(f"NICK {nickname}")
|
|
print(Fore.BLUE + "Sent NICK")
|
|
await websocket.send(f"JOIN #{channel}")
|
|
print(Fore.BLUE + f"Sent JOIN for channel #{channel}")
|
|
print(Fore.GREEN + "Connected to Twitch IRC and joined the channel.")
|
|
print(Fore.BLUE + "Waiting to receive messages...")
|
|
|
|
while True:
|
|
try:
|
|
message = await websocket.recv()
|
|
if "PRIVMSG" in message:
|
|
await handle_message(message)
|
|
except websockets.exceptions.ConnectionClosedError as e:
|
|
print(Fore.RED + f"Connection closed unexpectedly: {e}")
|
|
break
|
|
except Exception as e:
|
|
print(Fore.RED + f"An error occurred while receiving message: {e}")
|
|
break
|
|
|
|
except Exception as e:
|
|
print(Fore.RED + f"An error occurred during connection: {e}")
|
|
print(Fore.YELLOW + "Attempting to reconnect in 5 seconds...")
|
|
await asyncio.sleep(5)
|
|
|
|
async def handle_message(message):
|
|
try:
|
|
parts = message.split(':', 2)
|
|
if len(parts) < 3:
|
|
print(Fore.RED + "Invalid message format")
|
|
return None
|
|
|
|
username_section = parts[1]
|
|
user_message = parts[2].strip()
|
|
username = username_section.split('!', 1)[0]
|
|
|
|
print(Fore.CYAN + f"{username}: {user_message}")
|
|
if username == 'procptcasual' and user_message == 'clear':
|
|
messages_dict.clear()
|
|
print(Fore.YELLOW + "Cleared the messages dictionary.")
|
|
elif(username == 'procptcasual' and user_message == 'select'):
|
|
await send_to_server(messages_dict)
|
|
messages_dict.clear()
|
|
elif user_message.startswith(keyword):
|
|
modified_message = user_message.replace(keyword, '').strip()
|
|
await add_message_to_dict((username, modified_message))
|
|
else:
|
|
return
|
|
except Exception as e:
|
|
print(Fore.RED + f"An error occurred while handling message: {e}")
|
|
|
|
async def add_message_to_dict(user_message_tuple):
|
|
try:
|
|
if user_message_tuple:
|
|
username, user_message = user_message_tuple
|
|
messages_dict[username] = user_message
|
|
print(Fore.YELLOW + f"Added message to dictionary: {username} -> {user_message}")
|
|
except Exception as e:
|
|
print(Fore.RED + f"An error occurred while adding message to dictionary: {e}")
|
|
|
|
async def send_to_server(messages):
|
|
try:
|
|
response = requests.post(EXPRESS_SERVER_URL, json=messages)
|
|
if response.status_code == 200:
|
|
print(Fore.GREEN + "Successfully sent data to server.")
|
|
else:
|
|
print(Fore.RED + f"Failed to send data to server. Status code: {response.status_code}")
|
|
except Exception as e:
|
|
print(Fore.RED + f"An error occurred while sending data to server: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(connect_to_twitch())
|