mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-05 17:58:55 +00:00
less type juggling
This commit is contained in:
1 parent
0cb8cbd802
commit
035acf62c5
5 files changed
+55
-14
No files matched your search
@@ -10,6 +10,7 @@ use crate::server_state::ObsGatewayServerState;
|
||||
use crate::twitch::oauth::oauth_token_refresher::OauthTokenRefresher;
|
||||
use crate::twitch::polling_websocket_client::PollingTwitchWebsocketClient;
|
||||
use crate::twitch::pubsub::build_pubsub_topics_for_user::build_pubsub_topics_for_user;
|
||||
use crate::twitch::twitch_user_id::TwitchUserId;
|
||||
use crate::twitch::websocket_client::TwitchWebsocketClient;
|
||||
use database_queries::twitch_oauth::find::{TwitchOauthTokenFinder, TwitchOauthTokenRecord};
|
||||
use futures_timer::Delay;
|
||||
@@ -64,7 +65,7 @@ pub async fn obs_gateway_websocket_handler(
|
||||
},
|
||||
};
|
||||
|
||||
let user_id = token_record.twitch_user_id.parse::<u32>()
|
||||
let twitch_user_id = TwitchUserId::from_string(&token_record.twitch_user_id)
|
||||
.map_err(|e| {
|
||||
error!("Error converting twitch user id: {}, id= {}", e, &token_record.twitch_user_id);
|
||||
CommonServerError::ServerError
|
||||
@@ -95,7 +96,7 @@ pub async fn obs_gateway_websocket_handler(
|
||||
|
||||
let mut client = TwitchWebsocketClient::new().unwrap();
|
||||
let token_refresher = OauthTokenRefresher::new(
|
||||
user_id,
|
||||
twitch_user_id.get_numeric(),
|
||||
&token_record.access_token,
|
||||
token_record.maybe_refresh_token.as_deref());
|
||||
|
||||
@@ -125,7 +126,7 @@ pub async fn obs_gateway_websocket_handler(
|
||||
let server_state_arc = server_state.get_ref().clone();
|
||||
|
||||
let websocket = ObsGatewayWebSocket::new(
|
||||
user_id,
|
||||
twitch_user_id.clone(),
|
||||
client,
|
||||
token_refresher,
|
||||
server_state_arc
|
||||
@@ -140,20 +141,22 @@ pub async fn obs_gateway_websocket_handler(
|
||||
|
||||
/// Websocket behavior
|
||||
struct ObsGatewayWebSocket {
|
||||
//twitch_client: PollingTwitchWebsocketClient,
|
||||
twitch_user_id: u32,
|
||||
twitch_user_id: TwitchUserId,
|
||||
twitch_thread: Arc<ObsTwitchThread>,
|
||||
server_state: Arc<ObsGatewayServerState>,
|
||||
}
|
||||
|
||||
impl ObsGatewayWebSocket {
|
||||
fn new(
|
||||
twitch_user_id: u32,
|
||||
twitch_user_id: TwitchUserId,
|
||||
twitch_client: TwitchWebsocketClient,
|
||||
oauth_token_refresher: OauthTokenRefresher,
|
||||
server_state: Arc<ObsGatewayServerState>,
|
||||
) -> Self {
|
||||
let twitch_thread = Arc::new(ObsTwitchThread::new(twitch_user_id, oauth_token_refresher, twitch_client));
|
||||
let twitch_thread = Arc::new(ObsTwitchThread::new(
|
||||
twitch_user_id.clone(),
|
||||
oauth_token_refresher,
|
||||
twitch_client));
|
||||
Self {
|
||||
twitch_user_id,
|
||||
twitch_thread,
|
||||
@@ -238,8 +241,8 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for ObsGatewayWebSock
|
||||
|
||||
let channel = RedisKeys::obs_active_session_topic();
|
||||
|
||||
let twitch_user_id = self.twitch_user_id.to_string();
|
||||
let payload = ObsActivePayload::new(&twitch_user_id);
|
||||
let payload = ObsActivePayload::new(self.twitch_user_id.get_str());
|
||||
|
||||
let json_payload = payload.serialize()
|
||||
.map_err(|e| {
|
||||
error!("Could not serialize JSON: {:?}", e);
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
use crate::twitch::oauth::oauth_token_refresher::OauthTokenRefresher;
|
||||
use crate::twitch::polling_websocket_client::PollingTwitchWebsocketClient;
|
||||
use crate::twitch::twitch_user_id::TwitchUserId;
|
||||
use crate::twitch::websocket_client::TwitchWebsocketClient;
|
||||
use futures::lock::Mutex;
|
||||
use log::error;
|
||||
use log::info;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::{Arc, RwLock, PoisonError, RwLockWriteGuard};
|
||||
use std::thread::sleep;
|
||||
use futures::lock::Mutex;
|
||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||
use std::time::Instant;
|
||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||
use tokio::runtime::Handle;
|
||||
use crate::twitch::oauth::oauth_token_refresher::OauthTokenRefresher;
|
||||
|
||||
// TODO: Let's make this an Arc<RwLock<Map<Token, Thread>>>
|
||||
// so that multiple browser sessions for the same user can
|
||||
@@ -27,7 +28,7 @@ pub struct ObsTwitchThread {
|
||||
}
|
||||
|
||||
struct InnerData {
|
||||
twitch_user_id: u32,
|
||||
twitch_user_id: TwitchUserId,
|
||||
token_refresher: OauthTokenRefresher,
|
||||
is_connected: bool,
|
||||
twitch_client: TwitchWebsocketClient,
|
||||
@@ -36,7 +37,7 @@ struct InnerData {
|
||||
|
||||
impl ObsTwitchThread {
|
||||
pub fn new(
|
||||
twitch_user_id: u32,
|
||||
twitch_user_id: TwitchUserId,
|
||||
token_refresher: OauthTokenRefresher,
|
||||
twitch_client: TwitchWebsocketClient
|
||||
) -> Self {
|
||||
|
||||
@@ -15,6 +15,7 @@ use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
use twitch_api2::pubsub::Response;
|
||||
|
||||
/// Receive both forms of twitch userid
|
||||
pub async fn twitch_pubsub_user_subscriber_thread(
|
||||
twitch_user_id: String,
|
||||
mysql_pool: Arc<sqlx::Pool<MySql>>,
|
||||
|
||||
@@ -3,4 +3,5 @@ pub mod polling_websocket_client;
|
||||
pub mod pubsub;
|
||||
pub mod twitch_client_wrapper;
|
||||
pub mod twitch_secrets;
|
||||
pub mod twitch_user_id;
|
||||
pub mod websocket_client;
|
||||
@@ -0,0 +1,35 @@
|
||||
use container_common::anyhow_result::AnyhowResult;
|
||||
|
||||
/// Twitch says to encode these as strings, but the Twitch libraries
|
||||
/// still deal in integers. This centralizes type juggling.
|
||||
#[derive(Clone)]
|
||||
pub struct TwitchUserId {
|
||||
string_user_id: String,
|
||||
numeric_user_id: u32,
|
||||
}
|
||||
|
||||
impl TwitchUserId {
|
||||
|
||||
pub fn from_string(twitch_user_id: &str) -> AnyhowResult<Self> {
|
||||
let numeric_id = twitch_user_id.parse::<u32>()?;
|
||||
Ok(Self {
|
||||
string_user_id: twitch_user_id.to_string(),
|
||||
numeric_user_id: numeric_id,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn from_numeric(twitch_user_id: u32) -> Self {
|
||||
Self {
|
||||
string_user_id: twitch_user_id.to_string(),
|
||||
numeric_user_id: twitch_user_id,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_numeric(&self) -> u32 {
|
||||
self.numeric_user_id
|
||||
}
|
||||
|
||||
pub fn get_str(&self) -> &str {
|
||||
&self.string_user_id
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user