欢迎来到Dice! 文档¶
炼骰手册¶
DiceMaid CookBook
骰娘是怎样炼成的
Dice!常见问题手册
前言¶
本手册面向Dice!V2.4.0以上的用户以及对应机器人的使用者,用于解答使用、搭建、维护、开发方面的各类问题,作为Master Manual和User Manual的补充。相对于两份手册与版本同步,本手册更多地提供纲领性说明。如有疏漏,欢迎提出。可通过向骰娘.send [发送消息内容] 发送信息。
对骰娘有了解的用户可以跳过第一部分,不自建骰娘的可以忽略第四、第五部分。本手册内容并非必须记住,但希望能在需要查阅时像开卷考试一样熟练。
安研色&溯洄
QQ:3258528467
一、骰娘是什么¶
骰娘是QQ账号、功能核心(掷骰)、非核心功能、(虚拟形象)相统一的有机体。一位骰娘是一个能响应掷骰功能指令的QQ(机器人),处理来自QQ的消息并通过QQ发送回复。本手册所述骰娘一般为泛指,部分语境下描述的是Dice!插件专有的骰娘特性。
为什么需要骰娘?¶
QQ线上玩家玩线下游戏所需要的实体骰子的替代,即“玩家共同见证的随机数生成器”,是骰娘的功能核心。当玩家需要使用功能时,发送特定格式的消息,骰娘即会响应并回复结果。
KP: 你骰一个1D100
PL: .r 1d100
DiceMaid: PC掷骰: D100=100
为什么骰娘为TRPG(跑团)服务?¶
开门见山地说,Dice!是一款TRPG掷骰服务插件,针对角色扮演游戏和特定游戏规则(COC/DND/WOD)特化了高级功能,简化了部分游戏内琐碎重复的操作(记录属性、理智检定、成长检定、奖励惩罚骰、计算成功等级、加骰等),帮助玩家专注于扮演体验,同时降低跑团记录整理的工作量。
当然在理论上,骰娘可以服务于所有需要实体骰子的场合。如果哪天你玩祸不单行/飞行棋/小黑屋/教改风云把骰子玩丢了,你一样可以使用骰娘来进行游戏。但对线下玩家而言,骰娘对实体骰子没有明显优势,因此在线上玩家不方便使用实体骰子的场合,骰娘才有其优越性。
相应地,文字类游戏本身适合在QQ上进行,而桌上角色扮演游戏对地图/棋盘和指示物依赖低,操作更偏向于有随机性的文游,骰娘由此与QQ跑团相辅相成。实际上你也可以用骰娘在QQ上开一局飞行棋,但如果可以,为什么不直接在平台上玩飞行棋呢?
为什么是骰“娘”?¶
“骰娘”是一个习称,因为元祖级公共掷骰机器人均为女性形象。现在“骰娘”的形象可以是骰郎、伪娘、AI、宠物、小精灵、神话生物、SCP收容物……事实上,一个掷骰机器人甚至可以没有任何形象设定。直至今天,绝大多数的主人仍然希望见到女性形象的骰子来服侍广大玩家。因此本手册沿用这一称呼,以指代任何形象的掷骰机器人。
什么是骰娘的主人/骰主?¶
主人是对骰娘有所有权、控制权的人,拥有插件内最高管理权限。这里认为主人持有骰娘QQ账号,控制骰娘酷Q所在电脑/服务器,即使实际上可能并非由同一个人负责。在Dice!较新版本中,获取和调用主人权限的指令为.master,因此主人习称为Master。
成为一名骰主并没有太多要求,因为酷Q air/Mirai是免费软件,Dice!插件免费且开源,因此顺着步骤操作很容易拥有一只属于自己的骰娘。如果实在不想自己动手,在QQ群开出百元一年全托管不含人设的价位,会有许多人乐意效劳的。目前为止,已知作为Dice!系列骰娘主人的QQ用户有至少1000位以上。
什么是公骰?¶
与仅供自己或亲友使用的骰娘相对,公骰是开放公开服务,可以免费供他人使用的骰娘。客人基本可以像邀请其他人一样邀请骰娘进群,而没有额外的申请步骤。一般而言,公骰也会相应地有更严格的规定,以保证对其他用户提供稳定的服务。公骰主人会花更多精力维护骰娘的运行,但也因暴露而有更高风险遭遇不可抗力的制裁。(仅供参考,公骰Master可能有不同的政策)
请务必用对待女朋友的方式对待骰娘!
——溯洄《Dice! 掷骰机器人搭建说明》(这句话其实不是我说的——溯洄注)
二、骰娘怎么了¶
骰娘怎么被冻结了?¶
主人们为了维护骰娘账号往往需要与QQ安全中心打交道,尤其是解除保护模式-QQ安全中心。骰娘是典型的QQ机器人,轻易加入群聊,秒过陌生好友,以反人类的速度和频率同时在各个群发送消息,故本身有较高的封禁概率,而踢出群聊、大量刷屏等操作则会推动骰娘的暴露。因此,即使在日常运行时,骰娘也有可能被QQ安全中心检测识别为传播不良信息并封禁。而如果对骰娘进行举报,则会有较高概率被QQ所通过。因此,骰娘和用户都需要对骰娘突然被冻结做好准备。
用户在遭遇骰娘冻结的情况时,若相识可第一时间提醒骰娘主人解冻。但有时保持冻结也是一种保护,因为经验表明安全中心会对近期被冻结的骰娘进行复查,急于恢复使用有更高概率令骰娘遭遇反复冻结。
骰娘怎么拉黑我了?【版本限定】¶
“拉黑”是对向特定用户或群停止服务的习称。骰娘在对特定用户停止服务后,会停止响应指令,清查与用户的共同群并视情况退群,默认会向用户发送拉黑通知(主人可以在个性化时取消通知)。拉黑引出了骰娘和用户群间的孤立与反孤立,就像学生时代的校园故事。但是仅此而已,骰娘不会对被拉黑的用户做出更多实质性惩罚,或者说,不能施加更多暴力。
Dice!内置三类自动拉黑机制:移出群、群禁言、单人刷屏,前两项拉黑所在群和操作者,后一项拉黑操作者。同时骰娘会生成warning,其他骰娘在接收到消息并验证可信后会同样做拉黑处理。(注:在Dice!远古版本,骰娘缺少身份检测,会拉黑主人甚至自己。现在这种情况已经被排除了,骰娘会乖乖被主人口球。)
内置拉黑机制只是对用户协议通用条款的最基本实现,协议的最终解释权归主人所有,主人完全可以手动停止对违反协议的特定用户或群的服务,特别是缺少自动判定条件的行为,如教唆犯、连带责任、刷屏、敏感词等,Dice!的开发者对一切拉黑等现象不负任何责任。
如何恢复服务?¶
默认协议不包含恢复服务相关规定,因此唯一的途径是让事主同意撤销黑名单,即完全取决于主人意愿(所以去官方群是没有用的)。
参考流程(不同骰主并不通用):
- 联系事主(指主人,不要指望找骰娘有回应),表达解黑意向
- 还原事发情形,表达态度
- 验证自己熟悉指令用法和用户协议,保证以后遵守协议
- 获得谅解并等待广播决议
解黑通知
云黑是什么?¶
“云黑”是对骰娘间不良记录共享机制的习称。Dice!没有全体骰娘同步的黑名单,只有供核验的不良记录库和骰娘对!warning指令的响应机制。骰娘在遭遇不良行为时会自动上传记录信息,其他骰娘在接收到warning指令后与云端通讯核验信息,确认无误后同步拉黑。骰娘的任何本地黑名单记录都最终受控于骰娘管理者,骰娘永远拉黑不了自己的主人。(如果有,那就用.master指令解除。)
刷屏监测是什么?¶
骰娘会分别记录每个用户一段时间内的指令次数并折算指令频度,当某用户的频度达到不同阈值时,骰娘会分别初次警告、最终警告、拉黑用户。三个阈值相当于6次/30s、12次/30s、20次/30s。注意刷屏的解释权归主人所有,不要试探算法的底线,即算法不判定刷屏≠主人不认为刷屏。
刷屏警告
触发警报后,一般需要等待至少半分钟至一分钟再使用指令,否则容易短时间多次触发。例:某次结算成长累积频度到6,触发警报。这时停止指令,频度会从6逐渐降低至0。但如果在频度降到5时便等不及继续指令,频度重新达到6,再次触发警报。
解散群/移出讨论组算踢出吗?¶
骰娘不会意识到发生了什么,也不会触发拉黑。解散/移出之前dismiss能为骰娘管理群聊提供少许的方便。当然,骰主如果用PCQQ登录骰娘时收到了被移出讨论组的群聊系统消息,根据协议也是可以手动拉黑的。(仅供参考,不同master可能有不同政策)
协议里没说不许这样啊?¶
这类问题只能向主人申诉争论。可以在不影响无关群氛围的前提下提出自己的意见。
骰娘的规矩好麻烦怎么办?¶
参考第四部分,做自己骰娘的主人,这样就不用担心违反协议了——骰娘会永远信任自己的主人,无论被做什么都不会反抗。当然,找到一个信任自己的骰主,获得豁免级别的信任,就可以随便使用对方的骰娘了。
骰娘怎么没反应了?¶
首先从头像查看骰娘在线状态,确认骰娘是否在线,不在线自然不会响应。之后分情况讨论:
私聊有回应,群内不响应¶
请检查日志,如果日志中有发送消息的记录证明你的消息被腾讯当作垃圾消息/广告等内
容拦截,无法正常发送。这一现象在新账号身上发生很频繁。请尝试正常使用此账号几天或
更换账号重试。此问题并非插件问题,也没有确切的解决方法。群聊被屏蔽
群内有回应,私聊不响应/暗骰不私聊¶
当骰娘与用户不是好友、私聊需要通过群聊窗口发起时,发送有概率发生错误:找不到与对象的关系。通过添加好友来修复这一错误。
装载其他应用后,骰娘不工作了怎么办?¶
请打开酷Q的应用面板,检查优先级,确保没有更高优先级插件拦截指令(数字越小,优先级越高,但只在10001到40000之间合法)。
三、骰娘怎么用¶
善于查表¶
用户要善于查指令(.help指令,或查看用户手册),骰主要善于查回执条目表、全局设置表(及时更新版本适配的Master手册,使用测试版本的需要适配测试手册)以上手册下载地址可以在官方网站 找到。
指令怎么用?¶

指令是能触发骰娘响应的消息。所有的掷骰指令都以前缀标识符(.。!!之一)、指令名("r")、参数("d")构成。前缀标识符帮助骰娘快速过滤一般聊天消息,指令配合参数表达想要实现的功能。部分指令可忽略参数。请养成参数之间带空格的好习惯!完整指令说明请熟读用户手册,必要时对骰娘发送.help 指令,注意说明中方括号表示转义,圆括号表示可省略,不要单纯替换而保留括号。
注:在Dice!2.3.8exp10之后,半角方括号[]会在录入角色卡表达式时用到

复数骰娘时怎么指名?¶
可以想象,存在一个群内同时存在多位骰娘的情况,而正常使用只需要用到一位骰娘,而其他骰娘则被希望不响应指令。此时,可以at指定骰娘并接指令,令指定骰娘响应;也可以停用其他骰娘的指令。当我们需要停用骰娘DiceMaid(123456789)的指令响应时,以下指令是等效的:
@DiceMaid .bot off
.bot off 6789
.bot off 123456789
类似地可以通过.bot on重新启用指令。
怎么邀请骰娘?¶
请确认熟悉骰娘指令!请确认同意骰娘协议!请确认邀请骰娘得到群内同意! 默认协议下默认邀请前已完成确认。如果自己不是群管理或得到群主同意,请不要擅自邀请骰娘,因为你不能对骰娘负责,这同样也是对骰娘所进的群不负责任。
认识要用的骰娘¶
QQ签名、说说动态、help文档都是骰娘展示自己的空间。为你和骰娘将来的体验负责,在使用前请尽可能了解你选中的骰娘。
一定要给骰娘管理吗?¶
Dice!较新版本中,给予骰娘群权限的群能得到更多信任,这暗示群主授予骰娘管理员权限。然而,由于对骰娘全部功能的未知,这种轻率地授予信任可能反过来带来风险,如擅自禁言或踢出群员。现在有越来越丰富的方式建立骰娘与群之间的互信,因此我们同更推荐群主规训群管理并申请群白名单,特别是在骰娘多且无法同时当管理时。(以上仅供参考)
可以收集骰娘吗?¶
没有强制约束。但注意主人是知道骰娘被谁加好友、被拉进了什么群的。
骰娘可以见一个加一个好友吗?¶
没有强制约束,但请克制:骰娘是用完好友位也加不过来的;频繁加好友会被QQ临时限制好友功能;占用骰娘好友位又放置不管,这会冒犯到一部分骰主。
可以拉群把骰娘都拐进来吗?¶
请慎重:对部分骰娘而言,邀请进无关群本身违反协议;拉骰娘越随意,不良行为的风险越高;骰娘会在自动清理时自行离开。
可以调戏骰娘吗?¶
以下内容仅供参考,不同master可能对此问题由完全不同的想法,推荐先征求对方同意
骰娘的态度取决于主人对骰娘的定位。如果不清楚或没把握,请放弃这个想法。想象对一个现实的陌生人说出你要说的话会是什么样子。
工具型骰娘:骰娘是工具人。调戏=调戏一个没有感情的女仆
替身型骰娘/人机一体:骰娘是主人的假面/形象与主人统一。调戏=调戏骰主
扮演型骰娘(绊爱型):骰娘是有独立人设的皮套,扮演者服务于形象。调戏=调戏骰娘的人设形象
养成型骰娘:骰娘是主人的梦中人具现化的对象。调戏=调戏主人的伴侣/情人/儿女
骰娘身上每一处萌点,都来自主人藏在骨子里的可爱。
——安研色《自己现说的》
可以私聊骰娘吗?¶
尽量避免发送不当内容。(Dice!官方无法保证任何机器人的安全性,无法排除对方恶意利用聊天内容的可能,对于任何机器人都请谨慎对待,请不要发送包括但不限于隐私信息,密码,信用卡号等,在有骰娘的群也是如此)
可以金钱援助解锁交际功能吗?¶
欢迎用户为骰娘提供QQ会员开通、酷Q pro续费、服务器续费等援助。至于骰娘的回报……说不定骰运会好点哦。
可以拿骰娘当作文件中转/记录吗?¶
公共骰娘偶尔会收到没头没尾的扮演文本、模组内容、人物卡和奇奇怪怪的文件,因为会有人把这当作存储临时内容的窗口。请尽量使用QQ自带的文件助手替代,因为一旦发粉红内容给骰娘,骰娘还接收了的话,事情就比较尴尬了。(我就收到过——溯洄)
四、骰娘怎么做¶
简而言之:准备一个干净的QQ号,下载一份酷Q 或者Mirai,装入Dice插件,用QQ账号密码登录酷Q(可能需要登录验证),在应用管理内启用应用后,一只新骰娘就诞生了。
整合包可以在官方网站 找到下载地址
什么是酷Q【酷Q】?¶
酷Q是一款QQ机器人软件。简单理解,酷Q利用QQ协议假冒成设备上的QQ进行登录,调用QQ的接口,接收QQ的事件。正常QQ会把接收的消息放到交互窗口供用户响应,酷Q则会调用库中插件进行处理。
酷Q是一款智能机器人软件,严禁将酷Q用于违法用途(如发送广告/群发/诈骗、色情、政治等内容)。
酷Q是一款智能机器人软件,由应用提供群管理、智能对话、好友互动、生活助理等智能功能。
您不得利用本软件从事赌博(《刑法》第三百零三条)、传播色情(《刑法》第三百六十四条)、诈骗(《刑法》第二百六十六条)等违法行为。
——酷Q官网
酷Q使用易语言编写,只提供运行在 Windows 平台的版本,在 Mac 或 Linux 平台需要自行搭建 wine 环境或使用 Docker 映像。
日志定时清理
酷Q做不到什么【酷Q】?¶
(酷Q自带的接口监测不到或处理不了)拉取讨论组成员列表、监控讨论组移出、监控群解散、监控消息撤回(被撤回的消息记录不会删除)
酷Q不会处理离线时QQ收到的消息。因此离线时被禁言、踢出无法追溯。
为什么同一个酷Q文件夹不能多开【酷Q】?¶
电脑端只需要安装一个PC版QQ就能多开,因为每个登录QQ账户的相关数据有各自的文件夹,不会冲突。而酷Q配置文件和数据存档的相对路径都是固定的 (除了日志存放路径) ,因此想要多开多少个骰娘,就得准备多少酷Q文件夹。建议在下载酷Q后留一份备份,以免要多开时重新下载。
怎么安装插件/认主?¶
对于酷Q: 将插件cpk放入准备好的酷Q文件夹的app文件夹下,重载应用。
app文件夹
开启应用
对于Mirai: 安装Mirai-Native, 将插件的dll和json放入plugins/MiraiNative/plugins文件夹,重载应用
开启Master模式有两种方法:
- 点击菜单的M综合管理-Master设置,在输入框内输入MasterQQ,点击设置。Mirai用户请右键菜单栏内的流泪猫猫头。
- 点击菜单的Master模式切换,开启后第一个对骰娘.master (public)的用户将获得骰娘的唯一Master权限。Mirai用户请右键菜单栏内的流泪猫猫头。
认主都有什么用?¶
监控骰娘活动,指令自定义骰娘文本,调节骰娘的好友申请、群邀请等全局设置,远程控制骰娘言行。刷屏、禁言、踢自己的骰娘不会被处分。
悬浮窗显示的是什么?¶
悬浮窗默认显示每分钟结束应用处理的消息数,一般不超过千条
如何维持骰娘运行?¶
保证开机!/关机后骰娘就没反应了么?¶
想象一个离线的QQ一直对你发消息? 骰娘的事件和消息是由酷Q的进程处理的,骰娘保持运行状态要求酷Q保持运行状态,且网络正常。运行骰娘需要一直保持软件开启,因此除非短时间使用,推荐使用云服务器。由于酷Q Air使用安卓端QQ协议,因此不能和手机QQ同时使用 (包含Android QQ, iOS QQ 以及轻聊版),推荐使用小号登录。酷Q Pro和Mirai可以使用平板协议,这样就不会产生冲突了。
保护骰娘的QQ账号¶
QQ是骰娘的载体,一个QQ被永久冻结的骰娘除了换号转生,只有毕业的结局。因此,维护骰娘的首要任务,是保证骰娘QQ免受制裁(屏蔽消息、屏蔽空间、冻结封禁等)。而骰娘作为一类QQ机器人,在服务的过程中必然承担被制裁的风险。
为了降低封禁风险,请避免骰娘频繁被踢出群或大量发送消息。善用黑名单功能,主人有权利自行修改骰娘的用户协议,必要时完全可以自行.admin blackqq [用户qq] 拉黑[用户qq]
新骰娘号怎么养?¶
新注册或长期未用的QQ账号不宜立即作为骰娘投入使用,建议先作为正常用户使用、聊天。尽可能降低异地/陌生ip、陌生设备登录情形下的暴露风险。
耗用资源的操作错开进行【版本限定】¶
骰娘初始会设置在四点执行一次自动保存,五点时执行一次黑名单群清理。如果多只骰娘在同一系统上运行,同一时刻处理会集中在一点产生大量的资源占用,使CPU占用飚升。最好避免这种情形,比如令骰娘自动保存/清理的时间错开几分钟。
骰娘怎么重启后没保存?¶
骰娘在运行时产生的数据保存在内存中,需要保存到(硬盘)存档文件夹内,才能在下次启动时读取。酷Q在应用停用/退出时会调用内部事件,插件也会在此时自动保存存档,关机时终止酷Q进程不会调用酷Q的应用退出事件。因此不到万不得已,不要未关闭酷Q就重启设备。
目前,部分修改频率较低的全局设置实现了即改即存,但角色卡属性等修改频繁的数据仍然需要在停用/退出时存入文件或手动保存。
保证插件的运行环境¶
监控CPU和内存占用【版本限定】¶
555版本后,插件会每半小时一次检测系统的CPU和内存占用。当占用率(百分比)超过设定的阈值(初始值90)时,会自动告警。服务器切忌等内存占用100%后再反应,否则可能无法远程连接成功,以免被迫重启服务器。选择一家省心服务商的省心服务器会降低很多不必要的精力耗费,免于发包被网关拦截、资源管理器内存随时间占用增长等烦恼。
服务器要多什么配置?¶
不考虑其他插件,Linux上运行骰子至少要128MB内存,Windows要1G内存;硬盘需要1G,容量越大,必要的清理文件频率就越低;CPU一般都够用。Shiki序列至今仍有一只官骰,蜗居在256MB内存的服务器上($11.25一年)。
控制所在群的数量低于500【仅限酷Q】¶
受接口限制,骰娘拉取的群列表长度上限为500。因此,当骰娘需要清查黑名单用户共同群或清群时,如果所在群数超过500,不在列表内的群就会免于清理。而这些群同样无法正常使用群管功能。因此,请定时清群。
Mirai不受此限制
怎样在运行同时登录骰娘QQ?【仅限酷Q】¶
Mirai默认使用平板协议,无需额外设置
对于酷Q:
QQ允许电脑端、手机端、平板端同时登录,因此可以使用与酷Q错开的登录设备来同时在线。酷Q默认使用QQ手机端进行登录,不影响主人使用QQPC版或QQHD登录骰娘QQ。如果一定要使用手机QQ登录,可以使用付费的酷Q pro并将所用QQ协议修改为HD版。
具体操作:
酷Q协议
打开"[酷Q根目录]\conf\CQP.cfg"(使用记事本即可) 如果里面已经有[Dev]段,请在其下一行输入Platform=2 如果里面没有[Dev]段,请在文件最后加入
[Dev]
Platform=2
注: Platform=2代表采用安卓平板协议,Platform=0代表默认安卓QQ协议,Platform=4代表企业 QQ(普通账号无法登陆),Platform=5代表MacQQ(与 PCQQ 冲突)
骰娘怎么运营?¶
可以把自己做成骰娘吗?¶
不必须用小号,但是会影响你主号的使用,所以推荐用小号。为了避免因被禁言或踢出,制造不必要的麻烦,请提前关闭本体的不良行为监听,给不作为骰娘使用的群加免黑或忽略。由于随时有被腾讯封号的危险,请保证主号没有依赖于QQ的事务。使用酷Q air的情况下,注意有些功能是手机QQ限定的。
需要酷Q pro吗?¶
可选。发图、语音、点赞、撤回、禁言功能需要购买pro方可使用,但这均与Dice!核心功能无关。
【时效性注意】考虑长期购买,最优惠的支付方式为先购买1个月(¥12)授权,然后每次续费6个月(¥54),以此方式,授权开销为¥3+9×授权月数
骰娘有什么注意/禁忌?¶
不要作弊!不要作弊!不要作弊! 公平随机是骰娘的生命。Dice!现在没有、将来也不会有操纵单个掷骰结果的功能。按经验,出千的骰娘需要向用户挨个谢罪并自愿█████,请不要放过这样的骰娘。
除此之外,骰娘是主人的私有物,完全受主人意愿支配。但如果要在非自己的群使用,也要注意考虑其他用户的体验。如:保证其他所有插件的功能在群内可开关,提前告知会调用群管理权限的功能,可以正常响应送出指令(禁止禁止!dismiss),不会频繁回复常用语句,避免使用禁言或踢出功能的插件,窥屏避免随意插话和多余操作,等等。
限定骰娘的服务范围【可选】¶
不少公骰在默认协议的基础上追加“禁止非跑团群使用”的内容,既因为这是Dice!骰娘设计的出发点,也为了让骰娘留在一个关系密切的用户网络内,这样协议的效力相对有保障。跑团用户从素质上并不比其他用户更守序,但因关系网络的存在而更易接受协议约束。对于一名和骰娘用户群关联甚少的陌生用户而言,被骰娘停止服务是一项零损失的惩罚。这也是邀请者需要为不负责任地邀请承担连坐的一项理由——不负责任地邀请导致骰娘在陌生且危险的群体中流传。
需要有自己的骰娘群吗?¶
强烈推荐为自家骰娘运营一个用户群,只要骰主认为用户数足够多。专门的用户群可以方便骰主及时通知骰娘冻结、维护等消息,处理许可申请、解黑等事宜,与用户协商沟通骰娘个性化细节,发布自定义列表,也更容易培养有黏性的忠诚用户。一批忠诚用户比几倍的路人用户更有价值:更有可能遵守用户协议;加入不可控陌生群的风险更低;可以更稳定地吸收用户;更容易得到打赏或推出其他增值服务,等等。
骰娘可以用来营利吗?¶
对于使用Dice!及其任何衍生版本的骰娘而言,可以。Dice!源码遵循 AGPL3.0 协议,不限制复制、修改用于商用,但需要保留原作者署名。骰娘一般通过开放二维码投食来平衡服务器的支出(新年、情人节等节日是暗示投食的好时机)。骰主也允许收费提供掷骰服务,当然,就供求现状而言,要以这种方式盈利似乎有困难。
注意,如果要商业化,除了掷骰插件,请注意骰娘其余部分有无商用限制,比如图像、文本创作/翻译内容、其他插件。即使非营利,也请避免因盗图、盗人设产生的纠纷。

五、骰娘怎么调教¶
如何个性化回执文本?¶
自从V2.4.0开始,推荐使用菜单-综合管理-自定义回复来直接设置回复
除此之外,你也可以使用str命令:
str是一个较为特殊的指令,因为前缀str既是指令名,又是参数的一部分。str指令的格式如下:
.[条目名] [文本] //定义文本
.strSelfName 本骰娘
.[条目名] //查看文本
.[条目名] reset //查看文本
.[条目名] NULL //定义文本为空
例:img
转义¶
str文本中,{}表示文本变量替换,如{nick}会自动转义成用户昵称。一部分变量是通用的,如{nick}, {pc}, {at},另一部分则只在部分场合有定义,如{res}。默认文本使用的变量一定是有定义的。完整条目见Shiki_Master_Manual.pdf->自定义回执文本
例:img
全局设置怎么调?¶
自从V2.4.0开始,推荐使用菜单-综合管理-Master设置来调整全局设置
除此之外,你也可以用admin命令:
.admin [参数名] //查看设置
.admin [参数名] [参数值] //修改设置
完整条目见Shiki_Master_Manual.pdf->全局设置

如何全局禁用.draw/.jrrp/.send?¶
自从V2.4.0开始,推荐使用菜单-综合管理-Master设置来调整下面三个选项,或者使用命令:
.admin DisabledDraw/DisabledJrrp/DisabledSend 1 开启时表示禁用
##### 如何用Dice!拦截其他插件?【版本限定】
开启DisabledBlock,会在群内停用指令时拦截低优先级插件。
.group +拦截消息 ,会在群内拦截低优先级插件。
牌堆怎么装?【版本限定】¶
通过将牌堆文件放入文件夹DiceData\PublicDeck\令骰娘读取,可以添加骰娘.draw可抽取的牌堆。牌堆文件夹可以在官方网站内获取,也可以自制。
牌堆文件夹
牌堆故障
角色卡模板怎么装?【版本限定】¶
内置卡模板仅有且默认“COC7”,额外模板需要参考样例制作并放入DiceData\CardTemp中,要求文件编码为GBK。每个文件对应一个模板,一个模板可以由多个文件配置。
角色卡模板
读取已存在的角色卡模板时,别名、变量、默认值等采用增量加载的机制,各文件的条目将合并。展示列表采取覆盖加载,同名的生成选项采取覆盖加载的机制,可以将追加生成选项置于独立文件。加载按文件字典顺序,先加载当前目录文件,后递归加载文件夹内文件
利用模板生成预设卡参考"COC7-预设调查员.Dxml",生成非典型调查员参考"COC7-神话生物.Dxml",制作规则扩展参考"COC7-西藏之谜.Dxml"
文件为类XML格式,不符合XML规范,特别体现在没有&的转义
如果读取角色卡时无对应模板,角色卡内部会以“COC7”为模板
Dice! Master手册¶
手册更新时间:20220607
这是Dice!于2022.12.15更新2.6.6rc(638)后对应的Master手册。
用户指令请参考用户手册。
更多内容可参看Dice!论坛。
本手册中[DiceData]一律指代Dice!存档目录,当前版本格式为[框架根目录]/Dice[DiceQQ]
前言¶
感谢您选择Dice!
此手册将帮助您了解Dice!的基本使用和配置
如果在使用中遇到任何问题或者有任何建议,请在阅读文档后访问Dice!论坛提出你的想法
如果你认为此文档中有任何错误或值得改进的地方,欢迎点击右上方 Edit on GitHub 按钮修改文档。或者你也可以在论坛提出你的想法
祝跑团顺利!
目录¶
更新说明(2.6.6)¶
- 新增: 变量赋值转义标识var
- 新增: 转义send定向发送的消息
- 新增: toml读写
- 新增: webui远程获取模块资源
- 新增: webui可进行mod调序
- 优化: webui可定制化
- 修复: rc附带奖惩骰时无法调取属性
2.6.5¶
- 重写认主机制
- 恢复cloud update远程更新
- reply与msg_order合并,新增限制项lock
- 优化消息转义,支持case、grade条件输出等,支持welcome有限转义
- 留档每日数据至/user/daily/
- 优化
mod on/off
热插拔,支持mod get安装/info信息/detail详细信息/delete卸载/reload重载/update更新/reinstall重装
- WebUI新增模块管理页
- mod新增image与audio子目录
- 支持TimeZoneLag项手动调整时差
- 新增各项lua交互特性,新增函数getSelfData,msg:format等
- json等数据结构采用fifo特性
2.6.4¶
- WebUI优化回执跨行编辑,同步reply的触发词多对一
- 新增
.mod on/off/list
指令 - mod新增event子目录,支持循环
cycle
/定时clock
/代理hook
类型事件 - 更新log指令,允许自定义log名
- 更新ob指令
- 新增
.link state/list
2.6.3¶
2.6.2¶
- 可使用.str reset指令重置过时的文本而无需重启了
- reply新增触发限制条件,
reply set
时可加入Limit字段 - 优化.setcoc指令,可使用.setcoc show查看
- getUserConf支持获取用户名称
- getGroupConf支持获取群名片/群权限/最后发言
- WebUI页面为Master配置项添加说明
- 角色卡、用户配置、群配置支持读写table
- lua新增函数log,用于向框架或通知窗口输出日志
- 允许设置全局默认rc房规
- 允许lua修改5级以下信任
2.6.1¶
QQ框架(Dice!2.5.0+)¶
2.5.0版本,Dice!本体由酷Q插件改为了独立于框架的dll,由作为框架插件的DiceDriver加载,具体能实现的接口视框架条件而不同。先驱跑路后,Dice!驱动器目前支持Mirai、MyQQ、MyQQA、OnoQQAir、go-cqhttp框架,也在跟进OvQQ等更新。由于不同版本适配进度不同,你可能无法找到以下所有版本。Miria加载DiceDriver须使用MiraiNative插件。
QQ登录协议¶
同一QQ在同一类型设备(手Q/电脑/平板)登录时会将原先设备挤占下线,因此骰娘在框架登录所用设备应与人工登录所用设备错开。
选择一个框架¶
MiraiAndroid是当前不使用模拟器在手机挂载Dice的唯一选择,MiraiDice也支持在Linux、MacOS等系统挂载Dice,详见Dice! 论坛 Mirai版教程。
框架接口差异¶
- Mirai2.*(MiraiNative转接):
- 支持手Q/平板登录
- 不能多开QQ,启动即登录
- 无法处理登录设备异常(但支持设备锁验证)
- 不能响应来自自己的消息
- 无法获取未加入群的群信息
- 支持Windows, Linux, MacOS, Android, iOS(停更中)
- HiMyQQ:
- 由于程序不支持附加调试,存在未排除的异常风险
- 固定PC设备登录,协议可以选PC版QQ或者PC版TIM等
- 允许多开QQ,支持扫码登录
- 无法私聊发送语音文件
- MyQQA(MQ安卓版):
- 由于程序不支持附加调试,存在未排除的异常风险
- 支持手Q/平板登录
- 允许多开QQ,但不支持启动自动登录
- 选择手表协议登录时支持扫码登录
- 接收好友申请时无法获取验证信息
- 因为程序缺陷,会出现连接服务器失败、“与服务器北京时间相差超过1秒”等问题
- 能接收频道消息,但发送频道消息疑似需要申请官方接口
- go-cqhttp: 2. 支持手Q/平板/手表登录 3. 不能多开QQ,但DiceDriver支持一键启动多个go-cqhttp.exe 4. 支持扫码登录
框架目录结构¶
Mirai目录
¶
非Windows系统可能目录稍微不一致,但文档中提到的应该适用于任何操作系统。Android版目录位置为内部存储空间/Android/data/io.github.mzdluo123.mirai.android/files/
2.5.0+版本升级¶
- Mirai版本:执行Update.sh/更新.cmd
- MiraiAndroid: 安装新版APK
- 其他版本: 需要将更新版的w4123.Dice.dll放入Diceki文件夹替换旧文件,并重载DiceDriver插件;如果DiceDriver同时有新版则必须同步更新
- 请关注论坛以获得具体版本的更新方法
从低版本升级到2.5.0+¶
迁移骰娘存档到整合包¶
将对应版本的存档目录[DiceData]复制到新框架根目录下。
- 原Dice2.4.0及以上版本:根目录下的Dice[DiceQQ]文件夹
- 原Dice2.3.8exp9及以上版本酷Q骰娘:根目录下的DiceData文件夹
CQ根目录下的DiceData文件夹
如为原Dice2.3.8exp10(555)及以下版本:将data/app/com.w4123.dice复制到新目录[DiceData]/com.w4123.dice的位置。data/app/com.w4123.dice
Mirai框架升级¶
- 按照论坛中教程,使用新安装方法安装新版本Mirai
- 迁移Dice[DiceQQ]目录
- 将根目录下device.json复制到根目录下(让Mirai继续使用先前的登录信息)
WebUI配置面板(推荐)¶
WebUI是全平台可用的图形化配置页面,通过Dice!初始化时运行的监听端口访问。
WebUI 基础使用¶
在登录成功以后,Dice!会向Master(没有Master的情况下,自己) 发送WebUI运行的端口。如图中运行在8080端口。默认情况下,WebUI运行在一个随机的未使用的端口,但你可以通过WebUIPort属性更改。
启动初始化
在本地(运行Dice的同一个设备)浏览器中输入http://127.0.0.1:端口
进入WebUI 请一定要输入http://否则某些浏览器会卡死 .system gui
指令也会引导打开WebUI
如果你在远程访问WebUI,请确定已配置好防火墙等,并使用对应的IP地址或域名访问(而不是127.0.0.1)
端口访问WebUI
提示登录时,默认用户名为admin,密码为password,进入WebUI后可在WebUI配置栏更改密码。WebUI默认只允许本地访问,所以如果设备只有你一个人能访问(不是共享的云服务器等)不更改密码也无所谓。
主界面
可以在上面执行管理操作,应该都符合直觉。需要注意的是你可以直接点击表格修改其中内容,表格中的修改无需点击保存等,会在编辑完成后自动生效。
WebUI 配置¶
WebUI有三个配置项,更改配置后重启才会生效
EnableWebUI
- 启用WebUI, 0为禁用, 1为启用, 默认为1
WebUIPort
- WebUI端口, 0为随机, 其他为固定端口
WebUIAllowInternetAccess
- 允许从非本地地址访问WebUI, 0为不允许, 1为允许, 默认为0, 也就是WebUI默认只能从本地访问。如果你使用Docker网络等,你可能需要将此项设置为1才能在Docker宿主机上访问WebUI。
WebUI 环境变量¶
可以通过环境变量设置WebUI配置。环境变量具有较高优先级。
DICE_WEBUI_PORT
设置端口,0为随机端口
DICE_WEBUI_PORT_USE_VARIABLE
使用另一个环境变量的值作为端口,比DICE_WEBUI_PORT有更高优先级,可用于PaaS等平台
DICE_WEBUI_ALLOW_INTERNET_ACCESS
0为不允许, 1为允许
配置远程访问¶
WebUI 使用 HTTP Digest验证,密码保存为Digest,理论上比较安全。然而,如果需要暴露到公网,我们仍然推荐使用nginx或apache等配置好TLS然后反向代理到Dice WebUI以确保安全。
当然,允许远程访问前请务必更改密码,不然再安全也没用。
GUI管理面板(已停更)¶
任意Windows框架可对骰娘发送.system gui
打开图形界面(确认进入GUI,取消进入WebUI)。请注意此页面仍可使用,但将不会继续更新并有可能在未来版本移除,推荐使用上方提到的WebUI进行设置修改。
(MiraiNative)右键托盘图标(流泪猫猫头)->(插件菜单)Dice!->综合管理Mirai面板入口
(OQ等)切换至插件列表页->Dice.Driver(右键)->设置插件。单框架多开时请使用指令,避免错乱
可在界面内设置Master、调整用户信任、修改CustomMsg文本、修改全局配置
图形界面2
骰主(Master)¶
Master是骰娘的控制者,每个骰娘同时至多只能有一个Master。Master可以控制骰娘的发言和行为,并进行大量个性化配置,也对骰娘行为负责。受信任用户也可以获得对骰娘的部分权限,但只有Master拥有发放和回收高级权限的权限。
新生骰娘默认为无主状态,你可以在WebUI/GUI管理面板完成认主(推荐,WebUI支持全平台)或在聊天栏输入口令认主。无主骰娘在启动时将向自身账号及框架日志窗口输出认主口令,在聊天栏中对骰娘发送对应口令将绑定发送者账号为Master。也可直接在管理面板设置Master。认主时将自动开启全类型通知窗口,建议将部分通知特别是通知窗口0转移到专门的小群。
.master delete
解除绑定,骰娘此时会重回无主状态,清空通知窗口,但先前设定的配置不会初始化。
.master reset [新masterQQ]
解除绑定,骰娘此时会认主[新masterQQ](原Master保留信任级别)
.master admin
添加管理时自动将私聊添加为监视窗口,管理可以用.admin delete
放弃权限,清除窗口可以私聊.admin notice - me
控制台指令¶
状态查看¶
.admin state
可以查看当前的全局设置和黑白名单情况
遥控开关¶
.admin boton/botoff [群号]
//等效于所在群群管使用.bot on/off.dismiss [群号]
//可以遥控骰娘退出所在的群,即使骰娘不在,也能将该群移出白名单
消息发送(.send)¶
send用于用户与管理员间的远程交流
.send 待发送消息
(任何人可用)向Master发送消息
.send [窗口] [待发送消息]
//向指定窗口发送消息(权限4限定;权限5用户发送的消息不会标明转发来源,等效于骰娘亲自说话)
窗口是指QQ收发消息的聊天窗口。窗口参数识别一下6种格式:
- qq [QQ号]
- group [群号]
- discuss [讨论组号]
- notice [通知类型](仅send可用)
- this(发送指令的窗口)
- me(发送者的私聊窗口)
消息转发(.link)¶
link用于管理员与特定窗口保持交流(尤其是新加入、待审核的群),或者操纵骰娘跑团
.link to/from/with [窗口]
当前窗口向目标窗口单向转发/单向接收/双向转发消息
.link close
关闭从当前聊天窗口发起的消息转发
.link start
开启上次建立的链接
对象窗口为群/讨论组时,可省略group/discuss,直接输入群号;对象为私聊时,qq可简写为q
转发自Master的消息不会标明转发来源,等效于骰娘亲自说话
无法确认目标聊天窗口是否存在,可能会导致没有反应
系统指令(.system)¶
.system save
//立即存储所有数据(相当于执行所有停用应用时的操作)
.system load
//立即读取外置文件(模块、牌堆和角色卡模板)。便于不重载应用的反复调试。save/load涉及的文件见附录。
.system state
//显示插件运行时间及内存占用等硬件信息
.system rexplorer
//杀死资源管理器后重启。当 Windows 服务器内存占用逐渐随时间而升高时,考虑由资源管理器逐渐占用内存导致,可能适用该指令。权限5可用。
一键清群(.master groupclr)¶
遍历群列表并退出符合条件的群,也可以在应用菜单中【一键清退】。部分框架群列表上限500,请避免群数超过500。单次清群上限受GroupClearLimit
调节(默认一次至多退20个群)。
.master groupclr
可以实现一键退群,无参数时默认参数为unpower
.master groupclr [天数]
将退出当前所有骰娘在指定天数内未发言的群
.master groupclr unpower
将退出当前所有骰娘不是群管/群主的群
.master groupclr preserve
将退出当前所有无许可使用
的群
.master groupclr black
将退出当前所有黑名单群和有危险的黑名单用户的群
全局配置¶
配置项目表见附录
.admin [关键词]
//查看配置项状态,如.admin Private
.admin [关键词]=[数值]
//修改配置项。一般的开关项1表示开启,0表示关闭
通知窗口¶
运行过程中产生的提醒、警告等通知消息会分类型发送给设置的通知窗口。所有通知被分为0-9共十个等级,其中0-5会被骰娘用于内置广播,6-9用于自定义(具体通知类型见附录)。当产生通知时,会向通知窗口中所有接收该类型通知的窗口发送消息。如果没有窗口能发送消息,骰娘会将通知发送给自己;无论如何所有通知会自动保存在"[DiceData]\audit"中,请定期整理该文件夹。 由于通知窗口0会产生较多日志型消息,建议将通知窗口0转移到专门的小群。
.admin notice [窗口] +/-[通知类型](...+/-[通知类型])
//增减通知窗口类型
.admin notice - [窗口]
//直接移除指定窗口。
.send notice [通知类型] [通知文本]
//向指定类型窗口广播通知
例:
.admin notice group 928626681 -0-1-2-3-4+5
变更通知类型的接收情况
.admin notice - this
直接移除当前通知窗口
全局开关(.admin DisabledGlobal=0/1)¶
DisabledGlobal=1等价于.admin off(全局关闭)。开启时一切如常,关闭则进入静默状态,所有群聊/讨论组会相当于.bot off状态而无视群内设置,私聊会回复关闭中的信息。也可以用.admin on/off 操作全局开启/关闭,也可以在应用菜单中点击"全局开关"自动切换。
定时点事件(.admin clock)¶
.admin clock +/- [任务名] [时]:[分]
添加/移除 定时任务
内置定时任务:on-全局开启;off-全局关闭;clear-黑名单清群
允许调用自定义任务,参考plugin手册
每日执行,如果当日错过不会补回。
定时开启和定时关闭时会向窗口4发送通知文本
清群为基于黑名单清群(=.master groupclr black)
定时长事件¶
以下事件会在Dice!每运行固定时间后执行一次
.admin AutoSaveInterval=5
//定时保存用户数据(min),默认每5分钟保存一次
.admin AutoRemake=0
//定时重启(h),默认关闭。
定时系统监测报警(.admin SystemAlarmRAM/SystemAlarmCPU/SystemAlarmDisk=90) :每半小时监测一次系统内存、CPU、硬盘占用(%),超过阈值即报警。报警状态下每5分钟监测一次,如果数值升高超过1个百分点则继续报警,低于阈值则会提醒解除报警。设置在1-99时生效。
用户策略¶
用户记录(.user)¶
用户在使用指令或被授予信任后会生成用户记录
.user state
//查看自己用户记录
.user trust [用户qq]
//查看用户信任级别(4以上限定,上级对下级屏蔽)
.user trust [用户qq] [信任级别]
//调整用户信任级别(4以上限定,只能调整下级用户,最高为255)
.user diss [用户qq]
//最轻的拉黑用户(type=local,danger=1)
用户授信(.user trust)¶
每名登记用户会标记信任级别,初始为0。级别越高享受的权限越多,上级包含下级的所有权限。
.admin whiteqq (-) [白名单QQ]
可以为用户授予信任1(带减号为收回信任)
信任级别 | 权限 |
---|---|
1 | (白名单)为群分发使用许可,允许使用某些指令 |
2 | 黑名单豁免 |
3 | 响应退群指令,接受不良记录共享(warning) |
4 | (后台管理)查看、分发和收回低于4的用户权限,原管理权限 |
5 | (骰主级)查看、分发和收回低于自身的用户权限,系统操作指令 |
过期数据自动清理(.admin InactiveUserLine/InactiveGroupLine=360)¶
最后活跃天数超过InactiveUserLine的用户,其记录及角色卡会在清理用户时被清除;最后活跃天数超过InactiveGroupLine的群,其记录及开团信息会在清群时被清除。(配置项为0时不生效)
清理过期数据会在定时任务clear
中自动执行,在执行清群时也会在退群的同时检测目标群是否会被清理。
监听好友申请(.admin ListenFriendRequest=1)¶
默认开启,仅好友验证方式为【需要验证信息】或【需要回答问题并由我确认】时有效,拦截消息并决定通过或拒绝。黑名单用户必定拒绝。同意好友邀请时将发送strAddFriend,特别地,通过受信任用户的好友时会发送strAddFriendWhiteQQ。当好友验证方式为【允许任何人】或【需要正确回答问题】时,通过开启ListenFriendAdd,也会向通过的好友发送strAddFriend,注意这种方式通过的好友可能仅为单向好友。
允许陌生好友邀请(.admin AllowStranger=0/1/2)¶
默认为1。决定是否接受陌生人的好友邀请:2-无条件接受;1-无用户记录不接受;0-无信任不接受。该项设定建议配合QQ自带的【允许陌生人邀请我加入群聊】选项。
单群设置(.group)¶
.group ([群号])+/-[词条]
//修改单群设置,群内原地使用可省略群号
词条 | 效果 | 修改条件 |
---|---|---|
许可使用 | 私用模式/审核模式可正常邀请入群/群内使用 | 信任1 |
未审核 | 审核模式下标记新加入无【许可使用】的群,拒绝指令 | 信任1 |
免清 | 清群时和搜查黑名单时略过该群 | 信任2 |
免黑 | 发生在该群的不良记录无效;不搜查黑名单 | 信任4 |
忽略 | 不接受任何该群的事件 | 信任4 |
协议无效 | 不接受除云黑外的事件 | 信任4 |
停用指令 | 停止响应指令(.bot off) | 信任或群管 |
禁用回复 | 停止响应回复(.reply off) | 信任或群管 |
拦截消息 | 拦截消息,阻止低优先级插件响应 | 信任或群管 |
禁用jrrp/禁用me/禁用ob/禁用draw/禁用help | 禁用对应指令 | 信任或群管 | |
- 原群白名单自动初始化为【许可使用】+【免清】
- 重要的大群(跑团交流群、骰娘群)请加【免清】+【免黑】或【忽略】,以免意料之外的自动退群
.admin whitegroup
查看当前【许可使用】或【免清】或【免黑】的群列表
授权许可(!authorize)¶
受信任用户可通过在群内发送!authorize或在任意窗口发送!authorize +[群号]来为目标群添加【许可使用】。非信任用户也可在群内使用!authorize [理由]向窗口2发送许可申请。
!authorize (+[群号])
//受信任用户为本群+许可使用
!authorize (+[群号]) [理由]
//非信任用户申请本群许可
撤销许可使用需要使用.group [群号] -许可使用
批量群处理(.groups)¶
取群列表.groups list(管理限定)
.groups list idle //按闲置天数降序列出群
.groups list size //按群规模降序列出群
.groups list [群管词条] //列出带有词条的群
监听群邀请(.admin ListenGroupRequest=1)¶
默认开启。接收用户的群邀请(小群邀请将由QQ系统自动通过,因此骰娘无法处理或知晓邀请人),拒绝来自黑名单的邀请,邀请来自受信任用户时通过且自动为群添加【许可使用】,非信任用户时视私用模式开关状态处理。通过邀请的同时标记邀请人。如果回执为【已同意】却实际并未入群,考虑接口出错或腾讯屏蔽。
入群检测(.admin ListenGroupAdd=1)¶
默认开启。入群时反馈群信息(群名、群号、群人数、邀请人),遍历群员,获取群主信息(临时创建的群可能无法获取群管理信息)、检索黑名单,为私用模式二次确认【许可使用】,为审核模式检查【许可使用】;群内发现黑名单时会通知,有管理员是黑名单时会触发退群(群未设置【免清】或【免黑】时)。发送strAddGroup。
私用模式(.admin Private=1)¶
认主时私骰作成进入私用模式,仅在受信任用户或【许可使用】群邀请时接受邀请,在新加入管理员无信任用户(否则为群自动添加【许可使用】)且无【许可使用】的群时自动退出,退出时自动留言。也可以用.admin only/public
切换私用/公用状态。
审核模式(.admin CheckGroupLicense=0/1/2)¶
入群后,对于无【许可使用】的群,将自动标记【未审核】并发送strAddGroupNoLicense。该项生效时将拒绝提供除help之外的其他服务,其余指令仅authorize/dismiss/bot有效。该项为1时拒绝所有【未审核】的群(不溯及审核模式开启前已加入的群),该项为2时拒绝所有无【许可使用】的群(含开启前已加入的群)。
审核模式与私用模式的差别:
- 审核模式会在未许可群停留,增加潜在风险;
- 留在群内有更高向用户群引流的概率;
- 由于自动入群的小群无法正常给群加【许可使用】,骰娘在无法识别群管理的情况下会自动退群,需要受信任用户额外使用一次!authorize [群号],重复邀请;
黑名单(.admin blackqq/blackgroup)¶
任何情况下,来自黑名单的邀请不会被通过,指令除了dismiss都不会被响应
.admin blackgroup (-) ([黑名单理由]) [黑名单群号]
可以添加群黑名单(带减号是删除)
.admin blackqq (-) ([黑名单理由]) [黑名单QQ]
可以添加用户黑名单(带减号是删除),带理由时危险等级为2且通知对方,否则危险等级为1。
.admin blackfriend
//查看好友列表内的黑名单用户
危险的黑名单用户包括群内权限更高的用户或非免清群内相同权限用户(可选),同时危险等级需要达到2。危险等级只有1的黑名单用户不通知、不会触发退群。
现在自己、Master、信任2以上用户都不会新加入黑名单。
不良行为检测(.admin ListenGroupKick/ListenGroupBan/ListenSpam=1)¶
默认开启。分别开启后,移出、禁言、刷屏会被加入黑名单。生成危险等级2的不良记录后,会自动向通知5窗口广播生成的!warning指令。warning指令:接收到信任3或记录可识别的骰娘warning时,骰娘将自动录入黑名单。骰娘通过这一机制实现不良记录的传递共享。
拉黑群时会自动移除【许可使用】。
刷屏在程序内定义为发送指令超过20/30s,实际解释权归Master所有
邀请人连带(.admin KickedBanInviter/BannedBanInviter=1)¶
默认开启。被移出/禁言时将入群邀请者同时加入黑名单。
邀请者责任源于协议中不得擅自拉群的规定,这里的擅自是双向的:一边无视骰娘协议,一边无视群内意愿
云操作(.cloud)¶
查看更新(.cloud update)¶
注意:此功能可能暂时不可用。对于Mirai请执行更新.cmd或Update.sh以进行更新。
远程获取Dice!正式版及开发版信息
.cloud update
//检查版本更新
.cloud update release
//下载最新发布版
.cloud update dev
//下载最新开发版(使用测试版/开发版请保持与开发者的交流)
同步不良记录(.cloud black)¶
该指令会从后台获取经核验的不良记录,并更新本地黑名单库。骰娘不会自动同步云端记录。
不良记录¶
读取外源记录文件¶
将其他来源的不良记录BlackList.json重命名为BlackListEx.json,放置于[DiceData]/conf目录下。Dice!加载时会自动读取并更新记录,之后该文件会被销毁。两种情况下已有记录不会在读取时更新:DiceMaid就是自己;危险等级与本地记录不同。
云记录注销¶
当前记录核销在群(928626681)内完成,入群后可使用以下指令:
- isbanqq=[qq] 查询目标QQ的云记录
- 查询wid=[wid] 获取wid对应的记录
- erase=[wid] 注销wid对应的记录,仅记录中的当事骰娘(DiceMaid)和骰主(masterQQ)可用
可私聊司令塔BotShiki(Pope)(530136753)
(具体角色可能会有变动)进行上述操作。也可请求管理来完成注销,最通用证明材料为:当事人对当事骰娘发送.admin isban [本人QQ],连同骰娘回复将聊天记录转发给管理。
用户自行解黑¶
云记录核销之后,所有骰娘并不会自动同步。遇到尚未注销黑名单的骰娘,请用户自行解黑。方法为对已注销的骰娘发送.admin isban [QQ],将得到的warning指令保存,用于私聊未注销的骰娘。由于骰娘存在连接后台失败的可能,导致无法获取记录更新的信息,因此无法保证指令有效。这时请联系相应骰主。
其他机制¶
框架消息富文本转义(CQ码)¶
DiceDriver会将不同框架下接收的QQ富文本消息(图片、语音等)转换为统一的CQ码,发送时则会转义回框架格式
[CQ:image,file=xxx.abc]
将本地[框架根目录]/data/image/xxx.abc
位置的图片上传并在消息中发送
[CQ:image,id=xxx]
接收消息中的图片,id与服务器缓存图片对应,但区分群聊图片与私聊图片。群聊调用私聊消息的图片id将无法正常发送图片,反之同理。
[CQ:record,file=xxx.silk]
将本地[框架根目录]/data/record/xxx.silk
位置的语音上传并覆盖整条消息内容发送(Mirai不限制文件后缀)
[CQ:face,id=xxx]
发送对应id的QQ黄豆表情
[CQ:emoji,id=xxx]
发送对应十进制编码的Unicode字符
[CQ:reply,id=xxx]
(群聊且限定在开头适用)回复引用指定id的消息
消息送间隔(.admin SendIntervalIdle=500)¶
一般地,Dice!的待发送QQ消息不会立即发送,而是进入发送队列排队发送,并在每次发送后等待固定时间,即发送间隔(ms)。SendIntervalIdle
控制闲时发送间隔,SendIntervalBusy
控制忙时发送间隔。
特别地,Dice!识别一条待发送消息中的分页符('\f'
),并沿分页符将消息拆成多条,依序送入消息发送队列。分页符无法在指令输入时直接录入,可以输入{FormFeed}作为消息分段,调用时会自动转义。
回复引用原消息(.admin ReferMsgReply=1)¶
(仅gocq及MQ系列可用)开启后所有公屏消息回复将引用原消息。
本系骰识别¶
Dice2.5.0+可以通过调用后台接口以识别目标QQ是否在Dice!云端有登记信息。新入群遍历群成员时将统计可识别本系骰数量。由于禁言反制和踢出反制是Dice!的默认协议,让Dice!骰去禁言/踢出另一只Dice!骰无疑是愚蠢的,因此在执行group ban/kick前会先查询目标是否为Dice!骰,是则不会进行实际操作。基于骰主所拥有的隐私权,云端不可见(CloudVisible=0)的Dice!骰不会被识别。
个性化¶
文本转义标识¶
回复文本中可以通过特定的{}标记转义文本,当前花括号支持嵌套。
指令回复中对用户(消息来源)的通用转义如下:
{nick}
-取用户昵称,优先级为群内nn>全局nn>群名片>QQ昵称。{pc}
-取用户角色名,未录入角色卡则同{nick}。
部分转义方法:
{at:目标用户}
-at用户,省略参数则at消息对象;{help:条目名}
-获取帮助文档指定条目;{ran:最小值~最大值}
-从范围中随机取值;{sample:分项1|分项2(...|分项n)}
-从所有分项中随机均匀抽取一项插入文本。例:{sample:效果拔群|干得漂亮}
;{case:uid?账号1=1号专属文本&账号2=2号专属文本&else=通用文本}
-根据消息语境中的变量分条件回复;{grade:user.favor?0=用户&100=亲爱的&else=讨厌鬼}
-根据消息语境中的变量分档位回复;{wait:5000}
-处理时延迟指定的毫秒数{var:变量名?值}
-赋值变量并打印{var:变量1=值1&变量2=值2}
-多变量赋值,不打印
其他转义标识:
{br}
换行{FormFeed}
分条发送
扩展模块mod¶
扩展模块放入[DiceData]/mod/读取,可加载自定义回执、自定义回复与帮助词条,详见开发手册。mod按序读取,且从后向前覆盖。
.mod list
查看已加载mod列表
.mod on 模块名
启用指定模块
.mod off 模块名
停用指定模块
.mod info 模块名
指定模块简介信息
.mod detail 模块名
指定模块详细信息
.mod delete 模块名
卸载指定模块
个性化WebUI¶
Dice!2.6.6更新后将WebUI主页面写出到[DiceData]/webui/index.html
,同时webui目录可通过WebUI端口访问。
自定义¶
自定义帮助词条(.helpdoc)¶
.helpdoc [词条名] [词条内容]
—— 自定义帮助词条
词条内容以&开头表示重定向,如.helpdoc 追仙子 &追仙
后,.help追仙子 将重定向到追仙的词条
词条名不需要是源代码中已有的,请随意添加
特别地,部分词条会存在引用的情况,自定义时可以只自定义被引用的词条。
{
"设定":"Master:{master_ID}\n好友申请:需要使用记录\n入群邀请:黑名单制,非黑即入\n讨论组使用:允许\n移出反制:拉黑群和操作者\n禁言反制:默认拉黑群和群主\n刷屏反制:警告\n邀请人责任:有限连带\n窥屏可能:{窥屏可能}\n其他插件:{其他插件}{姐妹骰}\n骰娘用户群:{骰娘用户群}\n私骰分享群:192499947\n开发交流群:1029435374",
"骰娘用户群":"【未设置】",
"窥屏可能":"有",
"其他插件":"【未设置】"
}
自定义回复(.reply)¶
消息检测触发的顺序为特殊指令->自定义指令(Type=Order
)>内建指令->自定义回复(Type=Reply
),检测触发词的顺序为完全匹配->前缀匹配->模糊匹配->正则匹配。触发回复也会算入刷屏计数!(脚本中可通过写入msg.ignored = true
无视计数)
.reply set (Type=[回复性质](Reply/Order))
[匹配模式](Match/Search/Prefix/Regex)=[触发词1|触发词2]
(Limit=[触发限制])
[回复模式](Deck/Text/Lua)=[回复词]
- 回复性质:决定该回复由
停用指令
(bot off)还是禁用回复
(reply off)控制开关。该项可省略,默认由reply控制。 - 匹配模式:Match-完全匹配;Prefix-前缀匹配;Search-模糊匹配;Regex-正则匹配。
- 触发限制:可填入零至多项触发条件,多项条件以
;
分隔,在触发词匹配后检查是否会被触发(一项不满足就不触发)。不触发的消息不计入刷屏、不进入当日计数、不进入冷却计时。 - 回复模式:Deck-牌堆(回复词以分隔符'|'切割为牌堆)Text-直接返回回复词;Lua-将回复词作为Lua语句执行,将返回值回复。
.reply show [触发词]
查看回复注释
.reply get [触发词]
查看回复本文
.reply del [触发词]
清除触发词
.reply list
列出全部触发词
默认可使用.help回复列表
查询触发词,帮助文档对所有人可见,建议手动修饰。
触发条件¶
用户名单user_id:
- 正向名单
user_id:
:只有所列ID中的用户才触发,ID以|分隔user_id:触发用户1|触发用户2|...
- 反向名单
user_id:!
:只有所列ID中的用户不触发,ID以|分隔user_id:!触发用户1|触发用户2|...
- 正向名单
群聊名单grp_id:
所有私聊的id视为0,写入正向名单表示不限制私聊,写入反向名单表示私聊不触发
- 正向名单
grp_id:
:只有所列ID中的群聊才触发,ID以|分隔,grp_id:触发群号1|触发群号2|...
- 反向名单
grp_id:!
:只有所列ID中的群聊不触发,ID以|分隔grp_id:!触发群号1|触发群号2|...
- 正向名单
触发概率prob:百分比概率触发
prob:概率
冷却计时cd:计时器中有一个正在冷却状态则不触发,若触发则为每个计时器增加冷却时间。每个计时器以
&
分隔,计时器名称为空时默认取回复关键词。计量单位:
chat
-以聊天窗口为单位;user
-以用户为单位;global
-全局共享cd:[计时器名称]@[计量单位]=[冷却秒数]&...
[计时器名称]
可省略,视为取本回复的关键词;@[计量单位]
可省略,视为@chat
。特别地,当两者均省略时,cd:秒数
表示以聊天窗口为单位,为本回复独立计算特定秒数的冷却。今日计数today:计数器中有一个达到上限则不触发,若触发则为每个计数器+1。每个计数器以
&
分隔,计时器名称为空时默认取回复关键词。today:[计数器名称]@[计量单位]=[计数上限]&...
省略机制同cd。
用户阈值user_var:UserConf中变量为特定值或以上或以下触发,每项以&分隔,
字段=值
表示等于时触发,字段=值+
表示大于等于时触发,字段=值-
表示小于等于时触发。特别地,trust
表示信任等级user_var:[变量1]=[阈值1]&[变量2]=[阈值2]+&[变量3]=[阈值3]-
群聊阈值grp_var:群聊时取GroupConf,格式同user_var,使用时推荐搭配
grp_id:!0
排除私聊自身阈值self_var:取DiceMaid自身UserConf,格式同user_var
骰娘识别dicemaid:根据对方是否识别为Dice!骰娘判别是否触发,消息来源为自己时不作判别
- 仅骰娘触发
dicemaid:only
- 骰娘不触发
dicemaid:off
- 仅骰娘触发
自定义回执文本(.str)¶
将系统处理事件的回执替换为自定义文本
.[键值] [文本]
——自定义骰娘的某项回执.[键值] reset
——重置为原生文本
.[键值] NULL
——自定义文本为空白
.[键值] show
——查看自定义文本
如果没有设置,strSelfName和strSelfCall将预设为QQ昵称,并且{self}会自动替换为strSelfCall,前者用于自我展示,后者用于自称。强烈建议自定义strHlpMsg和strAddFriend、strAddGroup,向不熟悉的用户介绍私骰的特别之处(申请、使用须知)。
例:
.strSelfName 测试姬 //入群等自我介绍场合使用
.strSelfCall 本骰娘 //回执中用作自称,{self}的重定向
.strBotOn {self}开始工作了
.strAddGroup Shiki(Judgement), Servant Ruler, 四季映姫·ヤマザナドゥ。来,细数你的罪孽吧
.strRollFumble 大失败 就像是见了阎王一样
.strNameSet 以后就称呼{old_nick}的名称为{new_nick}了
自定义敏感词库(.admin censor)¶
敏感词设置.admin censor .admin censor +([触发等级])=\[敏感词0](|[敏感词1]...)
//添加敏感词 .admin censor -\[敏感词0](|[敏感词1]...)
//移除敏感词
例:.admin censor +=nmsl
//将“nmsl”设置为Warning级 .admin censor +Danger=nn老公|nn主人
//将“nn老公”、“nn主人”设置为Danger级 .admin censor -手枪
//移除敏感词“手枪”
匹配机制¶
骰娘会模糊匹配指令标识符(.)开头的消息,并返回所含敏感词的最高触发等级
匹配过程自动跳过文本中的特殊符号和空格,且大小写不敏感
受信任用户会相应降低触发等级,信任4以上用户将不触发检测
触发等级¶
使用指令设置Ignore等级可以临时屏蔽词库中不该生效的词,对外置词库这一等级是无意义的
Ignore //无视
Notice //仅在0级窗口通知
Caution //提醒用户,并在1级窗口提醒
Warning //【默认等级】警告用户,并在1级窗口提醒
Danger //警告用户且拒绝指令,并在3级窗口警告
*请避免为纯字母/数字的敏感词设置较高触发等级,这些字符存在误匹配图片码的可能性
词库批量加载¶
load会读取存档目录中/conf/censor下所有文本文件
字符编码默认按GBK读取,若字符为UTF8,可在开头先起一行"#UTF8"
一词一行
触发等级默认为Warning,读取到"#[触发等级]"时,后续录入的词调整为响应等级,如"#Danger"
词库文件示例: 以下内容表示以utf-8编码,读取4个敏感词 "nmsl":Warning,"nn老公":Danger,"nn主人":Danger,"sb":Notice
#UTF8
nmsl
#Danger
nn老公
nn主人
#Notice
sb
外置牌堆¶
将牌堆文件放入[DiceData]/PublicDeck内并重启或load,即可使用牌堆内的条目。牌堆名以'_'开头时,无法直接使用draw命令抽取。
支持作者¶
溯洄正在为后续的开发计划众筹:https://afdian.net/@suhuiw4123
欢迎在爱发电支持Shiki:https://afdian.net/@dice_shiki
也可以微信赞赏Shiki:
常见问题¶
登录失败¶
- 当前版本过低[00020]:所有非本地原因的登录失败都会返回错误码00020,该错误码的官方说明即为“当前版本过低”,实际原因可能是账号登录被tx判定有风险等,可以选择更换登录协议等方法尝试。
00020
- 登录环境被判定风险:Mirai或gocq的登录设备信息在
device.json
中,设备信息可能被标记风险,可通过删除账号的原device.json
重新尝试(Mirai删除bots文件夹下账号信息)。 - 骰娘账号手机登录时,在同一wifi下登录框架有更高成功率。若如此且框架为mirai或gocq,可在登录成功后将设备信息文件
device.json
迁移至用于稳定运行的网络环境(gocq可额外迁移登录会话文件session.token
)。 - gocq显示密码错误或账号被冻结但实际并没有:原理不明,常见于刚解除冻结后,可尝试删除config.yml中的密码改为扫码登录。
框架登录通过的成功率:同wifi下扫码登录>异地扫码登录>短信验证登录>无验证登录
账号风控(消息屏蔽)¶
账号被QQ屏蔽最常见的特征有:群聊消息无法成功发送,但私聊消息可以;长文本消息无法成功发送,但短文本可以。
验证是否被屏蔽最直接的方式为查看框架日志,如有发送消息的记录但实际并没有,则可以断定被屏蔽。除此之外的快捷检测方式为在群内发送暗骰指令.rh
,如果私聊能正常收到结果但群聊无回执,则高概率为被屏蔽。
当账号被屏蔽时,建议暂停工作,避免带病上班,同时将账号作为正常QQ使用(养号)。
网络连接失败¶
- 心跳报告失败:心跳只是向后台发送骰娘当前状态,不影响骰娘运行
- jrrp获取失败:访问境外jrrp服务器失败会向后台报错,但用户会正常收到回执,不影响使用
- log上传失败:访问境外log服务器失败,需要手动从\user\log\文件夹提取txt
- 不良记录上传失败:无法生成云黑wid,可以在官群内发warning申请补录
命令行窗口无动静,按回车有¶
在窗口标题栏右键属性->选项->编辑选项
页下,关闭快速编辑模式
,确定。
Dice驱动器启动失败¶
[Fatal]: listen tcp 127.0.0.1:15800: bind: Only one usage of each socket address <protocol/network address/port> is normally permitted.¶
ws连接的端口被占用(极大可能是多个go-cqhttp程序使用相同默认的初始端口),需要修改config.yaml
使每个go-cqhttp配置的端口各不相同:
# config.yml 底端部分
# 连接服务列表
servers:
# 正向WS设置
- ws:
# 正向WS服务器监听地址,修改此处以避免冲突
address: 127.0.0.1:15801
middlewares:
<<: *default # 引用默认中间件
磁盘空间占用增多¶
- Mirai一键脚本使用.git更新文件,会造成.git文件夹堆积,如无回退需要可以直接删除;
- Dice目录下
user/log/
所存储的.log记录文件不会在log结束后销毁,部分log可能存在长期记录而不被关闭的情况,需要手动清理;
忘记WebUI管理密码¶
删除conf/WebUIPassword.digest
,密码将自动重置。
Mirai红字报错¶
W/MiraiNative: 当前运行环境 64 可能不与 Mirai Native 兼容,推荐使用 32位 JRE 运行 Mirai Native¶
Mirai启动时检测64位jre启动,而官方版本的MiraiNative只支持32位。请使用MiraiDiceWindows一键脚本部署后的更新.cmd
,并确保根目录没有64位jre后以启动Mirai.cmd
启动(该启动方式将强制使用根目录下的32位jre而非环境变量中的)。
W/MCL Addon: iTXTech Soyuz 未安装,Soyuz MCL Handler 特性已禁用¶
无影响。
附录¶
配置项目表¶
详见WebUIMaster设置
页
注:Disabled是不可用的意思!
指令禁用对信任4以上用户无效
DisabledBlock仅在区分插件优先级的框架生效,高优先级插件将拦截事件而非传递给低优先级插件处理
对.me特别处理的理由是其在跑团中几乎零作用,却可以制造骰娘自己说话的假象,引发风险。
通知类型表¶
- 通知级别:事件
- 0(调试):启动初始化、自定义回执文本、接收响应的warning、非黑受邀入群、非黑好友申请、刷屏初次提醒
- 1(提醒):解除禁言提醒、增减黑名单、接收warning处理反馈、申请/入群检测到黑名单、黑名单触发退群、接收陌生warning、自定义全局设置、信任等级变动、遥控单群退群/群设置
- 2(敏感):撤销管理员、批量修改群设置、接收send信息、群聊清查
- 3(警告):刷屏二次提醒、原生不良记录、系统负载报警
- 4(用户通知):切换公用/私用、定时开关
- 5(骰娘广播):生成warning
文件位置表¶
文件路径 | 说明 | 读写时机 | |
---|---|---|---|
[DiceData]/conf/BlackList.json | 黑名单记录 | 修改时写入 | |
[DiceData]/conf/Console.xml | Master配置 | 修改时写入 | |
[DiceData]/conf/CustomCensor.json | 自定义敏感词库 | 修改时写入 | |
[DiceData]/conf/censor/ | 敏感词库 | load时只读 | |
[DiceData]/conf/CustomHelp.json | 自定义帮助文本 | 修改时写入 | |
[DiceData]/conf/CustomMsg.json | 自定义回执文本 | 修改时写入 | |
[DiceData]/conf/CustomMsgReply.json | 关键词回复文本 | 修改时写入 | |
[DiceData]/conf/LinkList.json | 链接索引 | 修改时写入 | |
[DiceData]/conf/ModList.json | 模块索引 | 修改时写入 | |
[DiceData]/conf/NoticeList.json | 通知窗口列表 | 修改时写入 | |
[DiceData]/conf/WebUIPassword.digest | WebUI密码 | 修改时写入 | |
[DiceData]/user/ChatConf.dat | 群聊配置 | 退出或save时写入 | |
[DiceData]/user/DiceToday.json | 今日统计 | 修改时写入 | |
[DiceData]/user/HelpStatic.json | 帮助统计 | 修改时写入 | |
[DiceData]/user/PlayerCards.RDconf | 角色卡记录 | 退出或save时写入 | |
[DiceData]/user/UserConf.dat | 用户配置 | 退出或save时写入 | |
[DiceData]/user/session/ | 团内记录(先攻、ob) | 修改时写入 | |
[DiceData]/audit/ | 消息通知日志 | 更新时写入 | |
[DiceData]/mod/ | 模块文件 | load时只读 | |
[DiceData]/plugin/ | 脚本文件 | load及调用时只读 | |
[DiceData]/PublicDeck/ | 外置牌堆 | load时只读 | |
[DiceData]/CardTemp/ | 角色卡模板 | load时只读 |
变量 | type(lua) | typeof(js) | type(py) |
---|---|---|---|
未定义 | nil | undefined | 报错:is not defined |
1==0 | boolean | boolean | bool |
0 | number | number | int |
3.14 | number | number | float |
'hello' | string | string | str |
常用语句¶
类型转换¶
lua字符串连接时会自动类型转换为字符串,但整数转换时会保留一位小数,需要手动使用string.format
--lua
local i = 233
local pi = 3.14
string.format("%d",i) --整数转字符串,如果参数#2不为整数会报错
string.format("%.0f",pi) --指定小数位数转字符串
print("pi="..math.pi)
JavaScript字符串连接时会自动类型转换
//js
console.log("pi="+)
python字符串连接时不会自动类型转换
#python
pi = 3.14
print("pi=" + str(pi))
字符串操作¶
--lua
--去除首尾空格
str:match("^[%s]*(.-)[%s]*$")
//js
//去除首尾空格
str.trim();
#python
#去除首尾空格
str.strip()
时间日期操作¶
--lua
--获取现在离1970年1月1日0时所过秒数
local t_now = os.time()
--格式化输出日期(YYYY-MM-DD HH:mm:ss,以系统所在时区)
local fmt_now = os.date("%Y-%m-%d %H:%M:%S")
local fmt_dt = os.date("%Y-%m-%d %H:%M:%S", t_now)
//js
var d_now = new Date();
//获取现在离1970年1月1日0时所过毫秒数
var t_now = new Date().getTime();
//格式化输出日期(YYYY-MM-DD HH:mm:ss,以系统所在时区)
function pad(num) {
return num.toString().padStart(2, '0');
}
function formatDateTime(date = new Date()) {
return date.getFullYear()+'-'+pad(date.getMonth() + 1)+'-'+pad(date.getDate())+' '
+pad(date.getHours())+':'+pad(date.getMinutes())+':'+pad(date.getSeconds());
}
var fmt_now = formatDateTime()
var fmt_dt = formatDateTime(dt_now)
#python
import time
#获取现在离1970年1月1日0时所过秒数
t_now = time.time()
#格式化输出日期(YYYY-MM-DD HH:mm:ss,以系统所在时区)
fmt_now = time.strftime('%Y-%m-%d %H:%M:%S')
fmt_dt = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t_now))
文件的字符编码问题¶
除lua/js外的文件一律请以utf8编码。
Windows系统一般使用GBK字符集。Dice!支持utf-8及GBK两种字符集的lua文件,在读写字符串时将自动检测utf-8编码并转换。而出现以下情况时,编码并非二者皆可:
- lua文件相互调用或读写其他文本文件,且字符串含有非ASCII字符时,关联文件字符集应保持一致;
- lua文件中需要调用http函数时,应当与目标网页的编码一致(基本是UTF8)
- lua文件使用require或os等以文件名为参数的函数,且路径含有非ASCII字符时,必须使用GBK;
附录:Dice!预置Lua元表及全局函数¶
**调用前注意Dice版本是否匹配!**Dice!2.7.0总计预置19条全局函数,4条http函数,4条context方法。
类型为number的参数,一般也可传入可数字化的字符串,如'msg.fromGroup'。
Context元表¶
语境Context,用于交互event或reply中事件上下文信息,如uid、gid等。
get(self, field, defaultVal)¶
取语境中变量,如#3省略,则context:get(field)
可等效于context[field]
。
输入参数 | 变量类型 | 说明 |
---|---|---|
语境 | Context | 形如context:get()可省略#1 |
变量字段 | string | 字段会先进行一次转义 |
候补值 | 任意 | 如未定义该变量则返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取变量 |
format(self, rawString)¶
在该语境下转义文本。
输入参数 | 变量类型 | 说明 |
---|---|---|
语境 | Context | 形如msg:format()可省略#1 |
待转义文本 | string |
返回值类型 | 说明 |
---|---|
string | 转义后文本 |
回复消息,有来源聊天窗口的事件也可以用event:echo(replyMsg)
。
输入参数 | 变量类型 | 说明 |
---|---|---|
语境 | Context | 形如msg:echo()可省略#1 |
待回复消息 | string | |
是否禁用转义 | boolean | 可省略,默认转义 |
inc(self, field, val)¶
自增变量,仅对数字有效。
输入参数 | 变量类型 | 说明 |
---|---|---|
语境 | Context | 形如context:set()可省略#1 |
变量字段 | string | 字段会先进行一次转义 |
自增量 | number | 可省略,表示+1 |
(build644+) 角色卡Actor。
rollDice(exp)¶
调用角色卡的默认骰*(__DefaultDice)及默认掷骰表达式(__DefaultDiceExp)*进行掷骰,返回table记录掷骰结果。
输入参数 | 变量类型 | 说明 |
---|---|---|
掷骰表达式 | string |
返回值字段 | 字段类型 | 说明 |
---|---|---|
expr | string | 规范化后的表达式 |
sum | number | 掷骰结果(表达式合法时) |
expansion | string | 掷骰展开式(表达式合法时) |
error | number | 错误类型(表达式非法时) |
log(info[,notice_level])¶
*(build598+)*发送日志
输入参数 | 变量类型 | 说明 |
---|---|---|
日志内容 | string | 待输出日志内容 |
通知窗口级别 | number | 选填,若空则只输出到框架日志界面 |
loadLua(scriptName)¶
运行Lua文件,返回目标脚本的返回值 参数使用相对路径且无后缀,根目录为plugin文件夹*(build575+)或mod内script文件夹(build575+)* 与Lua自带的require函数不同,目标文件定义的变量会保持生命周期
loadLua("PC/COC7")
输入参数 | 变量类型 | 说明 |
---|---|---|
lua文件名 | string | 待调用mod/script/文件或plugin/文件 |
返回值类型 | 说明 |
---|---|
同文件内返回值类型 | 执行指定文件后的返回值 |
ranint(low,high)¶
取随机数
输入参数 | 变量类型 | 说明 |
---|---|---|
随机区间下限 | number | 整数 |
随机区间上限 | number | 整数 |
返回值类型 | 说明 |
---|---|
number | 生成随机数 |
取DiceMaid自身账号
返回值类型 | 说明 |
---|---|
string | 取骰子自身账号 |
eventMsg(msg, gid, uid)¶
虚构一条消息进行处理,不计入指令频度。可使用参数列表eventMsg(msg, gid, uid)
或*(build608+)*参数包形式eventMsg(pkg)
.
eventMsg(".rc Rider Kick:70 踢西鹿", msg.gid, msg.uid)
eventMsg({
fromMsg = ".rc Rider Kick:70 踢西鹿",
gid = msg.gid,
uid = msg.uid,
})
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
消息文本/fromMsg | string | |
来源群/gid | number | 可以为空 |
发送者/uid | number |
sendMsg(msg, gid, uid)¶
可使用参数列表sendMsg(msg, gid, uid)
或*(build619+)*参数包形式sendMsg(pkg)
发送.
sendMsg("早安哟", msg.fromGroup, msg.fromQQ)
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
fwdMsg | string | 待发送消息 |
gid | number | 私聊时为空 |
uid | number | 群聊时可以为空 |
chid | number | 频道id,仅参数包可用 |
getUserToday(userID, keyConf, defaultVal)¶
取用户今日数据项。特别地,配置项为"jrrp"时,所取值同.jrrp
结果。所有当日数据会在系统时间24时清空。
getUserToday(msg.uid, "jrrp")
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | number | |
配置项 | string | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值,为空则返回0 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
getUserConf(userID, keyConf, defaultVal)¶
取用户配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*参数1可以为空,此时遍历所有记录了该属性的用户并返回以账号=属性值为键值对的table。
getUserConf(msg.fromQQ, "favor", 0)
getUserConf(nil, "favor") --返回所有用户的favor列表
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | number | |
配置项 | string | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
trust | 用户信任(仅4以下可编辑) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
name* | 用户账号昵称(只读) |
nick* | 全局称呼(备取账号昵称) |
nick#`群号`* | 特定群内的称呼(备取群名片->全局称呼->账号昵称) |
nn* | 全局nn |
nn#`群号`* | 特定群内的nn |
getGroupConf(groupID, keyConf, defaultVal)¶
取群配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*群号可以为空,此时遍历所有记录了该属性的群并返回以群号=属性值为键值对的table。
getGroupConf(msg.fromQQ, "rc房规", 0)
输入参数 | 变量类型 | 说明 |
---|---|---|
群号 | number | |
配置项 | string | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
name* | 群名称(只读) |
size* | 群人数(只读) |
maxsize* | 群规模(只读) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
members | 群用户列表 |
admins | 群管理列表 |
card#`群员账号`* | 群名片 |
auth#`群员账号`* | 群权限(只读) 1-群员;2-管理;3-群主 |
lst#`群员账号`* | 最后发言时间(只读) [时间戳,秒] |
getPlayerCardAttr(userID, groupID, keyAttr, defaultVal)¶
取角色卡属性
getPlayerCardAttr(msg.fromQQ, msg.fromGroup, "理智", val_default)
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | number | |
群号 | number | |
属性名 | string | 待取属性 |
候补值 | 任意 | 属性不存在时返回该值 |
返回值类型 | 说明 | |
---|---|---|
任意 | 待取属性 |
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | number | |
群号 | number | |
属性名 | string | 待存属性 |
属性值 | 任意 | 待存数据 |
mkDirs(pathDir)¶
输入参数 | 变量类型 | 说明 | 文件夹路径 | string | 递归创建该文件夹 |
---|
sleepTime(ms)¶
输入参数 | 变量类型 | 说明 | 等待毫秒数 | number |
---|
(build590+)
http.get¶
输入参数 | 变量类型 | 说明 | 待访问url | string | 若含须转义字符须用urlEncode转义 |
---|
返回值 | 变量类型 | 说明 | 连接是否成功 | boolean |
---|---|---|
网页返回内容 | string | 访问失败则返回错误原因 |
输入参数 | 变量类型 | 说明 | 待访问url | string | 若含须转义字符须用urlEncode转义 |
---|---|---|
post数据 | string | (build634+)如为table则自动序列化为json格式 |
header | string | (build606+)可省略,默认Content-Type: application/json,(build629+)如为table将自动拼接 |
返回值 | 变量类型 | 说明 | 连接是否成功 | boolean |
---|---|---|
网页返回内容 | string | 访问失败则返回错误原因 |
将url中须转义的字符进行转义。
输入参数 | 变量类型 | 说明 | 待编码url | string |
---|
返回值 | 变量类型 | 说明 | 编码后url | string |
---|
http.urlDecode¶
还原url中转义的字符。
输入参数 | 变量类型 | 说明 | 待解码url | string |
---|
返回值 | 变量类型 | 说明 | 解码后url | string |
---|
(build640+)
Actor原型¶
(build644+) 角色卡Actor。
rollDice(exp)¶
调用角色卡的默认骰*(__DefaultDice)及默认掷骰表达式(__DefaultDiceExp)*进行掷骰,返回table记录掷骰结果。
输入参数 | 变量类型 | 说明 |
---|---|---|
掷骰表达式 | string |
返回值字段 | 字段类型 | 说明 |
---|---|---|
expr | String | 规范化后的表达式 |
sum | Number | 掷骰结果(表达式合法时) |
expansion | String | 掷骰展开式(表达式合法时) |
error | Number | 错误类型(表达式非法时) |
getDiceID()¶
取DiceMaid自身账号
返回值类型 | 说明 |
---|---|
Number | 取骰子自身账号 |
取Dice存档目录,用于自行读写文件
返回值类型 | 说明 |
---|---|
String | 取Dice存档目录 |
虚构一条消息进行处理,不计入指令频度。可使用参数列表eventMsg(msg, gid, uid)
或*(build608+)*参数包形式eventMsg(pkg)
.
eventMsg(".rc Rider Kick:70 踢", msg.gid, msg.uid)
eventMsg({
fromMsg = ".rc Rider Kick:70 踢",
gid = msg.gid,
uid = msg.uid,
})
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
消息文本/fromMsg | String | |
来源群/gid | Number | 可以为空 |
发送者/uid | Number |
sendMsg(msg, gid, uid)¶
可使用参数列表sendMsg(msg, gid, uid)
或*(build619+)*参数包形式sendMsg(pkg)
发送.
sendMsg("早安哟", msg.fromGroup, msg.fromQQ)
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
fwdMsg | String | 待发送消息 |
gid | Number | 私聊时为空 |
uid | Number | 群聊时可以为空 |
chid | Number | 频道id,仅参数包可用 |
getUserToday(userID, keyConf, defaultVal)¶
取用户今日数据项。特别地,配置项为"jrrp"时,所取值同.jrrp
结果。所有当日数据会在系统时间24时清空。
getUserToday(msg.uid, "jrrp")
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值,为空则返回0 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
getUserAttr(userID, keyConf, defaultVal)¶
取用户配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*参数1可以为空,此时遍历所有记录了该属性的用户并返回以账号=属性值为键值对的table。
getUserConf(msg.fromQQ, "favor", 0)
getUserConf(nil, "favor") --返回所有用户的favor列表
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
trust | 用户信任(仅4以下可编辑) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
name | *用户账号昵称(只读) |
nick | *全局称呼(备取账号昵称) |
nick#`群号` | *特定群内的称呼(备取群名片->全局称呼->账号昵称) |
nn | *全局nn |
nn#`群号` | *特定群内的nn |
getGroupAttr(groupID, keyConf, defaultVal)¶
取群配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*群号可以为空,此时遍历所有记录了该属性的群并返回以群号=属性值为键值对的table。
getGroupConf(msg.fromQQ, "rc房规", 0)
输入参数 | 变量类型 | 说明 |
---|---|---|
群号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
name | *群名称(只读) |
size | *群人数(只读) |
maxsize | *群规模(只读) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
members | 群用户列表 |
admins | 群管理列表 |
card#`群员账号` | *群名片 |
auth#`群员账号` | *群权限(只读) 1-群员;2-管理;3-群主 |
lst#`群员账号` | *最后发言时间(只读) [时间戳,秒] |
附录:Dice预置Python类及模块函数¶
*(build639+)*Dice!2.7.0总计预置dicemaid模块19条函数,4条context方法。dicemaid模块已在初始化时import,故可以如全局函数般调用。
Actor类¶
(build644+) 角色卡Actor。
rollDice(exp)¶
调用角色卡的默认骰*(__DefaultDice)及默认掷骰表达式(__DefaultDiceExp)*进行掷骰,返回table记录掷骰结果。
输入参数 | 变量类型 | 说明 |
---|---|---|
掷骰表达式 | string |
返回值字段 | 字段类型 | 说明 |
---|---|---|
expr | String | 规范化后的表达式 |
sum | Number | 掷骰结果(表达式合法时) |
expansion | String | 掷骰展开式(表达式合法时) |
error | Number | 错误类型(表达式非法时) |
getDiceID()¶
取DiceMaid自身账号
返回值类型 | 说明 |
---|---|
Number | 取骰子自身账号 |
取Dice存档目录,用于自行读写文件
返回值类型 | 说明 |
---|---|
String | 取Dice存档目录 |
eventMsg(msg, gid, uid)¶
虚构一条消息进行处理,不计入指令频度。可使用参数列表eventMsg(msg, gid, uid)
或*(build608+)*参数包形式eventMsg(pkg)
.
eventMsg(".rc Rider Kick:70 踢", msg.gid, msg.uid)
eventMsg({
fromMsg = ".rc Rider Kick:70 踢",
gid = msg.gid,
uid = msg.uid,
})
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
消息文本/fromMsg | String | |
来源群/gid | Number | 可以为空 |
发送者/uid | Number |
sendMsg(msg, gid, uid)¶
可使用参数列表sendMsg(msg, gid, uid)
或*(build619+)*参数包形式sendMsg(pkg)
发送.
sendMsg("早安哟", msg.fromGroup, msg.fromQQ)
输入参数/pkg子项 | 变量类型 | 说明 |
---|---|---|
fwdMsg | String | 待发送消息 |
gid | Number | 私聊时为空 |
uid | Number | 群聊时可以为空 |
chid | Number | 频道id,仅参数包可用 |
getUserToday(userID, keyConf, defaultVal)¶
取用户今日数据项。特别地,配置项为"jrrp"时,所取值同.jrrp
结果。所有当日数据会在系统时间24时清空。
getUserToday(msg.uid, "jrrp")
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值,为空则返回0 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
getUserAttr(userID, keyConf, defaultVal)¶
取用户配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*参数1可以为空,此时遍历所有记录了该属性的用户并返回以账号=属性值为键值对的table。
getUserConf(msg.fromQQ, "favor", 0)
getUserConf(nil, "favor") --返回所有用户的favor列表
输入参数 | 变量类型 | 说明 |
---|---|---|
用户账号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
trust | 用户信任(仅4以下可编辑) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
name | *用户账号昵称(只读) |
nick | *全局称呼(备取账号昵称) |
nick#`群号` | *特定群内的称呼(备取群名片->全局称呼->账号昵称) |
nn | *全局nn |
nn#`群号` | *特定群内的nn |
getGroupAttr(groupID, keyConf, defaultVal)¶
取群配置,配置项带*标记表示会另行计算而非调用存储数据。*(build613+)*群号可以为空,此时遍历所有记录了该属性的群并返回以群号=属性值为键值对的table。
getGroupConf(msg.fromQQ, "rc房规", 0)
输入参数 | 变量类型 | 说明 |
---|---|---|
群号 | Number | |
配置项 | String | 待取配置项 |
候补值 | 任意 | 配置项不存在时返回该值 |
返回值类型 | 说明 |
---|---|
任意 | 待取值 |
特殊配置项 | 说明 |
---|---|
name | *群名称(只读) |
size | *群人数(只读) |
maxsize | *群规模(只读) |
firstCreate | 用户记录创建(初次使用)时间 [时间戳,秒] |
lastUpdate | 用户记录最后更新时间 [时间戳,秒] |
members | 群用户列表 |
admins | 群管理列表 |
card#`群员账号` | *群名片 |
auth#`群员账号` | *群权限(只读) 1-群员;2-管理;3-群主 |
lst#`群员账号` | *最后发言时间(只读) [时间戳,秒] |
存群配置项
输入参数 | 变量类型 | 说明 |
---|---|---|
群号 | Number | |
配置项 | String | 待存配置项 |
配置值 | 任意 | 待存入数据 |
附录:自定义指令常用的Lua正则匹配¶
解析参数时,可使用msg.suffix
来略过指令前缀匹配的部分,从之后的字符开始匹配。
--前缀匹配且指令参数为消息余下部分时,去除前后两端的空格
local rest = msg.suffix:match("^[%s]*(.-)[%s]*$")
--指令参数为单项整数时,直接用%d+表示匹配一个或多个数字,未输入数字时匹配失败返回nil
local cnt = string.match(msg.suffix,"%d+")
--同上,%d*表示匹配0或任意个数字,未输入数字时匹配成功返回空字符串""
--该匹配模式需要确保数字之前的其他字符已被排除
local cnt = string.match(msg.suffix,"%d*")
--参数使用空格分隔且不限数目,遍历匹配
local item,rest = "",string.match(msg.fromMsg,"^[%s]*(.-)[%s]*$",#order_select_name+1)
if(rest == "")then
return "请输入参数"
end
local items = {}
repeat
item,rest = string.match(rest,"^([^%s]*)[%s]*(.-)$")
table.insert(items, item)
until(rest=="")
附录:常用在线语法校验/运行工具¶
- json: 在线JSON校验格式化工具
- toml: 在线TOML转YAML工具
- yaml: YAML、YML在线编辑器(格式化校验)
- lua: 在线运行Lua 所用Lua版本(5.3.5)略旧于Dice!内置(5.4),可能产生差异。
- javascript: 在线运行JavaScript 注意对js标准的支持存在差异。
- python: 在线运行Python(3.8.1) 所用Python版本(3.8.1)略旧于Dice!内置(3.10),可能产生差异。
- lua/javascript/python: Judge0 IDE - Free and open-source online code editor
附录:lua常见报错说明¶
module '%s' not found:
no field package.preload['%s']
no file
-- 没有把被引用的lua或dll文件放在指定位置(多见于require与loadLua)
-- 解决方式:把所需文件放入Dice存档目录/plugin/或Diceki/lua/,dll文件或require对象必须置于后者
attempt to call a nil value (global '%s')
-- 将空变量%s用作函数(global表示被调用的是全局变量,local表示本地变量,method表示索引方法)
attempt to index a nil value (global '%s')
-- 对空变量%s使用索引(只有table等结构可以索引,形如msg.fromMsg)
attempt to concatenate a nil value (local '%s')
-- 使用..连接字符串时连接了一个空变量%s
bad argument #1 to '%s' (string expected, got nil)
-- 函数%s的第1个参数类型错误,要求类型为string,但实际传入的参数为nil。特别地,got nil表示输入参数为nil或缺少参数
value expected
-- 要求参数,但没有传入
attempt to perform arithmetic on a nil value (global '%s')
-- 将一个空变量%s当做数字表示
bad argument #5 to 'format'(number has no integer representation)
-- 函数format的第5个参数类型错误,要求是整数,但传入是小数,或者是其余类型不能化为整数
'}' expected (to close '{' at line 169) near '%s'
-- 脚本第169行的左花括号缺少配对的右花括号。此错误也可以由表格内缺少逗号分隔、括号外的中文等原因造成
'end' expected (to close 'function' at line 240) near <eof>
-- 脚本第240行的function缺少收尾的end,<eof>表示文件结束(找到文件末也没找到)
'then' expected near 'end'
-- if then end逻辑结构缺少then
unexpected symbol near '%s'
-- 符号%s边有无法识读的符号,比如中文字符
attempt to get length of a nil value (local 'tab')
-- 对空变量tab作取长度运算(#)
attempt to add a 'string' with a 'string'
-- 对(不能化为数字的)字符串用加法'+'(字符串只能用连接'..')
attempt to compare number with string
-- 对数字和(不能化为数字的)字符串用比较运算符
error loading module '%s' from file
-- 使用require "%s"时加载出错
no visible label '%s' for <goto> at line
-- 在循环结构中跳转不存在的节点
invalid option '%s'
-- 传入的参数不是string或不在给定的字符串列表中
malformed number near '86400..'
-- 数字与字符连接符粘连导致误判为小数点,使得格式解析错误,需要插入空格
附录:事件event样例¶
代理事件¶
时点 | 说明 |
---|---|
StartUp | 启动完成后 |
FriendRequest | 好友申请后,处理前 |
FriendAdd | 自动或被同意添加好友后,回复前 |
GroupRequest | 受群邀请后,处理前 |
GroupKicked | 被踢出群后,拉黑前 |
GroupBanned | 被禁言后,拉黑前 |
GroupAuthorize | 群申请许可后,处理前 |
LogEnd | 日志完成后,上传前 |
WhisperIgnored | 私聊不识别为指令且未触发回复 |
DayEnd | (时差修正后)0点后刷新每日数据前 |
DayNew | 刷新每日数据后 |
event参数 | 说明 |
---|---|
uid | 当事用户 |
gid | 当事群 |
fromMsg | 消息文本/好友申请文本 |
aimGroup | GroupAuthorize中待审核群 |
AttachInfo | GroupAuthorize中申请文本 |
log_file/log_path | LogEnd中日志文件名及路径 |
blocked | [回传]是否拦截该事件后续处理 |
approval | [回传]是否同意申请 |
ignored | [回传]是否忽略算入指令计数 |
--event/hook.lua
event.listen_startup = {
title = "启动完成",
trigger = {
hook = "StartUp"
},
action = { lua = "listen_startup" }
}
event.listen_friend_request = {
title = "好友申请处理",
trigger = {
hook = "FriendRequest"
},
action = { lua = "listen_friend_request" }
}
event.listen_friend_add = {
title = "好友添加事件",
trigger = {
hook = "FriendAdd" --主动通过好友申请时不触发
},
action = { lua = "listen_friend_add" }
}
代理好友申请¶
--script/listen_friend_requst.lua
answer = event.fromMsg
--如果验证方式为回答问题,则需要截去问题部分
-answer = string.sub(answer,string.find(answer,"答案:")+#"答案:")
true_answer = "正确回案"
if string.find(answer,"true_answer") then
log("收到"..getUserConf(event.uid,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答通过√",1)
event.approval = true --通过申请
else
log("收到"..getUserConf(event.uid,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答错误×",1)
event.approval = false
end
event.blocked = true --终止连锁,不执行原生申请处理流程
代理新增好友¶
--script/listen_friend_add.lua
answer = event.fromMsg
--如果验证方式为回答问题,则需要截去问题部分
-answer = string.sub(answer,string.find(answer,"答案:")+#"答案:")
true_answer = "正确回案"
if string.find(answer,"true_answer") then
log("收到"..getUserConf(event.fromUser,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答通过√",1)
event.approval = true --通过申请
else
log("收到"..getUserConf(event.fromUser,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答错误×",1)
event.approval = false
end
event.blocked = true --终止连锁,不执行原生申请处理流程
代理公骰审核¶
--script/listen_group_authorize.lua
answer = event.attachText
--如果验证方式为回答问题,则需要截去问题部分
-answer = string.sub(answer,string.find(answer,"答案:")+#"答案:")
true_answer = "正确回案"
if string.find(answer,"true_answer") then
log("收到"..getUserConf(event.fromUser,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答通过√",1)
event.approval = true --通过申请
else
log("收到"..getUserConf(event.fromUser,"name").."("..event.fromUser.."的好友请求:\n"..answer.."\n回答错误×",1)
event.approval = false
end
event.blocked = true --终止连锁,不执行原生申请处理流程
附录:DND规则.rdc指令¶
.rdc(B/P) (+/-[加值]) ([检定理由]) ([成功阈值]) 参数[优/劣势骰]:可选,B=2D20取大,P=2D20取小 参数[加值]:可选,加值最后修正到D20结果上 参数[检定理由]:可选,将显示在回执语句中 参数[成功阈值]:可选,将与掷骰结果比较,返回成功或失败 出于及时向用户提供指令帮助的考虑,空参将返回帮助
msg_order = {}
function intostring(num)
if(num==nil)then
return ""
end
return string.format("%.0f",num)
end
--DND
function roll_d20(msg)
local rest=string.match(msg.fromMsg,"^[%s]*(.-)[%s]*$", 5)
if(rest=="")then
return [[
D20检定:.rdc
.rdc(B/P) (+/-[加值]) ([检定理由]) ([成功阈值])
参数[优/劣势骰]:可选,B=2D20取大,P=2D20取小
参数[加值]:可选,加值最后修正到D20结果上
参数[检定理由]:可选,将显示在回执语句中
参数[成功阈值]:可选,将与掷骰结果比较,返回成功或失败
空参返回本段说明文字]]
end
local bonus,sign,rest = string.match(rest,"^[%s]*([bBpP]?)[%s]*([+-]?)(.*)$")
local addvalue = 0
local modify = ""
--加减符号判断有无加值
if(sign ~= "")then
modify,rest = string.match(rest,"^([%d]+)[%s]*(.*)$")
if(modify==nil or modify=="")
then
return "请{pc}输入正确的加值"
end
addvalue = tonumber(modify)
if(sign=='-')
then
addvalue = addvalue*-1;
end
end
local skill,dc = string.match(rest,"^[%s]*(.-)[%s]*([%d]*)$")
local dc = tonumber(dc)
if(dc~=nil)then
if(dc<1)then
return "这你要怎么才能失败啊?"
elseif(dc>99)then
return "这你要怎么才能成功啊?"
end
end
local die = ranint(1,20)
local selected = die
local res
--考虑优势骰/劣势骰
if(bonus=="")then
res="D20"..sign..modify.."="..intostring(die)..sign..modify
else
local another=ranint(1,20)
bonus=string.upper(bonus)
if((another>die and bonus=="B")or(another<die and bonus=="P"))then
selected=another
end
res=bonus.."("..intostring(die)..','..intostring(another)..")"..sign..modify.."->"..intostring(selected)..sign..modify
end
local strReply = "{pc}进行"..skill.."检定:"..res
local final=selected+addvalue
if(addvalue~=0)then
strReply=strReply.."="..intostring(final)
end
if(dc=="")then
--对成功与否不做判定
elseif(final>dc)
then
strReply=strReply..'>'..intostring(dc).." {strRollRegularSuccess}"
elseif(final<dc)
then
strReply=strReply..'<'..intostring(dc).." {strRollFailure}"
else
strReply=strReply..'='..intostring(dc).." {strRollRegularSuccess}"
end
return strReply
end
msg_order[".rdc"] = "roll_d20"
附录:ShadowRun规则.rsr指令¶
ShadowRun掷骰规则:掷X粒六面骰,点数为5或6记一次命中,过半数骰目出1记失误。自定义指令格式.rsr X。
msg_order = {}
function intostring(num)
if(num==nil)then
return ""
end
return string.format("%.0f",num)
end
--shadowrun
function roll_shadowrun(msg)
local cnt = tonumber(string.match(msg.fromMsg,"%d+",5))
if(not cnt)
then
return "shadowrun检定:.rsr[骰数] 出5/6视为命中\n出1过半视为失误"
end
local res="{pc}掷骰"..cnt.."D6: "
cnt = tonumber(cnt)
if(cnt<1)
then
return "{strZeroDiceErr}"
elseif(cnt>100)
then
return "{strDiceTooBigErr}"
else
local cntSuc=0
local cntFail=0
local pool={}
local glitch=""
for times=1,cnt do
local die=ranint(1,6)
if(die>=5)then
cntSuc = cntSuc + 1
elseif(die==1)then
cntFail = cntFail + 1
end
table.insert(pool,intostring(die))
end
if(cntFail > cnt/2)then
glitch = " {strGlitch}"
end
local reply=res..table.concat(pool,'+').."->"..intostring(cntSuc)..glitch
return reply
end
end
msg_order[".rsr"] = "roll_shadowrun"
附录:仿MDice的.duel指令¶
msg_order = {}
function intostring(num)
if(num==nil)then
return ""
end
return string.format("%.0f",num)
end
--惠惠给每个得分都写了专属回复,这里作为样例仅使用随机选取
reply_duel_win = {
"不服?不服你就正面赢我啊",
"你请我吃顿饭这次就算你赢,怎么样?",
"哦吼?我觉得我甚至可以让你一个骰子",
"(面露笑意地看着你)",
"你觉得能赢我,嘿嘿,那是个幻觉,美丽的幻觉。",
"再试也没用啦,会输一次就会输一百次哦",
}
reply_duel_lose = {
"?!居然趁我一时大意。。。"
}
reply_duel_even = {
"哼哼,平分秋色嘛"
}
function table_draw(tab)
return tab[ranint(1,#tab)]
end
--惠系决斗
function mdice_duel(msg)
local isDark=string.sub(msg.fromMsg,1,5)==".dark"
local poolSelf, poolPlayer = {},{}
local resSelf, resPlayer, resTotal, resEval = "","","",""
local sumSelf, sumPlayer, sumTotal=0,0,0
for times=1, 5 do
local die = ranint(1,100)
sumSelf = sumSelf + die
table.insert(poolSelf,intostring(die))
end
resSelf="\n{self}\n"..table.concat(poolSelf,'、').."\n打点"..intostring(sumSelf)
for times=1, 5 do
local die = ranint(1,100)
sumPlayer = sumPlayer + die
table.insert(poolPlayer,intostring(die))
end
resPlayer="\n{pc}\n"..table.concat(poolPlayer,'、').."\n打点"..intostring(sumPlayer)
sumTotal = sumPlayer-sumSelf;
resTotal="\n————\n计"..intostring(sumTotal).."/10="..intostring(sumTotal/10).."分"
if(sumSelf>sumPlayer)then
if(isDark)then
resEval = "发起黑暗决斗的你,应该做好觉悟了吧?"
--好孩子不要用 eventMsg(".group ".. msg.fromGroup .." ban ".. msg.fromQQ .." "..intostring(sumSelf), 0, getDiceQQ())
else
resEval = table_draw(reply_duel_win)
end
elseif(sumSelf<sumPlayer)then
resEval = table_draw(reply_duel_lose)
else
resEval = table_draw(reply_duel_even)
end
local reply = "看起来{pc}想向我发起决斗,呼呼,那我就接下了\n胜负的结果是——"..resSelf..resPlayer..resTotal.."\n"..resEval
return reply --如有返回值表示回复文本,如有第二返回值表示暗骰文本
end
msg_order[".dark duel"] = "mdice_duel"
msg_order[".duel"] = "mdice_duel"
--指令注册格式 key->指令前缀 value->脚本内函数名
附录:仿SitaNya的.clock指令¶
msg_order = {}
function intostring(num)
if(num==nil)then
return ""
end
return string.format("%.0f",num)
end
function print_chat(msg)
if(msg.fromGroup == "0")then
return "qq "..msg.fromQQ
end
return "group "..msg.fromGroup
end
function Sleep(n)
--575+实现方式
if n > 0 then sleepTime(n*1000) end
end
function sitanya_clock(msg)
local seconds = string.match(msg.fromMsg,"%d+",7)
if(not seconds)then
return [[clock 计时器
出于技术验证仿塔骰写的指令,请勿滥用该指令。
用法:.clock [秒]
示例:.clock 60]]
end
if(tonumber(seconds)>600)then
return "设置{self}定时失败:设置时长超过10分钟×"
end
eventMsg(".send "..print_chat(msg).." 您的定时器:<".. seconds ..">秒已开启计时",0,getDiceQQ())
Sleep(seconds)
return "{nick}的定时器:<".. seconds ..">秒已到期"
end
msg_order[".clock"] = "sitanya_clock"
- Downloads
- html
- On Read the Docs
- Project Home
- Builds
Free document hosting provided by Read the Docs.