@@ -1,3 +1,4 @@ | |||||
using System; | |||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
namespace Discord; | namespace Discord; | ||||
@@ -18,14 +19,25 @@ public class RoleConnection | |||||
public string PlatformUsername { get; } | public string PlatformUsername { get; } | ||||
/// <summary> | /// <summary> | ||||
/// | |||||
/// Gets the object mapping <see cref="RoleConnectionMetadata"/> keys to their string-ified values. | |||||
/// </summary> | /// </summary> | ||||
public IReadOnlyDictionary<string, object> Metadata { get; } | |||||
public IReadOnlyDictionary<string, string> Metadata { get; } | |||||
internal RoleConnection(string platformName, string platformUsername, IReadOnlyDictionary<string, object> metadata) | |||||
internal RoleConnection(string platformName, string platformUsername, IReadOnlyDictionary<string, string> metadata) | |||||
{ | { | ||||
PlatformName = platformName; | PlatformName = platformName; | ||||
PlatformUsername = platformUsername; | PlatformUsername = platformUsername; | ||||
Metadata = metadata; | Metadata = metadata; | ||||
} | } | ||||
/// <summary> | |||||
/// Initializes a new <see cref="RoleConnectionProperties"/> with the data from this object. | |||||
/// </summary> | |||||
public RoleConnectionProperties ToRoleConnectionProperties() | |||||
=> new() | |||||
{ | |||||
PlatformName = PlatformName, | |||||
PlatformUsername = PlatformUsername, | |||||
Metadata = Metadata.ToDictionary() | |||||
}; | |||||
} | } |
@@ -120,5 +120,19 @@ public class RoleConnectionMetadataProperties | |||||
/// Initializes a new instance of <see cref="RoleConnectionMetadataProperties"/>. | /// Initializes a new instance of <see cref="RoleConnectionMetadataProperties"/>. | ||||
/// </summary> | /// </summary> | ||||
public RoleConnectionMetadataProperties() { } | public RoleConnectionMetadataProperties() { } | ||||
/// <summary> | |||||
/// Initializes a new <see cref="RoleConnectionMetadataProperties"/> with the data from provided <see cref="RoleConnectionMetadata"/>. | |||||
/// </summary> | |||||
public static RoleConnectionMetadataProperties FromRoleConnectionMetadata(RoleConnectionMetadata metadata) | |||||
=> new() | |||||
{ | |||||
Name = metadata.Name, | |||||
Description = metadata.Description, | |||||
Type = metadata.Type, | |||||
Key = metadata.Key, | |||||
NameLocalizations = metadata.NameLocalizations, | |||||
DescriptionLocalizations = metadata.DescriptionLocalizations | |||||
}; | |||||
} | } | ||||
@@ -0,0 +1,141 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
namespace Discord; | |||||
/// <summary> | |||||
/// Represents the properties used to modify user's <see cref="RoleConnection"/>. | |||||
/// </summary> | |||||
public class RoleConnectionProperties | |||||
{ | |||||
private const int MaxPlatformNameLength = 50; | |||||
private const int MaxPlatformUsernameLength = 100; | |||||
private const int MaxMetadataRecords = 100; | |||||
private string _platformName; | |||||
private string _platformUsername; | |||||
private Dictionary<string, string> _metadata; | |||||
/// <summary> | |||||
/// Gets or sets the vanity name of the platform a bot has connected. Max 50 characters. | |||||
/// </summary> | |||||
public string PlatformName | |||||
{ | |||||
get => _platformName; | |||||
set | |||||
{ | |||||
if (value is not null) | |||||
Preconditions.AtMost(value.Length, MaxPlatformNameLength, nameof(PlatformName), $"Platform name length must be less or equal to {MaxPlatformNameLength}"); | |||||
_platformName = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Gets or sets the username on the platform a bot has connected. Max 100 characters. | |||||
/// </summary> | |||||
public string PlatformUsername | |||||
{ | |||||
get => _platformUsername; | |||||
set | |||||
{ | |||||
if(value is not null) | |||||
Preconditions.AtMost(value.Length, MaxPlatformUsernameLength, nameof(PlatformUsername), $"Platform username length must be less or equal to {MaxPlatformUsernameLength}"); | |||||
_platformUsername = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Gets or sets object mapping <see cref="RoleConnectionMetadata"/> keys to their string-ified values. | |||||
/// </summary> | |||||
public Dictionary<string, string> Metadata | |||||
{ | |||||
get => _metadata; | |||||
set | |||||
{ | |||||
if (value is not null) | |||||
Preconditions.AtMost(value.Count, MaxPlatformUsernameLength, nameof(Metadata), $"Metadata records count must be less or equal to {MaxMetadataRecords}"); | |||||
_metadata = value; | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithDate(string key, DateTimeOffset value) | |||||
=> AddMetadataRecord(key, value.ToString("O")); | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithBool(string key, bool value) | |||||
=> AddMetadataRecord(key, value ? "1" : "0"); | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithNumber(string key, int value) | |||||
=> AddMetadataRecord(key, value.ToString()); | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithNumber(string key, uint value) | |||||
=> AddMetadataRecord(key, value.ToString()); | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithNumber(string key, long value) | |||||
=> AddMetadataRecord(key, value.ToString()); | |||||
/// <summary> | |||||
/// Adds a metadata record with the provided key and value. | |||||
/// </summary> | |||||
/// <returns>The current <see cref="RoleConnectionProperties"/>.</returns> | |||||
public RoleConnectionProperties WithNumber(string key, ulong value) | |||||
=> AddMetadataRecord(key, value.ToString()); | |||||
internal RoleConnectionProperties AddMetadataRecord(string key, string value) | |||||
{ | |||||
Metadata ??= new Dictionary<string, string>(); | |||||
if(!Metadata.ContainsKey(key)) | |||||
Preconditions.AtMost(Metadata.Count + 1, MaxPlatformUsernameLength, nameof(Metadata), $"Metadata records count must be less or equal to {MaxMetadataRecords}"); | |||||
_metadata[key] = value; | |||||
return this; | |||||
} | |||||
/// <summary> | |||||
/// Initializes a new instance of <see cref="RoleConnectionProperties"/>. | |||||
/// </summary> | |||||
/// <param name="platformName">The name of the platform a bot has connected.</param>s | |||||
/// <param name="platformUsername">Gets the username on the platform a bot has connected.</param> | |||||
/// <param name="metadata">Object mapping <see cref="RoleConnectionMetadata"/> keys to their values.</param> | |||||
public RoleConnectionProperties(string platformName, string platformUsername, IDictionary<string, string> metadata = null) | |||||
{ | |||||
PlatformName = platformName; | |||||
PlatformUsername = platformUsername; | |||||
Metadata = metadata.ToDictionary(); | |||||
} | |||||
/// <summary> | |||||
/// Initializes a new instance of <see cref="RoleConnectionProperties"/>. | |||||
/// </summary> | |||||
public RoleConnectionProperties() {} | |||||
/// <summary> | |||||
/// Initializes a new <see cref="RoleConnectionProperties"/> with the data from provided <see cref="RoleConnection"/>. | |||||
/// </summary> | |||||
public static RoleConnectionProperties FromRoleConnection(RoleConnection roleConnection) | |||||
=> new() | |||||
{ | |||||
PlatformName = roleConnection.PlatformName, | |||||
PlatformUsername = roleConnection.PlatformUsername, | |||||
Metadata = roleConnection.Metadata.ToDictionary() | |||||
}; | |||||
} |
@@ -265,7 +265,7 @@ namespace Discord.Rest | |||||
=> client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); | => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); | ||||
#endregion | #endregion | ||||
#region Role Subscription Metadata | |||||
#region Role Connection Metadata | |||||
public static async Task<IReadOnlyCollection<RoleConnectionMetadata>> GetRoleConnectionMetadataRecordsAsync(BaseDiscordClient client, RequestOptions options = null) | public static async Task<IReadOnlyCollection<RoleConnectionMetadata>> GetRoleConnectionMetadataRecordsAsync(BaseDiscordClient client, RequestOptions options = null) | ||||
=> (await client.ApiClient.GetApplicationRoleConnectionMetadataRecordsAsync(options)) | => (await client.ApiClient.GetApplicationRoleConnectionMetadataRecordsAsync(options)) | ||||
@@ -308,6 +308,33 @@ namespace Discord.Rest | |||||
: null)) | : null)) | ||||
.ToImmutableArray(); | .ToImmutableArray(); | ||||
public static async Task<RoleConnection> GetUserRoleConnectionAsync(ulong applicationId, BaseDiscordClient client, RequestOptions options = null) | |||||
{ | |||||
var roleConnection = await client.ApiClient.GetUserApplicationRoleConnectionAsync(applicationId, options); | |||||
return new RoleConnection(roleConnection.PlatformName.GetValueOrDefault(null), | |||||
roleConnection.PlatformUsername.GetValueOrDefault(null), | |||||
roleConnection.Metadata.GetValueOrDefault()); | |||||
} | |||||
public static async Task<RoleConnection> ModifyUserRoleConnectionAsync(ulong applicationId, RoleConnectionProperties roleConnection, BaseDiscordClient client, RequestOptions options = null) | |||||
{ | |||||
var updatedConnection = await client.ApiClient.ModifyUserApplicationRoleConnectionAsync(applicationId, | |||||
new API.RoleConnection | |||||
{ | |||||
PlatformName = roleConnection.PlatformName, | |||||
PlatformUsername = roleConnection.PlatformUsername, | |||||
Metadata = roleConnection.Metadata | |||||
}, options); | |||||
return new RoleConnection( | |||||
updatedConnection.PlatformName.GetValueOrDefault(null), | |||||
updatedConnection.PlatformUsername.GetValueOrDefault(null), | |||||
updatedConnection.Metadata.GetValueOrDefault()?.ToImmutableDictionary() | |||||
); | |||||
} | |||||
#endregion | #endregion | ||||
} | } | ||||
} | } |
@@ -2488,11 +2488,11 @@ namespace Discord.API | |||||
public async Task<RoleConnectionMetadata[]> UpdateApplicationRoleConnectionMetadataRecordsAsync(RoleConnectionMetadata[] roleConnections, RequestOptions options = null) | public async Task<RoleConnectionMetadata[]> UpdateApplicationRoleConnectionMetadataRecordsAsync(RoleConnectionMetadata[] roleConnections, RequestOptions options = null) | ||||
=> await SendJsonAsync <RoleConnectionMetadata[]>("PUT", () => $"applications/{CurrentApplicationId}/role-connections/metadata", roleConnections, new BucketIds(), options: options).ConfigureAwait(false); | => await SendJsonAsync <RoleConnectionMetadata[]>("PUT", () => $"applications/{CurrentApplicationId}/role-connections/metadata", roleConnections, new BucketIds(), options: options).ConfigureAwait(false); | ||||
public async Task<RoleConnection> GetUserApplicationRoleConnection(RequestOptions options = null) | |||||
=> await SendAsync<RoleConnection>("GET", () => $"users/@me/applications/{CurrentApplicationId}/role-connection", new BucketIds(), options: options); | |||||
public async Task<RoleConnection> GetUserApplicationRoleConnectionAsync(ulong applicationId, RequestOptions options = null) | |||||
=> await SendAsync<RoleConnection>("GET", () => $"users/@me/applications/{applicationId}/role-connection", new BucketIds(), options: options); | |||||
public async Task<RoleConnection> GetUserApplicationRoleConnection(RoleConnection connection, RequestOptions options = null) | |||||
=> await SendJsonAsync<RoleConnection>("PUT", () => $"users/@me/applications/{CurrentApplicationId}/role-connection", connection, new BucketIds(), options: options); | |||||
public async Task<RoleConnection> ModifyUserApplicationRoleConnectionAsync(ulong applicationId, RoleConnection connection, RequestOptions options = null) | |||||
=> await SendJsonAsync<RoleConnection>("PUT", () => $"users/@me/applications/{applicationId}/role-connection", connection, new BucketIds(), options: options); | |||||
#endregion | #endregion | ||||
} | } | ||||
@@ -241,6 +241,12 @@ namespace Discord.Rest | |||||
return ClientHelper.ModifyRoleConnectionMetadataRecordsAsync(metadata, this, options); | return ClientHelper.ModifyRoleConnectionMetadataRecordsAsync(metadata, this, options); | ||||
} | } | ||||
public Task<RoleConnection> GetUserApplicationRoleConnectionAsync(ulong applicationId, RequestOptions options = null) | |||||
=> ClientHelper.GetUserRoleConnectionAsync(applicationId, this, options); | |||||
public Task<RoleConnection> ModifyUserApplicationRoleConnectionAsync(ulong applicationId, RoleConnectionProperties roleConnection, RequestOptions options = null) | |||||
=> ClientHelper.ModifyUserRoleConnectionAsync(applicationId, roleConnection, this, options); | |||||
#endregion | #endregion | ||||
#region IDiscordClient | #region IDiscordClient | ||||