[Chuẩn] Tạo một Discord Bot phát nhạc đơn giản bằng Node.js, Typescript và deploy lên Heroku | cách tạo bot nhạc trong discord – Xác minh

cách tạo bot nhạc trong discord: Here is α bài viết related to this topic.

Nội dung này đã outdated, nếu mong muốn tạo Discord music bot mới, vui lòng xem nội dung này

Mở màn

Chắc hẳn tất cả chúng ta đã biết đến Discord. Đây là một nền móng giao tiếp được kiến trúc hướng đến người chơi game, giúp ta có thể gửi sms, ảnh, file, hoặc chuyện trò qua kênh thoại.
Ở trong nội dung này, mình sẽ chỉ dẫn các bạn tạo một con bot có thể phát nhạc trong kênh thoại với các tính năng play, pause, resume, skip, stop, clear, nowplaying.

Bài viết

Tạo bot Discord

Trước tiên, tất cả chúng ta hãy truy cập https://discord.com/developers/applications để tạo một áp dụng cho Discord.

Sau khoảng thời gian tạo áp dụng xong, vào Bot, click “Add Bot” để tạo bot



Click Sao chép để sao chép token của bot. Token này giúp bot đăng nhập với Discord.

Tạo server bot Node.js

Mình sử dụng các packages sau:

  • discord.js: Đây là package của Discord để bot của các bạn có thể login và tương tác với người dùng được.
  • ytdl-core: Dùng để get thông tin video và stream video trên Youtube.
  • ytpl: Dùng để get thông tin và mục lục video của 1 playlist trên Youtube.
  • ytsr: Dùng để tìm kiếm 1 video trên Youtube bằng từ khoá.
  • ffmpeg-static: Hoạt động cùng với ytdl-core để stream audio.
  • dotenv: Dùng để sử dụng với file .env.
  • nodemon: Giúp tất cả chúng ta thuận lợi hơn trong công cuộc dev.

Thiết lập các packages thiết yếu:

yarn add discord.js ytdl-core ytpl ytsr ffmpeg-static dotenv

hoặc

npm ι add discord.js ytdl-core ytpl ytsr ffmpeg-static dotenv --save

yarn add @types/node @types/ws ts-node nodemon typescript -????

hoặc

npm ι @types/node @types/ws ts-node nodemon typescript --save-dev

Tại thời điểm viết bài, phiên bản LTS tiên tiến nhất của Node.js là 14.17.0. Nhưng phiên bản này có 1 vài trục trặc với việc pause/resume của ytdl-core nên mình sẽ sử dụng bản 14.15.4. Thêm dòng sau vào file pagekage.json.

"engines": {
    "node": "14.15.4"
  },

Tạo file tsconfig.json với bài viết sau:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": false,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": [
        "node_modules/*"
      ]
    },
  },
  "include": [
    "src/**/*"
  ]
}

Tạo file tsconfig.json với bài viết sau:

Tạo file nodemon.json với bài viết sau:

{
  "watch": ["src"],
  "ext": "ts,json",
  "ignore": ["src/**/*.spec.ts"],
  "exec": "ts-node ./src/index.ts"
}

Thêm đoạn sau vào package.json.

"main": "dist/index.js",
  "scripts": {
    "dev": "nodemon",
    "build": "tsc",
    "start": "node dist/index.js",
  },

Tạo file .env ở root folder thêm đoạn sau vào file:

TOKEN = <Token mà bạn đã sao chép ở trênvàgt;

Tạo thư mục src và thêm file index.ts:

  import { config } from "dotenv";
  config();
  
  import { Client } from "discord.js";

  const client = new Client();
  const token = process.env.TOKEN;
  const prefix = "!";
  // Đây là tiền tố trước mỗi lệnh mà ta ra hiệu cho bot từ khung chat.
  // Lệnh có dạng như sau "!play Nhạc Đen Vâu", "!pause",...

  client.on("message", (message) => {
    const args = message.content.substring(prefix.length).split(" ");
    const content = message.content.substring(prefix.length + args[0].length);

    if (message.content[0] === "!") {
      switch (args[0]) {
           // Tại đây sẽ đặt các case mà bot cần thực hiện như play, pause, resume,....
      }
    }
  });

  client.on("ready", () => {
    console.log(" ‍♀️ Misabot is online!  ");
  });

  client.once("reconnecting", () => {
    console.log("  Reconnecting!");
  });

  client.once("disconnect", () => {
    console.log("  Disconnect!");
  });
  
    client.login(token);

Tạo thư mục src và thêm file index.ts:

Tạo folder constant trong src chứa file regex.ts. Trong file này có các regex mà ta dùng để test url video hoặc playlist:

export const youtubeVideoRegex = new RegExp(
  /(?:youtube.com/(?:[^/]+/.+/|(?:????|e(?:mbed)?)/|.*[?&]????=)|youtu.be/)([^"&?/s]{11})/
);

export const youtubePlaylistRegex = new RegExp(
  /(?!.*?.*bv=)https://www.youtube.com/.*?.*blist=.*/
);

Tạo folder data trong src có file server.ts như sau:

import { StreamDispatcher } from "discord.js";

import { Resource } from "../services/youtube";

export interface Song {
  requester: string;
  resource: Resource;
}

interface Server {
  [key: string]: {
    playing?: {
      song: Song;
      startedAt: number;
    };
    queue: Song[];
    dispatcher?: StreamDispatcher;
  };
}

export const servers: Server = {};
// Mỗi máy chủ ta tạo trên Discord có 1 Object Server riêng có key là id của dòng sản phẩm chủ đó. 
// Object này sẽ lưu mục lục các bài hát đang chờ được phát "queue".
// Bài hát đang phát "playing".
// Dispatcher quản lí việc stream từ server bot tới Discord.

Tạo foder services trong src có file youtube.ts. Đây là nơi ta tương tác với api Youtube:

import ytsr from "ytsr";
import ytdl from "ytdl-core";
import ytpl from "ytpl";

import { youtubeVideoRegex } from "../constant/regex";

// Tìm video bằng từ khoá và trả về id video nếu tìm ra hoặc trả về sms lỗi.
const searchVideo = (từ khóa: string) => {
  try {
    return ytsr(từ khóa, { pages: 1 })
      .then((result) => {
        const filteredRes = result.items.filter((e) => e.type === "video");
        if (filteredRes.length === 0) throw "  Can't find video!";
        const item = filteredRes[0] as {
          id: string;
        };
        return item.id;
      })
      .catch((error) => {
        throw error;
      });
  } catch (e) {
    throw "❌ Invalid params";
  }
};

// Kết cấu của 1 video mà ta sẽ lưu vào server
export interface Resource {
  title: string;
  length: number;
  author: string;
  thumbnail: string;
  url: string;
}

// Lấy thông tin của 1 video bằng bài viết truyền vào. URL hoặc từ khoá
export const getVideoDetails = async (content: string): Promisevàlt;Resourcevàgt; => {
  const parsedContent = content.match(youtubeVideoRegex);
  let id = "";

  if (!parsedContent) {
    id = await searchVideo(content);
  } else {
    id = parsedContent[1];
  }
  const url = `https://www.youtube.com/watch?v=${id}`;

  return ytdl
    .getInfo(url)
    .then((result) => {
      return {
        title: result.videoDetails.title,
        length: parseInt(result.videoDetails.lengthSeconds, 10),
        author: result.videoDetails.author.name,
        thumbnail:
          result.videoDetails.thumbnails[
            result.videoDetails.thumbnails.length - 1
          ].url,
        url,
      };
    })
    .catch(() => {
      throw "❌ Error";
    });
};

interface Playlist {
  title: string;
  thumbnail: string;
  author: string;
  resources: Resource[];
}
// Lấy mục lục video và thông tin 1 playlist
export const getPlaylist = async (url: string): Promisevàlt;Playlistvàgt; => {
  try {
    const id = url.split("?")[1].split("=")[1];
    const playlist = await ytpl(id);

    const resources: Resource[] = [];
    playlist.items.forEach((item) => {
      resources.push({
        title: item.title,
        thumbnail: item.bestThumbnail.url,
        author: item.author.name,
        url: item.shortUrl,
        length: item.durationSec,
      });
    });

    return {
      title: playlist.title,
      thumbnail: playlist.bestThumbnail.url,
      author: playlist.author.name,
      resources,
    };
  } catch (e) {
    throw "❌ Invalid playlist!";
  }
};

Tạo folder utils trong src chứa file time.ts:

// Fomat thời gian video từ giây sang dạng mm:ss
// Chẳng hạn. 70s -> 01:10
export const formatTimeRange = (timeRange: number): string => {
  const mins = Math.floor(timeRange / 60);
  const seconds = timeRange - hours * 60;

  return `${mins < 10 ? "0" + mins : mins}:${seconds < 10 ? "0" + seconds : seconds}`;
};

Tạo folder actions trong src . Tại đây ta sẽ tạo các actions để giải quyết các tác vụ như play, pause,… Ta tạo các file với bài viết lần lượt như sau:

  • actions/play.ts
import { Message, VoiceConnection, MessageEmbed } from "discord.js";
import ytdl from "ytdl-core";

import { servers } from "../data/server";
import { getVideoDetails, getPlaylist } from "../services/youtube";
import { formatTimeRange } from "../utils/time";
import { youtubePlaylistRegex } from "../constant/regex";

// Phụ trách stream nhạc và chuyển bài khi chấm dứt
const play = (connection: VoiceConnection, message: Message) => {
  const server = servers[message.guild.id];
  const song = server.queue[0];
  server.playing = {
    song,
    startedAt: new Date().getTime(),
  };

  server.dispatcher = connection.play(
    ytdl(song.resource.url, { filter: "audioonly" })
  );
  server.queue.shift();
  // Phát hiện việc bài hát chấm dứt
  server.dispatcher.on("finish", () => {
    if (server.queue[0]) play(connection, message);
    else {
      server.playing = null;
      server.queue = [];
      connection.disconnect();
    }
  });
};

export default {
  name: "play",
  execute: (message: Message, content: string): void => {
    if (!content)
      message.channel.send(
        "❌ You need to provide an Youtube URL or name of videonn✅ Ex: !play Shape of You"
      );
    else if (!message.thành viên.voice.channel)
      message.channel.send("❌ You must be in a voice channel!");
    else {
      if (!servers[message.guild.id])
        servers[message.guild.id] = {
          queue: [],
        };
      const server = servers[message.guild.id];

      const paths = content.match(youtubePlaylistRegex);
      if (paths) {
        getPlaylist(paths[0])
          .then((result) => {
            const resources = result.resources;
            resources.forEach((resource) => {
              server.queue.push({
                requester: message.thành viên.displayName,
                resource: resource,
              });
            });

            const messageEmbed = new MessageEmbed()
              .setColor("#0099ff")
              .setTitle(result.title)
              .setAuthor(
                `Add playlist to order by ${message.thành viên.displayName}`
              )
              .setThumbnail(result.thumbnail)
              .addFields(
                { name: "Author", value: result.author, inline: true },
                {
                  name: "Video count",
                  value: resources.length,
                  inline: true,
                }
              );

            message.channel.send(messageEmbed).then(() => {
              if (!message.guild.voice)
                message.thành viên.voice.channel.join().then((connection) => {
                  play(connection, message);
                });
              else if (!message.guild.voice.connection) {
                message.thành viên.voice.channel.join().then((connection) => {
                  play(connection, message);
                });
              }
            });
          })
          .catch((e) => {
            message.channel.send(JSON.stringify(e));
          });
      } else
        getVideoDetails(content)
          .then((result) => {
            server.queue.push({
              requester: message.thành viên.displayName,
              resource: result,
            });
            const messageEmbed = new MessageEmbed()
              .setColor("#0099ff")
              .setTitle(result.title)
              .setAuthor(`Add to order by ${message.thành viên.displayName}`)
              .setThumbnail(result.thumbnail)
              .addFields(
                { name: "Channel", value: result.author, inline: true },
                {
                  name: "Length",
                  value: formatTimeRange(result.length),
                  inline: true,
                }
              )
              .addField("Position in order", server.queue.length, true);

            message.channel.send(messageEmbed).then(() => {
              if (!message.guild.voice)
                message.thành viên.voice.channel.join().then((connection) => {
                  play(connection, message);
                });
              else if (!message.guild.voice.connection) {
                message.thành viên.voice.channel.join().then((connection) => {
                  play(connection, message);
                });
              }
            });
          })
          .catch((e) => {
            message.channel.send(JSON.stringify(e));
          });
    }
  },
};

  • actions/skip.ts
import { Message, MessageEmbed } from "discord.js";

import { formatTimeRange } from "../utils/time";
import { servers } from "../data/server";

export default {
  name: "skip",
  execute: (message: Message): void => {
    const server = servers[message.guild.id];
    if (server) {
      if (server.dispatcher) {
        if (server.queue.length === 0) {
          server.dispatcher.end();
          server.playing = null;
          message.channel.send("❌ Nothing to skip!");
        } else {
          const song = server.queue[0];
          const messageEmbed = new MessageEmbed()
            .setColor("#0099ff")
            .setTitle(song.resource.title)
            .setAuthor(`Skipped by ${message.thành viên.displayName}`)
            .setThumbnail(song.resource.thumbnail)
            .addFields(
              { name: "Channel", value: song.resource.author, inline: true },
              {
                name: "Length",
                value: formatTimeRange(song.resource.length),
                inline: true,
              }
            )

          message.channel
            .send(messageEmbed)
            .then(() => server.dispatcher.end());
        }
      } else message.channel.send("❌ Nothing to skip!");
    } else {
      message.channel.send("❌ Nothing to skip!");
    }
  },
};

  • actions/pause.ts
import { Message } from "discord.js";

import { servers } from "../data/server";

export default {
  name: "pause",
  execute: (message: Message): void => {
    const server = servers[message.guild.id];
    if (server) {
      if (server.dispatcher && server.playing) {
        message.channel.send("⏸ Paused").then(() => server.dispatcher.pause());
      }
    } else message.channel.send("❌ Nothing to pause!");
  },
};

* actions/resume.ts

import { Message } from "discord.js";

import { servers } from "../data/server";

export default {
  name: "resume",
  execute: (message: Message): void => {
    const server = servers[message.guild.id];
    if (server) {
      if (server.dispatcher && server.playing) {
        server.dispatcher.resume();
        message.channel.send("⏯ Resume");
      } else message.channel.send("❌ Nothing to resume!");
    } else message.channel.send("❌ Nothing to resume!");
  },
};

  • actions/nowplaying.ts
import { Message, MessageEmbed } from "discord.js";

import { formatTimeRange } from "../utils/time";
import { servers } from "../data/server";

export default {
  name: ["nowplaying"],
  execute: (message: Message): void => {
    const server = servers[message.guild.id];
    if (server) {
      if (!server.playing) {
        message.channel.send("❌ Nothing is played now!");
      } else {
        const song = server.playing.song;
        const messageEmbed = new MessageEmbed()
          .setColor("#0099ff")
          .setTitle(song.resource.title)
          .setAuthor(`Playing   `)
          .setThumbnail(song.resource.thumbnail)
          .addFields(
            { name: "Channel", value: song.resource.author, inline: true },
            {
              name: "Length",
              value: formatTimeRange(song.resource.length),
              inline: true,
            }
          )
        message.channel.send(messageEmbed);
      }
    } else {
      message.channel.send("❌ Nothing is played now!");
    }
  },
};

* actions/stop.ts

// Dừng phát nhạc và rời khỏi kênh thoại
import { Message } from "discord.js";

import { servers } from "../data/server";

export default {
  name: "stop",
  execute: (message: Message): void => {
    const server = servers[message.guild.id];

    if (message.guild.voice) {
      if (server) {
        if (server.dispatcher) {
          for (let ι = server.queue.length - 1; ι >= 0; i--) {
            server.queue.splice(ι, 1);
          }
          server.playing = null;
          server.dispatcher.end();
          message.channel.send("Ending and leave voice channel!");
        }
      } else message.channel.send("❌ Nothing to stop!");
      if (message.guild.voice.connection)
        message.guild.voice.connection.disconnect();
    } else message.channel.send("❌ Nothing to stop!");
  },
};

* actions/clear.ts

// Xoá toàn thể danh sách video đang đợi phát
import { Message } from "discord.js";

import { servers } from "../data/server";

export default {
  name: "clear",
  execute: (message: Message): void => {
    const server = servers[message.guild.id];
    if (server) {
      server.queue = [];
      message.channel.send("  Cleaned ordered list!");
    } else {
      message.channel.send("❌ Nothing to clear!");
    }
  },
};

Thêm các actions vừa tạo vào file index.ts

  import { config } from "dotenv";
  config();
  
  import { Client } from "discord.js";
  import play from "./actions/play";
  import skip from "./actions/skip";
  import nowplaying from "./actions/nowplaying";
  import pause from "./actions/pause";
  import resume from "./actions/resume";
  import stop from "./actions/stop";
  import clear from "./actions/clear";

  const client = new Client();
  const token = process.env.TOKEN;
  const prefix = "!";
  // Đây là tiền tố trước mỗi lệnh mà ta ra hiệu cho bot từ khung chat.
  // Lệnh có dạng như sau "!play Nhạc Đen Vâu", "!pause",...

  client.on("message", (message) => {
    const args = message.content.substring(prefix.length).split(" ");
    const content = message.content.substring(prefix.length + args[0].length);

    if (message.content[0] === "!") {
      switch (args[0]) {
           // Tại đây sẽ đặt các case mà bot cần thực hiện như play, pause, resume,....
        case play.name:
           play.execute(message, content);
           break;
        case skip.name:
          skip.execute(message);
          break;
        case nowplaying.name.toString():
          nowplaying.execute(message);
          break;
        case pause.name:
          pause.execute(message);
          break;
        case resume.name:
          resume.execute(message);
          break;
        case stop.name:
          stop.execute(message);
          break;
        case clear.name:
          clear.execute(message);
          break;
      }
    }
  });

  client.on("ready", () => {
    console.log(" ‍♀️ Misabot is online!  ");
  });

  client.once("reconnecting", () => {
    console.log("  Reconnecting!");
  });

  client.once("disconnect", () => {
    console.log("  Disconnect!");
  });
  
    client.login(token);

Đến đây, bot của các bạn đã có thể chạy rồi đó .

Chạy yarn dev hoặc npm run dev để start dev server.

Xem Thêm  Wave Alpha 110 – Phiên bản Giới Hạn – Đỏ Đen - xe wave đỏ đen

* actions/resume.ts* actions/stop.ts* actions/clear.tsThêm các actions vừa tạo vào file index.tsĐến đây, bot của các bạn đã có thể chạy rồi đó .Chạy yarn dev hoặc npm run dev để start dev server.

Truy cập lại vào app bạn tạo trên Discord tại https://discord.com/developers/applications. Click OAuth2.

Tick vào bot và họn các quyền như hình dưới.

Click Sao chép để sao chép backlink mời bot vào máy chủ. Mời bot và máy chủ và demo thôi .

Deploy lên Heroku

Tạo 1 website đơn giản chứa đường dẫn mời bot đến máy chủ và gắn vào bot bằng express (optional). Cái này mình không hướng dẫ bước này. Bạn nào thích thì có thể làm thêm.
Install 1 vài package sau.
yarn add express heroku-awake

hoặc

npm ι express heroku-awake --save

heroku-awake giúp server không bị sleep.

yarn add @types/express -????

hoặc

npm ι @types/express --save-dev

Sửa lại file index.ts như sau

  import express from "express";
  import herokuAwake from "heroku-awake";
  import { Client } from "discord.js";
  import play from "./actions/play";
  import skip from "./actions/skip";
  import nowplaying from "./actions/nowplaying";
  import pause from "./actions/pause";
  import resume from "./actions/resume";
  import stop from "./actions/stop";
  import clear from "./actions/clear";

  const port = process.env.PORT || 3000;
  const server = express();
  const url = ""; // Đường dẫn của app bạn trên Heroku

  const bot = (): void => {
  const client = new Client();
  const token = process.env.TOKEN;

  client.on("message", (message) => {
    const args = message.content.substring(prefix.length).split(" ");
    const content = message.content.substring(prefix.length + args[0].length);

    if (message.content[0] === "!") {
      switch (args[0]) {
        case play.name:
          play.execute(message, content);
          break;
        case skip.name:
          skip.execute(message);
          break;
        case nowplaying.name.toString():
          nowplaying.execute(message);
          break;
        case pause.name:
          pause.execute(message);
          break;
        case resume.name:
          resume.execute(message);
          break;
        case stop.name:
          stop.execute(message);
          break;
        case clear.name:
          clear.execute(message);
          break;
        // More short command
        case "np":
          nowplaying.execute(message);
          break;
        case "fs":
          skip.execute(message);
          break;
      }
    }
  });

  client.on("ready", () => {
    console.log(" ‍♀️ Misabot is online!  ");
  });

  client.once("reconnecting", () => {
    console.log("  Reconnecting!");
  });

  client.once("disconnect", () => {
    console.log("  Disconnect!");
  });
  
    client.login(token);
};

server.disable('Ҳ-powered-by');

server.listen(port, () => {
  bot();
  herokuAwake(url);
  console.log(`  Server is running on port ${port} ✨`);
});

Truy cập https://devcenter.heroku.com/articles/heroku-cli để setup heroku-cli nếu bạn chưa có.

Xem Thêm  REVIEW TRUYỆN "GỤC TRƯỚC DỊU DÀNG" - gục trước dịu dàng

Truy cập tiếp https://dashboard.heroku.com/apps để tạo áp dụng mới.

Click tab Settings và thêm biến môi trường của các bạn vào đây

Chạy lần lượt các câu lệnh sau để deploy áp dụng của các bạn.

$ heroku login
$ cd my-project/
$ git init
$ heroku git:remote -a <tên áp dụng của các bạnvàgt;
$ git add .
$ git commit -am "make it better"
$ git push heroku master

Kết luận

Chạy lần lượt các câu lệnh sau để deploy áp dụng của các bạn.

Trên đây là cách tạo 1 bot Discord để phát nhạc trong Discord với các tính năng:

  • play: phát 1 bài nhạc theo tên hoặc url Youtube, thêm nhạc vào mục lục chờ bằng url playlist.
  • pause, resume: Dừng và tiếp tục.
  • clear: Xoá mục lục phát đang chờ.
  • stop: Dừng phát và rời khỏi kênh thoại.
  • skip: Bỏ qua bài hát giờ đây
  • nowplaying: Lấy thông tin bài hát đang phát.

Trong code có gì sơ suất mong mọi người cảm thông.

Xem qua

Github repository

Dùng thử on Heroku

chú ý: Tài nguyên trên Heroku khá ít và server đặt tại châu Âu nên bot join nhiều server hoặc mạng internet của chúng ta kém thì bot khá lag.


CÁCH TẠO BOT DISCORD SIÊU ĐƠN GIẢN


Website để tạo bot : https://botghost.com

Đừng quên Like u0026 Subscribe
Backlink donate : https://playerduo.com/arntohehe2509
Discord : https://discord.gg/KjCx87qVzk
Contact : votruongtoan2509@gmail.com

My cấu hình :
⚡️Main H510M PROE
⚡️Hãng Intel Core I3 10105F
⚡️Bộ nhớ đệm DDR4 16GB (8×2) 2400MHz
⚡️VGA GeForce® GTX 1050TI 4GB
Tag : ArnTo DiscordBot

Xem Thêm  Lịch thi đấu và trực tiếp bóng đá Ngoại hạng Anh vòng 29 - lịch bóng đá anh

In addition to looking at this article You can also see other useful information. Many more we provide here: See more knowledge here.

CÁCH TẠO BOT DISCORD SIÊU ĐƠN GIẢN

1 cách để tạo bot phát nhạc trong discord


Nhớ sub cho mk nha.

1 cách để tạo bot phát nhạc trong discord

Chỉ dẫn cách thiết lập con bot MEE6 trên Discord.


Discord bot shop : https://top.gg/
MEE6 website : https://mee6.xyz/dashboard
Backlink Discord : https://discord.gg/WeEWggq83G
Backlink con trỏ chuột
https://discord.gg/BbtnKvF9yA
Breeze Hacked

Trắng : https://www.deviantart.com/enryuu/art/BreezeHackedWhite764366005
Xanh Lá :https://www.deviantart.com/enryuu/art/BreezeHackedGreen764346472
Đỏ : https://www.deviantart.com/enryuu/art/BreezeHackedRedWindowsCursor764333906
Xanh da trời : https://www.deviantart.com/enryuu/art/BreezeHackedCursorForWindows752551821
Game

Liên Minh : https://www.deviantart.com/cyberdyne12489/art/LeagueofLegendsCursorSet200888286
Khác…

Chroma : https://www.mediafire.com/file/m26mn9qog6m39zw/Chroma_Cursor_by_Zuya.rar/file
Các bạn nhớ ủng hộ mình để mình có động lực làm video tiếp nhé!

Hướng dẫn cách setup con bot MEE6 trên Discord.

Chỉ dẫn Discord – Tạo server, thêm nhạc, thêm chức phận, thêm icon/emoji vui


Hellu~
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Mình là Dũng ✔
Chơi nhiều loại game không thích hợp cho cánh mày râu có bầu và em bé đang cho con bú… ☠
Nếu thích thì bấm nút thích còn ko thích thì cũng đừng bấm ko thích ツ
Cảm ơn và chúc bạn có những giây phút thư giãn ♫
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Fb: https://www.facebook.com/DSniperVN
Mua game giá thành rẻ và uy tín: https://www.facebook.com/PriceSonicGa…
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Trong video này mình sẽ chỉ dẫn các bạn tạo server discord riêng của mình, song song thêm những chức năng khiến cho server trở nên sinh động và vui vẽ hơn như là: Thêm màu nickname cho từng người, mở nhạc cho mọi người cùng nghe, thêm những emoji khôi hài…
Backlink thêm BOT mở nhạc: https://fredboat.com/
Backlink sưu tầm những icon của mình cho những ai thích:
https://www.mediafire.com/folder/v6ul1k8uecw6d/emoji
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
1:25 : Tạo server
2:50 : Thêm nhạc
5:42 : Thêm màu và chức phận
9:25 : Thêm icon/emoji riêng cho server
Câu lệnh đơn giản cho BOT nhạc:
;;play ( tên bài hát ) [ BOT sẽ lên youtube tìm 5 bài nhạc với tên đó ]
;;play ( số 1 đến 5 ) [ BOT sẽ chạy bài nhạc theo số bạn chọn ]
;;skip [ Bỏ qua bài nhạc đang chạy ]
;;leave [ BOT sẽ về nhà đắp chiếu ngủ ]

▬▬▬▬▬▬▬▬▬▬▬▬Nhạc▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Disfigure Blank VIP (feat. Tara Louise) [NCS Release]
https://www.youtube.com/watch?v=j5DCb1ycXyA
https://www.facebook.com/taralouisemusic1/
https://soundcloud.com/taralouise
https://www.youtube.com/user/Taraandmusic

Hướng dẫn Discord - Tạo server, thêm nhạc, thêm chức vụ, thêm icon/emoji vui

Hướng Dẫn Thêm Bot + Thêm Vai Trò Trong Discord


Video Này Bắt Buộc NaH Phải Xem Nhá

Hướng Dẫn Thêm Bot + Thêm Vai Trò Trong Discord

In addition to looking at this article You can also see other useful information. Many more we provide here: See other waysthu-thuat-cong-nghe/

Thank you very much for viewing the bài viết topic. cách tạo bot nhạc trong discord

Trả lời