├── .cargo └── config.toml ├── .gitattributes ├── .github └── workflows │ └── build.yml ├── .gitignore ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── build.rs ├── buildrc └── redreply.rc ├── docs ├── .nojekyll ├── README.md ├── _coverpage.md ├── _navbar.md ├── _sidebar.md ├── adaptar │ └── README.md ├── detailref │ └── README.md ├── docsify │ ├── docsify-copy-code.min.js │ ├── docsify.min.js │ ├── emoji.min.js │ ├── search.min.js │ └── vue.min.css ├── download │ └── README.md ├── example │ ├── README.md │ ├── image-1.png │ ├── image-2.png │ └── image.png ├── favicon.png ├── idea │ └── README.md ├── index.html ├── mqtt │ ├── README.md │ └── image.png ├── onebot │ └── README.md └── softarch.png ├── readme.md ├── res ├── axios.js ├── crontool.html ├── debug.html ├── favicon.ico ├── gobal_filter.html ├── index.html ├── index_old.html ├── live2d │ ├── l2d.js │ ├── models │ │ └── pio │ │ │ ├── model.moc │ │ │ ├── model1.json │ │ │ ├── model2.json │ │ │ ├── model3.json │ │ │ ├── motions │ │ │ ├── Breath%20Dere1.mtn │ │ │ ├── Breath%20Dere2.mtn │ │ │ ├── Breath%20Dere3.mtn │ │ │ ├── Breath1.mtn │ │ │ ├── Breath2.mtn │ │ │ ├── Breath3.mtn │ │ │ ├── Breath4.mtn │ │ │ ├── Breath5.mtn │ │ │ ├── Breath6.mtn │ │ │ ├── Breath7.mtn │ │ │ ├── Breath8.mtn │ │ │ ├── Fail.mtn │ │ │ ├── Sleeping.mtn │ │ │ ├── Success.mtn │ │ │ ├── Sukebei1.mtn │ │ │ ├── Sukebei2.mtn │ │ │ ├── Sukebei3.mtn │ │ │ ├── Touch%20Dere1.mtn │ │ │ ├── Touch%20Dere2.mtn │ │ │ ├── Touch%20Dere3.mtn │ │ │ ├── Touch%20Dere4.mtn │ │ │ ├── Touch%20Dere5.mtn │ │ │ ├── Touch%20Dere6.mtn │ │ │ ├── Touch1.mtn │ │ │ ├── Touch2.mtn │ │ │ ├── Touch3.mtn │ │ │ ├── Touch4.mtn │ │ │ ├── Touch5.mtn │ │ │ ├── Touch6.mtn │ │ │ └── WakeUp.mtn │ │ │ └── textures │ │ │ ├── default-costume.png │ │ │ ├── pajamas-costume.png │ │ │ └── school-costume.png │ ├── pio.css │ └── pio.js ├── login.html ├── obconnect.html ├── pkg_edit.html ├── pluscenter.html ├── script.js ├── style.css ├── up.html ├── version.txt ├── vue-quill.js ├── vue-quill.snow.prod.css ├── vue.js └── watchlog.html ├── script └── upload_web.py └── src ├── botconn ├── email.rs ├── kook.rs ├── mod.rs ├── onebot11.rs ├── onebot115.rs ├── qq_guild_all.rs ├── qqguild_private.rs ├── qqguild_public.rs ├── satoriv1.rs └── telegram.rs ├── cqapi └── mod.rs ├── cqevent ├── do_group_inc.rs ├── do_group_msg.rs ├── do_other_evt.rs ├── do_private_msg.rs └── mod.rs ├── cronevent └── mod.rs ├── httpevent └── mod.rs ├── httpserver └── mod.rs ├── initevent └── mod.rs ├── lib.rs ├── libload └── mod.rs ├── main.rs ├── mqttclient └── mod.rs ├── mytool ├── all_to_silk.rs ├── deal_flac.rs ├── deal_ogg.rs ├── deal_silk.rs ├── mod.rs ├── mp3_deal.rs └── wav_deal.rs ├── onebot11s └── mod.rs ├── pluscenter └── mod.rs ├── pyserver └── mod.rs ├── redlang ├── cqexfun.rs ├── exfun.rs ├── mod.rs └── webexfun.rs ├── status └── mod.rs └── test └── mod.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.aarch64-linux-android] 2 | rustflags = ["-C", "default-linker-libraries"] 3 | 4 | [target.x86_64-pc-windows-msvc] 5 | linker = "rust-lld.exe" 6 | 7 | [target.i686-pc-windows-msvc] 8 | linker = "rust-lld.exe" -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=rust 2 | *.css linguist-language=rust 3 | *.html linguist-language=rust 4 | *.htm linguist-language=rust 5 | *.py linguist-language=rust 6 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Test 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | name: 7 | description: 'Log level' 8 | required: true 9 | default: 'warning' 10 | 11 | jobs: 12 | test: 13 | name: build project 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | include: 18 | # Linux x86_64 19 | - os: ubuntu-latest 20 | 21 | # Windows 22 | - os: windows-latest 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@master 26 | 27 | - name: install_ubuntu_dependencies 28 | if: startsWith(matrix.os, 'ubuntu-') 29 | run: | 30 | cargo install cross --git https://github.com/cross-rs/cross 31 | 32 | - name: build_ubuntu 33 | if: startsWith(matrix.os, 'ubuntu-') 34 | run: | 35 | CROSS_NO_WARNINGS=0 cross build --target i686-unknown-linux-musl --release 36 | CROSS_NO_WARNINGS=0 cross build --target x86_64-unknown-linux-musl --release 37 | CROSS_NO_WARNINGS=0 cross build --target aarch64-linux-android --release 38 | CROSS_NO_WARNINGS=0 cross build --target aarch64-unknown-linux-musl --release 39 | 40 | - name: build_windows 41 | if: startsWith(matrix.os, 'windows-') 42 | run: | 43 | rustup target add i686-pc-windows-msvc 44 | rustup target add x86_64-pc-windows-msvc 45 | cargo build --release --target i686-pc-windows-msvc 46 | cargo build --release --target x86_64-pc-windows-msvc 47 | shell: pwsh 48 | 49 | - name: before_ubuntu_upload 50 | if: startsWith(matrix.os, 'ubuntu-') 51 | run: | 52 | mkdir Release 53 | cp target/x86_64-unknown-linux-musl/release/redlang Release/redlang_linux_x86_64 54 | cp target/aarch64-linux-android/release/redlang Release/redlang_android_aarch64 55 | cp target/aarch64-unknown-linux-musl/release/redlang Release/redlang_linux_aarch64 56 | cp target/i686-unknown-linux-musl/release/redlang Release/redlang_linux_i686 57 | 58 | - name: before_windows_upload 59 | if: startsWith(matrix.os, 'windows-') 60 | run: | 61 | mkdir Release 62 | cp target/i686-pc-windows-msvc/release/redlang.exe Release/redlang_windows_i686.exe 63 | cp target/x86_64-pc-windows-msvc/release/redlang.exe Release/redlang_windows_x86_64.exe 64 | shell: pwsh 65 | 66 | - name: upload file1 67 | if: startsWith(matrix.os, 'windows-') 68 | uses: actions/upload-artifact@v4 69 | with: 70 | name: redlang_windows_i686.exe 71 | path: 72 | Release/redlang_windows_i686.exe 73 | 74 | - name: upload file2 75 | if: startsWith(matrix.os, 'windows-') 76 | uses: actions/upload-artifact@v4 77 | with: 78 | name: redlang_windows_x86_64.exe 79 | path: 80 | Release/redlang_windows_x86_64.exe 81 | 82 | - name: upload file3 83 | if: startsWith(matrix.os, 'ubuntu-') 84 | uses: actions/upload-artifact@v4 85 | with: 86 | name: redlang_linux_aarch64 87 | path: 88 | Release/redlang_linux_aarch64 89 | 90 | - name: upload file4 91 | if: startsWith(matrix.os, 'ubuntu-') 92 | uses: actions/upload-artifact@v4 93 | with: 94 | name: redlang_linux_i686 95 | path: 96 | Release/redlang_linux_i686 97 | 98 | - name: upload file5 99 | if: startsWith(matrix.os, 'ubuntu-') 100 | uses: actions/upload-artifact@v4 101 | with: 102 | name: redlang_android_aarch64 103 | path: 104 | Release/redlang_android_aarch64 105 | 106 | - name: upload file6 107 | if: startsWith(matrix.os, 'ubuntu-') 108 | uses: actions/upload-artifact@v4 109 | with: 110 | name: redlang_linux_x86_64 111 | path: 112 | Release/redlang_linux_x86_64 113 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | Cargo.lock 3 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "redlang" 3 | version = "1.0.80" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | fancy-regex = "0.14.0" 10 | encoding = "0.2.33" 11 | getrandom = "0.3.3" 12 | base64 = "0.22.1" 13 | serde_json = "1.0.140" 14 | serde_derive = "1.0.219" 15 | serde = {version = "1.0.219",features = ["derive"]} 16 | uuid = {version = "1.16.0",features = ["v4","fast-rng"]} 17 | lazy_static = "1.5.0" 18 | chrono = "0.4.41" 19 | md-5 = "0.10.6" 20 | rcnb-rs = "0.1.0" 21 | rust-embed = {version="8.7.2",features = ["compression"]} 22 | image = "0.25.6" 23 | imageproc = "0.25.0" 24 | gif = "0.13.1" 25 | cron = "0.15.0" 26 | hyper = { version = "1", features = ["full"] } 27 | tokio = { version = "1.45.0", features = ["full"] } 28 | url = "2.5.4" 29 | futures-util = "0.3.31" 30 | hyper-tungstenite = "0.17.0" 31 | tokio-tungstenite = { version = "0.26.2", default-features = false, features = ["native-tls-vendored"] } 32 | scopeguard = "1.2.0" 33 | log = "0.4.27" 34 | tracing = "0.1.41" 35 | tracing-subscriber = { version = "0.3.19", features = ["env-filter","time","local-time"]} 36 | opener = "0.8.1" 37 | rusqlite = {version = "0.35.0",features = ["bundled","functions"]} 38 | sevenz-rust = "0.6.1" 39 | jsonpath-rust = "1.0.2" 40 | rusttype = "0.9.3" 41 | # markdown = "1.0.0-alpha.7" 42 | reqwest = {version = "0.12.15",default-features = false,features = ["native-tls-vendored","multipart"]} 43 | time = { version = "0.3.41", features = ["formatting", "macros"] } 44 | # headless_chrome = {version="1.0.5",default-features = false} 45 | webp = "0.3.0" 46 | sysinfo = "0.35.1" 47 | usvg = "0.45.1" 48 | resvg = { version = "0.45.1", default-features = false, features = [ "text", "raster-images" ] } 49 | fontdb = { version = "0.23.0", default-features = false, features = [ "fs" ] } 50 | flate2 = { version = "1.1.1",default-features = false} 51 | zhconv = {version = "0.3.3", features = ["opencc","compress"]} 52 | async-trait = "0.1.88" 53 | html5gum = "0.7.0" 54 | html-escape = "0.2.13" 55 | libloading = "0.8.7" 56 | tokio-util = { version = "0.7.15", default-features = false, features = [ "io" ] } 57 | http-body-util = "0.1.3" 58 | hyper-util = { version = "0.1.12", features = ["full"] } 59 | bytes = "1.10.1" 60 | zip = "4.0.0" 61 | crc64 = "2.0.0" 62 | headless_chrome = "1.0.17" 63 | path-clean = "1.0.1" 64 | rust-ini = "0.21.0" 65 | mlua = { version = "0.10.3", features = ["lua54", "vendored"] } 66 | ab_glyph = "0.2.29" 67 | 68 | claxon = "0.4.3" 69 | minimp3_fixed ="0.5.4" 70 | silk-rs-no-llvm = {git = "https://github.com/super1207/silk-rs-no-llvm"} 71 | lewton = "0.10.2" 72 | 73 | msedge-tts = {git = "https://github.com/super1207/msedge-tts"} 74 | 75 | imap = { git = "https://github.com/jonhoo/rust-imap"} 76 | native-tls = "0.2.14" 77 | mail-parser = "0.11.0" 78 | lettre = { version = "0.11.16",features = ["tokio1-native-tls"]} 79 | 80 | scraper = "0.23.1" 81 | tungstenite = "0.26.2" 82 | markdown = "1.0.0-alpha.21" 83 | rumqttc = {git = "https://github.com/super1207/rumqtt",default-features = false} 84 | 85 | [build-dependencies] 86 | embed-resource = "3.0.2" 87 | 88 | 89 | [target.'cfg(windows)'.dependencies] 90 | winreg = "0.55.0" 91 | xcap = "0.6.0" 92 | winconsole = "0.11.1" 93 | tray-icon = "0.20.1" 94 | fltk = { version = "1.4.33"} 95 | 96 | [profile.release] 97 | panic = "abort" # Strip expensive panic clean-up logic 98 | codegen-units = 1 # Compile crates one after another so the compiler can optimize better 99 | lto = true # Enables link to optimizations 100 | opt-level = "s" # Optimize for binary size 101 | strip = true # Remove debug symbols 102 | 103 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # for ubuntu 24.04 2 | FROM ubuntu 3 | RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/ubuntu.sources 4 | RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/ubuntu.sources 5 | RUN apt-get update -y \ 6 | && echo "Asia\nShanghai" | apt install -y tzdata \ 7 | && apt-get install unzip wget python3 python3-pip python3-venv -y \ 8 | && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ 9 | && apt-get install -y ./google-chrome-stable_current_amd64.deb \ 10 | && rm google-chrome-stable_current_amd64.deb \ 11 | && wget -O /usr/share/fonts/simsun.ttf https://pfh-file-store.oss-cn-hangzhou.aliyuncs.com/simsun.ttf \ 12 | && apt-get clean 13 | ADD "https://red.super1207.top/version/latest_nightly_version.php" skipcache 14 | RUN wget -O radlang.zip https://red.super1207.top/download/latest_nightly_linux_x86_64.php \ 15 | && unzip radlang.zip \ 16 | && rm radlang.zip \ 17 | && chmod +x redlang_linux_x86_64 18 | EXPOSE 1207 19 | CMD if [ ! -f "/plus_dir/config.json" ]; \ 20 | then echo '{"web_port":1207,"web_host":"0.0.0.0","ws_urls":[],"not_open_browser":true}' > /plus_dir/config.json; fi \ 21 | && ./redlang_linux_x86_64 22 | 23 | # 构建镜像: 24 | # docker build -t super1207/redreply . 25 | # 创建并运行容器: 26 | # docker run --rm -p 1207:1207 -v ${pwd}:/plus_dir super1207/redreply 27 | 28 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | let _ = embed_resource::compile("./buildrc/redreply.rc",embed_resource::NONE); 3 | } -------------------------------------------------------------------------------- /buildrc/redreply.rc: -------------------------------------------------------------------------------- 1 | iconName ICON "../res/favicon.ico" -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # 强大的聊天自定义问答系统-红色问答 2 | 3 | ## 软件架构 4 | 5 | ![alt text](softarch.png) 6 | 7 | ## 开始使用 8 | 9 | 1:下载项目release中的`redlang.exe`,双击并执行,会自动弹出一个网页。
10 | 11 | 2:在自动弹出的浏览器界面中,点击`连接平台协议`,然后按需求添加协议。
12 | 13 | 3:然后,你可以开始写脚本了,你可以查看[一些例子](/example/)。 14 | 15 | 4:有个交流群:920220179,有一大堆好看的。 16 | 17 | ## 平台协议推荐 18 | 19 | | 平台 | 协议 | 20 | |---|---| 21 | | 官方QQ频道私域 | 内置(推荐)、基于Gensokyo/onebot(其次推荐)、基于OlivOS(不推荐)、基于koishi/satori(不推荐)、基于satoricq/satori(不推荐) | 22 | | 官方QQ频道公域/群 | 内置(推荐)、基于Gensokyo/onebot(同样推荐)、基于OlivOS(不推荐)、基于koishi/satori(不推荐)、基于satoricq/satori(不推荐) | 23 | | 开黑啦kook | 内置(推荐)、基于kookonebot(不推荐)、基于satoricq/satori(同样推荐)、基于OlivOS(不推荐)、基于koishi/satori(不推荐) | 24 | | 三方QQ | 基于openshamrock(推荐)、基于llonebot(同样推荐)、基于Lagrange.Core/onebot(同样推荐)、基于opqonebot(不推荐)、基于go-cqhttp(不推荐)、基于chronocat(无测试) | 25 | | 米哈游大别野(已经没了) | 基于satoricq/satori(推荐)、基于OlivOS(不推荐)、基于koishi/satori(不推荐) | 26 | | 邮件 | 内置(推荐) | 27 | | telegram | 内置(推荐) | 28 | 29 | [推荐]:经过super1207仔细测试,使用/部署体验良好。 30 | 31 | [同样推荐]:经过其它人仔细测试,使用/部署体验良好、或super1207希望进行更多测试。 32 | 33 | [其次推荐]:经过仔细测试,使用/部署体验不那么好。 34 | 35 | [不推荐]:经过仔细测试但体验不好、或者未仔细测试、或者长时间未测试。 36 | 37 | [无测试]:没有经过测试,但是理论上可以运行。 38 | 39 | 40 | 41 | 42 | ## 语法参考文档 43 | 44 | [语法详细参考](/detailref/) 45 | 46 | 47 | ## 访问控制 48 | 49 | 访问控制对来自本机的访问无效。 50 | 51 | 在`config.json`中,若存在`web_password`这个字符串字段且不为空字符串,则访问webui时需要先输入密码登录,才能访问,输入此密码,将获得读写权限。 52 | 53 | 在`config.json`中,若存在`readonly_web_password`这个字符串字段且不为空字符串,则访问webui时需要先输入密码登录,才能访问,输入此密码,将获得只读权限。 54 | 55 | 如果要完全禁止他人访问,你必须同时设置这两个密码!!! 56 | 57 | 58 | ## 自行编译 59 | 60 | 注意,通常情况下,如果您不打算参与此项目的开发,就无需自行编译,请直接到release(或者github action)中去下载。
61 | 62 | 1:安装好[rust编译环境](https://www.rust-lang.org/)。
63 | 64 | 2:
65 | 在`windows`下,仅需要在项目目录下运行`cargo build`即可。
66 | 在`linux`下,编译过程参考github action 67 | 68 | 69 | ## 开源说明 70 | 71 | [GNU Affero General Public License](https://en.wikipedia.org/wiki/GNU_Affero_General_Public_License) 72 | 73 | 特别注意: 74 | 75 | 1:分发、使用此软件或其代码请明确告知用户此软件的原始开源地址:https://github.com/super1207/redreply
76 | 77 | 2:使用修改后的软件提供服务,或传播修改后的软件,请保持相同开源协议开源并明确指出修改内容,不得隐藏软件已经被修改的事实。
78 | 79 | 3:此软件不做质量保证,若因此软件或其修改版本造成任何损失,概不负责。
80 | 81 | 4:请合法使用。 82 | 83 | 84 | ## 其它重要事项 85 | 86 | 1:`红色问答`中很大一部分命令参考了`铃心自定义`,感谢铃心自定义的制作团队!
87 | 88 | 2:`红色问答`的`红色`两字,并无政治上意义,也没有其它特殊内涵,仅仅是因为`super1207`在项目开启的初期喜欢红色。
89 | 90 | 3:`红色问答`中大部分代码由`super1207`编写,但其语法和机制是很多人共同探讨出来的。
91 | 92 | 4:`红色问答`并没有设计自己的图标,而是采用`近月少女的礼仪`中的人物`樱小路露娜`作为标志,`super1207`已经尽可能的降低了图片清晰度,若仍然认为有可能侵权的行为,请立刻与我联系。 93 | -------------------------------------------------------------------------------- /docs/_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![logo](/favicon.png) 4 | 5 | # 红色问答 base 6 | 7 | > 一个神奇的自定义聊天文本处理工具。 8 | 9 | - 我们塑造了我们的工具,然后我们的工具塑造了我们。 10 | by John M. Culkin(1928-1993) 11 | 12 | 13 | [GitHub](https://github.com/super1207/redreply/) 14 | [Get Started](/?id=软件架构) -------------------------------------------------------------------------------- /docs/_navbar.md: -------------------------------------------------------------------------------- 1 | * [:cn:简体](/) 2 | * [:cn:繁體](/zh-hant/) -------------------------------------------------------------------------------- /docs/_sidebar.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | * [首页](/) 4 | * [下载](/download/) 5 | * [一些例子](/example/) 6 | * [协议说明](/adaptar/) 7 | * [onebot网络接口](/onebot/) 8 | * [MQTT推送接口](/mqtt/) 9 | * [语法详细参考](/detailref/) 10 | * [设计理念](/idea/) -------------------------------------------------------------------------------- /docs/adaptar/README.md: -------------------------------------------------------------------------------- 1 | # 适配器说明 2 | 3 | ## onebot11 4 | 5 | 以正向WS连接[ONEBOT11](https://github.com/botuniverse/onebot-11) 6 | 7 | 见[OpenShamrock](https://github.com/whitechi73/OpenShamrock)(推荐)、[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)、[opqonebot](https://github.com/super1207/opqonebot) 8 | 9 | 如果是QQ平台,目前可以自定义音卡签名。在`config.json`同级目录,创建一个`adapter_onebot11_config.json`文件,内容为: 10 | 11 | ```json 12 | { 13 | "music_card_sign":"https://oiapi.net/API/QQMusicJSONArk" 14 | } 15 | ``` 16 | 就可以自动使用独角兽的API来签名custom类型的音乐卡片了。 17 | 18 | ## olivos 19 | 20 | [OlivOS](https://github.com/OlivOS-Team/OlivOS) 平台的opk插件自动配置,测试中,进主页交流群了解更多信息... 21 | 22 | ## satori 23 | 24 | 可以连接[satorijs](https://github.com/satorijs) 或 [satoricq](https://github.com/super1207/satoricq) 25 | 26 | ## qq频道、群 27 | . 28 | 可以对接[QQ官方平台](https://q.qq.com/) 29 | 30 | 支持直接发送wav、flac、mp3、ogg(vorbis)格式的音频,无需配置ffmpeg。 31 | 32 | 支持QQ官方的markdown,可以这么发:`[CQ:qmarkdown,data=xxx]`。`xxx`是类似如下json 33 | ```json 34 | { 35 | "markdown": { 36 | "content": "# 标题 \n## 简介很开心 \n内容[🔗腾讯](https://www.qq.com)" 37 | } 38 | } 39 | ``` 40 | 的base64编码。以上例子写做CQ码可以这么写: 41 | `[CQ:qmarkdown,data=ewogICJtYXJrZG93biI6IHsKICAgICJjb250ZW50IjogIiMg5qCH6aKYIFxuIyMg566A5LuL5b6I5byA5b+DIFxu5YaF5a65W+2gve20l+iFvuiur10oaHR0cHM6Ly93d3cucXEuY29tKSIKICB9Cn0=]` 42 | 43 | 支持在`markdown`同级位置放入`keyboard`。以下是一个同时放markdown和keyboard的例子。 44 | ``` 45 | { 46 | "markdown": { 47 | "content": "# 标题 \n## 简介很开心 \n内容[🔗腾讯](https://www.qq.com)" 48 | }, 49 | "keyboard": { 50 | "id": "123" 51 | } 52 | } 53 | ``` 54 | 以上例子写做CQ码可以这么写: 55 | `[CQ:qmarkdown,data=ewogICAgIm1hcmtkb3duIjogewogICAgICAgICJjb250ZW50IjogIiMg5qCH6aKYIFxuIyMg566A5LuL5b6I5byA5b+DIFxu5YaF5a65W+2gve20l+iFvuiur10oaHR0cHM6Ly93d3cucXEuY29tKSIKICAgIH0sCiAgICAia2V5Ym9hcmQiOiB7CiAgICAgICAgImlkIjogIjEyMyIKICAgIH0KfQ==]` 56 | 57 | 更详细信息参考QQ的文档[markdown](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/type/markdown.html) 58 | 、[keyboard](https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/trans/msg-btn.html)。 59 | 60 | ## 邮件 61 | 62 | 支持IMAP/SMTP邮件收发协议。支持接收纯文本的邮件,支持发送图文混合的邮件,触发方式`私聊触发`。 63 | 64 | ## KOOK 65 | 66 | 支持对接KOOK官方平台。 67 | 68 | ## telegram 69 | 70 | 支持对接telegram官方平台。目前只支持了基础的群组和私聊的图文收发、发送语音、发送自定义音卡,所以某些平台相关的命令暂时是不可用的,若有需要,请向我们反馈。 -------------------------------------------------------------------------------- /docs/docsify/docsify-copy-code.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * docsify-copy-code 3 | * v3.0.0 4 | * https://github.com/jperasmus/docsify-copy-code 5 | * (c) 2017-2023 JP Erasmus 6 | * MIT license 7 | */ 8 | !function(){"use strict";function e(o){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(o)}!function(e,o){void 0===o&&(o={});var t=o.insertAt;if(e&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=e:c.appendChild(document.createTextNode(e))}}(".docsify-copy-code-button,.docsify-copy-code-button>span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{background:grey;background:var(--theme-color,grey);border:0;border-radius:0;color:#fff;font-size:1em;opacity:0;outline:0;overflow:visible;padding:.65em .8em;position:absolute;right:0;top:0;z-index:1}.docsify-copy-code-button>span{background:inherit;border-radius:3px;pointer-events:none}.docsify-copy-code-button>.error,.docsify-copy-code-button>.success{font-size:.825em;opacity:0;padding:.5em .65em;position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:-100}.docsify-copy-code-button.error>.error,.docsify-copy-code-button.success>.success{opacity:1;right:100%;transform:translate(-25%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}.docsify-copy-code-button>[aria-live]{height:1px;left:-10000px;overflow:hidden;position:absolute;top:auto;width:1px}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(e,o){e.ready((function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")}))}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,t){var n={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};o.doneEach((function(){var o=Array.from(document.querySelectorAll("pre[data-lang]"));t.config.copyCode&&Object.keys(n).forEach((function(o){var c=t.config.copyCode[o];"string"==typeof c?n[o]=c:"object"===e(c)&&Object.keys(c).some((function(e){var t=location.href.indexOf(e)>-1;return n[o]=t?c[e]:n[o],t}))}));var c=['"].join("");o.forEach((function(e){e.insertAdjacentHTML("beforeend",c)}))})),o.mounted((function(){var e=document.querySelector(".content");e&&e.addEventListener("click",(function(e){if(e.target.classList.contains("docsify-copy-code-button")){var o="BUTTON"===e.target.tagName?e.target:e.target.parentNode,t=document.createRange(),c=o.parentNode.querySelector("code"),i=o.querySelector("[aria-live]"),r=window.getSelection();t.selectNode(c),r&&(r.removeAllRanges(),r.addRange(t));try{document.execCommand("copy")&&(o.classList.add("success"),i.innerText=n.successText,setTimeout((function(){o.classList.remove("success"),i.innerText=""}),1e3))}catch(e){console.error("docsify-copy-code: ".concat(e)),o.classList.add("error"),i.innerText=n.errorText,setTimeout((function(){o.classList.remove("error"),i.innerText=""}),1e3)}(r=window.getSelection())&&("function"==typeof r.removeRange?r.removeRange(t):"function"==typeof r.removeAllRanges&&r.removeAllRanges())}}))}))}].concat(window.$docsify.plugins||[])}(); 9 | //# sourceMappingURL=docsify-copy-code.min.js.map -------------------------------------------------------------------------------- /docs/download/README.md: -------------------------------------------------------------------------------- 1 | ### [国内镜像](http://red.super1207.top) 2 | 3 | 更新可能不及时,并且下载不是很快,请耐心等待 4 | 5 | ### [github下载](https://github.com/super1207/redreply/releases) 6 | 7 | 官方稳定版本 8 | 9 | ### [github actions](https://github.com/super1207/redreply/actions) 10 | 11 | 新特性马上尝试,但是需要登录github 12 | 13 | 14 | ### 安装脚本(实验,暂不可用) 15 | 16 | 国内镜像的另一种使用方式,需要有bash环境 17 | 18 | ``` 19 | curl -L http://red.super1207.top/redstart.sh | bash``` -------------------------------------------------------------------------------- /docs/example/README.md: -------------------------------------------------------------------------------- 1 | ## 调试脚本的方法(重要) 2 | 3 | > 红色问答倾向于使用真实的聊天平台环境来调试。 4 | 5 | 1. 创建如下图这样的一个脚本: 6 | 7 | ![Alt text](image.png) 8 | ``` 9 | 【运行脚本【CQ反转义【子关键词】】】 10 | ``` 11 | 12 | 2. 然后,在您的聊天平台,发送如下信息: 13 | 14 | ![Alt text](image-2.png) 15 | 16 | ``` 17 | run【循环@5@hello【空格】】 18 | ``` 19 | 20 | 3. 然后,您会看到如下的效果: 21 | 22 | ![Alt text](image-1.png) 23 | 24 | > PS:在没有连接平台协议的时候,你也可以通过界面上的[其它]->[调试]来方便地进行离线调试。 25 | 26 | ## 访问网络图片 27 | 28 | #### 代码 29 | ``` 30 | 【图片【取元素【json解析【访问@https://api.gumengya.com/Api/DmImg】】@data@url】】 31 | ``` 32 | 33 | #### 解释 34 | * [【访问】](/detailref/?id=访问)命令访问了一个网站,得到了json格式的字节集 35 | 36 | * [【json解析】](/detailref/?id=json解析)命令解析了字节集,得到了Redlang对象 37 | 38 | * [【取元素】](/detailref/?id=取元素)命令取了Red对象中的data->url字段,即图片链接 39 | 40 | * [【图片】](/detailref/?id=图片)命令,构造了一张图片。【图片】命令,其实是输出了平台支持的特殊格式的文本,您如果对此感到好奇,可以使用[【打印日志】](/detailref/?id=打印日志)命令查看。 41 | 42 | ## 如何向指定目标发送消息 43 | 44 | 消息来源决定回复目标。 45 | 46 | 在聊天事件中,回复会自动根据消息来源,发送到群聊或私聊中。 47 | 48 | 但是在定时任务、框架初始化事件中,没有消息来源。所以需要使用[【设置来源】](/detailref/?id=设置来源)命令。 49 | 50 | #### 定时器中发送群聊消息 51 | 52 | ``` 53 | 【设置来源@机器人平台@onebot11】 54 | 【设置来源@机器人ID@xxxxx】 55 | 【设置来源@群ID@920220179】 56 | ``` 57 | 58 | > PS:在某些具备两级群的平台,你可能还需要写【设置来源@群组ID@xxxxxxxxx】 59 | 60 | #### 定时器中发送私聊消息 61 | 62 | ``` 63 | 【设置来源@机器人平台@onebot11】 64 | 【设置来源@机器人ID@xxxxx】 65 | 【设置来源@发送者ID@1875159423】 66 | ``` 67 | 68 | #### 在群聊中发送私聊消息 69 | 将群ID清空,就可以进行私聊回复了。 70 | ``` 71 | 【设置来源@群ID@】 72 | ``` 73 | 74 | 75 | ## 多条回复 76 | 77 | 如果希望对同一条消息进行多次回复,有两种办法。【分页】和【输出流】是有些区别的,【分页】会在脚本运行结束的时候,同时发送多条消息。而【输出流】会在脚本运行的时候立刻发送,并且返回消息ID。 78 | 79 | #### 分页 80 | 使用[【分页】](/detailref/?id=分页)命令发送`你好`和`世界`两条消息。 81 | 82 | ``` 83 | 你好【分页】世界 84 | ``` 85 | 86 | #### 输出流 87 | 使用[【输出流】](/detailref/?id=输出流)命令发送`你好`和`世界`两条消息。 88 | 89 | ``` 90 | 【隐藏【输出流@你好】】 91 | 【隐藏【输出流@世界】】 92 | ``` 93 | 【输出流】会返回消息ID,这里用不到,所以使用[【隐藏】](/detailref/?id=隐藏)命令将返回的消息ID隐藏起来。 94 | 95 | ## 获取事件内容 96 | 97 | 如果需要获取消息事件中的消息,最方便的方法是使用[【子关键词】](/detailref/?id=子关键词)。 98 | 99 | 如果要获取一个事件中的所有内容,比如您希望获得事件产生的时间,您可以使用【取元素【事件内容】@time】,如果您不了解【事件内容】的结构,您可以使用【转文本【事件内容】】,将其输出出来观察。 100 | 101 | ## 数据类型转换 102 | 103 | 红色问答中支持`文本`,`字节集`,`数组`,`对象`这四种数据类型,然而可以输出的只有`文本`类型,所以,您需要使用[【转文本】](/detailref/?id=转文本)命令。 104 | 105 | #### 文本转文本 106 | 107 | ``` 108 | 【转文本@你好】 109 | ``` 110 | 输出```"你好"```,其实就是输出了json形式的文本,这在您需要手拼json的时候非常管用。 111 | 112 | #### 字节集转文本 113 | 114 | ``` 115 | 【转文本【读文件@C://test.txt】@utf8】 116 | ``` 117 | 读utf8格式的文本文件,得到的结果是字节集,然后转为文本。utf8是默认的,可以省略,如`【转文本【读文件@C://test.txt】】`,也可以是gbk,如`【转文本【读文件@C://test.txt】@gbk】`。 118 | 119 | #### 文本转字节集 120 | [【转字节集】](/detailref/?id=转字节集)命令可以实现将文本转为字节集。 121 | 122 | ``` 123 | 【转字节集@你好@utf8】 124 | ``` 125 | utf8是默认的,表示字节集类型,可以省略,如`【转字节集@你好】`,也可以是gbk,如`【转字节集@你好@gbk】`。 126 | 127 | #### 字节集转文本 128 | 129 | ``` 130 | 【转文本@【转字节集@你好】@utf8】 131 | ``` 132 | 133 | #### 数组转文本 134 | 135 | ``` 136 | 【转文本【数组@1@2@3】】 137 | ``` 138 | 输出`["1","2","3"]`,其实就是输出了json形式的文本。因为json中是不支持字节集的,所以你需要保证数组中没有字节集类型。 139 | 140 | #### 对象转文本 141 | 142 | ``` 143 | 【转文本【对象@1@a@2@b@3@c】】 144 | ``` 145 | 输出`{"1":"a","2":"b","3":"c"}`,其实就是输出了json形式的文本。因为json中是不支持字节集的,所以你需要保证对象中没有字节集类型。 146 | 147 | ## 欢迎新人 148 | 149 | 触发方式改为`群成员增加` 150 | 151 | #### 代码 152 | 153 | ``` 154 | 【判等【当前群号】@@@【设置来源@群ID@【取元素【取群列表】@0@群ID】】】 155 | 【艾特】欢银【发送者昵称】,祝您度过美好的一天! 156 | ``` 157 | #### 解释 158 | 159 | * 第一行代码,对群聊类型进行判断。 160 | 如果[【当前群号】](/detailref/?id=当前群号)为空,说明是类似qq频道那种两级群组。所以使用[【取群列表】](/detailref/?id=取群列表) + [【取元素】](/detailref/?id=取元素)命令获取当前群组的群列表并取出其中第一个群的群ID,将其设置为消息来源。 161 | 如果【当前群号】不为空,说明是类似QQ群那种群聊,什么也不用做。 162 | 163 | * 第二行代码,使用[【发送者昵称】](/detailref/?id=发送者昵称)获取新人的昵称,使用[【艾特】](/detailref/?id=艾特)来AT发送者。 -------------------------------------------------------------------------------- /docs/example/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/example/image-1.png -------------------------------------------------------------------------------- /docs/example/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/example/image-2.png -------------------------------------------------------------------------------- /docs/example/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/example/image.png -------------------------------------------------------------------------------- /docs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/favicon.png -------------------------------------------------------------------------------- /docs/idea/README.md: -------------------------------------------------------------------------------- 1 | # 设计 2 | 3 | ## 插件模型 4 | 5 | ### 资源 6 | 7 | 红色问答的插件在磁盘上以文件夹形式存在,一个文件夹就是一个插件,一个插件拥有如下资源: 8 | 9 | * 名字:对于非`默认插件`,文件夹的名字就是插件名。插件作者不能决定,甚至不能获取自己的插件名,插件名由最终使用者决定,可随意修改,这么做,就可以绝对保证插件不会重名,因为文件系统不支持。 10 | * 磁盘资源:每个插件可以通过【应用目录】命令,来获得属于自己的磁盘路径,插件应该永远以这个路径为基础来进行文件目录操作。插件不应该记录这个路径,因为这个路径可能变化,比如插件改名的时候。 11 | * 网络资源:每个插件可以拥有自己的网络路径,格式是`http://host:port/user/插件名/自定义路径`。其中,只有`自定义路径`是由插件作者定义的。 12 | * 常量和自定义命令:每个插件拥有自己独立的常量和命令空间,在整个红色问答重启前,定义的常量和命令都是有效的。 13 | * 持久常量:持久常量属于`磁盘资源`,在【应用目录】下的`reddat.db`文件中。 14 | * 脚本文件:脚本文件依然属于`磁盘资源`。和传统软件不同,红色问答不区分代码目录和数据目录,这么做是为了简化概念。 15 | 16 | ### 生命周期 17 | 18 | 每个插件拥有独立的生命周期。 19 | 20 | * 插件加载:在红色问答启动,或者插件重载的时候,会从【应用目录】中读取scripts.json文件,这个文件包含若干脚本。然后,其中触发类型为`框架初始化`的脚本会先被执行一次。 21 | * 插件运行:在完成插件加载后,其它类型的脚本会由各种事件触发执行。 22 | * 插件卸载:让当前插件不再收到新事件,等待当前插件所有脚本执行完毕。注意,红色问答没有名为类似`框架卸载`的触发方式,这么设计依然是为了简化概念,红色问答只是一个`词库系统`。 23 | * 插件重载:先执行插件卸载,再执行插件加载。 24 | 25 | 你绝对不能编写一个长时间运行的脚本,否则会影响插件卸载和插件重载。即使你什么也没做,插件也可能自己卸载和重载以释放一些资源。 26 | 27 | 为了阻止复杂的问题发生,不建议在运行时修改插件的名字。 28 | 29 | ### 依赖管理 30 | 31 | 红色问答不进行依赖管理。具体来说就是,任意两个插件之间都感觉不到对方的存在,也不会存在相互依赖关系。红色问答提供了很多常用命令,并且也提供了运行python和安装python包的命令,还提供了lua解析器,大多数情况下你不依赖其它插件也可以完成插件编写。如果你的插件特别复杂,有大量的依赖关系,那么你不应该使用红色问答来编写。因为不进行依赖管理,所以,版本管理也没有太大意义,插件商店里的插件版本号,只是为了让你觉得插件作者还活着,但是唯一100%正确的更新插件的方法是关闭红色问答,然后删除旧插件文件夹,放入新插件文件夹。如果你想保留数据,你需要向插件作者确认数据在不同版本之间的兼容性。 32 | 33 | ### 默认插件 34 | 35 | 红色问答始终存在一个默认插件,用于在线调试等。它的【应用目录】在一个你很容易找到的地方,它的名字是一个空字符串,你可以认为它没有名字,反正前面说了,你获取不到插件的名字。这么做是为了简化概念,很多场景下,你只需要这么一个默认插件就行了,你可以忽略`插件`的概念,红色问答不是一个插件框架,而是一个词库系统,本身定位为插件。 36 | 37 | ## 适配器模型 38 | 39 | 适配器模型也可以叫做平台协议模型。 40 | 41 | 适配器用于连接真实的聊天平台,作用是触发事件、制造脚本运行环境。红色问答里面的平台相关的命令,会根据脚本运行环境来选择调用某适配器的的API。脚本的返回值也会根据脚本运行环境来选择返回给适配器的数据。简单来说,就是`适配器产生的事件决定脚本运行环境`,`脚本运行环境决定使用什么适配器的什么API`。另外,脚本运行环境也可以由脚本自己修改,以达到其它目的,比如清空`群ID`,就可以对群聊消息进行私聊回复、比如修改群`ID`,就可以让消息回复到其它群。 42 | 43 | 所有适配器都会支持一种类似onebot但不是onebot的统一的api和event格式,以保证大多数命令的通用性。这个格式目前是非公开的,之后会考虑公开。 44 | 45 | 红色问答编写平台协议的基本要求是:协议是某知名IM的官方协议、协议可以适配众多知名IM 46 | 47 | 48 | ## 用户体验 49 | 50 | 这里的用户指的是脚本开发者,红色问答是`全代码开发平台`,对比[低代码开发平台](https://baike.baidu.com/item/%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0/23661682)。 51 | 52 | 红色问答要求用户具备编程基础:熟悉循环、判断、函数调用、数据类型等编程知识;具备数据库、网络、图像处理、操作系统等知识。 53 | 54 | 红色问答旨在简化开发方式,而不是降低开发门槛。简化的开发方式必然不能应对复杂的开发需求,但是总得有个倾向吧。我就想躺床上用一根指头在手机上指指点点就完成我的涩图插件。 55 | 56 | 红色问答运行在各种操作系统,各种架构上面,并且大多数功能不会损失。红色问答没有安装过程,本体只有一个可执行文件,双击即可获得大多数功能。你可以在box86、box64上运行,可以在wine上运行,可以在新版windows上、新版linux,新版android系统上运行,运行方式都统一为启动一个可执行文件。 57 | 58 | 红色问答同时兼容linux和windows的路径写法。是的,这对路径名有所限制,会导致不能在某些路径下面运行,间接也会影响插件名,但是我认为这是值得的。路径没事用啥特殊符号呀。 59 | 60 | 61 | ## 隐私保护 62 | 63 | 红色问答进行绝对的隐私保护。 64 | 65 | 要进行隐私保护,首先要定义什么是隐私。然而不同人有不同的定义。银行卡密码,名字,性别,年龄,身高,体重,电脑型号,软件使用时间,操作系统,软件有多少人在使用,这些都可以被定义为隐私。 66 | 67 | 绝对的隐私保护,意味着红色问答不会连接我的服务器,也尽可能不连接其它人的服务器,您的一切信息都不会传递给我。红色问答代码全部开源,您可以在github上查看。 68 | 69 | 注意:使用红色问答的插件商店,会向github或github代理地址发送信息。 70 | 注意:使用【上传文件】命令,会向[uhsea.com](https://uhsea.com/)发送信息。 71 | 注意:使用【TTS】命令,会向微软的服务器发送信息。 72 | 73 | 74 | ## 安全控制 75 | 76 | 红色问答不进行安全控制。红色问答不进行安全控制。红色问答不进行安全控制。所有密码,所有数据全部明文保存、明文传输,明文显示。网络服务完全不进行安全防护,一攻击就蓝屏给你看,然后把数据全部送出去。访问密码什么的都是骗人的,一打就穿。所以,任何情况下都不要在防火墙上公开红色问答所使用的端口号。一定不要用不信任的设备访问红色问答的端口号,因为包括密码在内的数据会直接明文放在浏览量的cookie里面。操作红色问答的时候,要注意观察周围环境。其它软件让你相信安全,红色问答让你相信不安全。 77 | 78 | 79 | ## 命令系统设计 80 | 81 | 红色问答的语法格式并没有什么令人惊艳的地方,甚至也不是特别方便,我也不是专业设计这个的,反正群友说什么设计我就怎么设计。不过,这也不是侧重点。 82 | 83 | 红色问答维护的是大量功能,以及一堆rust包的依赖关系。这是非常繁重的工作,每个rust包,以及它们的版本号都是精心挑选的。用较小的可执行文件体积,完成了大量功能。并行这些功能都能在几乎所有平台上正常运行。设计思路有点像python的蓄电池思想。红色问答开发的大部分时间,是在测试各个rust包之间的兼容性。 84 | 85 | 红色问答不具备垃圾回收机制,所以,长时间运行的脚本,可能会使用越来越多的内存空间,这也是上面提到的`你绝对不能编写一个长时间运行的脚本`的另一个原因。在脚本运行结束的时候,内存会释放。redlang不是一个中文编程语言(我仍然会这么宣传),而是一文本生成规则。 86 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 | 10 | 11 | 12 |
稍等...亲~
13 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /docs/mqtt/README.md: -------------------------------------------------------------------------------- 1 | # 红色问答MQTT推送接口(草案) 2 | 3 | ## 概述 4 | 5 | 红色问答对外公开MQTT接口,红色问答作为消息发布者。红色问答会将收到的机器人平台事件转化为类似 [onebot11](https://github.com/botuniverse/onebot-11) 格式推送。同时也会公开API调用接口,让订阅者可以调用机器人平台的API。 6 | 7 | 除此之外,还可以连接多个红色问答,达到共享脚本和适配器的效果。 8 | 9 | 要使用此推送服务,您需要先自行准备一个支持 mqtt 5.0 的mqtt broker。 10 | 11 | ## 配置 12 | 13 | ![alt text](image.png) 14 | 15 | 如上图,在红色问答的配置文件中,添加mqtt相关的配置,其中: 16 | 17 | `client_id`: 一个随机的字符串。使用uuid v4生成工具生成即可,作为红色问答的身份标记。 18 | 19 | `broker_host`: mqtt的broker服务器地址。要注意,目前仅支持mqtt 5.0的服务器,你可以自建broker服务器,也可以使用公用的免费服务器。但是要注意,公用的broker服务器是不安全的,仅用于测试。 20 | 21 | `broker_port`: mqtt的broker服务器端口号。 22 | 23 | `broker_username`: mqtt broker的用户名,如果没有可以不填或者填 `null`。 24 | 25 | `broker_password`: mqtt broker的密码,如果没有可以不填 `null`。 26 | 27 | `remote_clients`: 其它红色问答的 `client_id`,配置了之后,可以接收并处理其它红色问答推送的事件。如果想要处理所有远程红色问答的推送,可以写为:`"remote_clients":["+"]`。 28 | 29 | 配置好后,要重启红色问答才能生效。之后,红色问答会将收到的消息和事件进行推送。 30 | 31 | ## 消息推送 32 | 33 | 红色问答的推送的mqtt Topic为: 34 | 35 | `bot////event` 36 | 37 | `client_id`即为上文配置文件中配置的 `client_id` 。 38 | 39 | `platform` 和 `self_id` 可以分别通过 `【机器人平台】` 和 `【机器人ID】` 命令得到。 40 | 41 | 如下是一个例子: 42 | 43 | `bot/7c5e0089-c120-4cef-94e6-62a5c431b8b3/onebot11/1736293901/event` 44 | 45 | 您也可以通过 `bot/7c5e0089-c120-4cef-94e6-62a5c431b8b3/+/+/event` 来订阅所有bot。 46 | 47 | 推送的消息格式如下: 48 | ```json 49 | { 50 | "anonymous": null, 51 | "font": 0, 52 | "group_id": "920220179", 53 | "message": [ 54 | { 55 | "data": { 56 | "qq": "1875159423" 57 | }, 58 | "type": "at" 59 | }, 60 | { 61 | "data": { 62 | "text": " .help 指令" 63 | }, 64 | "type": "text" 65 | } 66 | ], 67 | "message_id": "474483251", 68 | "message_type": "group", 69 | "post_type": "message", 70 | "raw_message": "[CQ:at,qq=1736293901] .help 指令", 71 | "self_id": "1736293901", 72 | "sender": { 73 | ... 74 | ... 75 | }, 76 | "sub_type": "normal", 77 | "time": 1745833334, 78 | "user_id": "1875159423" 79 | } 80 | ``` 81 | 82 | 消息基本按照 [onebot11](https://github.com/botuniverse/onebot-11) 格式推送,但是要注意有如下不同: 83 | 84 | 1. 所有的id都改为了字符串 85 | 86 | 2. message字段一定为消息段数组格式 87 | 88 | 3. 所有的事件都会有一个`message_id` 89 | 90 | ## API调用 91 | 92 | ### 发起调用 93 | 94 | 红色问答公开的API Topic为 95 | 96 | `bot////api` 97 | 98 | 以上参数的含义同`消息推送`一节。 99 | 100 | 发送的数据如下: 101 | 102 | ```json 103 | { 104 | "action":"get_stranger_info", 105 | "message_id":"474483251", 106 | "params":{ 107 | "user_id":"1875159423" 108 | } 109 | } 110 | ``` 111 | 112 | 基本按照 [onebot11](https://github.com/botuniverse/onebot-11) 格式,但是要特别注意: 113 | 114 | 1. 所有的id都改为了字符串,您需要发送字符串格式的id 115 | 116 | 2. 可以在 `action` 同级添加 `message_id`,方便适配器进行消息追踪,但是这不是必须的。 117 | 118 | ### 接收回复 119 | 120 | 接收回复的方式按照 mqtt 5.0 规定的`response_topic`和`correlation_data`进行。 121 | 122 | 为防止可能的权限问题: 123 | 124 | 1. `response_topic` 建议设计为 `plus//response` ,其中,`plus_id` 为一个代表插件的uuid v4。 125 | 126 | 2. `correlation_data` 由插件自行决定。 127 | 128 | 要注意:回复的数据中的id也都为字符串格式。 -------------------------------------------------------------------------------- /docs/mqtt/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/mqtt/image.png -------------------------------------------------------------------------------- /docs/onebot/README.md: -------------------------------------------------------------------------------- 1 | # onebot网络接口(测试中,可能会不太稳定) 2 | 3 | ## 目的 4 | 5 | 红色问答公开onebot服务,可以将红色问答支持的任何协议转为onebot11接口服务,使得其它插件框架,如MiraiCQ,可以对接红色问答。 6 | 7 | 注: 8 | 9 | 红色问答目前直接支持的平台为: 10 | onebot11、olivos、satori、qq频道私区域(qqguild_private)、qq频道(qqguild_public)/群(qqgroup_public)公域、邮件、kook、telegram。 11 | 12 | 间接支持**几乎所有聊天平台** 13 | 14 | ## 连接 15 | 16 | 目前,仅支持正向WS。签权需要的access_token为红色问答的web密码,**本机使用不需要鉴权**。 17 | 18 | websocket地址:`ws://localhost:[redport]:/onebot/[机器人平台]/[机器人账号]` 19 | 20 | 如:`ws://localhost:1207/onebot/onebot11/1875159423` 21 | 22 | 当只有一个平台一个账号时,可以简写为(不推荐,没有测试过): 23 | 24 | `ws://127.0.0.1:1207/onebot` 25 | 26 | ## 局限性 27 | 28 | 1:对于qq官方频道那种,需要设置message_id才能回复的,会自动寻找最近的message_id进行回复,容易回复错人。 29 | 30 | 2:在具备两级群组的平台,如频道,获取群列表可能会失败。 31 | 32 | 3:每个message_id仅具备5分钟的有效时间。 -------------------------------------------------------------------------------- /docs/softarch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/docs/softarch.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |
2 |

红色问答

3 |
4 | 5 |
6 | favicon.ico 7 |
8 | 9 | > 强大的聊天自定义问答系统 10 | 11 | ## 背景 12 | 13 | 受铃心自定义的启发,制作一个类似的自定义系统。
14 | 15 | 随着酷Q、先驱等机器人平台的停运,其上运行的铃心自定义也逐渐不再被其作者很好的维护。再加上各种跨平台的开源机器人平台的逐渐流行,一个 **全开源** 、**跨平台** 的自定义问答系统被期待着。
16 | 17 | 红色问答因此而出现。 18 | 19 | ## 展示 20 | 21 | > 红色问答使用浏览器作为界面,并且开箱即用,您可以躺在床上用手机一只手愉快地编写插件。 22 | 23 | ![example1](https://github.com/user-attachments/assets/d11eafbe-70c6-4e37-b702-9ed135cefc8d) 24 | 25 | 26 | ![example2](https://github.com/user-attachments/assets/050046b3-5dd8-4255-bada-687e8f390fd2) 27 | 28 | ## 主要特色 29 | 30 | 1. 开源、免费、构建过程完全透明,红色问答并不属于某一个人! 31 | 32 | 2. 支持中文编程。 33 | 34 | 3. 支持多种聊天平台:QQ、telegram、KOOK、邮件、米哈游...... 35 | 36 | 4. 支持多账号。 37 | 38 | 5. 支持多操作系统:Linux、Windows、FreeBSD、Android。 39 | 40 | 6. 支持分布式集群:基于MQTT 5.0,可以让多个红色问答共享适配器和插件。 41 | 42 | 7. 支持web ui可视化:在电脑或手机的浏览器里面增加、删除、查看、修改脚本。(注意,在床上躺着用手机写插件是红色问答的主线目标) 43 | 44 | 8. 支持热重载:增加、删除、查看、修改脚本后无须重启红色问答,只需点击保存按钮即可立刻生效。 45 | 46 | 47 | ## 文档 48 | 49 | > 你想要的,都在文档里面。 50 | 51 | [文档](https://super1207.github.io/redreply) 52 | 53 | 54 | ## 开源说明 55 | 56 | [GNU Affero General Public License](https://en.wikipedia.org/wiki/GNU_Affero_General_Public_License) 57 | 58 | 特别注意: 59 | 60 | 1:分发、使用此软件或其代码请明确告知用户此软件的原始开源地址:https://github.com/super1207/redreply
61 | 62 | 2:使用修改后的软件提供服务,或传播修改后的软件,请保持相同开源协议开源并明确指出修改内容,不得隐藏软件已经被修改的事实。
63 | 64 | 3:此软件不做质量保证,若因此软件或其修改版本造成任何损失,概不负责。
65 | 66 | 4:请合法使用。 67 | 68 | 5:有个交流群:920220179 69 | 70 | -------------------------------------------------------------------------------- /res/crontool.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 红色问答CRON校验 8 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 |

红色问答CRON校验

30 |
31 |
32 | CRON表达式: 33 |
34 |
35 | 36 |
37 |
38 |
39 | 40 |
41 | 42 |
43 | 44 | 45 |
46 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /res/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/res/favicon.ico -------------------------------------------------------------------------------- /res/index_old.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 红色问答控制台 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 |
25 |
26 |
包名:
27 |
包名:
28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 |
36 |
37 |

红色问答 {{version}}

38 |
39 |
40 | 43 |
44 |
45 |
46 |
47 |
名字
48 |
49 |
50 | {{ code["name"] }} 51 |
52 |
53 |
54 | 55 | 56 |
57 | 58 |
59 |
60 |
脚本名:
61 |
介绍: 
62 | 76 |
关键词:
77 | 84 | 87 |
88 | 89 | 90 | 96 | 102 |
103 | 104 | 105 | 106 | 107 |
108 |
109 |
110 |
111 | 112 | 113 | 114 | 115 |
116 |
117 | 118 | 119 | 120 | 121 |
122 | 123 | 124 |
125 |
126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /res/live2d/models/pio/model.moc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/res/live2d/models/pio/model.moc -------------------------------------------------------------------------------- /res/live2d/models/pio/model1.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":"1.0.0", 3 | "model":"model.moc", 4 | "textures":[ 5 | "textures/default-costume.png" 6 | ], 7 | "layout":{ 8 | "center_x":0.0, 9 | "center_y":-0.05, 10 | "width":2.0 11 | }, 12 | "hit_areas_custom":{ 13 | "head_x":[-0.35, 0.6], 14 | "head_y":[0.19, -0.2], 15 | "body_x":[-0.3, -0.25], 16 | "body_y":[0.3, -0.9] 17 | }, 18 | "motions":{ 19 | "idle":[ 20 | {"file":"motions/WakeUp.mtn"}, 21 | {"file":"motions/Breath1.mtn"}, 22 | {"file":"motions/Breath2.mtn"}, 23 | {"file":"motions/Breath3.mtn"}, 24 | {"file":"motions/Breath5.mtn"}, 25 | {"file":"motions/Breath7.mtn"}, 26 | {"file":"motions/Breath8.mtn"} 27 | ], 28 | "sleepy":[ 29 | {"file":"motions/Sleeping.mtn"} 30 | ], 31 | "flick_head":[ 32 | {"file":"motions/Touch Dere1.mtn"}, 33 | {"file":"motions/Touch Dere2.mtn"}, 34 | {"file":"motions/Touch Dere3.mtn"}, 35 | {"file":"motions/Touch Dere4.mtn"}, 36 | {"file":"motions/Touch Dere5.mtn"}, 37 | {"file":"motions/Touch Dere6.mtn"} 38 | ], 39 | "tap_body":[ 40 | {"file":"motions/Touch1.mtn"}, 41 | {"file":"motions/Touch2.mtn"}, 42 | {"file":"motions/Touch3.mtn"}, 43 | {"file":"motions/Touch4.mtn"}, 44 | {"file":"motions/Touch5.mtn"}, 45 | {"file":"motions/Touch6.mtn"} 46 | ], 47 | "":[ 48 | {"file":"motions/Breath1.mtn"}, 49 | {"file":"motions/Breath2.mtn"}, 50 | {"file":"motions/Breath3.mtn"}, 51 | {"file":"motions/Breath4.mtn"}, 52 | {"file":"motions/Breath5.mtn"}, 53 | {"file":"motions/Breath6.mtn"}, 54 | {"file":"motions/Breath7.mtn"}, 55 | {"file":"motions/Breath8.mtn"}, 56 | {"file":"motions/Fail.mtn"}, 57 | {"file":"motions/Sleeping.mtn"}, 58 | {"file":"motions/Success.mtn"}, 59 | {"file":"motions/Sukebei1.mtn"}, 60 | {"file":"motions/Sukebei2.mtn"}, 61 | {"file":"motions/Sukebei3.mtn"}, 62 | {"file":"motions/Touch Dere1.mtn"}, 63 | {"file":"motions/Touch Dere2.mtn"}, 64 | {"file":"motions/Touch Dere3.mtn"}, 65 | {"file":"motions/Touch Dere4.mtn"}, 66 | {"file":"motions/Touch Dere5.mtn"}, 67 | {"file":"motions/Touch Dere6.mtn"}, 68 | {"file":"motions/Touch1.mtn"}, 69 | {"file":"motions/Touch2.mtn"}, 70 | {"file":"motions/Touch3.mtn"}, 71 | {"file":"motions/Touch4.mtn"}, 72 | {"file":"motions/Touch5.mtn"}, 73 | {"file":"motions/Touch6.mtn"}, 74 | {"file":"motions/WakeUp.mtn"} 75 | ] 76 | } 77 | } -------------------------------------------------------------------------------- /res/live2d/models/pio/model2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":"1.0.0", 3 | "model":"model.moc", 4 | "textures":[ 5 | "textures/pajamas-costume.png" 6 | ], 7 | "layout":{ 8 | "center_x":0.0, 9 | "center_y":-0.05, 10 | "width":2.0 11 | }, 12 | "hit_areas_custom":{ 13 | "head_x":[-0.35, 0.6], 14 | "head_y":[0.19, -0.2], 15 | "body_x":[-0.3, -0.25], 16 | "body_y":[0.3, -0.9] 17 | }, 18 | "motions":{ 19 | "idle":[ 20 | {"file":"motions/WakeUp.mtn"}, 21 | {"file":"motions/Breath1.mtn"}, 22 | {"file":"motions/Breath2.mtn"}, 23 | {"file":"motions/Breath3.mtn"}, 24 | {"file":"motions/Breath5.mtn"}, 25 | {"file":"motions/Breath7.mtn"}, 26 | {"file":"motions/Breath8.mtn"} 27 | ], 28 | "sleepy":[ 29 | {"file":"motions/Sleeping.mtn"} 30 | ], 31 | "flick_head":[ 32 | {"file":"motions/Touch Dere1.mtn"}, 33 | {"file":"motions/Touch Dere2.mtn"}, 34 | {"file":"motions/Touch Dere3.mtn"}, 35 | {"file":"motions/Touch Dere4.mtn"}, 36 | {"file":"motions/Touch Dere5.mtn"}, 37 | {"file":"motions/Touch Dere6.mtn"} 38 | ], 39 | "tap_body":[ 40 | {"file":"motions/Touch1.mtn"}, 41 | {"file":"motions/Touch2.mtn"}, 42 | {"file":"motions/Touch3.mtn"}, 43 | {"file":"motions/Touch4.mtn"}, 44 | {"file":"motions/Touch5.mtn"}, 45 | {"file":"motions/Touch6.mtn"} 46 | ], 47 | "":[ 48 | {"file":"motions/Breath1.mtn"}, 49 | {"file":"motions/Breath2.mtn"}, 50 | {"file":"motions/Breath3.mtn"}, 51 | {"file":"motions/Breath4.mtn"}, 52 | {"file":"motions/Breath5.mtn"}, 53 | {"file":"motions/Breath6.mtn"}, 54 | {"file":"motions/Breath7.mtn"}, 55 | {"file":"motions/Breath8.mtn"}, 56 | {"file":"motions/Fail.mtn"}, 57 | {"file":"motions/Sleeping.mtn"}, 58 | {"file":"motions/Success.mtn"}, 59 | {"file":"motions/Sukebei1.mtn"}, 60 | {"file":"motions/Sukebei2.mtn"}, 61 | {"file":"motions/Sukebei3.mtn"}, 62 | {"file":"motions/Touch Dere1.mtn"}, 63 | {"file":"motions/Touch Dere2.mtn"}, 64 | {"file":"motions/Touch Dere3.mtn"}, 65 | {"file":"motions/Touch Dere4.mtn"}, 66 | {"file":"motions/Touch Dere5.mtn"}, 67 | {"file":"motions/Touch Dere6.mtn"}, 68 | {"file":"motions/Touch1.mtn"}, 69 | {"file":"motions/Touch2.mtn"}, 70 | {"file":"motions/Touch3.mtn"}, 71 | {"file":"motions/Touch4.mtn"}, 72 | {"file":"motions/Touch5.mtn"}, 73 | {"file":"motions/Touch6.mtn"}, 74 | {"file":"motions/WakeUp.mtn"} 75 | ] 76 | } 77 | } -------------------------------------------------------------------------------- /res/live2d/models/pio/model3.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":"1.0.0", 3 | "model":"model.moc", 4 | "textures":[ 5 | "textures/school-costume.png" 6 | ], 7 | "layout":{ 8 | "center_x":0.0, 9 | "center_y":-0.05, 10 | "width":2.0 11 | }, 12 | "hit_areas_custom":{ 13 | "head_x":[-0.35, 0.6], 14 | "head_y":[0.19, -0.2], 15 | "body_x":[-0.3, -0.25], 16 | "body_y":[0.3, -0.9] 17 | }, 18 | "motions":{ 19 | "idle":[ 20 | {"file":"motions/WakeUp.mtn"}, 21 | {"file":"motions/Breath1.mtn"}, 22 | {"file":"motions/Breath2.mtn"}, 23 | {"file":"motions/Breath3.mtn"}, 24 | {"file":"motions/Breath5.mtn"}, 25 | {"file":"motions/Breath7.mtn"}, 26 | {"file":"motions/Breath8.mtn"} 27 | ], 28 | "sleepy":[ 29 | {"file":"motions/Sleeping.mtn"} 30 | ], 31 | "flick_head":[ 32 | {"file":"motions/Touch Dere1.mtn"}, 33 | {"file":"motions/Touch Dere2.mtn"}, 34 | {"file":"motions/Touch Dere3.mtn"}, 35 | {"file":"motions/Touch Dere4.mtn"}, 36 | {"file":"motions/Touch Dere5.mtn"}, 37 | {"file":"motions/Touch Dere6.mtn"} 38 | ], 39 | "tap_body":[ 40 | {"file":"motions/Touch1.mtn"}, 41 | {"file":"motions/Touch2.mtn"}, 42 | {"file":"motions/Touch3.mtn"}, 43 | {"file":"motions/Touch4.mtn"}, 44 | {"file":"motions/Touch5.mtn"}, 45 | {"file":"motions/Touch6.mtn"} 46 | ], 47 | "":[ 48 | {"file":"motions/Breath1.mtn"}, 49 | {"file":"motions/Breath2.mtn"}, 50 | {"file":"motions/Breath3.mtn"}, 51 | {"file":"motions/Breath4.mtn"}, 52 | {"file":"motions/Breath5.mtn"}, 53 | {"file":"motions/Breath6.mtn"}, 54 | {"file":"motions/Breath7.mtn"}, 55 | {"file":"motions/Breath8.mtn"}, 56 | {"file":"motions/Fail.mtn"}, 57 | {"file":"motions/Sleeping.mtn"}, 58 | {"file":"motions/Success.mtn"}, 59 | {"file":"motions/Sukebei1.mtn"}, 60 | {"file":"motions/Sukebei2.mtn"}, 61 | {"file":"motions/Sukebei3.mtn"}, 62 | {"file":"motions/Touch Dere1.mtn"}, 63 | {"file":"motions/Touch Dere2.mtn"}, 64 | {"file":"motions/Touch Dere3.mtn"}, 65 | {"file":"motions/Touch Dere4.mtn"}, 66 | {"file":"motions/Touch Dere5.mtn"}, 67 | {"file":"motions/Touch Dere6.mtn"}, 68 | {"file":"motions/Touch1.mtn"}, 69 | {"file":"motions/Touch2.mtn"}, 70 | {"file":"motions/Touch3.mtn"}, 71 | {"file":"motions/Touch4.mtn"}, 72 | {"file":"motions/Touch5.mtn"}, 73 | {"file":"motions/Touch6.mtn"}, 74 | {"file":"motions/WakeUp.mtn"} 75 | ] 76 | } 77 | } -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath%20Dere1.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.38,1.37,2.8,4.44,6.14,7.73,9.08,10.12,10.77,11,10.52,9.23,7.36,5.14,2.86,0.64,-1.23,-2.52,-3,-2.94,-2.78,-2.54,-2.24,-1.9,-1.54,-1.19,-0.87,-0.58,-0.34,-0.15,-0.04,0,0,0,0,0,0,0,0,0 9 | PARAM_ANGLE_Y=0,0.02,0.09,0.21,0.4,0.66,0.99,1.39,1.86,2.39,3,3.77,4.55,5.31,6.03,6.66,7.21,7.63,7.9,8,7.84,7.41,6.77,5.96,5.07,4.12,3.18,2.31,1.54,0.89,0.41,0.1,0,0,0,0,0,0,0,0,0 10 | PARAM_ANGLE_Z=0,0.38,1.37,2.8,4.44,6.14,7.73,9.08,10.12,10.77,11,10.14,7.83,4.5,0.54,-3.54,-7.5,-10.83,-13.14,-14,-13.72,-12.97,-11.84,-10.43,-8.87,-7.21,-5.57,-4.05,-2.7,-1.57,-0.71,-0.18,0,0,0,0,0,0,0,0,0 11 | PARAM_EMOTION=-1 12 | PARAM_EYE_L_OPEN=0.55 13 | PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.48,0.37,0.27,0.2,0.17,0.17,0.17,0.17,0.172,0.176,0.182,0.19,0.22,0.28,0.34,0.4,0.46,0.51,0.54,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 14 | PARAM_EYE_L_OPEN2=-1 15 | PARAM_EYE_R_OPEN2=-1 16 | PARAM_EYE_BALL_X=0 17 | PARAM_EYE_BALL_Y=0 18 | PARAM_BROW_L_Y=0 19 | PARAM_BROW_R_Y=0 20 | PARAM_BROW_ANGLE=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2 21 | PARAM_BROW_SELECT=-0.5 22 | PARAM_MOUTH_OPEN_Y=0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.89,0.83,0.75,0.66,0.6,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.59,0.64,0.7,0.77,0.83,0.88,0.91,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92 23 | PARAM_MOUTH_OPEN2=-1 24 | PARAM_MOUTH_EMO=0 25 | PARAM_CHEEK=0 26 | PARAM_BODY_ANGLE_X=0,0.1,0.37,0.76,1.21,1.68,2.11,2.48,2.76,2.94,3,2.76,2.11,1.18,0.07,-1.07,-2.18,-3.11,-3.76,-4,-3.88,-3.56,-3.08,-2.47,-1.8,-1.09,-0.39,0.26,0.84,1.33,1.69,1.92,2,1.87,1.59,1.23,0.87,0.53,0.25,0.07,0 27 | PARAM_BODY_ANGLE_Z=0 28 | PARAM_BODY_Y=0,-0.01,-0.03,-0.07,-0.11,-0.16,-0.2,-0.23,-0.26,-0.274,-0.28,-0.262,-0.21,-0.14,-0.06,0.02,0.1,0.17,0.22,0.24,0.233,0.216,0.19,0.16,0.12,0.08,0.04,0.01,-0.03,-0.05,-0.073,-0.086,-0.09,-0.084,-0.071,-0.055,-0.039,-0.024,-0.011,-0.003,0 29 | PARAM_BREATH=0.5,0.46,0.41,0.35,0.32,0.3,0.34,0.43,0.53,0.65,0.75,0.83,0.89,0.91,0.905,0.891,0.87,0.84,0.81,0.77,0.73,0.69,0.65,0.6,0.56,0.52,0.48,0.45,0.42,0.4,0.384,0.374,0.37,0.379,0.397,0.42,0.44,0.47,0.484,0.496,0.5 30 | PARAM_BOING=0 31 | PARAM_HAIR_FRONT=0,0,0,0,0,0,0,0.03,0.11,0.21,0.3,0.38,0.41,0.37,0.26,0.12,-0.05,-0.22,-0.39,-0.56,-0.69,-0.8,-0.87,-0.9,-0.81,-0.58,-0.27,0.04,0.27,0.36,0.33,0.24,0.13,0.02,-0.07,-0.1,-0.082,-0.05,-0.03,-0.008,0 32 | PARAM_HAIR_SIDE_R=0,-0.005,-0.019,-0.04,-0.07,-0.1,-0.14,-0.18,-0.21,-0.25,-0.29,-0.32,-0.35,-0.37,-0.386,-0.396,-0.4,-0.37,-0.28,-0.15,0.01,0.16,0.32,0.45,0.54,0.57,0.52,0.4,0.26,0.12,-0.02,-0.13,-0.2,-0.23,-0.213,-0.17,-0.12,-0.07,-0.03,-0.01,0 33 | PARAM_HAIR_SIDE_L=0,0.003,0.013,0.028,0.047,0.07,0.09,0.12,0.14,0.17,0.19,0.21,0.234,0.249,0.26,0.268,0.27,0.23,0.14,0,-0.16,-0.33,-0.49,-0.63,-0.72,-0.76,-0.69,-0.53,-0.33,-0.13,0.06,0.21,0.31,0.35,0.32,0.26,0.19,0.11,0.05,0.01,0 34 | PARAM_TWIN_RIBBON_D=0,-0.018,-0.06,-0.13,-0.21,-0.29,-0.37,-0.43,-0.48,-0.51,-0.52,-0.48,-0.38,-0.25,-0.09,0.07,0.23,0.38,0.51,0.61,0.68,0.7,0.66,0.55,0.39,0.2,0,-0.19,-0.35,-0.46,-0.5,-0.483,-0.44,-0.37,-0.3,-0.22,-0.15,-0.09,-0.04,-0.01,0 35 | PARAM_HAIR_BACK=0 36 | PARAM_WING_ANGLE=0 37 | PARAM_WING_DEFORM=0 38 | VISIBLE:PSD=1 39 | VISIBLE:PARTS_01_HAT=1 40 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 41 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 42 | VISIBLE:PARTS_01_HAIR_BACK_001=1 43 | VISIBLE:PARTS_01_FACE_001=1 44 | VISIBLE:PARTS_01_BROW_001=1 45 | VISIBLE:PARTS_01_EMOTION=1 46 | VISIBLE:PARTS_01_EYE_001=1 47 | VISIBLE:PARTS_01_EYE_BALL_001=1 48 | VISIBLE:PARTS_01_NOSE_001=1 49 | VISIBLE:PARTS_01_MOUTH_001=1 50 | VISIBLE:PARTS_01_EAR_001=1 51 | VISIBLE:PARTS_01_BUST=1 52 | VISIBLE:PARTS_01_BODY=1 53 | VISIBLE:PARTS_01_WING=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath%20Dere2.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.35,1.29,2.74,4.53,6.6,8.86,11.27,13.67,16.13,18.44,20.64,22.67,24.45,25.92,27.04,27.75,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27.65,26.71,25.26,23.47,21.4,19.14,16.73,14.33,11.87,9.56,7.36,5.33,3.55,2.08,0.96,0.25,0 9 | PARAM_ANGLE_Y=0,-0.18,-0.65,-1.37,-2.26,-3.3,-4.43,-5.63,-6.84,-8.06,-9.22,-10.32,-11.33,-12.23,-12.96,-13.52,-13.87,-14,-13.995,-13.982,-13.96,-13.93,-13.89,-13.83,-13.77,-13.7,-13.62,-13.53,-13.42,-13.31,-13.19,-13.05,-12.91,-12.75,-12.58,-12.4,-12.2,-12,-11.78,-11.55,-11.31,-11.05,-10.79,-10.5,-10.21,-9.9,-9.57,-9.24,-8.89,-8.52,-8.14,-7.74,-7.33,-6.9,-6.45,-6,-5.45,-4.92,-4.39,-3.88,-3.38,-2.91,-2.45,-2.04,-1.64,-1.28,-0.97,-0.68,-0.45,-0.26,-0.12,-0.03,0 10 | PARAM_ANGLE_Z=0,0.09,0.32,0.68,1.13,1.65,2.21,2.82,3.42,4.03,4.61,5.16,5.67,6.11,6.48,6.76,6.94,7,6.97,6.89,6.77,6.59,6.38,6.13,5.85,5.53,5.18,4.82,4.43,4.01,3.59,3.15,2.69,2.23,1.76,1.3,0.82,0.35,-0.11,-0.57,-1.01,-1.45,-1.87,-2.28,-2.66,-3.03,-3.38,-3.69,-3.98,-4.24,-4.46,-4.65,-4.8,-4.91,-4.98,-5,-4.94,-4.77,-4.51,-4.19,-3.82,-3.42,-2.99,-2.56,-2.12,-1.71,-1.31,-0.95,-0.63,-0.37,-0.17,-0.04,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.4,0.24,0.13,0.09,0.17,0.33,0.41,0.33,0.21,0.12,0.09,0.2,0.39,0.5,0.502,0.504,0.505,0.507,0.508,0.509,0.511,0.512,0.513,0.514,0.515,0.516,0.516,0.517,0.52,0.518,0.52,0.52,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.518,0.517,0.515,0.514,0.512,0.51,0.508,0.507,0.505,0.504,0.503,0.501,0.501,0.5,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.4,0.24,0.13,0.09,0.17,0.33,0.41,0.33,0.21,0.12,0.09,0.2,0.39,0.5,0.502,0.504,0.505,0.507,0.508,0.509,0.511,0.512,0.513,0.514,0.515,0.516,0.516,0.517,0.52,0.518,0.52,0.52,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.518,0.517,0.515,0.514,0.512,0.51,0.508,0.507,0.505,0.504,0.503,0.501,0.501,0.5,0.5 14 | PARAM_EYE_BALL_X=0,0.004,0.016,0.033,0.06,0.08,0.11,0.14,0.17,0.2,0.22,0.25,0.28,0.3,0.315,0.328,0.337,0.34,0.332,0.31,0.28,0.24,0.19,0.15,0.1,0.06,0.02,-0.02,-0.05,-0.08,-0.094,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.099,-0.095,-0.09,-0.084,-0.076,-0.068,-0.06,-0.051,-0.042,-0.034,-0.026,-0.019,-0.013,-0.007,-0.003,-0.001,0 15 | PARAM_EYE_BALL_Y=0,-0.005,-0.019,-0.04,-0.07,-0.1,-0.13,-0.17,-0.21,-0.24,-0.28,-0.31,-0.34,-0.37,-0.39,-0.406,-0.416,-0.42,-0.414,-0.397,-0.37,-0.34,-0.31,-0.27,-0.24,-0.2,-0.17,-0.14,-0.12,-0.097,-0.084,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.079,-0.076,-0.072,-0.067,-0.061,-0.055,-0.048,-0.041,-0.034,-0.027,-0.021,-0.015,-0.01,-0.006,-0.003,-0.001,0 16 | PARAM_BROW_L_Y=0,0,-0.001,-0.003,-0.005,-0.007,-0.01,-0.014,-0.018,-0.022,-0.027,-0.032,-0.038,-0.044,-0.05,-0.056,-0.063,-0.07,-0.077,-0.085,-0.093,-0.1,-0.108,-0.116,-0.124,-0.133,-0.141,-0.149,-0.157,-0.165,-0.174,-0.182,-0.19,-0.197,-0.205,-0.213,-0.22,-0.227,-0.234,-0.241,-0.247,-0.254,-0.259,-0.265,-0.27,-0.275,-0.28,-0.284,-0.287,-0.291,-0.293,-0.296,-0.298,-0.299,-0.3,-0.3,-0.296,-0.286,-0.271,-0.251,-0.23,-0.21,-0.18,-0.15,-0.13,-0.1,-0.08,-0.06,-0.038,-0.022,-0.01,-0.003,0 17 | PARAM_BROW_R_Y=0,0,-0.001,-0.003,-0.005,-0.008,-0.012,-0.016,-0.02,-0.025,-0.031,-0.037,-0.043,-0.05,-0.057,-0.064,-0.072,-0.08,-0.088,-0.096,-0.105,-0.114,-0.123,-0.132,-0.141,-0.15,-0.16,-0.169,-0.178,-0.187,-0.197,-0.206,-0.215,-0.224,-0.232,-0.241,-0.249,-0.257,-0.265,-0.273,-0.28,-0.287,-0.294,-0.3,-0.306,-0.312,-0.317,-0.322,-0.326,-0.329,-0.333,-0.335,-0.337,-0.339,-0.34,-0.34,-0.336,-0.324,-0.307,-0.28,-0.26,-0.23,-0.2,-0.17,-0.14,-0.12,-0.09,-0.06,-0.04,-0.025,-0.012,-0.003,0 18 | PARAM_BROW_L_ANGLE=0,0.001,0.004,0.009,0.016,0.024,0.034,0.046,0.059,0.074,0.09,0.107,0.126,0.146,0.17,0.19,0.21,0.23,0.26,0.28,0.31,0.33,0.36,0.39,0.41,0.44,0.47,0.5,0.52,0.55,0.58,0.61,0.63,0.66,0.68,0.71,0.73,0.76,0.78,0.8,0.82,0.85,0.865,0.883,0.901,0.917,0.932,0.946,0.958,0.969,0.978,0.986,0.992,0.996,0.999,1,0.987,0.95,0.9,0.84,0.76,0.68,0.6,0.51,0.42,0.34,0.26,0.19,0.13,0.07,0.03,0.01,0 19 | PARAM_BROW_R_ANGLE=0,0.001,0.004,0.009,0.016,0.024,0.034,0.046,0.059,0.074,0.09,0.107,0.126,0.146,0.17,0.19,0.21,0.23,0.26,0.28,0.31,0.33,0.36,0.39,0.41,0.44,0.47,0.5,0.52,0.55,0.58,0.61,0.63,0.66,0.68,0.71,0.73,0.76,0.78,0.8,0.82,0.85,0.865,0.883,0.901,0.917,0.932,0.946,0.958,0.969,0.978,0.986,0.992,0.996,0.999,1,0.987,0.95,0.9,0.84,0.76,0.68,0.6,0.51,0.42,0.34,0.26,0.19,0.13,0.07,0.03,0.01,0 20 | PARAM_EAR_DEFORM=0,-0.007,-0.026,-0.05,-0.09,-0.13,-0.18,-0.23,-0.27,-0.32,-0.37,-0.41,-0.45,-0.49,-0.52,-0.54,-0.555,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.553,-0.534,-0.51,-0.47,-0.43,-0.38,-0.33,-0.29,-0.24,-0.19,-0.15,-0.11,-0.07,-0.04,-0.02,-0.005,0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.505,0.518,0.54,0.56,0.59,0.63,0.66,0.7,0.73,0.76,0.79,0.82,0.85,0.87,0.886,0.896,0.9,0.895,0.881,0.86,0.84,0.81,0.78,0.75,0.72,0.69,0.67,0.649,0.634,0.624,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.618,0.614,0.608,0.601,0.592,0.582,0.572,0.561,0.551,0.541,0.532,0.523,0.515,0.509,0.504,0.501,0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0,-0.013,-0.05,-0.1,-0.16,-0.24,-0.32,-0.4,-0.49,-0.58,-0.66,-0.74,-0.81,-0.87,-0.93,-0.97,-0.99,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.987,-0.95,-0.9,-0.84,-0.76,-0.68,-0.6,-0.51,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.505,0.517,0.535,0.56,0.58,0.61,0.64,0.68,0.71,0.74,0.77,0.79,0.81,0.833,0.848,0.857,0.86,0.859,0.855,0.849,0.842,0.832,0.821,0.808,0.794,0.778,0.762,0.744,0.725,0.706,0.687,0.666,0.65,0.62,0.6,0.58,0.56,0.54,0.52,0.499,0.48,0.461,0.443,0.425,0.409,0.393,0.379,0.366,0.354,0.344,0.336,0.329,0.324,0.321,0.32,0.322,0.328,0.338,0.349,0.362,0.377,0.392,0.408,0.424,0.439,0.453,0.466,0.477,0.487,0.494,0.498,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0 29 | PARAM_WING_DEFORM=0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0,0.006,0.023,0.05,0.08,0.13,0.17,0.22,0.28,0.34,0.39,0.45,0.5,0.54,0.59,0.62,0.65,0.664,0.67,0.67,0.67,0.67,0.669,0.668,0.666,0.665,0.663,0.661,0.659,0.656,0.653,0.65,0.646,0.642,0.637,0.632,0.627,0.621,0.614,0.607,0.6,0.592,0.583,0.574,0.565,0.555,0.544,0.533,0.521,0.508,0.495,0.481,0.467,0.452,0.436,0.42,0.4,0.37,0.34,0.31,0.28,0.24,0.21,0.18,0.15,0.12,0.09,0.06,0.04,0.024,0.011,0.003,0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath1.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0 10 | PARAM_ANGLE_Z=0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5 13 | PARAM_EYE_R_OPEN=0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.5,0.502,0.504,0.507,0.511,0.515,0.52,0.525,0.531,0.537,0.543,0.55,0.557,0.564,0.571,0.578,0.585,0.591,0.598,0.605,0.611,0.617,0.622,0.628,0.633,0.637,0.641,0.644,0.647,0.648,0.65,0.65,0.65,0.649,0.647,0.645,0.642,0.639,0.635,0.631,0.627,0.622,0.617,0.611,0.605,0.6,0.594,0.587,0.581,0.575,0.569,0.563,0.556,0.55,0.545,0.539,0.533,0.528,0.523,0.519,0.515,0.511,0.508,0.505,0.503,0.501,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0,0.001,0.003,0.005,0.008,0.011,0.015,0.019,0.023,0.027,0.032,0.037,0.042,0.047,0.052,0.057,0.062,0.067,0.072,0.077,0.081,0.086,0.09,0.094,0.097,0.1,0.103,0.106,0.107,0.109,0.11,0.11,0.11,0.11,0.108,0.106,0.104,0.102,0.099,0.096,0.093,0.089,0.085,0.081,0.077,0.073,0.069,0.064,0.06,0.055,0.05,0.046,0.041,0.037,0.033,0.029,0.025,0.021,0.017,0.014,0.011,0.008,0.006,0.004,0.002,0.001,0,0 29 | PARAM_WING_DEFORM=0,0,0,-0.002,-0.003,-0.005,-0.007,-0.009,-0.012,-0.014,-0.017,-0.02,-0.023,-0.026,-0.03,-0.033,-0.036,-0.039,-0.043,-0.046,-0.049,-0.052,-0.055,-0.057,-0.06,-0.062,-0.064,-0.066,-0.067,-0.068,-0.069,-0.07,-0.07,-0.07,-0.07,-0.069,-0.068,-0.066,-0.065,-0.063,-0.061,-0.059,-0.057,-0.054,-0.052,-0.049,-0.046,-0.044,-0.041,-0.038,-0.035,-0.032,-0.029,-0.026,-0.024,-0.021,-0.018,-0.016,-0.013,-0.011,-0.009,-0.007,-0.005,-0.004,-0.002,-0.001,-0.001,0,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath2.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0 10 | PARAM_ANGLE_Z=0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5 13 | PARAM_EYE_R_OPEN=0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5 22 | PARAM_BODY_ANGLE_X=0,-0.03,-0.1,-0.21,-0.35,-0.51,-0.69,-0.88,-1.07,-1.26,-1.43,-1.59,-1.73,-1.84,-1.93,-1.98,-2,-1.989,-1.96,-1.91,-1.84,-1.75,-1.65,-1.54,-1.41,-1.27,-1.12,-0.96,-0.8,-0.63,-0.45,-0.27,-0.09,0.09,0.27,0.45,0.63,0.8,0.96,1.12,1.27,1.41,1.54,1.65,1.75,1.84,1.91,1.96,1.99,2,1.982,1.93,1.85,1.75,1.63,1.49,1.34,1.18,1.02,0.86,0.71,0.56,0.42,0.3,0.2,0.11,0.05,0.01,0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.5,0.501,0.503,0.505,0.508,0.511,0.515,0.519,0.524,0.529,0.534,0.539,0.545,0.55,0.556,0.562,0.568,0.574,0.58,0.585,0.591,0.596,0.601,0.606,0.611,0.615,0.619,0.622,0.625,0.627,0.629,0.63,0.63,0.63,0.629,0.627,0.625,0.622,0.619,0.615,0.611,0.607,0.603,0.598,0.593,0.588,0.582,0.577,0.571,0.566,0.56,0.555,0.549,0.544,0.539,0.534,0.529,0.525,0.52,0.516,0.513,0.51,0.507,0.504,0.503,0.501,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0,0,0.002,0.004,0.006,0.008,0.01,0.013,0.016,0.02,0.023,0.027,0.031,0.035,0.039,0.043,0.047,0.051,0.055,0.059,0.063,0.067,0.07,0.074,0.077,0.08,0.082,0.084,0.086,0.088,0.089,0.09,0.09,0.09,0.09,0.088,0.086,0.085,0.082,0.08,0.077,0.074,0.071,0.068,0.064,0.061,0.057,0.053,0.049,0.045,0.042,0.038,0.034,0.03,0.027,0.023,0.02,0.017,0.014,0.011,0.009,0.007,0.005,0.003,0.002,0.001,0,0 29 | PARAM_WING_DEFORM=0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath4.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0,0.22,0.81,1.72,2.86,4.13,5.5,6.87,8.14,9.28,10.19,10.78,11,8.31,2.5,-4.73,-12.26,-19.12,-24.81,-28.59,-30,-29.62,-28.55,-26.9,-24.77,-22.31,-19.59,-16.8,-13.95,-11.17,-8.52,-6.14,-4.05,-2.33,-1.07,-0.27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10 | PARAM_ANGLE_Z=0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.52,0.57,0.63,0.69,0.74,0.79,0.82,0.84,0.846,0.849,0.85,0.85,0.85,0.85,0.85,0.838,0.81,0.76,0.7,0.65,0.59,0.54,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.52,0.57,0.63,0.69,0.75,0.8,0.83,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.828,0.8,0.75,0.7,0.64,0.59,0.54,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,-0.03,-0.1,-0.18,-0.26,-0.34,-0.4,-0.44,-0.46,-0.454,-0.438,-0.41,-0.38,-0.34,-0.3,-0.26,-0.21,-0.17,-0.13,-0.09,-0.06,-0.04,-0.016,-0.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.5,0.502,0.505,0.509,0.514,0.52,0.526,0.533,0.541,0.549,0.558,0.567,0.576,0.586,0.595,0.604,0.614,0.623,0.632,0.641,0.649,0.657,0.664,0.67,0.676,0.681,0.685,0.688,0.689,0.69,0.69,0.688,0.686,0.684,0.68,0.676,0.672,0.667,0.661,0.655,0.649,0.643,0.636,0.629,0.622,0.614,0.607,0.6,0.592,0.585,0.577,0.57,0.563,0.556,0.55,0.543,0.537,0.531,0.526,0.521,0.516,0.512,0.509,0.506,0.503,0.501,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0,0.002,0.004,0.007,0.011,0.016,0.021,0.026,0.032,0.039,0.046,0.053,0.06,0.068,0.075,0.082,0.09,0.097,0.104,0.111,0.118,0.124,0.129,0.134,0.139,0.143,0.146,0.148,0.15,0.15,0.15,0.149,0.147,0.145,0.142,0.139,0.136,0.132,0.127,0.123,0.118,0.113,0.107,0.102,0.096,0.09,0.085,0.079,0.073,0.067,0.061,0.055,0.05,0.044,0.039,0.034,0.029,0.025,0.02,0.016,0.013,0.01,0.007,0.004,0.003,0.001,0,0 29 | PARAM_WING_DEFORM=0,0,-0.002,-0.004,-0.006,-0.01,-0.014,-0.018,-0.023,-0.028,-0.034,-0.04,-0.046,-0.052,-0.059,-0.065,-0.071,-0.078,-0.084,-0.09,-0.096,-0.102,-0.107,-0.112,-0.116,-0.12,-0.124,-0.126,-0.128,-0.13,-0.13,-0.13,-0.129,-0.127,-0.126,-0.123,-0.121,-0.118,-0.114,-0.11,-0.106,-0.102,-0.098,-0.093,-0.088,-0.083,-0.078,-0.073,-0.068,-0.063,-0.058,-0.053,-0.048,-0.043,-0.038,-0.034,-0.029,-0.025,-0.021,-0.018,-0.014,-0.011,-0.008,-0.006,-0.004,-0.002,-0.001,0,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath6.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.81,-2.78,-5.18,-7.52,-9.4,-10.6,-11,-10.57,-9.36,-7.46,-5.04,-2.16,0.99,4.31,7.69,11.01,14.16,17.04,19.46,21.36,22.57,23,22.998,22.991,22.979,22.962,22.94,22.91,22.88,22.84,22.79,22.74,22.68,22.61,22.54,22.45,22.37,22.27,22.16,22.04,21.92,21.79,21.64,21.49,21.32,21.15,20.97,20.77,20.57,20.35,20.13,19.88,19.63,19.37,19.09,18.8,18.5,18.19,17.86,17.51,17.16,16.79,16.4,16,15.11,13.43,11.06,8.19,5.09,1.78,-1.5,-4.51,-7.2,-9.33,-10.71,-11.22,-10.86,-9.96,-8.73,-7.3,-5.81,-4.34,-2.95,-1.78,-0.83,-0.22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10 | PARAM_ANGLE_Z=0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.47,0.4,0.31,0.22,0.13,0.06,0.02,0,0.04,0.13,0.25,0.37,0.46,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.03,0.1,0.19,0.28,0.37,0.44,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.47,0.4,0.31,0.22,0.13,0.06,0.02,0,0.04,0.13,0.25,0.37,0.46,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.03,0.1,0.19,0.28,0.37,0.44,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.03,0.07,0.11,0.15,0.19,0.23,0.26,0.29,0.311,0.32,0.324,0.327,0.331,0.334,0.338,0.341,0.344,0.347,0.35,0.352,0.355,0.358,0.36,0.363,0.365,0.367,0.369,0.371,0.373,0.375,0.377,0.379,0.38,0.382,0.383,0.385,0.386,0.387,0.389,0.39,0.391,0.392,0.393,0.393,0.394,0.395,0.4,0.396,0.4,0.397,0.4,0.398,0.4,0.399,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.37,0.3,0.21,0.13,0.06,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.499,0.497,0.494,0.49,0.485,0.479,0.472,0.464,0.456,0.447,0.438,0.429,0.42,0.41,0.401,0.392,0.383,0.374,0.366,0.358,0.351,0.345,0.34,0.336,0.333,0.331,0.33,0.33,0.333,0.336,0.34,0.345,0.352,0.359,0.367,0.376,0.385,0.396,0.406,0.417,0.429,0.441,0.453,0.465,0.478,0.491,0.503,0.516,0.529,0.541,0.554,0.566,0.577,0.589,0.6,0.61,0.62,0.63,0.639,0.647,0.654,0.661,0.666,0.671,0.675,0.678,0.679,0.68,0.68,0.68,0.678,0.677,0.675,0.673,0.671,0.668,0.665,0.662,0.658,0.655,0.651,0.647,0.642,0.638,0.633,0.629,0.624,0.619,0.614,0.608,0.603,0.598,0.593,0.587,0.582,0.577,0.572,0.566,0.561,0.556,0.551,0.547,0.542,0.538,0.533,0.529,0.525,0.522,0.518,0.515,0.512,0.509,0.507,0.505,0.503,0.502,0.501,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0,0,0,0.002,0.003,0.004,0.005,0.007,0.008,0.01,0.012,0.014,0.016,0.019,0.021,0.024,0.027,0.03,0.033,0.036,0.039,0.042,0.045,0.049,0.052,0.055,0.059,0.062,0.066,0.069,0.073,0.076,0.08,0.083,0.087,0.09,0.094,0.097,0.1,0.104,0.107,0.11,0.113,0.116,0.119,0.122,0.125,0.127,0.13,0.132,0.135,0.137,0.139,0.141,0.142,0.144,0.145,0.146,0.148,0.148,0.149,0.15,0.15,0.15,0.15,0.15,0.149,0.148,0.146,0.145,0.143,0.141,0.139,0.136,0.134,0.131,0.128,0.125,0.122,0.118,0.115,0.111,0.108,0.104,0.1,0.096,0.092,0.088,0.084,0.08,0.076,0.071,0.067,0.063,0.059,0.055,0.051,0.047,0.044,0.04,0.036,0.033,0.03,0.026,0.023,0.02,0.018,0.015,0.012,0.01,0.008,0.006,0.005,0.003,0.002,0.001,0.001,0,0 29 | PARAM_WING_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.004,0.005,0.008,0.01,0.013,0.017,0.02,0.024,0.028,0.032,0.037,0.042,0.046,0.052,0.057,0.062,0.067,0.073,0.078,0.084,0.089,0.095,0.1,0.106,0.111,0.117,0.122,0.127,0.132,0.137,0.141,0.146,0.15,0.154,0.158,0.162,0.165,0.168,0.171,0.173,0.175,0.177,0.178,0.179,0.18,0.18,0.18,0.18,0.178,0.177,0.176,0.174,0.172,0.169,0.167,0.164,0.161,0.157,0.154,0.15,0.146,0.142,0.138,0.134,0.129,0.124,0.12,0.115,0.11,0.105,0.1,0.096,0.091,0.086,0.081,0.076,0.071,0.066,0.062,0.057,0.052,0.048,0.044,0.04,0.035,0.032,0.028,0.024,0.021,0.018,0.015,0.012,0.01,0.008,0.006,0.004,0.003,0.001,0.001,0,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Breath7.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0 10 | PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.07,-0.26,-0.57,-0.98,-1.48,-2.06,-2.71,-3.42,-4.18,-4.97,-5.8,-6.65,-7.52,-8.39,-9.26,-10.12,-10.96,-11.78,-12.57,-13.31,-14,-14.65,-15.23,-15.74,-16.17,-16.52,-16.79,-16.95,-17,-17.01,-17.04,-17.07,-17.11,-17.15,-17.18,-17.201,-17.204,-17.186,-17.14,-17.07,-16.96,-16.81,-16.63,-16.39,-16.12,-15.8,-15.42,-15,-14.48,-13.94,-13.35,-12.73,-12.1,-11.43,-10.73,-10.02,-9.28,-8.51,-7.75,-6.95,-6.15,-5.34,-4.51,-3.68,-2.86,-2.01,-1.16,-0.34,0.51,1.35,2.16,2.98,3.8,4.58,5.37,6.14,6.87,7.61,8.32,8.99,9.65,10.28,10.86,11.43,11.97,12.45,12.91,13.33,13.7,14.04,14.33,14.56,14.75,14.89,14.97,15,15.003,15.011,15.02,15.026,15.03,15.016,14.99,14.95,14.89,14.81,14.7,14.56,14.38,14.17,13.92,13.55,13.01,12.31,11.49,10.59,9.59,8.53,7.44,6.34,5.26,4.22,3.24,2.34,1.57,0.92,0.42,0.11,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.04,0.13,0.24,0.34,0.43,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.04,0.13,0.24,0.34,0.43,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,-0.007,-0.027,-0.06,-0.1,-0.16,-0.22,-0.3,-0.38,-0.47,-0.56,-0.67,-0.77,-0.89,-1,-1.12,-1.24,-1.36,-1.48,-1.61,-1.73,-1.85,-1.97,-2.08,-2.19,-2.3,-2.4,-2.49,-2.58,-2.66,-2.74,-2.8,-2.86,-2.91,-2.95,-2.98,-2.994,-3,-2.996,-2.983,-2.96,-2.93,-2.9,-2.85,-2.8,-2.74,-2.68,-2.61,-2.53,-2.45,-2.36,-2.27,-2.18,-2.07,-1.97,-1.86,-1.75,-1.63,-1.51,-1.39,-1.27,-1.14,-1.02,-0.89,-0.76,-0.62,-0.49,-0.36,-0.23,-0.1,0.03,0.16,0.29,0.42,0.55,0.67,0.79,0.91,1.03,1.14,1.25,1.35,1.45,1.55,1.64,1.73,1.81,1.89,1.96,2.02,2.08,2.13,2.17,2.21,2.24,2.26,2.275,2.279,2.275,2.264,2.246,2.22,2.19,2.15,2.11,2.06,2.01,1.95,1.89,1.83,1.76,1.69,1.62,1.54,1.47,1.39,1.31,1.23,1.15,1.07,0.99,0.91,0.83,0.76,0.68,0.61,0.54,0.47,0.41,0.35,0.3,0.24,0.19,0.15,0.11,0.08,0.05,0.03,0.013,0.003,0 25 | PARAM_BREATH=0.5 26 | PARAM_HAIR_SIDE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.007,-0.026,-0.06,-0.09,-0.14,-0.2,-0.26,-0.32,-0.39,-0.46,-0.54,-0.61,-0.68,-0.74,-0.8,-0.86,-0.91,-0.94,-0.97,-0.993,-1,-1,-0.997,-0.993,-0.985,-0.974,-0.959,-0.94,-0.92,-0.88,-0.85,-0.81,-0.78,-0.74,-0.7,-0.66,-0.62,-0.58,-0.54,-0.5,-0.46,-0.42,-0.38,-0.34,-0.31,-0.27,-0.23,-0.2,-0.16,-0.13,-0.1,-0.07,-0.04,-0.01,0.001,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.12,0.17,0.24,0.3,0.36,0.43,0.49,0.54,0.59,0.63,0.66,0.674,0.68,0.677,0.668,0.654,0.634,0.61,0.58,0.55,0.52,0.48,0.44,0.4,0.36,0.32,0.28,0.24,0.21,0.18,0.15,0.13,0.11,0.09,0.073,0.058,0.045,0.034,0.024,0.016,0.01,0.006,0.003,0.001,0 27 | PARAM_HAIR_BACK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.004,-0.015,-0.033,-0.06,-0.09,-0.12,-0.16,-0.2,-0.24,-0.29,-0.33,-0.38,-0.43,-0.48,-0.53,-0.58,-0.63,-0.68,-0.72,-0.77,-0.81,-0.84,-0.88,-0.91,-0.93,-0.953,-0.968,-0.977,-0.98,-0.98,-0.981,-0.981,-0.978,-0.973,-0.964,-0.95,-0.932,-0.91,-0.88,-0.84,-0.79,-0.75,-0.7,-0.65,-0.6,-0.56,-0.51,-0.46,-0.42,-0.37,-0.33,-0.28,-0.24,-0.21,-0.17,-0.14,-0.11,-0.08,-0.06,-0.037,-0.021,-0.01,-0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,0.998,0.994,0.987,0.977,0.962,0.942,0.91,0.88,0.84,0.79,0.73,0.67,0.61,0.55,0.49,0.44,0.38,0.32,0.27,0.22,0.18,0.14,0.1,0.07,0.05,0.03,0.012,0.003,0 28 | PARAM_WING_ANGLE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.007,-0.012,-0.019,-0.026,-0.034,-0.044,-0.054,-0.065,-0.076,-0.088,-0.1,-0.113,-0.125,-0.137,-0.15,-0.162,-0.174,-0.185,-0.196,-0.206,-0.216,-0.224,-0.231,-0.238,-0.243,-0.247,-0.249,-0.25,-0.249,-0.247,-0.244,-0.239,-0.233,-0.226,-0.218,-0.209,-0.2,-0.19,-0.179,-0.168,-0.156,-0.144,-0.131,-0.118,-0.106,-0.093,-0.08,-0.067,-0.054,-0.041,-0.029,-0.017,-0.005,0.006,0.017,0.027,0.036,0.045,0.053,0.06,0.066,0.071,0.075,0.079,0.08,0.081,0.081,0.08,0.078,0.076,0.074,0.07,0.067,0.063,0.059,0.054,0.049,0.044,0.039,0.033,0.028,0.022,0.016,0.01,0.005,-0.001,-0.007,-0.013,-0.018,-0.023,-0.028,-0.033,-0.038,-0.042,-0.046,-0.049,-0.052,-0.055,-0.057,-0.059,-0.061,-0.061,-0.06,-0.06,-0.061,-0.06,-0.058,-0.056,-0.054,-0.051,-0.049,-0.046,-0.043,-0.039,-0.036,-0.033,-0.029,-0.026,-0.022,-0.019,-0.016,-0.013,-0.01,-0.008,-0.006,-0.004,-0.002,-0.001,0,0 29 | PARAM_WING_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.005,0.008,0.013,0.018,0.023,0.03,0.037,0.044,0.052,0.06,0.068,0.077,0.085,0.093,0.102,0.11,0.118,0.126,0.133,0.14,0.147,0.152,0.157,0.162,0.165,0.168,0.169,0.17,0.17,0.168,0.166,0.162,0.158,0.153,0.148,0.142,0.135,0.128,0.121,0.113,0.105,0.096,0.088,0.079,0.07,0.061,0.052,0.043,0.034,0.026,0.017,0.009,0.001,-0.007,-0.015,-0.022,-0.028,-0.034,-0.04,-0.045,-0.049,-0.052,-0.055,-0.057,-0.059,-0.059,-0.059,-0.057,-0.055,-0.052,-0.049,-0.044,-0.04,-0.034,-0.028,-0.022,-0.015,-0.008,0,0.007,0.015,0.023,0.031,0.039,0.047,0.055,0.063,0.071,0.078,0.086,0.093,0.1,0.106,0.112,0.117,0.122,0.126,0.13,0.133,0.136,0.138,0.139,0.14,0.139,0.137,0.135,0.131,0.127,0.122,0.116,0.11,0.103,0.096,0.089,0.081,0.074,0.066,0.058,0.051,0.043,0.036,0.029,0.023,0.018,0.013,0.008,0.005,0.002,0.001,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Sleeping.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10.03,10.13,10.26,10.42,10.58,10.74,10.87,10.97,11,10.79,10.24,9.44,8.49,7.51,6.56,5.76,5.21,5,5.015,5.06,5.13,5.23,5.35,5.49,5.65,5.83,6.04,6.25,6.48,6.73,6.99,7.25,7.53,7.81,8.1,8.4,8.7,9.01,9.31,9.61,9.92,10.22,10.52,10.81,11.1,11.38,11.66,11.92,12.17,12.42,12.65,12.86,13.06,13.25,13.41,13.56,13.69,13.8,13.88,13.95,13.99,14,13.98,13.92,13.83,13.71,13.57,13.41,13.22,13.02,12.82,12.6,12.37,12.14,11.91,11.69,11.47,11.25,11.05,10.85,10.67,10.51,10.36,10.24,10.14,10.06,10.02,10 9 | PARAM_ANGLE_Y=-8,-8.04,-8.15,-8.32,-8.56,-8.86,-9.21,-9.63,-10.09,-10.59,-11.14,-11.73,-12.35,-12.99,-13.68,-14.38,-15.11,-15.85,-16.6,-17.36,-18.13,-18.9,-19.68,-20.45,-21.19,-21.95,-22.69,-23.4,-24.09,-24.77,-25.41,-26.03,-26.61,-27.15,-27.66,-28.12,-28.54,-28.92,-29.24,-29.5,-29.72,-29.87,-29.97,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-28.52,-24.55,-18.81,-12.01,-4.99,1.81,7.55,11.52,13,12.93,12.72,12.38,11.92,11.34,10.66,9.87,9.01,8.05,7.02,5.91,4.73,3.51,2.23,0.91,-0.43,-1.83,-3.26,-4.68,-6.14,-7.59,-9.04,-10.51,-11.95,-13.38,-14.78,-16.16,-17.5,-18.81,-20.07,-21.27,-22.44,-23.54,-24.55,-25.52,-26.41,-27.2,-27.91,-28.52,-29.04,-29.45,-29.75,-29.94,-30,-29.89,-29.58,-29.08,-28.43,-27.65,-26.73,-25.72,-24.63,-23.49,-22.27,-21.05,-19.79,-18.52,-17.28,-16.07,-14.87,-13.75,-12.68,-11.68,-10.79,-9.99,-9.31,-8.76,-8.35,-8.09,-8 10 | PARAM_ANGLE_Z=10,10.005,10.018,10.04,10.07,10.11,10.16,10.22,10.28,10.36,10.44,10.53,10.63,10.74,10.85,10.97,11.1,11.24,11.38,11.54,11.69,11.86,12.03,12.21,12.4,12.59,12.79,12.99,13.2,13.42,13.64,13.87,14.11,14.34,14.59,14.84,15.09,15.35,15.61,15.88,16.16,16.43,16.71,17,17.27,17.49,17.66,17.79,17.88,17.94,17.98,17.995,18,17.52,16.23,14.36,12.14,9.86,7.64,5.77,4.48,4,4.02,4.08,4.19,4.33,4.5,4.71,4.95,5.21,5.5,5.81,6.14,6.5,6.87,7.26,7.66,8.06,8.48,8.91,9.34,9.79,10.22,10.66,11.11,11.54,11.97,12.4,12.82,13.22,13.62,14,14.36,14.71,15.05,15.35,15.65,15.91,16.15,16.37,16.55,16.71,16.83,16.93,16.98,17,16.96,16.86,16.71,16.5,16.25,15.96,15.64,15.29,14.93,14.54,14.15,13.75,13.35,12.95,12.57,12.19,11.83,11.49,11.17,10.89,10.63,10.42,10.24,10.11,10.03,10 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06 13 | PARAM_EYE_R_OPEN=0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0 16 | PARAM_BROW_L_Y=-1 17 | PARAM_BROW_R_Y=-1 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.789,0.79,0.79,0.788,0.79,0.79,0.787,0.79,0.786,0.79,0.785,0.78,0.784,0.78,0.783,0.78,0.782,0.781,0.78,0.78,0.78,0.779,0.78,0.777,0.777,0.78,0.776,0.78,0.775,0.77,0.774,0.77,0.773,0.77,0.77,0.772,0.77,0.77,0.771,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.773,0.783,0.796,0.812,0.828,0.844,0.857,0.867,0.87,0.87,0.87,0.87,0.869,0.867,0.864,0.86,0.84,0.79,0.74,0.69,0.64,0.62,0.61,0.619,0.639,0.66,0.69,0.71,0.732,0.745,0.75,0.742,0.722,0.7,0.67,0.656,0.644,0.64,0.642,0.647,0.656,0.666,0.679,0.693,0.708,0.722,0.737,0.751,0.764,0.774,0.783,0.788,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.5,0.5,0.5,0.498,0.498,0.497,0.495,0.494,0.492,0.49,0.488,0.486,0.483,0.48,0.477,0.474,0.47,0.466,0.462,0.458,0.454,0.449,0.444,0.439,0.433,0.427,0.422,0.415,0.409,0.402,0.395,0.388,0.38,0.372,0.364,0.356,0.347,0.338,0.329,0.32,0.31,0.3,0.29,0.278,0.264,0.25,0.235,0.221,0.209,0.199,0.192,0.19,0.19,0.191,0.193,0.195,0.198,0.202,0.206,0.21,0.215,0.22,0.226,0.232,0.239,0.246,0.253,0.26,0.268,0.276,0.284,0.292,0.301,0.309,0.318,0.326,0.335,0.344,0.353,0.361,0.37,0.379,0.387,0.395,0.404,0.412,0.419,0.427,0.434,0.441,0.448,0.455,0.461,0.467,0.472,0.477,0.482,0.486,0.489,0.492,0.495,0.497,0.499,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0 29 | PARAM_WING_DEFORM=0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Success.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0 9 | PARAM_ANGLE_Y=0,0.95,3.27,6.37,9.5,11.91,13,13.17,13.31,13.44,13.56,13.65,13.73,13.8,13.85,13.9,13.93,13.96,13.974,13.987,13.995,13.999,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,12.97,10.47,7.41,4.43,2.04,0.51,0 10 | PARAM_ANGLE_Z=0,1.78,6.1,11.86,17.66,22.07,24,24.19,24.36,24.54,24.7,24.85,25,25.14,25.28,25.41,25.53,25.65,25.76,25.87,25.96,26.06,26.15,26.23,26.31,26.38,26.45,26.52,26.58,26.63,26.68,26.73,26.77,26.81,26.84,26.87,26.9,26.93,26.946,26.963,26.976,26.987,26.994,26.999,27,25.01,20.19,14.29,8.54,3.93,0.99,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.52,0.58,0.66,0.74,0.8,0.83,0.831,0.832,0.834,0.835,0.836,0.837,0.838,0.839,0.839,0.84,0.841,0.84,0.843,0.843,0.84,0.844,0.84,0.845,0.85,0.846,0.85,0.847,0.85,0.85,0.848,0.85,0.85,0.85,0.849,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.82,0.76,0.69,0.61,0.55,0.51,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.52,0.58,0.66,0.74,0.8,0.83,0.832,0.834,0.835,0.837,0.839,0.84,0.842,0.843,0.844,0.845,0.847,0.848,0.849,0.85,0.851,0.852,0.852,0.853,0.85,0.855,0.855,0.86,0.856,0.86,0.857,0.86,0.858,0.86,0.86,0.859,0.86,0.86,0.86,0.86,0.86,0.86,0.86,0.86,0.83,0.77,0.69,0.61,0.55,0.51,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0,-0.08,-0.26,-0.5,-0.74,-0.92,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.93,-0.75,-0.53,-0.32,-0.15,-0.04,0 16 | PARAM_BROW_L_Y=0,-0.04,-0.15,-0.29,-0.43,-0.54,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.579,-0.58,-0.578,-0.58,-0.577,-0.576,-0.58,-0.574,-0.573,-0.572,-0.571,-0.57,-0.569,-0.567,-0.566,-0.564,-0.562,-0.561,-0.559,-0.557,-0.554,-0.552,-0.55,-0.547,-0.545,-0.542,-0.539,-0.537,-0.533,-0.53,-0.527,-0.524,-0.52,-0.48,-0.38,-0.27,-0.16,-0.07,-0.02,0 17 | PARAM_BROW_R_Y=0,-0.06,-0.21,-0.4,-0.59,-0.74,-0.8,-0.8,-0.8,-0.8,-0.8,-0.799,-0.798,-0.8,-0.796,-0.795,-0.794,-0.793,-0.791,-0.79,-0.788,-0.786,-0.784,-0.781,-0.779,-0.776,-0.774,-0.771,-0.768,-0.764,-0.761,-0.757,-0.753,-0.749,-0.745,-0.74,-0.736,-0.731,-0.726,-0.72,-0.715,-0.709,-0.703,-0.696,-0.69,-0.63,-0.51,-0.36,-0.21,-0.1,-0.02,0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.46,0.37,0.25,0.13,0.04,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0.002,0,0,0.003,0,0.004,0,0.005,0.01,0.006,0.007,0.01,0.008,0.009,0.01,0.01,0.012,0.013,0.014,0.014,0.016,0.017,0.018,0.019,0.02,0.06,0.14,0.25,0.35,0.43,0.48,0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0,-0.014,-0.05,-0.11,-0.19,-0.28,-0.39,-0.5,-0.61,-0.72,-0.82,-0.92,-1,-1.08,-1.15,-1.22,-1.29,-1.35,-1.41,-1.46,-1.51,-1.56,-1.6,-1.65,-1.68,-1.72,-1.75,-1.78,-1.81,-1.84,-1.86,-1.88,-1.901,-1.919,-1.934,-1.948,-1.959,-1.969,-1.978,-1.985,-1.991,-1.995,-1.998,-1.999,-2,-1.85,-1.5,-1.06,-0.63,-0.29,-0.07,0 25 | PARAM_BREATH=0.5,0.498,0.491,0.481,0.469,0.455,0.44,0.425,0.411,0.399,0.389,0.382,0.38,0.381,0.385,0.392,0.401,0.411,0.424,0.438,0.452,0.469,0.485,0.502,0.52,0.538,0.555,0.571,0.588,0.602,0.616,0.629,0.639,0.648,0.655,0.659,0.66,0.658,0.652,0.643,0.632,0.618,0.604,0.588,0.572,0.556,0.542,0.528,0.517,0.508,0.502,0.5 26 | PARAM_HAIR_SIDE=0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,0.75,0.34,-0.04,-0.31,-0.42,-0.23,0.08,0.3,0.37,0.3,0.2,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 27 | PARAM_HAIR_BACK=0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,0.91,0.77,0.63,0.54,0.5,0.62,0.82,0.96,1,1,1,1,1,1,1,1,1,0.995,0.981,0.96,0.93,0.89,0.85,0.81,0.76,0.7,0.65,0.59,0.54,0.48,0.42,0.37,0.31,0.26,0.21,0.17,0.13,0.09,0.06,0.03,0.016,0.004,0 28 | PARAM_WING_ANGLE=0,0.02,0.07,0.15,0.22,0.27,0.29,0.286,0.276,0.26,0.24,0.22,0.19,0.16,0.13,0.11,0.08,0.06,0.039,0.023,0.01,0.003,0,0.04,0.12,0.16,0.12,0.04,0,0.03,0.1,0.13,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 29 | PARAM_WING_DEFORM=0,0.03,0.11,0.21,0.3,0.38,0.41,0.405,0.39,0.37,0.34,0.3,0.27,0.23,0.19,0.15,0.12,0.08,0.06,0.03,0.015,0.004,0,0.04,0.12,0.16,0.12,0.04,0,0.04,0.13,0.17,0.13,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0,0.03,0.1,0.2,0.29,0.36,0.39,0.39,0.39,0.39,0.389,0.388,0.387,0.385,0.384,0.381,0.379,0.376,0.373,0.369,0.365,0.36,0.355,0.35,0.343,0.337,0.33,0.322,0.313,0.304,0.295,0.284,0.274,0.262,0.25,0.234,0.216,0.197,0.178,0.158,0.138,0.118,0.099,0.081,0.064,0.049,0.035,0.023,0.013,0.006,0.002,0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Sukebei1.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,-0.53,-1.47,-2,-1.93,-1.75,-1.49,-1.19,-0.88,-0.59,-0.35,-0.16,-0.04,0,0,0,0,0,0,0,0,0.18,0.7,1.48,2.49,3.68,5.03,6.47,7.97,9.52,11.08,12.61,14.09,15.51,16.8,17.99,19.01,19.84,20.46,20.86,21,21,21,21,21,21,21,21,21,21,21,21,21,20.28,18.34,15.54,12.22,8.78,5.46,2.66,0.72,0 9 | PARAM_ANGLE_Y=0,4.73,13.27,18,16.35,12.02,5.76,-1.39,-8.81,-15.73,-21.64,-26.15,-29,-30,-28.01,-23.19,-17.29,-11.54,-6.93,-3.99,-3,-3.23,-3.9,-4.9,-6.2,-7.73,-9.47,-11.32,-13.25,-15.24,-17.25,-19.21,-21.12,-22.94,-24.6,-26.13,-27.44,-28.51,-29.31,-29.82,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-28.97,-26.2,-22.2,-17.45,-12.55,-7.8,-3.8,-1.03,0 10 | PARAM_ANGLE_Z=0,0.006,0.023,0.05,0.09,0.13,0.19,0.25,0.33,0.4,0.49,0.58,0.68,0.77,0.88,0.98,1.09,1.2,1.32,1.43,1.54,1.66,1.77,1.88,1.98,2.09,2.19,2.29,2.39,2.47,2.56,2.64,2.71,2.77,2.83,2.88,2.92,2.96,2.98,2.995,3,3,3,3,3,3,3,3,3,3,3,3,3,2.9,2.62,2.22,1.75,1.25,0.78,0.38,0.1,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.56,0.65,0.73,0.8,0.82,0.82,0.82,0.821,0.82,0.818,0.815,0.81,0.794,0.77,0.73,0.69,0.65,0.61,0.58,0.55,0.52,0.506,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.56,0.65,0.73,0.8,0.82,0.82,0.82,0.821,0.82,0.818,0.815,0.81,0.794,0.77,0.73,0.69,0.65,0.61,0.58,0.55,0.52,0.506,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 14 | PARAM_EYE_BALL_X=0,0.003,0.007,0.01,0.01,0.01,0.01,0.01,0.009,0.01,0.008,0.007,0.006,0.005,0.003,0.002,0,-0.002,-0.004,-0.006,-0.009,-0.011,-0.014,-0.017,-0.02,-0.024,-0.028,-0.032,-0.036,-0.04,-0.045,-0.05,-0.059,-0.073,-0.091,-0.111,-0.131,-0.15,-0.165,-0.176,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.174,-0.157,-0.13,-0.1,-0.08,-0.05,-0.02,-0.006,0 15 | PARAM_EYE_BALL_Y=0,-0.09,-0.24,-0.33,-0.328,-0.324,-0.317,-0.307,-0.295,-0.281,-0.264,-0.246,-0.226,-0.2,-0.18,-0.16,-0.13,-0.11,-0.08,-0.05,-0.03,0,0.03,0.06,0.08,0.11,0.13,0.16,0.18,0.21,0.23,0.25,0.269,0.282,0.29,0.294,0.295,0.29,0.293,0.291,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.28,0.25,0.21,0.17,0.12,0.08,0.04,0.01,0 16 | PARAM_BROW_L_Y=0,0,0,0,0,0,0,0,0,-0.12,-0.32,-0.5,-0.63,-0.68,-0.68,-0.677,-0.675,-0.673,-0.671,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.65,-0.59,-0.5,-0.39,-0.28,-0.17,-0.08,-0.02,0 17 | PARAM_BROW_R_Y=0,0,0,0,0,0,0,0,0,-0.12,-0.32,-0.51,-0.64,-0.69,-0.689,-0.685,-0.681,-0.676,-0.673,-0.671,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.65,-0.59,-0.5,-0.39,-0.28,-0.17,-0.08,-0.02,0 18 | PARAM_BROW_L_ANGLE=0,-0.16,-0.42,-0.6,-0.66,-0.61,-0.49,-0.3,-0.09,0.14,0.35,0.54,0.66,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.69,0.62,0.53,0.41,0.3,0.18,0.09,0.02,0 19 | PARAM_BROW_R_ANGLE=0,-0.16,-0.43,-0.61,-0.67,-0.62,-0.5,-0.31,-0.1,0.13,0.34,0.53,0.65,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.68,0.61,0.52,0.41,0.29,0.18,0.09,0.02,0 20 | PARAM_EAR_DEFORM=0,0.08,0.22,0.34,0.43,0.47,0.468,0.46,0.448,0.432,0.41,0.39,0.36,0.32,0.29,0.25,0.2,0.16,0.11,0.06,0,-0.06,-0.11,-0.16,-0.21,-0.26,-0.31,-0.36,-0.41,-0.46,-0.51,-0.56,-0.61,-0.67,-0.72,-0.78,-0.86,-0.92,-0.96,-0.99,-1,-0.997,-0.988,-0.972,-0.95,-0.92,-0.88,-0.84,-0.78,-0.72,-0.65,-0.57,-0.48,-0.39,-0.31,-0.23,-0.16,-0.11,-0.06,-0.03,-0.01,0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.61,0.8,0.91,0.91,0.91,0.908,0.905,0.9,0.87,0.83,0.79,0.76,0.75,0.75,0.751,0.753,0.755,0.758,0.761,0.765,0.769,0.773,0.778,0.783,0.788,0.792,0.798,0.802,0.807,0.812,0.817,0.821,0.825,0.829,0.832,0.835,0.837,0.839,0.84,0.84,0.84,0.84,0.838,0.836,0.833,0.828,0.821,0.812,0.801,0.787,0.77,0.75,0.72,0.69,0.66,0.62,0.58,0.55,0.52,0.506,0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0,0.97,2.56,3.65,4,3.79,3.24,2.44,1.49,0.51,-0.44,-1.24,-1.79,-2,-1.85,-1.5,-1.06,-0.63,-0.29,-0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.6,0.77,0.89,0.93,0.915,0.88,0.82,0.75,0.68,0.61,0.55,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0.15,0.38,0.55,0.6,0.588,0.55,0.5,0.43,0.35,0.27,0.18,0.09,0,-0.09,-0.16,-0.23,-0.29,-0.33,-0.35,-0.36,-0.353,-0.334,-0.3,-0.27,-0.22,-0.17,-0.12,-0.07,-0.02,0.03,0.08,0.11,0.14,0.163,0.17,0.17,0.167,0.163,0.158,0.152,0.145,0.137,0.129,0.12,0.11,0.101,0.091,0.081,0.072,0.062,0.053,0.044,0.036,0.028,0.022,0.015,0.01,0.006,0.003,0.001,0 29 | PARAM_WING_DEFORM=0,-0.24,-0.64,-0.91,-1,-0.995,-0.979,-0.95,-0.92,-0.88,-0.83,-0.77,-0.71,-0.65,-0.58,-0.5,-0.43,-0.35,-0.27,-0.19,-0.11,-0.03,0.05,0.12,0.19,0.26,0.33,0.39,0.44,0.49,0.54,0.57,0.6,0.62,0.636,0.64,0.637,0.628,0.613,0.594,0.57,0.54,0.52,0.48,0.45,0.42,0.38,0.34,0.31,0.27,0.23,0.2,0.17,0.14,0.11,0.08,0.06,0.038,0.022,0.01,0.003,0 30 | PARAM_RIBBON_DEFORM=0,0.07,0.18,0.29,0.36,0.39,0.36,0.29,0.18,0.06,-0.06,-0.18,-0.28,-0.36,-0.4,-0.42,-0.38,-0.29,-0.18,-0.06,0.04,0.13,0.19,0.21,0.195,0.16,0.11,0.07,0.03,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31 | PARAM_BLUSH=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.007,0.028,0.06,0.1,0.15,0.2,0.26,0.32,0.38,0.43,0.48,0.52,0.55,0.573,0.58,0.58,0.58,0.579,0.577,0.576,0.574,0.571,0.567,0.563,0.558,0.553,0.546,0.539,0.531,0.521,0.511,0.5,0.488,0.475,0.461,0.446,0.43,0.4,0.35,0.29,0.23,0.16,0.1,0.05,0.01,0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Touch%20Dere3.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.18,0.68,1.45,2.44,3.59,4.86,6.16,7.49,8.79,10.03,11.13,12.11,12.91,13.5,13.87,14,14,13.998,13.996,13.994,13.99,13.985,13.978,13.971,13.962,13.952,13.941,13.928,13.913,13.897,13.879,13.859,13.84,13.81,13.79,13.76,13.73,13.7,13.66,13.63,13.59,13.55,13.51,13.46,13.41,13.36,13.3,13.25,13.19,13.12,13.06,12.99,12.92,12.84,12.76,12.68,12.59,12.5,12.41,12.31,12.21,12.11,12,11.74,11.26,10.59,9.79,8.89,7.92,6.91,5.9,4.88,3.92,3.01,2.18,1.45,0.85,0.39,0.1,0 9 | PARAM_ANGLE_Y=0,0.14,0.53,1.14,1.92,2.82,3.82,4.84,5.89,6.9,7.88,8.75,9.52,10.15,10.61,10.9,11,10.983,10.93,10.85,10.74,10.59,10.43,10.23,10.02,9.78,9.52,9.25,8.95,8.64,8.32,7.99,7.65,7.29,6.93,6.56,6.19,5.81,5.43,5.04,4.67,4.29,3.92,3.54,3.17,2.81,2.46,2.12,1.79,1.47,1.17,0.88,0.61,0.35,0.11,-0.11,-0.31,-0.48,-0.64,-0.76,-0.87,-0.94,-0.98,-1,-0.987,-0.95,-0.9,-0.84,-0.76,-0.68,-0.6,-0.51,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 10 | PARAM_ANGLE_Z=0,0.25,0.95,2.04,3.44,5.08,6.89,8.77,10.7,12.59,14.43,16.1,17.61,18.89,19.89,20.61,21,21.25,21.47,21.68,21.87,22.03,22.18,22.32,22.43,22.54,22.63,22.71,22.77,22.83,22.87,22.91,22.94,22.96,22.977,22.988,22.995,22.999,23,23,23,22.8,22.23,21.33,20.19,18.79,17.22,15.5,13.66,11.72,9.76,7.75,5.76,3.81,1.89,0.1,-1.58,-3.12,-4.5,-5.7,-6.67,-7.39,-7.84,-8,-7.9,-7.63,-7.22,-6.71,-6.11,-5.47,-4.78,-4.09,-3.39,-2.73,-2.1,-1.52,-1.01,-0.59,-0.28,-0.07,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.511,0.54,0.59,0.64,0.69,0.74,0.79,0.82,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.829,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.828,0.83,0.83,0.83,0.83,0.83,0.827,0.83,0.83,0.83,0.83,0.826,0.83,0.83,0.83,0.825,0.82,0.82,0.82,0.824,0.82,0.82,0.823,0.82,0.82,0.822,0.82,0.82,0.821,0.82,0.82,0.809,0.78,0.75,0.71,0.67,0.62,0.58,0.55,0.52,0.506,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.511,0.54,0.59,0.64,0.69,0.74,0.79,0.82,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.829,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.828,0.83,0.83,0.83,0.83,0.83,0.827,0.83,0.83,0.83,0.83,0.826,0.83,0.83,0.83,0.825,0.82,0.82,0.82,0.824,0.82,0.82,0.823,0.82,0.82,0.822,0.82,0.82,0.821,0.82,0.82,0.809,0.78,0.75,0.71,0.67,0.62,0.58,0.55,0.52,0.506,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0,-0.02,-0.07,-0.15,-0.24,-0.34,-0.43,-0.51,-0.56,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.561,-0.51,-0.45,-0.38,-0.3,-0.22,-0.15,-0.09,-0.04,-0.01,0 16 | PARAM_BROW_L_Y=0 17 | PARAM_BROW_R_Y=0 18 | PARAM_BROW_L_ANGLE=0 19 | PARAM_BROW_R_ANGLE=0 20 | PARAM_EAR_DEFORM=0,-0.01,-0.04,-0.08,-0.13,-0.18,-0.24,-0.3,-0.35,-0.41,-0.45,-0.49,-0.52,-0.543,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.549,-0.55,-0.55,-0.548,-0.55,-0.546,-0.546,-0.55,-0.544,-0.543,-0.542,-0.541,-0.54,-0.539,-0.538,-0.536,-0.535,-0.533,-0.532,-0.53,-0.528,-0.526,-0.524,-0.521,-0.519,-0.517,-0.514,-0.511,-0.509,-0.506,-0.503,-0.499,-0.496,-0.493,-0.489,-0.485,-0.481,-0.477,-0.473,-0.469,-0.465,-0.46,-0.449,-0.431,-0.4,-0.37,-0.34,-0.3,-0.26,-0.22,-0.19,-0.15,-0.11,-0.08,-0.06,-0.03,-0.015,-0.004,0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.488,0.45,0.41,0.35,0.29,0.23,0.19,0.15,0.14,0.141,0.143,0.147,0.152,0.158,0.166,0.175,0.184,0.194,0.205,0.217,0.23,0.242,0.256,0.269,0.283,0.297,0.311,0.325,0.339,0.353,0.367,0.38,0.393,0.406,0.418,0.43,0.441,0.451,0.461,0.469,0.477,0.484,0.489,0.494,0.497,0.499,0.5,0.496,0.485,0.467,0.44,0.42,0.39,0.36,0.33,0.3,0.27,0.25,0.22,0.205,0.191,0.183,0.18,0.184,0.195,0.211,0.232,0.26,0.28,0.31,0.34,0.36,0.39,0.42,0.44,0.459,0.476,0.489,0.497,0.5 22 | PARAM_BODY_ANGLE_X=0,-0.03,-0.1,-0.21,-0.35,-0.51,-0.69,-0.88,-1.07,-1.26,-1.43,-1.59,-1.73,-1.84,-1.93,-1.98,-2,-1.999,-1.994,-1.987,-1.977,-1.964,-1.949,-1.931,-1.911,-1.89,-1.86,-1.84,-1.81,-1.78,-1.75,-1.71,-1.68,-1.64,-1.6,-1.56,-1.52,-1.48,-1.44,-1.4,-1.35,-1.31,-1.26,-1.22,-1.17,-1.12,-1.08,-1.03,-0.98,-0.94,-0.89,-0.84,-0.8,-0.75,-0.71,-0.66,-0.62,-0.57,-0.53,-0.49,-0.45,-0.41,-0.37,-0.34,-0.3,-0.27,-0.24,-0.21,-0.18,-0.15,-0.13,-0.1,-0.08,-0.063,-0.047,-0.033,-0.021,-0.012,-0.005,-0.001,0 23 | PARAM_BODY_ANGLE_Y=0 24 | PARAM_BODY_ANGLE_Z=0 25 | PARAM_BREATH=0.5,0.499,0.497,0.492,0.487,0.48,0.473,0.464,0.454,0.444,0.433,0.423,0.411,0.4,0.389,0.377,0.366,0.356,0.346,0.337,0.328,0.321,0.314,0.308,0.303,0.3,0.297,0.295,0.293,0.292,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.292,0.297,0.305,0.315,0.328,0.342,0.358,0.374,0.392,0.41,0.428,0.446,0.463,0.481,0.497,0.512,0.526,0.538,0.549,0.558,0.565,0.569,0.57,0.569,0.567,0.563,0.559,0.553,0.548,0.542,0.536,0.53,0.524,0.518,0.513,0.509,0.505,0.502,0.501,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,-0.002,-0.009,-0.02,-0.034,-0.05,-0.069,-0.09,-0.11,-0.13,-0.15,-0.17,-0.194,-0.213,-0.229,-0.243,-0.255,-0.263,-0.268,-0.27,-0.269,-0.268,-0.265,-0.261,-0.256,-0.251,-0.245,-0.238,-0.23,-0.221,-0.212,-0.203,-0.193,-0.182,-0.172,-0.161,-0.149,-0.138,-0.126,-0.114,-0.102,-0.091,-0.079,-0.067,-0.055,-0.044,-0.033,-0.022,-0.011,-0.001,0.009,0.018,0.027,0.036,0.044,0.051,0.057,0.063,0.068,0.072,0.076,0.078,0.079,0.08,0.079,0.076,0.072,0.067,0.061,0.055,0.048,0.041,0.034,0.027,0.021,0.015,0.01,0.006,0.003,0.001,0 29 | PARAM_WING_DEFORM=0,-0.004,-0.017,-0.036,-0.06,-0.09,-0.13,-0.16,-0.2,-0.24,-0.28,-0.32,-0.35,-0.39,-0.42,-0.44,-0.462,-0.477,-0.487,-0.49,-0.489,-0.486,-0.481,-0.474,-0.465,-0.455,-0.443,-0.43,-0.415,-0.4,-0.383,-0.365,-0.347,-0.327,-0.307,-0.287,-0.27,-0.24,-0.22,-0.2,-0.18,-0.16,-0.13,-0.11,-0.09,-0.07,-0.05,-0.03,-0.009,0.01,0.028,0.046,0.062,0.078,0.092,0.106,0.118,0.128,0.138,0.146,0.152,0.156,0.159,0.16,0.158,0.153,0.144,0.134,0.122,0.109,0.096,0.082,0.068,0.055,0.042,0.03,0.02,0.012,0.006,0.001,0 30 | PARAM_RIBBON_DEFORM=0 31 | PARAM_BLUSH=0,0.004,0.016,0.034,0.06,0.09,0.12,0.15,0.19,0.23,0.26,0.3,0.33,0.36,0.39,0.41,0.434,0.448,0.457,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.459,0.46,0.46,0.46,0.46,0.458,0.46,0.46,0.457,0.46,0.456,0.46,0.46,0.454,0.454,0.45,0.453,0.45,0.451,0.451,0.45,0.45,0.448,0.447,0.446,0.446,0.445,0.443,0.442,0.441,0.44,0.433,0.418,0.39,0.37,0.33,0.3,0.26,0.22,0.18,0.15,0.11,0.08,0.05,0.03,0.015,0.004,0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Touch%20Dere5.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,1.97,6.22,11.51,17.02,22.04,26.2,28.97,30,30,30,30,30,30,30,30,30,30,30,29.96,29.73,29.21,28.33,27.05,25.41,23.45,20.66,17.93,15.17,12.48,9.99,7.62,5.48,3.66,2.12,0.97,0.26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9 | PARAM_ANGLE_Y=0,0.92,2.9,5.37,7.94,10.29,12.23,13.52,14,13.97,13.89,13.75,13.55,13.27,12.93,12.54,12.08,11.57,11,10.08,9.01,7.93,6.86,5.87,4.98,4.22,3.35,2.59,1.88,1.26,0.72,0.26,-0.14,-0.45,-0.69,-0.87,-0.97,-1,-0.993,-0.975,-0.94,-0.91,-0.86,-0.8,-0.74,-0.68,-0.61,-0.54,-0.47,-0.41,-0.34,-0.28,-0.22,-0.17,-0.12,-0.08,-0.04,-0.02,-0.005,0 10 | PARAM_ANGLE_Z=0,-0.59,-1.86,-3.45,-5.1,-6.61,-7.86,-8.69,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-8.7,-7.9,-6.66,-5.1,-3.37,-1.5,0.37,2.1,3.66,4.9,5.7,6,5.96,5.85,5.67,5.43,5.15,4.82,4.45,4.08,3.67,3.26,2.84,2.44,2.04,1.66,1.31,0.99,0.71,0.46,0.27,0.12,0.03,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.39,0.22,0.1,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.067,0.087,0.12,0.16,0.2,0.25,0.29,0.33,0.37,0.4,0.423,0.43,0.43,0.43,0.429,0.428,0.426,0.424,0.422,0.419,0.416,0.412,0.407,0.402,0.396,0.39,0.31,0.19,0.11,0.08,0.18,0.35,0.46,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.39,0.22,0.1,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.067,0.087,0.12,0.16,0.2,0.25,0.29,0.33,0.37,0.4,0.423,0.43,0.43,0.43,0.429,0.428,0.426,0.424,0.422,0.419,0.416,0.412,0.407,0.402,0.396,0.39,0.31,0.19,0.11,0.08,0.18,0.35,0.46,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0 16 | PARAM_BROW_L_Y=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-0.999,-0.998,-0.995,-0.991,-0.987,-0.983,-0.978,-0.972,-0.966,-0.961,-0.955,-0.948,-0.942,-0.937,-0.931,-0.925,-0.92,-0.915,-0.911,-0.908,-0.905,-0.903,-0.902,-0.901,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.74,-0.48,-0.24,-0.07,0 17 | PARAM_BROW_R_Y=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-0.998,-0.996,-0.994,-0.991,-0.988,-0.984,-0.979,-0.975,-0.97,-0.965,-0.959,-0.954,-0.948,-0.942,-0.936,-0.93,-0.924,-0.919,-0.914,-0.911,-0.908,-0.905,-0.903,-0.902,-0.901,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.74,-0.48,-0.24,-0.07,0 18 | PARAM_BROW_L_ANGLE=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-0.996,-0.995,-0.993,-0.992,-0.99,-0.97,-0.91,-0.83,-0.73,-0.62,-0.49,-0.37,-0.26,-0.15,-0.07,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 19 | PARAM_BROW_R_ANGLE=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-0.996,-0.995,-0.993,-0.992,-0.99,-0.97,-0.91,-0.83,-0.73,-0.62,-0.49,-0.37,-0.26,-0.15,-0.07,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 20 | PARAM_EAR_DEFORM=0,0.04,0.13,0.24,0.35,0.44,0.49,0.51,0.509,0.505,0.499,0.49,0.479,0.464,0.446,0.42,0.4,0.37,0.34,0.3,0.26,0.22,0.17,0.12,0.06,0,-0.06,-0.13,-0.19,-0.24,-0.29,-0.34,-0.38,-0.42,-0.45,-0.47,-0.485,-0.49,-0.487,-0.478,-0.463,-0.443,-0.42,-0.39,-0.36,-0.33,-0.3,-0.27,-0.23,-0.2,-0.17,-0.14,-0.11,-0.08,-0.06,-0.038,-0.022,-0.01,-0.003,0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.53,0.6,0.68,0.77,0.85,0.91,0.95,0.97,0.91,0.81,0.74,0.72,0.732,0.76,0.8,0.84,0.87,0.88,0.877,0.867,0.852,0.832,0.81,0.78,0.75,0.71,0.68,0.64,0.61,0.59,0.57,0.545,0.529,0.517,0.507,0.502,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 22 | PARAM_BODY_ANGLE_X=0,0.03,0.11,0.22,0.35,0.48,0.61,0.74,0.84,0.93,0.98,1,0.994,0.979,0.95,0.92,0.89,0.84,0.79,0.74,0.69,0.63,0.57,0.5,0.43,0.37,0.3,0.24,0.18,0.14,0.1,0.07,0.05,0.029,0.016,0.007,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 23 | PARAM_BODY_ANGLE_Y=0,0.13,0.45,0.89,1.4,1.93,2.45,2.95,3.37,3.7,3.92,4,3.98,3.92,3.82,3.69,3.54,3.37,3.18,2.97,2.75,2.51,2.26,2.01,1.74,1.47,1.19,0.95,0.74,0.56,0.41,0.29,0.19,0.12,0.06,0.03,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 24 | PARAM_BODY_ANGLE_Z=0,-0.46,-1.45,-2.69,-3.97,-5.14,-6.11,-6.76,-7,-7,-7,-7,-7,-7,-7,-6.94,-6.79,-6.56,-6.26,-5.92,-5.53,-5.1,-4.64,-4.15,-3.64,-3.11,-2.54,-2.06,-1.62,-1.24,-0.93,-0.66,-0.45,-0.28,-0.15,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25 | PARAM_BREATH=0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0 28 | PARAM_WING_ANGLE=0,0.04,0.1,0.15,0.19,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.209,0.207,0.206,0.203,0.2,0.197,0.193,0.189,0.185,0.18,0.175,0.17,0.164,0.158,0.153,0.147,0.142,0.136,0.131,0.125,0.12,0.114,0.108,0.101,0.094,0.087,0.08,0.072,0.065,0.057,0.049,0.042,0.035,0.029,0.023,0.017,0.012,0.008,0.005,0.002,0.001,0 29 | PARAM_WING_DEFORM=0,0.12,0.32,0.51,0.64,0.69,0.65,0.54,0.39,0.21,0.03,-0.14,-0.31,-0.45,-0.57,-0.64,-0.67,-0.65,-0.59,-0.5,-0.39,-0.27,-0.14,-0.01,0.11,0.22,0.31,0.37,0.42,0.43,0.42,0.39,0.34,0.28,0.21,0.14,0.06,-0.03,-0.11,-0.18,-0.25,-0.31,-0.36,-0.39,-0.4,-0.395,-0.381,-0.36,-0.33,-0.3,-0.26,-0.22,-0.18,-0.14,-0.1,-0.07,-0.04,-0.02,-0.005,0 30 | PARAM_RIBBON_DEFORM=0,0.08,0.2,0.31,0.39,0.42,0.37,0.25,0.11,-0.03,-0.14,-0.22,-0.24,-0.21,-0.14,-0.06,0.03,0.09,0.14,0.15,0.139,0.11,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31 | PARAM_BLUSH=0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Touch%20Dere6.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.6,2.07,4.08,6.18,7.93,9,9.47,9.76,9.92,9.99,10.004,10,10,9.995,9.977,9.94,9.88,9.78,9.66,9.49,9.28,9.03,8.73,8.39,8,7.44,6.76,5.95,5.08,4.19,3.29,2.43,1.66,0.98,0.46,0.12,0 9 | PARAM_ANGLE_Y=0,1.65,5.75,11.4,17.41,22.56,26,27.79,28.93,29.6,29.91,30,30,29.3,27.43,24.61,21.08,17.17,13.01,8.93,5.12,1.75,-1.09,-3.22,-4.54,-5,-4.9,-4.63,-4.22,-3.7,-3.12,-2.5,-1.88,-1.3,-0.78,-0.37,-0.1,0 10 | PARAM_ANGLE_Z=0,-0.06,-0.22,-0.47,-0.78,-1.13,-1.5,-1.87,-2.22,-2.53,-2.78,-2.94,-3,-2.84,-2.41,-1.77,-0.96,-0.07,0.88,1.82,2.69,3.46,4.11,4.59,4.9,5,4.9,4.63,4.22,3.7,3.12,2.5,1.88,1.3,0.78,0.37,0.1,0 11 | PARAM_EMOTION=-1 12 | PARAM_EYE_L_OPEN=0.55,0.64,0.78,0.88,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.903,0.884,0.85,0.82,0.77,0.73,0.69,0.64,0.61,0.58,0.557,0.55 13 | PARAM_EYE_R_OPEN=0.55,0.64,0.78,0.88,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.903,0.884,0.85,0.82,0.77,0.73,0.69,0.64,0.61,0.58,0.557,0.55 14 | PARAM_EYE_L_OPEN2=-1 15 | PARAM_EYE_R_OPEN2=-1 16 | PARAM_EYE_BALL_X=0 17 | PARAM_EYE_BALL_Y=0 18 | PARAM_BROW_L_Y=0,-0.06,-0.15,-0.21,-0.23,-0.23,-0.228,-0.225,-0.221,-0.216,-0.21,-0.203,-0.196,-0.188,-0.18,-0.17,-0.161,-0.151,-0.141,-0.131,-0.12,-0.11,-0.099,-0.089,-0.079,-0.069,-0.06,-0.05,-0.042,-0.034,-0.027,-0.02,-0.014,-0.009,-0.005,-0.002,-0.001,0 19 | PARAM_BROW_R_Y=0,-0.06,-0.15,-0.21,-0.23,-0.23,-0.228,-0.225,-0.221,-0.216,-0.21,-0.203,-0.196,-0.188,-0.18,-0.17,-0.161,-0.151,-0.141,-0.131,-0.12,-0.11,-0.099,-0.089,-0.079,-0.069,-0.06,-0.05,-0.042,-0.034,-0.027,-0.02,-0.014,-0.009,-0.005,-0.002,-0.001,0 20 | PARAM_BROW_ANGLE=0.2,0.11,-0.03,-0.13,-0.16,-0.159,-0.156,-0.152,-0.145,-0.138,-0.129,-0.118,-0.107,-0.094,-0.081,-0.067,-0.052,-0.036,-0.021,-0.004,0.012,0.028,0.044,0.061,0.076,0.092,0.107,0.121,0.134,0.147,0.158,0.169,0.178,0.185,0.192,0.196,0.199,0.2 21 | PARAM_BROW_SELECT=-0.5 22 | PARAM_MOUTH_OPEN_Y=0,0.92,0.89,0.81,0.72,0.63,0.56,0.52,0.5,0.5,0.5,0.5,0.5,0.5,0.514,0.55,0.61,0.68,0.74,0.81,0.87,0.9,0.92,0.04,0.033,0.028,0.023,0.018,0.014,0.011,0.008,0.006,0.004,0.003,0.001,0.001,0,0 23 | PARAM_MOUTH_OPEN2=0.9,-0.98,-0.98,-0.98,-0.98,-0.98,-0.98,-0.98,-0.979,-0.98,-0.98,-0.978,-0.98,-0.977,-0.98,-0.976,-0.98,-0.974,-0.974,-0.973,-0.972,-0.971,-0.97,0.83,0.842,0.852,0.861,0.868,0.875,0.881,0.885,0.89,0.893,0.896,0.897,0.899,0.9,0.9 24 | PARAM_MOUTH_EMO=0 25 | PARAM_CHEEK=0 26 | PARAM_BODY_ANGLE_X=0,-0.15,-0.52,-1,-1.48,-1.85,-2,-2,-2,-2,-2,-2,-2,-1.94,-1.78,-1.54,-1.24,-0.9,-0.54,-0.19,0.13,0.42,0.66,0.85,0.96,1,0.98,0.93,0.84,0.74,0.62,0.5,0.38,0.26,0.16,0.07,0.02,0 27 | PARAM_BODY_ANGLE_Z=0,0.38,1.29,2.5,3.71,4.62,5,5,5,5,5,5,5,4.86,4.49,3.92,3.22,2.43,1.6,0.79,0.02,-0.65,-1.22,-1.64,-1.91,-2,-1.96,-1.85,-1.69,-1.48,-1.25,-1,-0.75,-0.52,-0.31,-0.15,-0.04,0 28 | PARAM_BODY_Y=0,0.019,0.07,0.14,0.21,0.28,0.33,0.36,0.382,0.394,0.399,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.392,0.37,0.34,0.3,0.25,0.2,0.15,0.1,0.06,0.03,0.01,0 29 | PARAM_BREATH=0.5,0.512,0.55,0.59,0.65,0.71,0.77,0.82,0.85,0.87,0.884,0.889,0.89,0.888,0.882,0.873,0.861,0.846,0.829,0.81,0.79,0.77,0.74,0.72,0.7,0.67,0.65,0.63,0.61,0.587,0.568,0.551,0.537,0.524,0.514,0.506,0.502,0.5 30 | PARAM_BOING=0,0.02,0.07,0.14,0.2,0.25,0.28,0.29,0.25,0.17,0.06,-0.04,-0.12,-0.17,-0.19,-0.176,-0.14,-0.1,-0.05,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31 | PARAM_HAIR_FRONT=0,-0.019,-0.07,-0.14,-0.23,-0.32,-0.41,-0.48,-0.53,-0.55,-0.54,-0.51,-0.47,-0.41,-0.34,-0.27,-0.19,-0.12,-0.04,0.03,0.09,0.15,0.2,0.23,0.25,0.26,0.255,0.241,0.22,0.19,0.16,0.13,0.1,0.07,0.04,0.02,0.005,0 32 | PARAM_HAIR_SIDE_R=0,0.007,0.025,0.05,0.08,0.11,0.13,0.16,0.19,0.204,0.216,0.22,0.214,0.197,0.17,0.14,0.1,0.06,0.01,-0.03,-0.07,-0.12,-0.15,-0.19,-0.21,-0.233,-0.246,-0.25,-0.241,-0.22,-0.19,-0.15,-0.11,-0.07,-0.04,-0.02,-0.005,0 33 | PARAM_HAIR_SIDE_L=0,0.013,0.04,0.09,0.14,0.19,0.24,0.29,0.33,0.36,0.38,0.39,0.382,0.36,0.32,0.28,0.22,0.16,0.1,0.04,-0.02,-0.08,-0.13,-0.18,-0.22,-0.25,-0.264,-0.27,-0.261,-0.24,-0.2,-0.16,-0.12,-0.08,-0.05,-0.02,-0.006,0 34 | PARAM_TWIN_RIBBON_D=0 35 | PARAM_HAIR_BACK=0 36 | PARAM_WING_ANGLE=0,0.013,0.05,0.09,0.14,0.2,0.25,0.3,0.35,0.38,0.4,0.41,0.408,0.402,0.393,0.381,0.366,0.349,0.33,0.31,0.29,0.27,0.24,0.22,0.2,0.17,0.15,0.13,0.11,0.087,0.069,0.052,0.037,0.024,0.014,0.006,0.002,0 37 | PARAM_WING_DEFORM=0,0.03,0.1,0.2,0.31,0.43,0.55,0.66,0.75,0.82,0.87,0.89,0.886,0.873,0.853,0.83,0.79,0.76,0.72,0.67,0.63,0.58,0.53,0.48,0.43,0.38,0.33,0.28,0.23,0.19,0.15,0.11,0.08,0.05,0.03,0.014,0.004,0 38 | VISIBLE:PSD=1 39 | VISIBLE:PARTS_01_HAT=1 40 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 41 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 42 | VISIBLE:PARTS_01_HAIR_BACK_001=1 43 | VISIBLE:PARTS_01_FACE_001=1 44 | VISIBLE:PARTS_01_BROW_001=1 45 | VISIBLE:PARTS_01_EMOTION=1 46 | VISIBLE:PARTS_01_EYE_001=1 47 | VISIBLE:PARTS_01_EYE_BALL_001=1 48 | VISIBLE:PARTS_01_NOSE_001=1 49 | VISIBLE:PARTS_01_MOUTH_001=1 50 | VISIBLE:PARTS_01_EAR_001=1 51 | VISIBLE:PARTS_01_BUST=1 52 | VISIBLE:PARTS_01_BODY=1 53 | VISIBLE:PARTS_01_WING=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Touch2.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.3,1.03,2,2.97,3.7,4,3.71,2.99,2.12,1.27,0.58,0.15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 9 | PARAM_ANGLE_Y=0,5.78,16.22,22,18.09,8.61,-4,-16.61,-26.09,-30,-28.61,-26.11,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.23,-22.91,-20.86,-18.29,-15.45,-12.36,-9.28,-6.43,-3.86,-1.82,-0.49,0 10 | PARAM_ANGLE_Z=0,1.45,2,-0.35,-6.07,-13.06,-19.88,-25.35,-28.82,-30,-29.03,-27.44,-26.35,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-25.67,-24.75,-23.29,-21.44,-19.24,-16.83,-14.29,-11.71,-9.17,-6.76,-4.56,-2.71,-1.25,-0.33,0 11 | PARAM_EMOTION=0 12 | PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.482,0.45,0.434,0.427,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.429,0.433,0.439,0.446,0.455,0.464,0.473,0.481,0.489,0.495,0.499,0.5 13 | PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.6,0.76,0.86,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.8,0.64,0.54,0.5,0.5,0.5,0.5 14 | PARAM_EYE_BALL_X=0 15 | PARAM_EYE_BALL_Y=0,0,0,0,0,0.012,0.05,0.09,0.15,0.21,0.27,0.31,0.35,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.357,0.348,0.334,0.315,0.29,0.27,0.24,0.21,0.18,0.15,0.13,0.1,0.08,0.05,0.036,0.021,0.009,0.002,0 16 | PARAM_BROW_L_Y=0,0.49,0.67,0.6,0.42,0.19,-0.05,-0.23,-0.3,-0.299,-0.297,-0.294,-0.29,-0.284,-0.278,-0.27,-0.262,-0.253,-0.243,-0.233,-0.222,-0.211,-0.199,-0.187,-0.175,-0.163,-0.15,-0.137,-0.125,-0.113,-0.101,-0.089,-0.078,-0.067,-0.057,-0.047,-0.038,-0.03,-0.022,-0.016,-0.01,-0.006,-0.003,-0.001,0 17 | PARAM_BROW_R_Y=0,0.49,0.67,0.6,0.42,0.18,-0.06,-0.24,-0.31,-0.309,-0.307,-0.304,-0.299,-0.294,-0.287,-0.279,-0.271,-0.262,-0.252,-0.241,-0.23,-0.218,-0.206,-0.193,-0.181,-0.168,-0.155,-0.142,-0.129,-0.117,-0.104,-0.092,-0.08,-0.069,-0.058,-0.048,-0.039,-0.031,-0.023,-0.016,-0.011,-0.006,-0.003,-0.001,0 18 | PARAM_BROW_L_ANGLE=0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0 19 | PARAM_BROW_R_ANGLE=0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0 20 | PARAM_EAR_DEFORM=0,0.08,0.23,0.31,0.22,0,-0.29,-0.59,-0.81,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.893,-0.876,-0.85,-0.81,-0.77,-0.72,-0.67,-0.61,-0.55,-0.48,-0.42,-0.35,-0.29,-0.23,-0.18,-0.13,-0.09,-0.05,-0.02,-0.006,0 21 | PARAM_MOUTH_OPEN_Y=0.5,0.59,0.73,0.87,0.96,1,1,1,1,1,1,1,1,1,1,0.986,0.95,0.91,0.86,0.83,0.818,0.82,0.826,0.834,0.842,0.848,0.85,0.832,0.8,0.783,0.777,0.797,0.83,0.85,0.86,0.86,0.858,0.853,0.842,0.826,0.8,0.71,0.6,0.52,0.5 22 | PARAM_BODY_ANGLE_X=0 23 | PARAM_BODY_ANGLE_Y=0,0.73,1.92,2.73,3,2.71,2.01,1.08,0.15,-0.55,-0.84,-0.69,-0.45,-0.23,-0.06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 24 | PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,-0.23,-0.77,-1.5,-2.23,-2.77,-3,-2.96,-2.86,-2.69,-2.47,-2.22,-1.94,-1.65,-1.35,-1.06,-0.78,-0.53,-0.31,-0.14,-0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 25 | PARAM_BREATH=0.5,0.54,0.63,0.75,0.87,0.96,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0,0.011,0.04,0.08,0.14,0.2,0.26,0.32,0.39,0.44,0.49,0.54,0.57,0.59,0.6,0.599,0.595,0.59,0.583,0.574,0.565,0.556,0.546,0.537,0.528,0.52,0.513,0.508,0.504,0.501,0.5 26 | PARAM_HAIR_SIDE=0 27 | PARAM_HAIR_BACK=0,-0.03,-0.12,-0.25,-0.4,-0.56,-0.7,-0.83,-0.92,-0.98,-1,-0.97,-0.87,-0.74,-0.58,-0.42,-0.26,-0.13,-0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 28 | PARAM_WING_ANGLE=0,0.013,0.04,0.09,0.13,0.16,0.17,0.157,0.12,0.07,0.01,-0.05,-0.11,-0.16,-0.2,-0.21,-0.209,-0.207,-0.203,-0.198,-0.192,-0.185,-0.176,-0.168,-0.158,-0.149,-0.138,-0.128,-0.117,-0.106,-0.096,-0.085,-0.075,-0.064,-0.055,-0.046,-0.037,-0.029,-0.022,-0.016,-0.01,-0.006,-0.003,-0.001,0 29 | PARAM_WING_DEFORM=0,0.24,0.64,0.91,1,0.93,0.75,0.48,0.16,-0.16,-0.48,-0.75,-0.93,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.991,-0.97,-0.93,-0.87,-0.81,-0.74,-0.66,-0.58,-0.5,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 30 | PARAM_RIBBON_DEFORM=0,0,0,0,0,0,0,0.15,0.4,0.57,0.63,0.51,0.31,0.12,-0.01,-0.06,-0.053,-0.035,-0.017,-0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 31 | PARAM_BLUSH=0,0.012,0.04,0.09,0.15,0.2,0.25,0.3,0.33,0.35,0.36,0.359,0.356,0.352,0.345,0.338,0.329,0.318,0.307,0.295,0.281,0.267,0.252,0.237,0.222,0.206,0.19,0.174,0.158,0.142,0.127,0.112,0.097,0.084,0.07,0.058,0.047,0.036,0.027,0.019,0.013,0.007,0.003,0.001,0 32 | VISIBLE:PSD=1 33 | VISIBLE:PARTS_01_RIBBON=1 34 | VISIBLE:PARTS_01_FACE_001=1 35 | VISIBLE:PARTS_01_EYE_001=1 36 | VISIBLE:PARTS_01_EYE_BALL_001=1 37 | VISIBLE:PARTS_01_BROW_001=1 38 | VISIBLE:PARTS_01_MOUTH_001=1 39 | VISIBLE:PARTS_01_NOSE_001=1 40 | VISIBLE:PARTS_01_EAR_001=1 41 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 42 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 43 | VISIBLE:PARTS_01_HAIR_BACK_001=1 44 | VISIBLE:PARTS_01_BODY=1 45 | VISIBLE:PARTS_01_WING=1 46 | VISIBLE:PARTS_01_HAT=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/motions/Touch4.mtn: -------------------------------------------------------------------------------- 1 | # Live2D Animator Motion Data 2 | $fps=30 3 | 4 | $fadein=0 5 | 6 | $fadeout=0 7 | 8 | PARAM_ANGLE_X=0,0.45,1.51,2.94,4.62,6.42,8.31,10.17,12,14.13,16.1,17.86,19.48,20.94,22.28,23.48,24.54,25.5,26.35,27.09,27.75,28.31,28.77,29.17,29.48,29.71,29.87,29.97,30,29.85,29.41,28.71,27.77,26.65,25.31,23.82,22.24,20.51,18.7,16.89,15,13.11,11.3,9.49,7.76,6.18,4.69,3.35,2.23,1.29,0.59,0.15,0,0,0,0,0,0,0,0,0 9 | PARAM_ANGLE_Y=0,-0.26,-0.85,-1.63,-2.52,-3.44,-4.36,-5.22,-6,-6.86,-7.65,-8.35,-8.99,-9.57,-10.09,-10.56,-10.97,-11.33,-11.66,-11.94,-12.18,-12.39,-12.56,-12.7,-12.81,-12.9,-12.96,-12.99,-13,-12.93,-12.75,-12.44,-12.03,-11.55,-10.97,-10.32,-9.64,-8.89,-8.1,-7.32,-6.5,-5.68,-4.9,-4.11,-3.36,-2.68,-2.03,-1.45,-0.97,-0.56,-0.25,-0.07,0,0,0,0,0,0,0,0,0 10 | PARAM_ANGLE_Z=0,0.83,2.63,4.88,7.23,9.39,11.21,12.46,13,13.14,13.27,13.38,13.48,13.57,13.64,13.71,13.76,13.81,13.86,13.89,13.92,13.94,13.96,13.974,13.985,13.992,13.997,13.999,14,13.91,13.65,13.23,12.66,11.99,11.19,10.29,9.34,8.3,7.22,6.13,5,3.87,2.78,1.7,0.66,-0.29,-1.19,-1.99,-2.66,-3.23,-3.65,-3.91,-4,-4,-3.71,-2.99,-2.12,-1.27,-0.58,-0.15,0 11 | PARAM_EMOTION=-1 12 | PARAM_EYE_L_OPEN=0.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.94,0.91,0.84,0.76,0.67,0.61,0.56,0.55 13 | PARAM_EYE_R_OPEN=0.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.94,0.91,0.84,0.76,0.67,0.61,0.56,0.55 14 | PARAM_EYE_L_OPEN2=-1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.116,0.16,0.22,0.3,0.39,0.49,0.59,0.68,0.76,0.82,0.86,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.94,-0.96,-0.975,-0.986,-0.993,-0.997,-0.999,-1 15 | PARAM_EYE_R_OPEN2=-1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.115,0.16,0.22,0.3,0.38,0.48,0.58,0.66,0.74,0.81,0.85,0.87,0.873,0.875,0.877,0.878,0.879,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.96,-0.973,-0.984,-0.991,-0.995,-0.998,-1,-1 16 | PARAM_EYE_BALL_X=0,-0.011,-0.04,-0.07,-0.1,-0.13,-0.15,-0.171,-0.18,-0.184,-0.188,-0.191,-0.194,-0.197,-0.199,-0.201,-0.203,-0.204,-0.206,-0.207,-0.208,-0.208,-0.21,-0.209,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.195,-0.16,-0.11,-0.07,-0.03,-0.01,0 17 | PARAM_EYE_BALL_Y=0,0.009,0.028,0.05,0.08,0.11,0.13,0.15,0.17,0.186,0.2,0.213,0.224,0.234,0.243,0.251,0.258,0.264,0.27,0.274,0.278,0.281,0.284,0.286,0.287,0.289,0.289,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.27,0.22,0.15,0.09,0.04,0.01,0 18 | PARAM_BROW_L_Y=0,-0.05,-0.16,-0.3,-0.44,-0.57,-0.67,-0.74,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.71,-0.58,-0.41,-0.24,-0.11,-0.03,0 19 | PARAM_BROW_R_Y=0,-0.05,-0.17,-0.31,-0.45,-0.59,-0.7,-0.77,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.74,-0.6,-0.42,-0.25,-0.12,-0.03,0 20 | PARAM_BROW_ANGLE=0.2,-0.58,-0.59,-0.598,-0.603,-0.607,-0.609,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.55,-0.41,-0.23,-0.06,0.08,0.17,0.2 21 | PARAM_BROW_SELECT=-0.5,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.36,0.2,-0.01,-0.21,-0.36,-0.47,-0.5 22 | PARAM_MOUTH_OPEN_Y=0 23 | PARAM_MOUTH_OPEN2=0.9,0.85,0.73,0.59,0.45,0.31,0.2,0.13,0.1,0.1,0.102,0.105,0.109,0.114,0.12,0.128,0.136,0.145,0.155,0.166,0.178,0.191,0.204,0.218,0.233,0.249,0.266,0.283,0.301,0.319,0.338,0.358,0.378,0.4,0.42,0.44,0.46,0.49,0.51,0.53,0.55,0.58,0.6,0.63,0.65,0.67,0.7,0.72,0.75,0.77,0.8,0.82,0.85,0.87,0.89,0.903,0.906,0.906,0.903,0.901,0.9 24 | PARAM_MOUTH_EMO=0,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.259,0.26,0.26,0.26,0.26,0.26,0.26,0.258,0.26,0.26,0.26,0.26,0.257,0.26,0.26,0.26,0.256,0.26,0.26,0.26,0.255,0.25,0.25,0.254,0.25,0.25,0.253,0.25,0.25,0.252,0.25,0.25,0.251,0.25,0.25,0,0,0,0,0,0,0,0 25 | PARAM_CHEEK=0 26 | PARAM_BODY_ANGLE_X=0 27 | PARAM_BODY_ANGLE_Z=0 28 | PARAM_BODY_Y=0,0.002,0.006,0.014,0.024,0.036,0.05,0.067,0.084,0.103,0.123,0.14,0.17,0.19,0.21,0.23,0.25,0.27,0.291,0.309,0.327,0.343,0.357,0.369,0.38,0.389,0.395,0.399,0.4,0.398,0.392,0.383,0.37,0.355,0.338,0.318,0.3,0.27,0.25,0.23,0.2,0.17,0.15,0.13,0.1,0.08,0.063,0.045,0.03,0.017,0.008,0.002,0,0,0,0,0,0,0,0,0 29 | PARAM_BREATH=0.5,0.498,0.492,0.483,0.47,0.455,0.437,0.42,0.39,0.37,0.35,0.32,0.29,0.27,0.24,0.21,0.19,0.16,0.14,0.11,0.09,0.072,0.054,0.038,0.025,0.014,0.007,0.002,0,0.003,0.01,0.021,0.037,0.056,0.08,0.1,0.13,0.16,0.19,0.22,0.25,0.28,0.31,0.34,0.37,0.4,0.42,0.44,0.463,0.479,0.49,0.497,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 30 | PARAM_BOING=0 31 | PARAM_HAIR_FRONT=0,-0.03,-0.11,-0.21,-0.3,-0.38,-0.41,-0.34,-0.18,0.03,0.23,0.38,0.49,0.52,0.47,0.33,0.17,0.01,-0.11,-0.19,-0.22,-0.206,-0.17,-0.14,-0.1,-0.06,-0.03,-0.008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 32 | PARAM_HAIR_SIDE_R=0,0.02,0.07,0.15,0.24,0.33,0.41,0.49,0.54,0.58,0.59,0.58,0.56,0.52,0.48,0.43,0.39,0.36,0.33,0.316,0.31,0.31,0.312,0.314,0.316,0.317,0.319,0.32,0.32,0.318,0.314,0.306,0.296,0.284,0.27,0.254,0.238,0.22,0.201,0.182,0.162,0.143,0.124,0.106,0.088,0.071,0.056,0.042,0.03,0.02,0.011,0.005,0.001,0,0,0,0,0,0,0,0 33 | PARAM_HAIR_SIDE_L=0,-0.03,-0.09,-0.19,-0.3,-0.41,-0.52,-0.61,-0.68,-0.72,-0.74,-0.727,-0.69,-0.65,-0.59,-0.53,-0.48,-0.43,-0.4,-0.38,-0.37,-0.388,-0.43,-0.47,-0.52,-0.57,-0.61,-0.63,-0.64,-0.637,-0.628,-0.613,-0.593,-0.57,-0.54,-0.51,-0.48,-0.44,-0.4,-0.36,-0.32,-0.29,-0.25,-0.21,-0.18,-0.14,-0.11,-0.08,-0.06,-0.039,-0.022,-0.01,-0.003,0,0,0,0,0,0,0,0 34 | PARAM_TWIN_RIBBON_D=0 35 | PARAM_HAIR_BACK=0 36 | PARAM_WING_ANGLE=0 37 | PARAM_WING_DEFORM=0,-0.009,-0.03,-0.07,-0.12,-0.18,-0.24,-0.31,-0.38,-0.45,-0.53,-0.6,-0.67,-0.74,-0.8,-0.86,-0.91,-0.94,-0.97,-0.993,-1,-1,-1,-1,-0.998,-0.996,-0.993,-0.99,-0.985,-0.979,-0.972,-0.963,-0.953,-0.941,-0.927,-0.911,-0.893,-0.874,-0.85,-0.83,-0.8,-0.76,-0.7,-0.62,-0.54,-0.45,-0.36,-0.28,-0.2,-0.13,-0.08,-0.03,-0.01,0,0,0,0,0,0,0,0 38 | VISIBLE:PSD=1 39 | VISIBLE:PARTS_01_HAT=1 40 | VISIBLE:PARTS_01_HAIR_FRONT_001=1 41 | VISIBLE:PARTS_01_HAIR_SIDE_001=1 42 | VISIBLE:PARTS_01_HAIR_BACK_001=1 43 | VISIBLE:PARTS_01_FACE_001=1 44 | VISIBLE:PARTS_01_BROW_001=1 45 | VISIBLE:PARTS_01_EMOTION=1 46 | VISIBLE:PARTS_01_EYE_001=1 47 | VISIBLE:PARTS_01_EYE_BALL_001=1 48 | VISIBLE:PARTS_01_NOSE_001=1 49 | VISIBLE:PARTS_01_MOUTH_001=1 50 | VISIBLE:PARTS_01_EAR_001=1 51 | VISIBLE:PARTS_01_BUST=1 52 | VISIBLE:PARTS_01_BODY=1 53 | VISIBLE:PARTS_01_WING=1 -------------------------------------------------------------------------------- /res/live2d/models/pio/textures/default-costume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/res/live2d/models/pio/textures/default-costume.png -------------------------------------------------------------------------------- /res/live2d/models/pio/textures/pajamas-costume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/res/live2d/models/pio/textures/pajamas-costume.png -------------------------------------------------------------------------------- /res/live2d/models/pio/textures/school-costume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/super1207/redreply/11565df4c20e6714509bc99521d5a39610450fe1/res/live2d/models/pio/textures/school-costume.png -------------------------------------------------------------------------------- /res/live2d/pio.css: -------------------------------------------------------------------------------- 1 | /* ---- 2 | 3 | # Pio Plugin 4 | # By: Dreamer-Paul 5 | # Last Update: 2019.8.8 6 | 7 | 一个支持更换 Live2D 模型的 Typecho 插件。 8 | 9 | 本代码为奇趣保罗原创,并遵守 GPL 2.0 开源协议。欢迎访问我的博客:https://paugram.com 10 | 11 | ---- */ 12 | 13 | .pio-container{ 14 | bottom: 0; 15 | z-index: 52; 16 | color: #666; 17 | position: fixed; 18 | user-select: none; 19 | } 20 | .pio-container.left{ left: 0 } 21 | .pio-container.right{ right: 0 } 22 | .pio-container.active{ cursor: move } 23 | .pio-container.static{ pointer-events: none } 24 | 25 | .pio-container .pio-action{ 26 | top: 3em; 27 | opacity: 0; 28 | position: absolute; 29 | transition: opacity .3s; 30 | } 31 | .pio-container.left .pio-action{ right: 0 } 32 | .pio-container.right .pio-action{ left: 0 } 33 | .pio-container:hover .pio-action{ opacity: 1 } 34 | 35 | .pio-action span{ 36 | color: #fff; 37 | width: 1.5em; 38 | height: 1.5em; 39 | display: block; 40 | cursor: pointer; 41 | text-align: center; 42 | border-radius: 66%; 43 | margin-bottom: .5em; 44 | border: 1px solid #666; 45 | background: #fff center/70% no-repeat; 46 | } 47 | .pio-action .pio-home{ 48 | background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg5My43IDUwNS45SDEyOS4zYy0xMyAwLTI0LjgtNy45LTI5LjgtMTkuOS01LTEyLTIuMi0yNS45IDctMzUuMmwzMDctMzA3YzI2LjEtMjYuMSA2MC45LTQwLjUgOTgtNDAuNXM3MS45IDE0LjQgOTggNDAuNWwzMDcgMzA3YzkuMiA5LjIgMTIgMjMuMSA3IDM1LjItNSAxMi4xLTE2LjcgMTkuOS0yOS44IDE5Ljl6TTY3My4yIDkxOS45aC0zMS41Yy0xNy44IDAtMzIuMy0xNC40LTMyLjMtMzIuM3YtNzcuNGMwLTIzLjEtMTguOC00Mi4xLTQxLjktNDIuNC0yMi4zIDAuMy00MS4xIDE5LjMtNDEuMSA0Mi40djc3LjRjMCAxNy44LTE0LjQgMzIuMy0zMi4zIDMyLjNIMzQ5LjhjLTcwLjkgMC0xMjguNy02My43LTEyOC43LTE0MS45VjU4MS45YzAtMTcuOCAxNC40LTMyLjMgMzIuMy0zMi4zaDUxNi4yYzE3LjggMCAzMi4zIDE0LjQgMzIuMyAzMi4zVjc3OGMtMC4xIDc4LjMtNTcuOCAxNDEuOS0xMjguNyAxNDEuOXoiPjwvcGF0aD48L3N2Zz4=); 49 | } 50 | .pio-action .pio-close{ 51 | background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE1NS4yNTIgOTQzLjgyNWMtMTkuMjEzIDAtMzguNDI5LTcuMzMyLTUzLjA4OS0yMS45ODgtMjkuMzE3LTI5LjMyMS0yOS4zMTctNzYuODU1IDAtMTA2LjE3NWw3MTMuNDk0LTcxMy40OTRjMjkuMzE3LTI5LjMyMSA3Ni44NTMtMjkuMzIxIDEwNi4xNzUgMCAyOS4zMTcgMjkuMzE3IDI5LjMxNyA3Ni44NTUgMCAxMDYuMTc1bC03MTMuNDk0IDcxMy40OTRjLTE0LjY2IDE0LjY2LTMzLjg3NCAyMS45ODgtNTMuMDg5IDIxLjk4OHoiIGZpbGw9IiI+PC9wYXRoPjxwYXRoIGQ9Ik04NjguNzQ5IDk0My44MjRjLTE5LjIxMyAwLTM4LjQyOC03LjMzMi01My4wODktMjEuOTg4bC03MTMuNDk0LTcxMy40OTNjLTI5LjMxNy0yOS4zMTctMjkuMzE3LTc2Ljg1NyAwLTEwNi4xNzUgMjkuMzE2LTI5LjMxNyA3Ni44NTUtMjkuMzIxIDEwNi4xNzQgMGw3MTMuNDk0IDcxMy40OTJjMjkuMzE3IDI5LjMyMSAyOS4zMTcgNzYuODU1IDAgMTA2LjE3NS0xNC42NTcgMTQuNjYxLTMzLjg3MSAyMS45OTMtNTMuMDg3IDIxLjk5M3oiIGZpbGw9IiI+PC9wYXRoPjwvc3ZnPg==); 52 | } 53 | .pio-action .pio-skin{ 54 | background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk2NS45MTEgMzEwLjUzMWwtMTc0LjQtMTc0LjM5OGMtMTMuMDIyLTEzLjAyMS0zMC45MzMtMTkuNjQ5LTQ5LjM4MS0xOC4yMjgtMS43NC0wLjE1LTMuNDIyLTAuMjI0LTUuMDctMC4yMjRsLTkyLjkxNCAwLTYuNTE3IDMuNjI1Yy0zNC40MjEgMTkuMTQ2LTc4LjM0MSAyOS42ODktMTIzLjY2OCAyOS42ODktNDUuMzI4IDAtODkuMjQ2LTEwLjU0My0xMjMuNjY3LTI5LjY4OWwtNi41MTgtMy42MjVMMjkwLjg2IDExNy42ODFjLTIzLjY5MSAwLTQ0Ljk4NiAxMi45MjQtNTUuOTk1IDMzLjQ1MUw2Mi40NzcgMzIzLjUyMWMtMTEuOSAxMS44OTktMTguNDU0IDI3LjcyLTE4LjQ1NCA0NC41NDggMCAxNi44MjkgNi41NTQgMzIuNjQ5IDE4LjQ1MyA0NC41NDlsMTI1Ljk1MyAxMjUuOTU1YzEwLjU0IDEwLjUzOCAyNC4xNTcgMTYuODc4IDM4LjgyNiAxOC4xODFsMCAzMDQuMzk5YzAgMzUuMDczIDI4LjUzMyA2My42MDYgNjMuNjA0IDYzLjYwNmw0NDYuMTk5IDBjMzUuMDc0IDAgNjMuNjA3LTI4LjUzMyA2My42MDctNjMuNjA2bC0wLjAwMS0zMTcuMzQ1YzE0Ljg0NC0xLjIxMSAyOC42MzktNy41NzcgMzkuMjg4LTE4LjIyNEw5NjUuOTEgMzk5LjYyOEM5OTAuNDc1IDM3NS4wNjQgOTkwLjQ3NSAzMzUuMDk1IDk2NS45MTEgMzEwLjUzMXoiPjwvcGF0aD48L3N2Zz4=); 55 | } 56 | .pio-action .pio-info{ 57 | background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTY4Mi45IDgyNS45SDI2Ny44Yy0yMS44IDAtMzkuNS0xNy43LTM5LjUtMzkuNXMxNy43LTM5LjUgMzkuNS0zOS41aDQxNS4xYzIxLjggMCAzOS41IDE3LjcgMzkuNSAzOS41cy0xNy43IDM5LjUtMzkuNSAzOS41ek04NjQuNyAxMDAuNGMtMTguNSAzLjctMzEuMyAyMC45LTMxLjMgMzkuN3Y2NDUuOGMwIDQ4LTM4LjkgODctODcgODdIMjE5LjNjLTE2LjQgMC0yOS42LTEzLjMtMjkuNi0yOS42VjczMi43YzAtMTYuMSAxMy4xLTI5LjIgMjkuMi0yOS4yaDM3NS45Yzg4LjEgMCAxNTkuNS03MS40IDE1OS41LTE1OS41VjE4NS41YzAtNjYuMi01My43LTExOS45LTExOS45LTExOS45aC00MDRjLTY2LjIgMC0xMTkuOSA1My43LTExOS45IDExOS45djY1Ny44YzAgNjAgNDguNyAxMDguNyAxMDguNyAxMDguN2g1MjcuMWM5MS43IDAgMTY2LjEtNzQuMyAxNjYuMS0xNjYuMVYxMzkuMWMwLjEtMjQuNi0yMi4yLTQzLjktNDcuNy0zOC43eiI+PC9wYXRoPjwvc3ZnPg==); 58 | } 59 | .pio-action .pio-night{ 60 | background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiAyMDkuNDAzMjQxYy0yMDEuNzMxNTE0IDAtMzc0LjAwOTIwNiAxMjUuNDc2NzgzLTQ0My44MDg5MjIgMzAyLjU5Njc1OSA2OS43OTg2OTIgMTc3LjExOTk3NyAyNDIuMDc3NDA4IDMwMi41OTY3NTkgNDQzLjgwODkyMiAzMDIuNTk2NzU5IDIwMS45MzMxMDUgMCAzNzQuMDEwMjI5LTEyNS40NzY3ODMgNDQzLjgwODkyMi0zMDIuNTk2NzU5Qzg4Ni4wMDkyMDYgMzM0Ljg4MDAyMyA3MTMuOTMzMTA1IDIwOS40MDMyNDEgNTEyIDIwOS40MDMyNDF6TTUxMiA3MTMuNzMxNTE0Yy0xMTEuMzU1MTU3IDAtMjAxLjczMTUxNC05MC4zNzUzMzQtMjAxLjczMTUxNC0yMDEuNzMxNTE0czkwLjM3NTMzNC0yMDEuNzMxNTE0IDIwMS43MzE1MTQtMjAxLjczMTUxNCAyMDEuNzMxNTE0IDkwLjM3NTMzNCAyMDEuNzMxNTE0IDIwMS43MzE1MTRTNjIzLjM1NTE1NyA3MTMuNzMxNTE0IDUxMiA3MTMuNzMxNTE0ek01MTIgMzkwLjk2MTI5NmMtNjYuNzcyNzc2IDAtMTIxLjAzODcwNCA1NC4yNjU5MjgtMTIxLjAzODcwNCAxMjEuMDM4NzA0czU0LjI2NTkyOCAxMjEuMDM4NzA0IDEyMS4wMzg3MDQgMTIxLjAzODcwNCAxMjEuMDM4NzA0LTU0LjI2NTkyOCAxMjEuMDM4NzA0LTEyMS4wMzg3MDRTNTc4Ljc3Mjc3NiAzOTAuOTYxMjk2IDUxMiAzOTAuOTYxMjk2eiI+PC9wYXRoPjwvc3ZnPg==); 61 | } 62 | .pio-container .pio-dialog{ 63 | top: -2em; 64 | left: 1em; 65 | right: 1em; 66 | opacity: 0; 67 | z-index: -1; 68 | font-size: .8em; 69 | background: #fff; 70 | padding: .75em 1em; 71 | border-radius: 1em; 72 | visibility: hidden; 73 | position: absolute; 74 | word-break: break-all; 75 | border: 1px solid #eee; 76 | transition: opacity .3s, visibility .3s; 77 | } 78 | .pio-container .pio-dialog.active{ 79 | opacity: 1; 80 | visibility: visible; 81 | } 82 | 83 | #pio{ vertical-align: middle } 84 | 85 | @media screen and (max-width: 768px){ 86 | #pio{ width: 8em } 87 | .pio-container{ pointer-events: none } 88 | .pio-container.hidden, .pio-action, .pio-dialog{ display: none } 89 | } -------------------------------------------------------------------------------- /res/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 红色问答登录 8 | 70 | 71 | 72 | 73 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /res/pluscenter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 红色问答插件中心 14 | 15 | 16 | 17 |
18 |

红色问答脚本中心

19 | 20 |
21 |
22 |
23 |
24 | {{plus.name}}
25 |
{{plus.version}}
26 |
by {{plus.author}}
27 |
{{plus.description}}
28 | 29 |
30 |
31 |
32 |
33 | 34 | 111 | -------------------------------------------------------------------------------- /res/style.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | html,body{ 4 | width: 100%; 5 | height: 100%; 6 | display: flex; 7 | margin: 0; 8 | padding: 0; 9 | font-family: fusion-pixel-12px-monospaced-zh_hant, serif; 10 | } 11 | 12 | 13 | button,textarea,body,select,input{ 14 | background-color: #C7EDCC; 15 | font-family: fusion-pixel-12px-monospaced-zh_hant, serif; 16 | } 17 | 18 | button:hover { 19 | background-color: #87CEEB; 20 | cursor: pointer; 21 | } 22 | 23 | #app { 24 | display: flex; 25 | flex-direction: column; 26 | flex: 0 0 100%; 27 | width: 0; 28 | align-items: stretch; 29 | } 30 | 31 | #app > h1 { 32 | color: red; 33 | text-align: center; 34 | } 35 | 36 | #pkg_content{ /* 包内容 */ 37 | display: flex; 38 | flex: 1 1 auto; 39 | width: 100%; 40 | overflow-x: auto; 41 | } 42 | 43 | #pkg_content > div:nth-child(1) { /* 包内容左边 */ 44 | display: flex; 45 | flex-direction: column; 46 | flex: 0 0 7em; 47 | overflow: auto; 48 | } 49 | #pkg_content > div:nth-child(1) > div:nth-child(1) { /* 包内容左边-标题 */ 50 | text-align: center; 51 | border-style:solid; 52 | border-spacing: 1px; 53 | } 54 | #pkg_content > div:nth-child(1) > div:nth-child(2) { /* 包内容左边-名字 */ 55 | display: flex; 56 | flex-direction: column; 57 | border-style:solid; 58 | flex: 0 1 100%; 59 | overflow: auto; 60 | } 61 | 62 | #pkg_content > div:nth-child(1) > div:nth-child(3) { /* 上移,下移按钮 */ 63 | display: flex; 64 | flex-direction: column; 65 | border-style:solid; 66 | } 67 | 68 | #pkg_content > div:nth-child(1) > div:nth-child(2) > div { /* 包内容左边-单个名字 */ 69 | display: flex; 70 | flex: 0 0 auto; 71 | align-items: stretch; 72 | border-style:solid; 73 | } 74 | #pkg_content > div:nth-child(1) > div:nth-child(2) > div:hover { /* 包内容左边-单个名字,让鼠标晃上去变色 */ 75 | background-color: #87CEEB; 76 | } 77 | #pkg_content > div:nth-child(1) > div:nth-child(2) > div > span{ /* 包内容左边-单个名字 */ 78 | text-align: center; 79 | cursor: pointer; 80 | margin-top: 1px; 81 | overflow-x: auto; 82 | flex: 1 0 100%; 83 | } 84 | 85 | #pkg_content > div:nth-child(2) { /* 包内容右边 */ 86 | display: flex; 87 | flex-direction: column; 88 | flex: 0 0 100%; 89 | overflow-x: auto; 90 | } 91 | .input_div{ 92 | display: flex; 93 | } 94 | 95 | #pkg_content > div:nth-child(2) > div:nth-child(1){ /* 包内容右边 */ 96 | display: flex; 97 | overflow-x: auto; 98 | } 99 | 100 | #pkg_content > div:nth-child(2) > div:nth-child(1) > span { /* 包内容右边 */ 101 | flex: 0 0 auto; 102 | } 103 | 104 | #pkg_content > div:nth-child(2) > div:nth-child(2){ /* 包内容右边 */ 105 | display: flex; 106 | overflow-x: auto; 107 | } 108 | 109 | #pkg_content > div:nth-child(2) > div:nth-child(2) > span { /* 包内容右边 */ 110 | flex: 0 0 auto; 111 | } 112 | 113 | #pkg_content > div:nth-child(2) > div:nth-child(3){ /* 包内容右边 */ 114 | display: flex; 115 | overflow-x: auto; 116 | } 117 | 118 | #pkg_content > div:nth-child(2) > div:nth-child(3) > span { /* 包内容右边 */ 119 | flex: 0 0 auto; 120 | } 121 | 122 | #script_name { /* 包内容右边 */ 123 | border-style:solid; 124 | flex: 1 1 auto; 125 | margin: 2px; 126 | } 127 | #script_description { /* 包内容右边 */ 128 | border-style:solid; 129 | flex: 1 1 auto; 130 | margin: 2px; 131 | } 132 | #script_keyword { /* 包内容右边 */ 133 | border-style:solid; 134 | flex: 1 1 auto; 135 | margin: 2px; 136 | } 137 | #script_ppfs { /* 包内容右边 */ 138 | border-style:solid; 139 | margin: 2px; 140 | } 141 | #script_cffs { /* 包内容右边 */ 142 | border-style:solid; 143 | margin: 2px; 144 | } 145 | #script_content { /* 包内容右边 */ 146 | height: 0; 147 | border-style:solid; 148 | flex: 1 0 auto; 149 | } 150 | 151 | #cmd_content{ 152 | display: flex; 153 | flex: 0 0 5em; 154 | flex-direction:column; 155 | } 156 | 157 | #cmd_content > div { 158 | display: flex; 159 | flex: 0 0 2.5em; 160 | } 161 | 162 | #cmd_content > div:nth-child(1) > button { 163 | flex: 1 0 auto; 164 | } 165 | 166 | #cmd_content > div:nth-child(2) > button { 167 | flex: 1 0 auto; 168 | } 169 | 170 | .name_active { /* 点中名字,变色属性 */ 171 | color: red; 172 | } 173 | 174 | #pkg_btn_vec { 175 | display: flex; 176 | overflow-x:auto; 177 | margin-left: 0.1em; 178 | margin-right: 0.1em; 179 | margin-bottom: 0.15em; 180 | flex: 0 0 auto; 181 | } 182 | 183 | #pkg_btn_vec > div { 184 | display: flex; 185 | padding: 0.1em; 186 | flex: 0 0 auto; 187 | 188 | } 189 | 190 | #other_dlg { 191 | margin: auto; 192 | } 193 | 194 | #other_dlg > div{ 195 | display: flex; 196 | flex-direction:column; 197 | } 198 | 199 | #other_dlg > div > div { 200 | display: flex; 201 | flex-direction:column; 202 | background-color: antiquewhite; 203 | } 204 | 205 | #other_dlg > div > div > *{ 206 | margin: 0.3em; 207 | } 208 | 209 | #other_dlg > div > *{ 210 | margin: 0.3em; 211 | } 212 | 213 | /* @font-face { 214 | font-family: fusion-pixel-12px-monospaced-zh_hant; 215 | src: url("fusion-pixel-12px-proportional-zh_hans.woff2"); 216 | } */ -------------------------------------------------------------------------------- /res/up.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 上传并展示JSON文件 7 | 25 | 26 | 27 |

上传JSON文件并保存

28 | 29 |

30 | 31 |

32 | 33 |
34 | 35 | 36 |
37 | 38 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /res/version.txt: -------------------------------------------------------------------------------- 1 | 1.0.81 -------------------------------------------------------------------------------- /res/watchlog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 红色问答日志 8 | 19 | 71 | 72 | 73 | 74 |

红色问答日志

75 | 正在连接... 76 | 79 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /script/upload_web.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: UTF-8 -*- 3 | 4 | import requests 5 | import zipfile 6 | from io import BytesIO 7 | from requests_toolbelt.multipart.encoder import MultipartEncoder 8 | from ftplib import FTP 9 | 10 | # 此脚本用于上传可执行文件到官网服务器 11 | # 依赖安装: 12 | # pip install requests requests_toolbelt 13 | 14 | # 你需要填写以下数据 15 | WORKFLOW_RUNID = "5917734512" # github action workflow run id 16 | 17 | # 你需要填写FTP用户信息 18 | FTP_HOST = "127.0.0.1" 19 | FTP_USER = "user_name" 20 | FTP_PASSWORD= "password" 21 | 22 | release_json = requests.get(f'https://api.github.com/repos/super1207/redreply/releases/latest').json() 23 | tag_name = release_json["tag_name"] 24 | version = tag_name[8:] 25 | windows_i686_url = f"https://ghproxy.com/https://github.com/super1207/redreply/releases/download/{tag_name}/redlang.exe" 26 | artifacts_json = requests.get(f"https://api.github.com/repos/super1207/redreply/actions/runs/{WORKFLOW_RUNID}/artifacts").json() 27 | linux_i686_url_raw = "" 28 | linux_aarch64_url_raw = "" 29 | for it in artifacts_json['artifacts']: 30 | if it["name"] == "redlang_linux_i686": 31 | id = it["id"] 32 | linux_i686_url_raw = f"https://nightly.link/super1207/redreply/suites/{WORKFLOW_RUNID}/artifacts/{id}" 33 | elif it["name"] == "redlang_linux_aarch64": 34 | id = it["id"] 35 | linux_aarch64_url_raw = f"https://nightly.link/super1207/redreply/suites/{WORKFLOW_RUNID}/artifacts/{id}" 36 | 37 | print("正在下载linux_i686_zip_data...") 38 | linux_i686_zip_data = requests.get(linux_i686_url_raw).content 39 | linux_i686_zip_file = zipfile.ZipFile(BytesIO(linux_i686_zip_data)) 40 | linux_i686_data = linux_i686_zip_file.open([file_info for file_info in linux_i686_zip_file.infolist()][0]).read() 41 | print("正在下载linux_aarch64_zip_data...") 42 | linux_aarch64_zip_data = requests.get(linux_aarch64_url_raw).content 43 | linux_aarch64_zip_file = zipfile.ZipFile(BytesIO(linux_aarch64_zip_data)) 44 | linux_aarch64_data = linux_aarch64_zip_file.open([file_info for file_info in linux_aarch64_zip_file.infolist()][0]).read() 45 | print("正在上传linux_i686_data...") 46 | files = MultipartEncoder(fields=[('reqtype','fileupload'),('fileToUpload', ('linux_i686',linux_i686_data))]) 47 | linux_i686_url = requests.post("https://catbox.moe/user/api.php", data=files,headers={'Content-Type': files.content_type}).text 48 | if not linux_i686_url.startswith("http"): 49 | raise Exception(f"Error:{linux_i686_url}") 50 | print("正在上传linux_aarch64_data...") 51 | files = MultipartEncoder(fields=[('reqtype','fileupload'),('fileToUpload', ('linux_aarch64',linux_aarch64_data))]) 52 | linux_aarch64_url = requests.post("https://catbox.moe/user/api.php", data=files,headers={'Content-Type': files.content_type}).text 53 | if not linux_aarch64_url.startswith("http"): 54 | raise Exception(f"Error:{linux_aarch64_url}") 55 | 56 | 57 | print("url准备完成:") 58 | print("version",version) 59 | print("windows_i686_url",windows_i686_url) 60 | print("linux_i686_url",linux_i686_url) 61 | print("linux_aarch64_url",linux_aarch64_url) 62 | 63 | def create_302(url): 64 | return f"""""".encode() 67 | 68 | print("正在更新ftp远程文件...") 69 | ftp = FTP(FTP_HOST) 70 | ftp.login(FTP_USER,FTP_PASSWORD) 71 | ftp.storbinary('STOR ' + 'download/latest_windows_i686.php',BytesIO(create_302(windows_i686_url))) 72 | ftp.storbinary('STOR ' + 'download/latest_linux_i686.php',BytesIO(create_302(linux_i686_url))) 73 | ftp.storbinary('STOR ' + 'download/latest_linux_aarch64.php',BytesIO(create_302(linux_aarch64_url))) 74 | ftp.storbinary('STOR ' + 'version/latest_version.php',BytesIO(version.encode())) 75 | 76 | print("everything is ok!") 77 | -------------------------------------------------------------------------------- /src/cqapi/mod.rs: -------------------------------------------------------------------------------- 1 | use std::collections::VecDeque; 2 | 3 | use crate::{httpserver::add_ws_log, mqttclient::call_mqtt_remote, G_HISTORY_LOG, RT_PTR}; 4 | 5 | fn add_history_log(msg:&str) -> Result<(), Box> { 6 | let mut lk = G_HISTORY_LOG.write()?; 7 | lk.push_back(msg.to_owned()); 8 | if lk.len() > 50 { 9 | lk.pop_front(); 10 | } 11 | Ok(()) 12 | } 13 | 14 | pub fn get_history_log() -> VecDeque { 15 | let lk_rst = G_HISTORY_LOG.read(); 16 | if let Ok(lk) = lk_rst { 17 | let ret = &*lk; 18 | return ret.to_owned(); 19 | } 20 | return VecDeque::new(); 21 | } 22 | 23 | // 获取临时目录,绝对路径,末尾有'\',utf8编码 24 | pub fn get_tmp_dir() -> Result> { 25 | let lib_path = cq_get_app_directory1()? + "tmp"; 26 | std::fs::create_dir_all(&lib_path)?; 27 | let path_str = format!("{}{}",lib_path,std::path::MAIN_SEPARATOR.to_string()); 28 | Ok(path_str) 29 | } 30 | 31 | 32 | // 获取插件的目录,绝对路径,末尾有'\',utf8编码 33 | pub fn cq_get_app_directory1() -> Result> { 34 | let curexedir = std::env::current_exe()?; 35 | let curdir = curexedir.parent().ok_or("无法获得当前可执行文件的父目录")?; 36 | let path = curdir.join("plus_dir"); 37 | std::fs::create_dir_all(&path)?; 38 | let path_str = format!("{}{}",path.to_str().unwrap(),std::path::MAIN_SEPARATOR.to_string()); 39 | return Ok(crate::mytool::deal_path_str(&path_str).to_string()); 40 | } 41 | 42 | // 获取应用目录,绝对路径,末尾有'\',utf8编码 43 | pub fn cq_get_app_directory2() -> Result> { 44 | let curexedir = std::env::current_exe()?; 45 | let curdir = curexedir.parent().ok_or("无法获得当前可执行文件的父目录")?; 46 | let path = curdir.join("plus_dir").join("default_pkg_dir"); 47 | std::fs::create_dir_all(&path)?; 48 | let path_str = format!("{}{}",path.to_str().unwrap(),std::path::MAIN_SEPARATOR.to_string()); 49 | return Ok(crate::mytool::deal_path_str(&path_str).to_string()); 50 | } 51 | 52 | // 用于发送Onebot原始数据,返回OneBot原始数据,utf8编码 53 | pub fn cq_call_api(platform:&str,self_id:&str,passive_id:&str,json_str: &str,remote_id:&str) -> String { 54 | let js_rst = serde_json::from_str(json_str); 55 | if let Err(err) = js_rst { 56 | return serde_json::json!({ 57 | "retcode":-1, 58 | "status":"failed", 59 | "data":format!("parse input json err:{:?}",err) 60 | }).to_string(); 61 | } 62 | let mut js = js_rst.unwrap(); 63 | 64 | if remote_id != "" { 65 | let ret_rsp = call_mqtt_remote(platform,self_id,passive_id,js,remote_id); 66 | if let Ok(ret) = ret_rsp { 67 | return ret.to_string(); 68 | } else { 69 | let err = ret_rsp.err().unwrap(); 70 | cq_add_log_w(&format!("调用mqtt远程失败:{:?}", err)).unwrap(); 71 | return serde_json::json!({ 72 | "retcode":-1, 73 | "status":"failed", 74 | "data":format!("call mqtt remote error:{:?}", err) 75 | }).to_string(); 76 | } 77 | } 78 | let out_str = RT_PTR.block_on(async { 79 | let ret = crate::botconn::call_api(platform,self_id,passive_id,&mut js).await; 80 | if let Ok(ret) = ret { 81 | return ret.to_string(); 82 | } else { 83 | cq_add_log_w(&format!("调用api失败:{:?}",ret)).unwrap(); 84 | } 85 | return serde_json::json!({ 86 | "retcode":-1, 87 | "status":"failed", 88 | "data":format!("call api error:{:?}",ret.err().unwrap()) 89 | }).to_string(); 90 | }); 91 | out_str 92 | } 93 | 94 | 95 | fn cq_add_log_t(_log_level:i32,log_msg: &str) -> Result> { 96 | let now: chrono::DateTime = chrono::Local::now(); 97 | let time_str = format!("{}",now.format("%Y-%m-%d %H:%M:%S%.3f").to_string()); 98 | let log_msg_with_level; 99 | if _log_level == 0 { 100 | log::info!("{}",log_msg); 101 | log_msg_with_level = format!("Info:{}",log_msg); 102 | }else { 103 | log::warn!("{}",log_msg); 104 | log_msg_with_level = format!("Warn:{}",log_msg); 105 | } 106 | let web_log = format!("{time_str} {log_msg_with_level}"); 107 | add_history_log(&web_log)?; 108 | add_ws_log(web_log); 109 | Ok(0) 110 | } 111 | 112 | // 打印日志,utf8编码 113 | pub fn cq_add_log(log_msg: &str) -> Result> { 114 | let out_str = log_msg.get(0..2000); 115 | if out_str.is_some() { 116 | Ok(cq_add_log_t(0,&format!("{}...",out_str.unwrap()))?) 117 | }else { 118 | Ok(cq_add_log_t(0,log_msg)?) 119 | } 120 | } 121 | 122 | // 打印日志,utf8编码 123 | pub fn cq_add_log_w(log_msg: &str) -> Result> { 124 | Ok(cq_add_log_t(20,log_msg)?) 125 | } -------------------------------------------------------------------------------- /src/cqevent/do_group_inc.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | 3 | use crate::{cqapi::cq_add_log_w, read_code_cache, redlang::RedLang}; 4 | 5 | use super::{get_script_info, set_normal_evt_info}; 6 | 7 | 8 | fn do_redlang(root: &serde_json::Value,ban_pkgs:&HashSet) -> Result< (), Box> { 9 | let script_json = read_code_cache()?; 10 | for i in 0..script_json.as_array().ok_or("script.json文件不是数组格式")?.len(){ 11 | let (_keyword,cffs,code,_ppfs,name,pkg_name) = get_script_info(&script_json[i])?; 12 | if ban_pkgs.contains(pkg_name) { 13 | continue; 14 | } 15 | let mut rl = RedLang::new(); 16 | if cffs == "群成员增加" { 17 | set_normal_evt_info(&mut rl, root)?; 18 | rl.pkg_name = pkg_name.to_owned(); 19 | rl.script_name = name.to_owned(); 20 | if let Err(e) = super::do_script(&mut rl,code,"normal",false) { 21 | cq_add_log_w(format!("err in do_group_increase:do_group_increase:{}", e.to_string()).as_str()).unwrap(); 22 | } 23 | } 24 | } 25 | Ok(()) 26 | } 27 | 28 | 29 | // 处理群成员增加事件 30 | pub fn do_group_inc(root: &serde_json::Value,ban_pkgs:&HashSet) { 31 | if let Err(e) = do_redlang(&root,ban_pkgs) { 32 | cq_add_log_w(format!("err in do_group_increase:do_group_increase:{}", e.to_string()).as_str()).unwrap(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/cqevent/do_group_msg.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::{HashSet, VecDeque}, rc::Rc, cell::RefCell}; 2 | 3 | use crate::{cqapi::*, mytool::{json_to_cq_str, read_json_str}, read_code_cache, redlang::RedLang, status::add_recv_group_msg, G_INPUTSTREAM_VEC, RT_PTR}; 4 | 5 | use super::{is_key_match, get_script_info, set_normal_message_info}; 6 | 7 | pub fn msg_id_map_insert(self_id:String,user_id:String,group_id:String,message_id:String) ->Result<(), Box> { 8 | let flag = self_id + &user_id + &group_id; 9 | let mut mp = crate::G_MSG_ID_MAP.write()?; 10 | if mp.contains_key(&flag) { 11 | let v = mp.get_mut(&flag).unwrap(); 12 | v.push_front(message_id.to_string()); 13 | if v.len() > 20 { 14 | v.pop_back(); 15 | } 16 | }else{ 17 | let v = VecDeque::new(); 18 | mp.insert(flag, v); 19 | } 20 | Ok(()) 21 | } 22 | 23 | fn do_redlang(root: &serde_json::Value,ban_pkgs:&HashSet) -> Result< (), Box>{ 24 | let msg = json_to_cq_str(&root)?; 25 | // 在这里处理输入流 26 | { 27 | let user_id = read_json_str(root,"user_id"); 28 | let self_id = read_json_str(root,"self_id"); 29 | let group_id = read_json_str(root,"group_id"); 30 | let message_id = read_json_str(root,"message_id"); 31 | let vec_lk = G_INPUTSTREAM_VEC.read()?; 32 | let vec_len = vec_lk.len(); 33 | for i in 0..vec_len { 34 | let st = vec_lk.get(i).unwrap(); 35 | if st.stream_type == "输入流" { 36 | if self_id == st.self_id && user_id == st.user_id && group_id ==st.group_id { 37 | let k_arc = st.tx.clone().unwrap(); 38 | k_arc.lock().unwrap().send(msg.clone())?; 39 | } 40 | }else{ 41 | if self_id == st.self_id && group_id ==st.group_id { 42 | let k_arc = st.tx.clone().unwrap(); 43 | let to_send = serde_json::json!({ 44 | "发送者ID":user_id, 45 | "消息":msg, 46 | "消息ID":message_id 47 | }); 48 | k_arc.lock().unwrap().send(to_send.to_string())?; 49 | } 50 | } 51 | } 52 | } 53 | 54 | // 数据统计 55 | { 56 | let platform = read_json_str(root,"platform"); 57 | let bot_id = read_json_str(root,"self_id"); 58 | add_recv_group_msg(&platform,&bot_id)?; 59 | } 60 | 61 | let script_json = read_code_cache()?; 62 | let mut is_set_msg_id_map = false; 63 | for i in 0..script_json.as_array().ok_or("script.json文件不是数组格式")?.len(){ 64 | let (keyword,cffs,code,ppfs,name,pkg_name) = get_script_info(&script_json[i])?; 65 | if ban_pkgs.contains(pkg_name) { 66 | continue; 67 | } 68 | let mut rl = RedLang::new(); 69 | if cffs == "群聊触发" || cffs == "群、私聊触发"{ 70 | set_normal_message_info(&mut rl, root)?; 71 | if is_set_msg_id_map == false { 72 | is_set_msg_id_map = true; 73 | let user_id = rl.get_exmap("发送者ID"); 74 | let group_id = rl.get_exmap("群ID"); 75 | let message_id = rl.get_exmap("消息ID"); 76 | let self_id = rl.get_exmap("机器人ID"); 77 | msg_id_map_insert(self_id.to_string(),user_id.to_string(),group_id.to_string(),message_id.to_string())?; 78 | } 79 | { 80 | let sender = root.get("sender").ok_or("sender not exists")?; 81 | { 82 | let role = read_json_str(sender, "role"); 83 | let role_str = match role.as_str() { 84 | "owner" => "群主", 85 | "admin" => "管理", 86 | &_ => "群员" 87 | }; 88 | rl.set_exmap("发送者权限", role_str)?; 89 | } 90 | if let Some(js_v) = sender.get("card") { 91 | rl.set_exmap("发送者名片", js_v.as_str().unwrap_or(""))?; 92 | } 93 | if let Some(js_v) = sender.get("title") { 94 | rl.set_exmap("发送者专属头衔", js_v.as_str().unwrap_or(""))?; 95 | } 96 | rl.set_exmap("当前消息",&msg)?; 97 | } 98 | if is_key_match(&mut rl,&ppfs,keyword,&msg)? { 99 | let exmap = (*rl.exmap).borrow().clone(); 100 | let code_t = code.to_owned(); 101 | let pkg_name_t = pkg_name.to_owned(); 102 | let script_name_t = name.to_owned(); 103 | RT_PTR.spawn_blocking(move ||{ 104 | let mut rl = RedLang::new(); 105 | rl.exmap = Rc::new(RefCell::new(exmap)); 106 | rl.pkg_name = pkg_name_t.to_owned(); 107 | rl.script_name = script_name_t.to_owned(); 108 | if let Err(e) = super::do_script(&mut rl,&code_t,"normal",false) { 109 | cq_add_log_w(format!("err in do_group_msg:do_redlang:{}", e.to_string()).as_str()).unwrap(); 110 | } 111 | }); 112 | } 113 | } 114 | } 115 | Ok(()) 116 | } 117 | 118 | // 处理群聊事件 119 | pub fn do_group_msg(root: &serde_json::Value,ban_pkgs:&HashSet) { 120 | 121 | if let Err(e) = do_redlang(&root,ban_pkgs) { 122 | cq_add_log_w(format!("err in do_group_msg:do_redlang:{}", e.to_string()).as_str()).unwrap(); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/cqevent/do_other_evt.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | 3 | use crate::{cqapi::{cq_add_log_w, cq_add_log}, read_code_cache, redlang::RedLang}; 4 | 5 | use super::{set_normal_evt_info, get_script_info}; 6 | 7 | fn get_evt_flag(root: &serde_json::Value) -> Result, Box>{ 8 | let post_type = root.get("post_type").ok_or("缺少post_type")?.as_str().unwrap_or(""); 9 | let mut ret_vec = vec![post_type]; 10 | match post_type { 11 | "message" => { 12 | ret_vec.push(root.get("message_type").ok_or("缺少message_type")?.as_str().unwrap_or("")); 13 | }, 14 | "notice" => { 15 | ret_vec.push(root.get("notice_type").ok_or("缺少notice_type")?.as_str().unwrap_or("")); 16 | }, 17 | "request" => { 18 | ret_vec.push(root.get("request_type").ok_or("缺少request_type")?.as_str().unwrap_or("")); 19 | }, 20 | "meta_event" => { 21 | ret_vec.push(root.get("meta_event_type").ok_or("缺少meta_event_type")?.as_str().unwrap_or("")); 22 | }, 23 | "message_sent" => { 24 | ret_vec.push(root.get("message_type").ok_or("message_type")?.as_str().unwrap_or("")); 25 | }, 26 | _ => { 27 | return None.ok_or(format!("unkown post_type:{}",post_type))?; 28 | } 29 | } 30 | ret_vec.push(match root.get("sub_type") { 31 | Some(v) => { 32 | v.as_str().unwrap_or("") 33 | }, 34 | None => { 35 | "" 36 | } 37 | }); 38 | Ok(ret_vec) 39 | } 40 | 41 | fn do_redlang(root: &serde_json::Value,ban_pkgs:&HashSet) -> Result<(), Box>{ 42 | let script_json = read_code_cache()?; 43 | let evt_flag = get_evt_flag(root)?; 44 | cq_add_log(&format!("收到事件:`{}`",evt_flag.join(":"))).unwrap(); 45 | for i in 0..script_json.as_array().ok_or("script.json文件不是数组格式")?.len(){ 46 | let (keyword,cffs,code,_ppfs,name,pkg_name) = get_script_info(&script_json[i])?; 47 | if ban_pkgs.contains(pkg_name) { 48 | continue; 49 | } 50 | let mut rl = RedLang::new(); 51 | if cffs == "事件触发" { 52 | set_normal_evt_info(&mut rl, root)?; 53 | let key_vec = keyword.split(":").collect::>(); 54 | let mut is_match = true; 55 | if !(key_vec.len() == 1 && key_vec[0].trim() == "") { // 如果关键字为空,则直接匹配 56 | for j in 0..key_vec.len() { 57 | if &key_vec.get(j).unwrap_or(&"").trim() != evt_flag.get(j).unwrap_or(&""){ 58 | is_match = false; 59 | break; 60 | } 61 | } 62 | } 63 | if is_match { 64 | rl.pkg_name = pkg_name.to_owned(); 65 | rl.script_name = name.to_owned(); 66 | if let Err(e) = super::do_script(&mut rl,code,"normal",false) { 67 | cq_add_log_w(format!("err in do_other_evt:do_redlang:{}", e.to_string()).as_str()).unwrap(); 68 | } 69 | } 70 | } 71 | } 72 | Ok(()) 73 | } 74 | 75 | // 处理其它事件 76 | pub fn do_other_evt(root: &serde_json::Value,ban_pkgs:&HashSet) { 77 | if let Err(e) = do_redlang(&root,ban_pkgs) { 78 | cq_add_log_w(format!("err in do_other_evt:do_redlang:{}", e.to_string()).as_str()).unwrap(); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/cqevent/do_private_msg.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | 3 | use crate::{cqapi::*, mytool::{json_to_cq_str, read_json_str}, read_code_cache, redlang::RedLang, status::add_recv_private_msg, G_INPUTSTREAM_VEC}; 4 | 5 | use super::{is_key_match, get_script_info, set_normal_message_info}; 6 | 7 | fn do_redlang(root: &serde_json::Value,ban_pkgs:&HashSet) -> Result<(), Box>{ 8 | let msg = json_to_cq_str(&root)?; 9 | // 在这里处理输入流 10 | { 11 | let user_id = read_json_str(root,"user_id"); 12 | let self_id = read_json_str(root,"self_id"); 13 | let vec_lk = G_INPUTSTREAM_VEC.read()?; 14 | let vec_len = vec_lk.len(); 15 | for i in 0..vec_len { 16 | let st = vec_lk.get(i).unwrap(); 17 | if st.stream_type == "输入流" { 18 | if self_id == st.self_id && user_id == st.user_id { 19 | let k_arc = st.tx.clone().unwrap(); 20 | k_arc.lock().unwrap().send(msg.clone())?; 21 | } 22 | } 23 | } 24 | } 25 | 26 | // 数据统计 27 | { 28 | let platform = read_json_str(root,"platform"); 29 | let bot_id = read_json_str(root,"self_id"); 30 | add_recv_private_msg(&platform,&bot_id)?; 31 | } 32 | 33 | let script_json = read_code_cache()?; 34 | for i in 0..script_json.as_array().ok_or("script.json文件不是数组格式")?.len(){ 35 | let (keyword,cffs,code,ppfs,name,pkg_name) = get_script_info(&script_json[i])?; 36 | if ban_pkgs.contains(pkg_name) { 37 | continue; 38 | } 39 | let mut rl = RedLang::new(); 40 | if cffs == "私聊触发" || cffs == "群、私聊触发"{ 41 | rl.set_exmap("当前消息",&msg)?; 42 | set_normal_message_info(&mut rl, root)?; 43 | if is_key_match(&mut rl,&ppfs,keyword,&msg)? { 44 | rl.script_name = name.to_owned(); 45 | rl.pkg_name = pkg_name.to_owned(); 46 | if let Err(e) = super::do_script(&mut rl,code,"normal",false) { 47 | cq_add_log_w(format!("err in do_private_msg:do_redlang:{}", e.to_string()).as_str()).unwrap(); 48 | } 49 | } 50 | } 51 | } 52 | Ok(()) 53 | } 54 | 55 | // 处理私聊事件 56 | pub fn do_private_msg(root: &serde_json::Value,ban_pkgs:&HashSet) { 57 | if let Err(e) = do_redlang(&root,ban_pkgs) { 58 | cq_add_log_w(format!("err in do_private_msg:do_redlang:{}", e.to_string()).as_str()).unwrap(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/initevent/mod.rs: -------------------------------------------------------------------------------- 1 | use crate::{read_code_cache, cqapi::cq_add_log_w}; 2 | 3 | 4 | fn get_script_info<'a>(script_json:&'a serde_json::Value) -> Result<(&'a str,&'a str,&'a str,&'a str), Box>{ 5 | let pkg_name_opt = script_json.get("pkg_name"); 6 | let mut pkg_name = ""; 7 | if let Some(val) = pkg_name_opt { 8 | pkg_name = val.as_str().ok_or("pkg_name不是字符串")?; 9 | } 10 | let name = script_json.get("name").ok_or("脚本中无name")?.as_str().ok_or("脚本中name不是str")?; 11 | let node = script_json.get("content").ok_or("script.json文件缺少content字段")?; 12 | let cffs = node.get("触发方式").ok_or("脚本中无触发方式")?.as_str().ok_or("脚本中触发方式不是str")?; 13 | let code = node.get("code").ok_or("脚本中无code")?.as_str().ok_or("脚本中code不是str")?; 14 | return Ok((cffs,code,name,pkg_name)); 15 | } 16 | 17 | // 处理init事件 18 | pub fn do_init_event(pkg_name_opt:Option<&str>) -> Result> { 19 | let script_json = read_code_cache()?; 20 | for i in 0..script_json.as_array().ok_or("script.json文件不是数组格式")?.len(){ 21 | let (cffs,code,name,pkg_name) = get_script_info(&script_json[i])?; 22 | let mut rl = crate::redlang::RedLang::new(); 23 | if cffs == "框架初始化" { 24 | rl.pkg_name = pkg_name.to_owned(); 25 | if pkg_name_opt.is_none() || pkg_name_opt.unwrap() == rl.pkg_name { 26 | rl.script_name = name.to_owned(); 27 | let ret = crate::cqevent::do_script(&mut rl,&code,"init",false); 28 | if let Err(err) = ret{ 29 | cq_add_log_w(&format!("{}",err)).unwrap(); 30 | } 31 | } 32 | } 33 | } 34 | Ok(0) 35 | } -------------------------------------------------------------------------------- /src/libload/mod.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashSet, ffi::{c_char, c_int, CStr}, fs, sync::Arc}; 2 | 3 | use crate::{cqapi::{cq_add_log, cq_add_log_w, cq_get_app_directory1}, redlang::RedLang, LibStruct, G_LIB_AC, G_LIB_MAP}; 4 | 5 | fn gen_lib_ac() -> c_int { 6 | let mut lk = G_LIB_AC.lock().unwrap(); 7 | *lk += 1; 8 | *lk 9 | } 10 | 11 | 12 | // pub fn get_sys_and_arch() -> String { 13 | // let mut arch = std::env::consts::ARCH; 14 | // if arch == "x86" { 15 | // arch = "i686"; 16 | // } 17 | // return format!("{}_{}",std::env::consts::OS,arch); 18 | // } 19 | 20 | pub fn init_lib() -> Result<(), Box> { 21 | 22 | 23 | // 创建lib目录 24 | let lib_path = cq_get_app_directory1().unwrap() + "lib"; 25 | std::fs::create_dir_all(&lib_path)?; 26 | // let sys_arch = get_sys_and_arch(); 27 | let dll_extension = std::env::consts::DLL_EXTENSION; 28 | 29 | // 下载tx_silk,tx_silk用于将语音(mp3、flac、wav)转换为tx支持的silk语音 30 | // let file_name = format!("redlib_tx_silk_{sys_arch}.{dll_extension}"); 31 | // let file_url = format!("https://github.com/super1207/redlib_tx_silk/releases/latest/download/{file_name}"); 32 | // let file_path = lib_path.clone() + &std::path::MAIN_SEPARATOR.to_string() + &file_name; 33 | 34 | // RT_PTR.block_on(async { 35 | // // 只有windows和android才能直接从网络下载动态库 36 | // if std::env::consts::OS == "windows" || std::env::consts::OS == "android"{ 37 | // cq_add_log(&format!("download {file_url} ...")).unwrap(); 38 | // if let Err(err) = download_github(&file_url, &file_path).await { 39 | // cq_add_log_w(&format!("Err:{err:?}")).unwrap(); 40 | // } else { 41 | // cq_add_log(&format!("download {file_path} ok")).unwrap(); 42 | // } 43 | // } 44 | // }); 45 | 46 | // 加载三方库 47 | let dirs = fs::read_dir(lib_path)?; 48 | let platform_end = &format!(".{dll_extension}"); 49 | for dir in dirs { 50 | let path = dir?.path(); 51 | if path.is_file() { 52 | let file_name = path.file_name().ok_or("获取文件名失败")?; 53 | let file_name_str = file_name.to_string_lossy(); 54 | if !file_name_str.to_lowercase().ends_with(platform_end){ 55 | continue; 56 | } 57 | let file_path = path.to_str().ok_or("获取目录文件异常")?.to_owned(); 58 | unsafe { 59 | let lib; 60 | if let Ok(lib_t) = libloading::Library::new(path.to_owned()) { 61 | lib = Arc::new(lib_t); 62 | }else { 63 | cq_add_log_w(&format!("加载库失败:{file_name_str},不支持的动态库格式")).unwrap(); 64 | continue; 65 | } 66 | 67 | // 检查版本号 68 | let api_version_fun_rst = lib.get:: c_int>>(b"redreply_api_version"); 69 | if api_version_fun_rst.is_err() { 70 | continue; 71 | } 72 | let ac = Box::new(gen_lib_ac()); 73 | let api_version_fun = api_version_fun_rst.unwrap(); 74 | let api_version:c_int = api_version_fun(*ac); 75 | // 当前只支持版本号为1 76 | if api_version != 1 { 77 | continue; 78 | } 79 | 80 | cq_add_log(&format!("加载库成功:{file_name_str}")).unwrap(); 81 | 82 | //执行到这里,说明插件加载成功,应该保存起来了 83 | { 84 | let mut lk = G_LIB_MAP.write().unwrap(); 85 | lk.insert(*ac,LibStruct{ 86 | lib:lib.clone(), 87 | path: file_path, 88 | regist_fun: HashSet::new(), 89 | ac:*ac 90 | }); 91 | } 92 | 93 | // 注册命令 94 | let regist_fun_rst = lib.get::>(b"redreply_regist_cmd"); 95 | extern "system" fn callback(ac_ptr:*const c_int,cmdarr:*const c_char) { 96 | let ac = unsafe { *ac_ptr }; 97 | let cmdarr_cstr = unsafe { CStr::from_ptr(cmdarr) }; 98 | let cmdarr_str_rst = cmdarr_cstr.to_str(); 99 | if cmdarr_str_rst.is_err() { 100 | return; 101 | } 102 | let cmdarr_str = cmdarr_str_rst.unwrap(); 103 | let mut lk = G_LIB_MAP.write().unwrap(); 104 | let plus_opt = lk.get_mut(&ac); 105 | if plus_opt.is_none() { 106 | return; 107 | } 108 | let plus = plus_opt.unwrap(); 109 | let cmd_arr_rst = RedLang::parse_arr(cmdarr_str); 110 | if cmd_arr_rst.is_err() { 111 | return; 112 | } 113 | let cmd_arr = cmd_arr_rst.unwrap(); 114 | cq_add_log(&format!("注入三方命令:{cmd_arr:?}")).unwrap(); 115 | for cmd in cmd_arr { 116 | plus.regist_fun.insert(cmd.to_owned()); 117 | } 118 | 119 | } 120 | if regist_fun_rst.is_ok() { 121 | let regist_fun = regist_fun_rst.unwrap(); 122 | regist_fun(&*ac,callback); 123 | } 124 | }; 125 | } 126 | } 127 | Ok(()) 128 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | 3 | use time::UtcOffset; 4 | 5 | #[cfg(windows)] 6 | fn create_windows() { 7 | let app = fltk::app::App::default().with_scheme(fltk::app::Scheme::Gtk); 8 | 9 | // 初始化图标(只有windows)才支持托盘图标 10 | let menu_channel = tray_icon::menu::MenuEvent::receiver(); 11 | let tray_channel = tray_icon::TrayIconEvent::receiver(); 12 | let show_web = tray_icon::menu::MenuItem::new("控制面板", true, None); 13 | let help_web = tray_icon::menu::MenuItem::new("帮助文档", true, None); 14 | let log_web = tray_icon::menu::MenuItem::new("查看日志", true, None); 15 | let dir_web = tray_icon::menu::MenuItem::new("软件目录", true, None); 16 | let quit = tray_icon::menu::MenuItem::new("退出软件", true, None); 17 | let _tray_icon = { 18 | let icon_data = redlang::Asset::get("res/favicon.ico").unwrap().data; 19 | let image = image::load_from_memory(&icon_data).unwrap().into_rgba8(); 20 | let (width, height) = image.dimensions(); 21 | let rgba = image.into_raw(); 22 | let icon =tray_icon::Icon::from_rgba(rgba, width, height).expect("Failed to open icon"); 23 | let tray_menu = tray_icon::menu::Menu::new(); 24 | 25 | tray_menu.append_items(&[ 26 | &show_web, 27 | &help_web, 28 | &log_web, 29 | &dir_web, 30 | &tray_icon::menu::PredefinedMenuItem::separator(), 31 | &quit 32 | ]).unwrap(); 33 | tray_icon::TrayIconBuilder::new() 34 | .with_tooltip("欢迎使用红色问答") 35 | .with_icon(icon) 36 | .with_menu(Box::new(tray_menu)) 37 | .build() 38 | .unwrap() 39 | }; 40 | 41 | 42 | use fltk::button::*; 43 | use fltk::enums::*; 44 | 45 | use fltk::group::*; 46 | 47 | use fltk::prelude::*; 48 | 49 | use fltk::window::*; 50 | let mut wind = Window::new(446, 317, 1, 1, None); 51 | wind.set_color(Color::from_rgb(0, 0, 0)); 52 | wind.resizable(&wind); 53 | wind.set_border(false); 54 | wind.set_callback(|e|{ 55 | e.set_border(false); 56 | e.resize(e.x(), e.y(), 0, 0); 57 | }); 58 | wind.set_label("锟斤拷??烫烫烫??屯屯屯?锘銝剜�� 皜祈岫 撠舘⏛"); 59 | let mut flex_win = Flex::new(10, 10, 100, 100, None); 60 | let flex_win_t = flex_win.clone(); 61 | wind.resize_callback(move |_w,_x,_y,width,height|{ 62 | flex_win_t.clone().resize(10, 10, width-20, height-20); 63 | }); 64 | flex_win.set_type(FlexType::Column); 65 | let v = redlang::add_egg_click().unwrap(); 66 | let button_title; 67 | if v > 100 { 68 | button_title = format!("May the force be with you!Secret code:920220179\n\n\n当前:{}",v); 69 | }else{ 70 | button_title = format!("点我功德加一\n\n\n当前:{}",v); 71 | } 72 | let mut btn = Button::new(0, 0, 100, 100, &*button_title); 73 | btn.set_label_color(Color::from_rgb(66, 134, 244)); 74 | btn.set_color(Color::from_rgb(255, 255, 255)); 75 | btn.visible_focus(false); 76 | btn.set_callback(move |w|{ 77 | let v = redlang::add_egg_click().unwrap(); 78 | if v > 100 { 79 | let button_title = format!("May the force be with you!Secret code:920220179\n\n\n当前:{}",v); 80 | w.set_label(&*button_title) 81 | } else { 82 | let button_title = format!("点我功德加一\n\n\n当前:{}",v); 83 | w.set_label(&*button_title) 84 | } 85 | }); 86 | flex_win.end(); 87 | wind.end(); 88 | 89 | wind.show(); 90 | 91 | wind.resize(wind.x(), wind.y(), 0, 0); 92 | 93 | while app.wait() { 94 | if let Ok(event) = menu_channel.try_recv() { 95 | if event.id == show_web.id() { 96 | let _err = redlang::show_ctrl_web(); 97 | }else if event.id == quit.id() { 98 | redlang::wait_for_quit(); 99 | } else if event.id == help_web.id() { 100 | let _err = redlang::show_help_web(); 101 | } else if event.id == log_web.id() { 102 | let _err = redlang::show_log_web(); 103 | } else if event.id == dir_web.id() { 104 | let _err = redlang::show_dir_web(); 105 | } 106 | } 107 | if let Ok(event) = tray_channel.try_recv() { 108 | match event { 109 | tray_icon::TrayIconEvent::Click { id: _, position: _, rect: _, button, button_state: _ } => { 110 | match button { 111 | tray_icon::MouseButton::Left => { 112 | wind.set_border(true); 113 | wind.resizable(&wind); 114 | wind.resize(wind.x(), wind.y(),600, 400); 115 | }, 116 | _ => {} 117 | } 118 | }, 119 | _ => {} 120 | } 121 | } 122 | 123 | let time_struct = core::time::Duration::from_millis(50); 124 | std::thread::sleep(time_struct); 125 | } 126 | } 127 | 128 | 129 | fn main() { 130 | 131 | // 初始化日志 132 | let format = "[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"; 133 | 134 | // 获得utc偏移 135 | let utc_offset; 136 | if let Ok(v) = UtcOffset::current_local_offset() { 137 | utc_offset = v; 138 | } else { 139 | // 中国是东八区,所以这里写8 hour 140 | utc_offset = UtcOffset::from_hms(8,0,0).unwrap(); 141 | } 142 | 143 | tracing_subscriber::fmt() 144 | .with_timer(tracing_subscriber::fmt::time::OffsetTime::new( 145 | utc_offset, 146 | time::format_description::parse(format).unwrap(), 147 | )).with_max_level(tracing::Level::INFO) 148 | .init(); 149 | 150 | // 初始化资源 151 | redlang::initialize(); 152 | 153 | 154 | #[cfg(windows)] 155 | create_windows(); 156 | 157 | 158 | loop { 159 | let time_struct = core::time::Duration::from_secs(1); 160 | std::thread::sleep(time_struct); 161 | } 162 | } -------------------------------------------------------------------------------- /src/mytool/all_to_silk.rs: -------------------------------------------------------------------------------- 1 | use std::io::BufReader; 2 | 3 | use super::{deal_flac, deal_silk, mp3_deal, wav_deal,deal_ogg}; 4 | 5 | 6 | #[derive(Debug)] 7 | pub struct PCMStruct{ 8 | pub channel_num:usize, // 通道数目 9 | pub bits_per_sample:usize, // 采样bit节大小 10 | pub sample_rate:usize, // 采样率 11 | pub data: Vec, 12 | } 13 | 14 | pub fn get_media_type(input:&Vec) -> &str{ 15 | if input.starts_with(&[82,73,70,70]) { 16 | return "wav"; 17 | }else if input.starts_with(&[73,68,51]) || input.starts_with(&[0xFF]){ 18 | return "mp3"; 19 | }else if input.starts_with(&[0x66,0x4C,0x61,0x43]) { 20 | return "flac"; 21 | }else if input.starts_with(&[0x02,0x23,0x21,0x53,0x49,0x4C,0x4B,0x5F,0x56,0x33]){ 22 | return "silk"; 23 | }else if input.starts_with(&[0x03,0x23,0x21,0x53,0x49,0x4C,0x4B,0x5F,0x56,0x33]){ 24 | return "silk"; 25 | } 26 | else if input.starts_with(&[0x4F,0x67,0x67,0x53]) { 27 | return "ogg"; 28 | } else{ 29 | return ""; 30 | } 31 | } 32 | 33 | 34 | 35 | pub fn all_to_silk(input:&Vec) -> Result, Box>{ 36 | let tp = get_media_type(input); 37 | let pcm; 38 | if tp == "wav"{ 39 | pcm = wav_deal::deal_wav(BufReader::new(&input[..]))?; 40 | }else if tp == "mp3" { 41 | pcm = mp3_deal::deal_mp3(BufReader::new(&input[..]))?; 42 | }else if tp == "flac" { 43 | pcm = deal_flac::deal_flac(BufReader::new(&input[..]))?; 44 | }else if tp == "ogg" { 45 | pcm = deal_ogg::deal_ogg(BufReader::new(&input[..]))?; 46 | }else if tp == "silk" { 47 | return Ok(input.to_owned()); 48 | }else { 49 | return Err("not support".into()); 50 | } 51 | let silk = deal_silk::to_qq_silk(&pcm); 52 | return Ok(silk); 53 | } 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/mytool/deal_flac.rs: -------------------------------------------------------------------------------- 1 | use std::io::BufReader; 2 | 3 | use super::all_to_silk::PCMStruct; 4 | 5 | pub fn deal_flac(bufr: BufReader<&[u8]>) -> Result> { 6 | let mut pcm = PCMStruct{ 7 | channel_num:1, 8 | bits_per_sample:32, 9 | sample_rate:24000, 10 | data: Vec::new(), 11 | }; 12 | 13 | let mut reader = claxon::FlacReader::new(bufr)?; 14 | pcm.channel_num = reader.streaminfo().channels as usize; 15 | pcm.sample_rate = reader.streaminfo().sample_rate as usize; 16 | pcm.bits_per_sample = reader.streaminfo().bits_per_sample as usize; 17 | for sample_t in reader.samples() { 18 | let sample = sample_t?; 19 | pcm.data.push(sample as f64); 20 | } 21 | return Ok(pcm); 22 | } -------------------------------------------------------------------------------- /src/mytool/deal_ogg.rs: -------------------------------------------------------------------------------- 1 | use std::io::{BufReader, Read}; 2 | 3 | use super::all_to_silk::PCMStruct; 4 | 5 | pub fn deal_ogg(mut bufr: BufReader<&[u8]>) -> Result> { 6 | let mut pcm = PCMStruct{ 7 | channel_num:2, 8 | bits_per_sample:16, 9 | sample_rate:24000, 10 | data: Vec::new(), 11 | }; 12 | let mut buf = vec![]; 13 | bufr.read_to_end(&mut buf)?; 14 | let mut reader = lewton::inside_ogg::OggStreamReader::new(std::io::Cursor::new(buf))?; 15 | pcm.channel_num = reader.ident_hdr.audio_channels as usize; 16 | pcm.sample_rate = reader.ident_hdr.audio_sample_rate as usize; 17 | while let Some(pck_samples) = reader.read_dec_packet_itl()? { 18 | for it in pck_samples { 19 | pcm.data.push(it as f64); 20 | } 21 | } 22 | return Ok(pcm); 23 | } -------------------------------------------------------------------------------- /src/mytool/deal_silk.rs: -------------------------------------------------------------------------------- 1 | use super::all_to_silk::PCMStruct; 2 | 3 | // 线性插值 4 | pub fn linear_resample(in_pcm: &Vec, out_pcm: &mut Vec) { 5 | let in_sample_count: usize = in_pcm.len() as usize; 6 | let out_sample_count: usize = out_pcm.len() as usize; 7 | for i in 0..out_sample_count { 8 | let pos_inpcm = i as f64 / out_sample_count as f64 * in_sample_count as f64; 9 | let pos_low = pos_inpcm as usize; 10 | let pos_high = (pos_inpcm + 1.0) as usize; 11 | let q_high = pos_inpcm - pos_low as f64; 12 | let q_low = pos_high as f64 - pos_inpcm; 13 | if pos_high >= in_sample_count || pos_low >= in_sample_count{ 14 | out_pcm[i] = in_pcm[in_sample_count - 1]; 15 | }else { 16 | out_pcm[i] = in_pcm[pos_high] * q_high+in_pcm[pos_low] * q_low; 17 | } 18 | 19 | } 20 | } 21 | 22 | pub fn to_qq_silk(pcm: &PCMStruct) -> Vec { 23 | 24 | // 腾讯极有可能只支持24000 25 | let out_sample_rate = 24000; 26 | 27 | // 分解通道 28 | let mut datas = vec![]; 29 | for _i in 0..pcm.channel_num { 30 | datas.push(vec![]); 31 | } 32 | if pcm.data.len() % pcm.channel_num != 0 { // 防止下面数组越界 33 | return vec![]; 34 | } 35 | let mut index = 0usize; 36 | loop { 37 | if index + pcm.channel_num > pcm.data.len() { 38 | break; 39 | } 40 | for i in 0..pcm.channel_num { 41 | let mut dat = pcm.data[index + i]; 42 | // 采样深度缩放为16位(此处可以决定音量),silk只支持16位 43 | dat *= f64::powi(2.0, 16 - pcm.bits_per_sample as i32); 44 | datas[i].push(dat); 45 | } 46 | index += pcm.channel_num; 47 | } 48 | 49 | // 转为单通道(自适应混音加权) 50 | let coloum = datas[0].len(); // 最终合成的长度 51 | let mut f = 1.0; // 衰减因子 52 | let mut single_channel_data = vec![]; 53 | let max = 32767.0; 54 | let min = -32768.0; 55 | let mut mix_val; 56 | for i in 0..coloum { 57 | let mut sum = 0.0; 58 | for it in 0..pcm.channel_num { 59 | sum += datas[it][i]; 60 | } 61 | mix_val = sum * f; 62 | if mix_val > max { 63 | f = max / mix_val; 64 | mix_val = max; 65 | } 66 | if mix_val < min { 67 | f = min / mix_val; 68 | mix_val = min; 69 | } 70 | if f < 1.0 { 71 | f += (1.0 - f) / 16.0; 72 | } 73 | single_channel_data.push(mix_val); 74 | } 75 | 76 | // 采样率转换24000(使用线性插值) 77 | let new_24000_data_len = ((single_channel_data.len() as f64 * pcm.channel_num as f64/ pcm.sample_rate as f64) * out_sample_rate as f64).round() as usize; 78 | let mut new_24000_data = vec![0f64; new_24000_data_len]; 79 | linear_resample(&single_channel_data, &mut new_24000_data); 80 | 81 | // 转为单通道i16 82 | let mut u16_data = vec![]; 83 | let mut index = 0usize; 84 | while index < new_24000_data_len{ 85 | let dat_avg = new_24000_data[index]; 86 | let dat_avg_u16 = dat_avg as i16; 87 | let bits = dat_avg_u16.to_le_bytes(); 88 | u16_data.push(bits[0]); 89 | u16_data.push(bits[1]); 90 | index += pcm.channel_num; 91 | } 92 | // bit_rate也最好是24000,不然可能在NTQQ上无法播放 93 | if let Ok(out) = silk_rs_no_llvm::encode_silk(u16_data, out_sample_rate, out_sample_rate, true){ 94 | return out; 95 | }else{ 96 | return vec![]; 97 | } 98 | } -------------------------------------------------------------------------------- /src/mytool/mp3_deal.rs: -------------------------------------------------------------------------------- 1 | use std::io::BufReader; 2 | 3 | use minimp3_fixed::{Decoder, Frame}; 4 | 5 | use super::all_to_silk::PCMStruct; 6 | 7 | 8 | pub fn deal_mp3(bufr: BufReader<&[u8]>) -> Result> { 9 | let mut pcm = PCMStruct{ 10 | channel_num:1, 11 | bits_per_sample:16, 12 | sample_rate:24000, 13 | data: Vec::new(), 14 | }; 15 | 16 | let mut decoder = Decoder::new(bufr); 17 | 18 | loop { 19 | match decoder.next_frame() { 20 | Ok(Frame { data, sample_rate, channels, .. }) => { 21 | pcm.sample_rate = sample_rate as usize; 22 | pcm.channel_num = channels; 23 | for it in data { 24 | pcm.data.push(it as f64); 25 | } 26 | }, 27 | Err(minimp3_fixed::Error::Eof) => break, 28 | Err(e) => { 29 | return Err(Box::new(e)); 30 | }, 31 | } 32 | } 33 | 34 | return Ok(pcm); 35 | } -------------------------------------------------------------------------------- /src/mytool/wav_deal.rs: -------------------------------------------------------------------------------- 1 | use std::io::{BufReader, Read}; 2 | 3 | use super::all_to_silk::PCMStruct; 4 | 5 | fn readn(reader: T, nbytes: u32) -> Result, Box> 6 | where 7 | T: Read, 8 | { 9 | let mut buf = Vec::with_capacity(nbytes.try_into()?); 10 | let mut chunk = reader.take(u64::from(nbytes)); 11 | let _val = chunk.read_to_end(&mut buf); 12 | Ok(buf) 13 | } 14 | 15 | fn read2(reader: &mut T) -> [u8; 2] 16 | where 17 | T: Read, 18 | { 19 | let mut buf = [0_u8; 2]; 20 | let _nbytes = reader.read(&mut buf); 21 | buf 22 | } 23 | 24 | fn read4(reader: &mut T) -> [u8; 4] 25 | where 26 | T: Read, 27 | { 28 | let mut buf = [0_u8; 4]; 29 | let _nbytes = reader.read(&mut buf); 30 | buf 31 | } 32 | 33 | 34 | 35 | pub fn deal_wav(mut bufr: BufReader<&[u8]>) -> Result> { 36 | let mut pcm = PCMStruct{ 37 | channel_num:1, 38 | bits_per_sample:16, 39 | sample_rate:24000, 40 | data: Vec::new(), 41 | }; 42 | let riff_tag = readn(&mut bufr,4)?; 43 | if String::from_utf8_lossy(&riff_tag) != "RIFF" { 44 | return Err("not a wav file".into()); 45 | } 46 | let _total_size = readn(&mut bufr,4)?; 47 | let wave_tag = readn(&mut bufr,4)?; 48 | if String::from_utf8_lossy(&wave_tag) != "WAVE" { 49 | return Err("not a wav file".into()); 50 | } 51 | let fmt_chunk_tag = readn(&mut bufr,4)?; 52 | if String::from_utf8_lossy(&fmt_chunk_tag) != "fmt " { 53 | return Err("not a wav file".into()); 54 | } 55 | let _fmt_chunk_size = readn(&mut bufr,4)?; 56 | let fmt_code = read2(&mut bufr); 57 | let fmt_code_num = u16::from_le_bytes(fmt_code); 58 | if fmt_code_num != 1 { 59 | return Err(format!("not a support wav file,fmt_code={fmt_code_num}").into()); 60 | } 61 | let num_channels = read2(&mut bufr); 62 | pcm.channel_num = u16::from_le_bytes(num_channels) as usize; 63 | let sampling_rate = read4(&mut bufr); 64 | pcm.sample_rate = u32::from_le_bytes(sampling_rate) as usize; 65 | let _byte_rate = readn(&mut bufr,4)?; 66 | let _block_alignment = readn(&mut bufr,2)?; 67 | let bits_per_sample = read2(&mut bufr); 68 | pcm.bits_per_sample = u16::from_le_bytes(bits_per_sample) as usize; 69 | let data_tag = readn(&mut bufr,4)?; 70 | let data_tag_str = String::from_utf8_lossy(&data_tag); 71 | let data; 72 | if data_tag_str == "data" { 73 | let data_size = read4(&mut bufr); 74 | data = readn(&mut bufr, u32::from_le_bytes(data_size))?; 75 | }else if data_tag_str == "LIST"{ 76 | let cover_info_len = u32::from_le_bytes(read4(&mut bufr)); 77 | readn(&mut bufr, cover_info_len)?; 78 | let data_tag = readn(&mut bufr,4)?; 79 | let data_tag_str = String::from_utf8_lossy(&data_tag); 80 | if data_tag_str != "data" { 81 | return Err("not a wav file".into()); 82 | } 83 | let data_size = read4(&mut bufr); 84 | data = readn(&mut bufr, u32::from_le_bytes(data_size))?; 85 | }else { 86 | return Err("not a wav file".into()); 87 | } 88 | // check 89 | let mod_num = pcm.bits_per_sample / 8 * pcm.channel_num; 90 | if mod_num == 0 { 91 | return Err("not a wav file".into()); 92 | } 93 | if data.len() % (pcm.bits_per_sample / 8 * pcm.channel_num) != 0 { 94 | return Err("not a wav file".into()); 95 | } 96 | let mut index:usize = 0; 97 | let per_sample_bytes = pcm.bits_per_sample / 8; 98 | while index < data.len() { 99 | if per_sample_bytes == 1 { 100 | let d = data[index] as i8 as f64; 101 | pcm.data.push(d); 102 | index += 1; 103 | } else if per_sample_bytes == 2 { 104 | if index + 1 >= data.len() { 105 | return Err("not a wav file".into()); 106 | } 107 | let d = i16::from_le_bytes([data[index],data[index+1]]) as f64; 108 | pcm.data.push(d); 109 | index += 2; 110 | } else if per_sample_bytes == 3 { 111 | if index + 2 >= data.len() { 112 | return Err("not a wav file".into()); 113 | } 114 | let d = i32::from_le_bytes([data[index],data[index+1],data[index+2],0]) as f64; 115 | pcm.data.push(d); 116 | index += 3; 117 | } else if per_sample_bytes == 4 { 118 | if index + 3 >= data.len() { 119 | return Err("not a wav file".into()); 120 | } 121 | let d = f32::from_le_bytes([data[index],data[index+1],data[index+2],data[index+3]]) as f64; 122 | pcm.data.push(d); 123 | index += 4; 124 | }else { 125 | return Err("not a wav file".into()); 126 | } 127 | } 128 | return Ok(pcm); 129 | } 130 | -------------------------------------------------------------------------------- /src/pyserver/mod.rs: -------------------------------------------------------------------------------- 1 | // 此页代码为进行任何测试,暂时不可用 2 | 3 | use crate::RT_PTR; 4 | use crate::cqapi::cq_add_log_w; 5 | use crate::httpserver::G_PY_HANDER; 6 | use crate::httpserver::G_PY_ECHO_MAP; 7 | 8 | 9 | async fn send_to_ser(code:String) -> Result<(), Box> { 10 | let lk = G_PY_HANDER.read().await; 11 | let hand = lk.clone().ok_or("not have python env")?; 12 | hand.send(code).await?; 13 | Ok(()) 14 | } 15 | 16 | 17 | pub fn call_py_block(code:&str,input:&str) -> String { 18 | RT_PTR.block_on(async { 19 | let rst = call_py(code,input).await; 20 | match rst { 21 | Ok(s) => s, 22 | Err(err) => { 23 | cq_add_log_w(&err.to_string()).unwrap(); 24 | "".to_string() 25 | } 26 | } 27 | }) 28 | } 29 | 30 | async fn call_py(code:&str,input:&str) -> Result>{ 31 | let uid = uuid::Uuid::new_v4().to_string(); 32 | let send_json = serde_json::json!({ 33 | "echo":uid, 34 | "code":code, 35 | "input":input 36 | }); 37 | let (tx, mut rx) = tokio::sync::mpsc::channel::(1); 38 | { 39 | let mut lk = G_PY_ECHO_MAP.write().await; 40 | lk.insert(uid.clone(), tx); 41 | } 42 | let _guard = scopeguard::guard(uid, |uid| { 43 | RT_PTR.spawn(async move { 44 | G_PY_ECHO_MAP.write().await.remove(&uid); 45 | }); 46 | }); 47 | let ret = send_to_ser(send_json.to_string()).await; 48 | if ret.is_err() { 49 | cq_add_log_w(&format!("call_py err:{:?}",ret.err())).unwrap(); 50 | return Ok("".to_string()); 51 | } 52 | tokio::select! { 53 | std::option::Option::Some(val) = rx.recv() => { 54 | return Ok(val); 55 | }, 56 | _ = tokio::time::sleep(std::time::Duration::from_secs(90)) => { 57 | cq_add_log_w(&format!("接收python返回超时")).unwrap(); 58 | return Ok("".to_string()); 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /src/redlang/webexfun.rs: -------------------------------------------------------------------------------- 1 | use std::collections::BTreeMap; 2 | 3 | use crate::{redlang::RedLang, RT_PTR}; 4 | 5 | pub fn init_web_ex_fun_map() { 6 | fn add_fun(k_vec:Vec<&str>,fun:fn(&mut RedLang,params: &[String]) -> Result, Box>){ 7 | let mut w = crate::G_CMD_FUN_MAP.write().unwrap(); 8 | for it in k_vec { 9 | let k = it.to_string().to_uppercase(); 10 | let k_t = crate::mytool::str_to_ft(&k); 11 | if k == k_t { 12 | if w.contains_key(&k) { 13 | let err_opt:Option = None; 14 | err_opt.ok_or(&format!("不可以重复添加命令:{}",k)).unwrap(); 15 | } 16 | w.insert(k, fun); 17 | }else { 18 | if w.contains_key(&k) { 19 | let err_opt:Option = None; 20 | err_opt.ok_or(&format!("不可以重复添加命令:{}",k)).unwrap(); 21 | } 22 | w.insert(k, fun); 23 | if w.contains_key(&k_t) { 24 | let err_opt:Option = None; 25 | err_opt.ok_or(&format!("不可以重复添加命令:{}",k_t)).unwrap(); 26 | } 27 | w.insert(k_t, fun); 28 | } 29 | } 30 | } 31 | add_fun(vec!["网络-设置返回头"],|self_t,params|{ 32 | let http_header = self_t.get_coremap("网络-返回头")?.to_string(); 33 | let mut http_header_map:BTreeMap = BTreeMap::new(); 34 | if http_header != "" { 35 | for (k,v) in RedLang::parse_obj(&http_header)?{ 36 | http_header_map.insert(k, v.to_string()); 37 | } 38 | } 39 | let k = self_t.get_param(params, 0)?; 40 | let v = self_t.get_param(params, 1)?; 41 | http_header_map.insert(k, v); 42 | self_t.set_coremap("网络-返回头", &self_t.build_obj(http_header_map))?; 43 | return Ok(Some("".to_string())); 44 | }); 45 | add_fun(vec!["网络-访问参数"],|self_t,_params|{ 46 | let ret = self_t.get_coremap("网络-访问参数")?; 47 | return Ok(Some(ret.to_owned())); 48 | }); 49 | add_fun(vec!["网络-访问方法"],|self_t,_params|{ 50 | let ret = self_t.get_coremap("网络-访问方法")?; 51 | return Ok(Some(ret.to_owned())); 52 | }); 53 | add_fun(vec!["网络-访问头"],|self_t,_params|{ 54 | let ret = self_t.get_coremap("网络-访问头")?; 55 | return Ok(Some(ret.to_owned())); 56 | }); 57 | add_fun(vec!["网络-权限"],|self_t,_params|{ 58 | let ret = self_t.get_coremap("网络-权限")?; 59 | return Ok(Some(ret.to_owned())); 60 | }); 61 | add_fun(vec!["网络-访问体"],|self_t,_params|{ 62 | if self_t.req_tx.is_none() || self_t.req_rx.is_none() { 63 | let ret = self_t.get_coremap("网络-访问体")?; 64 | return Ok(Some(ret.to_owned())); 65 | } 66 | let ret_vec:Vec = RT_PTR.block_on(async { 67 | self_t.req_tx.clone().unwrap().send(true).await.unwrap(); 68 | let k = self_t.req_rx.as_mut().unwrap().recv().await.unwrap(); 69 | return k; 70 | }); 71 | self_t.req_rx = None; 72 | self_t.req_tx = None; 73 | let ret = self_t.build_bin(ret_vec); 74 | self_t.set_coremap("网络-访问体", &ret)?; 75 | return Ok(Some(ret)); 76 | }); 77 | } -------------------------------------------------------------------------------- /src/status/mod.rs: -------------------------------------------------------------------------------- 1 | use crate::{add_file_lock, del_file_lock, mytool}; 2 | use std::collections::HashMap; 3 | use std::sync::Mutex; 4 | use std::time::{Duration, Instant}; 5 | 6 | lazy_static! { 7 | static ref CACHE: Mutex> = Mutex::new(HashMap::new()); 8 | static ref LAST_FLUSH: Mutex = Mutex::new(Instant::now()); 9 | } 10 | 11 | pub fn the_500ms_timer() -> Result<(),Box> { 12 | let mut last_flush = LAST_FLUSH.lock().unwrap(); 13 | if last_flush.elapsed() >= Duration::from_secs(10) { 14 | flush_cache_to_db()?; 15 | *last_flush = Instant::now(); 16 | } 17 | Ok(()) 18 | } 19 | 20 | pub fn flush_cache_to_db() -> Result<(), Box> { 21 | let mut cache = CACHE.lock().unwrap(); 22 | if cache.is_empty() { 23 | return Ok(()); 24 | } 25 | 26 | let app_dir = crate::cqapi::cq_get_app_directory1().map_err(|err|err.to_string())?; 27 | let sql_file = app_dir + "reddat.db"; 28 | let sql_file = mytool::path_to_os_str(&sql_file); 29 | add_file_lock(&sql_file); 30 | let _guard = scopeguard::guard(sql_file.clone(), |sql_file| { 31 | del_file_lock(&sql_file); 32 | }); 33 | 34 | let conn = rusqlite::Connection::open(sql_file)?; 35 | create_table_without_lock(&conn)?; 36 | 37 | for ((platform, bot_id, field), delta) in cache.drain() { 38 | let ret_rst: Result = conn.query_row( 39 | &format!("SELECT {field} FROM STATUS_TABLE WHERE PLATFORM = ? AND BOT_ID = ?"), 40 | [&platform, &bot_id], 41 | |row| row.get(0) 42 | ); 43 | 44 | let mut value = if let Ok(v) = ret_rst { v } else { 0 }; 45 | value += delta; 46 | if value < 0 { value = 0; } 47 | 48 | if ret_rst.is_ok() { 49 | conn.execute( 50 | &format!("UPDATE STATUS_TABLE SET {field} = ? WHERE PLATFORM = ? AND BOT_ID = ?"), 51 | [&value.to_string(), &platform, &bot_id] 52 | )?; 53 | } else { 54 | conn.execute( 55 | &format!("INSERT INTO STATUS_TABLE (PLATFORM,BOT_ID,{field}) VALUES (?,?,?)"), 56 | [&platform, &bot_id, &value.to_string()] 57 | )?; 58 | } 59 | } 60 | Ok(()) 61 | } 62 | 63 | fn create_table_without_lock(conn:&rusqlite::Connection) -> Result<(),Box> { 64 | conn.execute("CREATE TABLE IF NOT EXISTS STATUS_TABLE (\ 65 | PLATFORM TEXT,\ 66 | BOT_ID TEXT,\ 67 | RECV_GROUP_MSG INTEGER DEFAULT 0,\ 68 | RECV_PRIVATE_MSG INTEGER DEFAULT 0,\ 69 | SEND_GROUP_MSG INTEGER DEFAULT 0,\ 70 | SEND_PRIVATE_MSG INTEGER DEFAULT 0,\ 71 | PRIMARY KEY(PLATFORM,BOT_ID));", [])?; 72 | Ok(()) 73 | } 74 | 75 | fn add_something(platform: &str, bot_id: &str, to_add: &str) -> Result<(),Box> { 76 | let mut cache = CACHE.lock().unwrap(); 77 | let key = (platform.to_string(), bot_id.to_string(), to_add.to_string()); 78 | *cache.entry(key).or_insert(0) += 1; 79 | Ok(()) 80 | } 81 | 82 | pub fn add_recv_group_msg(platform:&str,bot_id:&str) -> Result<(),Box> { 83 | add_something(platform,bot_id,"RECV_GROUP_MSG")?; 84 | Ok(()) 85 | } 86 | 87 | 88 | pub fn add_recv_private_msg(platform:&str,bot_id:&str) -> Result<(),Box> { 89 | add_something(platform,bot_id,"RECV_PRIVATE_MSG")?; 90 | Ok(()) 91 | } 92 | 93 | pub fn add_send_private_msg(platform:&str,bot_id:&str) -> Result<(),Box> { 94 | add_something(platform,bot_id,"SEND_PRIVATE_MSG")?; 95 | Ok(()) 96 | } 97 | 98 | pub fn add_send_group_msg(platform:&str,bot_id:&str) -> Result<(),Box> { 99 | add_something(platform,bot_id,"SEND_GROUP_MSG")?; 100 | Ok(()) 101 | } 102 | 103 | pub fn get_status() -> Result> { 104 | // 先从数据库读取基础数据 105 | let app_dir = crate::cqapi::cq_get_app_directory1().map_err(|err|err.to_string())?; 106 | let sql_file = app_dir + "reddat.db"; 107 | let sql_file = mytool::path_to_os_str(&sql_file); 108 | add_file_lock(&sql_file); 109 | let _guard = scopeguard::guard(sql_file.clone(), |sql_file| { 110 | del_file_lock(&sql_file); 111 | }); 112 | let conn = rusqlite::Connection::open(sql_file)?; 113 | create_table_without_lock(&conn)?; 114 | 115 | // 使用HashMap存储合并后的数据 116 | let mut result_map: HashMap<(String, String), serde_json::Value> = HashMap::new(); 117 | 118 | // 读取数据库数据 119 | let mut stmt = conn.prepare("SELECT * FROM STATUS_TABLE")?; 120 | let status_iter = stmt.query_map([], |row| { 121 | Ok(( 122 | ( 123 | row.get::<_, String>(0)?, // PLATFORM 124 | row.get::<_, String>(1)?, // BOT_ID 125 | ), 126 | serde_json::json!({ 127 | "PLATFORM": row.get::<_, String>(0)?, 128 | "BOT_ID": row.get::<_, String>(1)?, 129 | "RECV_GROUP_MSG": row.get::<_, i64>(2)?, 130 | "RECV_PRIVATE_MSG": row.get::<_, i64>(3)?, 131 | "SEND_GROUP_MSG": row.get::<_, i64>(4)?, 132 | "SEND_PRIVATE_MSG": row.get::<_, i64>(5)? 133 | }) 134 | )) 135 | })?; 136 | 137 | for status in status_iter { 138 | let (key, value) = status?; 139 | result_map.insert(key, value); 140 | } 141 | 142 | // 合并内存缓存中的数据 143 | let cache = CACHE.lock().unwrap(); 144 | for ((platform, bot_id, field), delta) in cache.iter() { 145 | let key = (platform.clone(), bot_id.clone()); 146 | let entry = result_map.entry(key.clone()).or_insert(serde_json::json!({ 147 | "PLATFORM": platform, 148 | "BOT_ID": bot_id, 149 | "RECV_GROUP_MSG": 0, 150 | "RECV_PRIVATE_MSG": 0, 151 | "SEND_GROUP_MSG": 0, 152 | "SEND_PRIVATE_MSG": 0 153 | })); 154 | 155 | if let Some(current) = entry[field].as_i64() { 156 | entry[field] = serde_json::json!(current + delta); 157 | } 158 | } 159 | 160 | Ok(serde_json::Value::Array(result_map.into_values().collect())) 161 | } -------------------------------------------------------------------------------- /src/test/mod.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #[test] 5 | fn test_cqstr_to_arr() { 6 | 7 | 8 | use crate::mytool::str_msg_to_arr; 9 | let js = serde_json::json!("hello,world[CQ:image,file=xxx.png]hello,world"); 10 | let ret = str_msg_to_arr(&js).unwrap(); 11 | println!("test_cqstr_to_arr ret:`{}`",ret.to_string()); 12 | } 13 | 14 | 15 | #[test] 16 | fn test_cqparse() { 17 | use std::collections::BTreeMap; 18 | let data_str = "[CQ:image,file=620a6c143114a4feaaf9e89cc83162b6.image,subType=0,url=https://gchat.qpic.cn/]"; 19 | let pos1 = data_str.find(",").ok_or("CQ码解析失败").unwrap(); 20 | let tp = data_str.get(4..pos1).ok_or("CQ码解析失败").unwrap(); 21 | let mut sub_key_obj:BTreeMap = BTreeMap::new(); 22 | sub_key_obj.insert("type".to_string(), tp.to_string()); 23 | let re = fancy_regex::Regex::new("[:,]([^\\[\\],]+?)=([^\\[\\],]*?)(?=[\\],])").unwrap(); 24 | 25 | for cap_iter in re.captures_iter(&data_str) { 26 | let cap = cap_iter.unwrap(); 27 | let len = cap.len(); 28 | if len == 3 { 29 | let key = &cap[1]; 30 | let val = &cap[2]; 31 | let key = key.replace("[", "["); 32 | let key = key.replace("]", "]"); 33 | let key = key.replace(",", ","); 34 | let key = key.replace("&", "&"); 35 | let val = val.replace("[", "["); 36 | let val = val.replace("]", "]"); 37 | let val = val.replace(",", ","); 38 | let val = val.replace("&", "&"); 39 | sub_key_obj.insert(key, val); 40 | } 41 | } 42 | println!("{:?}",sub_key_obj); 43 | } 44 | 45 | #[test] 46 | fn test_redformat() { 47 | // fn is_black_char(ch: char) -> bool { 48 | // ch == ' ' || ch == '\r' || ch == '\n' || ch == '\t' 49 | // } 50 | let test_str = "【定义变量@使用情况数组@【数组@0@0@0】】"; 51 | let content = test_str.chars().collect::>(); 52 | let mut out_content = String::new(); 53 | let mut index = 0; 54 | while index < content.len() { 55 | if content[index] != '【' { 56 | out_content.push(content[index]); 57 | index += 1; 58 | continue; 59 | } 60 | else { 61 | let next_char = content.get(index + 1).ok_or("syntax error").unwrap(); 62 | if next_char.to_owned() == '@' { 63 | let mut num = 1; 64 | for index2 in index..content.len() { 65 | if content[index2] == '【' { 66 | num += 1; 67 | } 68 | else if content[index2] == '】' { 69 | num -= 1; 70 | } 71 | if num == 0 { 72 | let s = content.get(index..index2).unwrap(); 73 | out_content.push_str(&String::from_iter(s.iter())); 74 | index = index2 + 1; 75 | break; 76 | } 77 | } 78 | if num != 0 { 79 | break; 80 | } 81 | } else { 82 | 83 | } 84 | } 85 | 86 | } 87 | 88 | } 89 | 90 | // #[test] 91 | // fn test_wav_to_pcm() { 92 | // let wav_info = crate::mytool::wav_to_pcm::WavFormat::decode("D:\\青雀语音\\71201001_cn.wav").unwrap(); 93 | 94 | // let bits_per_sample = u16::from_le_bytes(wav_info.bits_per_sample) / 8 * u16::from_le_bytes(wav_info.num_channels); 95 | // let sample_gap = (u32::from_le_bytes(wav_info.sampling_rate) as f64) / 32000.0; 96 | // let mut real_pos = 0f64; 97 | // let mut new_data = vec![]; 98 | // loop { 99 | // let index = ((real_pos as usize) / 2) * 2; 100 | // let index2 = index+(bits_per_sample as usize); 101 | // if index2 > wav_info.data.len() { 102 | // break; 103 | // } 104 | // let sample = &wav_info.data[index..index2]; 105 | 106 | // for i in 0..bits_per_sample { 107 | // let d = sample[i as usize]; 108 | // new_data.push(d); 109 | // } 110 | // real_pos += bits_per_sample as f64 * sample_gap; 111 | // } 112 | 113 | // println!("wav_info:{:?}",new_data.len()); 114 | // let mut f = std::fs::File::create("D:\\青雀语音\\71201001_cn.pcm").unwrap(); 115 | // std::io::Write::write_all(&mut f, &new_data).unwrap(); 116 | // let input = std::fs::read("D:\\青雀语音\\71201001_cn.pcm").unwrap(); 117 | // let output = silk_rs::encode_silk(input, 32000, 32000, true).unwrap(); 118 | // std::fs::write("D:\\青雀语音\\71201001_cn.silk", output).unwrap(); 119 | // } --------------------------------------------------------------------------------