---
tags: Minecraft,Plugins
title: DiscordSRV進階教學(版本已經過時)
author: Youzi#0753(856918496893599805)
---
# 插件:DiscordSRV進階教學(版本已經過時)
###### tags: `Minecraft` `Plugins`
> 由 <img src="https://images-ext-2.discordapp.net/external/ERVAyNrVJfgmbzcYNcPC95Ynrq1SQ3V1TRVFAkezM5Y/https/cdn.discordapp.com/avatars/856918496893599805/89d9fe477d93364a8d8a7ad3e88fba0b.png?width=20&height=20">**Youzi#0753** 撰寫
支援伺服器:[<img src="https://discordapp.com/api/guilds/540630552609554453/widget.png?style=shield" alt="">](https://discord.gg/Vq3F8DUNzf)
:::warning
如果不知道什麼是插件,請上網Google搜尋!
:::
:::warning
請先看過[這篇文章](https://hackmd.io/@Youzi/BJgW5dBv-K)再來看此篇文章,以免你不知道這裡在說啥!
:::
:::danger
這裡的絕大多東西都需要用到變數!詳情請參閱下面的基本進階常識!
ㄖ
:::
---
## DiscordSRV 進階教學
> 我們將會分成好幾個章節來說明相關檔案!
> 在此我也建議你可以直接看[DiscordSrv FAQ](https://docs.discordsrv.com/FAQ/)!
>
:::info
### 基本進階常識
- [ ] 1. Placeholder (變數)
- [ ] 2. Event (事件)
- [ ] 3. linkedaccounts.json 的相關事項
### DiscordSRV
- [ ] 3. Config.yml 進階設定
- [ ] 4. Messages.yml 進階技巧
- [ ] 5. Linking.yml 的設定技巧
- [ ] 6. Synchronization.yml 權限同步系統設定
- [ ] 7. voice.yml 語音同步系統設定
- [ ] 8. alerts.yml 警報系統設定
- [ ] 9. 與權限插件的互通方式
:::
---
# 基本進階常識
---
## 1. Placeholder
> 之前曾將講過Placeholder可以用在 記分板、TAB玩家列表、甚至是替換命令裡面,就像是`${變數}`一樣,只是我們在這裡都是使用`%變數%`喔!
圖為Player的相關變數
:::warning
你要先知道 如何[安裝 PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) 並且裝上 [Player](https://api.extendedclip.com/expansions/player/)以及[Server](https://api.extendedclip.com/expansions/server/),否則將在後面的內容中會有問題!
安裝方式:
依序輸入命令
1. `/papi ecloud download Player`
2. `/papi ecloud download Server`
3. `/papi reload`
即可完成
:::
像是想要取得特定人士變數的方式:
* `%player_ping_<playername>%`的`<playername>` 裡面可以填入任何玩家名稱
> 例如取得Him的Ping連線延遲`%player_ping_Him%`
* 如果玩家離線了話,該變數將會傳回`0`或是`-1`(代表錯誤)
> 但是如果你發現Him的Ping連線不為0或-1,那可能顯靈了(?
> 另外,DiscordSrv也有他有自己的佔位符喔
---
## 2. Event 觸發事件
> 主要所有的 事件點 **幾乎都會** 在[這裡](https://hub.spigotmc.org/javadocs/bukkit/)找得到,不要看全部都是文字就放棄!
圖為網站內容
觸發事件位在 `event/package-summary.html`,用`org.bukkit.event`即可搜尋得到

點開來,大概長這樣:
我們接下來的都是要說Event.Player的東西,其他的可以自行研究喔owob
---
# DiscordSRV
---
## 3. Config.yml 進階設定
> 這裡有很多很有趣的進階設定喔!
#### 1. 聊天頻道(基本上都講過了,所以部分省略!)
> 語法為
> `Channels: {"來自 Minecraft 的遊戲內頻道名稱": "來自 Discord 的數字頻道 ID", "來自我的世界的另一個遊戲內頻道名稱": "來自 Discord 的另一個數字頻道 ID"}`
> 另外,當使用兼容的聊天插件時,頻道名稱將來自該插件(用於聊天消息)
##### 沒裝插件可用的
> 用於玩家聊天消息(不使用聊天插件時):`global`
```yaml=29
Channels: {"global": "853858789803032627"}
```
(如果只有設置global了話將會讓以下的訊息集中於global)
對於服務器啟動/停止消息:`status`
成就/進步信息:`awards`
死亡信息:`deaths`
加入消息:`join`
用於留言:`leave`
用於 dynmap 消息:`dynmap`
看門狗消息:`watchdog`
用於 /discord broadcast:`broadcasts`(除非在命令中指定)
(如果只有設置global了話將會讓以上的訊息集中於global)
##### 有裝插件可以這樣用:
> 前提是要設定聊天插件的頻道名稱,將頻道名稱填入下方的前項:
```yaml=29
Channels: {"一般": "853858789803032627", "服主": "852424633332400158", "管理員": "889026667526361119", "公告": "885156074586517525"}
```
#### 2. AvatarUrl 玩家頭像
> 玩家的頭像可以自訂化,
> 預設為平面的:
> `https://crafatar.com/avatars/{uuid-nodashes}&overlay`
> 離線服務器的替代嵌入頭像網網址(平面):
> `https://cravatar.eu/helmavatar/{username}/{size}.png#{texture}`
> 你可以用成立體的:
```yaml=88
AvatarUrl: https://crafatar.com/renders/head/{uuid-nodashes}.png?size=1&overlay#true
```
#### 3. DiscordGameStatus 機器人狀態
> 連這都可以個人化喔!
> 也支援 Placeholder !
:::warning
注意:伺服器剛啟動時,因為DiscordSrv會比Placeholder較早啟用,狀態中的變數還沒啟動,所以只要等待重新刷新之後即可恢復正常!此為正常現象,目前無解決辦法!
:::
:::danger
需要[`EnablePresenceInformation`](https://config.discordsrv.com/config/EnablePresenceInformation)啟用才能使用以下這些佔位符:
```
%discordsrv_guild_owner_game_name%
%discordsrv_guild_owner_game_url%
%discordsrv_guild_members_online%
%discordsrv_linked_online%
%discordsrv_user_online_status%
%discordsrv_user_game_name%
%discordsrv_user_game_url%
```
請注意,要使用這些佔位符,您需要使用 Discord 開發人員門戶在您的機器人上啟用 [存取成員、伺服器的意圖](https://docs.discordsrv.com/Installation/#enable-server-members-intent)!
:::
範例:(每兩分鐘隨機顯示一個狀態)
```yaml=128
DiscordGameStatus: ["playing 伺服器位置 (Minecraft Java %server_version%)", "watching %discordsrv_guild_owner_nickname%正在玩%discordsrv_guild_owner_game_name%?", "listening to %discordsrv_guild_name% - %discordsrv_guild_members_total% 個成員", "watching %discordsrv_guild_name%目前上線(%discordsrv_guild_members_online%/%discordsrv_guild_members_total%)", "playing %discordsrv_guild_owner_nickname% 的伺服器控制台"]
StatusUpdateRateInMinutes: 2
```
這是結果(系統會隨機選擇一個):
```tiddlywiki=1
正在玩 伺服器位置(Minecraft Java 1.18.1)
正在看 柚子Youzi正在玩Minecraft?
正在聽 Discord伺服器-9999個成員
正在看 Discord伺服器目前上線(1617/9999)
正在玩 柚子Youzi 的伺服器控制台
```
#### 4. DiscordChatChannelRoles Discord聊天身分組顯示
> 不是在Discord裡面輸入的訊息會傳送到Minecraft裡面會長的格式像是"\[Discord \| 身分組\]成員名稱"嗎?
> 預設是最高身分組,但是有些伺服器的最高身分組是"自訂顏色"、"最高管理權限"等不在Discord的成員列表中分開,所以,可以利用以下的東西來限定Discordsrv取得的身分組!
>
> DiscordChatChannelRolesSelectionAsWhitelist
> 指的是將身分組的忽略變成白名單(將只會讀取以下身分組)或是黑名單(除了以下身分組以外其他都讀取)
> DiscordChatChannelRolesSelection
> 配合上面的
> DiscordChatChannelRoleAliases
> 你覺得在Discord裡面的身分組字串太長了? 可以利用這個來將
> "最帥最猛的服主" 改成 "服主"!
```yaml=165
DiscordChatChannelRolesSelectionAsWhitelist: true
DiscordChatChannelRolesSelection: ["Minecraft|服主", "Minecraft|副服主", "Minecraft|管理員", "⚜|實況主 Youtuber", "Minecraft|一般玩家"]
DiscordChatChannelRoleAliases: [{"Minecraft|服主": "服主"},{"Minecraft|副服主": "副服主"},{"Minecraft|管理員": "管理員"},{"⚜|實況主 Youtuber": "Youtuber"},{"Minecraft|一般玩家": "玩家"}]
```
#### 5. DiscordCannedResponses 指令回饋
> 當你使用`!ip`的時候他會跳出:你的伺服器位置
> DiscordCannedResponses 可以添加更多命令!
例如:當你開頭包含"早安",機器人就會說:"早安!"
```yaml=255
DiscordCannedResponses: {"!ip": "我們的伺服器位置為:**伺服器位置**(Java %server_version%)", "!website": "以下為我們的官方網站:\n**你的官方網站網址**", "!version":"我們使用%server_version%!", "早安":"早安!", "晚安":"晚安!", "@伺服器機器人#2099":"怎麼了?", "bot":"找我做啥owo?", "help":"我會見死不救awa(X",}
```
#### 6. DiscordLinked 綁定
> 當你使用`/discord link`或是`/discord unlink`的時候,將會對你的Discord帳號變更身分組!
>
> MinecraftDiscordAccount(Un)LinkedConsoleCommands
> 當你觸發了連接/取消連接的命令時,DiscordSrv會執行甚麼命令
> (例如:\[需要Player變數\]給予完成綁定者(`%minecraftplayername%`)$1000的遊戲幣
> MinecraftDiscordAccountLinkedRoleNameToAddUserTo
> DiscordSrv會給予甚麼身分組來表示該成員已綁定Discord(!使用身分組名稱!)
```yaml=274
MinecraftDiscordAccountLinkedConsoleCommands: ["eco give %minecraftplayername% 1000", "msg %minecraftplayername% 你好owo!", ""]
MinecraftDiscordAccountUnlinkedConsoleCommands: ["eco remove %minecraftplayername% 1000", "", ""]
MinecraftDiscordAccountLinkedRoleNameToAddUserTo: "Minecraft|已綁定Discord"
MinecraftDiscordAccountLinkedAllowRelinkBySendingANewCode: true
```
---
## 4. Messages.yml 進階技巧
> 實際上這裡的東西全部都可自訂化...但是就看你的表現如何了!
### 1. DiscordConsoleChannelFormat
> 控制台的訊息格式,一般來說大家都會覺得控制台好凌亂,看的眼花撩亂,不宜久視,如果將控制台的發送格式改掉,就可以呵護你的眼睛!
```yaml=136
DiscordConsoleChannelFormat: "```yml\n[ %datetime% | %level% ]\n``` %line%"
```
效果長這樣:
:::spoiler

現在:

原來:

:::
### 2. DiscordChatChannelListCommand
> 什麼?這也可以改???
>
> DiscordChatChannelListCommandAllPlayersSeparator
> 要用什麼符號分開,預設是" , ",我這邊的"\n"是換下一行!
```yaml=167
DiscordChatChannelListCommandFormatOnlinePlayers: "**玩家列表 (%playercount%):**"
DiscordChatChannelListCommandFormatNoOnlinePlayers: "**很抱歉,沒有上線的玩家 :/ **"
DiscordChatChannelListCommandPlayerFormat: "[ %world% ] %displayname% " # %primarygroup%
DiscordChatChannelListCommandAllPlayersSeparator: "\n"
```
這是效果

### 3. ChannelTopicUpdater
> 頻道主題,也可以支援Placeholder喔,這邊不給我的範本,可以多加利用"\n"換行符號喔!
效果長這樣:

---
## 5. Linking.yml 的設定技巧
> 這個東西只要啟用他就會要求加入的玩家 ***需要**完成Discord綁定才可遊玩伺服器。*
>
> 大部分的人是不會啟用此功能的!個人建議是不要。
:::danger
啟用辦法:
```yaml=2
Enabled: false
```
把它變成 `true` 將會啟用此功能!(個人不建議使用此功能!)
:::
### 1. Subscriber roles
> 限定需要 特定的身分組(這邊是ID,不是身分組名稱!)才可加入伺服器遊玩
---
## 6. Synchronization.yml 權限同步設定
> 這可以讓你在Minecraft的職位跟Discord上同步!
### 1. NicknameSynchronization
> 啟動NicknameSynchronization將會讓玩家名稱 套用到 Discord裡面的匿名!(可使用Placeholder!)
```yaml=16
NicknameSynchronizationEnabled: false
NicknameSynchronizationCycleTime: 60
NicknameSynchronizationFormat: "%discord_name% (%username%)"
```
### 2. GroupRoleSynchronization
> 同步身分組
:::warning
請將您的機器人的 身分組 移動到高於你要同步權限的身分組們!
:::
:::danger
這裡的如果寫錯將會影響Discord的成員權限(像是管理者)!
:::
格式為:
```yaml=
GroupRoleSynchronizationGroupsAndRolesToSync: {"權限組名稱-1": "Discord身分組ID-1", "權限組名稱-2": "Discord身分組ID-2" }
```
以下為範例:
```yaml=36
GroupRoleSynchronizationGroupsAndRolesToSync: {"服主": "878544511821815828", "副服主": "878544678667042827", "管理員": "878543926645112852", "協管者": "878544258901106688", "建築師": "878544128277905448", "mvp++": "878544872297078794", "mvp+": "878545138564091924", "mvp": "878545256814088282", "vip+": "878545367761829928", "vip": "878545462750248990", "玩家": "878543626827866122", "Default": "878543626827866122"}
```
### 3. BanSynchronization
> 用於同步封鎖 Discord成員/Minecraft玩家 的設定...
:::warning
這對沒有綁定者無效!
:::
> 個人建議:
> **啟用** **Discord封鎖,Minecraft伺服器**一起封鎖
> **禁用** **Minecraft伺服器封鎖,Discord**一起封鎖
---
## 7. voice.yml 語音同步系統設定
> 這有點難說明它的用途...大概是這樣的
>
> 你需要:一個語音大廳、一個存放臨時語音的類別
> 用途:2個以上的成員(已綁定Discord)加入語音大廳,當玩家互相靠近時會創建一個新的臨時語音頻道,並觸發機器人移動成員到該頻道,反之,則會移動成員回到語音大廳,再刪除該臨時頻道。
### 1. Network
> 這類別的設定是有關機器人&伺服器兩端的同步規則:
>
> 例如:玩家靠近多少格可以互相通話、是否檢查語音等...
---
## 8. alerts.yml 警報系統設定
> 警報系統,如字面上的意思,我們要配合先前的 **基本進階常識** 來做才會知道我在說甚麼!
###### 這是大家最想要的部分,估計都是衝著這個來的吧www
### 1. 基本警報系統格式
以下為文件內的基本介紹:
:::spoiler
```yaml=48
# Syntax/defaults:
# - Trigger: < 事件名稱 或 /命令 >
# Async: true # 可選,默認為 true,您幾乎不需要更改它
# Conditions: #條件
# - property == < > <= >= value etc
# Channel: <discordsrv 傳到的頻道名稱>
# IgnoreCancelled: true # 僅用於事件警報
# Content: "" #文字訊息內容
# Webhook: #Webhook的形式發送訊息
# Enable: false
# AvatarUrl: "{botavatarurl}"
# Name: "{botname}"
# Embed: #嵌入訊息內容
# Enabled: true
# Color: "#00ff00" # 接受十六進制顏色代碼(例如“#ffffff”)或 rgb 整數(例如 0)
# Author:
# ImageUrl: "{embedavatarurl}"
# Name: "{username} 做了……某事。"
# Url: ""
# ThumbnailUrl: ""
# Title:
# Text: ""
# Url: ""
# Description: ""
# Fields: [] # 格式為“title;value;inline”(舉例:“誰加入?;%displayname%;true”)或“blank”以添加空白字段
# ImageUrl: ""
# Footer:
# Text: ""
# IconUrl: ""
# Timestamp: false # 設置為 true 以使用發送消息的時間或使用特定時間的紀元時間戳(https://www.epochconverter.com/)
```
:::
> 我們來開始正式環節,每一行都有其說明:
:::spoiler
這是效果:

以下為 指令監測 的程式腳本:
```yaml=1
- Trigger: PlayerCommandPreprocessEvent #偵測玩家輸入命令
Channel: 監控頻道 #傳回Discord頻道的名稱
Webhook: #可以使用Webhook,如果禁用預設為機器人
Enable: true
AvatarUrl: "{botavatarurl}"
Name: "指令監測" #Webhook名稱
Conditions: #條件,如果前面有"!"代表不能有該條件,沒有則代表需要該條件
- "!(#command.split(\"\\s+|$\")[0].equals(\"msg\"))" #ignores the /msg command
- "!(#command.split(\"\\s+|$\")[0].equals(\"w\"))" #ignores the /w command
- "!(#command.split(\"\\s+|$\")[0].equals(\"m\"))" #ignores the /m command
- "!(#command.split(\"\\s+|$\")[0].equals(\"pm\"))" #ignores the /pm command
- "!(#command.split(\"\\s+|$\")[0].equals(\"emsg\"))" #ignores the /emsg command
- "!(#command.split(\"\\s+|$\")[0].equals(\"epm\"))" #ignores the /epm command
- "!(#command.split(\"\\s+|$\")[0].equals(\"tell\"))" #ignores the /tell command
- "!(#command.split(\"\\s+|$\")[0].equals(\"etell\"))" #ignores the /etell command
- "!(#command.split(\"\\s+|$\")[0].equals(\"whisper\"))" #ignores the /whisper command
- "!(#command.split(\"\\s+|$\")[0].equals(\"ewhisper\"))" #ignores the /ewhisper command
- "!(#command.split(\"\\s+|$\")[0].equals(\"r\"))" #ignores the /r command
- "!(#command.split(\"\\s+|$\")[0].equals(\"er\"))" #ignores the /er command
- "!(#command.split(\"\\s+|$\")[0].equals(\"reply\"))" #ignores the /reply command
- "!(#command.split(\"\\s+|$\")[0].equals(\"ereply\"))" #ignores the /ereply command
# - "!(#command.split(\"\\s+|$\")[0].equals(\"example\"))" #ignores the /example command
Embed: #嵌入訊息
Color: "#000001"
Author:
ImageUrl: "{embedavatarurl}"
Name: '{username} 使用命令: /${#command}'
```
:::
>
:::info
請多加利用前面的 基本進階常識 來配合文件喔!
:::
---
## 9. 與權限插件的互通方式
> 有很多權限插件像是[LuckPerms](https://www.spigotmc.org/resources/luckperms.28140/)、[Groupmanager](https://www.spigotmc.org/resources/groupmanager.38875/) 這些都是可以跟DiscordSRV互通的喔!
> 我們將以LuckPerms為舉例,如果不懂了話我這邊可以建議您安裝LuckPerms ([Groupmanager等權限插件轉檔成LuckPerms的方式點這](https://luckperms.net/wiki/Migration))
:::spoiler

有這些東西可以讓你輕鬆遷移權限!
:::
例如:給予 加成者 添加前綴
`/lp group default meta addsuffix 100 &d[Boost] discordsrv:boosting=true`
可以給予禁言者不能說話的權限
## 總結:
##### 最後,我也沒有什麼可以好說的了,我也相信,你一定沒有全部看完,如果你照著做成功了,我會很開心! :slightly_smiling_face: