A simple NodeJS Discord bot using the Discord.js API

tarfeef101 25a75cfcc1 Merge branch 'fixes_shuffle_and_search' of tarfeef101/viki into master vor 3 Jahren
src 7b1c499a1e litte bugfixes vor 3 Jahren
.gitignore 39bb95142a gitignore the config file vor 3 Jahren
Dockerfile 6d6ee6ae01 fix permissions+user to use host beet db and user files, can play a song! vor 3 Jahren
README.md 845b209d2e readme entry for shuffle vor 3 Jahren
config.json 1a7c8469d8 Initial setup (#1) vor 6 Jahren
docker-compose.yaml 603300b6ac "turn on" restart behaviour" vor 3 Jahren

README.md

Viki

Viki is a bot focused mainly on music streaming. Specifically, streaming from a beets music library on the docker host on which the viki container is run. Yes, this is a very specific, narrow use case.

Deployment

To get this running on your server, other than the normal creation of a bot user stuff on the discord, side, do the following:

  • create src/config.json and add:
    • "token", your bot's token
    • "prefix", the character that is the prefix for bot commands in your server
    • "whitelist", an array of users in the form username#tag who can run addmusic for your bot
  • in docker-compose.yaml:
    • change the volumes to the locations of your beets config and media folder(s)
    • optionally change the restart policy to your preference
  • in Dockerfile:
    • change the added user to the user who owns the media library on the host
    • change the uid and gid of this user to match the host, if necessary
    • ensure the version of beets to be installed is equal or at least compatible with the host's
  • run docker-compose up --build -d to run the bot

Usage

The bot recognizes commands sent by non-bot users, prepended with the prefix character set in the config.json. Below is a list of commands the bot recognizes.

  • ping
    • responds to the commands with the one-way and round-trip latency for the bot
    • e.g. !ping
  • join channelname
    • Joins the voice channel named channelname
    • e.g. !join General
  • leave channelname
    • Leaves the voice channel named channelname
    • e.g. !leave General
  • price type weapon
    • Returns riven price data for the weapon of mod type type, where type is either rolled or unrolled
    • e.g. !price unrolled kuva bramma
  • search querytype querystring
    • Looks up music in the host DB, and adds responds w/ the results
    • Valid querytypes include ['track', 'title', 'song', 'artist', 'album']
    • querystring is the actual query, so if querytype was artist, a valid querystring would be green day
  • addmusic querytype querystring
    • Looks up music in the host DB, and adds matching songs to the playlist, and starts playing if nothing is playing already
    • Same argument syntax as search
  • stop
    • Stops playback and clears the playlist
  • next
    • Returns the next song in the playlist
  • previous
    • Returns the previous song that was played
  • playlist
    • Returns the contents of the current playlist
  • pause
    • Pauses playback
  • resume
    • Resumes playback
  • repeat setting
    • Sets repeat behaviour to off, one, or all. The default behaviour of the bot is off
  • skip
    • Skips to the next song in the playlist
  • back
    • Goes back to replay the previous song, and adds the song that was playing at the time of the command back onto the front of the playlist
  • shuffle
    • Shuffles the playlist's order

Caveats

  • as mentioned above, yes, this is a very narrow use case
  • anyone you whitelist can technically execute arbitrary code in your container (and since there's bind mounts, place code on the host) through addmusic. so that's great
  • yes, the whitelist is an array in the config file, not role-based
  • yes, these are solvable problems