aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-11-19 01:23:50 +0100
committerGustav Sörnäs <gustav@sornas.net>2020-11-19 11:42:10 +0100
commit603343995f33738a44243192c931ad61f2750916 (patch)
treefbcb94c8f6a07c0db06231e8b5fad0f7286598b4
parent4568425fadb92788ecacd57560227a63b5610376 (diff)
downloadkodapa-603343995f33738a44243192c931ad61f2750916.tar.gz
slack: store display names in hashmap
-rw-r--r--src/slack.rs65
1 files changed, 50 insertions, 15 deletions
diff --git a/src/slack.rs b/src/slack.rs
index 8e7a7fe..0dfef52 100644
--- a/src/slack.rs
+++ b/src/slack.rs
@@ -1,22 +1,16 @@
-use crate::agenda::{
- parse_message,
- AgendaPoint,
- Emoji
-};
+use crate::agenda::{parse_message, AgendaPoint, Emoji};
use futures::join;
-use slack::{
- Event,
- Message,
+use slack::{Event, Message};
+use slack_api::{reactions, users};
+use std::{
+ collections::{hash_map::Entry, HashMap},
+ sync::{Arc, Mutex},
};
-use slack_api::reactions;
use tokio::{
runtime::Runtime,
sync::mpsc,
- task::{
- spawn,
- spawn_blocking,
- },
+ task::{spawn, spawn_blocking},
};
use tokio_compat_02::FutureExt;
@@ -29,6 +23,7 @@ struct Handler {
slack_channel: Option<String>,
print_channels: bool,
slack_token: String,
+ display_names: Arc<Mutex<HashMap<String, String>>>,
}
impl Handler {
@@ -44,6 +39,37 @@ impl Handler {
slack_channel: slack_channel.clone(),
print_channels: slack_channel.is_none(),
slack_token,
+ display_names: Arc::new(Mutex::new(HashMap::new())),
+ }
+ }
+
+}
+
+async fn get_or_insert_display_name(
+ display_names: Arc<Mutex<HashMap<String, String>>>,
+ user_id: String,
+ slack_token: &str,
+) -> String {
+ match display_names.lock().unwrap().entry(user_id.clone()) {
+ Entry::Occupied(o) => o.get().to_string(),
+ Entry::Vacant(v) => {
+ let client = slack_api::requests::default_client().unwrap();
+ if let Some(user) = users::list(
+ &client,
+ slack_token,
+ &users::ListRequest {presence: None}
+ ).compat()
+ .await
+ .unwrap()
+ .members
+ .unwrap()
+ .iter()
+ .find(|user| user.id.is_some() && user.id.as_deref().unwrap() == user_id)
+ {
+ v.insert(user.real_name.as_ref().unwrap().clone()).to_string()
+ } else {
+ user_id
+ }
}
}
}
@@ -71,13 +97,22 @@ impl slack::EventHandler for Handler {
}
}
Event::Message(msg) => {
- if let Some(channel) = &self.slack_channel {
+ if let Some(channel) = &self.slack_channel.clone() {
match *msg {
Message::Standard(msg) => {
if msg.channel.is_some() && *channel == msg.channel.unwrap() { //TODO
+ let user = match msg.user {
+ Some(s) => Runtime::new().unwrap().block_on(
+ get_or_insert_display_name(
+ Arc::clone(&self.display_names),
+ s,
+ &self.slack_token,
+ ).compat()),
+ None => "??".to_string()
+ };
match parse_message(
&msg.text.unwrap_or("".to_string()),
- &msg.user.unwrap_or("??".to_string()),
+ &user,
|s: String| {
self.slack_sender
.send_message(channel.as_str(), &s)