From d141d555d90583f35d4207ce6b666c078f325dc4 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Tue, 4 Aug 2015 16:54:40 -0300 Subject: [PATCH] Added several new events --- Discord.Net/API/Models/General.cs | 10 ++ Discord.Net/API/Models/WebSocketEvents.cs | 42 ++++- Discord.Net/Discord.Net.csproj | 1 + Discord.Net/DiscordClient.Events.cs | 193 ++++++++++++++++----- Discord.Net/DiscordClient.cs | 125 ++++++++++--- Discord.Net/Models/Channel.cs | 8 +- Discord.Net/Models/ChatMessage.cs | 10 +- Discord.Net/Models/ChatMessageReference.cs | 11 +- Discord.Net/Models/Role.cs | 29 ++++ Discord.Net/Models/Server.cs | 9 +- Discord.Net/Models/User.cs | 5 +- 11 files changed, 352 insertions(+), 91 deletions(-) create mode 100644 Discord.Net/Models/Role.cs diff --git a/Discord.Net/API/Models/General.cs b/Discord.Net/API/Models/General.cs index cb3a6fdc8..46c487d8d 100644 --- a/Discord.Net/API/Models/General.cs +++ b/Discord.Net/API/Models/General.cs @@ -128,4 +128,14 @@ namespace Discord.API.Models [JsonProperty(PropertyName = "channel_id")] public string ChannelId; } + + internal class Role + { + [JsonProperty(PropertyName = "permissions")] + public int Permissions; + [JsonProperty(PropertyName = "name")] + public string Name; + [JsonProperty(PropertyName = "id")] + public string Id; + } } diff --git a/Discord.Net/API/Models/WebSocketEvents.cs b/Discord.Net/API/Models/WebSocketEvents.cs index 085e89ae2..827d87a87 100644 --- a/Discord.Net/API/Models/WebSocketEvents.cs +++ b/Discord.Net/API/Models/WebSocketEvents.cs @@ -30,19 +30,22 @@ namespace Discord.API.Models internal sealed class ChannelCreate : 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")] public UserInfo User; [JsonProperty(PropertyName = "roles")] public object[] Roles; - [JsonProperty(PropertyName = "joined_at")] - public DateTime JoinedAt; [JsonProperty(PropertyName = "guild_id")] public string GuildId; } - internal sealed class GuildMemberRemove { [JsonProperty(PropertyName = "user")] @@ -50,6 +53,37 @@ namespace Discord.API.Models [JsonProperty(PropertyName = "guild_id")] 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 PresenceUpdate : PresenceUserInfo { } internal sealed class VoiceStateUpdate diff --git a/Discord.Net/Discord.Net.csproj b/Discord.Net/Discord.Net.csproj index 901b9cd85..eda49edcd 100644 --- a/Discord.Net/Discord.Net.csproj +++ b/Discord.Net/Discord.Net.csproj @@ -49,6 +49,7 @@ + diff --git a/Discord.Net/DiscordClient.Events.cs b/Discord.Net/DiscordClient.Events.cs index d5f9b78e6..62349c566 100644 --- a/Discord.Net/DiscordClient.Events.cs +++ b/Discord.Net/DiscordClient.Events.cs @@ -5,46 +5,12 @@ namespace Discord { 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 readonly string Message; 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 DebugMessage; private void RaiseOnDebugMessage(string message) @@ -53,6 +19,7 @@ namespace Discord DebugMessage(this, new LogMessageEventArgs(message)); } + //General public event EventHandler Connected; private void RaiseConnected() { @@ -73,54 +40,202 @@ namespace Discord if (LoggedIn != null) LoggedIn(this, EventArgs.Empty); } - - public event EventHandler ServerCreated, ServerDestroyed; + + //Server + public sealed class ServerEventArgs : EventArgs + { + public readonly Server Server; + internal ServerEventArgs(Server server) { Server = server; } + } + + public event EventHandler ServerCreated; private void RaiseServerCreated(Server server) { if (ServerCreated != null) ServerCreated(this, new ServerEventArgs(server)); } + + public event EventHandler ServerDestroyed; private void RaiseServerDestroyed(Server server) { if (ServerDestroyed != null) ServerDestroyed(this, new ServerEventArgs(server)); } - public event EventHandler ChannelCreated, ChannelDestroyed; + //Channel + public sealed class ChannelEventArgs : EventArgs + { + public readonly Channel Channel; + internal ChannelEventArgs(Channel channel) { Channel = channel; } + } + + public event EventHandler ChannelCreated; private void RaiseChannelCreated(Channel channel) { if (ChannelCreated != null) ChannelCreated(this, new ChannelEventArgs(channel)); } + + public event EventHandler ChannelDestroyed; private void RaiseChannelDestroyed(Channel channel) { if (ChannelDestroyed != null) ChannelDestroyed(this, new ChannelEventArgs(channel)); } + public event EventHandler 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 MessageCreated; - public event EventHandler MessageDeleted, MessageUpdated, MessageAcknowledged; private void RaiseMessageCreated(ChatMessage msg) { if (MessageCreated != null) MessageCreated(this, new MessageCreateEventArgs(msg)); } + + public event EventHandler MessageDeleted; private void RaiseMessageDeleted(ChatMessageReference msg) { if (MessageDeleted != null) MessageDeleted(this, new MessageEventArgs(msg)); } + + public event EventHandler MessageUpdated; private void RaiseMessageUpdated(ChatMessageReference msg) { if (MessageUpdated != null) MessageUpdated(this, new MessageEventArgs(msg)); } + + public event EventHandler MessageAcknowledged; private void RaiseMessageAcknowledged(ChatMessageReference msg) { if (MessageAcknowledged != null) MessageAcknowledged(this, new MessageEventArgs(msg)); } + //Role + public sealed class RoleEventArgs : EventArgs + { + public readonly Role Role; + internal RoleEventArgs(Role role) { Role = role; } + } + + public event EventHandler RoleCreated; + private void RaiseRoleCreated(Role role) + { + if (RoleCreated != null) + RoleCreated(this, new RoleEventArgs(role)); + } + + public event EventHandler RoleUpdated; + private void RaiseRoleDeleted(Role role) + { + if (RoleDeleted != null) + RoleDeleted(this, new RoleEventArgs(role)); + } + + public event EventHandler 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 BanAdded; + private void RaiseBanAdded(User user, Server server) + { + if (BanAdded != null) + BanAdded(this, new BanEventArgs(user, server)); + } + + public event EventHandler 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 MemberAdded; + private void RaiseMemberAdded(User user, Server server) + { + if (MemberAdded != null) + MemberAdded(this, new MemberEventArgs(user, server)); + } + + public event EventHandler MemberRemoved; + private void RaiseMemberRemoved(User user, Server server) + { + if (MemberRemoved != null) + MemberRemoved(this, new MemberEventArgs(user, server)); + } + + public event EventHandler 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 PresenceUpdated; private void RaisePresenceUpdated(User user) { diff --git a/Discord.Net/DiscordClient.cs b/Discord.Net/DiscordClient.cs index 0a2fcc6bb..ff51ae9f3 100644 --- a/Discord.Net/DiscordClient.cs +++ b/Discord.Net/DiscordClient.cs @@ -7,6 +7,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; +using Role = Discord.Models.Role; namespace Discord { @@ -107,15 +108,23 @@ namespace Discord RaiseChannelDestroyed(channel); } break; + case "CHANNEL_UPDATE": + { + var data = e.Event.ToObject(); + var channel = DeleteChannel(data.Id); + RaiseChannelUpdated(channel); + } + break; //Members case "GUILD_MEMBER_ADD": { var data = e.Event.ToObject(); - var user = UpdateUser(data.User); + var user = UpdateUser(data.User); var server = GetServer(data.GuildId); server._members[user.Id] = true; - } + RaiseMemberAdded(user, server); + } break; case "GUILD_MEMBER_REMOVE": { @@ -123,22 +132,56 @@ namespace Discord var user = UpdateUser(data.User); var server = GetServer(data.GuildId); server._members[user.Id] = true; + RaiseMemberRemoved(user, server); + } + break; + case "GUILD_MEMBER_UPDATE": + { + var data = e.Event.ToObject(); + var user = UpdateUser(data.User); + var server = GetServer(data.GuildId); + RaiseMemberUpdated(user, server); } break; - //Users - case "PRESENCE_UPDATE": + //Roles + case "GUILD_ROLE_CREATE": { - var data = e.Event.ToObject(); - var user = UpdateUser(data); - RaisePresenceUpdated(user); + var data = e.Event.ToObject(); + var role = UpdateRole(data); + RaiseRoleCreated(role); } break; - case "VOICE_STATE_UPDATE": + case "GUILD_ROLE_DELETE": { - var data = e.Event.ToObject(); - var user = GetUser(data.UserId); //TODO: Don't ignore this - RaiseVoiceStateUpdated(user); + var data = e.Event.ToObject(); + var role = GetRole(data.RoleId, data.GuildId); + RaiseRoleDeleted(role); + } + break; + case "GUILD_ROLE_UPDATE": + { + var data = e.Event.ToObject(); + var role = UpdateRole(data); + RaiseRoleUpdated(role); + } + break; + + //Roles + case "GUILD_BAN_ADD": + { + var data = e.Event.ToObject(); + var user = UpdateUser(data.User); + var server = GetServer(data.GuildId); + RaiseBanAdded(user, server); + } + break; + case "GUILD_BAN_REMOVE": + { + var data = e.Event.ToObject(); + var user = UpdateUser(data.User); + var server = GetServer(data.GuildId); + RaiseBanRemoved(user, server); } break; @@ -172,6 +215,22 @@ namespace Discord RaiseMessageAcknowledged(msg); } break; + + //Statuses + case "PRESENCE_UPDATE": + { + var data = e.Event.ToObject(); + var user = UpdateUser(data); + RaisePresenceUpdated(user); + } + break; + case "VOICE_STATE_UPDATE": + { + var data = e.Event.ToObject(); + var user = GetUser(data.UserId); //TODO: Don't ignore this + RaiseVoiceStateUpdated(user); + } + break; case "TYPING_START": { var data = e.Event.ToObject(); @@ -271,7 +330,7 @@ namespace Discord _users.TryGetValue(id, out 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); @@ -291,7 +350,8 @@ namespace Discord user.Status = extendedModel.Status; } - _users[model.Id] = user; + if (addNew) + _users[model.Id] = user; return user; } @@ -302,7 +362,7 @@ namespace Discord _servers.TryGetValue(id, out 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); @@ -321,17 +381,18 @@ namespace Discord foreach (var channel in extendedModel.Channels) { - UpdateChannel(channel, model.Id); + UpdateChannel(channel, model.Id, addNew); server._channels[channel.Id] = true; } foreach (var membership in extendedModel.Members) { - UpdateUser(membership.User); + UpdateUser(membership.User, addNew); server._members[membership.User.Id] = true; } } - _servers[model.Id] = server; + if (addNew) + _servers[model.Id] = server; return server; } @@ -342,7 +403,7 @@ namespace Discord _channels.TryGetValue(id, out 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); @@ -352,7 +413,8 @@ namespace Discord channel.RecipientId = model.Recipient?.Id; channel.Type = model.Type; - _channels[model.Id] = channel; + if (addNew) + _channels[model.Id] = channel; return channel; } private Channel DeleteChannel(string id) @@ -370,18 +432,13 @@ namespace Discord private ChatMessageReference GetMessage(string id, string channelId) { 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, - ChannelId = model.ChannelId, Text = model.Content, Embeds = model.Embeds, 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() { if (!_isReady) diff --git a/Discord.Net/Models/Channel.cs b/Discord.Net/Models/Channel.cs index 252d9b88b..23919e192 100644 --- a/Discord.Net/Models/Channel.cs +++ b/Discord.Net/Models/Channel.cs @@ -2,9 +2,9 @@ namespace Discord.Models { - public class Channel + public sealed class Channel { - protected readonly DiscordClient _client; + private readonly DiscordClient _client; private string _name; public string Id { get; } @@ -12,8 +12,7 @@ namespace Discord.Models public bool IsPrivate { get; internal set; } public string Type { get; internal set; } - - [JsonIgnore] + public string ServerId { get; } [JsonIgnore] public Server Server { get { return ServerId != null ? _client.GetServer(ServerId) : null; } } @@ -35,7 +34,6 @@ namespace Discord.Models public override string ToString() { return Name; - //return Name + " (" + Id + ")"; } } } diff --git a/Discord.Net/Models/ChatMessage.cs b/Discord.Net/Models/ChatMessage.cs index 67e948a74..1b8d95d90 100644 --- a/Discord.Net/Models/ChatMessage.cs +++ b/Discord.Net/Models/ChatMessage.cs @@ -3,23 +3,23 @@ using System; namespace Discord.Models { - public class ChatMessage : ChatMessageReference + public sealed class ChatMessage : ChatMessageReference { public bool IsMentioningEveryone { get; internal set; } public bool IsTTS { get; internal set; } public string Text { get; internal set; } public DateTime Timestamp { get; internal set; } - - [JsonIgnore] + public string UserId { get; internal set; } + [JsonIgnore] public User User { get { return _client.GetUser(UserId); } } //Not Implemented public object[] Attachments { 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) { } diff --git a/Discord.Net/Models/ChatMessageReference.cs b/Discord.Net/Models/ChatMessageReference.cs index 5358c2636..d3c800cf3 100644 --- a/Discord.Net/Models/ChatMessageReference.cs +++ b/Discord.Net/Models/ChatMessageReference.cs @@ -1,16 +1,21 @@ -namespace Discord.Models +using Newtonsoft.Json; + +namespace Discord.Models { public class ChatMessageReference { protected readonly DiscordClient _client; public string Id { get; } - public string ChannelId { get; internal set; } + + public string ChannelId { get; } + [JsonIgnore] public Channel Channel { get { return _client.GetChannel(ChannelId); } } - internal ChatMessageReference(string id, DiscordClient client) + internal ChatMessageReference(string id, string channelId, DiscordClient client) { Id = id; + ChannelId = channelId; _client = client; } } diff --git a/Discord.Net/Models/Role.cs b/Discord.Net/Models/Role.cs new file mode 100644 index 000000000..1c6d47a8e --- /dev/null +++ b/Discord.Net/Models/Role.cs @@ -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; + } + } +} diff --git a/Discord.Net/Models/Server.cs b/Discord.Net/Models/Server.cs index fadf49187..667f0cc66 100644 --- a/Discord.Net/Models/Server.cs +++ b/Discord.Net/Models/Server.cs @@ -6,9 +6,9 @@ using System.Linq; namespace Discord.Models { - public class Server + public sealed class Server { - protected readonly DiscordClient _client; + private readonly DiscordClient _client; public string Id { get; } public string Name { get; internal set; } @@ -22,13 +22,13 @@ namespace Discord.Models public User Owner { get { return _client.GetUser(OwnerId); } } internal ConcurrentDictionary _members; - [JsonIgnore] public IEnumerable MemberIds { get { return _members.Keys; } } + [JsonIgnore] public IEnumerable Members { get { return _members.Keys.Select(x => _client.GetUser(x)); } } internal ConcurrentDictionary _channels; - [JsonIgnore] public IEnumerable ChannelIds { get { return _channels.Keys; } } + [JsonIgnore] public IEnumerable Channels { get { return _channels.Keys.Select(x => _client.GetChannel(x)); } } //Not Implemented @@ -47,7 +47,6 @@ namespace Discord.Models public override string ToString() { return Name; - //return Name + " (" + Id + ")"; } } } diff --git a/Discord.Net/Models/User.cs b/Discord.Net/Models/User.cs index c913b3222..f9f528e89 100644 --- a/Discord.Net/Models/User.cs +++ b/Discord.Net/Models/User.cs @@ -2,9 +2,9 @@ namespace Discord.Models { - public class User + public sealed class User { - protected readonly DiscordClient _client; + private readonly DiscordClient _client; public string Id { get; } public string Name { get; internal set; } @@ -34,7 +34,6 @@ namespace Discord.Models public override string ToString() { return Name; - //return Name + " (" + Id + ")"; } } }