This commit is contained in:
2025-11-18 01:50:12 +01:00
parent 1650f9343e
commit c249010cbd
2 changed files with 23 additions and 1 deletions

View File

@@ -1,7 +1,11 @@
import twitchio import twitchio
from sqlalchemy.orm import Session
from database import SessionLocal
import models
import security
class TwitchBot(twitchio.Client): class TwitchBot(twitchio.Client):
def __init__(self, access_token: str, client_id: str, client_secret: str, channel_name: str, websocket_manager, db_user_id: int): def __init__(self, access_token: str, refresh_token: str, client_id: str, client_secret: str, channel_name: str, websocket_manager, db_user_id: int):
self.websocket_manager = websocket_manager self.websocket_manager = websocket_manager
# Store our application's database user ID to avoid conflict with twitchio's internal 'owner_id' # Store our application's database user ID to avoid conflict with twitchio's internal 'owner_id'
self.db_user_id = db_user_id self.db_user_id = db_user_id
@@ -16,6 +20,7 @@ class TwitchBot(twitchio.Client):
# identify itself with Twitch's services. # identify itself with Twitch's services.
client_id=client_id, client_id=client_id,
client_secret=client_secret, client_secret=client_secret,
refresh_token=refresh_token,
initial_channels=[channel_name], initial_channels=[channel_name],
ssl=True # Mandate: Explicitly use SSL for the IRC connection. ssl=True # Mandate: Explicitly use SSL for the IRC connection.
) )
@@ -35,6 +40,21 @@ class TwitchBot(twitchio.Client):
# Diagnostic Logging: Confirming the bot is ready and joined the channel. # Diagnostic Logging: Confirming the bot is ready and joined the channel.
print(f"DIAGNOSTIC: Listener connected and ready for user_id: {self.db_user_id}, channel: #{self.channel_name}") print(f"DIAGNOSTIC: Listener connected and ready for user_id: {self.db_user_id}, channel: #{self.channel_name}")
async def event_token_refresh(self, token: str, refresh_token: str):
"""
Called when twitchio automatically refreshes the token.
We must save the new tokens back to our database.
"""
print(f"DIAGNOSTIC: Token refreshed for user {self.db_user_id}. Saving new tokens to database.")
db: Session = SessionLocal()
try:
user = db.query(models.User).filter(models.User.id == self.db_user_id).first()
if user:
user.encrypted_tokens = security.encrypt_tokens(token, refresh_token)
db.commit()
finally:
db.close()
async def event_message(self, message): # Mandate: Type hint removed to prevent import errors. async def event_message(self, message): # Mandate: Type hint removed to prevent import errors.
"""Runs every time a message is sent in chat.""" """Runs every time a message is sent in chat."""
# Diagnostic Logging: Checkpoint 1 - A raw message is received from Twitch. # Diagnostic Logging: Checkpoint 1 - A raw message is received from Twitch.

View File

@@ -30,9 +30,11 @@ class ListenerManager:
try: try:
tokens = security.decrypt_tokens(user.encrypted_tokens) tokens = security.decrypt_tokens(user.encrypted_tokens)
access_token = tokens['access_token'] access_token = tokens['access_token']
refresh_token = tokens['refresh_token']
bot = TwitchBot( bot = TwitchBot(
access_token=access_token, access_token=access_token,
refresh_token=refresh_token,
channel_name=user.username, channel_name=user.username,
client_id=settings.TWITCH_CLIENT_ID, client_id=settings.TWITCH_CLIENT_ID,
client_secret=settings.TWITCH_CLIENT_SECRET, client_secret=settings.TWITCH_CLIENT_SECRET,