@@ -70,6 +70,51 @@ namespace Discord | |||
/// </returns> | |||
Task StopStageAsync(RequestOptions options = null); | |||
/// <summary> | |||
/// Indicates that the bot would like to speak within a stage channel. | |||
/// </summary> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// A task that represents the asynchronous request to speak operation. | |||
/// </returns> | |||
Task RequestToSpeak(RequestOptions options = null); | |||
/// <summary> | |||
/// Makes the current user become a speaker within a stage. | |||
/// </summary> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// A task that represents the asynchronous speaker modify operation. | |||
/// </returns> | |||
Task BecomeSpeakerAsync(RequestOptions options = null); | |||
/// <summary> | |||
/// Makes the current user a listener. | |||
/// </summary> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// A task that represents the asynchronous stop operation. | |||
/// </returns> | |||
Task StopSpeakingAsync(RequestOptions options = null); | |||
/// <summary> | |||
/// Makes a user a speaker within a stage. | |||
/// </summary> | |||
/// <param name="user">The user to make the speaker.</param> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// A task that represents the asynchronous move operation. | |||
/// </returns> | |||
Task MoveToSpeaker(IGuildUser user, RequestOptions options = null); | |||
/// <summary> | |||
/// Removes a user from speaking. | |||
/// </summary> | |||
/// <param name="user">The user to remove from speaking.</param> | |||
/// <param name="options">The options to be used when sending the request.</param> | |||
/// <returns> | |||
/// A task that represents the asynchronous remove operation. | |||
/// </returns> | |||
Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null); | |||
} | |||
} |
@@ -646,6 +646,18 @@ namespace Discord.API | |||
await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/@me", args, bucket, options: options).ConfigureAwait(false); | |||
} | |||
public async Task ModifyUserVoiceState(ulong guildId, ulong userId, ModifyVoiceStateParams args, RequestOptions options = null) | |||
{ | |||
Preconditions.NotEqual(guildId, 0, nameof(guildId)); | |||
Preconditions.NotEqual(userId, 0, nameof(userId)); | |||
options = RequestOptions.CreateOrClone(options); | |||
var bucket = new BucketIds(); | |||
await SendJsonAsync("PATCH", () => $"guilds/{guildId}/voice-states/{userId}", args, bucket, options: options).ConfigureAwait(false); | |||
} | |||
// roles | |||
public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) | |||
{ | |||
@@ -105,5 +105,51 @@ namespace Discord.Rest | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task BecomeSpeakerAsync(RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = false | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task StopSpeakingAsync(RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = true | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = false | |||
}; | |||
return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); | |||
} | |||
/// <inheritdoc/> | |||
public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = true | |||
}; | |||
return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); | |||
} | |||
} | |||
} |
@@ -27,6 +27,12 @@ namespace Discord.WebSocket | |||
/// <inheritdoc/> | |||
public bool Live { get; private set; } = false; | |||
/// <summary> | |||
/// Returns <see langword="true"/> if the current user is a speaker within the stage, otherwise <see langword="false"/>. | |||
/// </summary> | |||
public bool IsSpeaker | |||
=> !Guild.CurrentUser.IsSuppressed; | |||
/// <summary> | |||
/// Gets a collection of users who are speakers within the stage. | |||
/// </summary> | |||
@@ -112,5 +118,51 @@ namespace Discord.WebSocket | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task BecomeSpeakerAsync(RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = false | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task StopSpeakingAsync(RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = true | |||
}; | |||
return Discord.ApiClient.ModifyMyVoiceState(this.Guild.Id, args, options); | |||
} | |||
/// <inheritdoc/> | |||
public Task MoveToSpeaker(IGuildUser user, RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = false | |||
}; | |||
return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); | |||
} | |||
/// <inheritdoc/> | |||
public Task RemoveFromSpeaker(IGuildUser user, RequestOptions options = null) | |||
{ | |||
var args = new API.Rest.ModifyVoiceStateParams() | |||
{ | |||
ChannelId = this.Id, | |||
Suppressed = true | |||
}; | |||
return Discord.ApiClient.ModifyUserVoiceState(this.Guild.Id, user.Id, args); | |||
} | |||
} | |||
} |