榴莲自定义功能

来自XJ·Minecraft

关于

该功能为基于 JavaScript 虚拟执行环境的被动响应式可编程功能,仅在附属群机器人研究室内开启内测。如果您不熟悉编程也没关系,可以来尝试由大家开发的最新小功能,或者对机器人进行简单的“调教”;如果您熟悉 JavaScript,非常欢迎来发散您的创意;如果您有意愿学习 JavaScript 编程语言,那同样欢迎您加入来利用虚拟环境练习、测试、开发属于自己的专属功能。

由于该功能向群内完全开放了自定义能力,因此严禁出现包括但不限于有关政治、色情、暴力、恐怖等敏感话题或违规话题,严禁任何违反 QQ 软件许可及服务协议 8.2 条款的功能开发或调用,如果

  • 您开发违反以上内容的功能,例如从色情网站上搬运照片等,则您会被拉黑,该功能会被直接删除
  • 您利用他人开发的中立性功能有意调用导致出现违反以上内容的情况,例如利用他人开发的维基百科搬运功能搜索政治人物事件等,则您会被拉黑

另外,由于在群内所有群友共享一个 JavaScript 执行上下文,因此请不要恶意攻击虚拟执行环境,不要恶意覆盖、删除他人定义的变量或函数。屡犯不改的群友同样可能会被拉黑。

基本使用方法

本节列举了无需编程知识就可以使用的功能列表,其中一些进阶的说明会用注释罗列到本节的最后。

计算器

此功能可以当作一个简单的计算器来用,支持 +, -, *, /, % (模), ** (幂) 等运算[注释 1]sin, cos, exp, log 等数学函数[注释 2]

发送 回应
1 + 1 2
sqrt(3 ** 2 + 4 ** 2) 5
PI * 10 ** 2 314.1592653589793
(100 + 200 + 300) / 12 50

定义自动回复

此功能可以当作另一个”调教榴莲“的方式使用,并且支持图片和表情。语法为 触发语句='回复语句'触发语句="回复语句"触发语句=`回复语句`,只有最后一种表达式支持多行定义[注释 3],触发语句不能包含标点、空格或其它特殊字符。如果需要删除定义的自动回复,发送 delete 触发语句 即可。

查找功能

如果您想查找别人定义的功能,发送 .find 关键词 可以进行搜索,兼容句号前缀。注意,名称是大小写敏感的,错误的大小写无法得到预期的结果。

查看功能帮助

如果您想查看某个功能的帮助信息,发送 .help 功能名 即可,兼容句号前缀。具体的帮助信息由开发此功能的人员提供。

调用功能

发送 .功能名 可以调用该功能。如果这个功能需要参数,可以用空格分隔功能名称和参数,例如 .功能名 参数1 参数2。兼容句号前缀。

查看源码

如果您好奇别人开发的功能是如何实现的,可以发送 .view 功能名 查看源代码。兼容句号前缀。

  1. 支持的运算符还包括位运算、比较运算、逻辑运算等,请参考表达式和运算符
  2. 为了方便使用数学函数,所有 Math 对象的属性和方法均直接赋给了全局对象。支持的数学常数和函数请参考 Math 对象
  3. 具体来说,这个是定义了一个名为“触发语句”的字符串变量。字符串语法请参考 String

进阶使用方法

如果您不打算学习任何与编程有关的内容,您可以看到这里为止。如果您对撰写自己的专属功能或对编程感兴趣的话,非常欢迎来这里尝试一下。

本节不会过多地涉及 JavaScript 基础知识,如果您对 JavaScript 不熟悉,请参阅

放心,JavaScript 入门相比 C++、Java 等其它语言来说简单得多,而且这是一门迄今为止最受欢迎的语言之一,生态圈十分活跃,在网页端、后端、甚至桌面端、移动端开发、数值计算等领域均可胜任。这么热门的语言,不来学习一下试试吗?

处理消息方式说明

这里介绍一下针对群聊消息处理为合适的输入代码和对应输出的方式,注意这不是 JavaScript 处理代码的方式,切勿与 JavaScript 语法混淆。

普通模式

群内所有的信息都会被当作 JavaScript 代码尝试执行,不是以 .> 开头的消息都会在普通模式执行,普通模式的特点为:

  • 仅输出字符串、数值型、布尔型、BigInt 类型;错误、数组对象、函数对象等其它类型的输出都会静默隐藏;
  • 为了减少输入法切换次数,符合国人输入习惯,以下符号在执行前会被静默转换为半角符号:。!?,;()“”‘’《》

注意:标点静默转换可能会产生意外的结果,例如打算作为输出的字符串内的逗号句号也会变为半角,更严重的情况包括字符串内的引号变为半角导致出现语法错误而执行失败,此时由于错误的静默隐藏无法第一时间得知,因此强烈推荐开发功能使用控制台模式。

控制台模式

任何以半角符号 > 开头的信息会在控制台模式下执行,控制台模式不会静默转换标点,返回值会以检查 (inspect) 模式输出,错误信息也会显示。

命令行模式

任何以 . 开头的信息会以命令行形式运行,此模式是方便大家调用而设计的。函数名和参数间以空格分隔,参数会以字符串形式传入,因为空格作为分隔符,传入的字符串不会包含空格,而是多个位置参数,开发带参数的功能时请注意这一点。此外,命令行模式与普通模式一样会静默转换标点、静默隐藏错误和对象。

例如 .jrrp 等价于执行 jrrp()。垃圾 玻璃 等价于执行 垃圾("玻璃")

Hello, world! 开发自己第一个可交互功能

推荐使用 VSCode, Sublime 或其它 IDE / 带语法高亮的文本编辑器进行开发,即使您熟练到可以使用记事本开发,能忍受非等宽字体的代码文本,QQ 针对特殊符号的弹出菜单依然非常烦人。

功能是通过函数实现的,如果您是从零基础开始学习,那建议教程至少看到函数这一章。在此之前,您可以使用本虚拟环境或浏览器控制台练习、测试基础语法。

本功能内置的 help 函数是为了方便用户去了解您撰写的功能的,您的函数第二行往后连续的以 // 开头的注释将被视为帮助信息,如果您希望您的功能被更多的用户理解和使用,请不要忽视帮助信息的重要性。

内置 API

原生对象

该功能是纯 JavaScript V8 执行环境,因此不像 Node.js 一样包含 require, process 等方法,也不像 Chrome 一样包含 window, document 等对象,只有标准 ECMAScript 6 内置的对象。具体的内置对象及对应的使用方法请参考 JavaScript 标准内置对象

内置函数

本节包括针对 QQ 环境注入的函数和方便开发功能注入的函数。这部分内容会随着开发频繁更改。如果您需要什么其它方便的函数请尽管提出。

QQ 相关内置函数
定义 参数类型 返回值类型 备注
qq(qq) (可选) ?string number 返回 QQ 号,默认为发送消息者
messageTime() number 消息的秒级时间戳
groupID() number 消息所在的群号
groupName() string 消息所在的群名称
qqName() string 名称
qqSex() string 性别
qqArea() string 地区
qqAge() number 年龄
qqLevel() number 等级
qqRole() string 群员类型
qqTitle() string 头衔
qqHead(qq) (可选) ?(number | string) string 生成 QQ 头像消息片段,默认发送消息者
at(qq) (可选) ?(number | string) string 生成 at 消息片段,默认发送消息者
img(imgURL) string string 生成图片消息片段
env() object 消息环境变量,一般以上函数足够使用,不需要手动处理环境变量
其它内置函数
定义 参数类型 返回值类型 备注
Buffer 对象 buffer 包提供的类似 Node.js Buffer 对象
seedRandom(seed) any () => number seed-random 包提供的带种伪随机数
parse(html) string object node-html-parser 包提供的 HTML 解析器,风格与 Web API 相近
setTimeout
(callback, ms, ...args)
function, number,
any
number 定时执行函数,延迟不能小于 5000 ms
clearTimeout(timeout) number void 取消定时执行的函数
alert(message) string | number |
boolean | bigint
void 向群里发送消息
async get(url) string Promise<string> 向指定 URL 发送 GET 请求,返回 UTF-8 编码的结果

实用的自定义函数

这里列举一些非内置的实用函数,由群友开发,请务必不要随意更改、删除这些函数。

定义 参数类型 返回值类型 备注

注意事项

  • 所有原生对象、内置函数均设置为不可写、不可配置、不可枚举,所有原生对象的原型已被冻结。
  • 由于各种原因虚拟环境可能会重启,以下是重启会带来的副作用:
    • JavaScript 的非原始对象(non-primitive)是按引用赋值的,但是数据经过重启带来的序列化和反序列化之后会解除引用,变为多个独立的对象。
    • 目前能够序列化保存的对象仅限:String, Number, Boolean, null, undefined, Infinity, Date, Map, Set, Function, RegExp, BigInt,以及存储可序列化内容的 Array 和 Object。其它对象可能会被丢弃或错误地序列化。包含循环引用的对象会被直接丢弃。
    • 反序列化后所有对象的原型会指向 Object.prototype,函数的原型会指向 Function.prototype,除 Object 外,保存在其它非原始对象中的额外数据可能会丢失。
    • 闭包内的信息会丢失。
  • 鉴于以上原因,不推荐撰写需要 class 或者复杂闭包的功能。
  • 注意标点的隐式转换问题,推荐使用控制台模式开发新功能。详细说明
  • 不反对出于研究、学习目的的攻击,发现 bug 后请向开发者反馈,切勿反复、恶意攻击。

开发计划