Add more event types.

This commit is contained in:
2025-07-27 20:23:29 +10:00
parent 84385d1c71
commit 33706518f2
3 changed files with 82 additions and 5 deletions

View File

@@ -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)
);

View File

@@ -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')

View File

@@ -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')