LNNBot/指令
指令是 LNNBot 功能的一類,基於 Koishi.js 框架的指令系統,有共通的語法。可通過發送以斜槓(/)開頭的消息來調用指令;在 QQ 私聊和部分群聊內可以省略斜槓前綴。
語法
在 Koishi.js 框架中,指令由名稱、若干參數和若干選項組成,其間使用空格、換行等空白字符分隔。一般情況下,指令選項可以以任意順序寫在參數前後或之間。
斜槓前綴是通過消息調用指令的一種標誌,並不是指令語法的一部分;在部分高級功能中「輸入一條指令」時不可包含斜槓前綴。
參數
參數可以是不含空白字符的內容或用引號(""、''、“”、‘’)包圍的任意內容,如果參數值本身就以引號開頭和結尾則需要再加一層引號(可以是相同的引號,如 ""content"")。
參數分為必填參數和可選參數,在指令用法中分別使用角括號和方括號包圍參數名表示,如指令 5k 有一個必填參數 text1 和一個可選參數 text2,寫作 5k <text1> [text2]。
有些指令有可變參數,即接受任意數量的額外參數,在指令用法中表示為最後一個參數的名稱前加三點(如<...words>;區別於下文的貪婪值)。
選項
選項的通用語法是兩個橫槓(--)後緊跟選項名。很多選項是具值選項,它們後面需要再跟一個選項值,選項值的語法類似於參數。選項名和選項值之間由空白字符或一個等號(=)相隔,等號之後也可以有空白。等號後不能緊跟使用引號語法的選項值,可以在等號後添加空白或直接用空白代替等號。
大多數選項有單個字符的短名,可以用一個橫槓後跟短名的短語法表示(如 -a)。短語法可以串聯,寫成一個橫槓後連續跟上多個選項的短名(如 -abc 同時指定了選項 -a -b -c)。串聯短語法中除最後一個選項外,其他具值選項(若有)的值為空,最後一個選項可以正常指定值(如 -abc "选项c的值")。
有些選項有符號名,可以用一個或幾個特殊符號(如 /、--)的符號語法表示。具值選項使用符號語法時不能使用等號分隔名和值,只能用空白字符分隔。
有些指令使用嚴格選項解析,這些指令在解析時若遇到不存在的長、短選項,會將其視為參數,而非報錯或忽略。
值類型
每個參數和具值選項都有類型,類型影響該參數或選項值的格式要求和解析邏輯。在指令定義中表示為值名稱後跟冒號和類型英文名,在幫助信息中不會顯示。
| 類型名稱 | 值格式 | 說明 |
|---|---|---|
string 字符串 |
文本 | 默認類型 |
number 數字 |
浮點數 | |
integer 整數 |
整數 | |
posint 正整數 |
正整數 | |
natural 自然數 |
非負整數 | |
date 日期 |
日期 或持續時間表示距離現在 |
持續時間單位 w/week(s)、d/day(s)、h/hour(s)、m/min/minute(s)、s/sec/second(s),從大單位到小單位,不可有任何空格,如:2w2d
|
user 用戶 |
@提及人員或字符 @ 後加用戶 ID |
可在 ID 前加平台 ID 和冒號來選擇其他聊天平台的用戶賬號 |
channel 頻道 |
#頻道鏈接或字符 # 後加頻道 ID |
可在 ID 前加平台 ID 和冒號來選擇其他聊天平台的頻道 |
image/audio/video 圖片/音頻/視頻 |
圖片/語音/視頻 | |
file 文件 |
發送文件 | |
text 文本 |
文本 | 遇非文本內容如表情、圖片,傳入 XML 元素代碼且解轉義一次 |
rawtext 純文本 |
純文本 | 遇非文本內容如表情、圖片,直接剔除 |
elements 元素 |
任意內容 | |
fragment 片段 |
任意內容 | 非 Koishi.js 自帶的標準值類型,非貪婪 |
貪婪值
值類型為 text、rawtext 或 elements 會使指令其餘的部分不再解析選項和參數語法,直接全部視為該值的內容(首尾若有引號也會視為值的一部分),稱為貪婪值(使用貪婪值的參數稱為貪婪參數,有貪婪值的選項稱為貪婪選項)。貪婪值必須寫在指令的末尾(即使用貪婪參數時其他參數和所有選項必須寫在貪婪參數之前,使用貪婪選項時其他選項和所有參數必須寫在貪婪選項之前),且貪婪選項和貪婪參數不能同時使用。貪婪值在指令用法中表示為值名稱後加三點(如 <input...>;區別於上文的可變參數)。
插值
插值是將一條指令的結果直接作為另一條指令輸入的一部分的功能,可以用於指令的參數和選項(包括貪婪值)內,但在直單引號('')包圍的值中無效。基本的插值語法是 $(指令)(被插值的指令不可包含半角右圓括號,除非在引號內),同時也存在一些其他插值語法,會直接使用對應的指令進行插值:
| 語法 | 等價語法 | 備註 |
|---|---|---|
${代码...} |
$(eval 代码...) |
|
$¿{代码...} |
$(whatlang 代码...) |
|
$¿(名称 参数...) |
$(whatcmd 名称 参数...) |
WhatCommands指令不可包含半角右圓括號,除非在引號內 |
在一些情況下(如輸入 JavaScript 代碼時),我們可能不希望指令系統解析插值語法。在 QQ 平台,對於一些會自動剔除掉 QQ 表情的指令(如 eval,它的參數為 rawtext 類型),可以通過在美元符與括號之間添加一個 QQ 表情來「轉義」插值語法。也可以通過先發送代碼,再引用這條消息調用指令的方法來繞過插值解析。通過在 rpipeline 指令的快捷方式(如 <|)中使用 ECHO 或 : 特殊指令向欲調用的指令傳遞參數也能繞過插值解析,但需要確保文本內容不含前後都是空白字符的豎線(|)。
機制
查詢幫助
指令 help 可顯示指令菜單或查詢特定指令的幫助。
有些指令是隱藏指令,不會出現在菜單裡,但仍能通過 help 查詢到其幫助信息。
別名
有些指令有別名,別名可以用來代替指令名調用指令。
有些別名是附帶參數和/或選項的別名,使用這種別名調用指令時會自動指定指令的第一個或前幾個參數,或是給一個或多個選項附帶不同的默認值,也可能參數和選項都有。在幫助信息中顯示為 别名(=指令名称 参数和/或选项)。
有些指令在幫助信息中會用默認使用它的一個別名而不是其原本的名稱顯示,我們稱這些指令的顯示名稱不同於其原本名稱;相應的原本名稱可能會被列舉為別名之一,也可能因被禁用而不在幫助信息中顯示。
別名指令
別名指令,不同於指令的別名,是指通過 alias 插件創建的一種特殊的指令,它們在調用時會在展開插值語法後,將指令名直接替換為一段預先定義的指令,然後再作為一條指令執行(會再次展開插值語法,再解析參數和選項的語法)。別名指令不會顯示在其實際調用的指令的幫助信息中,對別名指令查詢幫助會顯示「本指令是(實際指令段)的語法糖」。LNNBot 的別名指令都是隱藏指令。
特殊調用方式
在 QQ 私聊和部分群聊調用指令時可以省略斜槓,直接發送指令內容;在 Discord 平台,因為斜槓有時是一種特殊語法,所以也允許以兩個斜槓開頭。
部分指令也能用其他獨特的語法來調用,稱為快捷方式,如 eval 指令可以通過發送大於號和空格開頭的消息來調用。
捕獲引用
當調用指令的消息引用(回復)了另一條消息,大多數指令都會將被引用的消息內容自動添加到指令末尾作為參數或選項值。通過這種方式傳入的輸入不會解析選項、參數和插值語法,直接作為一個值使用。若指令使用了貪婪參數或選項,則會將被引用內容直接添加到貪婪值的末尾。
請求輸入參數
有些指令在缺少必填參數時,會顯示「請發送(參數描述)…」(區別於報錯「缺少某參數…」),調用指令的用戶若在 1 分鐘內在同一聊天內發送了消息,bot 會將該消息的內容作為缺少的參數使用。目前無法在 bot 請求輸入參數時手動取消調用,需要等待 1 分鐘或通過發送一條任意內容來完成調用,否則直接重新進行指令調用不會被 bot 正常識別。
子指令
有些指令是另一個指令的子指令。子指令不會在頂層幫助菜單中顯示,只會在其父指令的幫助信息內顯示。子指令分為層級式和派生式兩種,派生式子指令的名稱總是以其父指令的名稱加句點(.)開頭。
有些指令本身並沒有功能,僅用於收納其他指令作為子指令,稱為分組指令。調用分組指令的派生式子指令時可以用空格代替指令名中的句點;而如果直接調用分組指令本身,或將空格替換為句點後並不是一個存在的派生式子指令名稱,則會直接顯示分組指令的幫助信息。
禁用指令
指令可以被 bot 管理員在特定群聊中禁用。此時,該指令及其子指令都無法在該群聊中被調用。有些指令是群聊中默認禁用的,需要 bot 管理員手動為特定群聊啟用才可調用。
指令列表
希頂、泛希頂文化及其他造語造文
xdi8:漢字-希頂語轉換xdi8-grep:用正則表達式搜索希頂字表內的詞xegoe:渲染希頂字母或希頂漢字注音song:查詢太陽易卦信息lnnzhyz:轉換 LNN 中華語字lojban:邏輯語工具菜單
更多見 util.lang
二級菜單
雜項
derpi:Derpibooru 功能help:顯示指令幫助microcommand:微指令查詢與管理patron:贊助菜單song:檢索荊哲歌單歌曲信息status:查看 bot 運行狀態status-image:查看 bot 運行狀態(圖片版)wiki:獲取 wiki 條目的鏈接
快捷方式索引