|
@@ -325,25 +325,21 @@ async fn socket_updater(
|
|
/// The thread responsible for handling the conversation state
|
|
/// The thread responsible for handling the conversation state
|
|
/// (i.e., whether the user is active or idle, and when to send messages).
|
|
/// (i.e., whether the user is active or idle, and when to send messages).
|
|
/// Spawns all other threads for this conversation.
|
|
/// Spawns all other threads for this conversation.
|
|
-async fn manage_conversation(
|
|
|
|
- user: String,
|
|
|
|
- socks: Option<String>,
|
|
|
|
- config: ConversationConfig,
|
|
|
|
-) -> Result<(), MessengerError> {
|
|
|
|
|
|
+async fn manage_conversation(config: FullConfig) -> Result<(), MessengerError> {
|
|
let mut rng = Xoshiro256PlusPlus::from_entropy();
|
|
let mut rng = Xoshiro256PlusPlus::from_entropy();
|
|
let distributions: Distributions = config.distributions.try_into()?;
|
|
let distributions: Distributions = config.distributions.try_into()?;
|
|
|
|
|
|
let message_server_params = SocksParams {
|
|
let message_server_params = SocksParams {
|
|
- socks: socks.clone(),
|
|
|
|
|
|
+ socks: config.socks.clone(),
|
|
target: config.message_server,
|
|
target: config.message_server,
|
|
- user: user.clone(),
|
|
|
|
|
|
+ user: config.user.clone(),
|
|
recipient: config.group.clone(),
|
|
recipient: config.group.clone(),
|
|
};
|
|
};
|
|
|
|
|
|
let web_server_params = SocksParams {
|
|
let web_server_params = SocksParams {
|
|
- socks,
|
|
|
|
|
|
+ socks: config.socks,
|
|
target: config.web_server,
|
|
target: config.web_server,
|
|
- user: user.clone(),
|
|
|
|
|
|
+ user: config.user.clone(),
|
|
recipient: config.group.clone(),
|
|
recipient: config.group.clone(),
|
|
};
|
|
};
|
|
|
|
|
|
@@ -405,7 +401,7 @@ async fn manage_conversation(
|
|
conversation,
|
|
conversation,
|
|
&mut state_from_reader,
|
|
&mut state_from_reader,
|
|
&mut state_to_writer,
|
|
&mut state_to_writer,
|
|
- &user,
|
|
|
|
|
|
+ &config.user,
|
|
&config.group,
|
|
&config.group,
|
|
&mut rng,
|
|
&mut rng,
|
|
)
|
|
)
|
|
@@ -416,7 +412,7 @@ async fn manage_conversation(
|
|
conversation,
|
|
conversation,
|
|
&mut state_from_reader,
|
|
&mut state_from_reader,
|
|
&mut state_to_writer,
|
|
&mut state_to_writer,
|
|
- &user,
|
|
|
|
|
|
+ &config.user,
|
|
&config.group,
|
|
&config.group,
|
|
false,
|
|
false,
|
|
&mut rng,
|
|
&mut rng,
|
|
@@ -427,9 +423,10 @@ async fn manage_conversation(
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-#[derive(Debug, Deserialize)]
|
|
|
|
-struct ConversationConfig {
|
|
|
|
|
|
+struct FullConfig {
|
|
|
|
+ user: String,
|
|
group: String,
|
|
group: String,
|
|
|
|
+ socks: Option<String>,
|
|
message_server: String,
|
|
message_server: String,
|
|
web_server: String,
|
|
web_server: String,
|
|
bootstrap: f64,
|
|
bootstrap: f64,
|
|
@@ -437,10 +434,25 @@ struct ConversationConfig {
|
|
distributions: ConfigDistributions,
|
|
distributions: ConfigDistributions,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#[derive(Debug, Deserialize)]
|
|
|
|
+struct ConversationConfig {
|
|
|
|
+ group: String,
|
|
|
|
+ message_server: Option<String>,
|
|
|
|
+ web_server: Option<String>,
|
|
|
|
+ bootstrap: Option<f64>,
|
|
|
|
+ retry: Option<f64>,
|
|
|
|
+ distributions: Option<ConfigDistributions>,
|
|
|
|
+}
|
|
|
|
+
|
|
#[derive(Debug, Deserialize)]
|
|
#[derive(Debug, Deserialize)]
|
|
struct Config {
|
|
struct Config {
|
|
user: String,
|
|
user: String,
|
|
socks: Option<String>,
|
|
socks: Option<String>,
|
|
|
|
+ message_server: String,
|
|
|
|
+ web_server: String,
|
|
|
|
+ bootstrap: f64,
|
|
|
|
+ retry: f64,
|
|
|
|
+ distributions: ConfigDistributions,
|
|
conversations: Vec<ConversationConfig>,
|
|
conversations: Vec<ConversationConfig>,
|
|
}
|
|
}
|
|
|
|
|
|
@@ -453,9 +465,24 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let yaml_s = std::fs::read_to_string(config_file?)?;
|
|
let yaml_s = std::fs::read_to_string(config_file?)?;
|
|
let config: Config = serde_yaml::from_str(&yaml_s)?;
|
|
let config: Config = serde_yaml::from_str(&yaml_s)?;
|
|
for conversation in config.conversations.into_iter() {
|
|
for conversation in config.conversations.into_iter() {
|
|
- let handle: task::JoinHandle<Result<(), MessengerError>> = tokio::spawn(
|
|
|
|
- manage_conversation(config.user.clone(), config.socks.clone(), conversation),
|
|
|
|
- );
|
|
|
|
|
|
+ let filled_conversation = FullConfig {
|
|
|
|
+ user: config.user.clone(),
|
|
|
|
+ group: conversation.group,
|
|
|
|
+ socks: config.socks.clone(),
|
|
|
|
+ message_server: conversation
|
|
|
|
+ .message_server
|
|
|
|
+ .unwrap_or_else(|| config.message_server.clone()),
|
|
|
|
+ web_server: conversation
|
|
|
|
+ .web_server
|
|
|
|
+ .unwrap_or_else(|| config.web_server.clone()),
|
|
|
|
+ bootstrap: conversation.bootstrap.unwrap_or(config.bootstrap),
|
|
|
|
+ retry: conversation.retry.unwrap_or(config.retry),
|
|
|
|
+ distributions: conversation
|
|
|
|
+ .distributions
|
|
|
|
+ .unwrap_or_else(|| config.distributions.clone()),
|
|
|
|
+ };
|
|
|
|
+ let handle: task::JoinHandle<Result<(), MessengerError>> =
|
|
|
|
+ tokio::spawn(manage_conversation(filled_conversation));
|
|
handles.push(handle);
|
|
handles.push(handle);
|
|
}
|
|
}
|
|
}
|
|
}
|