Zum Hauptinhalt springen
  1. Projekte/

Discord Bot - Voice Channel Extras

·4 min· 0 · 0 ·
Projekte Aktuell
Idee / Funktion>

Idee / Funktion

In einem Gespräch wurde der Wunsch nach einer Ping Möglichkeit, wie aus Teamspeak bekannt, angesprochen, welche so nicht in Discord existiert. Discord unterstützt zwar eine Funktion mit dem Namen “Mentions”, diese sind jedoch nicht vergleichbar mit einem Anstupsen oder einem Ping. In Zukunft soll eine Gruppe von Nutzern automatisch eine Ping Nachricht bekommen, sobald ein Nutzer einen bestimmten Voice Channel betritt.

Außerdem war in dem Zuge von einer Minimierung von Voice Channels die Rede, da normale Voice Channel nicht mit dem Bedarf skalieren und somit auch häufig zu viele oder zu wenige vorhanden sind. Da würde sich anbieten, dass automatisch neue Channels erzeugt werden, wenn die bestehenden gefüllt sind.

Die Lobby Funktion wurde bereits durch diverse andere Bots umgesetzt. Ich habe mich an folgender Umsetzung orientiert (Orientierung => Funktion ähnlich, Code ist vollständig unabhängig) Auto Voice Channels

Commands / Befehle>

Commands / Befehle

Erstellen einer Zuweisung für die Ping Nachrichten beim Joinen des Channels
/ping channel {name} [{removeFlag}]

Zuweisung der Benachrichtigungsrolle
/ping role {name} [{removeFlag}]

Optionales Flag: {removeFlag} zum Entfernen von Rolle oder Channel. Der Wert sollte entweder true oder false sein.

Anzeigen der Informationen zu den Pings
/ping info

Informationen zum Bot
/info

Benachrichtigung stumm schalten
/mute

Lobby erstellen, welche repliziert wird beim Joinen
/lobby create {channel}

Lobby entfernen, Temporäre Channel werden anschließend entfernt
/lobby remove {channel}

Umsetzung>

Umsetzung

Für die Umsetzung wurde die Sprache Java verwendet mit der Bibliothek JDA (Java Discord API).

Java Umsetzung>

Java Umsetzung

Nachfolgend werden einzelne Umsetzungen beschrieben und mit kleinen Code Ausschnitten angereichert. Der komplette Quellcode wird jedoch nicht geteilt.

Ping Funktion>

Ping Funktion

Die Ping Funktion nimmt die eingetragenen Kanal-IDs und eine Empfänger-Rolle als Parameter auf. Die Funktion wird immer dann aufgerufen, wenn jemand einen Sprachkanal betritt. Beim Betreten wird ein Event ausgelöst, welches dann prüft, ob dieser Kanal registriert wurde. Anschließend werden die Rollen abgefragt und die entsprechenden Mitglieder über eine DM benachrichtigt.

AudioChannelUnion joined = event.getChannelJoined();
AudioChannelUnion left = event.getChannelLeft();
if (joined != null) {
    if (config.isDebug()) log.debug("User {} joined channel {}", event.getMember().getEffectiveName(), joined.getName());
    pingListener.joined(event, guildConfig, joined);
    lobbyListener.joined(event, guildConfig, joined);
}
if (left != null) {
    if (config.isDebug()) log.debug("User {} left channel {}", event.getMember().getEffectiveName(), left.getName());
    lobbyListener.left(event, guildConfig, left);
}
Lobby Funktion>

Lobby Funktion

Wie bei der Ping Funktion im Code bereits zu sehen, wird auch dort ein LobbyListener initiiert. Dieser regelt das automatische Erstellen neuer Kanäle beim Betreten von dem Lobbykanal. Dabei wird der Name zunächst repliziert und anschließend an das grade am meisten gespielte Spiel der Teilenehmer angepasst.

Hier ist einmal die Funktion, welche die am meisten gespielte Aktivität im Sprachkanal ermittelt. Diese wird bei Betreten, Verlassen sowie einer Änderung der Aktivität aufgerufen.

Ich muss hierbei noch testen, ob diese Menge eventuell die Rate Limits von Discord sprengen.

private String getMaxActivity(VoiceChannel primary) {
        Map<String, Long> groupedActivities = primary.getMembers()
                .stream().flatMap(member -> member.getActivities().stream())
                .collect(Collectors.groupingBy(Activity::getName, Collectors.counting()));
        return groupedActivities.entrySet().stream()
                .filter(stringLongEntry -> !stringLongEntry.getKey().equals("Custom Status"))
                .sorted(Map.Entry.comparingByValue())
                .map(Map.Entry::getKey)
                .findFirst().orElse(primary.getName());
}
Hosting mit Docker>

Hosting mit Docker

Um das Hosten so einfach wie möglich zu machen und mir auch Arbeit beim Deployen zu sparen, habe ich mich für ein Docker Image entschieden. Dieses ist wie folgt aufgebaut:

FROM openjdk:18
COPY /target/VoicePingChannel-0.1.0.jar /usr/src/VPCBot/VoicePingChannel-0.1.0-proguard.jar
WORKDIR /usr/src/VPCBot/
VOLUME /usr/src/VPCBot/config/
LABEL version="1.0"
LABEL description="I am a Discord Bot, which provides automatic Lobbys and Pings."
ENV BOT_TOKEN=""
CMD ["java", "-jar", "VoicePingChannel-0.1.0-proguard.jar", "--config", "./config/config.json"]

Dabei basiert das Image auf dem OpenJDK 18 und kopiert als ersten Schritt die gebaute Botinstanz in das Arbeitsverzeichnis. Diese gebaute Instanz wurde mit Proguard unleserlich gemacht(Obfuscating).

Anschließend wird das Workdir, ein Volume und Labels erstellt. Der Bot Token kann als einzige Konfigurationsvariable direkt als Environment variable übergeben werden. Der Rest muss im Volume in der Konfigurationsdatei angepasst werden.

Zuletzt wird der Start Befehl definiert.

Ausprobieren>

Ausprobieren

Der Bot lässt sich über den unten aufgeführten Link ausprobieren. Ich behalte mir vor, die Nutzung des Bots zu blockieren, wenn die Funktionen nicht ordnungsgemäß genutzt oder ausgenutzt werden.

Ein eigenes Hosten möglich, um eine bessere Performance zu bekommen.

Eine Verbreitung, Vervielfältigung oder Veränderung des Bots, ist nicht gestattet. Das Urheberrecht findet hier entsprechend Anwendung. Beim Self-Hosting ist zwingend eine Referenz zu mir, als Autor in Form eines Links hinzuzufügen. Ein Verstoß hat entsprechende rechtliche Konsequenzen.

Eine Nutzung des Bots und ein Hosten ist unter Einhaltung der Regeln kostenlos.

Bei Interesse kontaktieren Sie mich gerne.
Bot einladen auf deinen Server
Support>

Support

Support kann ich gerne auf Discord anbieten ⇨ Link

Feedback>

Feedback

ich freue mich über jedes Feedback, dazu gerne einen Kommentar schreiben oder mit mir Kontakt aufnehmen.

Bild von Arek Socha auf Pixabay

Todos:>

Todos:

  • Sharding einführen, für bessere Stabilität und mehr Server
  • Ping Rolle Kanal abhängig machen und nicht global
  • Nur Online Member benachrichtigen (Nicht Stören, Abwesend eventuell auch auslassen)
  • Sharding System testen und Performance protokollierne


Niklas (ModdyLP)
Autor
Niklas (ModdyLP)
Software Developer and Dream Creator