Making a Discord Bot
(Deprecated)

v0.46 - by 晴☆

Slides.com

就是你現在正在看的簡報網站,按        吧

使用方法

  右下角的箭頭可以換頁,但簡報頁面的排列方式不是網格狀的,而是像很多串投影片,而它會記住使用者在每一串投影片的垂直位置(預設是最上方),所以先往下滑到底看完一個章節,再往右滑至另一個章節吧!

Title A
Title B
Title C
Title D
A1
B1
C1
D1
A2
C2

為什麼要用 

  • 線上方便共用
  • 編輯介面簡單
  • 支援數學嵌入
  • 支援程式嵌入
  • 很容易分章節
  • 看起來就很酷

小提示:

  • 也可以用鍵盤的方向鍵換頁

  • 按 [Esc] 可以看縮圖

  • 回到標題頁可以重置簡報順序

前情提要

Discord 介紹、做機器人的原因與選擇程式語言

什麼是 Discord     ?

一個通訊 / 社群軟體,可以建立伺服器與朋友聊天、互動

特色:

  • 在一個伺服器中,有很多頻道,可以用來分類不同主題的對話
  • 可以分派「身分組 (Roles) 」,給予別人不同的權限
  • 有機器人,機器人可以建立「指令」,從後台接收、回應等等

因為使用 Discord 可以很方便地分享程式碼,建北電資主要就是在 Discord 活動

伺服器

頻道



 

聊天內容


 

這是我

為什麼要做機器人

  • 跟同學聊天時,覺得 Discord 缺少某些功能,可以用機器人做
  • 看到別人做的機器人,很酷,我也想試試看
  • 順便學習寫程式
  • 看起來很帥

機器人

什麼是機器人呢?

我懶得做簡報了怎麼辦

想學的來找我啦

選擇程式語言

以 Python 開發的「Discord.py」

以 Node.js 開發的「Discord.js」

有兩種可以選,但因為我已經會寫 Python 了,所以寫的是 Node.js 的版本

成果

完成的功能與結果

更新

經過幾個月的嘗試,我做了很多隻機器人

每隻有不同的功能,等等會逐一介紹

(除了 Alice II 和牧師.夜謙外,它們是代理運行的,並非我的作品)

註:清星 & 夜謙的頭貼轉載自 QuAn_ 的作品,來源:Pixiv

上官純綾

生活幫手 / 搞笑機器人

特色功能 - 摩斯密碼翻譯:

特色功能 - 笑話:

Luna IV

虛擬金融系統機器人

特色功能 - 猜數字遊戲:

特色功能 - 每日簽到:

潔羽☆

身分組發放系統機器人

特色功能 - 身分組發放 / 領取按鈕:

(按了按鈕以後)

隨從.清星

輔助機器人

特色功能 - 預定時間提醒:

開始寫程式

Node Modules、Client Setup

Node.js

我研究了一下 Node.js,覺得它很像 JavaScript 版本的 Python:

  • 有很多模組包

  • 在終端機運行

  • 使用 JavaScript 編寫

註:JavaScript 的基本語法可以參考這篇文章

Npm

Node.js 所可以使用 Npm 來裝模組:

我需要使用的模板是「Discord.js」,於是安裝它:

> npm install discord.js

這時資料夾中會出現 node_modules 資料夾、package.json & package_lock.json

node_modules 是模組包所需的檔案
package.json & package_lock.json 是列出安裝的模組們

> npm install <package name>
> npm uninstall <package name>

建立機器人

Discord Developer Portal 按 New Application 新增一個應用程式

按 Add Bot 新增一隻機器人

記得幫機器人新增個人資料!

重設它的 Token 然後複製,機器人的 Token 是超級機密,得收好

設定機器人

開啟訊息和成員讀取目的

儲存 Token

機器人得靠 Token 登入,所以程式碼中會需要 Token

root
- token.json
- main.js

新增兩個檔案:

在 token.json 中貼上 Token:

{
	token: "................................."
}

基礎程式

這樣就可以了,執行看看:

// 從 Node Modules 中的 Discord.js 模組讀取必要的東西
const { Client, GatewayIntentBits } = require('discord.js');
// 讀取之前存的機器人 token
const { token } = require('./config.json');

// client 是一個虛擬使用者,目的是「Guild (伺服器)」
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

// 以機器人的 token 登入
client.login(token);

// 機器人上線時的事件
client.on("ready", (client) => {
	console.log(`已將 ${client.use.tag} 從沉睡中喚醒`);
});
> node .\main.js
已將 小藍#0740 從沉睡中喚醒
█

事件

收到訊息會有事件,可以做出回應:

client.on("messageCreate", (message) => {
    if (message.content == "ping")
        message.reply("pong!");
});

收不到事件,因為 intents 太少,改成:

const { 
    Client,
    GatewayIntentBits, 
    Partials
} = require("discord.js");

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ],
    partials: [
        Partials.Message, 
        Partials.Channel
    ],
});

斜線命令

Discord 有內建的交互 Interaction 系統

機器人可以建立指令

註冊命令

reload_slash_command.js

const { REST, SlashCommandBuilder, Routes } = require('discord.js');
const { token } = require("./token.json");

const commands = [
    new SlashCommandBuilder()
        .setName("ping")
        .setDescription("Reply pong.")
];

const rest = new REST({ version: "10" }).setToken(token);

(async () => {
    try {
        console.log("Started refreshing application (/) commands.");

        await rest.put(Routes.applicationCommands("YOUR CLIENT ID HERE"), { body: commands });

        console.log("Successfully reloaded application (/) commands.");
    } catch (error) {
        console.error(error);
    }
})();

Client ID

剛才的程式碼中 "YOUR CLIENT ID HERE" 是機器人用戶的 ID

在 Discord 中,每個使用者都有自己的 ID,怎麼看呢?

到使用者設定

找到「進階」中的「開發者模式」並打開

複製 ID

找到你的機器人,按右鍵

就可以複製 ID 了

測試一下

如果成功的話,斜線命令會長這樣:

基礎都建好了,可以正式開始實作功能了!

計畫

想一下要做什麼功能

還沒結束

之後再繼續做囉!

Discord Bot 筆記

By 晴☆

Discord Bot 筆記

  • 100