• If you need help or want to discuss things, you now can also join us on our Discord Server!
  • A first preview of the unlimited version of SinusBot can be found in the Upcoming Changes thread. A version for Windows will follow, but we don't have a release date, yet.

Solved Servergruppe wird nicht gesetzt (Discord)

Encrypter

Member
Guten Abend an alle Mitglieder, :D

ich entwickle seit der letzten Zeit einige Scripts und orientiere mich immer an der Sinusbot Script Dokumentation.
Aktuell schreibe ich ein Script das einem Benutzer(Client) eine Role(Servergroup) geben soll.

JavaScript:
                var rank = getRankforLevel(level);
                var client = getClientByID(userID);
                if (rank != null) {
                    engine.log("Client with ID: "+userID+" gets the rank "+rank.name());
                    client.addToServerGroup(rank);
                }

Aber komischerweise wird dem Client die Servergruppe nicht gesetzt :(
Ich hab auch versucht direkt über die Servergruppe den Client hinzuzufügen aber dies geht auch nicht.

Die Variablen "rank" und "client" sind nicht null oder undefined, darin befindet sich das Objekt das gebraucht wird (servergroup, client)!

Ich hab vorhin auch das Log-Level auf 10 gestellt aber darin befindet sich nichts, was mit dem Setzen der Servergruppe zu tun hat!

Wichtige Daten:
Das Script ist für Discord
OS: Ubuntu 18.04

Weiß jemand vielleicht wo ich meinen Fehler mache? 🤔

Vielen Dank im Voraus für eure Hilfe 🙏

Encrypt3r
 

Multivitamin

Well-Known Member
Tier III
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
am besten schickst du den kompletten code, mit kleinen ausschnitten ist es recht schwer herauszufinden was die funktionen die aufgerufen werden exakt machen
 

Encrypter

Member
Hey,

am besten schickst du den kompletten code, mit kleinen ausschnitten ist es recht schwer herauszufinden was die funktionen die aufgerufen werden exakt machen

ja da hast du recht ohne den Source kann man damit wenig anfangen 😅

Hier sind die wichtigsten Teile des Sources 🙂

JavaScript:
    function getClientByID(userID) {
        //Diese Methode brauche ich um den Client mit der ID von der Mention zu bekommen! (Funktioniert auch)
        var backend = require('backend');
        var clients = backend.getClients();
        for (var i = 0; i < clients.length; i++) {
            if (clients[i].uid().includes(userID)) {
                engine.log("Found User Name: "+clients[i].name()+" uid: "+clients[i].uid());
                return clients[i];
            }
        }
        return null;
    }
  
    function getRankByName(name) {
        var backend = require('backend');
        var groups = backend.getServerGroups();
        for (var i = 0; i < groups.length; i++) {
            if (groups[i].name() === name) {
                return groups[i];
            }
        }
        return null;
    }
  
    function getRankforLevel(level) {
        //rankArray = Ein String Array mit den Rollennamen
        var rankArray = getRankArray();
        //reachLevels = Ein String Array mit dem dementsprechend Level für die Rolle
        var reachLevels = getReachLevelArray();
        if (rankArray != null && reachLevels != null) {
            for (var i = 0; i < reachLevels.length; i++) {
                //toNumber parsed den String zu einem Integer!
                if (level == toNumber(reachLevels[i])) {
                    var rankName = rankArray[i];
                    return getRankByName(rankName);
                }
            }
        }
        return null;
    }
  
    function getUserID(message) {
    //Die Nachricht enthält eine Discord Mention (z. B. @Encrypt3r), wodurch der Sinusbot die ID vom makierten Benutzer bekommt!
    //https://discordapp.com/developers/docs/reference#message-formatting
        var userIDString = message.substring(message.indexOf("<@!")+3, message.indexOf(">"));
        if (userIDString.length != 0) {
            return userIDString;
        }
        return null;
    }
  
    function checkLevel(message) {
        var level = getLevel(message); //Hier wird ein Integer zwischen 1-100 zurückgegeben
        var userID = getUserID(message);
        if (level != null && userID != null) {
        //Bei isAReachLevel wird geschaut ob bei dem Level eine Rolle(Servergroup) vergeben wird! (Das funktioniert auch!)
            if (isAReachLevel(level) == true) {
                engine.log("Client with ID: "+userID+" has reached level "+level+" and gets a rank");
                var rank = getRankforLevel(level);
                var client = getClientByID(userID);
                if (rank != null) {
                    engine.log("Client with ID: "+userID+" gets the rank "+rank.name());
                    client.addToServerGroup(rank);
                }
            }
        }
    }
  
  
    event.on('message', msg => {
        if (isLevelChannel(msg.channel()) == true) {
            checkLevel(msg.content());
        }
    });
 
Last edited:

Multivitamin

Well-Known Member
Tier III
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
Erstmal ein paar anregungen:

empfehlenswert wäre wenn due die variable backend im globalen scope deklarierst wie du es vermutlich auch bei event und engine gemacht hast weiters sind checks wie
JavaScript:
    // x == true unnötig da die funktion ohnehin ein bool zurück gibt
    if (isLevelChannel(msg.channel()) == true) {
    // besser
    if (isLevelChannel(msg.channel())) {

ich weiß leider nicht genau was deine funktion getReachLevelArray zurückgibt aber der string sollte vermutlich unter discord so aufgebaut sein <GUILDID>/<ROLE_ID>
 

Encrypter

Member
empfehlenswert wäre wenn due die variable backend im globalen scope deklarierst wie du es vermutlich auch bei event und engine gemacht hast weiters sind checks wie

Okey das hab ich schonmal geändert 😄 Danke für den Tipp!

Der Code zu der Methode getReachLevelArray:


JavaScript:
function getReachLevelArray() {
        var reachLevelsString = ""+config.reachLevel;
        if (reachLevelsString.length != 0) {
            if (reachLevelsString.includes(",") == true) {
                var reachLevelArray = reachLevelsString.split(",");
                return reachLevelArray;
            } else {
                var reachLevelArray = [reachLevelsString];
                return reachLevelArray;
            }
        }
        return null;
    }

Vielen Dank das du dir den Source anschaust und mir hilfst 🙏
 

Multivitamin

Well-Known Member
Tier III
is awesome!
V.I.P.
is uber awesome!
Contributor
Insider
Je nach dem was du in der config eingetragen hast sollte es halt zum format passen wie ich in meinem 2. thread gepostet hab
 

Encrypter

Member
string sollte vermutlich unter discord so aufgebaut sein <GUILDID>/<ROLE_ID>

Ouh okey 🤔 mir ist schon aufgefallen das die Servergruppe die ich zurückbekomme zwei IDs beinhaltet, aber ich wusste nicht welche für was ist 😅


Deswegen hab ich die Methode getRankByName geschrieben wo ich einfach den Namen von der Rolle eingeben kann😄
Und der Bot dann einfach durchschaut ob eine Rolle (von allen Rollen auf dem Server) diesen Namen hat 🤔
Ich frag mich nur wofür die GUILDID zuständig ist 😅
 

Encrypter

Member
Okey dann sollte das passen, den ich hole ja alle (Server)gruppen vom Discord Server 🤔

Durch backend.getServerGroups();
 

Encrypter

Member
Ich hab es jetzt schon mal besser machen können den Client vom Server einfach nur über die ID zu bekommen 😄

Ich hab mir von dem Object DiscordMessage die guildID geholt und die User ID dementsprechend hinzugefügt :) (123123/13123123)

Beim der Servergroup ist das ja das gleiche Prinzip, da hab ich ihm auch wieder die GUILD ID und die Rollen ID zusammengefügt!

Aber da geht es komischerweise nicht :(
 

Encrypter

Member
Hey 😄

ich möchte den Thread hiermit beenden, dadurch das ich eine Lösung für das Problem gefunden habe!

@irgendwr hat mir den Tipp gegeben das dies mit dem Aufrufen eines Kommando über die Discord API möglich ist! 👍

Hier seht ihr wie das Kommando über die Discord API aufgebaut ist: Discord Add Guild Member Role

Dabei durfte ich Code Teile von seinem Script verwenden 🙏

Wichtig:
Beachtet auch das der Bot Account eine Administrator Role braucht!
Die könnt ihr automatisch über den Bot Invite Link erstellen lassen: Discord Bot Permissions Calculator

Die erstellte Role (die dann im Normalfall so heißt wie der Bot Nickname) müsst ihr dann unter den Servereinstellungen > Rollen höher setzen als die Rolle, die ihr mit dem Script setzten wollte!

Ich hoffe ich konnte Leuten helfen, die das gleiche Problem hatten/haben 🙂
 
Top