--- 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玩家列表、甚至是替換命令裡面,就像是`${變數}`一樣,只是我們在這裡都是使用`%變數%`喔! ![](https://i.imgur.com/7F1hkbt.png)圖為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也有他有自己的佔位符喔![這裡可以找到](https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders#DIscordSRV) --- ## 2. Event 觸發事件 > 主要所有的 事件點 **幾乎都會** 在[這裡](https://hub.spigotmc.org/javadocs/bukkit/)找得到,不要看全部都是文字就放棄! ![](https://i.imgur.com/zoCmIjD.png)圖為網站內容 觸發事件位在 `event/package-summary.html`,用`org.bukkit.event`即可搜尋得到 ![](https://i.imgur.com/aqRVJet.png) 點開來,大概長這樣:![](https://i.imgur.com/c9OaZoj.png) 我們接下來的都是要說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 ![](https://i.imgur.com/5p1jB7n.png) 現在: ![](https://i.imgur.com/W93RRdx.png) 原來: ![](https://i.imgur.com/FziV2TQ.png) ::: ### 2. DiscordChatChannelListCommand > 什麼?這也可以改??? > > DiscordChatChannelListCommandAllPlayersSeparator > 要用什麼符號分開,預設是" , ",我這邊的"\n"是換下一行! ```yaml=167 DiscordChatChannelListCommandFormatOnlinePlayers: "**玩家列表 (%playercount%):**" DiscordChatChannelListCommandFormatNoOnlinePlayers: "**很抱歉,沒有上線的玩家 :/ **" DiscordChatChannelListCommandPlayerFormat: "[ %world% ] %displayname% " # %primarygroup% DiscordChatChannelListCommandAllPlayersSeparator: "\n" ``` 這是效果 ![](https://i.imgur.com/fcpLSE6.png) ### 3. ChannelTopicUpdater > 頻道主題,也可以支援Placeholder喔,這邊不給我的範本,可以多加利用"\n"換行符號喔! 效果長這樣: ![](https://i.imgur.com/J9iKQKm.png) --- ## 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 這是效果: ![](https://i.imgur.com/69PgFb6.png) 以下為 指令監測 的程式腳本: ```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 ![](https://i.imgur.com/LjMWkrG.png) 有這些東西可以讓你輕鬆遷移權限! ::: 例如:給予 加成者 添加前綴 `/lp group default meta addsuffix 100 &d[Boost] discordsrv:boosting=true` 可以給予禁言者不能說話的權限 ## 總結: ##### 最後,我也沒有什麼可以好說的了,我也相信,你一定沒有全部看完,如果你照著做成功了,我會很開心! :slightly_smiling_face: