aboutsummaryrefslogtreecommitdiff
path: root/src/model
diff options
context:
space:
mode:
authorAustin Hellyer <[email protected]>2016-11-29 20:51:10 -0800
committerAustin Hellyer <[email protected]>2016-11-29 22:27:59 -0800
commit93b990d8d1bc9df69b8e27a3db61da570822aad6 (patch)
tree6305cf635df90681527a8e736f65ff19f21fd8bc /src/model
parentAdd more shiny readme badges (diff)
downloadserenity-93b990d8d1bc9df69b8e27a3db61da570822aad6.tar.xz
serenity-93b990d8d1bc9df69b8e27a3db61da570822aad6.zip
Clean up the codebase
Diffstat (limited to 'src/model')
-rw-r--r--src/model/channel.rs13
-rw-r--r--src/model/event.rs149
-rw-r--r--src/model/gateway.rs4
-rw-r--r--src/model/guild.rs16
-rw-r--r--src/model/user.rs8
-rw-r--r--src/model/utils.rs21
-rw-r--r--src/model/voice.rs91
7 files changed, 137 insertions, 165 deletions
diff --git a/src/model/channel.rs b/src/model/channel.rs
index 33e6044..13cf506 100644
--- a/src/model/channel.rs
+++ b/src/model/channel.rs
@@ -6,7 +6,6 @@ use super::utils::{
into_string,
opt,
remove,
- warn_field,
};
use super::*;
use ::constants;
@@ -343,7 +342,7 @@ impl Group {
/// Returns the formatted URI of the group's icon if one exists.
pub fn icon_url(&self) -> Option<String> {
self.icon.as_ref().map(|icon|
- format!(cdn_concat!("/channel-icons/{}/{}.jpg"), self.channel_id, icon))
+ format!(cdn!("/channel-icons/{}/{}.jpg"), self.channel_id, icon))
}
/// Leaves the group.
@@ -639,8 +638,7 @@ impl Message {
}}
let mut gen = format!("{}", self.author.mention());
- gen.push(':');
- gen.push(' ');
+ gen.push_str(": ");
gen.push_str(content);
let map = ObjectBuilder::new()
@@ -690,7 +688,7 @@ impl PermissionOverwrite {
_ => return Err(Error::Decode("Expected valid PermissionOverwrite type", Value::String(kind))),
};
- missing!(map, PermissionOverwrite {
+ Ok(PermissionOverwrite {
kind: kind,
allow: try!(remove(&mut map, "allow").and_then(Permissions::decode)),
deny: try!(remove(&mut map, "deny").and_then(Permissions::decode)),
@@ -711,7 +709,7 @@ impl PrivateChannel {
let mut recipients = try!(decode_array(try!(remove(&mut map, "recipients")),
User::decode));
- missing!(map, PrivateChannel {
+ Ok(PrivateChannel {
id: try!(remove(&mut map, "id").and_then(ChannelId::decode)),
kind: try!(remove(&mut map, "type").and_then(ChannelType::decode)),
last_message_id: try!(opt(&mut map, "last_message_id", MessageId::decode)),
@@ -858,7 +856,8 @@ impl GuildChannel {
#[doc(hidden)]
pub fn decode_guild(value: Value, guild_id: GuildId) -> Result<GuildChannel> {
let mut map = try!(into_map(value));
- missing!(map, GuildChannel {
+
+ Ok(GuildChannel {
id: try!(remove(&mut map, "id").and_then(ChannelId::decode)),
name: try!(remove(&mut map, "name").and_then(into_string)),
guild_id: guild_id,
diff --git a/src/model/event.rs b/src/model/event.rs
index 694ebf1..d459503 100644
--- a/src/model/event.rs
+++ b/src/model/event.rs
@@ -3,7 +3,7 @@
use std::collections::{BTreeMap, HashMap};
use super::utils::*;
use super::*;
-use ::constants::OpCode;
+use ::constants::{OpCode, VoiceOpCode};
use ::internal::prelude::*;
use ::utils::decode_array;
@@ -489,11 +489,11 @@ impl Event {
call: try!(Call::decode(Value::Object(value))),
}))
} else if kind == "CALL_DELETE" {
- missing!(value, Event::CallDelete(CallDeleteEvent {
+ Ok(Event::CallDelete(CallDeleteEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
}))
} else if kind == "CALL_UPDATE" {
- missing!(value, Event::CallUpdate(CallUpdateEvent {
+ Ok(Event::CallUpdate(CallUpdateEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
message_id: try!(remove(&mut value, "message_id").and_then(MessageId::decode)),
region: try!(remove(&mut value, "region").and_then(into_string)),
@@ -508,22 +508,22 @@ impl Event {
channel: try!(Channel::decode(Value::Object(value))),
}))
} else if kind == "CHANNEL_PINS_ACK" {
- missing!(value, Event::ChannelPinsAck(ChannelPinsAckEvent {
+ Ok(Event::ChannelPinsAck(ChannelPinsAckEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
timestamp: try!(remove(&mut value, "timestamp").and_then(into_string)),
}))
} else if kind == "CHANNEL_PINS_UPDATE" {
- missing!(value, Event::ChannelPinsUpdate(ChannelPinsUpdateEvent {
+ Ok(Event::ChannelPinsUpdate(ChannelPinsUpdateEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
last_pin_timestamp: try!(opt(&mut value, "last_pin_timestamp", into_string)),
}))
} else if kind == "CHANNEL_RECIPIENT_ADD" {
- missing!(value, Event::ChannelRecipientAdd(ChannelRecipientAddEvent {
+ Ok(Event::ChannelRecipientAdd(ChannelRecipientAddEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
} else if kind == "CHANNEL_RECIPIENT_REMOVE" {
- missing!(value, Event::ChannelRecipientRemove(ChannelRecipientRemoveEvent {
+ Ok(Event::ChannelRecipientRemove(ChannelRecipientRemoveEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
@@ -532,21 +532,21 @@ impl Event {
channel: try!(Channel::decode(Value::Object(value))),
}))
} else if kind == "FRIEND_SUGGESTION_CREATE" {
- missing!(value, Event::FriendSuggestionCreate(FriendSuggestionCreateEvent {
+ Ok(Event::FriendSuggestionCreate(FriendSuggestionCreateEvent {
reasons: try!(decode_array(try!(remove(&mut value, "reasons")), SuggestionReason::decode)),
suggested_user: try!(remove(&mut value, "suggested_user").and_then(User::decode)),
}))
} else if kind == "FRIEND_SUGGESTION_DELETE" {
- missing!(value, Event::FriendSuggestionDelete(FriendSuggestionDeleteEvent {
+ Ok(Event::FriendSuggestionDelete(FriendSuggestionDeleteEvent {
suggested_user_id: try!(remove(&mut value, "suggested_user_id").and_then(UserId::decode)),
}))
} else if kind == "GUILD_BAN_ADD" {
- missing!(value, Event::GuildBanAdd(GuildBanAddEvent {
+ Ok(Event::GuildBanAdd(GuildBanAddEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
} else if kind == "GUILD_BAN_REMOVE" {
- missing!(value, Event::GuildBanRemove(GuildBanRemoveEvent {
+ Ok(Event::GuildBanRemove(GuildBanRemoveEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
@@ -571,12 +571,12 @@ impl Event {
}))
}
} else if kind == "GUILD_EMOJIS_UPDATE" {
- missing!(value, Event::GuildEmojisUpdate(GuildEmojisUpdateEvent {
+ Ok(Event::GuildEmojisUpdate(GuildEmojisUpdateEvent {
emojis: try!(remove(&mut value, "emojis").and_then(decode_emojis)),
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
}))
} else if kind == "GUILD_INTEGRATIONS_UPDATE" {
- missing!(value, Event::GuildIntegrationsUpdate(GuildIntegrationsUpdateEvent {
+ Ok(Event::GuildIntegrationsUpdate(GuildIntegrationsUpdateEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
}))
} else if kind == "GUILD_MEMBER_ADD" {
@@ -585,39 +585,39 @@ impl Event {
member: try!(Member::decode(Value::Object(value))),
}))
} else if kind == "GUILD_MEMBER_REMOVE" {
- missing!(value, Event::GuildMemberRemove(GuildMemberRemoveEvent {
+ Ok(Event::GuildMemberRemove(GuildMemberRemoveEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
} else if kind == "GUILD_MEMBER_UPDATE" {
- missing!(value, Event::GuildMemberUpdate(GuildMemberUpdateEvent {
+ Ok(Event::GuildMemberUpdate(GuildMemberUpdateEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
nick: try!(opt(&mut value, "nick", into_string)),
roles: try!(decode_array(try!(remove(&mut value, "roles")), RoleId::decode)),
user: try!(remove(&mut value, "user").and_then(User::decode)),
}))
} else if kind == "GUILD_MEMBERS_CHUNK" {
- missing!(value, Event::GuildMembersChunk(GuildMembersChunkEvent {
+ Ok(Event::GuildMembersChunk(GuildMembersChunkEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
members: try!(remove(&mut value, "members").and_then(decode_members)),
}))
} else if kind == "GUILD_ROLE_CREATE" {
- missing!(value, Event::GuildRoleCreate(GuildRoleCreateEvent {
+ Ok(Event::GuildRoleCreate(GuildRoleCreateEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
role: try!(remove(&mut value, "role").and_then(Role::decode)),
}))
} else if kind == "GUILD_ROLE_DELETE" {
- missing!(value, Event::GuildRoleDelete(GuildRoleDeleteEvent {
+ Ok(Event::GuildRoleDelete(GuildRoleDeleteEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
role_id: try!(remove(&mut value, "role_id").and_then(RoleId::decode)),
}))
} else if kind == "GUILD_ROLE_UPDATE" {
- missing!(value, Event::GuildRoleUpdate(GuildRoleUpdateEvent {
+ Ok(Event::GuildRoleUpdate(GuildRoleUpdateEvent {
guild_id: try!(remove(&mut value, "guild_id").and_then(GuildId::decode)),
role: try!(remove(&mut value, "role").and_then(Role::decode)),
}))
} else if kind == "GUILD_SYNC" {
- missing!(value, Event::GuildSync(GuildSyncEvent {
+ Ok(Event::GuildSync(GuildSyncEvent {
guild_id: try!(remove(&mut value, "id").and_then(GuildId::decode)),
large: req!(try!(remove(&mut value, "large")).as_bool()),
members: try!(remove(&mut value, "members").and_then(decode_members)),
@@ -628,7 +628,7 @@ impl Event {
guild: try!(PartialGuild::decode(Value::Object(value))),
}))
} else if kind == "MESSAGE_ACK" {
- missing!(value, Event::MessageAck(MessageAckEvent {
+ Ok(Event::MessageAck(MessageAckEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
message_id: try!(opt(&mut value, "message_id", MessageId::decode)),
}))
@@ -637,12 +637,12 @@ impl Event {
message: try!(Message::decode(Value::Object(value))),
}))
} else if kind == "MESSAGE_DELETE" {
- missing!(value, Event::MessageDelete(MessageDeleteEvent {
+ Ok(Event::MessageDelete(MessageDeleteEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
message_id: try!(remove(&mut value, "id").and_then(MessageId::decode)),
}))
} else if kind == "MESSAGE_DELETE_BULK" {
- missing!(value, Event::MessageDeleteBulk(MessageDeleteBulkEvent {
+ Ok(Event::MessageDeleteBulk(MessageDeleteBulkEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
ids: try!(decode_array(try!(remove(&mut value, "ids")), MessageId::decode)),
}))
@@ -650,7 +650,7 @@ impl Event {
Ok(Event::ReactionAdd(ReactionAddEvent {
reaction: try!(Reaction::decode(Value::Object(value)))
}))
- } else if kind == "MESSAG_REACTION_REMOVE" {
+ } else if kind == "MESSAGE_REACTION_REMOVE" {
Ok(Event::ReactionRemove(ReactionRemoveEvent {
reaction: try!(Reaction::decode(Value::Object(value)))
}))
@@ -660,7 +660,7 @@ impl Event {
message_id: try!(remove(&mut value, "message_id").and_then(MessageId::decode)),
}))
} else if kind == "MESSAGE_UPDATE" {
- missing!(value, Event::MessageUpdate(MessageUpdateEvent {
+ Ok(Event::MessageUpdate(MessageUpdateEvent {
id: try!(remove(&mut value, "id").and_then(MessageId::decode)),
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
kind: try!(opt(&mut value, "type", MessageType::decode)),
@@ -691,7 +691,7 @@ impl Event {
relationship: try!(Relationship::decode(Value::Object(value))),
}))
} else if kind == "RELATIONSHIP_REMOVE" {
- missing!(value, Event::RelationshipRemove(RelationshipRemoveEvent {
+ Ok(Event::RelationshipRemove(RelationshipRemoveEvent {
kind: try!(remove(&mut value, "type").and_then(RelationshipType::decode)),
user_id: try!(remove(&mut value, "id").and_then(UserId::decode)),
}))
@@ -700,12 +700,12 @@ impl Event {
ready: try!(Ready::decode(Value::Object(value))),
}))
} else if kind == "RESUMED" {
- missing!(value, Event::Resumed(ResumedEvent {
+ Ok(Event::Resumed(ResumedEvent {
heartbeat_interval: req!(try!(remove(&mut value, "heartbeat_interval")).as_u64()),
trace: try!(remove(&mut value, "_trace").and_then(|v| decode_array(v, |v| Ok(into_string(v).ok())))),
}))
} else if kind == "TYPING_START" {
- missing!(value, Event::TypingStart(TypingStartEvent {
+ Ok(Event::TypingStart(TypingStartEvent {
channel_id: try!(remove(&mut value, "channel_id").and_then(ChannelId::decode)),
timestamp: req!(try!(remove(&mut value, "timestamp")).as_u64()),
user_id: try!(remove(&mut value, "user_id").and_then(UserId::decode)),
@@ -715,12 +715,12 @@ impl Event {
settings: try!(UserGuildSettings::decode(Value::Object(value))),
}))
} else if kind == "USER_NOTE_UPDATE" {
- missing!(value, Event::UserNoteUpdate(UserNoteUpdateEvent {
+ Ok(Event::UserNoteUpdate(UserNoteUpdateEvent {
note: try!(remove(&mut value, "note").and_then(into_string)),
user_id: try!(remove(&mut value, "id").and_then(UserId::decode)),
}))
} else if kind == "USER_SETTINGS_UPDATE" {
- missing!(value, Event::UserSettingsUpdate(UserSettingsUpdateEvent {
+ Ok(Event::UserSettingsUpdate(UserSettingsUpdateEvent {
enable_tts_command: remove(&mut value, "enable_tts_command").ok().and_then(|v| v.as_bool()),
inline_attachment_media: remove(&mut value, "inline_attachment_media").ok().and_then(|v| v.as_bool()),
inline_embed_media: remove(&mut value, "inline_embed_media").ok().and_then(|v| v.as_bool()),
@@ -737,7 +737,7 @@ impl Event {
current_user: try!(CurrentUser::decode(Value::Object(value))),
}))
} else if kind == "VOICE_SERVER_UPDATE" {
- missing!(value, Event::VoiceServerUpdate(VoiceServerUpdateEvent {
+ Ok(Event::VoiceServerUpdate(VoiceServerUpdateEvent {
guild_id: try!(opt(&mut value, "guild_id", GuildId::decode)),
channel_id: try!(opt(&mut value, "channel_id", ChannelId::decode)),
endpoint: try!(opt(&mut value, "endpoint", into_string)),
@@ -761,3 +761,90 @@ impl Event {
}
}
}
+
+#[derive(Clone, Copy, Debug)]
+pub struct VoiceHeartbeat {
+ pub heartbeat_interval: u64,
+}
+
+#[derive(Clone, Debug)]
+pub struct VoiceHello {
+ pub heartbeat_interval: u64,
+ pub ip: String,
+ pub modes: Vec<String>,
+ pub port: u16,
+ pub ssrc: u32,
+}
+
+#[derive(Clone, Debug)]
+pub struct VoiceReady {
+ pub mode: String,
+ pub secret_key: Vec<u8>,
+}
+
+#[derive(Clone, Copy, Debug)]
+pub struct VoiceSpeaking {
+ pub speaking: bool,
+ pub ssrc: u32,
+ pub user_id: UserId,
+}
+
+#[derive(Clone, Debug)]
+pub enum VoiceEvent {
+ Heartbeat(VoiceHeartbeat),
+ Hello(VoiceHello),
+ Ready(VoiceReady),
+ Speaking(VoiceSpeaking),
+ KeepAlive,
+ Unknown(VoiceOpCode, Value)
+}
+
+impl VoiceEvent {
+ pub fn decode(value: Value) -> Result<VoiceEvent> {
+ let mut value = try!(into_map(value));
+ let op = req!(try!(remove(&mut value, "op")).as_u64());
+ let mut map = try!(remove(&mut value, "d").and_then(into_map));
+
+ let opcode = try!(VoiceOpCode::from_num(op)
+ .ok_or(Error::Client(ClientError::InvalidOpCode)));
+
+ match opcode {
+ VoiceOpCode::Heartbeat => {
+ Ok(VoiceEvent::Heartbeat(VoiceHeartbeat {
+ heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval")).as_u64()),
+ }))
+ },
+ VoiceOpCode::Hello => {
+ Ok(VoiceEvent::Hello(VoiceHello {
+ heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval"))
+ .as_u64()),
+ ip: try!(remove(&mut map, "ip").and_then(into_string)),
+ modes: try!(decode_array(try!(remove(&mut map, "modes")),
+ into_string)),
+ port: req!(try!(remove(&mut map, "port"))
+ .as_u64()) as u16,
+ ssrc: req!(try!(remove(&mut map, "ssrc"))
+ .as_u64()) as u32,
+ }))
+ },
+ VoiceOpCode::KeepAlive => Ok(VoiceEvent::KeepAlive),
+ VoiceOpCode::SessionDescription => {
+ Ok(VoiceEvent::Ready(VoiceReady {
+ mode: try!(remove(&mut map, "mode")
+ .and_then(into_string)),
+ secret_key: try!(decode_array(try!(remove(&mut map, "secret_key")),
+ |v| Ok(req!(v.as_u64()) as u8)
+ )),
+ }))
+ },
+ VoiceOpCode::Speaking => {
+ Ok(VoiceEvent::Speaking(VoiceSpeaking {
+ speaking: req!(try!(remove(&mut map, "speaking")).as_bool()),
+ ssrc: req!(try!(remove(&mut map, "ssrc")).as_u64()) as u32,
+ user_id: try!(remove(&mut map, "user_id").and_then(UserId::decode)),
+ }))
+ }
+ other => Ok(VoiceEvent::Unknown(other, Value::Object(map))),
+ }
+ }
+}
diff --git a/src/model/gateway.rs b/src/model/gateway.rs
index 30ed695..93c779b 100644
--- a/src/model/gateway.rs
+++ b/src/model/gateway.rs
@@ -36,7 +36,7 @@ impl Game {
return Ok(None);
}
- missing!(map, Some(Game {
+ Ok(Some(Game {
name: name,
kind: try!(opt(&mut map, "type", GameType::decode)).unwrap_or(GameType::Playing),
url: try!(opt(&mut map, "url", into_string)),
@@ -62,7 +62,7 @@ impl Presence {
Some(v) => try!(Game::decode(v)),
};
- missing!(value, Presence {
+ Ok(Presence {
user_id: user_id,
status: try!(remove(&mut value, "status").and_then(OnlineStatus::decode_str)),
last_modified: try!(opt(&mut value, "last_modified", |v| Ok(req!(v.as_u64())))),
diff --git a/src/model/guild.rs b/src/model/guild.rs
index 4869e86..9408fae 100644
--- a/src/model/guild.rs
+++ b/src/model/guild.rs
@@ -10,7 +10,6 @@ use super::utils::{
into_string,
opt,
remove,
- warn_field
};
use super::*;
use ::internal::prelude::*;
@@ -122,7 +121,7 @@ impl GuildInfo {
/// Returns the formatted URL of the guild's icon, if the guild has an icon.
pub fn icon_url(&self) -> Option<String> {
self.icon.as_ref().map(|icon|
- format!(cdn_concat!("/icons/{}/{}.jpg"), self.id, icon))
+ format!(cdn!("/icons/{}/{}.jpg"), self.id, icon))
}
}
@@ -149,7 +148,7 @@ impl PartialGuild {
/// Returns a formatted URL of the guild's icon, if the guild has an icon.
pub fn icon_url(&self) -> Option<String> {
self.icon.as_ref().map(|icon|
- format!(cdn_concat!("/icons/{}/{}.jpg"), self.id, icon))
+ format!(cdn!("/icons/{}/{}.jpg"), self.id, icon))
}
/// Retrieves the guild's webhooks.
@@ -173,7 +172,6 @@ impl Guild {
};
let perms = self.permissions_for(ChannelId(self.id.0), member.user.id);
-
permissions.remove(perms);
Ok(permissions.is_empty())
@@ -321,10 +319,8 @@ impl Guild {
}
}}
- let role = {
- try!(rest::create_role(self.id.0))
- };
- let map = f(EditRole::default()).0.build();
+ let role = try!(rest::create_role(self.id.0));
+ let map = f(EditRole::new(&role)).0.build();
rest::edit_role(self.id.0, role.id.0, map)
}
@@ -348,7 +344,7 @@ impl Guild {
public_channels
};
- missing!(map, Guild {
+ Ok(Guild {
afk_channel_id: try!(opt(&mut map, "afk_channel_id", ChannelId::decode)),
afk_timeout: req!(try!(remove(&mut map, "afk_timeout")).as_u64()),
channels: public_channels,
@@ -557,7 +553,7 @@ impl Guild {
/// Returns the formatted URL of the guild's icon, if one exists.
pub fn icon_url(&self) -> Option<String> {
self.icon.as_ref().map(|icon|
- format!(cdn_concat!("/icons/{}/{}.jpg"), self.id, icon))
+ format!(cdn!("/icons/{}/{}.jpg"), self.id, icon))
}
/// Checks if the guild is 'large'. A guild is considered large if it has
diff --git a/src/model/user.rs b/src/model/user.rs
index 4201bd2..d7ea416 100644
--- a/src/model/user.rs
+++ b/src/model/user.rs
@@ -1,5 +1,5 @@
use std::fmt;
-use super::utils::{into_map, into_string, remove, warn_field};
+use super::utils::{into_map, into_string, remove};
use super::{
CurrentUser,
FriendSourceFlags,
@@ -29,7 +29,7 @@ impl CurrentUser {
/// Returns the formatted URL of the user's icon, if one exists.
pub fn avatar_url(&self) -> Option<String> {
self.avatar.as_ref().map(|av|
- format!(cdn_concat!("/avatars/{}/{}.jpg"), self.id, av))
+ format!(cdn!("/avatars/{}/{}.jpg"), self.id, av))
}
}
@@ -37,7 +37,7 @@ impl User {
/// Returns the formatted URL of the user's icon, if one exists.
pub fn avatar_url(&self) -> Option<String> {
self.avatar.as_ref().map(|av|
- format!(cdn_concat!("/avatars/{}/{}.jpg"), self.id, av))
+ format!(cdn!("/avatars/{}/{}.jpg"), self.id, av))
}
/// Retrieves the time that this user was created at.
@@ -166,7 +166,7 @@ impl UserSettings {
return Ok(None);
}
- missing!(map, UserSettings {
+ Ok(UserSettings {
convert_emoticons: req!(try!(remove(&mut map, "convert_emoticons")).as_bool()),
enable_tts_command: req!(try!(remove(&mut map, "enable_tts_command")).as_bool()),
friend_source_flags: try!(remove(&mut map, "friend_source_flags").and_then(FriendSourceFlags::decode)),
diff --git a/src/model/utils.rs b/src/model/utils.rs
index 0611a9f..9b4f6e4 100644
--- a/src/model/utils.rs
+++ b/src/model/utils.rs
@@ -25,19 +25,6 @@ use ::client::CACHE;
use ::ext::cache::ChannelRef;
#[macro_escape]
-macro_rules! missing {
- (@ $name:expr, $json:ident, $value:expr) => {
- (Ok($value), warn_field($name, $json)).0
- };
- ($json:ident, $ty:ident $(::$ext:ident)* ( $($value:expr),*$(,)* ) ) => {
- (Ok($ty$(::$ext)* ( $($value),* )), warn_field(stringify!($ty$(::$ext)*), $json)).0
- };
- ($json:ident, $ty:ident $(::$ext:ident)* { $($name:ident: $value:expr),*$(,)* } ) => {
- (Ok($ty$(::$ext)* { $($name: $value),* }), warn_field(stringify!($ty$(::$ext)*), $json)).0
- };
-}
-
-#[macro_escape]
macro_rules! req {
($opt:expr) => {
try!($opt.ok_or(Error::Decode(concat!("Type mismatch in model:",
@@ -253,7 +240,7 @@ pub fn opt<T, F: FnOnce(Value) -> Result<T>>(map: &mut BTreeMap<String, Value>,
}
}
-pub fn parse_discriminator(value: Value) -> Result<u16> {
+pub fn decode_discriminator(value: Value) -> Result<u16> {
match value {
Value::I64(v) => Ok(v as u16),
Value::U64(v) => Ok(v as u16),
@@ -303,9 +290,3 @@ pub fn user_has_perms(channel_id: ChannelId,
Ok(permissions.is_empty())
}
-
-pub fn warn_field(name: &str, map: BTreeMap<String, Value>) {
- if !map.is_empty() {
- debug!("Unhandled keys: {} has {:?}", name, Value::Object(map))
- }
-}
diff --git a/src/model/voice.rs b/src/model/voice.rs
index 61035c6..8b13789 100644
--- a/src/model/voice.rs
+++ b/src/model/voice.rs
@@ -1,92 +1 @@
-use super::utils::{into_map, into_string, remove, warn_field};
-use super::UserId;
-use ::constants::VoiceOpCode;
-use ::internal::prelude::*;
-use ::utils::decode_array;
-#[derive(Clone, Copy, Debug)]
-pub struct VoiceHeartbeat {
- pub heartbeat_interval: u64,
-}
-
-#[derive(Clone, Debug)]
-pub struct VoiceHello {
- pub heartbeat_interval: u64,
- pub ip: String,
- pub modes: Vec<String>,
- pub port: u16,
- pub ssrc: u32,
-}
-
-#[derive(Clone, Debug)]
-pub struct VoiceReady {
- pub mode: String,
- pub secret_key: Vec<u8>,
-}
-
-#[derive(Clone, Copy, Debug)]
-pub struct VoiceSpeaking {
- pub speaking: bool,
- pub ssrc: u32,
- pub user_id: UserId,
-}
-
-#[derive(Clone, Debug)]
-pub enum VoiceEvent {
- Heartbeat(VoiceHeartbeat),
- Hello(VoiceHello),
- Ready(VoiceReady),
- Speaking(VoiceSpeaking),
- KeepAlive,
- Unknown(VoiceOpCode, Value)
-}
-
-impl VoiceEvent {
- pub fn decode(value: Value) -> Result<VoiceEvent> {
- let mut value = try!(into_map(value));
- let op = req!(try!(remove(&mut value, "op")).as_u64());
- let mut map = try!(remove(&mut value, "d").and_then(into_map));
-
- let opcode = try!(VoiceOpCode::from_num(op)
- .ok_or(Error::Client(ClientError::InvalidOpCode)));
-
- match opcode {
- VoiceOpCode::Heartbeat => {
- missing!(map, VoiceEvent::Heartbeat(VoiceHeartbeat {
- heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval")).as_u64()),
- }))
- },
- VoiceOpCode::Hello => {
- missing!(map, VoiceEvent::Hello(VoiceHello {
- heartbeat_interval: req!(try!(remove(&mut map, "heartbeat_interval"))
- .as_u64()),
- ip: try!(remove(&mut map, "ip").and_then(into_string)),
- modes: try!(decode_array(try!(remove(&mut map, "modes")),
- into_string)),
- port: req!(try!(remove(&mut map, "port"))
- .as_u64()) as u16,
- ssrc: req!(try!(remove(&mut map, "ssrc"))
- .as_u64()) as u32,
- }))
- },
- VoiceOpCode::KeepAlive => Ok(VoiceEvent::KeepAlive),
- VoiceOpCode::SessionDescription => {
- missing!(map, VoiceEvent::Ready(VoiceReady {
- mode: try!(remove(&mut map, "mode")
- .and_then(into_string)),
- secret_key: try!(decode_array(try!(remove(&mut map, "secret_key")),
- |v| Ok(req!(v.as_u64()) as u8)
- )),
- }))
- },
- VoiceOpCode::Speaking => {
- missing!(map, VoiceEvent::Speaking(VoiceSpeaking {
- speaking: req!(try!(remove(&mut map, "speaking")).as_bool()),
- ssrc: req!(try!(remove(&mut map, "ssrc")).as_u64()) as u32,
- user_id: try!(remove(&mut map, "user_id").and_then(UserId::decode)),
- }))
- }
- other => Ok(VoiceEvent::Unknown(other, Value::Object(map))),
- }
- }
-}