diff options
| author | illia k <[email protected]> | 2017-05-22 22:49:07 +0300 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-05-22 12:49:07 -0700 |
| commit | 8f88c6b0613199492ebca8cd9f2bf4dd5c97add7 (patch) | |
| tree | ea2f86a016e8e6a4dc91f8b7492fcb716f946915 /src | |
| parent | Add support for retrieving invites with counts (diff) | |
| download | serenity-8f88c6b0613199492ebca8cd9f2bf4dd5c97add7.tar.xz serenity-8f88c6b0613199492ebca8cd9f2bf4dd5c97add7.zip | |
Handle message type 7 (member join)
When message type 7 is received from the gateway, transform the content
if the type is 7 to a proper greeting.
Additionally, when the type is 6, provide a proper content notifying that a
user has pinned a message to the channel.
These transformations are not done at REST-level when retrieving messages, and
are instead done in `ChannelId::message` and `ChannelId::messages`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/dispatch.rs | 8 | ||||
| -rw-r--r-- | src/constants.rs | 26 | ||||
| -rw-r--r-- | src/model/channel/channel_id.rs | 12 | ||||
| -rw-r--r-- | src/model/channel/message.rs | 25 |
4 files changed, 69 insertions, 2 deletions
diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs index cea3ed3..56b5f6e 100644 --- a/src/client/dispatch.rs +++ b/src/client/dispatch.rs @@ -108,10 +108,14 @@ pub fn dispatch(event: Event, } fn dispatch_message(context: Context, - message: Message, + mut message: Message, event_store: &Arc<RwLock<EventStore>>) { if let Some(handler) = handler!(on_message, event_store) { - thread::spawn(move || (handler)(context, message)); + thread::spawn(move || { + message.transform_content(); + + (handler)(context, message); + }); } } diff --git a/src/constants.rs b/src/constants.rs index de670c9..5c98527 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -12,6 +12,32 @@ pub const MESSAGE_CODE_LIMIT: u16 = 2000; /// [UserAgent]: ../hyper/header/struct.UserAgent.html pub const USER_AGENT: &'static str = concat!("DiscordBot (https://github.com/zeyla/serenity, ", env!("CARGO_PKG_VERSION"), ")"); +/// List of messages Discord shows on member join. +pub static JOIN_MESSAGES: &'static [&'static str] = &[ + "$user just joined the server - glhf!", + "$user just joined. Everyone, look busy!", + "$user just joined. Can I get a heal?", + "$user joined your party.", + "$user joined. You must construct additional pylons.", + "Ermagherd. $user is here.", + "Welcome, $user. Stay awhile and listen.", + "Welcome, $user. We were expecting you ( ͡° ͜ʖ ͡°)", + "Welcome, $user. We hope you brought pizza.", + "Welcome $user. Leave your weapons by the door.", + "A wild $user appeared.", + "Swoooosh. $user just landed.", + "Brace yourselves. $user just joined the server.", + "$user just joined. Hide your bananas.", + "$user just arrived. Seems OP - please nerf.", + "$user just slid into the server.", + "A $user has spawned in the server.", + "Big $user showed up!", + "Where’s $user? In the server!", + "$user hopped into the server. Kangaroo!!", + "$user just showed up. Hold my beer." +]; + + #[allow(dead_code)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub enum ErrorCode { diff --git a/src/model/channel/channel_id.rs b/src/model/channel/channel_id.rs index 66bbbf3..46b00c6 100644 --- a/src/model/channel/channel_id.rs +++ b/src/model/channel/channel_id.rs @@ -255,6 +255,11 @@ impl ChannelId { #[inline] pub fn message<M: Into<MessageId>>(&self, message_id: M) -> Result<Message> { rest::get_message(self.0, message_id.into().0) + .map(|mut msg| { + msg.transform_content(); + + msg + }) } /// Gets messages from the channel. @@ -279,6 +284,13 @@ impl ChannelId { } rest::get_messages(self.0, &query) + .map(|msgs| msgs + .into_iter() + .map(|mut msg| { + msg.transform_content(); + + msg + }).collect::<Vec<Message>>()) } /// Pins a [`Message`] to the channel. diff --git a/src/model/channel/message.rs b/src/model/channel/message.rs index d360975..593aa48 100644 --- a/src/model/channel/message.rs +++ b/src/model/channel/message.rs @@ -1,4 +1,5 @@ use std::mem; +use time; use ::constants; use ::client::rest; use ::model::*; @@ -189,6 +190,28 @@ impl Message { } } + #[doc(hidden)] + pub fn transform_content(&mut self) { + match self.kind { + MessageType::PinsAdd => { + self.content = format!("{} pinned a message to this channel. See all the pins.", self.author); + }, + MessageType::MemberJoin => { + if let Ok(tm) = time::strptime(&self.timestamp, "%Y-%m-%dT%H:%M:%S") { + let sec = tm.to_timespec().sec as usize; + let chosen = constants::JOIN_MESSAGES[sec % constants::JOIN_MESSAGES.len()]; + + self.content = if chosen.contains("$user") { + chosen.replace("$user", &self.author.mention()) + } else { + chosen.to_owned() + }; + } + }, + _ => {}, + } + } + /// Returns message content, but with user and role mentions replaced with /// names and everyone/here mentions cancelled. #[cfg(feature="cache")] @@ -550,6 +573,8 @@ enum_number!( GroupIconUpdate = 5, /// An indicator that a message was pinned by the author. PinsAdd = 6, + /// An indicator that a member joined the guild. + MemberJoin = 7, } ); |