我正在尝试做到这一点,以便当有人加入语音通道时,Bot会将特定的人添加到文本通道中,并具有阅读和发送消息的权限,并在离开该人员时删除该人及其权限。语音通道。我对discord.js不太熟悉,所以不确定如何去做。
答案 0 :(得分:2)
首先,欢迎您使用Stack Overflow。希望我们能为您提供帮助。
让我们先检测成员何时加入语音通道。为此,我们可以监听您客户的voiceStateUpdate
事件。接下来,我们可以将旧语音通道与新语音通道进行比较,看看该成员是加入还是离开。最后,我们可以使用GuildChannel.overwritePermissions()
在文本通道中更改成员的权限。
更新:行为相似的多个“成对”文本通道和语音通道。
要针对许多不同的通道执行此操作,可以设置一个json文件来存储语音通道和相应的文本通道,然后遍历每对通道,检查情况是否匹配。
channelPairs.json
[
{ "voice": "voiceChannelIDHere", "text": "textChannelIDHere" }
]
index.js
const pairs = require('./channelPairs.json'); // Keep in mind the path may vary
client.on('voiceStateUpdate', (oldMember, newMember) => {
let oldID;
let newID;
if (oldMember.voiceChannel) oldID = oldMember.voiceChannel.id;
if (newMember.voiceChannel) newID = newMember.voiceChannel.id;
for (let i = 0; i < pairs.length; i++) {
const textChannel = newMember.guild.channels.get(pairs[i].text);
if (!textChannel) {
console.log('Invalid text channel ID in json.');
continue;
}
const vcID = pairs[i].voice;
if (oldID !== vcID && newID === vcID) { // Joined the voice channel.
textChannel.overwritePermissions(newMember, {
VIEW_CHANNEL: true,
SEND_MESSAGES: true
}).catch(console.error);
} else if (oldID === vcID && newID !== vcID) { // Left the voice channel.
textChannel.overwritePermissions(newMember, {
VIEW_CHANNEL: null,
SEND_MESSAGES: null
}).catch(console.error);
}
}
});
答案 1 :(得分:0)
好的,让我们看一下DiscordJS API:
找到了here.
我们可以看到,有一个名为“ WSEvent ”的类(代表 WebsocketEvent )。我们可以使用它来检测用户何时加入频道...
但是我们不能真正使用它,因为没有“ CHANNEL_JOIN”事件。因此,我们必须侦听此voiceStateUpdate或VOICE_STATUS_UPDATE事件。
像这样:
// voiceStateUpdate
/* Emitted whenever a user changes voice state - e.g. joins/leaves a channel, mutes/unmutes.
PARAMETER TYPE DESCRIPTION
oldMember GuildMember The member before the voice state update
newMember GuildMember The member after the voice state update */
client.on("voiceStateUpdate", function(oldMember, newMember){
console.log(`a user changes voice state`);
// Here we can just check if newMember is in the channel that we want. Bam.
if(newMember.voiceChannel.name == 'channelname') {
// DO SOMETHING.
myVoiceChannel.overwritePermissions(newMember, {
SEND_MESSAGES: true
});
} else {
myVoiceChannel.overwritePermissions(newMember, {
SEND_MESSAGES: null
});
}
});
让我们减少一下:
newMember.voiceChannel
-这表示他们连接到的频道。
voiceChannel.name
-获取频道的名称,以便我们进行检查。
希望我能帮上忙,顺便说一下,这是我在开发DiscordJS机器人时喜欢使用的一个小巧的摘要:https://gist.github.com/koad/316b265a91d933fd1b62dddfcc3ff584