* Improve the Command Service documentation
The following changes have been added to this PR:
• Fix minor grammatical errors.
• Capitalize terms such as Commands, Modules and such, as the context is specific to the lib.
• Wrap methods and properties in code blocks.
The docs page currently has several issues that remains to be fixed.
1.
```md
>[!WARNING]
>This article is out of date and has not been rewritten yet.
Information is not guaranteed to be accurate.
```
The docs doesn't necessarily seem "out of date" as the warning claims. The basics seem pretty relevant to the latest version of the lib.
2.
>“To manually load a module, invoke [CommandService.AddModuleAsync], by passing in the generic type of your module and optionally, a dependency map.”
The latter part of the sentence seems off. Where should the user pass the dependency map to? It seems to suggest that `AddModuleAsync` has an argument to pass the dependency to. If it is referring to `AddModuleAsync(Type type)`, then I feel like it should be clarified here - or perhaps change the wording of the sentence.
3.
>“First, you need to create an @System.IServiceProvider You may create your own IServiceProvider if you wish.”
Any mention of @System.IServiceProvider is currently broken on the docs.
4.
>“Submodules are Modules that reside within another one. Typically, submodules are used to create nested groups (although not required to create nested groups).”
Clarification on the part after "although?"
5.
>“Finally, pass the map into the LoadAssembly method. Your modules will automatically be loaded with this dependency map.”
Where is this `LoadAssembly` method?
6.
```md
>[!NOTE]
>Preconditions can be applied to Modules, Groups, or Commands.
```
The docs should mention `ParameterPreconditionAttribute`'s existence.
* Update line breaks to comply with docs standard
* Change "you should..." to "instead, ..."
* Trim trailing spaces
* Change "inherits" to "inherit"
* Fix Context warning note and add ReplyAsync xref
* Fix broken xrefs
* Fix [Command Service] xref
* Fix consistency between TypeReaders and Preconditions returns
* Add missing semi-colons in ServiceProvider sample
* Change CommandContext to SocketCommandContext & change variable naming
* Cleanup TypeReader section
* Wrap [DontInject] in code block
* Fix commands docs linking in intro
* Improve Getting Started - Installation
- Fix character misalignment to comply with docs standard.
- Fix image numbering issues by moving the tooltips above some of the steps.
- Add codeblocks to search terms like `Discord.Net`.
- Remove broken `addons` reference.
- Specify `.NET 4.6.1` as `.NET Framework 4.6.1`.
- Minor cross-reference cleanup.
* Fix Getting Started - Intro
- Minor grammartical fixes.
- Wrap mentions of the methods, properties, and events in code block.
- Replace `Discord.Net` to `Discord.NET`.
- Fix steps numbering under `Creating a Discord Bot` and `Adding your bot to a server`.
- Change `Task-based Asynchronous Pattern ([TAP])` linking to mark the entire term instead.
- Change code block of `Pong!` to quotation mark instead.
* Fix cross references in Sending Voice
* Mention parameter precondition attribute
* Change `Discord.NET` to `Discord.Net` for consistency
* Wrap project names in code blocks & minor fixes in Terminology
* Change `add-ons` to `addons` for consistency
* Fix cross references in Logging
* Fix minor grammatical issues in "Working with Events"
* Missed a tilda
* Remove out-of-date warning in Commands
* Minor grammatical fixes for Entities
* Fix broken xref in Logging
* Adjust service collection sample
...according to f89aecb7bf (r141530227)
* Update Command Handler sample
- Update Main for C# 7.1.
- Inject CommandService and DiscordSocketClient into the service collection.
- Add Async suffix to asynchronous methods.
* Minor grammatical fixes in Events
* Revert 2 incorrect grammar corrections
* Revert async Main sample
* Add hardcode token notice in sample
* Fix missing method for Command Handler
* Modify module samples to use SocketCommandContext instead
* Emphasize CommandContext and SocketCommandContext
* Fix formatting for module sample
* Add SocketCommandContext for Groups sample
* Remove comma
* Fix DepMap sample formatting
* Replace [DontInject] with DontInjectAttribute with cross reference
* Remove connection logic note
There is no reason that this note should still be here since Ready event exists.
* Add a new warning message informing the users the existence of CommandService
* Make command handler private
excellent change
101 lines
3.8 KiB
Markdown
101 lines
3.8 KiB
Markdown
---
|
|
title: Sending Voice
|
|
---
|
|
|
|
**Information on this page is subject to change!**
|
|
|
|
>[!WARNING]
|
|
>This article is out of date, and has not been rewritten yet.
|
|
Information is not guaranteed to be accurate.
|
|
|
|
## Installing
|
|
|
|
Audio requires two native libraries, `libsodium` and `opus`.
|
|
Both of these libraries must be placed in the runtime directory of your
|
|
bot. (When developing on .NET Framework, this would be `bin/debug`,
|
|
when developing on .NET Core, this is where you execute `dotnet run`
|
|
from; typically the same directory as your csproj).
|
|
|
|
For Windows Users, precompiled binaries are available for your
|
|
convienence [here](https://discord.foxbot.me/binaries/).
|
|
|
|
For Linux Users, you will need to compile [Sodium] and [Opus] from
|
|
source, or install them from your package manager.
|
|
|
|
[Sodium]: https://download.libsodium.org/libsodium/releases/
|
|
[Opus]: http://downloads.xiph.org/releases/opus/
|
|
|
|
## Joining a Channel
|
|
|
|
Joining a channel is the first step to sending audio, and will return
|
|
an [IAudioClient] to send data with.
|
|
|
|
To join a channel, simply await [ConnectAsync] on any instance of an
|
|
@Discord.IAudioChannel.
|
|
|
|
[!code-csharp[Joining a Channel](samples/joining_audio.cs)]
|
|
|
|
The client will sustain a connection to this channel until it is
|
|
kicked, disconnected from Discord, or told to disconnect.
|
|
|
|
It should be noted that voice connections are created on a per-guild
|
|
basis; only one audio connection may be open by the bot in a single
|
|
guild. To switch channels within a guild, invoke [ConnectAsync] on
|
|
another voice channel in the guild.
|
|
|
|
[IAudioClient]: xref:Discord.Audio.IAudioClient
|
|
[ConnectAsync]: xref:Discord.IAudioChannel#Discord_IAudioChannel_ConnectAsync_Action_IAudioClient__
|
|
|
|
## Transmitting Audio
|
|
|
|
### With FFmpeg
|
|
|
|
[FFmpeg] is an open source, highly versatile AV-muxing tool. This is
|
|
the recommended method of transmitting audio.
|
|
|
|
Before you begin, you will need to have a version of FFmpeg downloaded
|
|
and placed somewhere in your PATH (or alongside the bot, in the same
|
|
location as libsodium and opus). Windows binaries are available on
|
|
[FFmpeg's download page].
|
|
|
|
[FFmpeg]: https://ffmpeg.org/
|
|
[FFmpeg's download page]: https://ffmpeg.org/download.html
|
|
|
|
First, you will need to create a Process that starts FFmpeg. An
|
|
example of how to do this is included below, though it is important
|
|
that you return PCM at 48000hz.
|
|
|
|
>[!NOTE]
|
|
>As of the time of this writing, Discord.Audio struggles significantly
|
|
>with processing audio that is already opus-encoded; you will need to
|
|
>use the PCM write streams.
|
|
|
|
[!code-csharp[Creating FFmpeg](samples/audio_create_ffmpeg.cs)]
|
|
|
|
Next, to transmit audio from FFmpeg to Discord, you will need to
|
|
pull an [AudioOutStream] from your [IAudioClient]. Since we're using
|
|
PCM audio, use [IAudioClient.CreatePCMStream].
|
|
|
|
The sample rate argument doesn't particularly matter, so long as it is
|
|
a valid rate (120, 240, 480, 960, 1920, or 2880). For the sake of
|
|
simplicity, I recommend using 1920.
|
|
|
|
Channels should be left at `2`, unless you specified a different value
|
|
for `-ac 2` when creating FFmpeg.
|
|
|
|
[AudioOutStream]: xref:Discord.Audio.AudioOutStream
|
|
[IAudioClient.CreatePCMStream]: xref:Discord.Audio.IAudioClient#Discord_Audio_IAudioClient_CreateDirectPCMStream_Discord_Audio_AudioApplication_System_Nullable_System_Int32__System_Int32_
|
|
|
|
Finally, audio will need to be piped from FFmpeg's stdout into your
|
|
AudioOutStream. This step can be as complex as you'd like it to be, but
|
|
for the majority of cases, you can just use [Stream.CopyToAsync], as
|
|
shown below.
|
|
|
|
[Stream.CopyToAsync]: https://msdn.microsoft.com/en-us/library/hh159084(v=vs.110).aspx
|
|
|
|
If you are implementing a queue for sending songs, it's likely that
|
|
you will want to wait for audio to stop playing before continuing on
|
|
to the next song. You can await `AudioOutStream.FlushAsync` to wait for
|
|
the audio client's internal buffer to clear out.
|
|
|
|
[!code-csharp[Sending Audio](samples/audio_ffmpeg.cs)] |