less type juggling

This commit is contained in:
Brandon Thomas committed 2022-01-18 22:57:55 -05:00
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
}
}