首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接到SocketVoiceChannel (discord.NET)

连接到SocketVoiceChannel (discord.NET)
EN

Stack Overflow用户
提问于 2020-06-13 20:51:41
回答 1查看 926关注 0票数 0

所以我在不久前创建了一个机器人,这个机器人只是在文本通道中执行命令。因此,如果我写"!clear this“,我可以删除服务器上文本通道中的所有消息。与文本聊天的连接和一切工作正常。我设计了一个小的表单应用程序,这样我现在就可以看到一个简单的控制台,只需按一下按钮就可以连接到我的服务器。现在我想让我的机器人进入语音聊天。我查看了整个互联网,发现只需使用SocketVoiceChannel即可连接

代码语言:javascript
复制
SocketVoiceChannel channel;
channel.ConnectAsync();

现在我不知道该怎么处理这个频道。我查看了这个类和它的基类的定义,但没有找到一个构造函数。较早的文档建议使用DiscordClient.FindServers("name", type),但使用DiscordSocketClient时并不存在这种方法。

到目前为止,我得到的是:

代码语言:javascript
复制
public void ConnectVoiceAsync()
{
    SocketVoiceChannel _voiceChannel = new SocketVoiceChannel();
    var connection = await _voiceChannel.ConnectAsync();
}

当按下按钮时,调用ConnectVoiceAsync()。有了我的UI,一切都很好。我可以连接到服务器并写入/应答消息。只有音频连接无法正常工作。问题是,我如何设置SocketVoiceChannel?我知道频道的名称和频道的Id。

EN

回答 1

Stack Overflow用户

发布于 2020-06-14 19:44:25

@Anu6is提示是正确的方法。事实上,GetVoiceChannel()方法做得很好。我发布了我知道的代码,以帮助任何有同样问题的人!

代码语言:javascript
复制
private DiscordSocketClient _client;
private CommandHandler _handler;
private SocketGuild _guild;
private SocketVoiceChannel _voiceChannel;

这些是不和谐机器人的关键组件。_guild_voiceChannel在按下按钮所调用的方法中初始化。commandHandler是我自己的类,并不是由discord.Net提供的,但无论如何都不是连接到语音通道所必需的(在我的例子中,如果你想通过一个不协调的命令连接,比如"! connect“,它就是!)。连接/断开连接的方法如下:

代码语言:javascript
复制
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方法时必须小心。下面是我在窗体后面的代码中拥有的方法!

代码语言:javascript
复制
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“弹出”在飞行中,以保持设计苗条。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62360013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档