所以我在不久前创建了一个机器人,这个机器人只是在文本通道中执行命令。因此,如果我写"!clear this“,我可以删除服务器上文本通道中的所有消息。与文本聊天的连接和一切工作正常。我设计了一个小的表单应用程序,这样我现在就可以看到一个简单的控制台,只需按一下按钮就可以连接到我的服务器。现在我想让我的机器人进入语音聊天。我查看了整个互联网,发现只需使用SocketVoiceChannel即可连接
SocketVoiceChannel channel;
channel.ConnectAsync();现在我不知道该怎么处理这个频道。我查看了这个类和它的基类的定义,但没有找到一个构造函数。较早的文档建议使用DiscordClient.FindServers("name", type),但使用DiscordSocketClient时并不存在这种方法。
到目前为止,我得到的是:
public void ConnectVoiceAsync()
{
SocketVoiceChannel _voiceChannel = new SocketVoiceChannel();
var connection = await _voiceChannel.ConnectAsync();
}当按下按钮时,调用ConnectVoiceAsync()。有了我的UI,一切都很好。我可以连接到服务器并写入/应答消息。只有音频连接无法正常工作。问题是,我如何设置SocketVoiceChannel?我知道频道的名称和频道的Id。
发布于 2020-06-14 19:44:25
@Anu6is提示是正确的方法。事实上,GetVoiceChannel()方法做得很好。我发布了我知道的代码,以帮助任何有同样问题的人!
private DiscordSocketClient _client;
private CommandHandler _handler;
private SocketGuild _guild;
private SocketVoiceChannel _voiceChannel;这些是不和谐机器人的关键组件。_guild和_voiceChannel在按下按钮所调用的方法中初始化。commandHandler是我自己的类,并不是由discord.Net提供的,但无论如何都不是连接到语音通道所必需的(在我的例子中,如果你想通过一个不协调的命令连接,比如"! connect“,它就是!)。连接/断开连接的方法如下:
public async Task ConnectVoiceAsync()
{
_guild = _client.GetGuild(xyz);
_voiceChannel = _guild.GetVoiceChannel(xyz);
var connection = await _voiceChannel.ConnectAsync();
debugger.AddLogLine(0, "\n...\nConnection succeeded");
}
public async Task ConnectVoiceAsync(ulong guildId, ulong channelId)
{
try
{
_guild = _client.GetGuild(guildId);
_voiceChannel = _guild.GetVoiceChannel(channelId);
var connection = await _voiceChannel.ConnectAsync();
debugger.AddLogLine(0, "\r\n...\r\n>>>Connection succeeded");
}catch(Exception e)
{
debugger.AddLogLine(1, e.ToString());
}
}
public async Task DisconnectVoiceAsync()
{
try
{
if(_voiceChannel != null)
{
await _voiceChannel.DisconnectAsync();
debugger.AddLogLine(0, "Bot Disconnected");
}
else
{
debugger.AddLogLine(1, "No Connection established!");
}
}
catch(Exception e)
{
debugger.AddLogLine(1, e.ToString());
}
}我有两个版本的connect方法,因为通过选中表单中的复选框,可以连接到预设的语音通道。如果您不希望通过交互式UI传递行会和服务器in,您可以简单地在ypur programm中“硬编码”这些in并使用第一种方法。如果希望用户能够灵活地连接到不同的服务器,可以使用带有两个参数的重载方法。如果您像我一样执行此操作,则在调用async方法时必须小心。下面是我在窗体后面的代码中拥有的方法!
private async void button4_Click(object sender, EventArgs e)
{
if (channel)
{
debugger.AddLogLine(0, "Awaiting Connection to VoiceChannel (Pos Kanal)!");
await connectionManager.ConnectVoiceAsync();
}
else if(!channel && textBoxChanneld.Text == string.Empty && TextBoxGuildId.Text == string.Empty)
{
panelAdvancedConnect.Size = defaultSizeAdvanced;
} else
{
ulong id1 = Convert.ToUInt64(TextBoxGuildId.Text);
ulong id2 = Convert.ToUInt64(textBoxChanneld.Text);
debugger.AddLogLine(0, "Trying to connect to ''" + id1.ToString() + " " + id2.ToString());
await connectionManager.ConnectVoiceAsync(id1, id2);
}
}这里的关键是,使用async void声明按钮方法。使用async Task会导致许多错误。调试器是一个自己的类,它向应用程序添加一个小的控制台窗口。

不同的面板,如“连接到语音聊天”和文本框的ID“弹出”在飞行中,以保持设计苗条。
https://stackoverflow.com/questions/62360013
复制相似问题