如何在discord.js中执行循环命令?

时间:2019-10-05 16:04:33

标签: javascript loops discord.js playback

我正在尝试制作一个discord.js机器人来播放音乐并运行循环命令。

由于无法正常工作,我现在一直在尝试使用它。

我的代码:

Server.js

const http = require('http');
const express = require('express');
const app = express();
app.get("/", (request, response) => {
  response.sendStatus(200);
});
app.listen(process.env.PORT);
setInterval(() => {
  http.get(`http://rgrap.glitch.me/`);
}, 280000);

// ßá ÇáÈßÌÇÊ Çáí ããßä ÊÍÊÌåÇ Ýí Çí ÈæÊ 
const { Client, RichEmbed } = require("discord.js");
var { Util } = require('discord.js');
const {TOKEN, YT_API_KEY, prefix, devs} = require('./config')
const client = new Client({ disableEveryone: true})
const ytdl = require("ytdl-core");
const canvas = require("canvas");
const Canvas = require("canvas");
const convert = require("hh-mm-ss")
const fetchVideoInfo = require("youtube-info");
const botversion = require('./package.json').version;
const simpleytapi = require('simple-youtube-api')
const moment = require("moment");
const fs = require('fs');
const util = require("util")
const gif = require("gif-search");
const opus = require("node-opus");
const ms = require("ms");
const jimp = require("jimp");
const { get } = require('snekfetch');
const guild = require('guild');
const dateFormat = require('dateformat');//npm i dateformat
const YouTube = require('simple-youtube-api');
const youtube = new YouTube('AIzaSyAdORXg7UZUo7sePv97JyoDqtQVi3Ll0b8');
const hastebins = require('hastebin-gen');
const getYoutubeID = require('get-youtube-id');
const yt_api_key = "AIzaSyDeoIH0u1e72AtfpwSKKOSy3IPp2UHzqi4";
const pretty = require("pretty-ms");
client.login(TOKEN);
const queue = new Map();
var table = require('table').table
const Discord = require('discord.js');
client.on('ready', () => { 
  console.log(`Logged in as ${client.user.tag}!`);
});


 //ßæÏ ááÊÌÑÈÉ 








/////////////////////////
////////////////////////

client.on('message', async msg =>{
    if (msg.author.bot) return undefined;
    if (!msg.content.startsWith(prefix)) return undefined;

    let args = msg.content.split(' ');

    let command = msg.content.toLowerCase().split(" ")[0];
    command = command.slice(prefix.length)

    if(command === `ping`) {
    let embed = new Discord.RichEmbed()
    .setColor(3447003)
    .setTitle("Pong!!")
    .setDescription(`${client.ping} ms,`)
    .setFooter(`Requested by | ${msg.author.tag}`);
    msg.delete().catch(O_o=>{})
    msg.channel.send(embed);
    }
});
/////////////////////////
////////////////////////
//////////////////////
client.on('message', async msg =>{
    if (msg.author.bot) return undefined;
    if (!msg.content.startsWith(prefix)) return undefined;

    let args = msg.content.split(' ');

    let command = msg.content.toLowerCase().split(" ")[0];
    command = command.slice(prefix.length)

    if(command === `avatar`){
    if(msg.channel.type === 'dm') return msg.channel.send("Nope Nope!! u can't use avatar command in DMs (:")
        let mentions = msg.mentions.members.first()
        if(!mentions) {
          let sicon = msg.author.avatarURL
          let embed = new Discord.RichEmbed()
          .setImage(msg.author.avatarURL)
          .setColor("#5074b3")
          msg.channel.send({embed})
        } else {
          let sicon = mentions.user.avatarURL
          let embed = new Discord.RichEmbed()
          .setColor("#5074b3")
          .setImage(sicon)
          msg.channel.send({embed})
        }
    };
});
/////////////////////////
////////////////////////
//////////////////////
/////////////////////////
////////////////////////
//////////////////////

/////////////////////////
////////////////////////
//////////////////////
/////////////////////////
////////////////////////
//////////////////////
client.on('message', async msg => { 
    if (msg.author.bot) return undefined;
    if (!msg.content.startsWith(prefix)) return undefined;

    const args = msg.content.split(' ');
    const searchString = args.slice(1).join(' ');

    const url = args[1] ? args[1].replace(/<(.+)>/g, '$1') : '';
    const serverQueue = queue.get(msg.guild.id);

    let command = msg.content.toLowerCase().split(" ")[0];
    command = command.slice(prefix.length)

    if (command === `play`) {
        const voiceChannel = msg.member.voiceChannel;

        if (!voiceChannel) return msg.channel.send("انت لم تدخل روم صوتي");

        const permissions = voiceChannel.permissionsFor(msg.client.user);

        if (!permissions.has('CONNECT')) {

            return msg.channel.send("ليست لدي صلاحيات للدخول الى الروم");
        }

        if (!permissions.has('SPEAK')) {

            return msg.channel.send("انا لا يمكنني التكلم ÙÙŠ هاذه الروم");
        }

        if (!permissions.has('EMBED_LINKS')) {

            return msg.channel.sendMessage("انا لا املك صلاحيات ارسال روابط")
        }

        if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) {

            const playlist = await youtube.getPlaylist(url);
            const videos = await playlist.getVideos();


            for (const video of Object.values(videos)) {

                const video2 = await youtube.getVideoByID(video.id); 
                await handleVideo(video2, msg, voiceChannel, true); 
            }
            return msg.channel.send(`**${playlist.title}**, Just added to the queue!`);
        } else {

            try {

                var video = await youtube.getVideo(url);

            } catch (error) {
                try {

                    var videos = await youtube.searchVideos(searchString, 5);
                    let index = 0;
                    const embed1 = new Discord.RichEmbed()
                    .setTitle(":mag_right:  YouTube Search Results :")
                    .setDescription(`
                    ${videos.map(video2 => `${++index}. **${video2.title}**`).join('\n')}`)

                    .setColor("#f7abab")
                    msg.channel.sendEmbed(embed1).then(message =>{message.delete(20000)})

/////////////////                   
                    try {

                        var response = await msg.channel.awaitMessages(msg2 => msg2.content > 0 && msg2.content < 11, {
                            maxMatches: 1,
                            time: 15000,
                            errors: ['time']
                        });
                    } catch (err) {
                        console.error(err);
                        return msg.channel.send('لم يتم اختيار الاغنية');
                    }

                    const videoIndex = parseInt(response.first().content);
                    var video = await youtube.getVideoByID(videos[videoIndex - 1].id);

                } catch (err) {

                    console.error(err);
                    return msg.channel.send("I didn't find any results!");
                }
            }

            return handleVideo(video, msg, voiceChannel);

        }

    } else if (command === `skip`) {

        if (!msg.member.voiceChannel) return msg.channel.send("يجب ان تكون ÙÙŠ روم صوتي");
        if (!serverQueue) return msg.channel.send("ليست هناك اغاني ليتم التخطي");

        serverQueue.connection.dispatcher.end('تم تخطي الاغنية');
        return undefined;

    } else if (command === `stop`) {

        if (!msg.member.voiceChannel) return msg.channel.send("يجب ان تكون ÙÙŠ روم صوتي");
        if (!serverQueue) return msg.channel.send("There is no Queue to stop!!");

        serverQueue.songs = [];
        serverQueue.connection.dispatcher.end('تم ايقا٠الاغنية لقد خرجت من الروم الصوتي');
        return undefined;

    } else if (command === `vol`) {

        if (!msg.member.voiceChannel) return msg.channel.send("يجب ان تكون ÙÙŠ روم صوتي");
        if (!serverQueue) return msg.channel.send('يعمل الامر Ùقط عند تشغيل مقطع صوتي');
        if (!args[1]) return msg.channel.send(`لقد تم تغير درجة الصوت الى**${serverQueue.volume}**`);

        serverQueue.volume = args[1];
        serverQueue.connection.dispatcher.setVolumeLogarithmic(args[1] / 50);

        return msg.channel.send(`درجة الصوت الان**${args[1]}**`);

    } else if (command === `np`) {

        if (!serverQueue) return msg.channel.send('There is no Queue!');
        const embedNP = new Discord.RichEmbed()
        .setDescription(`Now playing **${serverQueue.songs[0].title}**`)
        return msg.channel.sendEmbed(embedNP);

    } else if (command === `queue`) {

        if (!serverQueue) return msg.channel.send('There is no Queue!!');
        let index = 0;
//  //  //
        const embedqu = new Discord.RichEmbed()
        .setTitle("The Queue Songs :")
        .setDescription(`
        ${serverQueue.songs.map(song => `${++index}. **${song.title}**`).join('\n')}
**Now playing :** **${serverQueue.songs[0].title}**`)
        .setColor("#f7abab")
        return msg.channel.sendEmbed(embedqu);
    } else if (command === `pause`) {
        if (serverQueue && serverQueue.playing) {
            serverQueue.playing = false;
            serverQueue.connection.dispatcher.pause();
            return msg.channel.send('تم الايقاÙ');
        }
        return msg.channel.send('ÙÙŠ انتظار تشغيل المقطع');
    } else if (command === "resume") {

        if (serverQueue && !serverQueue.playing) {
            serverQueue.playing = true;
            serverQueue.connection.dispatcher.resume();
            return msg.channel.send('تم التشغيل');

        }
        return msg.channel.send('Queue is empty!');
    }

    return undefined;
});

async function handleVideo(video, msg, voiceChannel, playlist = false) {
    const serverQueue = queue.get(msg.guild.id);
    console.log(video);


    const song = {
        id: video.id,
        title: Util.escapeMarkdown(video.title),
        url: `https://www.youtube.com/watch?v=${video.id}`
    };
    if (!serverQueue) {
        const queueConstruct = {
            textChannel: msg.channel,
            voiceChannel: voiceChannel,
            connection: null,
            songs: [],
            volume: 5,
            playing: true
        };
        queue.set(msg.guild.id, queueConstruct);

        queueConstruct.songs.push(song);

        try {
            var connection = await voiceChannel.join();
            queueConstruct.connection = connection;
            play(msg.guild, queueConstruct.songs[0]);
        } catch (error) {
            console.error(`I could not join the voice channel: ${error}!`);
            queue.delete(msg.guild.id);
            return msg.channel.send(`Can't join this channel: ${error}!`);
        }
    } else {
        serverQueue.songs.push(song);
        console.log(serverQueue.songs);
        if (playlist) return undefined;
        else return msg.channel.send(`**${song.title}**, تمت اضاÙØ© المقطع الى قائمة الانتظار `);
    } 
    return undefined;
}

function play(guild, song) {

    const serverQueue = queue.get(guild.id);

    if (!song) {
        serverQueue.voiceChannel.leave();
        queue.delete(guild.id);
        return;
    }

    console.log(serverQueue.songs);

    const dispatcher = serverQueue.connection.playStream(ytdl(song.url))
        .on('end', reason => {
            if (reason === 'Stream is not generating quickly enough.') console.log('Song ended.');
            else console.log(reason);
            serverQueue.songs.shift();
            play(guild, serverQueue.songs[0]);
        })
        .on('error', error => console.error(error));
    dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);

    serverQueue.textChannel.send(`**${song.title}**, is now playing!`);


}  


client.on('message', message => {
    if (message.content === 'help') {
        let helpEmbed = new Discord.RichEmbed()
        .setTitle('**أوامر الميوزك...**')
        .setDescription('**برÙكس البوت (!)**')
        .addField('play', 'لتشغيل اغنية')
        .addField('join', 'دخول رومك الصوتي')
        .addField('disconnect', 'الخروج من رومك الصوتي')
        .addField('skip', 'تخطي الأغنية')
        .addField('pause', 'ايقا٠الاغنية مؤقتا')
        .addField('resume', 'تكملة الاغنية')
        .addField('queue', 'اظهار قائمة التشغيل')
        .addField('np', 'اظهار الاغنية اللي انت مشغلها حاليا')
        .setFooter('(general_commands) لاظهار الاوامر العامة')
      message.channel.send(helpEmbed);
    }
});

client.on('message', message => {
    if (message.content === 'general_commands') {
        let helpEmbed = new Discord.RichEmbed()
        .setTitle('**أوامر عامة...**')
        .addField('avatar', "اÙاتار الشخص المطلوب")
        .addField('gif', 'البحث عن جي٠انت تطلبه')
        .addField('ping', 'معرÙØ© ping البوت')
        .setFooter('المزيد قريبا ان شاء الله!')
      message.channel.send(helpEmbed);
    }
});

client.on('ready', () => {
   console.log(`----------------`);
      console.log(`Desert Bot- Script By : EX Clan`);
        console.log(`----------------`);
      console.log(`ON ${client.guilds.size} Servers '     Script By : EX Clan ' `);
    console.log(`----------------`);
  console.log(`Logged in as ${client.user.tag}!`);
client.user.setGame(`1play | Last Music`,"http://twitch.tv/Death Shop")
client.user.setStatus("dnd")
});

Package.json

{
  "name": "simple-music",
  "version": "1.0.0",
  "description": "Simple shitty music",
  "main": "server.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Abady321x123/simple-music.git"
  },
  "author": "Abady",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/Abady321x123/simple-music/issues"
  },
  "homepage": "https://github.com/Abady321x123/simple-music#readme",
  "dependencies": {
    "anti-spam": "^0.2.7",
    "array-sort": "^1.0.0",
    "ascii-data-table": "^2.1.1",
    "common-tags": "^1.8.0",
    "math-expression-evaluator": "^1.2.17",
    "canvas": "^2.4.1",
    "fs-nextra": "^0.4.4",
    "canvas-prebuilt": "^1.6.11",
    "cleverbot.io": "^1.0.4",
    "get": "1.4.0",
    "hero": "^0.0.1",
    "steam-search": "^1.0.0",
    "hypixel-api": "1.1.0",
    "name": "^0.0.2",
    "3amyah": "^1.0.0",
    "google-translate-api": "^2.3.0",
    "dateformat": "^3.0.3",
    "discord-anti-spam": "^2.0.0",
    "discord.js": "11.4.2",
    "express": "^4.16.4",
    "ffmpeg": "^0.0.4",
    "better-sqlite-pool": "^0.2.2",
    "guild": "^1.2.2",
    "delay": "^4.1.0",
    "enmap": "^4.8.1",
    "ffmpeg-binaries": "^4.0.0",
    "figlet": "^1.2.1",
    "file-system": "^2.2.2",
    "forever": "^0.15.3",
    "fortnite": "^4.3.2",
    "node-emoji": "^1.10.0",
    "fortnite-api": "^3.2.0",
    "get-youtube-id": "^1.0.1",
    "gif-search": "^2.0.1",
    "giphy-api": "^2.0.1",
    "goo.gl": "^0.1.4",
    "google-it": "^1.1.3",
    "hastebin-gen": "^1.3.1",
    "hh-mm-ss": "^1.2.0",
    "jimp": "^0.6.0",
    "message": "0.0.1",
    "moment": "^2.24.0",
    "ms": "^2.1.1",
    "new": "0.1.1",
    "node-opus": "^0.3.1",
    "npm": "^6.5.0",
    "opusscript": "0.0.6",
    "path": "0.12.7",
    "pretty-ms": "^4.0.0",
    "queue": "^6.0.1",
    "quick.db": "^6.3.2",
    "replace": "^1.1.0",
    "short-number": "^1.0.6",
    "simple-youtube-api": "^5.1.1",
    "sqlite": "^3.0.3",
    "sqlite3": "^4.0.6",
    "stackos": "1.1.0",
    "superagent": "4.1.0",
    "table": "^5.2.2",
    "until": "^0.1.1",
    "ustat": "0.0.2",
    "winston": "^3.2.1",
    "youtube-info": "^1.3.2",
    "ytdl-core": "^0.29.0"
  },
  "scripts": {
    "start": "node server.js"
  }
}

Config.js

module.exports = {
    TOKEN: 'Already In',    
    YT_API_KEY: 'api ', 
    prefix: '!',
    devs: ['Already In']
}

1 个答案:

答案 0 :(得分:0)

所以首先:不要一次使用一个事件!

这会使漫游器非常缓慢并且难以与之通信,在大多数情况下,使用command handler夹是更好的选择,或者只是这样做if else语句:

if(message.content === '!help'){
// code
}
else
if(message.content === '!play'){
// code
}
// etc

第二:包太多。

尝试摆脱一些软件包!您太多了,这使代码真的很难阅读,说实话,如果有人骑完所有代码,我会感到惊讶! +让您的漫游器变慢!

最后:请具体说明

不客气,但我真的不明白您对我们的期望。人们不仅会更正您的代码并将其提供给您,而且我们无法解释此庞大代码所具有的每件事。所以请下次更具体