* add stuff * forgot to push * docs * Update DiscordRestClient.cs * Apply suggestions from code review * Update toc.yml --------- Co-authored-by: Casmir <68127614+csmir@users.noreply.github.com>pull/2585/head
@@ -0,0 +1,68 @@ | |||||
--- | |||||
uid: Guides.BearerToken | |||||
title: Working with Bearer token | |||||
--- | |||||
# Working with Bearer token | |||||
Some endpoints in Discord API require a Bearer token, which can be obtained through [OAuth2 flow](https://discord.com/developers/docs/topics/oauth2). Discord.Net allows you to interact with these endpoints using the [DiscordRestClient]. | |||||
## Initializing a new instance of the client | |||||
[!code-csharp[Initialize DiscordRestClient](samples/rest_client_init.cs)] | |||||
## Getting current user | |||||
The [DiscordRestClient] gets the current user when `LoginAsync()` is called. The user object can be found in the `CurrentUser` property. | |||||
If you need to fetch the user again, the `GetGetCurrentUserAsync()` method can be used. | |||||
[!code-csharp[Get current user](samples/current_user.cs)] | |||||
> [!NOTE] | |||||
> Some properties might be `null` depending on which scopes users authorized your app with. | |||||
> For example: `email` scope is required to fetch current user's email address. | |||||
## Fetching current user's guilds | |||||
The `GetGuildSummariesAsync()` method is used to fetch current user's guilds. Since it returns an `IAsyncEnumerable` you need to call `FlattenAsync()` to get a plain `IEnumerable` containing [RestUserGuild] objects. | |||||
[!code-csharp[Get current user's guilds](samples/current_user_guilds.cs)] | |||||
> [!WARNING] | |||||
> This method requires `guilds` scope | |||||
## Fetching current user's guild member object | |||||
To fetch the current user's guild member object, the `GetCurrentUserGuildMemberAsync()` method can be used. | |||||
[!code-csharp[Get current user's guild member](samples/current_user_guild_member.cs)] | |||||
> [!WARNING] | |||||
> This method requires `guilds.members.read` scope | |||||
## Get user connections | |||||
The `GetConnectionsAsync` method can be used to fetch current user's connections to other platforms. | |||||
[!code-csharp[Get current user's connections](samples/current_user_connections.cs)] | |||||
> [!WARNING] | |||||
> This method requires `connections` scope | |||||
## Application role connection | |||||
In addition to previous features, Discord.Net supports fetching & updating user's application role connection metadata values. `GetUserApplicationRoleConnectionAsync()` returns a [RoleConnection] object of the current user for the given application id. | |||||
The `ModifyUserApplicationRoleConnectionAsync()` method is used to update current user's role connection metadata values. A new set of values can be created with [RoleConnectionProperties] object. | |||||
[!code-csharp[Get current user's connections](samples/app_role_connection.cs)] | |||||
> [!WARNING] | |||||
> This method requires `role_connections.write` scope | |||||
[DiscordRestClient]: xref:Discord.Rest.DiscordRestClient | |||||
[RestUserGuild]: xref:Discord.Rest.RestUserGuild | |||||
[RoleConnection]: xref:Discord.RoleConnection | |||||
[RoleConnectionProperties]: xref:Discord.RoleConnectionProperties |
@@ -0,0 +1,11 @@ | |||||
// fetch application role connection of the current user for the app with provided id. | |||||
var roleConnection = await client.GetUserApplicationRoleConnectionAsync(applicationid); | |||||
// create a new role connection metadata properties object & set some values. | |||||
var properties = new RoleConnectionProperties("Discord.Net Docs", "Cool Coding Guy") | |||||
.WithNumber("eaten_cookies", 69) | |||||
.WithBool("loves_cookies", true) | |||||
.WithDate("last_eaten_cookie", DateTimeOffset.UtcNow); | |||||
// update current user's values with the given properties. | |||||
await client.ModifyUserApplicationRoleConnectionAsync(applicationId, properties); |
@@ -0,0 +1,5 @@ | |||||
// gets the user object stored in the DiscordRestClient. | |||||
var user = client.CurrentUser; | |||||
// fetches the current user with a REST call & updates the CurrentUser property. | |||||
var refreshedUser = await client.GetCurrentUserAsync(); |
@@ -0,0 +1,2 @@ | |||||
// fetches the current user's connections. | |||||
var connections = await client.GetConnectionsAsync(); |
@@ -0,0 +1,6 @@ | |||||
// fetches the current user's guild member object in a guild with provided id. | |||||
var member = await client.GetCurrentUserGuildMemberAsync(guildId); | |||||
// fetches the current user's guild member object in a RestUserGuild. | |||||
var guild = await client.GetGuildSummariesAsync().FlattenAsync().First(); | |||||
var member = await guild.GetCurrentUserGuildMemberAsync(); |
@@ -0,0 +1,2 @@ | |||||
// fetches the guilds the current user participate in. | |||||
var guilds = await client.GetGuildSummariesAsync().FlattenAsync(); |
@@ -0,0 +1,5 @@ | |||||
using Discord; | |||||
using Discord.Rest; | |||||
await using var client = new DiscordRestClient(); | |||||
await client.LoginAsync(TokenType.Bearer, "bearer token obtained through oauth2 flow"); |
@@ -126,6 +126,8 @@ | |||||
topicUid: Guides.OtherLibs.MediatR | topicUid: Guides.OtherLibs.MediatR | ||||
- name: Emoji | - name: Emoji | ||||
topicUid: Guides.Emoji | topicUid: Guides.Emoji | ||||
- name: Bearer Tokens | |||||
topicUid: Guides.BearerToken | |||||
- name: Voice | - name: Voice | ||||
topicUid: Guides.Voice.SendingVoice | topicUid: Guides.Voice.SendingVoice | ||||
- name: Deployment | - name: Deployment | ||||
@@ -18,5 +18,13 @@ namespace Discord | |||||
/// Returns the current user's permissions for this guild. | /// Returns the current user's permissions for this guild. | ||||
/// </summary> | /// </summary> | ||||
GuildPermissions Permissions { get; } | GuildPermissions Permissions { get; } | ||||
/// <summary> | |||||
/// Gets the features for this guild. | |||||
/// </summary> | |||||
/// <returns> | |||||
/// A flags enum containing all the features for the guild. | |||||
/// </returns> | |||||
GuildFeatures Features { get; } | |||||
} | } | ||||
} | } |
@@ -14,5 +14,7 @@ namespace Discord.API | |||||
public bool Owner { get; set; } | public bool Owner { get; set; } | ||||
[JsonProperty("permissions"), Int53] | [JsonProperty("permissions"), Int53] | ||||
public string Permissions { get; set; } | public string Permissions { get; set; } | ||||
[JsonProperty("features")] | |||||
public GuildFeatures Features { get; set; } | |||||
} | } | ||||
} | } |
@@ -1,4 +1,3 @@ | |||||
using Discord.API.Rest; | using Discord.API.Rest; | ||||
using Discord.Net; | using Discord.Net; | ||||
using Discord.Net.Converters; | using Discord.Net.Converters; | ||||
@@ -2204,6 +2203,14 @@ namespace Discord.API | |||||
return await SendJsonAsync<Channel>("POST", () => "users/@me/channels", args, new BucketIds(), options: options).ConfigureAwait(false); | return await SendJsonAsync<Channel>("POST", () => "users/@me/channels", args, new BucketIds(), options: options).ConfigureAwait(false); | ||||
} | } | ||||
public async Task<GuildMember> GetCurrentUserGuildMember(ulong guildId, RequestOptions options = null) | |||||
{ | |||||
options = RequestOptions.CreateOrClone(options); | |||||
var ids = new BucketIds(); | |||||
return await SendAsync<GuildMember>("GET", () => $"users/@me/guilds/{guildId}/member", ids, options: options).ConfigureAwait(false); | |||||
} | |||||
#endregion | #endregion | ||||
#region Voice Regions | #region Voice Regions | ||||
@@ -152,6 +152,19 @@ namespace Discord.Rest | |||||
#endregion | #endregion | ||||
public async Task<RestSelfUser> GetCurrentUserAsync(RequestOptions options = null) | |||||
{ | |||||
var user = await ApiClient.GetMyUserAsync(options); | |||||
CurrentUser.Update(user); | |||||
return CurrentUser; | |||||
} | |||||
public async Task<RestGuildUser> GetCurrentUserGuildMemberAsync(ulong guildId, RequestOptions options = null) | |||||
{ | |||||
var user = await ApiClient.GetCurrentUserGuildMember(guildId, options); | |||||
return RestGuildUser.Create(this, null, user, guildId); | |||||
} | |||||
public async Task<RestApplication> GetApplicationInfoAsync(RequestOptions options = null) | public async Task<RestApplication> GetApplicationInfoAsync(RequestOptions options = null) | ||||
{ | { | ||||
return _applicationInfo ??= await ClientHelper.GetApplicationInfoAsync(this, options).ConfigureAwait(false); | return _applicationInfo ??= await ClientHelper.GetApplicationInfoAsync(this, options).ConfigureAwait(false); | ||||
@@ -21,6 +21,8 @@ namespace Discord.Rest | |||||
public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | ||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public string IconUrl => CDN.GetGuildIconUrl(Id, _iconId); | public string IconUrl => CDN.GetGuildIconUrl(Id, _iconId); | ||||
/// <inheritdoc /> | |||||
public GuildFeatures Features { get; private set; } | |||||
internal RestUserGuild(BaseDiscordClient discord, ulong id) | internal RestUserGuild(BaseDiscordClient discord, ulong id) | ||||
: base(discord, id) | : base(discord, id) | ||||
@@ -39,12 +41,20 @@ namespace Discord.Rest | |||||
IsOwner = model.Owner; | IsOwner = model.Owner; | ||||
Name = model.Name; | Name = model.Name; | ||||
Permissions = new GuildPermissions(model.Permissions); | Permissions = new GuildPermissions(model.Permissions); | ||||
Features = model.Features; | |||||
} | } | ||||
public async Task LeaveAsync(RequestOptions options = null) | public async Task LeaveAsync(RequestOptions options = null) | ||||
{ | { | ||||
await Discord.ApiClient.LeaveGuildAsync(Id, options).ConfigureAwait(false); | await Discord.ApiClient.LeaveGuildAsync(Id, options).ConfigureAwait(false); | ||||
} | } | ||||
public async Task<RestGuildUser> GetCurrentUserGuildMemberAsync(RequestOptions options = null) | |||||
{ | |||||
var user = await Discord.ApiClient.GetCurrentUserGuildMember(Id, options); | |||||
return RestGuildUser.Create(Discord, null, user, Id); | |||||
} | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public async Task DeleteAsync(RequestOptions options = null) | public async Task DeleteAsync(RequestOptions options = null) | ||||
{ | { | ||||