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 + ")";
}
}
}