| @@ -128,4 +128,14 @@ namespace Discord.API.Models | |||||
| [JsonProperty(PropertyName = "channel_id")] | [JsonProperty(PropertyName = "channel_id")] | ||||
| public string ChannelId; | public string ChannelId; | ||||
| } | } | ||||
| internal class Role | |||||
| { | |||||
| [JsonProperty(PropertyName = "permissions")] | |||||
| public int Permissions; | |||||
| [JsonProperty(PropertyName = "name")] | |||||
| public string Name; | |||||
| [JsonProperty(PropertyName = "id")] | |||||
| public string Id; | |||||
| } | |||||
| } | } | ||||
| @@ -30,19 +30,22 @@ namespace Discord.API.Models | |||||
| internal sealed class ChannelCreate : ChannelInfo { } | internal sealed class ChannelCreate : ChannelInfo { } | ||||
| internal sealed class ChannelDelete : ChannelInfo { } | internal sealed class ChannelDelete : ChannelInfo { } | ||||
| internal sealed class ChannelUpdate : ChannelInfo { } | |||||
| internal sealed class GuildMemberAdd | |||||
| internal sealed class GuildMemberAdd : GuildMemberUpdate | |||||
| { | |||||
| [JsonProperty(PropertyName = "joined_at")] | |||||
| public DateTime JoinedAt; | |||||
| } | |||||
| internal class GuildMemberUpdate | |||||
| { | { | ||||
| [JsonProperty(PropertyName = "user")] | [JsonProperty(PropertyName = "user")] | ||||
| public UserInfo User; | public UserInfo User; | ||||
| [JsonProperty(PropertyName = "roles")] | [JsonProperty(PropertyName = "roles")] | ||||
| public object[] Roles; | public object[] Roles; | ||||
| [JsonProperty(PropertyName = "joined_at")] | |||||
| public DateTime JoinedAt; | |||||
| [JsonProperty(PropertyName = "guild_id")] | [JsonProperty(PropertyName = "guild_id")] | ||||
| public string GuildId; | public string GuildId; | ||||
| } | } | ||||
| internal sealed class GuildMemberRemove | internal sealed class GuildMemberRemove | ||||
| { | { | ||||
| [JsonProperty(PropertyName = "user")] | [JsonProperty(PropertyName = "user")] | ||||
| @@ -50,6 +53,37 @@ namespace Discord.API.Models | |||||
| [JsonProperty(PropertyName = "guild_id")] | [JsonProperty(PropertyName = "guild_id")] | ||||
| public string GuildId; | public string GuildId; | ||||
| } | } | ||||
| internal sealed class GuildRoleCreateUpdate | |||||
| { | |||||
| [JsonProperty(PropertyName = "role")] | |||||
| public Role Role; | |||||
| [JsonProperty(PropertyName = "guild_id")] | |||||
| public string GuildId; | |||||
| } | |||||
| internal sealed class GuildRoleDelete | |||||
| { | |||||
| [JsonProperty(PropertyName = "role_id")] | |||||
| public string RoleId; | |||||
| [JsonProperty(PropertyName = "guild_id")] | |||||
| public string GuildId; | |||||
| } | |||||
| internal sealed class GuildBanAddRemove | |||||
| { | |||||
| [JsonProperty(PropertyName = "user")] | |||||
| public UserInfo User; | |||||
| [JsonProperty(PropertyName = "guild_id")] | |||||
| public string GuildId; | |||||
| } | |||||
| internal sealed class GuildBanRemove | |||||
| { | |||||
| [JsonProperty(PropertyName = "user_id")] | |||||
| public string UserId; | |||||
| [JsonProperty(PropertyName = "guild_id")] | |||||
| public string GuildId; | |||||
| } | |||||
| internal sealed class UserUpdate : SelfUserInfo { } | internal sealed class UserUpdate : SelfUserInfo { } | ||||
| internal sealed class PresenceUpdate : PresenceUserInfo { } | internal sealed class PresenceUpdate : PresenceUserInfo { } | ||||
| internal sealed class VoiceStateUpdate | internal sealed class VoiceStateUpdate | ||||
| @@ -49,6 +49,7 @@ | |||||
| <Compile Include="API\Models\ApiRequests.cs" /> | <Compile Include="API\Models\ApiRequests.cs" /> | ||||
| <Compile Include="API\Endpoints.cs" /> | <Compile Include="API\Endpoints.cs" /> | ||||
| <Compile Include="API\Models\WebSocketCommands.cs" /> | <Compile Include="API\Models\WebSocketCommands.cs" /> | ||||
| <Compile Include="Models\Role.cs" /> | |||||
| <Compile Include="Models\ChatMessageReference.cs" /> | <Compile Include="Models\ChatMessageReference.cs" /> | ||||
| <Compile Include="Models\ChatMessage.cs" /> | <Compile Include="Models\ChatMessage.cs" /> | ||||
| <Compile Include="Models\Channel.cs" /> | <Compile Include="Models\Channel.cs" /> | ||||
| @@ -5,46 +5,12 @@ namespace Discord | |||||
| { | { | ||||
| public partial class DiscordClient | public partial class DiscordClient | ||||
| { | { | ||||
| public sealed class ServerEventArgs : EventArgs | |||||
| { | |||||
| public readonly Server Server; | |||||
| internal ServerEventArgs(Server server) { Server = server; } | |||||
| } | |||||
| public sealed class ChannelEventArgs : EventArgs | |||||
| { | |||||
| public readonly Channel Channel; | |||||
| internal ChannelEventArgs(Channel channel) { Channel = channel; } | |||||
| } | |||||
| public sealed class UserEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| internal UserEventArgs(User user) { User = user; } | |||||
| } | |||||
| public sealed class MessageCreateEventArgs : EventArgs | |||||
| { | |||||
| public readonly ChatMessage Message; | |||||
| internal MessageCreateEventArgs(ChatMessage msg) { Message = msg; } | |||||
| } | |||||
| public sealed class MessageEventArgs : EventArgs | |||||
| { | |||||
| public readonly ChatMessageReference Message; | |||||
| internal MessageEventArgs(ChatMessageReference msg) { Message = msg; } | |||||
| } | |||||
| //Debug | |||||
| public sealed class LogMessageEventArgs : EventArgs | public sealed class LogMessageEventArgs : EventArgs | ||||
| { | { | ||||
| public readonly string Message; | public readonly string Message; | ||||
| internal LogMessageEventArgs(string msg) { Message = msg; } | internal LogMessageEventArgs(string msg) { Message = msg; } | ||||
| } | } | ||||
| public sealed class UserTypingEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| public readonly Channel Channel; | |||||
| internal UserTypingEventArgs(User user, Channel channel) | |||||
| { | |||||
| User = user; | |||||
| Channel = channel; | |||||
| } | |||||
| } | |||||
| public event EventHandler<LogMessageEventArgs> DebugMessage; | public event EventHandler<LogMessageEventArgs> DebugMessage; | ||||
| private void RaiseOnDebugMessage(string message) | private void RaiseOnDebugMessage(string message) | ||||
| @@ -53,6 +19,7 @@ namespace Discord | |||||
| DebugMessage(this, new LogMessageEventArgs(message)); | DebugMessage(this, new LogMessageEventArgs(message)); | ||||
| } | } | ||||
| //General | |||||
| public event EventHandler Connected; | public event EventHandler Connected; | ||||
| private void RaiseConnected() | private void RaiseConnected() | ||||
| { | { | ||||
| @@ -73,54 +40,202 @@ namespace Discord | |||||
| if (LoggedIn != null) | if (LoggedIn != null) | ||||
| LoggedIn(this, EventArgs.Empty); | LoggedIn(this, EventArgs.Empty); | ||||
| } | } | ||||
| public event EventHandler<ServerEventArgs> ServerCreated, ServerDestroyed; | |||||
| //Server | |||||
| public sealed class ServerEventArgs : EventArgs | |||||
| { | |||||
| public readonly Server Server; | |||||
| internal ServerEventArgs(Server server) { Server = server; } | |||||
| } | |||||
| public event EventHandler<ServerEventArgs> ServerCreated; | |||||
| private void RaiseServerCreated(Server server) | private void RaiseServerCreated(Server server) | ||||
| { | { | ||||
| if (ServerCreated != null) | if (ServerCreated != null) | ||||
| ServerCreated(this, new ServerEventArgs(server)); | ServerCreated(this, new ServerEventArgs(server)); | ||||
| } | } | ||||
| public event EventHandler<ServerEventArgs> ServerDestroyed; | |||||
| private void RaiseServerDestroyed(Server server) | private void RaiseServerDestroyed(Server server) | ||||
| { | { | ||||
| if (ServerDestroyed != null) | if (ServerDestroyed != null) | ||||
| ServerDestroyed(this, new ServerEventArgs(server)); | ServerDestroyed(this, new ServerEventArgs(server)); | ||||
| } | } | ||||
| public event EventHandler<ChannelEventArgs> ChannelCreated, ChannelDestroyed; | |||||
| //Channel | |||||
| public sealed class ChannelEventArgs : EventArgs | |||||
| { | |||||
| public readonly Channel Channel; | |||||
| internal ChannelEventArgs(Channel channel) { Channel = channel; } | |||||
| } | |||||
| public event EventHandler<ChannelEventArgs> ChannelCreated; | |||||
| private void RaiseChannelCreated(Channel channel) | private void RaiseChannelCreated(Channel channel) | ||||
| { | { | ||||
| if (ChannelCreated != null) | if (ChannelCreated != null) | ||||
| ChannelCreated(this, new ChannelEventArgs(channel)); | ChannelCreated(this, new ChannelEventArgs(channel)); | ||||
| } | } | ||||
| public event EventHandler<ChannelEventArgs> ChannelDestroyed; | |||||
| private void RaiseChannelDestroyed(Channel channel) | private void RaiseChannelDestroyed(Channel channel) | ||||
| { | { | ||||
| if (ChannelDestroyed != null) | if (ChannelDestroyed != null) | ||||
| ChannelDestroyed(this, new ChannelEventArgs(channel)); | ChannelDestroyed(this, new ChannelEventArgs(channel)); | ||||
| } | } | ||||
| public event EventHandler<ChannelEventArgs> ChannelUpdated; | |||||
| private void RaiseChannelUpdated(Channel channel) | |||||
| { | |||||
| if (ChannelUpdated != null) | |||||
| ChannelUpdated(this, new ChannelEventArgs(channel)); | |||||
| } | |||||
| //User | |||||
| public sealed class UserEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| internal UserEventArgs(User user) { User = user; } | |||||
| } | |||||
| //Message | |||||
| public sealed class MessageCreateEventArgs : EventArgs | |||||
| { | |||||
| public readonly ChatMessage Message; | |||||
| internal MessageCreateEventArgs(ChatMessage msg) { Message = msg; } | |||||
| } | |||||
| public sealed class MessageEventArgs : EventArgs | |||||
| { | |||||
| public readonly ChatMessageReference Message; | |||||
| internal MessageEventArgs(ChatMessageReference msg) { Message = msg; } | |||||
| } | |||||
| public event EventHandler<MessageCreateEventArgs> MessageCreated; | public event EventHandler<MessageCreateEventArgs> MessageCreated; | ||||
| public event EventHandler<MessageEventArgs> MessageDeleted, MessageUpdated, MessageAcknowledged; | |||||
| private void RaiseMessageCreated(ChatMessage msg) | private void RaiseMessageCreated(ChatMessage msg) | ||||
| { | { | ||||
| if (MessageCreated != null) | if (MessageCreated != null) | ||||
| MessageCreated(this, new MessageCreateEventArgs(msg)); | MessageCreated(this, new MessageCreateEventArgs(msg)); | ||||
| } | } | ||||
| public event EventHandler<MessageEventArgs> MessageDeleted; | |||||
| private void RaiseMessageDeleted(ChatMessageReference msg) | private void RaiseMessageDeleted(ChatMessageReference msg) | ||||
| { | { | ||||
| if (MessageDeleted != null) | if (MessageDeleted != null) | ||||
| MessageDeleted(this, new MessageEventArgs(msg)); | MessageDeleted(this, new MessageEventArgs(msg)); | ||||
| } | } | ||||
| public event EventHandler<MessageEventArgs> MessageUpdated; | |||||
| private void RaiseMessageUpdated(ChatMessageReference msg) | private void RaiseMessageUpdated(ChatMessageReference msg) | ||||
| { | { | ||||
| if (MessageUpdated != null) | if (MessageUpdated != null) | ||||
| MessageUpdated(this, new MessageEventArgs(msg)); | MessageUpdated(this, new MessageEventArgs(msg)); | ||||
| } | } | ||||
| public event EventHandler<MessageEventArgs> MessageAcknowledged; | |||||
| private void RaiseMessageAcknowledged(ChatMessageReference msg) | private void RaiseMessageAcknowledged(ChatMessageReference msg) | ||||
| { | { | ||||
| if (MessageAcknowledged != null) | if (MessageAcknowledged != null) | ||||
| MessageAcknowledged(this, new MessageEventArgs(msg)); | MessageAcknowledged(this, new MessageEventArgs(msg)); | ||||
| } | } | ||||
| //Role | |||||
| public sealed class RoleEventArgs : EventArgs | |||||
| { | |||||
| public readonly Role Role; | |||||
| internal RoleEventArgs(Role role) { Role = role; } | |||||
| } | |||||
| public event EventHandler<RoleEventArgs> RoleCreated; | |||||
| private void RaiseRoleCreated(Role role) | |||||
| { | |||||
| if (RoleCreated != null) | |||||
| RoleCreated(this, new RoleEventArgs(role)); | |||||
| } | |||||
| public event EventHandler<RoleEventArgs> RoleUpdated; | |||||
| private void RaiseRoleDeleted(Role role) | |||||
| { | |||||
| if (RoleDeleted != null) | |||||
| RoleDeleted(this, new RoleEventArgs(role)); | |||||
| } | |||||
| public event EventHandler<RoleEventArgs> RoleDeleted; | |||||
| private void RaiseRoleUpdated(Role role) | |||||
| { | |||||
| if (RoleUpdated != null) | |||||
| RoleUpdated(this, new RoleEventArgs(role)); | |||||
| } | |||||
| //Ban | |||||
| public sealed class BanEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| public readonly Server Server; | |||||
| internal BanEventArgs(User user, Server server) | |||||
| { | |||||
| User = user; | |||||
| Server = server; | |||||
| } | |||||
| } | |||||
| public event EventHandler<BanEventArgs> BanAdded; | |||||
| private void RaiseBanAdded(User user, Server server) | |||||
| { | |||||
| if (BanAdded != null) | |||||
| BanAdded(this, new BanEventArgs(user, server)); | |||||
| } | |||||
| public event EventHandler<BanEventArgs> BanRemoved; | |||||
| private void RaiseBanRemoved(User user, Server server) | |||||
| { | |||||
| if (BanRemoved != null) | |||||
| BanRemoved(this, new BanEventArgs(user, server)); | |||||
| } | |||||
| //Member | |||||
| public sealed class MemberEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| public readonly Server Server; | |||||
| internal MemberEventArgs(User user, Server server) | |||||
| { | |||||
| User = user; | |||||
| Server = server; | |||||
| } | |||||
| } | |||||
| public event EventHandler<MemberEventArgs> MemberAdded; | |||||
| private void RaiseMemberAdded(User user, Server server) | |||||
| { | |||||
| if (MemberAdded != null) | |||||
| MemberAdded(this, new MemberEventArgs(user, server)); | |||||
| } | |||||
| public event EventHandler<MemberEventArgs> MemberRemoved; | |||||
| private void RaiseMemberRemoved(User user, Server server) | |||||
| { | |||||
| if (MemberRemoved != null) | |||||
| MemberRemoved(this, new MemberEventArgs(user, server)); | |||||
| } | |||||
| public event EventHandler<MemberEventArgs> MemberUpdated; | |||||
| private void RaiseMemberUpdated(User user, Server server) | |||||
| { | |||||
| if (MemberUpdated != null) | |||||
| MemberUpdated(this, new MemberEventArgs(user, server)); | |||||
| } | |||||
| //Status | |||||
| public sealed class UserTypingEventArgs : EventArgs | |||||
| { | |||||
| public readonly User User; | |||||
| public readonly Channel Channel; | |||||
| internal UserTypingEventArgs(User user, Channel channel) | |||||
| { | |||||
| User = user; | |||||
| Channel = channel; | |||||
| } | |||||
| } | |||||
| public event EventHandler<UserEventArgs> PresenceUpdated; | public event EventHandler<UserEventArgs> PresenceUpdated; | ||||
| private void RaisePresenceUpdated(User user) | private void RaisePresenceUpdated(User user) | ||||
| { | { | ||||
| @@ -7,6 +7,7 @@ using System.Collections.Concurrent; | |||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Reflection; | using System.Reflection; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using Role = Discord.Models.Role; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -107,15 +108,23 @@ namespace Discord | |||||
| RaiseChannelDestroyed(channel); | RaiseChannelDestroyed(channel); | ||||
| } | } | ||||
| break; | break; | ||||
| case "CHANNEL_UPDATE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.ChannelUpdate>(); | |||||
| var channel = DeleteChannel(data.Id); | |||||
| RaiseChannelUpdated(channel); | |||||
| } | |||||
| break; | |||||
| //Members | //Members | ||||
| case "GUILD_MEMBER_ADD": | case "GUILD_MEMBER_ADD": | ||||
| { | { | ||||
| var data = e.Event.ToObject<WebSocketEvents.GuildMemberAdd>(); | var data = e.Event.ToObject<WebSocketEvents.GuildMemberAdd>(); | ||||
| var user = UpdateUser(data.User); | |||||
| var user = UpdateUser(data.User); | |||||
| var server = GetServer(data.GuildId); | var server = GetServer(data.GuildId); | ||||
| server._members[user.Id] = true; | server._members[user.Id] = true; | ||||
| } | |||||
| RaiseMemberAdded(user, server); | |||||
| } | |||||
| break; | break; | ||||
| case "GUILD_MEMBER_REMOVE": | case "GUILD_MEMBER_REMOVE": | ||||
| { | { | ||||
| @@ -123,22 +132,56 @@ namespace Discord | |||||
| var user = UpdateUser(data.User); | var user = UpdateUser(data.User); | ||||
| var server = GetServer(data.GuildId); | var server = GetServer(data.GuildId); | ||||
| server._members[user.Id] = true; | server._members[user.Id] = true; | ||||
| RaiseMemberRemoved(user, server); | |||||
| } | |||||
| break; | |||||
| case "GUILD_MEMBER_UPDATE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildMemberUpdate>(); | |||||
| var user = UpdateUser(data.User); | |||||
| var server = GetServer(data.GuildId); | |||||
| RaiseMemberUpdated(user, server); | |||||
| } | } | ||||
| break; | break; | ||||
| //Users | |||||
| case "PRESENCE_UPDATE": | |||||
| //Roles | |||||
| case "GUILD_ROLE_CREATE": | |||||
| { | { | ||||
| var data = e.Event.ToObject<WebSocketEvents.PresenceUpdate>(); | |||||
| var user = UpdateUser(data); | |||||
| RaisePresenceUpdated(user); | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildRoleCreateUpdate>(); | |||||
| var role = UpdateRole(data); | |||||
| RaiseRoleCreated(role); | |||||
| } | } | ||||
| break; | break; | ||||
| case "VOICE_STATE_UPDATE": | |||||
| case "GUILD_ROLE_DELETE": | |||||
| { | { | ||||
| var data = e.Event.ToObject<WebSocketEvents.VoiceStateUpdate>(); | |||||
| var user = GetUser(data.UserId); //TODO: Don't ignore this | |||||
| RaiseVoiceStateUpdated(user); | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildRoleDelete>(); | |||||
| var role = GetRole(data.RoleId, data.GuildId); | |||||
| RaiseRoleDeleted(role); | |||||
| } | |||||
| break; | |||||
| case "GUILD_ROLE_UPDATE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildRoleCreateUpdate>(); | |||||
| var role = UpdateRole(data); | |||||
| RaiseRoleUpdated(role); | |||||
| } | |||||
| break; | |||||
| //Roles | |||||
| case "GUILD_BAN_ADD": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildBanAddRemove>(); | |||||
| var user = UpdateUser(data.User); | |||||
| var server = GetServer(data.GuildId); | |||||
| RaiseBanAdded(user, server); | |||||
| } | |||||
| break; | |||||
| case "GUILD_BAN_REMOVE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.GuildBanAddRemove>(); | |||||
| var user = UpdateUser(data.User); | |||||
| var server = GetServer(data.GuildId); | |||||
| RaiseBanRemoved(user, server); | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -172,6 +215,22 @@ namespace Discord | |||||
| RaiseMessageAcknowledged(msg); | RaiseMessageAcknowledged(msg); | ||||
| } | } | ||||
| break; | break; | ||||
| //Statuses | |||||
| case "PRESENCE_UPDATE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.PresenceUpdate>(); | |||||
| var user = UpdateUser(data); | |||||
| RaisePresenceUpdated(user); | |||||
| } | |||||
| break; | |||||
| case "VOICE_STATE_UPDATE": | |||||
| { | |||||
| var data = e.Event.ToObject<WebSocketEvents.VoiceStateUpdate>(); | |||||
| var user = GetUser(data.UserId); //TODO: Don't ignore this | |||||
| RaiseVoiceStateUpdated(user); | |||||
| } | |||||
| break; | |||||
| case "TYPING_START": | case "TYPING_START": | ||||
| { | { | ||||
| var data = e.Event.ToObject<WebSocketEvents.TypingStart>(); | var data = e.Event.ToObject<WebSocketEvents.TypingStart>(); | ||||
| @@ -271,7 +330,7 @@ namespace Discord | |||||
| _users.TryGetValue(id, out user); | _users.TryGetValue(id, out user); | ||||
| return user; | return user; | ||||
| } | } | ||||
| private User UpdateUser(UserInfo model) | |||||
| private User UpdateUser(UserInfo model, bool addNew = true) | |||||
| { | { | ||||
| var user = GetUser(model.Id) ?? new User(model.Id, this); | var user = GetUser(model.Id) ?? new User(model.Id, this); | ||||
| @@ -291,7 +350,8 @@ namespace Discord | |||||
| user.Status = extendedModel.Status; | user.Status = extendedModel.Status; | ||||
| } | } | ||||
| _users[model.Id] = user; | |||||
| if (addNew) | |||||
| _users[model.Id] = user; | |||||
| return user; | return user; | ||||
| } | } | ||||
| @@ -302,7 +362,7 @@ namespace Discord | |||||
| _servers.TryGetValue(id, out server); | _servers.TryGetValue(id, out server); | ||||
| return server; | return server; | ||||
| } | } | ||||
| private Server UpdateServer(ServerInfo model) | |||||
| private Server UpdateServer(ServerInfo model, bool addNew = true) | |||||
| { | { | ||||
| var server = GetServer(model.Id) ?? new Server(model.Id, this); | var server = GetServer(model.Id) ?? new Server(model.Id, this); | ||||
| @@ -321,17 +381,18 @@ namespace Discord | |||||
| foreach (var channel in extendedModel.Channels) | foreach (var channel in extendedModel.Channels) | ||||
| { | { | ||||
| UpdateChannel(channel, model.Id); | |||||
| UpdateChannel(channel, model.Id, addNew); | |||||
| server._channels[channel.Id] = true; | server._channels[channel.Id] = true; | ||||
| } | } | ||||
| foreach (var membership in extendedModel.Members) | foreach (var membership in extendedModel.Members) | ||||
| { | { | ||||
| UpdateUser(membership.User); | |||||
| UpdateUser(membership.User, addNew); | |||||
| server._members[membership.User.Id] = true; | server._members[membership.User.Id] = true; | ||||
| } | } | ||||
| } | } | ||||
| _servers[model.Id] = server; | |||||
| if (addNew) | |||||
| _servers[model.Id] = server; | |||||
| return server; | return server; | ||||
| } | } | ||||
| @@ -342,7 +403,7 @@ namespace Discord | |||||
| _channels.TryGetValue(id, out channel); | _channels.TryGetValue(id, out channel); | ||||
| return channel; | return channel; | ||||
| } | } | ||||
| private Channel UpdateChannel(ChannelInfo model, string serverId) | |||||
| private Channel UpdateChannel(ChannelInfo model, string serverId, bool addNew = true) | |||||
| { | { | ||||
| var channel = GetChannel(model.Id) ?? new Channel(model.Id, serverId, this); | var channel = GetChannel(model.Id) ?? new Channel(model.Id, serverId, this); | ||||
| @@ -352,7 +413,8 @@ namespace Discord | |||||
| channel.RecipientId = model.Recipient?.Id; | channel.RecipientId = model.Recipient?.Id; | ||||
| channel.Type = model.Type; | channel.Type = model.Type; | ||||
| _channels[model.Id] = channel; | |||||
| if (addNew) | |||||
| _channels[model.Id] = channel; | |||||
| return channel; | return channel; | ||||
| } | } | ||||
| private Channel DeleteChannel(string id) | private Channel DeleteChannel(string id) | ||||
| @@ -370,18 +432,13 @@ namespace Discord | |||||
| private ChatMessageReference GetMessage(string id, string channelId) | private ChatMessageReference GetMessage(string id, string channelId) | ||||
| { | { | ||||
| if (id == null || channelId == null) return null; | if (id == null || channelId == null) return null; | ||||
| var msg = new ChatMessageReference(id, this); | |||||
| msg.ChannelId = channelId; | |||||
| return msg; | |||||
| return new ChatMessageReference(id, channelId, this); | |||||
| } | } | ||||
| private ChatMessage UpdateMessage(WebSocketEvents.MessageCreate model) | |||||
| private ChatMessage UpdateMessage(WebSocketEvents.MessageCreate model, bool addNew = true) | |||||
| { | { | ||||
| return new ChatMessage(model.Id, this) | |||||
| return new ChatMessage(model.Id, model.ChannelId, this) | |||||
| { | { | ||||
| Attachments = model.Attachments, | Attachments = model.Attachments, | ||||
| ChannelId = model.ChannelId, | |||||
| Text = model.Content, | Text = model.Content, | ||||
| Embeds = model.Embeds, | Embeds = model.Embeds, | ||||
| IsMentioningEveryone = model.IsMentioningEveryone, | IsMentioningEveryone = model.IsMentioningEveryone, | ||||
| @@ -391,6 +448,20 @@ namespace Discord | |||||
| }; | }; | ||||
| } | } | ||||
| private Role GetRole(string id, string serverId) | |||||
| { | |||||
| if (id == null || serverId == null) return null; | |||||
| return new Role(id, serverId, this); | |||||
| } | |||||
| private Role UpdateRole(WebSocketEvents.GuildRoleCreateUpdate role, bool addNew = true) | |||||
| { | |||||
| return new Role(role.Role.Id, role.GuildId, this) | |||||
| { | |||||
| Name = role.Role.Name, | |||||
| Permissions = role.Role.Permissions | |||||
| }; | |||||
| } | |||||
| private void CheckReady() | private void CheckReady() | ||||
| { | { | ||||
| if (!_isReady) | if (!_isReady) | ||||
| @@ -2,9 +2,9 @@ | |||||
| namespace Discord.Models | namespace Discord.Models | ||||
| { | { | ||||
| public class Channel | |||||
| public sealed class Channel | |||||
| { | { | ||||
| protected readonly DiscordClient _client; | |||||
| private readonly DiscordClient _client; | |||||
| private string _name; | private string _name; | ||||
| public string Id { get; } | public string Id { get; } | ||||
| @@ -12,8 +12,7 @@ namespace Discord.Models | |||||
| public bool IsPrivate { get; internal set; } | public bool IsPrivate { get; internal set; } | ||||
| public string Type { get; internal set; } | public string Type { get; internal set; } | ||||
| [JsonIgnore] | |||||
| public string ServerId { get; } | public string ServerId { get; } | ||||
| [JsonIgnore] | [JsonIgnore] | ||||
| public Server Server { get { return ServerId != null ? _client.GetServer(ServerId) : null; } } | public Server Server { get { return ServerId != null ? _client.GetServer(ServerId) : null; } } | ||||
| @@ -35,7 +34,6 @@ namespace Discord.Models | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return Name; | return Name; | ||||
| //return Name + " (" + Id + ")"; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -3,23 +3,23 @@ using System; | |||||
| namespace Discord.Models | namespace Discord.Models | ||||
| { | { | ||||
| public class ChatMessage : ChatMessageReference | |||||
| public sealed class ChatMessage : ChatMessageReference | |||||
| { | { | ||||
| public bool IsMentioningEveryone { get; internal set; } | public bool IsMentioningEveryone { get; internal set; } | ||||
| public bool IsTTS { get; internal set; } | public bool IsTTS { get; internal set; } | ||||
| public string Text { get; internal set; } | public string Text { get; internal set; } | ||||
| public DateTime Timestamp { get; internal set; } | public DateTime Timestamp { get; internal set; } | ||||
| [JsonIgnore] | |||||
| public string UserId { get; internal set; } | public string UserId { get; internal set; } | ||||
| [JsonIgnore] | |||||
| public User User { get { return _client.GetUser(UserId); } } | public User User { get { return _client.GetUser(UserId); } } | ||||
| //Not Implemented | //Not Implemented | ||||
| public object[] Attachments { get; internal set; } | public object[] Attachments { get; internal set; } | ||||
| public object[] Embeds { get; internal set; } | public object[] Embeds { get; internal set; } | ||||
| internal ChatMessage(string id, DiscordClient client) | |||||
| : base(id, client) | |||||
| internal ChatMessage(string id, string channelId, DiscordClient client) | |||||
| : base(id, channelId, client) | |||||
| { | { | ||||
| } | } | ||||
| @@ -1,16 +1,21 @@ | |||||
| namespace Discord.Models | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.Models | |||||
| { | { | ||||
| public class ChatMessageReference | public class ChatMessageReference | ||||
| { | { | ||||
| protected readonly DiscordClient _client; | protected readonly DiscordClient _client; | ||||
| public string Id { get; } | public string Id { get; } | ||||
| public string ChannelId { get; internal set; } | |||||
| public string ChannelId { get; } | |||||
| [JsonIgnore] | |||||
| public Channel Channel { get { return _client.GetChannel(ChannelId); } } | public Channel Channel { get { return _client.GetChannel(ChannelId); } } | ||||
| internal ChatMessageReference(string id, DiscordClient client) | |||||
| internal ChatMessageReference(string id, string channelId, DiscordClient client) | |||||
| { | { | ||||
| Id = id; | Id = id; | ||||
| ChannelId = channelId; | |||||
| _client = client; | _client = client; | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,29 @@ | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.Models | |||||
| { | |||||
| public sealed class Role | |||||
| { | |||||
| private readonly DiscordClient _client; | |||||
| public string Id { get; } | |||||
| public string Name { get; internal set; } | |||||
| public int Permissions { get; internal set; } | |||||
| public string ServerId { get; } | |||||
| [JsonIgnore] | |||||
| public Server Server { get { return _client.GetServer(ServerId); } } | |||||
| internal Role(string id, string serverId, DiscordClient client) | |||||
| { | |||||
| Id = id; | |||||
| _client = client; | |||||
| } | |||||
| public override string ToString() | |||||
| { | |||||
| return Name; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -6,9 +6,9 @@ using System.Linq; | |||||
| namespace Discord.Models | namespace Discord.Models | ||||
| { | { | ||||
| public class Server | |||||
| public sealed class Server | |||||
| { | { | ||||
| protected readonly DiscordClient _client; | |||||
| private readonly DiscordClient _client; | |||||
| public string Id { get; } | public string Id { get; } | ||||
| public string Name { get; internal set; } | public string Name { get; internal set; } | ||||
| @@ -22,13 +22,13 @@ namespace Discord.Models | |||||
| public User Owner { get { return _client.GetUser(OwnerId); } } | public User Owner { get { return _client.GetUser(OwnerId); } } | ||||
| internal ConcurrentDictionary<string, bool> _members; | internal ConcurrentDictionary<string, bool> _members; | ||||
| [JsonIgnore] | |||||
| public IEnumerable<string> MemberIds { get { return _members.Keys; } } | public IEnumerable<string> MemberIds { get { return _members.Keys; } } | ||||
| [JsonIgnore] | |||||
| public IEnumerable<User> Members { get { return _members.Keys.Select(x => _client.GetUser(x)); } } | public IEnumerable<User> Members { get { return _members.Keys.Select(x => _client.GetUser(x)); } } | ||||
| internal ConcurrentDictionary<string, bool> _channels; | internal ConcurrentDictionary<string, bool> _channels; | ||||
| [JsonIgnore] | |||||
| public IEnumerable<string> ChannelIds { get { return _channels.Keys; } } | public IEnumerable<string> ChannelIds { get { return _channels.Keys; } } | ||||
| [JsonIgnore] | |||||
| public IEnumerable<Channel> Channels { get { return _channels.Keys.Select(x => _client.GetChannel(x)); } } | public IEnumerable<Channel> Channels { get { return _channels.Keys.Select(x => _client.GetChannel(x)); } } | ||||
| //Not Implemented | //Not Implemented | ||||
| @@ -47,7 +47,6 @@ namespace Discord.Models | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return Name; | return Name; | ||||
| //return Name + " (" + Id + ")"; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -2,9 +2,9 @@ | |||||
| namespace Discord.Models | namespace Discord.Models | ||||
| { | { | ||||
| public class User | |||||
| public sealed class User | |||||
| { | { | ||||
| protected readonly DiscordClient _client; | |||||
| private readonly DiscordClient _client; | |||||
| public string Id { get; } | public string Id { get; } | ||||
| public string Name { get; internal set; } | public string Name { get; internal set; } | ||||
| @@ -34,7 +34,6 @@ namespace Discord.Models | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return Name; | return Name; | ||||
| //return Name + " (" + Id + ")"; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||