Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit 00717cf
Author: advorange <advorange@live.com>
Date:   Tue Oct 2 13:26:35 2018 -0700

    Implemented GetVoiceRegionsAsync on IGuild. (discord-net#1166)

commit ff0fea9
Author: Still Hsu <341464@gmail.com>
Date:   Mon Oct 1 05:44:33 2018 +0800

    Documentation Overhaul (discord-net#1161)

    * Add XML docs

    * Clean up style switcher

    * Squash commits on branch docs/faq-n-patches

    * Fix broken theme selector

    * Add local image embed instruction

    * Add a bunch of XML docs

    * Add a bunch of XML docs

    * Fix broken search
    + DocFX by default ships with an older version of jQuery, switching to a newer version confuses parts of the DocFX Javascript.

    * Minor fixes for CONTRIBUTING.md and README.md

    * Clean up filterConfig.yml

    + New config exposes Discord.Net namespace since it has several common public exceptions that may be helpful to users

    * Add XML docs

    * Read token from Environment Variable instead of hardcode

    * Add XMLDocs

    * Compress some assets & add OAuth2 URL generator

    * Fix sample link & add missing pictures

    * Add tag examples

    * Fix embed docs consistency

    * Add details regarding userbot support

    * Add XML Docs

    * Add XML Docs

    * Add XML Docs

    * Minor fixes in documentations
    + Fix unescaped '<'
    + Fix typo

    * Fix seealso for preconditions and add missing descriptions

    * Add missing exceptions

    * Document exposed TypeReaders

    * Fix letter-casing for files

    * Add 'last modified' plugin

    Source: https://github.com/Still34/DocFx.Plugin.LastModified
    Licensed under MIT License

    * XML Docs

    * Fix minor consistencies & redundant impl

    * Add properties examples to overwrite

    * Fix missing Username prop

    * Add warning for bulk-delete endpoint

    * Replace note block

    * Add BaseSocketClient docs

    * Add XML docs

    * Replace langword null to code block null instead

    - Because DocFX sucks at rendering langword

    * Replace all langword placements with code block

    * Add more IGuild docs

    * Add details to SpotifyGame

    * Initial proofread of the articles

    * Add explanation for RunMode

    * Add event docs

    - MessageReceived
    - ChannelUpdated/Destroyed/Created

    * Fix light theme link color

    * Fix xml docs error

    * Add partial documentation for audit log impl

    * Add documentation for some REST-based objects

    * Add partial documentation for audit log objects

    * Add more XML comments to quotation mark alias map stuff, including an example

    * Add reference to CommandServiceConfig from the util docs'

    * Add explanation that if " is removed then it wont work

    * Fix missing service provider in example

    * Add documentation for new INestedChannel

    * Add documentation

    * Add documentation for new API version & few events

    * Revise guide paragraphs/samples

    + Fix various formatting.
    + Provide a more detailed walkthrough for dependency injection.
    + Add C# note at intro.

    * Fix typos & formatting

    * Improve group module example

    * Small amount to see if I'm doing it right

    * Remove/cleanup redundant variables

    * Fix EnterTypingState impl for doc inheritance

    * Fix Test to resolve changes made in 15b58e

    * Improve precondition documentation

    + Add precondition usage sample
    + Add precondition group usage sample
    + Move precondition samples to its own sample folder

    * Move samples to individual folders

    * Clarify token source

    * Cleanup styling of README.md for docs

    * Replace InvalidPathChars for NS1.3

    * InvalidPathChars does not exist in NS1.3; replaced with GetInvalidPathChars instead.

    * Add a missing change for 2c7cc73

    * Update LastModified to v1.1.0 & add license

    * Rewrite installation page for Core 2.1

    * Fix anchor link

    * Bump post-processor to v1.1.1

    * Add fixes to partial file & add license

    * Moved theme-switcher code to scripts partial file
    + Add author's MIT license to featherlight javascript

    * Remove unused bootstrap plugin

    * Bump LastModified plugin

    * Changed the path from 'lastmodified' to 'last-modified' for consistency

    * Cleanup README & Contribution guide

    * Changes to last pr

    * Fix GetCategoryAsync docs

    * Proofread and cleanup articles

    * Change passive voice in "Get Started" to active
    * Fix improper preposition in Commands Introduction page
    * Fix minor grammar mistakes in "Your First Bot" (future tense -> present tense/subjunctive mood -> indicative mood/proper noun casing/incorrect noun/add missing article)
    * Fix minor grammar mistakes in "Installation" (missing article)

    * no hablo ingles

    * Try try try again

    * I'm sure you're having as much fun as I am

    * Cleanup TOC & fix titles

    * Improve styling

    + Change title font to Noto Sans
    + Add materialized design for commit message box

    * Add DescriptionGenerator plugin

    * Add nightly section for clarification

    * Fix typos in Nightlies & Post-execution

    * Bump DescriptionGenerator to v1.1.0

    + This build adds the functionality of generating managed references' summary into the description tag.

    * Initial emoji article draft

    * Add 'additional information' section for emoji article

    * Add cosmetic changes to the master css

    * Alter info box color
    + Add transition to article content

    * Add clarification in the emoji article

    * Emphasize that normal emoji string will not translate to its Unicode representation.
    * Clean up or add some of the samples featured in the article.
    + Add emoji/emote declaration section for clarification.
    + Add WebSocket emote sample.
    - Remove inconsistent styling ('wacky memes' proves to be too out of place).

    * Improve readability for nightlies article

    * Move 'Bundled Preconditions' section

    * Bump LastModified to fix UTC DateTime parsing

    * Add langwordMapping.yml

    * Add XML docs

    * Add VSC workspace rule

    * The root workspace limits the ruler to 120 characters for member documentations and excludes folders such as 'samples' and 'docs'.
    * The docs workspace limits the ruler to 70 characters for standard conceptual article to comply with documentation's CONTRIBUTING.md rule, and excludes temprorary folders created by DocFX.

    * Update CONTRIBUTING.md

    * Add documentation style rule

    * Fix styling of several member documentation

    * Fix ' />' caused by Agent Smith oddities
    * Fix styling to be more specific about the mention of IDs

    * Fix exception summary to comply with official Microsoft Docs style

    * References
    https://docs.microsoft.com/en-us/dotnet/api/system.argumentnullexception?view=netframework-4.7.2
    https://docs.microsoft.com/en-us/dotnet/api/system.platformnotsupportedexception?view=netframework-4.7.2
    https://docs.microsoft.com/en-us/dotnet/api/system.badimageformatexception?view=netframework-4.7.2

    * Add XML documentations

    * Shift color return docs

    * Fix minor docs

    * Added documentation for SocketDMChannel, SocketGuildChannel, and SocketTextChannel

    * Add XML docs

    * Corrections to SocketGuildChannel

    * Corrections to SocketTextChannel

    * Corrections to SocketDMChannel

    * Swapped out 'id' for 'snowflake identifier

    * Swapped out 'id' for 'snowflake identifier'

    * SocketDMChannel amendments

    * SocketGuildChannel amendments

    * SocketTextChannel amendments

    * Add XML docs & patch return types
    + Starting from this commit, all return types for tasks will use style similar to most documentations featured on docs.microsoft.com

    References:
    https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontext.-ctor?view=efcore-2.1
    https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync?view=netcore-2.1
    https://docs.microsoft.com/en-us/dotnet/api/system.io.textwriter.writelineasync?view=netcore-2.1#System_IO_TextWriter_WriteLineAsync_System_Char___
    And many more other asynchronous method documentations featured in the latest BCL.

    * Added documentation for many audit log data types, fixed vowel indefinite articles

    * Change audit log data types to start with 'Contains' (verb) instead of an article

    * Fix some documentation issues and document some more audit log data types

    * Fix English posession

    * Add XML doc

    * Documented two more types

    * Documented RoleCreateAuditLogData

    * Document remaining audit log data types

    * Added RestDMChannel documentation

    * Added RestGuildChannel documentation

    * Added RestTextChannel documentation

    * Added RestVoiceChannel documentation

    * Added RestUser documentation

    * Added RestRole documentation

    * Added RestMessage documentation

    * Slightly better wording

    * Contains -> Contains a piece of (describe article)

    * [EN] Present perf. -> past perf.

    * Add XML docs

    * Fix arrow alignment

    * Clarify supported nullable type

    * Fixed a typo in ISnowflakeEntity

    * Added RestUser Documentation

    * Added RestInvite documentation

    * Add XML docs & minor optimizations

    * Minor optimization for doc rendering

    * Rollback font optimization changes

    * Amendments to RestUser

    * Added SocketDMChannel documentation

    * Added RestDMChannel documentation

    * Added RestGuild documentation

    * Adjustment to SocketDMChannel

    * Added minimal descriptions from the API documentation for Integration types

    * Added obsolete mention to the ReadMessages flag.

    * Added remarks about 2FA requirement for guild permissions

    * Added xmldoc for GuildPermission methods

    * Added xml doc for ToAllowList and ToDenyList

    * Added specification of how the bits of the color raw value are packed

    * Added discord API documentation to IConnection interface

    * I can spell :^)

    * Fix whitespace in ChannelPermission

    * fix spacing of values in guildpermission

    * Made changes to get field descriptions from feedback, added returns tag to IConnection

    * Added property get standard for IntegrationAccount

    * Added property get pattern to xml docs and identical returns tag.

    * Change all color class references to struct
    ...because it isn't a class.

    * Add XML docs

    * Rewrote the returns tags in IGuildIntegration, removed the ones I was unsure about.

    * Rewrote the rest of the returns tags

    * Amendments

    * Cleanup doc for c1d7818

    * Added types to <returns> tags where missing

    * Added second sample for adding reactions

    * Added some class summaries

    * Missed a period

    * Amendments

    * restored the removed line break

    * Removed unnecessary see tag

    * Use consistent quotation marks around subscribers, the name for these users are dependant on the source of where they are integrated from (youtube or twitch), so we should not use a name that is specific to one platform

    * Add <remarks> tag to the IGuildIntegration xmldocs

    * Fix grammar issue

    * Update DescriptionGenerator

    * Cleanup of #8

    * Cleanup previous PR

    * Fix for misleading behaviour in the emoji guide
    + Original lines stated that sending a emoji wrapped in colon will not be parsed, but that was incorrect; replaced with reactions instead of sending messages as the example

    * Add strings for dictionary in DotSettings

    * Add XML docs

    * Fix lots of typos in comments
    + Geez, I didn't know there were so many.

    * Add XML docs & rewrite GetMessagesAsync docs

    This commit rewrites the remarks section of GetMessagesAsync, as well as adding examples to several methods.

    * Update 'Your First Bot'
    + This commit reflects the new changes made to the Discord Application Developer Portal after its major update

    * Initial optimization for DocFX render & add missing files

    * Add examples in message methods

    * Cleanup discord-net#1128

    * Fix first bot note

    * Cleanup FAQ structure

    * Add XML docs

    * Update docfx plugins

    * Fix navbar collapsing issue

    * Fix broken xref

    * Cleanup FAQ section
    + Add introductory paragraphs to each FAQ section.
    + Add 'missing dependency' entry to commands FAQ.
    * Split commands FAQ to 'General' and 'DI' sections.

    * Cleanup discord-net#1139

    * Fix missing namespace

    * Add missing highlighting css for the light theme

    * Add additional clarification for installing packages

    * Add indentation to example for clarity

    * Cleanup several articles to be more human-friendly and easier to read

    * Remove RPC-related notes

    * Cleanup slow-mode-related documentation strings

    * Add an additional note about cross-guild emote usage

    * Add CreateTextChannel sample

    * Add XMLDocs

commit 6b21b11
Author: Christopher F <foxbot@protonmail.com>
Date:   Sun Sep 30 17:10:10 2018 -0400

    feature: adjust the ratelimit for reactions (discord-net#1108)

    * feature: adjust the ratelimit for reactions

    allows users to add reactions quickly

    * fix: don't force DEBUG_LIMITS

    * fix: undefined behavior using DateTime on intel architerctures

    it's fine

    * fix: ensure add/del rxn ends up in the same bucket

commit c9ba79e
Author: Still Hsu <341464@gmail.com>
Date:   Mon Oct 1 05:09:32 2018 +0800

    Initial fix (discord-net#1160)
  • Loading branch information
Still Hsu committed Oct 5, 2018
1 parent 2121a5c commit 9255eec
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 6 deletions.
10 changes: 10 additions & 0 deletions src/Discord.Net.Core/Entities/Guilds/IGuild.cs
Expand Up @@ -467,6 +467,16 @@ public interface IGuild : IDeletable, ISnowflakeEntity
/// </returns>
Task<ICategoryChannel> CreateCategoryAsync(string name, RequestOptions options = null);

/// <summary>
/// Gets a collection of all the voice regions this guild can access.
/// </summary>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous get operation. The task result contains a read-only collection of
/// voice regions the guild can access.
/// </returns>
Task<IReadOnlyCollection<IVoiceRegion>> GetVoiceRegionsAsync(RequestOptions options = null);

Task<IReadOnlyCollection<IGuildIntegration>> GetIntegrationsAsync(RequestOptions options = null);
Task<IGuildIntegration> CreateIntegrationAsync(ulong id, string type, RequestOptions options = null);

Expand Down
1 change: 1 addition & 0 deletions src/Discord.Net.Core/RequestOptions.cs
Expand Up @@ -48,6 +48,7 @@ public class RequestOptions
internal bool IgnoreState { get; set; }
internal string BucketId { get; set; }
internal bool IsClientBucket { get; set; }
internal bool IsReactionBucket { get; set; }

internal static RequestOptions CreateOrClone(RequestOptions options)
{
Expand Down
10 changes: 10 additions & 0 deletions src/Discord.Net.Rest/API/Common/InviteVanity.cs
@@ -0,0 +1,10 @@
using Newtonsoft.Json;

namespace Discord.API
{
public class InviteVanity
{
[JsonProperty("code")]
public string Code { get; set; }
}
}
14 changes: 10 additions & 4 deletions src/Discord.Net.Rest/DiscordRestApiClient.cs
Expand Up @@ -592,17 +592,21 @@ public async Task<Message> ModifyMessageAsync(ulong channelId, ulong messageId,
var ids = new BucketIds(channelId: channelId);
return await SendJsonAsync<Message>("PATCH", () => $"channels/{channelId}/messages/{messageId}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
}

public async Task AddReactionAsync(ulong channelId, ulong messageId, string emoji, RequestOptions options = null)
{
Preconditions.NotEqual(channelId, 0, nameof(channelId));
Preconditions.NotEqual(messageId, 0, nameof(messageId));
Preconditions.NotNullOrWhitespace(emoji, nameof(emoji));

options = RequestOptions.CreateOrClone(options);
options.IsReactionBucket = true;

var ids = new BucketIds(channelId: channelId);

await SendAsync("PUT", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me", ids, options: options).ConfigureAwait(false);
// @me is non-const to fool the ratelimiter, otherwise it will put add/remove in separate buckets
var me = "@me";
await SendAsync("PUT", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/{me}", ids, options: options).ConfigureAwait(false);
}
public async Task RemoveReactionAsync(ulong channelId, ulong messageId, ulong userId, string emoji, RequestOptions options = null)
{
Expand All @@ -611,10 +615,12 @@ public async Task RemoveReactionAsync(ulong channelId, ulong messageId, ulong us
Preconditions.NotNullOrWhitespace(emoji, nameof(emoji));

options = RequestOptions.CreateOrClone(options);
options.IsReactionBucket = true;

var ids = new BucketIds(channelId: channelId);

await SendAsync("DELETE", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/{userId}", ids, options: options).ConfigureAwait(false);
var user = CurrentUserId.HasValue ? (userId == CurrentUserId.Value ? "@me" : userId.ToString()) : userId.ToString();
await SendAsync("DELETE", () => $"channels/{channelId}/messages/{messageId}/reactions/{emoji}/{user}", ids, options: options).ConfigureAwait(false);
}
public async Task RemoveAllReactionsAsync(ulong channelId, ulong messageId, RequestOptions options = null)
{
Expand Down Expand Up @@ -941,13 +947,13 @@ public async Task<InviteMetadata> GetInviteAsync(string inviteId, RequestOptions
}
catch (HttpException ex) when (ex.HttpCode == HttpStatusCode.NotFound) { return null; }
}
public async Task<InviteMetadata> GetVanityInviteAsync(ulong guildId, RequestOptions options = null)
public async Task<InviteVanity> GetVanityInviteAsync(ulong guildId, RequestOptions options = null)
{
Preconditions.NotEqual(guildId, 0, nameof(guildId));
options = RequestOptions.CreateOrClone(options);

var ids = new BucketIds(guildId: guildId);
return await SendAsync<InviteMetadata>("GET", () => $"guilds/{guildId}/vanity-url", ids, options: options).ConfigureAwait(false);
return await SendAsync<InviteVanity>("GET", () => $"guilds/{guildId}/vanity-url", ids, options: options).ConfigureAwait(false);
}
public async Task<IReadOnlyCollection<InviteMetadata>> GetGuildInvitesAsync(ulong guildId, RequestOptions options = null)
{
Expand Down
14 changes: 12 additions & 2 deletions src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
Expand Up @@ -192,6 +192,14 @@ public static async Task<RestBan> GetBanAsync(IGuild guild, BaseDiscordClient cl
return RestCategoryChannel.Create(client, guild, model);
}

//Voice Regions
public static async Task<IReadOnlyCollection<RestVoiceRegion>> GetVoiceRegionsAsync(IGuild guild, BaseDiscordClient client,
RequestOptions options)
{
var models = await client.ApiClient.GetGuildVoiceRegionsAsync(guild.Id, options).ConfigureAwait(false);
return models.Select(x => RestVoiceRegion.Create(client, x)).ToImmutableArray();
}

//Integrations
public static async Task<IReadOnlyCollection<RestGuildIntegration>> GetIntegrationsAsync(IGuild guild, BaseDiscordClient client,
RequestOptions options)
Expand All @@ -217,8 +225,10 @@ public static async Task<RestBan> GetBanAsync(IGuild guild, BaseDiscordClient cl
public static async Task<RestInviteMetadata> GetVanityInviteAsync(IGuild guild, BaseDiscordClient client,
RequestOptions options)
{
var model = await client.ApiClient.GetVanityInviteAsync(guild.Id, options).ConfigureAwait(false);
return RestInviteMetadata.Create(client, guild, null, model);
var vanityModel = await client.ApiClient.GetVanityInviteAsync(guild.Id, options).ConfigureAwait(false);
if (vanityModel == null) throw new InvalidOperationException("This guild does not have a vanity URL.");
var inviteModel = await client.ApiClient.GetInviteAsync(vanityModel.Code, options).ConfigureAwait(false);
return RestInviteMetadata.Create(client, guild, null, inviteModel);
}

//Roles
Expand Down
15 changes: 15 additions & 0 deletions src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
Expand Up @@ -443,6 +443,17 @@ public Task<RestVoiceChannel> CreateVoiceChannelAsync(string name, Action<VoiceC
public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, RequestOptions options = null)
=> GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options);

/// <summary>
/// Gets a collection of all the voice regions this guild can access.
/// </summary>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous get operation. The task result contains a read-only collection of
/// voice regions the guild can access.
/// </returns>
public Task<IReadOnlyCollection<RestVoiceRegion>> GetVoiceRegionsAsync(RequestOptions options = null)
=> GuildHelper.GetVoiceRegionsAsync(this, Discord, options);

//Integrations
public Task<IReadOnlyCollection<RestGuildIntegration>> GetIntegrationsAsync(RequestOptions options = null)
=> GuildHelper.GetIntegrationsAsync(this, Discord, options);
Expand Down Expand Up @@ -758,6 +769,10 @@ async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, Action<Voi
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, RequestOptions options)
=> await CreateCategoryChannelAsync(name, options).ConfigureAwait(false);

/// <inheritdoc />
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options)
=> await GetVoiceRegionsAsync(options).ConfigureAwait(false);

/// <inheritdoc />
async Task<IReadOnlyCollection<IGuildIntegration>> IGuild.GetIntegrationsAsync(RequestOptions options)
=> await GetIntegrationsAsync(options).ConfigureAwait(false);
Expand Down
4 changes: 4 additions & 0 deletions src/Discord.Net.Rest/Net/Queue/RequestQueueBucket.cs
Expand Up @@ -250,6 +250,10 @@ private void UpdateRateLimit(int id, RestRequest request, RateLimitInfo info, bo
else if (info.Reset.HasValue)
{
resetTick = info.Reset.Value.AddSeconds(info.Lag?.TotalSeconds ?? 1.0);

if (request.Options.IsReactionBucket)
resetTick = DateTimeOffset.Now.AddMilliseconds(250);

int diff = (int)(resetTick.Value - DateTimeOffset.UtcNow).TotalMilliseconds;
#if DEBUG_LIMITS
Debug.WriteLine($"[{id}] X-RateLimit-Reset: {info.Reset.Value.ToUnixTimeSeconds()} ({diff} ms, {info.Lag?.TotalMilliseconds} ms lag)");
Expand Down
16 changes: 16 additions & 0 deletions src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
Expand Up @@ -578,6 +578,18 @@ internal SocketGuildChannel RemoveChannel(ClientState state, ulong id)
return null;
}

//Voice Regions
/// <summary>
/// Gets a collection of all the voice regions this guild can access.
/// </summary>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous get operation. The task result contains a read-only collection of
/// voice regions the guild can access.
/// </returns>
public Task<IReadOnlyCollection<RestVoiceRegion>> GetVoiceRegionsAsync(RequestOptions options = null)
=> GuildHelper.GetVoiceRegionsAsync(this, Discord, options);

//Integrations
public Task<IReadOnlyCollection<RestGuildIntegration>> GetIntegrationsAsync(RequestOptions options = null)
=> GuildHelper.GetIntegrationsAsync(this, Discord, options);
Expand Down Expand Up @@ -1050,6 +1062,10 @@ async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, Action<Voi
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, RequestOptions options)
=> await CreateCategoryChannelAsync(name, options).ConfigureAwait(false);

/// <inheritdoc />
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options)
=> await GetVoiceRegionsAsync(options).ConfigureAwait(false);

/// <inheritdoc />
async Task<IReadOnlyCollection<IGuildIntegration>> IGuild.GetIntegrationsAsync(RequestOptions options)
=> await GetIntegrationsAsync(options).ConfigureAwait(false);
Expand Down

0 comments on commit 9255eec

Please sign in to comment.