diff options
| author | Austin Hellyer <[email protected]> | 2016-11-29 20:51:10 -0800 |
|---|---|---|
| committer | Austin Hellyer <[email protected]> | 2016-11-29 22:27:59 -0800 |
| commit | 93b990d8d1bc9df69b8e27a3db61da570822aad6 (patch) | |
| tree | 6305cf635df90681527a8e736f65ff19f21fd8bc /src/model | |
| parent | Add more shiny readme badges (diff) | |
| download | serenity-93b990d8d1bc9df69b8e27a3db61da570822aad6.tar.xz serenity-93b990d8d1bc9df69b8e27a3db61da570822aad6.zip | |
Clean up the codebase
Diffstat (limited to 'src/model')
| -rw-r--r-- | src/model/channel.rs | 13 | ||||
| -rw-r--r-- | src/model/event.rs | 149 | ||||
| -rw-r--r-- | src/model/gateway.rs | 4 | ||||
| -rw-r--r-- | src/model/guild.rs | 16 | ||||
| -rw-r--r-- | src/model/user.rs | 8 | ||||
| -rw-r--r-- | src/model/utils.rs | 21 | ||||
| -rw-r--r-- | src/model/voice.rs | 91 |
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))), - } - } -} |