aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorillia k <[email protected]>2017-05-22 22:49:07 +0300
committerZeyla Hellyer <[email protected]>2017-05-22 12:49:07 -0700
commit8f88c6b0613199492ebca8cd9f2bf4dd5c97add7 (patch)
treeea2f86a016e8e6a4dc91f8b7492fcb716f946915 /src
parentAdd support for retrieving invites with counts (diff)
downloadserenity-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.rs8
-rw-r--r--src/constants.rs26
-rw-r--r--src/model/channel/channel_id.rs12
-rw-r--r--src/model/channel/message.rs25
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,
}
);