diff --git a/Discord.Net.sln b/Discord.Net.sln index a9c6cc577..900f44b13 100644 --- a/Discord.Net.sln +++ b/Discord.Net.sln @@ -1,49 +1,41 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 +# Visual Studio 2012 VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8D7989F0-66CE-4DBB-8230-D8C811E9B1D7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6317A2E6-8E36-4C3E-949B-3F10EC888AB9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1BE8AF3F-3CFD-433F-A380-D294A4F617C1}" - ProjectSection(SolutionItems) = preProject - global.json = global.json - EndProjectSection +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet", "dotnet", "{EA68EBE2-51C8-4440-9EF7-D633C90A5D35}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net", "src\Discord.Net\Discord.Net.xproj", "{ACFB060B-EC8A-4926-B293-04C01E17EE23}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet", "dotnet", "{EA68EBE2-51C8-4440-9EF7-D633C90A5D35}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net.Commands", "src\Discord.Net.Commands\Discord.Net.Commands.xproj", "{19793545-EF89-48F4-8100-3EBAAD0A9141}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{DF03D4E8-38F6-4FE1-BC52-E38124BE8AFD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net", "src\Discord.Net.Net45\Discord.Net.csproj", "{8D71A857-879A-4A10-859E-5FF824ED6688}" +Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Discord.Net", "src\Discord.Net.Net45\Discord.Net.csproj", "{8D71A857-879A-4A10-859E-5FF824ED6688}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Commands", "src\Discord.Net.Commands.Net45\Discord.Net.Commands.csproj", "{1B5603B4-6F8F-4289-B945-7BAAE523D740}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6317A2E6-8E36-4C3E-949B-3F10EC888AB9}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Discord.Net.Tests", "test\Discord.Net.Tests\Discord.Net.Tests.csproj", "{855D6B1D-847B-42DA-BE6A-23683EA89511}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1BE8AF3F-3CFD-433F-A380-D294A4F617C1}" + ProjectSection(SolutionItems) = preProject + global.json = global.json + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.Build.0 = Release|Any CPU {19793545-EF89-48F4-8100-3EBAAD0A9141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19793545-EF89-48F4-8100-3EBAAD0A9141}.Debug|Any CPU.Build.0 = Debug|Any CPU {19793545-EF89-48F4-8100-3EBAAD0A9141}.Release|Any CPU.ActiveCfg = Release|Any CPU {19793545-EF89-48F4-8100-3EBAAD0A9141}.Release|Any CPU.Build.0 = Release|Any CPU - {8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.Build.0 = Release|Any CPU {1B5603B4-6F8F-4289-B945-7BAAE523D740}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B5603B4-6F8F-4289-B945-7BAAE523D740}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B5603B4-6F8F-4289-B945-7BAAE523D740}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -52,17 +44,25 @@ Global {855D6B1D-847B-42DA-BE6A-23683EA89511}.Debug|Any CPU.Build.0 = Debug|Any CPU {855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.ActiveCfg = Release|Any CPU {855D6B1D-847B-42DA-BE6A-23683EA89511}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE + {8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D71A857-879A-4A10-859E-5FF824ED6688}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D71A857-879A-4A10-859E-5FF824ED6688}.Release|Any CPU.Build.0 = Release|Any CPU + {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACFB060B-EC8A-4926-B293-04C01E17EE23}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {ACFB060B-EC8A-4926-B293-04C01E17EE23} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35} {EA68EBE2-51C8-4440-9EF7-D633C90A5D35} = {8D7989F0-66CE-4DBB-8230-D8C811E9B1D7} - {19793545-EF89-48F4-8100-3EBAAD0A9141} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35} {DF03D4E8-38F6-4FE1-BC52-E38124BE8AFD} = {8D7989F0-66CE-4DBB-8230-D8C811E9B1D7} + {ACFB060B-EC8A-4926-B293-04C01E17EE23} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35} + {19793545-EF89-48F4-8100-3EBAAD0A9141} = {EA68EBE2-51C8-4440-9EF7-D633C90A5D35} {8D71A857-879A-4A10-859E-5FF824ED6688} = {DF03D4E8-38F6-4FE1-BC52-E38124BE8AFD} {1B5603B4-6F8F-4289-B945-7BAAE523D740} = {DF03D4E8-38F6-4FE1-BC52-E38124BE8AFD} {855D6B1D-847B-42DA-BE6A-23683EA89511} = {6317A2E6-8E36-4C3E-949B-3F10EC888AB9} EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection EndGlobal diff --git a/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj b/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj index 04f5487bc..50c89e287 100644 --- a/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj +++ b/src/Discord.Net.Commands.Net45/Discord.Net.Commands.csproj @@ -1,5 +1,5 @@  - + Debug @@ -11,6 +11,7 @@ Discord.Net.Commands 512 v4.5 + False true @@ -20,7 +21,7 @@ TRACE;DEBUG;NET45 prompt 4 - false + 6 pdbonly @@ -30,13 +31,8 @@ prompt 4 true + 6 - - - {8d71a857-879a-4a10-859e-5ff824ed6688} - Discord.Net - - @@ -66,4 +62,10 @@ --> + + + {8D71A857-879A-4A10-859E-5FF824ED6688} + Discord.Net + + \ No newline at end of file diff --git a/src/Discord.Net.Commands/DiscordBotClient.Events.cs b/src/Discord.Net.Commands/DiscordBotClient.Events.cs index 93c0ea44d..1930d6240 100644 --- a/src/Discord.Net.Commands/DiscordBotClient.Events.cs +++ b/src/Discord.Net.Commands/DiscordBotClient.Events.cs @@ -21,11 +21,11 @@ namespace Discord public CommandEventArgs(Message message, Command command, string commandText, int? permissions, string[] args) { - Message = message; - Command = command; - CommandText = commandText; - Permissions = permissions; - Args = args; + this.Message = message; + this.Command = command; + this.CommandText = commandText; + this.Permissions = permissions; + this.Args = args; } } public class CommandErrorEventArgs : CommandEventArgs @@ -35,7 +35,7 @@ namespace Discord public CommandErrorEventArgs(CommandEventArgs baseArgs, Exception ex) : base(baseArgs.Message, baseArgs.Command, baseArgs.CommandText, baseArgs.Permissions, baseArgs.Args) { - Exception = ex; + this.Exception = ex; } } public partial class DiscordBotClient : DiscordClient diff --git a/src/Discord.Net.Net45/Discord.Net.csproj b/src/Discord.Net.Net45/Discord.Net.csproj index 40678a4d4..3b1eaccd7 100644 --- a/src/Discord.Net.Net45/Discord.Net.csproj +++ b/src/Discord.Net.Net45/Discord.Net.csproj @@ -1,5 +1,5 @@  - + Debug @@ -13,6 +13,7 @@ v4.5 + False true @@ -22,8 +23,8 @@ TRACE;DEBUG;NET45 prompt 2 - false true + 6 pdbonly @@ -34,6 +35,7 @@ 4 true true + 6 true @@ -45,18 +47,18 @@ AnyCPU prompt MinimumRecommendedRules.ruleset + false + 6 - + + + ..\..\..\DiscordBot\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll - True - + ..\..\..\DiscordBot\packages\RestSharp.105.2.3\lib\net45\RestSharp.dll - True - - diff --git a/src/Discord.Net/API/Responses.cs b/src/Discord.Net/API/Responses.cs new file mode 100644 index 000000000..d98ec2dc6 --- /dev/null +++ b/src/Discord.Net/API/Responses.cs @@ -0,0 +1,112 @@ +//Ignore unused/unassigned variable warnings +#pragma warning disable CS0649 +#pragma warning disable CS0169 + +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Discord.API +{ + //Auth + public sealed class GatewayResponse + { + [JsonProperty("url")] + public string Url; + } + public sealed class FingerprintResponse + { + [JsonProperty("fingerprint")] + public string Fingerprint; + } + public sealed class RegisterResponse + { + [JsonProperty("token")] + public string Token; + } + public sealed class LoginResponse + { + [JsonProperty("token")] + public string Token; + } + + //Channels + public sealed class CreateChannelResponse : ChannelInfo { } + public sealed class DestroyChannelResponse : ChannelInfo { } + public sealed class EditChannelResponse : ChannelInfo { } + + //Invites + public sealed class CreateInviteResponse : ExtendedInvite { } + public sealed class GetInviteResponse : Invite { } + public sealed class AcceptInviteResponse : Invite { } + + //Messages + public sealed class SendMessageResponse : Message { } + public sealed class EditMessageResponse : Message { } + public sealed class GetMessagesResponse : List { } + + //Profile + public sealed class EditProfileResponse : SelfUserInfo { } + + //Servers + public sealed class CreateServerResponse : GuildInfo { } + public sealed class DeleteServerResponse : GuildInfo { } + public sealed class EditServerResponse : GuildInfo { } + + //Voice + public sealed class GetRegionsResponse : List + { + public sealed class RegionData + { + [JsonProperty("sample_hostname")] + public string Hostname; + [JsonProperty("sample_port")] + public int Port; + [JsonProperty("id")] + public string Id; + [JsonProperty("name")] + public string Name; + } + } + public sealed class GetIceResponse + { + [JsonProperty("ttl")] + public string TTL; + [JsonProperty("servers")] + public ServerData[] Servers; + + public sealed class ServerData + { + [JsonProperty("url")] + public string URL; + [JsonProperty("username")] + public string Username; + [JsonProperty("credential")] + public string Credential; + } + } + + public sealed class GetIncidentsResponse + { + [JsonProperty("page")] + public PageData Page; + [JsonProperty("scheduled_maintenances")] + public MaintenanceData[] ScheduledMaintenances; + + public sealed class PageData + { + [JsonProperty("id")] + public string Id; + [JsonProperty("name")] + public string Name; + [JsonProperty("url")] + public string Url; + [JsonProperty("updated-at")] + public DateTime UpdatedAt; + } + + public sealed class MaintenanceData + { + } + } +} diff --git a/src/Discord.Net/DiscordAPIClient.cs b/src/Discord.Net/DiscordAPIClient.cs new file mode 100644 index 000000000..7a159bf83 --- /dev/null +++ b/src/Discord.Net/DiscordAPIClient.cs @@ -0,0 +1,293 @@ +using Discord.API; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Discord +{ + /// A lightweight wrapper around the Discord API. + public class DiscordAPIClient + { + internal RestClient RestClient => _rest; + private readonly RestClient _rest; + + public DiscordAPIClient(LogMessageSeverity logLevel, int timeout) + { + _rest = new RestClient(logLevel, timeout); + } + + private string _token; + public string Token + { + get { return _token; } + set { _token = value; _rest.SetToken(value); } + } + private CancellationToken _cancelToken; + public CancellationToken CancelToken + { + get { return _cancelToken; } + set { _cancelToken = value; _rest.SetCancelToken(value); } + } + + //Auth + public Task Gateway() + => _rest.Get(Endpoints.Gateway); + public Task Fingerprint() + => _rest.Post(Endpoints.AuthFingerprint); + public async Task LoginAnonymous(string username, string fingerprint) + { + if (username == null) throw new ArgumentNullException(nameof(username)); + if (fingerprint == null) throw new ArgumentNullException(nameof(fingerprint)); + + var request = new RegisterRequest { Fingerprint = fingerprint, Username = username }; + return await _rest.Post(Endpoints.AuthRegister, request).ConfigureAwait(false); + } + public async Task Login(string email, string password) + { + if (email == null) throw new ArgumentNullException(nameof(email)); + if (password == null) throw new ArgumentNullException(nameof(password)); + + var request = new LoginRequest { Email = email, Password = password }; + return await _rest.Post(Endpoints.AuthLogin, request).ConfigureAwait(false); + } + public Task Logout() + => _rest.Post(Endpoints.AuthLogout); + + //Channels + public Task CreateChannel(string serverId, string name, string channelType) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (name == null) throw new ArgumentNullException(nameof(name)); + if (channelType == null) throw new ArgumentNullException(nameof(channelType)); + + var request = new CreateChannelRequest { Name = name, Type = channelType }; + return _rest.Post(Endpoints.ServerChannels(serverId), request); + } + public Task CreatePMChannel(string myId, string recipientId) + { + if (myId == null) throw new ArgumentNullException(nameof(myId)); + if (recipientId == null) throw new ArgumentNullException(nameof(recipientId)); + + var request = new CreatePMChannelRequest { RecipientId = recipientId }; + return _rest.Post(Endpoints.UserChannels(myId), request); + } + public Task DestroyChannel(string channelId) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + return _rest.Delete(Endpoints.Channel(channelId)); + } + public Task EditChannel(string channelId, string name = null, string topic = null) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + var request = new EditChannelRequest { Name = name, Topic = topic }; + return _rest.Patch(Endpoints.Channel(channelId), request); + } + public Task GetMessages(string channelId, int count) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + return _rest.Get(Endpoints.ChannelMessages(channelId, count)); + } + + //Incidents + public Task GetUnresolvedIncidents() + { + return _rest.Get(Endpoints.StatusUnresolvedMaintenance); + } + public Task GetActiveIncidents() + { + return _rest.Get(Endpoints.StatusActiveMaintenance); + } + public Task GetUpcomingIncidents() + { + return _rest.Get(Endpoints.StatusUpcomingMaintenance); + } + + //Invites + public Task CreateInvite(string channelId, int maxAge, int maxUses, bool isTemporary, bool withXkcdPass) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + var request = new CreateInviteRequest { MaxAge = maxAge, MaxUses = maxUses, IsTemporary = isTemporary, WithXkcdPass = withXkcdPass }; + return _rest.Post(Endpoints.ChannelInvites(channelId), request); + } + public Task GetInvite(string inviteIdOrXkcd) + { + if (inviteIdOrXkcd == null) throw new ArgumentNullException(nameof(inviteIdOrXkcd)); + + return _rest.Get(Endpoints.Invite(inviteIdOrXkcd)); + } + public Task AcceptInvite(string inviteId) + { + if (inviteId == null) throw new ArgumentNullException(nameof(inviteId)); + + return _rest.Post(Endpoints.Invite(inviteId)); + } + public Task DeleteInvite(string inviteId) + { + if (inviteId == null) throw new ArgumentNullException(nameof(inviteId)); + + return _rest.Delete(Endpoints.Invite(inviteId)); + } + + //Members + public Task EditMember(string serverId, string userId, bool? mute = null, bool? deaf = null, string[] roles = null) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (userId == null) throw new ArgumentNullException(nameof(userId)); + + var request = new EditMemberRequest { Mute = mute, Deaf = deaf, Roles = roles }; + return _rest.Patch(Endpoints.ServerMember(serverId, userId)); + } + public Task Kick(string serverId, string userId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (userId == null) throw new ArgumentNullException(nameof(userId)); + + return _rest.Delete(Endpoints.ServerMember(serverId, userId)); + } + public Task Ban(string serverId, string userId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (userId == null) throw new ArgumentNullException(nameof(userId)); + + return _rest.Put(Endpoints.ServerBan(serverId, userId)); + } + public Task Unban(string serverId, string userId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (userId == null) throw new ArgumentNullException(nameof(userId)); + + return _rest.Delete(Endpoints.ServerBan(serverId, userId)); + } + + //Messages + public Task SendMessage(string channelId, string message, string[] mentions = null, string nonce = null, bool isTTS = false) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + if (message == null) throw new ArgumentNullException(nameof(message)); + + var request = new SendMessageRequest { Content = message, Mentions = mentions ?? new string[0], Nonce = nonce, IsTTS = isTTS ? true : false }; + return _rest.Post(Endpoints.ChannelMessages(channelId), request); + } + public Task SendFile(string channelId, string filePath) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + if (filePath == null) throw new ArgumentNullException(nameof(filePath)); + + return _rest.PostFile(Endpoints.ChannelMessages(channelId), filePath); + } + public Task DeleteMessage(string messageId, string channelId) + { + if (messageId == null) throw new ArgumentNullException(nameof(messageId)); + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + return _rest.Delete(Endpoints.ChannelMessage(channelId, messageId)); + } + public Task EditMessage(string messageId, string channelId, string message = null, string[] mentions = null) + { + if (messageId == null) throw new ArgumentNullException(nameof(messageId)); + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + var request = new EditMessageRequest { Content = message, Mentions = mentions }; + return _rest.Patch(Endpoints.ChannelMessage(channelId, messageId), request); + } + public Task SendIsTyping(string channelId) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + + return _rest.Post(Endpoints.ChannelTyping(channelId)); + } + + //Permissions + public Task SetChannelPermissions(string channelId, string userOrRoleId, string idType, uint allow = 0, uint deny = 0) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + if (userOrRoleId == null) throw new ArgumentNullException(nameof(userOrRoleId)); + if (idType == null) throw new ArgumentNullException(nameof(idType)); + + var request = new SetChannelPermissionsRequest { Id = userOrRoleId, Type = idType, Allow = allow, Deny = deny }; + return _rest.Put(Endpoints.ChannelPermission(channelId, userOrRoleId), request); + } + public Task DeleteChannelPermissions(string channelId, string userOrRoleId) + { + if (channelId == null) throw new ArgumentNullException(nameof(channelId)); + if (userOrRoleId == null) throw new ArgumentNullException(nameof(userOrRoleId)); + + return _rest.Delete(Endpoints.ChannelPermission(channelId, userOrRoleId), null); + } + + //Profile + public Task EditProfile(string currentPassword, + string username = null, string email = null, string password = null, + AvatarImageType avatarType = AvatarImageType.Png, byte[] avatar = null) + { + if (currentPassword == null) throw new ArgumentNullException(nameof(currentPassword)); + + string avatarBase64 = null; + if (avatar != null) + { + string base64 = Convert.ToBase64String(avatar); + string type = avatarType == AvatarImageType.Jpeg ? "image/jpeg;base64" : "image/png;base64"; + avatarBase64 = $"data:{type},/9j/{base64}"; + } + var request = new EditProfileRequest { CurrentPassword = currentPassword, Username = username, Email = email, Password = password, Avatar = avatarBase64 }; + return _rest.Patch(Endpoints.UserMe, request); + } + + //Roles + public Task CreateRole(string serverId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + + //TODO: Return a response when Discord starts giving us one + return _rest.Post(Endpoints.ServerRoles(serverId)); + } + public Task DeleteRole(string serverId, string roleId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (roleId == null) throw new ArgumentNullException(nameof(roleId)); + + return _rest.Delete(Endpoints.ServerRole(serverId, roleId)); + } + public Task EditRole(string serverId, string roleId, string name = null, uint? permissions = null) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (roleId == null) throw new ArgumentNullException(nameof(roleId)); + + var request = new EditRoleRequest { Name = name, Permissions = permissions }; + return _rest.Patch(Endpoints.ServerRole(serverId, roleId), request); + } + + //Servers + public Task CreateServer(string name, string region) + { + if (name == null) throw new ArgumentNullException(nameof(name)); + if (region == null) throw new ArgumentNullException(nameof(region)); + + var request = new CreateServerRequest { Name = name, Region = region }; + return _rest.Post(Endpoints.Servers, request); + } + public Task LeaveServer(string serverId) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + + return _rest.Delete(Endpoints.Server(serverId)); + } + public Task EditServer(string serverId, string name = null, string region = null) + { + if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + + var request = new EditServerRequest { Name = name, Region = region }; + return _rest.Patch(Endpoints.Server(serverId), request); + } + + //Voice + public Task GetVoiceRegions() + => _rest.Get(Endpoints.VoiceRegions); + public Task GetVoiceIce() + => _rest.Get(Endpoints.VoiceIce); + } +} diff --git a/src/Discord.Net/DiscordClient.Events.cs b/src/Discord.Net/DiscordClient.Events.cs index c781d3435..888b1437d 100644 --- a/src/Discord.Net/DiscordClient.Events.cs +++ b/src/Discord.Net/DiscordClient.Events.cs @@ -25,7 +25,12 @@ namespace Discord { public readonly bool WasUnexpected; public readonly Exception Error; - internal DisconnectedEventArgs(bool wasUnexpected, Exception error) { WasUnexpected = wasUnexpected; Error = error; } + + internal DisconnectedEventArgs(bool wasUnexpected, Exception error) + { + this.WasUnexpected = wasUnexpected; + this.Error = error; + } } public sealed class LogMessageEventArgs : EventArgs { @@ -33,7 +38,12 @@ namespace Discord public LogMessageSource Source { get; } public string Message { get; } - internal LogMessageEventArgs(LogMessageSeverity severity, LogMessageSource source, string msg) { Severity = severity; Source = source; Message = msg; } + internal LogMessageEventArgs(LogMessageSeverity severity, LogMessageSource source, string msg) + { + this.Severity = severity; + this.Source = source; + this.Message = msg; + } } public sealed class ServerEventArgs : EventArgs @@ -41,7 +51,7 @@ namespace Discord public Server Server { get; } public string ServerId => Server.Id; - internal ServerEventArgs(Server server) { Server = server; } + internal ServerEventArgs(Server server) { this.Server = server; } } public sealed class ChannelEventArgs : EventArgs { @@ -50,14 +60,14 @@ namespace Discord public Server Server => Channel.Server; public string ServerId => Channel.ServerId; - internal ChannelEventArgs(Channel channel) { Channel = channel; } + internal ChannelEventArgs(Channel channel) { this.Channel = channel; } } public sealed class UserEventArgs : EventArgs { public User User { get; } public string UserId => User.Id; - internal UserEventArgs(User user) { User = user; } + internal UserEventArgs(User user) { this.User = user; } } public sealed class MessageEventArgs : EventArgs { @@ -71,7 +81,7 @@ namespace Discord public User User => Member.User; public string UserId => Message.UserId; - internal MessageEventArgs(Message msg) { Message = msg; } + internal MessageEventArgs(Message msg) { this.Message = msg; } } public sealed class RoleEventArgs : EventArgs { @@ -80,7 +90,7 @@ namespace Discord public Server Server => Role.Server; public string ServerId => Role.ServerId; - internal RoleEventArgs(Role role) { Role = role; } + internal RoleEventArgs(Role role) { this.Role = role; } } public sealed class BanEventArgs : EventArgs { @@ -91,9 +101,9 @@ namespace Discord internal BanEventArgs(User user, string userId, Server server) { - User = user; - UserId = userId; - Server = server; + this.User = user; + this.UserId = userId; + this.Server = server; } } public sealed class MemberEventArgs : EventArgs @@ -104,7 +114,7 @@ namespace Discord public Server Server => Member.Server; public string ServerId => Member.ServerId; - internal MemberEventArgs(Member member) { Member = member; } + internal MemberEventArgs(Member member) { this.Member = member; } } public sealed class UserTypingEventArgs : EventArgs { @@ -117,8 +127,8 @@ namespace Discord internal UserTypingEventArgs(User user, Channel channel) { - User = user; - Channel = channel; + this.User = user; + this.Channel = channel; } } public sealed class UserIsSpeakingEventArgs : EventArgs @@ -134,21 +144,10 @@ namespace Discord internal UserIsSpeakingEventArgs(Member member, bool isSpeaking) { - Member = member; - IsSpeaking = isSpeaking; + this.Member = member; + this.IsSpeaking = isSpeaking; } } - /*public sealed class VoiceServerUpdatedEventArgs : EventArgs - { - public Server Server { get; } - public string ServerId => Server.Id; - public string Endpoint { get; } - internal VoiceServerUpdatedEventArgs(Server server, string endpoint) - { - Server = server; - Endpoint = endpoint; - } - }*/ public partial class DiscordClient { diff --git a/src/Discord.Net/WebSockets/Voice/VoiceWebSocket.cs b/src/Discord.Net/WebSockets/Voice/VoiceWebSocket.cs index a27cd4732..cf51aee49 100644 --- a/src/Discord.Net/WebSockets/Voice/VoiceWebSocket.cs +++ b/src/Discord.Net/WebSockets/Voice/VoiceWebSocket.cs @@ -102,7 +102,7 @@ namespace Discord.WebSockets.Voice _isClearing = false; _udp = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); -#if !DNX451 +#if !DNX451 && !__MonoCS__ _udp.AllowNatTraversal(true); #endif