From 33706518f26434b9b47f14ce2c0791fa368559f6 Mon Sep 17 00:00:00 2001 From: Interitio Date: Sun, 27 Jul 2025 20:23:29 +1000 Subject: [PATCH] Add more event types. --- data/schema.sql | 8 ++-- src/modules/tracker/component.py | 75 +++++++++++++++++++++++++++++++- src/modules/tracker/data.py | 4 ++ 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/data/schema.sql b/data/schema.sql index b113898..907c648 100644 --- a/data/schema.sql +++ b/data/schema.sql @@ -113,7 +113,7 @@ CREATE TABLE events( communityid INTEGER NOT NULL REFERENCES communities (communityid), channel_id TEXT NOT NULL, profileid INTEGER REFERENCES user_profiles (profileid), - user_id TEXT NOT NULL, + user_id TEXT, occurred_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (event_id, event_type) @@ -158,7 +158,7 @@ CREATE TABLE subscribe_message_events( tier INTEGER NOT NULL, duration_months INTEGER NOT NULL, cumulative_months INTEGER NOT NULL, - streak_months INTEGER NOT NULL, + streak_months INTEGER, message TEXT, FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type) ); @@ -256,7 +256,7 @@ CREATE TABLE raid_out_events( event_id INTEGER PRIMARY KEY REFERENCES events (event_id), event_type TEXT NOT NULL DEFAULT 'raidout' CHECK (event_type = 'raidout'), target_id TEXT NOT NULL, - target_name TEXT NOT NULL, + target_name TEXT, viewer_count INTEGER NOT NULL, FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type) ); @@ -265,7 +265,7 @@ CREATE TABLE raid_in_events( event_id INTEGER PRIMARY KEY REFERENCES events (event_id), event_type TEXT NOT NULL DEFAULT 'raidin' CHECK (event_type = 'raidin'), source_id TEXT NOT NULL, - source_name TEXT NOT NULL, + source_name TEXT, viewer_count INTEGER NOT NULL, FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type) ); diff --git a/src/modules/tracker/component.py b/src/modules/tracker/component.py index 58ac2c4..f8de018 100644 --- a/src/modules/tracker/component.py +++ b/src/modules/tracker/component.py @@ -1,7 +1,7 @@ from typing import Optional import random import twitchio -from twitchio import Scopes, eventsub +from twitchio import PartialUser, Scopes, eventsub from twitchio.ext import commands as cmds from datamodels import BotChannel, Communities, UserProfile @@ -333,6 +333,79 @@ class TrackerComponent(cmds.Component): stream_type=payload.type, ) + @cmds.Component.listener() + async def event_raid(self, payload: twitchio.ChannelRaid): + await self._event_raid_out( + payload.from_broadcaster, + payload.to_broadcaster, + payload.viewer_count, + ) + await self._event_raid_in( + payload.to_broadcaster, + payload.from_broadcaster, + payload.viewer_count, + ) + + async def _event_raid_out(self, broadcaster: PartialUser, to_broadcaster: PartialUser, viewer_count: int): + tracked = await TrackingChannel.fetch(broadcaster.id) + if tracked and tracked.joined: + community = await Communities.fetch_or_create(twitchid=broadcaster.id, name=broadcaster.name) + cid = community.communityid + + event_row = await self.data.events.insert( + event_type='raidout', + communityid=cid, + channel_id=broadcaster.id, + ) + detail_row = await self.data.raid_out_events.insert( + event_id=event_row['event_id'], + target_id=to_broadcaster.id, + target_name=to_broadcaster.name, + viewer_count=viewer_count + ) + + async def _event_raid_in(self, broadcaster: PartialUser, from_broadcaster: PartialUser, viewer_count: int): + tracked = await TrackingChannel.fetch(broadcaster.id) + if tracked and tracked.joined: + community = await Communities.fetch_or_create(twitchid=broadcaster.id, name=broadcaster.name) + cid = community.communityid + + event_row = await self.data.events.insert( + event_type='raidin', + communityid=cid, + channel_id=broadcaster.id, + ) + detail_row = await self.data.raid_in_events.insert( + event_id=event_row['event_id'], + source_id=from_broadcaster.id, + source_name=from_broadcaster.name, + viewer_count=viewer_count + ) + + async def event_message(self, payload: twitchio.ChatMessage): + tracked = await TrackingChannel.fetch(payload.broadcaster.id) + if tracked and tracked.joined: + community = await Communities.fetch_or_create(twitchid=payload.broadcaster.id, name=payload.broadcaster.name) + cid = community.communityid + profile = await UserProfile.fetch_or_create( + twitchid=payload.chatter.id, name=payload.chatter.name, + ) + pid = profile.profileid + + event_row = await self.data.events.insert( + event_type='message', + communityid=cid, + channel_id=payload.broadcaster.id, + profileid=pid, + user_id=payload.chatter.id, + ) + detail_row = await self.data.message_events.insert( + event_id=event_row['event_id'], + message_id=payload.id, + message_type=payload.type, + content=payload.text, + source_channel_id=payload.source_id + ) # ----- Commands ----- @cmds.command(name='starttracking') diff --git a/src/modules/tracker/data.py b/src/modules/tracker/data.py index 40d5142..65bc6b5 100644 --- a/src/modules/tracker/data.py +++ b/src/modules/tracker/data.py @@ -18,9 +18,11 @@ class EventData(Registry): events = Table('events') follow_events = Table('follow_events') bits_events = Table('bits_events') + subscribe_events = Table('subscribe_events') gift_events = Table('gift_events') subscribe_message_events = Table('subscribe_message_events') + cheer_events = Table('cheer_events') redemption_add_events = Table('redemption_add_events') redemption_update_events = Table('redemption_update_events') @@ -28,8 +30,10 @@ class EventData(Registry): stream_online_events = Table('stream_online_events') stream_offline_events = Table('stream_offline_events') channel_update_events = Table('channel_update_events') + vip_add_events = Table('vip_add_events') vip_remove_events = Table('vip_remove_events') + raid_out_events = Table('raid_out_events') raid_in_events = Table('raid_in_events') message_events = Table('message_events')