Table of Contents
Start ↵
« Find her an empty lap, fellas »
ssJSKFJDJ¶
for script or mod.
Contribute¶
List
plugin(Lua插件)¶
本段作者:简律纯
如果你是Dice!脚本作者,那么你可以fork plugin仓库,然后按格式提交PR。
- 若您提交的是单个
*.lua
文件,请在脚本前四行务必写上如下注释,否则审核将会被打回,这么做的理由是为了让您的脚本在被他人下载使用时,让他人知晓作者是谁,(若有报错)如何联系,能否二次演绎(协议)。 - 随后请将你的lua脚本提交至Single File文件夹,并在该文件夹下的README.md内找到当天日期(如没有就添加一个)写上:
- 若您的脚本包含
*.lua
文件数量过多或是包含文件夹,请将它们全部放在一个以脚本名命名的文件夹内上传,并附上README.md
简单介绍各个文件的作用以及一些作者信息。 它们将会是这样的:README.md
文件内可以这样写(只是为了表现层次,所以尽量使用文件树): - 随后请将你的文件夹提交至Mutiple Files文件夹,并在该文件夹下的README.md内找到当天日期(如没有就添加一个)写上:
PublicDeck(功能牌堆)¶
本段作者:梦夜雨
校对:简律纯
如果你是牌堆作者,那么你可以fork PublicDeck仓库,然后按格式提交PR。
- 请务必在牌堆内写上如下信息,否则审核将会打回您的文件,这么做的理由是为了让您的脚本在被他人下载使用时,让他人知晓作者是谁,(若有报错)如何联系等。 在牌堆中写明此内容后,下一步就是上传了(一个吐槽:基本就是一路绿下去 (什) )
- 点击上方的连接后,在文件列表的右上会有一个名为code的绿色按钮,点击其左侧的Add file按钮 ,在下拉菜单中选择Upload files按钮
- 进入新的界面后,第一种方法是将.json文件拖入中间的框中,第二种方法是选择中间的蓝色choose you files按钮 ,并在弹出的资源管理器窗口中选择您要上传的文件
- 上传完成后,点击底部的绿色Commit changes按钮
- 此时您自己的库已经更新,之后需要在界面中寻找Pull request按钮并点击
- 在Pull Requests中,点击右边的绿色New pull request按钮或是中下蓝色的create a pull requret按钮
- 在新界面中选择绿色的
Create pull request
按钮 ,请求将代码提交到ssJSKFJDJ的库中
Module(功能模块)¶
本段作者:简律纯
功能模块的收集没有任何像plugin或PublickDeck那样的专门的库,这里只选择功能模块作者在main-pages的master分支的Module文件夹下提交功能模块远程下载json的方式来收录Module。在收到PR以及审核通过后,审核人员会将你的功能模块库fork到ssJSKFJDJ。
其一般步骤如下: 1. fork main-pages库。一切都是从这里开始的。 2. 提交你的包含"pkg"字段的功能模块json: 比如listen2me库提供的json是这样的:
{
"mod":"listen2me",
"author":"简律纯",
"ver":"1.1.8",
"dice_build":612,
"brief":"使用mml作曲",
"pkg":"https://github.com/A2C29K9/listen2me/releases/download/v1.1.8/listen2me_v1.1.8.zip",
"comment":"",
"helpdoc":{
"listen2me":"【listen2me[Windows]】\n使用mml语言进行作曲\nhttps://github.com/A2C29K9/listen2me"
}
}
Note
pkg填写的是把功能模块打包好后发布的地址,必须为直链,不一定要在github上!
- 给你的功能模块库添加
lua
和dice-mod
标签。 - 按照格式提交PR。
- 如有需要一并提交md格式的技术文档。
审核通过后你会在ssJSKFJDJ仓库下找到自己的功能模块库,每次更新功能模块时仅需提交新的pkg字段的json至Module文件夹下即可。最后,给bot安装时仅需要在./DiceQQ/conf/mod/source.list
文件内添加一行写上https://ssjskfjdj.netlify.app/Module/
,然后重载bot并发送命令.mod get 你提交的功能模块名
即可完成下载。
Tip
论坛写帖子的时候也可以告诉大家这样安装就行了哦,可以使用如下模板:
# 1. install
- Dice版本2.6.5beta12(624+)以上安装方法:
1. 在 `./DiceQQ/conf/mod/source.list`文件内(没有mod文件夹和这文件就新建)输入
```
https://raw.sevencdn.com/Dice-Developer-Team/DiceModIndex/main/
https://raw.githubusercontent.com/Dice-Developer-Team/DiceModIndex/main/
https://ssjskfjdj.netlify.app/Module/
```
2. 使用 `.system load`命令重载bot,这样做的目的是为了让步骤1里的远程地址生效。
3. 对bot发送 `.mod get [功能模块名]`命令,等待安装。
4. 回到第二步,这样做的目的是为了让mod被加载。
5. Enjoy Your Self!
- Dice版本2.6.4b(612+)以上安装方法:
1. 浏览器访问 `https://github.com/ssJSKFJDJ/功能模块名`并点击绿色按钮 `Code`下的 `Download Zip`按钮下载仓库压缩包。
2. 解压压缩包,将里面的文件和文件夹全部丢进 `./DiceQQ/mod/`文件夹内。
3. 使用 `.system load`命令重载。
4. Enjoy Your Self!
Mkdocs(技术文档)¶
to be...
License
MIT License
Copyright (c) 2022 ssJSKFJDJ
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
« While the band's playin' »
Hallo!¶
Version | Author | When | Message |
---|---|---|---|
None | Hsiang Nianian | 2022-11-01, 15:35:05 | fix line:23 |
None | 简律纯 | 2022-11-01, 12:42:47 | add logs |
None | 简律纯 | 2022-11-01, 12:34:59 | Guide->WhatsNew |
Ended: Start
Scrpts ↵
Genshin_Impact_tts.lua¶
Question
由于工作繁忙, 生活琐事较多,很遗憾,到目前为止 此脚本的部分功能还是没有给出一个 完整的解决方案。
To-DO List
-
情感要素
-
转义要素
-
配置要素
-
语句白名单
-
To be...
...大胆的尝试?
与情感要素相互链接。
Code¶
I.¶
--------------------------------------------------------
-- by 简律纯. For 阿尘 22/8/20
-- About API? View more: https://github.com/w4123/vits
--------------------------------------------------------
write_file = function(path, text, mode)
file = io.open(path, mode)
file.write(file, text)
io.close(file)
end
read_file = function(path, mode)
local text = ""
local file = io.open(path, mode)
if (file ~= nil) then
text = file.read(file, "*a")
io.close(file)
else
return "没有该文件或文件内容为空哦"
end
return text
end
II.¶
npcList = {
"派蒙",
"凯亚",
"安柏",
"丽莎",
"琴",
"香菱",
"枫原万叶",
"迪卢克",
"温迪",
"可莉",
"早柚",
"托马",
"芭芭拉",
"优菈",
"云堇",
"钟离",
"魈",
"凝光",
"雷电将军",
"北斗",
"甘雨",
"七七",
"刻晴",
"神里绫华",
"戴因斯雷布",
"雷泽",
"神里绫人",
"罗莎莉亚",
"阿贝多",
"八重神子",
"宵宫",
"荒泷一斗",
"九条裟罗",
"夜兰",
"珊瑚宫心海",
"五郎",
"散兵",
"女士",
"达达利亚",
"莫娜",
"班尼特",
"申鹤",
"行秋",
"烟绯",
"久岐忍",
"辛焱",
"砂糖",
"胡桃",
"重云",
"菲谢尔",
"诺艾尔",
"迪奥娜",
"鹿野院平藏"
}
msg_order = {["让"] = "letSpeaker", ["说"] = "doSpeaker", [".GItts"] = "GItts"}
settings = {["noise"] = 0, ["noisew"] = 0, ["length"] = 0, ["format"] = "mp3"}
local dataFolder = getDiceDir() .. "\\plugin\\Genshin_Impact_tts\\data"
local dataPath = dataFolder .. "\\default.json"
local confPath = getDiceDir() .. "\\plugin\\Genshin_Impact_tts\\settings.ini"
local MasterQQ = tonumber(string.match(read_file(getDiceDir() .. "\\conf\\Console.xml"), "<master>(%d+)</master>", 0))
III.¶
-------------------------------------------------------------------------
-- EDIT INI FILE
-- No unauthorized use without permission.
-- BY 简律纯.
-- 2022/6/10
-------------------------------------------------------------------------
load_all = function(fileName)
assert(type(fileName) == "string", "参数“fileName”必须是字符串哦")
local file = assert(io.open(fileName, "r"), "加载文件时出错:" .. fileName)
local data = {}
local section
for line in file:lines() do
local tempSection = line:match("^%[([^%[%]]+)%]$")
if (tempSection) then
section = tonumber(tempSection) and tonumber(tempSection) or tempSection
data[section] = data[section] or {}
end
local param, value = line:match("^([%w|_]+)%s-=%s-(.+)$")
if (param and value ~= nil) then
if (tonumber(value)) then
value = tonumber(value)
elseif (value == "true") then
value = true
elseif (value == "false") then
value = false
end
if (tonumber(param)) then
param = tonumber(param)
end
data[section][param] = value
end
end
file:close()
return data
end
save_all = function(fileName, data)
assert(type(fileName) == "string", "参数“fileName”必须是字符串哦")
assert(type(data) == "table", "参数“data”必须是一个表!")
local file = assert(io.open(fileName, "w+b"), "加载文件时出错:" .. fileName)
local contents = ""
for section, param in pairs(data) do
contents = contents .. ("[%s]\n"):format(section)
for key, value in pairs(param) do
contents = contents .. ("%s=%s\n"):format(key, tostring(value))
end
contents = contents .. "\n"
end
file:write(contents)
file:close()
end
ReadIni = function(IniPath, Section, Key)
local data = load_all(IniPath)
return data[Section][Key]
end
WriteIni = function(IniPath, Section, Key, Value)
local data = load_all(IniPath)
data[Section][Key] = Value
save_all(IniPath, data)
end
IV.¶
checkChinese = function(str)
local tmpStr = str
local _, sum = string.gsub(str, "[^\128-\193]", "")
local _, countEn = string.gsub(tmpStr, "[%z\1-\127]", "")
if sum - countEn ~= 0 then
return true
else
return false
end
end
ToStringEx = function(value)
if type(value) == "table" then
return table.list(value)
elseif type(value) == "string" then
return "'" .. value .. "'"
else
return tostring(value)
end
end
table.list = function(t)
if t == nil then
return ""
end
local retstr = "{"
local i = 1
for key, value in pairs(t) do
local signal = ","
if i == 1 then
signal = ""
end
if key == i then
retstr = retstr .. signal .. ToStringEx(value)
else
if type(key) == "number" or type(key) == "string" then
retstr = retstr .. signal .. "[" .. ToStringEx(key) .. "]=" .. ToStringEx(value)
else
if type(key) == "userdata" then
retstr =
retstr .. signal .. "*s" .. TableToStr(getmetatable(key)) .. "*e" .. "=" .. ToStringEx(value)
else
retstr = retstr .. signal .. key .. "=" .. ToStringEx(value)
end
end
end
i = i + 1
end
retstr = retstr .. "}"
return retstr
end
spaceKiller = function(str)
return string.gsub(str, "[%s]+", "+")
end
isFolderExist = function(folderPath)
return os.execute("cd " .. folderPath)
end
--[[
CER = function(fun, arg1, arg2, arg3, arg4, arg5)
local i
local ret, errMessage = pcall(fun, arg1, arg2, arg3, arg4, arg5)
wrong = ret and "false" or "true"
--return "是否错误:\n"..错误.." \n\n出错信息:\n" .. (errMessage or "无")
if wrong == "true" then --错误提示
--output[i]
local ret, errMessage = pcall(fun, arg1, arg2, arg3, arg4, arg5)
return "\n错误详情:\n" .. errMessage
else --无错误正常执行
ret, back = pcall(fun, arg1, arg2, arg3, arg4, arg5)
return back
end
end
]]
string.split = function(str, split_char)
local str_tab = {}
while (true) do
local findstart, findend = string.find(str, split_char, 1, true)
if not (findstart and findend) then
str_tab[#str_tab + 1] = str
break
end
local sub_str = string.sub(str, 1, findstart - 1)
str_tab[#str_tab + 1] = sub_str
str = string.sub(str, findend + 1, #str)
end
return str_tab
end
getFileList = function(path, exp)
local a = io.popen("dir " .. path .. exp .. " /b")
local fileTable = {}
local str = ""
if a == nil then
else
for l in a:lines() do
table.insert(fileTable, l)
end
for i = 1, #fileTable do
str = fileTable[i] .. "\n" .. str
end
return fileTable
end
end
V.¶
-------------------------------------------------------------------------
-- 接下来的才是脚本主体
-- BY 简律纯.
-- 2022/08/22
-------------------------------------------------------------------------
local settings_text =
[[
[MasterConfig]
nick=nil
QQ=nil
[UserConfig]
noise=0.667
noisew=0.8
length=1.2
DefaultNpc=*
format=mp3
[AutoUpdate]
Version=v1.2.2]]
if not getUserConf(getDiceQQ(), "GI_tts") then
mkDirs(getDiceDir() .. "\\plugin\\Genshin_Impact_tts")
write_file(confPath, settings_text, "w+")
WriteIni(confPath, "MasterConfig", "QQ", MasterQQ)
WriteIni(confPath, "MasterConfig", "nick", getUserConf(MasterQQ, "name"))
WriteIni(confPath, "UserConfig", "noisew", "0.8")
WriteIni(confPath, "UserConfig", "length", "1.2")
WriteIni(confPath, "UserConfig", "format", "mp3")
WriteIni(confPath, "AutoUpdate", "Version", "v1.2.2 ;laset version")
if not isFolderExist(getDiceDir() .. "\\SelfData\\GItts") then
expansion, state = 0, "失败,疑似没有SelfData/GItts文件夹 "
else
enable = 0
files = getFileList(getDiceDir() .. "\\SelfData\\GItts", "\\*.json")
state = "成功 共" .. #files .. "个拓展可用,已启用" .. enable .. "个"
end
setUserConf(getDiceQQ(), "GI_tts", true)
log(os.date("%X") .. "\n> 原神tts:初始化完成~\n> 读取情绪拓展" .. state, 1)
end
-------------------------------------------------
-- 让<speaker>说<text>
-- speaker必须为npcList内容,text支持空格.
-------------------------------------------------
function letSpeaker(msg)
local npc = string.match(msg.fromMsg, "让(.-)说")
settings.noise = ReadIni(confPath, "UserConfig", "noise")
settings.noisew = ReadIni(confPath, "UserConfig", "noisew")
settings.length = ReadIni(confPath, "UserConfig", "length")
settings.format = ReadIni(confPath, "UserConfig", "format")
if npc then
--return #npcList
local prefix = "让" .. npc .. "说"
local text = string.sub(msg.fromMsg, #prefix + 1)
for i = 1, #npcList do
if npcList[i] == npc then
return "[CQ:record,file=http://233366.proxy.nscc-gz.cn:8888?speaker=" ..
npcList[i] ..
"&text=" ..
spaceKiller(text) ..
"&noise=" ..
settings.noise ..
"&noisew=" ..
settings.noisew ..
"&length=" ..
settings.length ..
"&format=" ..
settings.format .. "]"
end
end
else
return
end
end
-------------------------------------------------
-- 说(.*)
-- 支持加空格.
-------------------------------------------------
function doSpeaker(msg)
local p, b
settings.noise = ReadIni(confPath, "UserConfig", "noise")
settings.noisew = ReadIni(confPath, "UserConfig", "noisew")
settings.length = ReadIni(confPath, "UserConfig", "length")
settings.format = ReadIni(confPath, "UserConfig", "format")
for i = 1, #npcList do
p, b = string.find(msg.fromMsg, npcList[i])
if p or b then
break
end
end
if p or b then
return "[CQ:record,file=http://233366.proxy.nscc-gz.cn:8888?speaker=" ..
string.sub(msg.fromMsg, p, b) ..
"&text=" ..
string.sub(msg.fromMsg, #"说" + 1) ..
"&noise=" ..
settings.noise ..
"&noisew=" ..
settings.noisew ..
"&length=" ..
settings.length ..
"&format=" ..
settings.format .. "]"
else
return "[CQ:record,file=http://233366.proxy.nscc-gz.cn:8888?speaker=神里绫华&text=" ..
spaceKiller(string.sub(msg.fromMsg, #"说" + 1)) ..
"&noise=" ..
settings.noise ..
"&noisew=" ..
settings.noisew ..
"&length=" ..
settings.length ..
"&format=" ..
settings.format .. "]"
end
end
VI.¶
-------------------------------------------------
-- 配置指令
-- @.GItts <arg>
-- 指令头不分大小写,后面的参数严格区分大小写.
-------------------------------------------------
function GItts(msg)
command = string.split(msg.fromMsg, " ")
settings.noise = ReadIni(confPath, "UserConfig", "noise")
settings.noisew = ReadIni(confPath, "UserConfig", "noisew")
settings.length = ReadIni(confPath, "UserConfig", "length")
settings.format = ReadIni(confPath, "UserConfig", "format")
if command[2] == "reload" then
setUserConf(getDiceQQ(), "GI_tts", false)
eventMsg(".system load", 0, msg.fromQQ)
elseif command[2] == "ini" then
items = string.split(msg.fromMsg, " ")
if #items == 2 then
return read_file(confPath)
elseif items[3] == "set" then
WriteIni(confPath, items[4], items[5], items[6])
return "节点" .. items[4] .. "的key:" .. items[5] .. "值已修改为" .. items[6]
end
elseif checkChinese(msg.fromMsg) then
local npc = ReadIni(confPath, "UserConfig", "DefaultNpc")
if npc == "*" then
npc = npcList[ranint(1, #npcList)]
end
return "[CQ:record,file=http://233366.proxy.nscc-gz.cn:8888?speaker=" ..
npc ..
"&text=" ..
spaceKiller(string.sub(msg.fromMsg, #".GItts " + 1)) ..
"_&noise=" ..
settings.noise ..
"&noisew=" ..
settings.noisew ..
"&length=" ..
settings.length ..
"&format=" ..
settings.format .. "]"
elseif command[2] == "npcList" then
return table.list(npcList)
else
return [[
原神tts·GItts
【.GItts reload】重新配置ini文件并重载
【.GItts ini (set) (section) (key) (value)】ini配置文件操作
【.GItts (文本)】调用key:DefaultNpc说一句话
【.GItts whiteList (add|remove|clr) (word1[,word2[,word3]...])】添加语句白名单
【.GItts npcList】查看可以使用的人物]]
end
end
Categories¶
team call¶
Info
仿SitaNya的team call功能,方便kp开团或公布信息时艾特调查员们。
Bug
- 少数汉字在team show时会变成乱码;
- 在dd版本过低或使用miraiandroid的2.6.4版本dice下,无法转义{at}。
To do list
- 自动清除群team清空之后的缓存
- 实现一次操作多名调查员
- 加入kp设置功能,使每群只有kp可以使用team call(不过真的有必要吗?)
文件目录¶
历史修改记录¶
Version | Author | When | Message |
---|---|---|---|
None | pine | 2022-11-10, 12:57:52 | Update team call.md |
None | pine | 2022-11-01, 02:14:49 | Update team call.md |
None | pine | 2022-11-01, 02:06:33 | Update team call.md |
Categories¶
Ended: Scrpts
Module ↵
print.lua¶
Everyone is permitted to copy and distribute verbatim copies
-------------------------------------------------------------------------------
-- print 改写. @简律纯 @gexi
-------------------------------------------------------------------------------
writeToFile = function ( str )
local filename = "print.log"
if not fileLogOut then
fileLogOut = io.open(filename, "w")
else
fileLogOut = io.open(filename, "a")
end
fileLogOut:write(os.date("%H:%M:%S",os.time()).." "..str.."\n")
fileLogOut:close()
end
function babe_tostring(...)
local num = select("#", ...);
local args = { ... };
local outs = {};
for i = 1, num do
if i > 1 then
outs[#outs + 1] = "\t";
end
outs[#outs + 1] = tostring(args[i]);
end
return table.concat(outs);
end
local just_print = print;
local babe_output = function(...)
just_print(...);
local str = babe_tostring(...);
if writeToFile then writeToFile(str) end
end
print = babe_output
Categories¶
Ended: Module
Wiki ↵
Midido ↵
Midido - wiki ♫¶
Midido ♫¶
一个用于读写MIDI文件,且具有十分友好的API的Lua扩库。它提供的MIDI数据是完全抽象的,因此并不需要用户担心那些诸如增量时间(Delta Time)和音符信号(NoteOn/NoteOff)这样的技术问题。它的方法是直观且具体的,同时对象数据也具有良好的可读性。 值得一提的是——这个扩展库不需要 任何 依赖。
Welcome¶
欢迎来到wiki页面,这个wiki旨在说明通过 Midido ♫ 提供的一切方法写出MIDI文件的方法和过程。如果你在这里没有找到如何对自己有帮助的内容,请发布issue,我会尽快回复哦。
Guide¶
Usage¶
- 导入主模块:
- 完成上步后,所有的类均可使用,以下是如何编写C大调音阶的示例:
local Midido = require ('Midido')
local Track = Midido.Track
local NoteEvent = Midido.NoteEvent
local Writer = Midido.Writer
-- 创建 Track 实例
local track = Track.new()
-- 将音符存为notes表中的键值(必须指定的八度音阶)
local notes = {'C3', 'D3', 'E3', 'F3', 'G3', 'A3', 'B3', 'C4'}
-- 将音符添加到轨道
track:add_events(NoteEvent.new({pitch = notes, sequential = true}))
-- 遍历轨道
local writer = Writer.new(track)
-- 写一个名为《C Major Scale》的MIDI文件
writer:save_MIDI('C Major Scale')
由于代码中已经有一些注释,因此不需要对其再进行解释说明。 这是 MIDI 文件构建的基本步骤。我们下一章开始进入更加深入的研究。
Categories¶
Forward ↵
Midido ♫¶
介绍所有的模块与类,其API参数以及可实现的功能和局限。
Module¶
Info
- License: MIT.
- Author: Pedro Alves Valentim,简律纯
- Translator: 简律纯
Classes¶
Tip
ArbitraryEvent
、Chunk
、MetaEvent
的对象不需要由用户创建。
ArbitraryEvent
: 提取MIDI中的任意事件。Chunk
: 提取MIDI区块。MetaEvent
: 提取MIDI元事件。NoteEvent
: 提取MIDI内的Note On与Note Off事件。NoteOffEvent
: 提取MIDI的NoteOff事件。NoteOnEvent
: 提取MIDI的NoteOn事件。ProgramChangeEvent
: 提取MIDI程的变化事件。Track
: 包含了MIDI文件内轨道的所有数据。Writer
: 管理合并所有轨道以及功能输出的方法。
s
Ended: Forward
Ended: Midido
mml530 ↵
mml 导引¶
音名
a
la音,简谱内的6b
si音,简谱内的7c
do音,简谱内的1d
re音,简谱内的2e
mi音,简谱内的3f
fa音,简谱内的4g
sol音,简谱内的5不存在大写的音名
mml530是listen2me.lua
功能模块所采用的一个mml转mid项目,目前该项目原创作团队已经停止更新,而其技术文档包含大量平假名、片假名,翻译起来极其困难,因此在这里开放出来,希望有人能够一点一点翻译出来吧。
这篇文档主要针对那些 初识mml语法 的人,同时原作者们根据他们多年使用mml以及编写*.mml
乐谱的经验修改并扩展了原本大家普遍熟悉的mml语法,就比如上古卷轴里的mml语法是 不分大小写 的,但在这里是 严格区分 的。
知识点¶
Tip
以下(包括日后)内容里的n
均为变量的指代。
可能的值:
- 数字
- 字母
- 符号
比如o5
、k100
等。
Quote
mml530b包含了三种语法格式, 如下:
- 以
#
开头的附加项文本。 - 以
$
开头的宏定义文本。 - 以
mml
语法开头的文本。
这里我们主要介绍第3个——mml语法
。
cdefgab
基本七音¶
🔊 向bot发送以 l2m>
开头的消息时,便会触发作曲机制。
这样会返回一段音频语音。
on
调整八度¶
🔊 调整八度,改变音区,默认为4。
-
降调处理¶
🔊 以基准音调1=c进行降调处理,升调同理。
ln
延音处理¶
🔊 该命令通过延音来比拟实际弹钢琴时的离合器。
tn
改变曲速¶
🔊 该项命令可以调整这个音符的长度,n
的范围是1~65535。
Qn
保持时间¶
🔊 音符按下后保持这种状态的时间。
1A
多轨生成¶
🔊 设置生成多个音轨,这样可以演奏和声,不一定非要1A
,也可以是别的字母。
r
休止音符¶
🔊 原文档给出的日语是蒂射
,不知所以然,作用是占一格位不演奏。
mml 进阶¶
Ended: mml530
gocq_api¶
Quote
其实就是个低技术力的拓展函数库啦
要是能给大佬们帮上忙我就太荣幸了
如果出现什么bug,请联系我(QQ602380092)
零.配置http通信¶
Tip
如果你早已配置好这些,请忽略这块内容。
本函数库仅支持http post与http get两种api调用方式,所以在使用前请配置好http通信。
参考配置:
- http: # HTTP 通信设置
address: 127.0.0.1:15700 # HTTP监听地址
timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5时将被忽略
long-polling: # 长轮询拓展
enabled: false # 是否开启
max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
middlewares:
<<: *default # 引用默认中间件
一.下载与安装¶
要调用一个库,首先你得下载它
你可以点击下方这个按钮来下载这个库文件。
然后,将下载的压缩包解压,你会得到一个名叫gocq_api的lua文件。
接下来只要把gocq_api.lua和同名的文件夹一起扔进diceqq/plugin文件夹里面,对你的骰娘使用system load指令就好了。
更新为单lua文件之后这一节好像有些多余
Note
当然,如果你希望的话,gocq_api.lua也可以放进diceki/lua文件夹里。
二.调用函数¶
安装完成后,想要在插件中调用这个库,只需要一行这样的代码:
Note
这个变量名,也就是gapi,当然可以换成其他的,只要你能记得住就可以了。
然后,你就可以使用gapi.http_get()和gapi.http_post()来调用api函数了。
三.函数介绍¶
本库包含两个函数:
- http_post("终结点",参数1,参数2......)
- http_get("终结点",参数1,参数2......)
两个函数分别对应了两种api调用方法:post与get。两种方法的差异请参考 API|go-cqhttp帮助中心 。
api参数请严格按照 API|go-cqhttp帮助中心 中的排列顺序,即从上到下,按序传入,否则可能会出现错误。
例如,如果在API|go-cqhttp帮助中心中的内容如下:
终结点:/send_msg
字段名 | 数据类型 | 默认值 | 说明 |
---|---|---|---|
message_type |
string |
- |
消息类型, 支持private、group,分别对应私聊、群组,如不传入,则根据传入的*_id参数判断 |
user_id |
int64 |
- |
对方 QQ 号 ( 消息类型为 private 时需要 ) |
group_id |
int64 |
- |
群号 ( 消息类型为 group 时需要 ) |
message |
message |
- |
要发送的内容 |
auto_escape |
boolean |
flase |
消息内容是否作为纯文本发送 ( 即不解析 CQ 码 ) , 只在 message 字段是字符串时有效 |
那么你可以这么传入参数:gapi.http_post("send_msg", "group", nil, 971050440, "test,test~").
然后,在调用这个函数时,骰娘便会向群聊971050440发送一条信息: “test,test~”。
函数返回值
这个函数会返回两个值,一个是此函数调用成功与否的布尔值,另一个是API|go-cqhttp帮助中心 中有说明的响应json数据,你可以设置变量来接收并发送它们。
四.更新日志¶
- 2022.11.28
修复set_group_special_title调用出错的bug;
增加了一个函数返回值。
- 2022.12.3
将库更新为单个lua文件,使用更方便
但是不敢确定复制过程中有没有留下新bug
Ended: Wiki
Rss ↵
Rss¶
Warning
如果你使用了FireFox浏览本页, 可能会导致意想不到的奔溃, 这时你只需要换一个浏览器即可。
欢迎订阅Rss源至你的邮箱,这样每次更新的文章都会第一时间推送给你。
Info
简律纯提供了两个Rss源可选,
-
lastest-created
-
lastest-updated
当然你也可以两个都添加订阅。
一切都值得一试。
Version | Author | When | Message |
---|---|---|---|
None | Hsiang Nianian | 2022-11-01, 23:36:18 | Update Rss.md |
None | Hsiang Nianian | 2022-11-01, 23:33:30 | Update Rss.md |
None | Hsiang Nianian | 2022-11-01, 23:31:43 | Update Rss.md |
Ended: Rss
Files ↵
什么都没有哦...¶
Scripts ↵
« You're lookin' swell, Dolly »
Ended: Scripts
Module ↵
« I can tell, Dolly »
Ended: Module
Ended: Files
Updates ↵
2022-11-03
Warning
1.mml530 guide listen2me的mml教程.
2022-10-03
Missing
1.wiki:Midido 扩展库Midido的wiki使用教程.
2022-8-28
Warning
1.Genshin_Impact_tts.lua 原神tts.
2022-8-26
Done
1.Print.lua 自定义print,将print内容作为日志写入文件.
2022-9-08