diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-11-11 13:06:56 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-11-11 13:06:56 +0100 |
| commit | a6fd44ae860ce48b6a7979a2c8b380c11fa7168e (patch) | |
| tree | ad609e5b79fda391f344bb63f6ed3bb18267910a /src | |
| parent | ee5bcaa0fa6deb268e5f304600d38d9a67f93f52 (diff) | |
| download | kodapa-a6fd44ae860ce48b6a7979a2c8b380c11fa7168e.tar.gz | |
send strings between async
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/src/main.rs b/src/main.rs index bcc2bab..2b5bb14 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,13 @@ use discord::{ }; use futures::join; use slack_api as slack; -use tokio::task::spawn_blocking; +use tokio::{ + sync::mpsc, + task::{ + spawn, + spawn_blocking, + }, +}; #[tokio::main] async fn main() { @@ -13,15 +19,20 @@ async fn main() { println!("Hello, world!"); + let (from_discord, to_slack) = mpsc::unbounded_channel::<String>(); + let (from_slack, to_discord) = mpsc::unbounded_channel::<String>(); + join!( - spawn_blocking(move || { - discord_loop(discord_token); - }), - slack_loop(slack_token), + discord_loop(discord_token, from_discord, to_discord), + slack_loop(slack_token, from_slack, to_slack), ); } -async fn slack_loop(token: Option<String>) { +async fn slack_loop( + token: Option<String>, + sender: mpsc::UnboundedSender<String>, + _receiver: mpsc::UnboundedReceiver<String>, +) { println!("Setting up Slack"); let token = std::env::var("SLACK_API_TOKEN") @@ -39,7 +50,7 @@ async fn slack_loop(token: Option<String>) { .iter() .filter_map(|c| c.name.as_ref()) .collect::<Vec<_>>(); - println!("Got channels {:?}", channel_names); + sender.send(format!("Got channels {:?}", channel_names).to_string()).unwrap(); } if let Some(users) = response.users { @@ -47,14 +58,18 @@ async fn slack_loop(token: Option<String>) { .iter() .filter_map(|u| u.name.as_ref()) .collect::<Vec<_>>(); - println!("Got users {:?}", user_names); + sender.send(format!("Got users {:?}", user_names).to_string()).unwrap(); } - } else { + } else { //TODO NotAuth etc println!("{:?}", response) } } -fn discord_loop(token: Option<String>) { +async fn discord_loop( + token: Option<String>, + _sender: mpsc::UnboundedSender<String>, + mut receiver: mpsc::UnboundedReceiver<String>, +) { println!("Setting up Discord"); let token = std::env::var("DISCORD_API_TOKEN") @@ -62,22 +77,32 @@ fn discord_loop(token: Option<String>) { let client = Discord::from_bot_token(&token); if let Ok(client) = client { - let (mut connection, _) = client.connect().expect("discord connect failed"); + let (mut connection, _) = client.connect().expect("discord connect failed"); //TODO println!("Discord ready"); - loop { - match connection.recv_event() { - Ok(Event::MessageCreate(message)) => { - println!("{} says: {}", message.author.name, message.content); - } - Ok(_) => {} - Err(discord::Error::Closed(code, body)) => { - println!("Discord closed with code {:?}: {}", code, body); - break; + + let (_, _) = join!( //TODO + spawn_blocking(move || { + loop { + match connection.recv_event() { + Ok(Event::MessageCreate(message)) => { + println!("{} says: {}", message.author.name, message.content); + } + Ok(_) => {} + Err(discord::Error::Closed(code, body)) => { + println!("Discord closed with code {:?}: {}", code, body); + break; + } + Err(err) => { + println!("Error: {:?}", err); + } + } } - Err(err) => { - println!("Error: {:?}", err); + }), + spawn(async move { + while let Some(s) = receiver.recv().await { + println!("Discord received '{}' from slack", s); } - } - } + }) + ); } } |
