Obecnie rozwijam Bot Discord za pomocą discord.js dla prywatnego użycia.

Oto mały kontekst: na moim serwerze organizujemy zdarzenia z 30 - 40 członkami w kanale głosowym (wszystkie mają role odpowiadające wydarzeniom) i musimy sprawdzić, kto zaginął. Zasadniczo bot musi porównać 2 listę, członków z roli zdarzenia, które są połączone na kanał głosowy, a drugi z tymi z tych, których mają rolę, ale nie są podłączone na wyznaczony kanał głosowy.

Zrobiłem kilka badań, mam podstawy tego, jak powinno działać (pobieranie identyfikatora kanału głosowego, w którym jest administrator, i uzyskanie roli z polecenia). Jednak jest bardziej skomplikowane niż myślałem i potrzebuję pomocy.

Oto mój "kod":

client.on('message', message => {
    if(message.content == "check"){
        //role restriction
        if(!!message.member.roles.cache.has("admin")) return console.log("Fail from "+message.author.username);
        else{
            //retreiving the role from command
            var messageArray = message.content.split(" ");
            var command = messageArray[0];
            var args = messageArray.slice(1)
            //finding the correct channel with the gaved ID
            console.log(message.guild.channels.cache
                .find(VoiceChannel => VoiceChannel.id == 618882800950706189))


            //voice channel ID where admin is connected
            //console.log(message.member.voice.channelID);

        };
    };
});

Docenię każdą pomoc, że dostanę :)

0
codingNoob 21 marzec 2020, 18:21

1 odpowiedź

Najlepsza odpowiedź

Jest kilka rzeczy, które robisz źle, RoleManager otrzymasz z .cache zwraca Collection patrz tutaj

Kolekcja jest w zasadzie tablicą Tules Tules, które wyglądają jak [key, value], klucz jest zwykle identyfikatorem (ciągiem, który używany jako numer w przykładzie kodu), a wartość reprezentuje rzeczywistą wartość, w tym przypadku rola, od tego, co rozumiem, że masz problemy z podłączonych członków i członków, którzy mają rolę, którzy nie są połączonymi, dostosowałem swój kod, mam nadzieję, że daje ogólny pomysł

client.on("message", message => {
  // This prevents the bot from responding to bots
  if (message.autor.bot) {
    return;
  }

  // ES6 array destructuring + rest spread operator allows us to easily
  // get the first word from an array and keep the rest as an array
  const [command, ...args] = message.content.split(/ +/);

  if (command === "check") {
    // Check if the member has the admin role using Collection#some
    if (!message.member.roles.cache.some(r => r.name === "admin")) {
      return console.log(`Fail from ${message.author.username}`);
    }

    // Attempt to get the channel from the collection using the ID from user input
    // Note that this could be undefined!
    const voiceChannel = message.guild.channels.cache.get(args[0]);

    // Collection of members who have the event role
    const eventMembers = message.guild.members.cache.filter(m =>
      m.roles.cache.some(r => r.name === "event")
    );

    // Collection of members with the event role who are connected
    // Using Collection#filter and Collection#has
    const connectedMembers = eventMembers.members.filter(m =>
      voiceChannel.members.has(m.id)
    );

    // Collection of members with the event role but are not connected
    const disconnectedMembers = eventMembers.members.filter(
      m => !voiceChannel.members.has(m.id)
    );
  }
});
0
23 marzec 2020, 12:58