diff options
Diffstat (limited to 'src/builder/create_embed.rs')
| -rw-r--r-- | src/builder/create_embed.rs | 88 |
1 files changed, 73 insertions, 15 deletions
diff --git a/src/builder/create_embed.rs b/src/builder/create_embed.rs index 0099936..7b676be 100644 --- a/src/builder/create_embed.rs +++ b/src/builder/create_embed.rs @@ -15,9 +15,10 @@ //! [`ExecuteWebhook::embeds`]: struct.ExecuteWebhook.html#method.embeds //! [here]: https://discordapp.com/developers/docs/resources/channel#embed-object +use chrono::{DateTime, TimeZone}; use serde_json::Value; use std::default::Default; -use time::Tm; +use std::fmt::Display; use ::internal::prelude::*; use ::model::Embed; @@ -177,26 +178,75 @@ impl CreateEmbed { /// Set the timestamp. /// - /// **Note**: This timestamp must be in ISO-8601 format. It must also be - /// in UTC format. - /// - /// # Examples - /// /// You may pass a direct string: /// /// - `2017-01-03T23:00:00` /// - `2004-06-08T16:04:23` /// - `2004-06-08T16:04:23` /// - /// Or a `time::Tm`: + /// This timestamp must be in ISO-8601 format. It must also be in UTC format. /// - /// ```rust,ignore - /// extern crate time; + /// You can also pass anything that implements `chrono::TimeZone`. /// - /// let now = time::now(); + /// # Examples + /// + /// Passing a string timestamp: /// - /// embed = embed.timestamp(now); - /// // ... + /// ```rust,no_run + /// # use serenity::Client; + /// # + /// # let mut client = Client::login(""); + /// # + /// client.on_message(|_, msg| { + /// if msg.content == "~embed" { + /// let _ = msg.channel_id.send_message(|m| m + /// .embed(|e| e + /// .title("hello") + /// .timestamp("2004-06-08T16:04:23"))); + /// } + /// }); + /// ``` + /// + /// Creating a join-log: + /// + /// Note: this example isn't efficient and is for demonstrative purposes. + /// + /// ```rust,no_run + /// # use serenity::Client; + /// # + /// # let mut client = Client::login(""); + /// # + /// use serenity::CACHE; + /// + /// client.on_guild_member_add(|_, guild_id, member| { + /// let cache = CACHE.read().unwrap(); + /// + /// if let Some(guild) = cache.guild(guild_id) { + /// let guild = guild.read().unwrap(); + /// + /// let channel_search = guild + /// .channels + /// .values() + /// .find(|c| c.read().unwrap().name == "join-log"); + /// + /// if let Some(channel) = channel_search { + /// let user = member.user.read().unwrap(); + /// + /// let _ = channel.read().unwrap().send_message(|m| m + /// .embed(|e| { + /// let mut e = e + /// .author(|a| a.icon_url(&user.face()).name(&user.name)) + /// .title("Member Join"); + /// + /// if let Some(ref joined_at) = member.joined_at { + /// e = e.timestamp(joined_at); + /// } + /// + /// e + /// })); + /// } + /// } + /// }); /// ``` pub fn timestamp<T: Into<Timestamp>>(mut self, timestamp: T) -> Self { self.0.insert("timestamp".to_owned(), Value::String(timestamp.into().ts)); @@ -406,10 +456,18 @@ impl From<String> for Timestamp { } } -impl From<Tm> for Timestamp { - fn from(tm: Tm) -> Self { +impl<'a> From<&'a str> for Timestamp { + fn from(ts: &'a str) -> Self { + Timestamp { + ts: ts.to_owned(), + } + } +} + +impl<'a, Tz: TimeZone> From<&'a DateTime<Tz>> for Timestamp where Tz::Offset: Display { + fn from(dt: &'a DateTime<Tz>) -> Self { Timestamp { - ts: tm.to_utc().rfc3339().to_string(), + ts: dt.to_rfc3339(), } } } |