aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/discord.rs54
-rw-r--r--src/main.rs98
-rw-r--r--src/slack.rs39
3 files changed, 99 insertions, 92 deletions
diff --git a/src/discord.rs b/src/discord.rs
new file mode 100644
index 0000000..06baec6
--- /dev/null
+++ b/src/discord.rs
@@ -0,0 +1,54 @@
+use discord::{
+ model::Event,
+ Discord,
+};
+use futures::join;
+use tokio::{
+ sync::mpsc,
+ task::{
+ spawn,
+ spawn_blocking,
+ },
+};
+
+pub async fn handle(
+ token: Option<String>,
+ _sender: mpsc::UnboundedSender<String>,
+ mut receiver: mpsc::UnboundedReceiver<String>,
+) {
+ println!("Setting up Discord");
+
+ let token = std::env::var("DISCORD_API_TOKEN")
+ .unwrap_or(token.unwrap());
+ let client = Discord::from_bot_token(&token);
+
+ if let Ok(client) = client {
+ let (mut connection, _) = client.connect().expect("discord connect failed"); //TODO
+ println!("Discord ready");
+
+ 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);
+ }
+ }
+ }
+ }),
+ spawn(async move {
+ while let Some(s) = receiver.recv().await {
+ println!("Discord received '{}' from slack", s);
+ }
+ })
+ );
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index 2b5bb14..9cdd2e0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,16 +1,8 @@
-use discord::{
- model::Event,
- Discord,
-};
+mod discord;
+mod slack;
+
use futures::join;
-use slack_api as slack;
-use tokio::{
- sync::mpsc,
- task::{
- spawn,
- spawn_blocking,
- },
-};
+use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
@@ -23,86 +15,8 @@ async fn main() {
let (from_slack, to_discord) = mpsc::unbounded_channel::<String>();
join!(
- discord_loop(discord_token, from_discord, to_discord),
- slack_loop(slack_token, from_slack, to_slack),
+ discord::handle(discord_token, from_discord, to_discord),
+ slack::handle(slack_token, from_slack, to_slack),
);
}
-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")
- .unwrap_or(token.unwrap());
- let client = slack::default_client().unwrap();
-
- let request = slack::rtm::StartRequest::default();
- let response = slack::rtm::start(&client,
- &token,
- &request).await;
-
- if let Ok(response) = response {
- if let Some(channels) = response.channels {
- let channel_names = channels
- .iter()
- .filter_map(|c| c.name.as_ref())
- .collect::<Vec<_>>();
- sender.send(format!("Got channels {:?}", channel_names).to_string()).unwrap();
- }
-
- if let Some(users) = response.users {
- let user_names = users
- .iter()
- .filter_map(|u| u.name.as_ref())
- .collect::<Vec<_>>();
- sender.send(format!("Got users {:?}", user_names).to_string()).unwrap();
- }
- } else { //TODO NotAuth etc
- println!("{:?}", response)
- }
-}
-
-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")
- .unwrap_or(token.unwrap());
- let client = Discord::from_bot_token(&token);
-
- if let Ok(client) = client {
- let (mut connection, _) = client.connect().expect("discord connect failed"); //TODO
- println!("Discord ready");
-
- 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);
- }
- }
- }
- }),
- spawn(async move {
- while let Some(s) = receiver.recv().await {
- println!("Discord received '{}' from slack", s);
- }
- })
- );
- }
-}
diff --git a/src/slack.rs b/src/slack.rs
new file mode 100644
index 0000000..40e465c
--- /dev/null
+++ b/src/slack.rs
@@ -0,0 +1,39 @@
+use slack_api as slack;
+use tokio::sync::mpsc;
+
+pub async fn handle(
+ token: Option<String>,
+ sender: mpsc::UnboundedSender<String>,
+ _receiver: mpsc::UnboundedReceiver<String>,
+) {
+ println!("Setting up Slack");
+
+ let token = std::env::var("SLACK_API_TOKEN")
+ .unwrap_or(token.unwrap());
+ let client = slack::default_client().unwrap();
+
+ let request = slack::rtm::StartRequest::default();
+ let response = slack::rtm::start(&client,
+ &token,
+ &request).await;
+
+ if let Ok(response) = response {
+ if let Some(channels) = response.channels {
+ let channel_names = channels
+ .iter()
+ .filter_map(|c| c.name.as_ref())
+ .collect::<Vec<_>>();
+ sender.send(format!("Got channels {:?}", channel_names).to_string()).unwrap();
+ }
+
+ if let Some(users) = response.users {
+ let user_names = users
+ .iter()
+ .filter_map(|u| u.name.as_ref())
+ .collect::<Vec<_>>();
+ sender.send(format!("Got users {:?}", user_names).to_string()).unwrap();
+ }
+ } else { //TODO NotAuth etc
+ println!("{:?}", response)
+ }
+}