Skip to content

Commit

Permalink
Make Message::nonce a serde_json::Value
Browse files Browse the repository at this point in the history
Nonces can actually be almost anything - including booleans - so just
use a Value to represent it since very few users will need it.

This fixes errors like:
```
WARN:serenity::internal::ws_impl: (╯°□°)╯︵ ┻━┻ Error decoding: {"t":"MESSAGE_CREATE","s":12187872,"op":0,"d":{"type":0,"tts":false,"timestamp":"2017-06-01T01:00:00.000000+00:00","pinned":false,"nonce":"","mentions":[{"username":"redacted","id":"redacted","discriminator":"redacted","avatar":"redacted"}],"mention_roles":[],"mention_everyone":false,"id":"redacted","embeds":[],"edited_timestamp":null,"content":"redacted","channel_id":"redacted","author":{"username":"redacted","id":"redacted","discriminator":"redacted","bot":true,"avatar":"redacted"},"attachments":[]}}
ERROR:serenity::client: Shard handler received err: Json(ErrorImpl { code: Message("Unknown i64 value: "), line: 0, column: 0 })
```

and:

```
WARN:serenity::internal::ws_impl: (╯°□°)╯︵ ┻━┻ Error decoding: {"t":"MESSAGE_CREATE","s":1001192,"op":0,"d":{"type":0,"tts":false,"timestamp":"2017-06-01T01:01:01.000000+00:00","pinned":false,"nonce":true,"mentions":[],"mention_roles":[],"mention_everyone":false,"id":"redacted","embeds":[],"edited_timestamp":null,"content":"bork","channel_id":"redacted","author":{"username":"redacted","id":"redacted","discriminator":"redacted","bot":true,"avatar":"redacted"},"attachments":[]}}
ERROR:serenity::client: Shard handler received err: Json(ErrorImpl { code: Message("invalid type: boolean `true`, expected identifier"), line: 0, column: 0 })
```
  • Loading branch information
Zeyla Hellyer committed Jun 23, 2017
1 parent a68dbf9 commit c832009
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 81 deletions.
4 changes: 3 additions & 1 deletion src/model/channel/message.rs
@@ -1,4 +1,5 @@
use chrono::{DateTime, FixedOffset};
use serde_json::Value;
use ::model::*;

#[cfg(feature="cache")]
Expand Down Expand Up @@ -48,7 +49,8 @@ pub struct Message {
/// Array of users mentioned in the message.
pub mentions: Vec<User>,
/// Non-repeating number used for ensuring message order.
pub nonce: Option<Snowflake>,
#[serde(default)]
pub nonce: Value,
/// Indicator of whether the message is pinned.
pub pinned: bool,
/// Array of reactions performed on the message.
Expand Down
49 changes: 0 additions & 49 deletions src/model/mod.rs
Expand Up @@ -53,50 +53,6 @@ use ::utils::Colour;

fn default_true() -> bool { true }

macro_rules! id_i64 {
($(#[$attr:meta] $name:ident;)*) => {
$(
#[$attr]
#[derive(Copy, Clone, Debug, Eq, Hash, PartialOrd, Ord, Serialize)]
#[allow(derive_hash_xor_eq)]
pub struct $name(pub i64);

impl $name {
/// Retrieves the time that the Id was created at.
pub fn created_at(&self) -> NaiveDateTime {
let offset = (self.0 >> 22) / 1000;

NaiveDateTime::from_timestamp(1420070400 + offset, 0)
}
}

impl From<i64> for $name {
fn from(v: i64) -> $name {
$name(v)
}
}

impl PartialEq for $name {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}

impl PartialEq<i64> for $name {
fn eq(&self, u: &i64) -> bool {
self.0 == *u
}
}

impl<'de> Deserialize<'de> for $name {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
deserializer.deserialize_i64(I64Visitor).map($name)
}
}
)*
};
}

macro_rules! id_u64 {
($(#[$attr:meta] $name:ident;)*) => {
$(
Expand Down Expand Up @@ -160,11 +116,6 @@ id_u64! {
WebhookId;
}

id_i64! {
/// An identifier for a general-purpose signed snowflake.
Snowflake;
}

/// A container for guilds.
///
/// This is used to differentiate whether a guild itself can be used or whether
Expand Down
31 changes: 0 additions & 31 deletions src/model/utils.rs
Expand Up @@ -240,34 +240,3 @@ impl<'de> Visitor<'de> for U64Visitor {
Ok(v)
}
}

pub struct I64Visitor;

impl<'de> Visitor<'de> for I64Visitor {
type Value = i64;

fn expecting(&self, formatter: &mut Formatter) -> FmtResult {
formatter.write_str("identifier")
}

fn visit_str<E: DeError>(self, v: &str) -> StdResult<Self::Value, E> {
match v.parse::<i64>() {
Ok(v) => Ok(v),
Err(_) => {
let mut s = String::new();
s.push_str("Unknown i64 value: ");
s.push_str(v);

Err(DeError::custom(s))
},
}
}

fn visit_i64<E: DeError>(self, v: i64) -> StdResult<Self::Value, E> {
Ok(v)
}

fn visit_u64<E: DeError>(self, v: u64) -> StdResult<Self::Value, E> {
Ok(v as i64)
}
}

0 comments on commit c832009

Please sign in to comment.