Update twitch integration

This commit is contained in:
2024-08-06 01:46:07 +02:00
parent 06d86716cb
commit 18c4d4f14d
2 changed files with 66 additions and 4 deletions

View File

@@ -966,8 +966,7 @@ impl<T: TokenStorage> Client<T> {
.data) .data)
} }
pub async fn get_stream(&mut self) -> Result<Stream> { pub async fn get_stream(&mut self, broadcaster_id: String) -> Result<Stream> {
let broadcaster_id = self.get_token_user_id().await?;
match self match self
.get_streams( .get_streams(
vec![broadcaster_id].into(), vec![broadcaster_id].into(),

View File

@@ -2,6 +2,7 @@ pub mod eventsub;
pub mod helix; pub mod helix;
pub mod auth; pub mod auth;
use chrono::{DateTime, Utc};
use futures::StreamExt; use futures::StreamExt;
use async_trait::async_trait; use async_trait::async_trait;
use auth::Token; use auth::Token;
@@ -35,9 +36,26 @@ impl TokenStorage {
} }
#[derive(Clone)]
pub struct State {
pub title: String,
pub game: String,
pub updated_at: DateTime<Utc>
}
pub struct TwitchBot {} pub struct TwitchBot {}
pub async fn notify_game_change(_title: String, old_game: String, new_game: String) {
println!("Game changed: {} -> {}", old_game, new_game);
}
pub async fn notify_stream_online(title: String) {
println!("Stream online: {}", title);
}
impl TwitchBot { impl TwitchBot {
pub async fn start() { pub async fn start() {
println!("Starting Twitch bot..."); println!("Starting Twitch bot...");
@@ -54,6 +72,23 @@ impl TwitchBot {
token token
).await.unwrap(); ).await.unwrap();
let mut current_state: Option<State> = {
let stream = client.get_stream(config::CONFIG.twitch_channel_id.clone()).await;
match stream {
Ok(stream) => {
Some(State {
title: stream.title,
game: stream.game_name,
updated_at: chrono::offset::Utc::now()
})
},
Err(_) => {
None
}
}
};
let mut eventsub_client = client.connect_eventsub( let mut eventsub_client = client.connect_eventsub(
vec![ vec![
("stream.online".to_string(), "1".to_string()), ("stream.online".to_string(), "1".to_string()),
@@ -64,11 +99,39 @@ impl TwitchBot {
).await.unwrap(); ).await.unwrap();
println!("Connected to Twitch EventSub..."); println!("Connected to Twitch EventSub...");
client.refresh_token().await.unwrap(); client.validate_token().await.unwrap();
loop { loop {
println!("Polling Twitch EventSub...");
if let Some(event) = eventsub_client.next().await { if let Some(event) = eventsub_client.next().await {
println!("{:?}", event); match event {
eventsub::NotificationType::CustomRewardRedemptionAdd(_) => todo!(),
eventsub::NotificationType::StreamOffline(_) => {},
eventsub::NotificationType::ChannelUpdate(data) => {
if let Some(state) = current_state {
if state.game != data.title {
notify_game_change(
data.title.clone(),
state.game.clone(),
data.title.clone()
).await;
}
}
current_state = Some(State {
title: data.title,
game: data.category_name.clone(),
updated_at: chrono::offset::Utc::now()
});
},
eventsub::NotificationType::StreamOnline(_) => {
if (chrono::offset::Utc::now() - current_state.as_ref().unwrap().updated_at).num_seconds() > 15 * 60 {
notify_stream_online(current_state.as_ref().unwrap().title.clone()).await;
}
current_state.as_mut().unwrap().updated_at = chrono::offset::Utc::now();
},
}
} }
client.validate_token().await.unwrap(); client.validate_token().await.unwrap();