mirror of
				https://github.com/warengroup/eximiabots-radiox.git
				synced 2025-11-04 03:49:33 +00:00 
			
		
		
		
	
							
								
								
									
										6
									
								
								.github/workflows/codeql-analyze.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/codeql-analyze.yml
									
									
									
									
										vendored
									
									
								
							@@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    # Initializes the CodeQL tools for scanning.
 | 
			
		||||
    - name: Initialize CodeQL
 | 
			
		||||
      uses: github/codeql-action/init@v1
 | 
			
		||||
      uses: github/codeql-action/init@v2
 | 
			
		||||
      with:
 | 
			
		||||
        languages: ${{ matrix.language }}
 | 
			
		||||
        # If you wish to specify custom queries, you can do so here or in a config file.
 | 
			
		||||
@@ -54,7 +54,7 @@ jobs:
 | 
			
		||||
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
 | 
			
		||||
    # If this step fails, then you should remove it and run the build manually (see below)
 | 
			
		||||
    - name: Autobuild
 | 
			
		||||
      uses: github/codeql-action/autobuild@v1
 | 
			
		||||
      uses: github/codeql-action/autobuild@v2
 | 
			
		||||
 | 
			
		||||
    # ℹ️ Command-line programs to run using the OS shell.
 | 
			
		||||
    # 📚 https://git.io/JvXDl
 | 
			
		||||
@@ -68,4 +68,4 @@ jobs:
 | 
			
		||||
    #   make release
 | 
			
		||||
 | 
			
		||||
    - name: Perform CodeQL Analysis
 | 
			
		||||
      uses: github/codeql-action/analyze@v1
 | 
			
		||||
      uses: github/codeql-action/analyze@v2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/docker-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/docker-build.yml
									
									
									
									
										vendored
									
									
								
							@@ -12,7 +12,7 @@ jobs:
 | 
			
		||||
    - name: Checkout
 | 
			
		||||
      uses: actions/checkout@v3
 | 
			
		||||
    - name: Setup Docker Buildx
 | 
			
		||||
      uses: docker/setup-buildx-action@v1.6.0
 | 
			
		||||
      uses: docker/setup-buildx-action@v2.0.0
 | 
			
		||||
      id: buildx
 | 
			
		||||
      with:
 | 
			
		||||
        install: true
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							@@ -10,34 +10,34 @@ This bot is using Gitea repo to get radio stations from [playlist.json](https://
 | 
			
		||||
 | 
			
		||||
**Production**
 | 
			
		||||
```
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:0.3.20 . --pull
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:latest . --pull
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Beta**
 | 
			
		||||
```
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:0.3.20-beta . --pull
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:latest-beta . --pull
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Dev**
 | 
			
		||||
```
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:0.3.20-dev . --pull
 | 
			
		||||
docker build -t warengroup/eximiabots-radiox:latest-dev . --pull
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 2. Run Container
 | 
			
		||||
 | 
			
		||||
**Production**
 | 
			
		||||
```
 | 
			
		||||
docker run --name radiox --net host -d -e DISCORD_TOKEN= -e STREAMER_MODE=auto -v "$PWD/datastore":/usr/src/app/datastore/ warengroup/eximiabots-radiox:0.3.20
 | 
			
		||||
docker run --name radiox --net host -d -e DISCORD_TOKEN= -e STREAMER_MODE=auto -v "$PWD/datastore":/usr/src/app/datastore/ warengroup/eximiabots-radiox:latest
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Beta**
 | 
			
		||||
```
 | 
			
		||||
docker run --name radiox --net host -d -e DISCORD_TOKEN= -e STREAMER_MODE=auto -v "$PWD/datastore":/usr/src/app/datastore/ warengroup/eximiabots-radiox:0.3.20-beta
 | 
			
		||||
docker run --name radiox --net host -d -e DISCORD_TOKEN= -e STREAMER_MODE=auto -v "$PWD/datastore":/usr/src/app/datastore/ warengroup/eximiabots-radiox:latest-beta
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Dev**
 | 
			
		||||
```
 | 
			
		||||
docker run --rm --name radiox-dev --net host -e DISCORD_TOKEN= -e DEV_MODE=true -v "$PWD":/usr/src/app/ warengroup/eximiabots-radiox:0.3.20-dev
 | 
			
		||||
docker run --rm --name radiox-dev --net host -e DISCORD_TOKEN= -e DEV_MODE=true -v "$PWD":/usr/src/app/ warengroup/eximiabots-radiox:latest-dev
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3387
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3387
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										39
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								package.json
									
									
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "eximiabots-radiox",
 | 
			
		||||
  "version": "0.3.20",
 | 
			
		||||
  "version": "0.4.0",
 | 
			
		||||
  "description": "Internet Radio to your Discord guild",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "build": "rimraf ./build && tsc",
 | 
			
		||||
    "start": "node --no-warnings build/index.js",
 | 
			
		||||
    "start:dev": "npm run build && node --no-warnings build/index.js"
 | 
			
		||||
    "start:dev": "rimraf ./build && tsc && node --no-warnings build/index.js"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
@@ -18,31 +18,30 @@
 | 
			
		||||
    "url": "https://github.com/warengroup/eximiabots-radiox/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@discordjs/builders": "^0.12.0",
 | 
			
		||||
    "@discordjs/opus": "^0.7.0",
 | 
			
		||||
    "@discordjs/rest": "^0.3.0",
 | 
			
		||||
    "@discordjs/voice": "^0.8.0",
 | 
			
		||||
    "discord-api-types": "^0.31.0",
 | 
			
		||||
    "discord.js": "^13.6.0",
 | 
			
		||||
    "dotenv": "^16.0.0",
 | 
			
		||||
    "@discordjs/builders": "^1.0.0",
 | 
			
		||||
    "@discordjs/opus": "^0.8.0",
 | 
			
		||||
    "@discordjs/rest": "^1.0.0",
 | 
			
		||||
    "@discordjs/voice": "^0.11.0",
 | 
			
		||||
    "discord-api-types": "^0.36.2",
 | 
			
		||||
    "discord.js": "^14.0.2",
 | 
			
		||||
    "dotenv": "^16.0.1",
 | 
			
		||||
    "libsodium-wrappers": "^0.7.10",
 | 
			
		||||
    "node-fetch": "^3.2.3",
 | 
			
		||||
    "node-fetch": "^3.2.9",
 | 
			
		||||
    "path": "^0.12.7"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/node": "^17.0.23",
 | 
			
		||||
    "@types/node": "^18.0.6",
 | 
			
		||||
    "@types/ws": "^8.5.3",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^5.18.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^5.18.0",
 | 
			
		||||
    "eslint": "^8.12.0",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^5.30.7",
 | 
			
		||||
    "@typescript-eslint/parser": "^5.30.7",
 | 
			
		||||
    "eslint": "^8.20.0",
 | 
			
		||||
    "eslint-config-prettier": "^8.5.0",
 | 
			
		||||
    "eslint-plugin-prettier": "^4.0.0",
 | 
			
		||||
    "nodemon": "^2.0.15",
 | 
			
		||||
    "prettier": "^2.6.2",
 | 
			
		||||
    "eslint-plugin-prettier": "^4.2.1",
 | 
			
		||||
    "prettier": "^2.7.1",
 | 
			
		||||
    "rimraf": "^3.0.2",
 | 
			
		||||
    "ts-node": "^10.7.0",
 | 
			
		||||
    "tsc-watch": "^5.0.2",
 | 
			
		||||
    "typescript": "^4.6.3"
 | 
			
		||||
    "ts-node": "^10.9.1",
 | 
			
		||||
    "tsc-watch": "^5.0.3",
 | 
			
		||||
    "typescript": "^4.7.4"
 | 
			
		||||
  },
 | 
			
		||||
  "engines": {
 | 
			
		||||
      "node": ">=16.9.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord, { Client, Collection } from "discord.js";
 | 
			
		||||
import { Client, Collection, IntentsBitField } from "discord.js";
 | 
			
		||||
import Datastore from "./client/classes/Datastore.js";
 | 
			
		||||
import Radio from "./client/classes/Radio.js";
 | 
			
		||||
import Stations from "./client/classes/Stations.js";
 | 
			
		||||
@@ -12,7 +12,7 @@ import path from "path";
 | 
			
		||||
 | 
			
		||||
const events = "./client/events/";
 | 
			
		||||
 | 
			
		||||
const GatewayIntents = new Discord.Intents();
 | 
			
		||||
const GatewayIntents = new IntentsBitField();
 | 
			
		||||
GatewayIntents.add(
 | 
			
		||||
    1 << 0, // GUILDS
 | 
			
		||||
    1 << 7, // GUILD_VOICE_STATES
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'bug',
 | 
			
		||||
@@ -10,7 +10,7 @@ module.exports = {
 | 
			
		||||
        message.bugTitle = client.messages.bugTitle.replace("%client.user.username%", client.user.username);
 | 
			
		||||
        message.bugDescription = client.messages.bugDescription.replace("%client.config.supportGuild%", client.config.supportGuild);
 | 
			
		||||
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(message.bugTitle)
 | 
			
		||||
            .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["logo"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'help',
 | 
			
		||||
@@ -19,7 +19,7 @@ module.exports = {
 | 
			
		||||
        message.helpTitle = client.messages.helpTitle.replace("%client.user.username%", client.user.username);
 | 
			
		||||
        message.helpDescription = client.messages.helpDescription.replace("%commands%", commands);
 | 
			
		||||
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(message.helpTitle)
 | 
			
		||||
            .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["logo"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'invite',
 | 
			
		||||
@@ -7,7 +7,7 @@ module.exports = {
 | 
			
		||||
    execute(interaction, client) {
 | 
			
		||||
        let message = {};
 | 
			
		||||
        message.inviteTitle = client.messages.inviteTitle.replace("%client.user.username%", client.user.username);
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(message.inviteTitle)
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
            .setURL("https://discord.com/api/oauth2/authorize?client_id=" + client.user.id + "&permissions=2184465408&scope=applications.commands%20bot") //View Channels, Send Messages, Embed Links, Use External Emojis, Use Slash Commands, Connect, Speak, Use Voice Activity
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'list',
 | 
			
		||||
@@ -26,7 +26,7 @@ module.exports = {
 | 
			
		||||
                stations = stations.replace('**#**', `**${i + 1}.**`);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let embed = new Discord.MessageEmbed()
 | 
			
		||||
            let embed = new EmbedBuilder()
 | 
			
		||||
                .setTitle(client.messages.listTitle)
 | 
			
		||||
                .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["list"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
                .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { ActionRowBuilder, EmbedBuilder, SelectMenuBuilder } from "discord.js";
 | 
			
		||||
import Streamer from "../classes/Streamer.js";
 | 
			
		||||
const _importDynamic = new Function('modulePath', 'return import(modulePath)');
 | 
			
		||||
const fetch = (...args) => _importDynamic('node-fetch').then(({default: fetch}) => fetch(...args));
 | 
			
		||||
@@ -19,62 +19,53 @@ module.exports = {
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "🌀",
 | 
			
		||||
                label: "Restart Bot",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "0"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "<:RadioXStop:688541155377414168>",
 | 
			
		||||
                label: "Save Radios",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "4"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "<:RadioXPlay:688541155712827458>",
 | 
			
		||||
                label: "Restore Radios",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "5"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "#️⃣",
 | 
			
		||||
                label: "Reload Commands",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "6"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "<:RadioXList:688541155519889482>",
 | 
			
		||||
                label: "Reload Stations",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "7"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "<:dnd:746069698139127831>",
 | 
			
		||||
                label: "Enable Maintenance Mode",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "8"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "<:online:746069731836035098>",
 | 
			
		||||
                label: "Disable Maintenance Mode",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "9"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "💤",
 | 
			
		||||
                label: "Streamer Mode – Manual",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "10"
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                emoji: "📡",
 | 
			
		||||
                label: "Streamer Mode – Auto",
 | 
			
		||||
                description: "",
 | 
			
		||||
                value: "11"
 | 
			
		||||
            }
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const menu = new Discord.MessageActionRow()
 | 
			
		||||
        const menu = new ActionRowBuilder()
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageSelectMenu()
 | 
			
		||||
            new SelectMenuBuilder()
 | 
			
		||||
                .setCustomId('maintenance')
 | 
			
		||||
                .setPlaceholder('Select action')
 | 
			
		||||
                .addOptions(options)
 | 
			
		||||
@@ -90,7 +81,7 @@ module.exports = {
 | 
			
		||||
 | 
			
		||||
        client.funcs.logger('Maintenance', options.find(option => option.value == action).label);
 | 
			
		||||
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(client.messages.maintenanceTitle)
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
            .setDescription(options.find(option => option.value == action).label)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ module.exports = {
 | 
			
		||||
            radio.textChannel = interaction.channel;
 | 
			
		||||
            radio.startTime = date.getTime();
 | 
			
		||||
 | 
			
		||||
            if(interaction.isCommand()) {
 | 
			
		||||
            if(interaction.isChatInputCommand()) {
 | 
			
		||||
                client.funcs.play(client, interaction, interaction.guild, station);
 | 
			
		||||
            }
 | 
			
		||||
            if(interaction.isButton()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'nowplaying',
 | 
			
		||||
@@ -18,7 +18,7 @@ module.exports = {
 | 
			
		||||
            message.nowplayingDescription = message.nowplayingDescription.replace("%radio.station.owner%" + "\n", radio.station.name != radio.station.owner ? radio.station.owner + "\n" : "");
 | 
			
		||||
            message.nowplayingDescription = message.nowplayingDescription.replace("%client.funcs.msToTime(completed)%", client.funcs.msToTime(completed));
 | 
			
		||||
 | 
			
		||||
            const embed = new Discord.MessageEmbed()
 | 
			
		||||
            const embed = new EmbedBuilder()
 | 
			
		||||
                .setTitle(client.messages.nowplayingTitle)
 | 
			
		||||
                .setThumbnail((radio.station.logo || "https://cdn.discordapp.com/emojis/" + client.messageEmojis["play"].replace(/[^0-9]+/g, '')))
 | 
			
		||||
                .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { PermissionFlagsBits } from "discord.js";
 | 
			
		||||
const {
 | 
			
		||||
    getVoiceConnection,
 | 
			
		||||
    joinVoiceChannel
 | 
			
		||||
@@ -51,13 +52,13 @@ module.exports = {
 | 
			
		||||
            ephemeral: true
 | 
			
		||||
        });
 | 
			
		||||
        const permissions = voiceChannel.permissionsFor(interaction.client.user);
 | 
			
		||||
        if (!permissions.has("CONNECT")) {
 | 
			
		||||
        if (!permissions.has(PermissionFlagsBits.Connect)) {
 | 
			
		||||
            return interaction.reply({
 | 
			
		||||
                content: client.messageEmojis["error"] + client.messages.noPermsConnect,
 | 
			
		||||
                ephemeral: true
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        if (!permissions.has("SPEAK")) {
 | 
			
		||||
        if (!permissions.has(PermissionFlagsBits.Speak)) {
 | 
			
		||||
            return interaction.reply({
 | 
			
		||||
                content: client.messageEmojis["error"] + client.messages.noPermsSpeak,
 | 
			
		||||
                ephemeral: true
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ module.exports = {
 | 
			
		||||
            radio.textChannel = interaction.channel;
 | 
			
		||||
            radio.startTime = date.getTime();
 | 
			
		||||
 | 
			
		||||
            if(interaction.isCommand()) {
 | 
			
		||||
            if(interaction.isChatInputCommand()) {
 | 
			
		||||
                client.funcs.play(client, interaction, interaction.guild, station);
 | 
			
		||||
            }
 | 
			
		||||
            if(interaction.isButton()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
@@ -26,7 +26,7 @@ module.exports = {
 | 
			
		||||
            statistics = "[Open Dashboard](https://eximiabots.waren.io/radiox/" + interaction.guild.id + "/stats?info=" + Buffer.from(JSON.stringify(currentGuild), 'utf8').toString('base64') + "&globalInfo=" + Buffer.from(JSON.stringify(global), 'utf8').toString('base64') + ")" + "\n";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(client.messages.statisticsTitle)
 | 
			
		||||
            .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["statistics"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'status',
 | 
			
		||||
@@ -10,15 +10,17 @@ module.exports = {
 | 
			
		||||
        message.statusTitle = client.messages.statusTitle.replace("%client.user.username%", client.user.username);
 | 
			
		||||
        let uptime = client.funcs.msToTime(client.uptime);
 | 
			
		||||
 | 
			
		||||
        const embed = new Discord.MessageEmbed()
 | 
			
		||||
        const embed = new EmbedBuilder()
 | 
			
		||||
            .setTitle(message.statusTitle)
 | 
			
		||||
            .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["logo"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
            .setColor(client.config.embedColor)
 | 
			
		||||
            .addField(client.messages.statusField1, uptime, false)
 | 
			
		||||
            .addField(client.messages.statusField2, client.config.version, false)
 | 
			
		||||
            .addField(client.messages.statusField3, Date.now() - interaction.createdTimestamp + "ms", false)
 | 
			
		||||
            .addField(client.messages.statusField4, client.ws.ping + "ms", false)
 | 
			
		||||
            .addField(client.messages.statusField5, client.config.hostedBy, false)
 | 
			
		||||
            .addFields([
 | 
			
		||||
                { name: client.messages.statusField1, value: uptime },
 | 
			
		||||
                { name: client.messages.statusField2, value: client.config.version },
 | 
			
		||||
                { name: client.messages.statusField3, value: Date.now() - interaction.createdTimestamp + "ms" },
 | 
			
		||||
                { name: client.messages.statusField4, value: client.ws.ping },
 | 
			
		||||
                { name: client.messages.statusField5, value: client.config.hostedBy }
 | 
			
		||||
            ])
 | 
			
		||||
            .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png')
 | 
			
		||||
            .setFooter({
 | 
			
		||||
                text: client.messages.footerText,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'stop',
 | 
			
		||||
@@ -11,11 +11,14 @@ module.exports = {
 | 
			
		||||
            radio.connection?.destroy();
 | 
			
		||||
            client.funcs.logger('Radio', interaction.guild.id + " / " + 'Stop');
 | 
			
		||||
 | 
			
		||||
            const embed = new Discord.MessageEmbed()
 | 
			
		||||
            const embed = new EmbedBuilder()
 | 
			
		||||
                .setTitle(client.user.username)
 | 
			
		||||
                .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["stop"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
                .setColor(client.config.embedColor)
 | 
			
		||||
                .addField(client.messages.nowplayingTitle, "-", true)
 | 
			
		||||
                .addFields({
 | 
			
		||||
                    name: client.messages.nowplayingTitle,
 | 
			
		||||
                    value: "-"
 | 
			
		||||
                })
 | 
			
		||||
                .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png')
 | 
			
		||||
                .setFooter({
 | 
			
		||||
                    text: client.messages.footerText,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,18 @@
 | 
			
		||||
import { PermissionFlagsBits } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'interactionCreate',
 | 
			
		||||
    async execute(client, interaction) {
 | 
			
		||||
 | 
			
		||||
        const permissions = interaction.channel.permissionsFor(interaction.client.user);
 | 
			
		||||
        if (!permissions.has('VIEW_CHANNEL')) return;
 | 
			
		||||
        if (!permissions.has(PermissionFlagsBits.ViewChannel)) return;
 | 
			
		||||
 | 
			
		||||
        if (!permissions.has('EMBED_LINKS')) return interaction.reply({
 | 
			
		||||
        if (!permissions.has(PermissionFlagsBits.EmbedLinks)) return interaction.reply({
 | 
			
		||||
            content: client.messageEmojis["error"] + client.messages.noPermsEmbed,
 | 
			
		||||
            ephemeral: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if(interaction.isCommand()){
 | 
			
		||||
        if(interaction.isChatInputCommand()){
 | 
			
		||||
            const commandName = interaction.commandName;
 | 
			
		||||
            const command = client.commands.get(commandName);
 | 
			
		||||
            if (!command) return;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { EmbedBuilder, PermissionFlagsBits } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    name: 'messageCreate',
 | 
			
		||||
    async execute(client, message) {
 | 
			
		||||
@@ -25,13 +26,13 @@ module.exports = {
 | 
			
		||||
        const command = client.commands.get(commandName) || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName));
 | 
			
		||||
        if (!command && message.content !== `${prefix}`) return;
 | 
			
		||||
        const permissions = message.channel.permissionsFor(message.client.user);
 | 
			
		||||
        if (!permissions.has('EMBED_LINKS')) return message.channel.send(client.messages.noPermsEmbed);
 | 
			
		||||
        if (!permissions.has(PermissionFlagsBits.EmbedLinks)) return message.channel.send(client.messages.noPermsEmbed);
 | 
			
		||||
        try {
 | 
			
		||||
            let newMessage = {};
 | 
			
		||||
 | 
			
		||||
            newMessage.messageCommandsDeprecatedTitle = client.messages.messageCommandsDeprecatedTitle.replace("%client.user.username%", client.user.username);
 | 
			
		||||
 | 
			
		||||
            const embed = new Discord.MessageEmbed()
 | 
			
		||||
            const embed = new EmbedBuilder()
 | 
			
		||||
                .setTitle(newMessage.messageCommandsDeprecatedTitle)
 | 
			
		||||
                .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["logo"].replace(/[^0-9]+/g, ''))
 | 
			
		||||
                .setColor(client.config.embedColor)
 | 
			
		||||
 
 | 
			
		||||
@@ -14,11 +14,9 @@ module.exports = {
 | 
			
		||||
        client.funcs.logger('Datastore', 'Initialize');
 | 
			
		||||
        client.datastore = new Datastore();
 | 
			
		||||
 | 
			
		||||
        client.funcs.logger('Datastore');
 | 
			
		||||
        client.datastore.map.forEach(datastore => {
 | 
			
		||||
            console.log("- " + datastore.guild.id + " / " + datastore.guild.name);
 | 
			
		||||
            client.funcs.logger('Datastore', datastore.guild.id + " / " + datastore.guild.name);
 | 
			
		||||
        });
 | 
			
		||||
        console.log("\n");
 | 
			
		||||
 | 
			
		||||
        client.funcs.logger('Datastore', 'Ready');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { PermissionFlagsBits } from "discord.js";
 | 
			
		||||
const {
 | 
			
		||||
    getVoiceConnection,
 | 
			
		||||
    joinVoiceChannel
 | 
			
		||||
@@ -22,7 +23,7 @@ module.exports = {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const newPermissions = newState.channel.permissionsFor(newState.client.user);
 | 
			
		||||
            if (!newPermissions.has("CONNECT") || !newPermissions.has("SPEAK") || !newPermissions.has("VIEW_CHANNEL")) {
 | 
			
		||||
            if (!newPermissions.has(PermissionFlagsBits.Connect) || !newPermissions.has(PermissionFlagsBits.Speak) || !newPermissions.has(PermissionFlagsBits.ViewChannel)) {
 | 
			
		||||
                try {
 | 
			
		||||
                    setTimeout(
 | 
			
		||||
                        async () => (
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
module.exports = function check(client, interaction, command) {
 | 
			
		||||
    let message = {};
 | 
			
		||||
    const radio = client.radio.get(interaction.guild.id);
 | 
			
		||||
    const permissions = interaction.channel.permissionsFor(interaction.user);
 | 
			
		||||
    if(client.config.maintenanceMode){
 | 
			
		||||
        interaction.reply({
 | 
			
		||||
            content: client.messageEmojis["error"] + client.messages.maintenance,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { ActionRowBuilder, SelectMenuBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = function listStations(client, interaction){
 | 
			
		||||
    let stations = new Array();
 | 
			
		||||
@@ -14,9 +14,9 @@ module.exports = function listStations(client, interaction){
 | 
			
		||||
        options.push(station);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    const menu = new Discord.MessageActionRow()
 | 
			
		||||
    const menu = new ActionRowBuilder()
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageSelectMenu()
 | 
			
		||||
            new SelectMenuBuilder()
 | 
			
		||||
                .setCustomId('play')
 | 
			
		||||
                .setPlaceholder('Nothing selected')
 | 
			
		||||
                .addOptions(options)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import Discord from "discord.js";
 | 
			
		||||
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js";
 | 
			
		||||
 | 
			
		||||
module.exports = async function play(client, interaction, guild, station) {
 | 
			
		||||
    let message = {};
 | 
			
		||||
@@ -13,47 +13,50 @@ module.exports = async function play(client, interaction, guild, station) {
 | 
			
		||||
    message.nowplayingDescription = message.nowplayingDescription.replace("**", "");
 | 
			
		||||
    message.nowplayingDescription = message.nowplayingDescription.replace("**", "");
 | 
			
		||||
 | 
			
		||||
    const embed = new Discord.MessageEmbed()
 | 
			
		||||
    const embed = new EmbedBuilder()
 | 
			
		||||
        .setTitle(client.user.username)
 | 
			
		||||
        .setThumbnail((radio.station.logo || "https://cdn.discordapp.com/emojis/" + client.messageEmojis["play"].replace(/[^0-9]+/g, '')))
 | 
			
		||||
        .setColor(client.config.embedColor)
 | 
			
		||||
        .addField(client.messages.nowplayingTitle, message.nowplayingDescription, true)
 | 
			
		||||
        .addFields({
 | 
			
		||||
            name: client.messages.nowplayingTitle,
 | 
			
		||||
            value: message.nowplayingDescription
 | 
			
		||||
        })
 | 
			
		||||
        .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png')
 | 
			
		||||
        .setFooter({
 | 
			
		||||
            text: client.messages.footerText,
 | 
			
		||||
            iconURL: "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    const buttons = new Discord.MessageActionRow()
 | 
			
		||||
    const buttons = new ActionRowBuilder()
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageButton()
 | 
			
		||||
            new ButtonBuilder()
 | 
			
		||||
                .setCustomId('list')
 | 
			
		||||
                .setEmoji(client.messageEmojis["list"])
 | 
			
		||||
                .setStyle('SECONDARY')
 | 
			
		||||
                .setStyle(ButtonStyle.Secondary)
 | 
			
		||||
        )
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageButton()
 | 
			
		||||
            new ButtonBuilder()
 | 
			
		||||
                .setCustomId('prev')
 | 
			
		||||
                .setEmoji(client.messageEmojis["prev"])
 | 
			
		||||
                .setStyle('SECONDARY')
 | 
			
		||||
                .setStyle(ButtonStyle.Secondary)
 | 
			
		||||
        )
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageButton()
 | 
			
		||||
            new ButtonBuilder()
 | 
			
		||||
                .setCustomId('stop')
 | 
			
		||||
                .setEmoji(client.messageEmojis["stop"])
 | 
			
		||||
                .setStyle('SECONDARY')
 | 
			
		||||
                .setStyle(ButtonStyle.Secondary)
 | 
			
		||||
        )
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageButton()
 | 
			
		||||
            new ButtonBuilder()
 | 
			
		||||
                .setCustomId('next')
 | 
			
		||||
                .setEmoji(client.messageEmojis["next"])
 | 
			
		||||
                .setStyle('SECONDARY')
 | 
			
		||||
                .setStyle(ButtonStyle.Secondary)
 | 
			
		||||
        )
 | 
			
		||||
        .addComponents(
 | 
			
		||||
            new Discord.MessageButton()
 | 
			
		||||
            new ButtonBuilder()
 | 
			
		||||
                .setCustomId('statistics')
 | 
			
		||||
                .setEmoji(client.messageEmojis["statistics"])
 | 
			
		||||
                .setStyle('SECONDARY')
 | 
			
		||||
                .setStyle(ButtonStyle.Secondary)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    if(!radio.message){
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user