{"id":21242308,"url":"https://github.com/fortescarlet/catcode","last_synced_at":"2025-07-10T20:31:23.998Z","repository":{"id":45764747,"uuid":"298625389","full_name":"ForteScarlet/CatCode","owner":"ForteScarlet","description":"猫猫码，一个可爱的通用特殊码，CQ码的精神延续。/ Cat code, the spirit of CQ code continues, a cute universal special code.","archived":false,"fork":false,"pushed_at":"2022-10-26T14:44:49.000Z","size":1733,"stargazers_count":43,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-06T22:53:06.533Z","etag":null,"topics":["cat","catcode","code","cq","simbot","simple-robot"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ForteScarlet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-25T16:30:11.000Z","updated_at":"2024-12-25T04:52:15.000Z","dependencies_parsed_at":"2023-01-20T06:45:25.572Z","dependency_job_id":null,"html_url":"https://github.com/ForteScarlet/CatCode","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/ForteScarlet/CatCode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForteScarlet%2FCatCode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForteScarlet%2FCatCode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForteScarlet%2FCatCode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForteScarlet%2FCatCode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ForteScarlet","download_url":"https://codeload.github.com/ForteScarlet/CatCode/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ForteScarlet%2FCatCode/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264652672,"owners_count":23644306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cat","catcode","code","cq","simbot","simple-robot"],"created_at":"2024-11-21T00:59:05.307Z","updated_at":"2025-07-10T20:31:23.572Z","avatar_url":"https://github.com/ForteScarlet.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"./logo/CatCodeLogo@0,1x.png\"/\u003e\n    \u003ch3\u003e\n        - 😺 CatCode 😺 -\n    \u003c/h3\u003e\n    \u003cspan\u003e\n        \u003ca href=\"https://github.com/ForteScarlet/CatCode\" target=\"_blank\"\u003egithub\u003c/a\u003e\n    \u003c/span\u003e \n    \u0026nbsp;\u0026nbsp; | \u0026nbsp;\u0026nbsp;\n    \u003cspan\u003e\n        \u003ca href=\"https://gitee.com/ForteScarlet/CatCode\" target=\"_blank\"\u003egitee\u003c/a\u003e\n    \u003c/span\u003e \u003cbr /\u003e\n    \u003csmall\u003e \u0026gt; 感谢 \u003ca href=\"https://github.com/simple-robot/simpler-robot\" target=\"_blank\"\u003eSimple Robot\u003c/a\u003e 开发团队成员制作的猫猫logo \u0026lt; \u003c/small\u003e \u003cbr /\u003e\n    \u0026gt; 如果有点击一下⭐的话，猫猫会很开心哦~ \u0026lt; \u003cbr /\u003e\n    \u003ca href=\"https://repo1.maven.org/maven2/love/forte/catcode/\" target=\"_blank\" \u003e\n        \u003cimg src=\"https://img.shields.io/maven-central/v/love.forte/catcode\" /\u003e\n    \u003c/a\u003e\n\n\u003c/div\u003e\n\n*****\n\n\u003cdiv align=\"center\"\u003e\n    \u003ch3\u003e\n        猫猫码（Cat code），一个可爱的通用特殊码，CQ码的精神延续。\n    \u003c/h3\u003e\n\u003c/div\u003e   \n\n\n猫猫码是一个具有特定格式的字符串格式特殊码，规则为`[CAT:xxx,param=value,param=value,...]`的格式，其中：\n\n- 以`[`开头，`]`结尾。\n- 开头后跟猫猫码的大类型(大小写数字或下划线，标准应为`CAT`)\n- 开大类型后为此码的小类型(大小写数字或下划线)，与大类型之间使用冒号`:`分割。\n- 参数为多个key不重复的键值对，一对参数使用`=`连接键与值，多对参数使用`,`分割。\n- 可以没有参数。\n- 区分大小写。\n\n## 🎉 CatCode2!\n\n[**CatCode2**](https://github.com/ForteScarlet/CatCode2) 现已公开！立刻前往 [👉**CatCode2**](https://github.com/ForteScarlet/CatCode2) 预览、体验、点赞与贡献！\n\n## 应用\n\n猫猫码将会被作为[simpler-robot](https://github.com/ForteScarlet/simpler-robot)框架 (即[simple-robot](https://github.com/ForteScarlet/simple-robot-core)的2.x版本) 的送信特殊码使用，以取代曾经的CQ码。\n\n当然，猫猫码也属于一种消息格式，某种程度上猫猫码也可以表示为类似于`json`等消息类型，但是我不认为他会比json更好用。\n\n但是如果你觉得它很可爱，也欢迎使用~\n\n\n**如果你愿意送给猫猫一颗右上角的星星，猫猫会很开心的喔~**\n\n\n### **猫猫是严格的。** \n为了避免混淆整个存在猫猫码的文本中不允许出现：`[`、`]`、`\u0026` 字符和制表符与换行符，猫猫码文本内中除了上述字符外，还不允许出现`,`与`=`字符。\n因此，猫猫码的转义规则为：\n- `\u0026`  -\u003e  `\u0026amp;`\n- `[`  -\u003e  `\u0026#91;`\n- `]`  -\u003e  `\u0026#93;`\n- `,`  -\u003e  `\u0026#44;`\n- `=`  -\u003e  `\u0026#61;`\n- `\\n` -\u003e  `\u0026#13;`\n- `\\r` -\u003e  `\u0026#10;`\n- `\\t` -\u003e  `\u0026#09;`\n\n\n### **猫猫是慵懒的。** \n本库提供了丰富地猫猫码解析、封装相关内容。\n\n一切工具类相关的均以`Cat`开头(或包含)，例如`CatDecoder`、`CatCodeUtil`等，\n而针对于猫猫码的封装类相关，大部分均以`Neko`为开头(或包含)命名。例如`Neko`、`Nyanko(FastNeko)`、`MapNeko`。\n\n### **猫猫是多样的。** \n猫猫码封装接口有`Neko`（保守猫猫，即参数不可变）、`MutableNeko`（善变猫猫，可动态变更参数，但是不再基于字符串操作）、`EmptyNeko`（佛系猫猫，即静态的空参实例）、\n以及上述几个类型所各自对应的`NoraNeko`（野良猫猫，即猫猫码大类型不是`CAT`但是规则与猫猫码一致的野良猫猫码）\n\n### **猫猫是警觉的。** \n猫猫码工具主要基于字符串操作，减少资源占用与解析封装损耗，效率更高（尤其是在使用不变猫猫的时候）。\n\n### **猫猫是包容的。** \n任何符合规则：`[TYPE:type,param=value,param=value,...]`的特殊码均可以视为猫猫码，尽管`TYPE`并不是`CAT`。\n\n这类其他类型的“猫猫码”称为`WildcatCode(野良猫码)`, 可以通过`WildcatCodeUtil`工具来实现对应的解析, 通过`NoraNeko`实例类型作为封装。\n\n\n\n\n## 使用方式\n\n## JVM \n\n### Maven\n\n※ 版本可参考上面的版本号小图标。\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003elove.forte\u003c/groupId\u003e\n    \u003cartifactId\u003ecatcode\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## JS\n将会通过kotlin多平台实现，提供js库，并发布于github release\\[、Maven和npm(待议)]。\n\n抢先预览：[CatCode-multiplatform](https://github.com/ForteScarlet/CatCode-multiplatform)\n\n\n## Native\n将会通过kotlin多平台实现，提供`.h`头文件与对应的`.dll`(windows)、`.so`(linux)文件。\n\n抢先预览：[CatCode-multiplatform](https://github.com/ForteScarlet/CatCode-multiplatform)\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003e 你可以基于标准CAT码格式自行实现。\n\n\n## 文档\n文档地址：https://www.yuque.com/simpler-robot/catcode\n\n\u003e 文档尚待建设。\n\n\n## 常用猫猫\n\n猫猫码存在一些十分常用的类型，这些类型的参数拥有已经约定俗成的参数格式。\n\n#### text 文本\ntext类型是一个基础的类型，其代表了一段不包含cat码的普通文本。\ntext类型的cat码只有一个参数 `text`, 其代表了文本的正文内容。\n\n之所以会存在text类型的猫猫码是因为有些场景下可能会需要将一个文本内容表示为一个 `Neko` 实例。\n\n\n#### at 艾特\n    \nat类型可以说是十分常见了，其代表 **@** 了某个人。\nat类型存在几个常见参数：`code`、`all`。\n\n`code`代表其对应被at的用户的账号，是字符串或者数字类型。\n\n例如：`[CAT:at,code=1149159218]`。\n\n而`all`代表此CAT是否代表**at全体**，类型为bool类型。\n\n例如：`[CAT:at,all=true]`。\n\n当然，也存在使用`code=all`来代表at全体的效果。\n\n通常来讲，`code`参数与`at`参数二者只会存在一个。\n    \n    \n#### image 图片\n\nimage类型代表一个**图片类型**的消息。\nimage类型存在几个常见参数：`id`、`file`、`url`、`flash`。\n\n`id`一般代表这个图片的一个网络服务器标识。\n\n`file`一般代表这个图片的本地文件路径，有时候也会作为`id`参数的代替。\n\n`url`代表这个图片的网络路径。\n\n`flash`是bool类型，代表是否作为一个**闪照**或者**可销毁**图片。\n\n例如：`[CAT:image,id=1,file=1.jpg,flash=true]`\n\n通常来讲，`file`、`url`两个参数可能同时存在，或至少出现其中一种，而`id`则根据是否实际存在id值而决定。\n\n\n#### voice 语音\nvoice类型代表一个**语音类型**的消息。\nvoice类型存在几个常见参数：`id`、`file`、`url`，其含义与`image`类型基本一致。\n\n\n#### face 表情\nface类型也是一个十分常见的类型，其代表了一个通讯应用中的普通默认表情。\n其存在一个 `id` 参数代表表情的标识。\n\n例如：`[CAT:face,id=1]`\n\n\n#### share 分享\nshare类型是一种十分常见的类型，但是它不一定能够被所有平台支持。尽管如此，他依然十分常见。\n分享类型一般会存在4种常见参数：`title`、`content`、`url`、`image`,\n其中：\n\n`title` 代表分享链接的标题。\n\n`content` 代表分享链接的简述。\n\n`url` 代表分享的链接。\n\n`image` 代表分享的链接的封面。\n\n而这其中，`url`参数是必然存在的。\n\n例如：`[CAT:share,url=www.baidu.com,title=百度一下,content=百度一下你就知道]`\n\n\n\n\n\n## 构建Cat码\n\n### Java\n\n#### 1. 通过Builder构建CatCode\n\n```java\n        // get util instance.\n        final CatCodeUtil catUtil = CatCodeUtil.INSTANCE;\n\n        // 构建一个猫猫码 - string\n        // 例如构建一个字符串类型的: [CAT:at,code=123456,name=forte,age=12]\n        // 1. StringCodeBuilder\n        final CodeBuilder\u003cString\u003e stringBuilder = catUtil.getStringCodeBuilder(\"at\");\n        String catCode1 = stringBuilder\n                .key(\"code\").value(123456)\n                .key(\"name\").value(\"forte\")\n                .key(\"age\").value(12)\n                .build();\n\n        System.out.println(catCode1);\n\n        // 构建一个猫猫码 - Neko\n        // 例如构建一个Neko类型的: [CAT:image,file=1.jpg,dis=true]\n        // 2. NekoBuilder\n        final CodeBuilder\u003cNeko\u003e nekoBuilder = catUtil.getNekoBuilder(\"image\");\n        Neko catCode2 = nekoBuilder\n                .key(\"file\").value(\"1.jpg\")\n                .key(\"dis\").value(true)\n                .build();\n\n        System.out.println(catCode2);\n```\n\n#### 2. 直接获取部分无参模板\n```java\n// NekoObjects中的可获取值均为部分无参数常量，例如at全体。\nfinal Neko alAll = NekoObjects.getNekoAtAll();\n```\n\n#### 3. 通过工具类获取\n```java\nfinal String at = CatCodeUtil.toCat(\"at\", \"qq=123\");\n```\n\n\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n\n\n\u003e Neko : ねこ(猫)，意为“猫”。\n\u003e\n\u003e NoraNeko : のらねこ(野良猫)，意为“野猫”。\n\u003e\n\u003e \n\u003e 未来计划通过kotlin发布全平台通用库，可通过JVM/JS/Native操作猫猫码。\n\u003e 代码移植为全平台没问题，native测试执行也没啥问题，但是我不知道怎么发布，所以。。再说吧。\n\n\n### LICENSE \nsee [LICENSE](./LICENSE) .\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffortescarlet%2Fcatcode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffortescarlet%2Fcatcode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffortescarlet%2Fcatcode/lists"}