Browse Source

Closes #84

pull/1923/head
quin lynch 4 years ago
parent
commit
284ec0de0e
4 changed files with 155 additions and 0 deletions
  1. +45
    -0
      src/Discord.Net.Core/Entities/Channels/IStageChannel.cs
  2. +12
    -0
      src/Discord.Net.Rest/DiscordRestApiClient.cs
  3. +46
    -0
      src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs
  4. +52
    -0
      src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs

+ 45
- 0
src/Discord.Net.Core/Entities/Channels/IStageChannel.cs View File

@@ -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);
}
}

+ 12
- 0
src/Discord.Net.Rest/DiscordRestApiClient.cs View File

@@ -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)
{


+ 46
- 0
src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs View File

@@ -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);
}
}
}

+ 52
- 0
src/Discord.Net.WebSocket/Entities/Channels/SocketStageChannel.cs View File

@@ -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);
}
}
}

Loading…
Cancel
Save