|
@@ -133,14 +133,18 @@ async fn socket_updater(
|
|
|
/// The thread responsible for handling the conversation state
|
|
|
/// (i.e., whether the user is active or idle, and when to send messages).
|
|
|
/// Spawns all other threads for this conversation.
|
|
|
-async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
|
|
|
+async fn manage_conversation(
|
|
|
+ user: String,
|
|
|
+ socks: Option<String>,
|
|
|
+ config: ConversationConfig,
|
|
|
+) -> Result<(), MessengerError> {
|
|
|
let mut rng = Xoshiro256PlusPlus::from_entropy();
|
|
|
let distributions: Distributions = config.distributions.try_into()?;
|
|
|
|
|
|
let str_params = SocksParams {
|
|
|
- socks: config.socks,
|
|
|
+ socks,
|
|
|
target: config.server,
|
|
|
- user: config.user.clone(),
|
|
|
+ user: user.clone(),
|
|
|
recipient: config.group.clone(),
|
|
|
};
|
|
|
|
|
@@ -153,6 +157,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
|
|
|
let write_socket_updater_in = Updater::new();
|
|
|
let write_socket_updater_out = write_socket_updater_in.clone();
|
|
|
let (errs_in, errs_out) = mpsc::unbounded_channel();
|
|
|
+
|
|
|
tokio::spawn(reader(
|
|
|
reader_to_state,
|
|
|
read_socket_updater_out,
|
|
@@ -179,7 +184,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
|
|
|
conversation,
|
|
|
&mut state_from_reader,
|
|
|
&mut state_to_writer,
|
|
|
- &config.user,
|
|
|
+ &user,
|
|
|
&config.group,
|
|
|
false,
|
|
|
&mut rng,
|
|
@@ -191,7 +196,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
|
|
|
conversation,
|
|
|
&mut state_from_reader,
|
|
|
&mut state_to_writer,
|
|
|
- &config.user,
|
|
|
+ &user,
|
|
|
&config.group,
|
|
|
false,
|
|
|
&mut rng,
|
|
@@ -203,16 +208,21 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
|
-struct Config {
|
|
|
- user: String,
|
|
|
+struct ConversationConfig {
|
|
|
group: String,
|
|
|
- socks: Option<String>,
|
|
|
server: String,
|
|
|
bootstrap: f64,
|
|
|
retry: f64,
|
|
|
distributions: ConfigDistributions,
|
|
|
}
|
|
|
|
|
|
+#[derive(Debug, Deserialize)]
|
|
|
+struct Config {
|
|
|
+ user: String,
|
|
|
+ socks: Option<String>,
|
|
|
+ conversations: Vec<ConversationConfig>,
|
|
|
+}
|
|
|
+
|
|
|
#[tokio::main]
|
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
let mut args = std::env::args();
|
|
@@ -220,10 +230,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
let mut handles = vec![];
|
|
|
for config_file in args.flat_map(|a| glob::glob(a.as_str()).unwrap()) {
|
|
|
let toml_s = std::fs::read_to_string(config_file?)?;
|
|
|
- let config = toml::from_str(&toml_s)?;
|
|
|
- let handle: task::JoinHandle<Result<(), MessengerError>> =
|
|
|
- tokio::spawn(manage_conversation(config));
|
|
|
- handles.push(handle);
|
|
|
+ let config: Config = toml::from_str(&toml_s)?;
|
|
|
+ for conversation in config.conversations.into_iter() {
|
|
|
+ let handle: task::JoinHandle<Result<(), MessengerError>> = tokio::spawn(
|
|
|
+ manage_conversation(config.user.clone(), config.socks.clone(), conversation),
|
|
|
+ );
|
|
|
+ handles.push(handle);
|
|
|
+ }
|
|
|
}
|
|
|
handles.shrink_to_fit();
|
|
|
for handle in handles {
|