Compare commits

..

1283 Commits

Author SHA1 Message Date
源文雨
7ec2b46d75 🔖 v1.6.2-beta1 2023-01-30 18:01:56 +08:00
源文雨
7cc5771a9a update deps 2023-01-30 18:00:14 +08:00
DreamZero
f96b5f8965 优化代码结构 (#565) 2023-01-30 17:42:53 +08:00
himawari
07e6f33b04 添加小说下载 (#553)
*  添加小说下载

* 🎨 修改readme

* 🎨 修lint

* 🎨 修改包

* 🎨 使用新版http封装

* 🎨 new line
2023-01-30 17:40:57 +08:00
源文雨
f1a33a1845 🔖 v1.6.1-fix1 2023-01-16 11:36:31 +08:00
源文雨
0a72566378 fix #561: render text black & shindan 2023-01-16 11:35:11 +08:00
lianhong2758
a029add486 权重查询美化 (#560) 2023-01-16 11:25:39 +08:00
源文雨
778b8749ea 🐛 修复pixiv无法获取original url 2023-01-13 16:28:17 +08:00
源文雨
7d5944fccf 🔖 v1.6.1 2023-01-13 00:51:00 +08:00
github-actions[bot]
3e16a24ab5 🎨 改进代码样式 (#559)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2023-01-12 18:21:06 +08:00
源文雨
ff682da3fe 🔥 remove atri sleep due to global latency 2023-01-12 18:17:12 +08:00
源文雨
a0120485de fix #551: atri 发图 2023-01-12 18:14:47 +08:00
源文雨
0c8e9198ee fix: atri & v1.6.1-beta5 2023-01-11 14:47:05 +08:00
源文雨
40da2481cc fix: setupool file uri 2023-01-10 14:25:24 +08:00
源文雨
a7ae56481b fix: setupool file uri 2023-01-10 14:08:00 +08:00
源文雨
f550d58ad7 fix: heisi 2023-01-10 11:02:49 +08:00
源文雨
f488b75ac6 del: heisi due to api fail 2023-01-09 22:58:04 +08:00
源文雨
4308e386b4 fix: setu 2023-01-09 22:06:14 +08:00
源文雨
df1c207d77 add plugin autowithdraw
触发者撤回时也自动撤回
2023-01-09 21:55:20 +08:00
源文雨
8ca71967b6 移除ChatGPT & 默认注释 thesaurus 2023-01-09 21:17:04 +08:00
源文雨
c99d09ea63 优化代码结构 2023-01-07 16:24:02 +08:00
方柳煜
9ce65de698 增加并发,解决FutureEvent超时问题 (#552) 2023-01-03 18:52:27 +08:00
源文雨
cc7953c486 update 服务 2022-12-30 19:36:15 +08:00
源文雨
d50f330ccf update win32 dl 2022-12-29 14:28:12 +08:00
himawari
36f2a23aa1 🐛 修复moegoe (#546) 2022-12-27 16:01:43 +08:00
Stardust·减
14b98d4006 Update moegoe,add VITS cn interface (#544)
* Update main.go

* Update main.go

* Update main.go
2022-12-26 18:50:44 +08:00
源文雨
d401136966 🔖 1.6.1-beta3 2022-12-26 13:45:24 +08:00
源文雨
d0610b152f update downloadto 2022-12-26 13:27:28 +08:00
源文雨
fa8428ae8b edit README 2022-12-26 13:12:20 +08:00
源文雨
7d1a4b4005 edit README 2022-12-26 13:11:38 +08:00
源文雨
19e3688499 fix tts 2022-12-18 10:12:55 +08:00
github-actions[bot]
b8da6f8cfd 🎨 改进代码样式 (#536)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-12-16 18:04:09 +08:00
太好听了吧
58631c5b19 ️update music (#535)
* ️update music

添加咪咕点歌

* ️update music

添加咪咕点歌功能
2022-12-16 18:02:43 +08:00
github-actions[bot]
e994768318 🎨 改进代码样式 (#534)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-12-15 22:16:01 +08:00
太好听了吧
c304d72d77 music 音乐自定义分享 (#533)
1. 酷我音乐音乐直链url和参数修改,添加音乐卡片自定义参数。
2. 酷狗音乐添加音乐卡片自定义参数。
2022-12-15 22:12:55 +08:00
DreamZero
a1f1016fb9 独立wallet插件 (#531) 2022-12-15 01:28:33 +08:00
源文雨
913f01d69f 🔖 1.6.1-beta2 2022-12-14 21:39:27 +08:00
源文雨
f56929c852 简化设置原神vits key流程 2022-12-14 21:38:55 +08:00
源文雨
e9e0498b34 fix tts 2022-12-14 20:26:37 +08:00
源文雨
b6026ee76a fix pull ci 2022-12-14 16:56:09 +08:00
源文雨
8fdc358cc5 🔖 1.6.1-beta1 2022-12-14 16:52:59 +08:00
源文雨
fef0ac6049 fix genshin tts 2022-12-14 16:52:17 +08:00
源文雨
e144db9205 fix: aireply nil 2022-12-13 20:49:34 +08:00
源文雨
825a5a0d43 🎨 edit README 2022-12-12 18:59:42 +08:00
源文雨
6dccfc862c 🎨 edit README 2022-12-12 18:58:28 +08:00
源文雨
771f93f9af fix #527:
在设置群回复模式的时候没有生效
2022-12-12 18:50:41 +08:00
源文雨
7893fc9ebe revert 2022-12-12 16:03:42 +08:00
源文雨
9b4363dda8 fix #525: chatgpt add UA/CF config 2022-12-12 16:02:17 +08:00
源文雨
257263bfa2 ✏️ edit README 2022-12-11 15:39:47 +08:00
源文雨
8f009bb4ee config.json supports wss 2022-12-11 15:38:01 +08:00
源文雨
34a3cf82e7 🎨 edit README 2022-12-11 14:34:16 +08:00
源文雨
cd927ec2c4 🎨 优化chatgpt reset 2022-12-11 14:11:38 +08:00
源文雨
1266b2378a 🎨 优化tts 2022-12-11 14:10:35 +08:00
源文雨
575d158d5a Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-12-10 14:35:32 +08:00
源文雨
a008faf805 🐛 fix push 2022-12-10 14:35:28 +08:00
github-actions[bot]
9a2081de0a 🎨 改进代码样式 (#521)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-12-10 14:29:55 +08:00
源文雨
9550b817c5 add Create Pull Request 2022-12-10 14:28:42 +08:00
源文雨
ee895e7dc4 reintroduce Commit back 2022-12-10 14:19:04 +08:00
源文雨
7aa2996540 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-12-10 14:16:35 +08:00
源文雨
725aa5b180 💩👌 make lint happy 2022-12-10 14:16:30 +08:00
jinyunboss
f96f14052e feat: 群聊中撤回消息 (#520) 2022-12-10 14:11:26 +08:00
源文雨
adfa9f9e0f 💩👌 make lint happy 2022-12-10 14:11:09 +08:00
源文雨
d8bc336006 🔖 1.6.0 2022-12-10 13:57:30 +08:00
源文雨
b69bd3d640 fix: chatgpt " 2022-12-10 13:32:49 +08:00
莫思潋
5d9ac50106 fix: aireply: ent->enr & update README & optimize bilibili match (#519) 2022-12-09 23:23:56 +08:00
源文雨
df83ffc8b0 add reset 2022-12-07 21:08:54 +08:00
源文雨
e49b568d6d add ChatGPT 2022-12-07 20:36:23 +08:00
源文雨
8399e49072 aireply supports ChatGPT 2022-12-07 19:38:23 +08:00
源文雨
d76a65ec07 fix tts 2022-12-07 11:52:16 +08:00
himawari
ed7cef7566 添加随机女装 (#514) 2022-12-05 11:34:31 +08:00
源文雨
3349ec7694 edit help 2022-12-03 17:23:06 +08:00
源文雨
11f358bcbf fix gs tts 2022-12-03 17:16:45 +08:00
源文雨
82608d01bb genshin vits add api key 2022-12-03 16:35:14 +08:00
源文雨
a93f4f68b4 🔖 1.6.0-beta3 2022-12-03 13:43:00 +08:00
源文雨
6f8c576a44 🐛 fix ttr 2022-12-03 13:40:03 +08:00
源文雨
e75fc83412 🐛 fix ttr 2022-12-03 13:31:59 +08:00
方柳煜
2e538e3905 ygo: 优化指令 (#513) 2022-12-03 12:28:57 +08:00
源文雨
a69399fa58 🔖 1.6.0-beta2 2022-12-03 12:18:27 +08:00
源文雨
3e94d27e6a update deps 2022-12-03 12:11:48 +08:00
源文雨
20293b35f8 优化simai 2022-12-03 12:10:21 +08:00
源文雨
b768e48a74 add succ hint 2022-12-02 20:35:47 +08:00
源文雨
6a64c1ffd6 增加处理{name}和{segment} 2022-12-02 20:28:18 +08:00
源文雨
3b1ad2250f 词库增加设置概率功能 2022-12-02 20:24:44 +08:00
源文雨
83778afd51 fix 2022-12-02 18:59:10 +08:00
源文雨
cbbae11fcd update deps 2022-12-02 17:54:11 +08:00
源文雨
11c01af9da thetharus 增加 傲娇 可爱 词库 2022-12-02 16:50:12 +08:00
源文雨
7547b33f65 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-12-02 14:12:43 +08:00
源文雨
4305f589df edit readme 2022-12-02 14:12:36 +08:00
方柳煜
c8684f74a8 修复重置花名册会报错问题 (#511) 2022-12-01 14:04:40 +08:00
方柳煜
7cdc92c142 Update qqwife plugin (#510) 2022-11-30 16:53:32 +08:00
lianhong2758
a7ccf302f2 更新权重查询api地址 (#509) 2022-11-28 22:16:01 +08:00
方柳煜
f4b41efc75 优化qqwife代码,增加代码可读性 (#508) 2022-11-28 11:13:26 +08:00
方柳煜
ac18d3df96 新增一些游戏王相关的插件 (#507) 2022-11-28 11:12:19 +08:00
源文雨
daff47d912 fix nsetu 2022-11-25 15:23:16 +08:00
方柳煜
27d04cbae2 Update README.md (#505) 2022-11-24 10:36:35 +08:00
方柳煜
8eef7718ee qqwife新增好感度列表功能 (#504) 2022-11-23 16:39:32 +08:00
源文雨
fb4259b696 fix 2022-11-22 17:11:11 +08:00
源文雨
eb378ea45a 🍱 更新setu数据库 2022-11-22 17:05:48 +08:00
源文雨
02992271a1 ️ update reg 2022-11-21 23:18:29 +08:00
源文雨
72b11c2717 📄 使用 AGPL v3 2022-11-21 18:45:12 +08:00
方柳煜
a55f28c006 优化代码 (#501) 2022-11-17 12:08:12 +08:00
lianhong2758
9f37962d22 QQ权重查询 (#500) 2022-11-16 23:17:53 +08:00
源文雨
8d001122e2 sync data 2022-11-15 11:50:00 +08:00
源文雨
960aa2231c 🔖 v1.6.0-beta1 2022-11-15 11:14:28 +08:00
源文雨
e55a133f00 🎨 新服务列表 2022-11-15 11:13:25 +08:00
himawari
4075c92e53 添加qq空间表白墙 (#489) 2022-11-13 18:03:15 +08:00
方柳煜
743e5509a2 全新的guessmusic插件 (#499) 2022-11-13 18:01:15 +08:00
lianhong2758
1c93611a16 更正插件名称 (#497) 2022-11-13 17:58:18 +08:00
GenesisAN
df8a320fbe fix baiduaudit的正则错误 (#495)
修复一个正则错误,导致不能正确解析第二个ApiKey的问题
2022-11-12 11:16:31 +08:00
莫思潋
8e8464d727 调整以图绘图 (#493) 2022-11-10 18:30:27 +08:00
源文雨
356d1dfe4d 🐛 ms5 cat panic 2022-11-10 15:15:11 +08:00
源文雨
d185de0f3d fix: 设精 2022-11-10 10:26:15 +08:00
源文雨
644a6cdcc2 fix: 设精 2022-11-09 23:28:08 +08:00
源文雨
85f5fb2d87 🔖 v1.5.2 2022-11-09 15:15:22 +08:00
源文雨
8674c14754 🔖 v1.5.2 2022-11-09 14:54:52 +08:00
DreamZero
6c2fc1b4c2 恢复注册方式 (#491) 2022-11-09 13:29:07 +08:00
源文雨
5d94980e7c 优化设精 2022-11-07 12:26:13 +08:00
源文雨
9bed71a99f feat: job drop limit due to 事件环 2022-11-07 11:04:09 +08:00
方柳煜
6faa2b65e2 添加设精功能 (#488) 2022-11-06 10:42:04 +08:00
lianhong2758
98812b103e 第三次提交兽语加密 (#486) 2022-11-05 22:15:34 +08:00
himawari
deb655de36 Feature huggingface (#478) 2022-11-05 17:32:31 +08:00
方柳煜
8d1c18cb4a Update command.go (#487) 2022-11-05 11:10:36 +08:00
DreamZero
88824126f7 add: 添加Brief (#482)
* add brief

* fix: README中插件位置
2022-11-04 12:12:47 +08:00
喵酱
68a9ecf995 修改了两处错误的文案 (#481) 2022-11-03 22:26:43 +08:00
方柳煜
57404b2dcd 优化签到插件,qqwife插件添加礼物系统 (#480) 2022-11-03 16:38:48 +08:00
源文雨
29705c63c9 doc: 添加项目趋势图 2022-11-02 13:19:57 +08:00
源文雨
5a854d9715 options add brief & banner 2022-11-01 11:30:05 +08:00
源文雨
eb1cbeae3f 🎨 优化事件环 2022-10-30 00:07:17 +08:00
weigui404
b6246cfee6 Update README.md (#479)
2022-10-30 00:03:32 +08:00
源文雨
0619000f9a 🎨 优化事件环 2022-10-29 20:16:02 +08:00
源文雨
01361781c8 🎨 增加最大处理时间 2022-10-29 11:25:50 +08:00
源文雨
3c03a308b3 fix #421: 增加全局响应延迟与处理不及消息的丢弃 2022-10-28 17:41:28 +08:00
源文雨
7895e48420 update zb: 事件环 2022-10-28 16:18:03 +08:00
源文雨
ba15713b99 update zb: 事件环 2022-10-28 15:27:29 +08:00
源文雨
bd98fa3aed update zb: 事件环 2022-10-28 14:44:32 +08:00
源文雨
fce75a9475 🔖 v1.5.2-beta2 2022-10-28 12:50:16 +08:00
源文雨
7616d5759f fix nsetu 循环触发 2022-10-28 11:40:58 +08:00
源文雨
ea2c81a9c7 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-10-28 11:35:18 +08:00
源文雨
37cff9ff31 update reg 2022-10-28 11:35:11 +08:00
MoeMagicMango
b8d3d6af9b 修改漂流瓶的帮助 (#477) 2022-10-28 10:50:51 +08:00
MoeMagicMango
fdf90a72cc feat: 全局漂流瓶 (#474)
* feat: remove driftbottle and push bottle global plugin.

* Reverse name

* change by requests
2022-10-28 00:24:57 +08:00
DreamZero
ba0c05a774 change: 新的缓存池key (#476) 2022-10-28 00:20:19 +08:00
DreamZero
3250ec14ac fix: tarot (#475)
* fix tarot get img

* change: use sendtoslef check cache

但是好像过慢

* change: use imgpool

* fix

感觉改不好了

* fix: 修改变量赋值顺序
2022-10-28 00:00:43 +08:00
源文雨
ce2f390361 update md5 2022-10-27 16:57:16 +08:00
方柳煜
71434232fe 修复help显示问题 (#473)
* 修复help显示问题

* Update command.go

* Update wenxinAI.go

* Update README.md
2022-10-27 11:04:10 +08:00
GenesisAN
852629fa2e add:百度内容审核插件 (#468) 2022-10-25 18:43:58 +08:00
源文雨
f10676d16d 🔖 v1.5.2-beta1 2022-10-24 23:46:59 +08:00
方柳煜
d43ea7df1d 扩增文心AI的功能,修复猜歌的权限问题 (#471) 2022-10-24 23:36:28 +08:00
方柳煜
21712c6299 扩展aipaint指令 (#472) 2022-10-24 23:35:43 +08:00
himawari
2fc47a38fa 🎨 优化aipaint撤回,nihongo搜索 (#470) 2022-10-23 16:50:47 +08:00
源文雨
cbb4408668 fix tarot 2022-10-22 12:12:46 +08:00
源文雨
a0df41b859 fix tarot 2022-10-22 12:01:45 +08:00
DreamZero
494c1b33b4 fix: 因为gitcode反爬导致tarot插件图片获取失败 (#465)
* fix tarot get img

* change: use sendtoslef check cache

但是好像过慢

* change: use imgpool

* fix

感觉改不好了
2022-10-22 11:53:46 +08:00
DreamZero
2034d91912 fix: 以图搜图合并转发 (#467) 2022-10-20 00:17:00 +08:00
源文雨
235ced0b78 🔖 v1.5.1 2022-10-16 12:59:24 +08:00
源文雨
3339b6a16f fix runcode 2022-10-15 14:12:36 +08:00
weigui404
c08e3dfe4a Update setu_geter.go (#452) 2022-10-15 10:23:24 +08:00
himawari
894cf41d37 🎨 优化鉴赏图片, 文本重用 (#451) 2022-10-14 20:47:34 +08:00
源文雨
55aa869b1a update deps 2022-10-14 14:30:05 +08:00
himawari
42b18619c3 Feature jptingroom (#448) 2022-10-14 13:58:52 +08:00
himawari
b0c57dfec5 Feature aipaint (#450) 2022-10-14 13:57:42 +08:00
himawari
bdbcf2a5f8 Feature alipayvoice (#449)
*  添加支付宝到账

*  添加readme
2022-10-14 13:53:20 +08:00
源文雨
7807e68519 add plugin Heisi 2022-10-13 11:13:43 +08:00
方柳煜
4cd81cb2e9 更新QQ音乐点歌API,修复猜歌panic (#444) 2022-10-12 23:45:31 +08:00
方柳煜
dc34a33346 修复tts默认语音设置不成功问题 (#445)
* Update main.go

* Update ai_tts.go
2022-10-12 23:43:52 +08:00
方柳煜
2922854f96 百度文心AI画图插件 (#442) 2022-10-12 16:44:05 +08:00
源文雨
29c85442ff update deps 2022-10-11 23:43:21 +08:00
源文雨
048cbf51ca update deps 2022-10-11 13:56:25 +08:00
方柳煜
467dd2ea65 猜歌插件更改为本地猜歌 (#439) 2022-10-11 00:06:50 +08:00
源文雨
aef678be5c Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-10-10 10:12:35 +08:00
源文雨
77f7567b29 fix: nwife dup slash & genshin vits 2022-10-10 10:12:23 +08:00
MoeMagicMango
c3c0685d3a fix:换成网易云官方的api (#440) 2022-10-09 23:12:09 +08:00
源文雨
c4c3f79c8c 💩👌 make lint happy 2022-10-08 10:57:01 +08:00
源文雨
9cb54a34da 🎨 优化bilibili 2022-10-07 12:21:20 +08:00
源文雨
519ae62760 fix breakrepeat shuffle 2022-10-07 10:49:55 +08:00
方柳煜
6971da1abc fix #433 修复重置之后第一个人娶群友不登记问题 (#435)
* Update command.go

* Update function.go

* Update command.go

* Update function.go
2022-10-07 10:26:23 +08:00
源文雨
5f3054d344 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-10-05 17:19:47 +08:00
源文雨
5b586a7402 💩👌 make lint happy 2022-10-05 17:18:51 +08:00
方柳煜
f2ff66ec1d 修复qqwife bug,优化程序 (#432)
* Update command.go

* Update function.go

* Update command.go
2022-10-05 17:18:02 +08:00
源文雨
92b9bab76a edit README 2022-10-05 12:23:29 +08:00
源文雨
4609985b79 优化代码结构 2022-10-05 12:09:09 +08:00
源文雨
6cf14fc7dd 🔖 v1.5.1-beta5 2022-10-04 22:19:11 +08:00
源文雨
053363f781 优化代码结构 2022-10-04 22:18:20 +08:00
源文雨
e319bd61f1 fix baseamasiro 2022-10-04 21:15:54 +08:00
源文雨
baad83172f fix gitcode 图床 2022-10-04 17:54:43 +08:00
源文雨
4b288a59b9 🐛 hyaku 2022-10-04 16:39:18 +08:00
源文雨
a2ada0b67e 🔥🐛 fix lazy data & add base天城文 2022-10-03 23:22:40 +08:00
莫思潋
97fea6a93a fix: []message.MessageSegment->message.Message (#429) 2022-10-03 19:54:39 +08:00
源文雨
145a9fb0b1 fix 64gua 2022-10-02 11:11:05 +08:00
源文雨
202d5e41a1 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-10-01 23:46:37 +08:00
源文雨
a64bead5e6 base64卦加解密 2022-10-01 23:46:28 +08:00
DreamZero
f9b84f8cb1 fix lolicon panic and more plugin use forward (#426)
* fix lolicon panic and more plugin use forward

* add back lolicon imgpool

* 带tag不使用缓存
2022-09-26 18:07:56 +08:00
方柳煜
76e0c13f89 好感度需发“重置所有花名册”才能使用 (#423)
* Update function.go

* Update command.go
2022-09-23 11:11:19 +08:00
源文雨
f9319c2a27 优化 breakrepeat 2022-09-22 11:14:24 +08:00
源文雨
295c50a0ae 调整 breakrepeat 优先级为最低 2022-09-22 10:55:44 +08:00
源文雨
942f5abbe4 🔖 v1.5.1-beta4 2022-09-22 10:49:59 +08:00
源文雨
965df40476 ⬆️ update deps 2022-09-22 10:47:11 +08:00
方柳煜
11f7f07009 扩展插件功能 (#422) 2022-09-22 10:40:26 +08:00
源文雨
76cd2afbd3 🔥 优化服务图片,删除服务详情 2022-09-21 13:55:52 +08:00
源文雨
00d07cb7af fix 2022-09-21 12:50:58 +08:00
源文雨
3234c18718 fix tts 2022-09-21 11:49:30 +08:00
源文雨
d48285c450 job 支持分群打印触发指令 2022-09-21 10:07:12 +08:00
源文雨
98ea387254 job cron 增加别名 2022-09-19 23:18:12 +08:00
源文雨
fb80ff3b74 🐛 优化 ban 2022-09-19 20:57:03 +08:00
源文雨
41e0cf8424 🐛 fix ban 2022-09-19 20:12:57 +08:00
源文雨
1bcd321477 🐛 fix ban 2022-09-19 19:49:29 +08:00
源文雨
b0482ee84b fix go.sum 2022-09-17 20:59:55 +08:00
源文雨
404f4041a9 🐛 fix b14 panic on some platform 2022-09-17 20:49:53 +08:00
源文雨
f6d6375667 🐛 fix b14 panic on some platform 2022-09-17 20:44:15 +08:00
源文雨
04acf4af49 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-09-17 18:04:09 +08:00
源文雨
df6957cfb6 🔖 v1.5.1-beta3 2022-09-17 18:03:50 +08:00
himawari
d3ab1e1560 Refactor image (#419) 2022-09-17 14:53:25 +08:00
源文雨
598a255e34 make lint happy 2022-09-17 14:50:29 +08:00
源文雨
b4418fda55 🐛 fix 2022-09-17 14:42:26 +08:00
源文雨
3f26dde791 fix: /ban 2022-09-17 14:36:55 +08:00
MoeMagicMango
14d81411b1 Optimize: 更换经常出问题的iw233接口为MoeHu (#412) 2022-09-17 13:43:38 +08:00
莫思潋
4b667835f9 fix: 小鸡词典 (#410)
* - 调整触发器符合说明
- 减少查不到信息的情况
- 增加图片

* typo: imgURL

* - 改用foreach
- 增加被jikipedia封禁的提示

* 对于bilibili,在readme种引入了一键获取cookie工具

* 顺lint心意
2022-09-16 10:10:21 +08:00
莫思潋
002f971882 feat: 小鸡词典查梗 (#408) 2022-09-12 20:04:35 +08:00
源文雨
99a8fcd73a disable commit back 2022-09-12 20:02:39 +08:00
源文雨
3705da38b7 update deps 2022-09-12 19:58:46 +08:00
源文雨
32afee62c5 🐛 ban 人有时失灵 2022-09-12 19:21:46 +08:00
方柳煜
a5ecb4bf7d 修改tts指令使用权限,防止泛用滥用 (#400)
* 修改指令权限,防止泛用

* Update ai_tts.go

* Update ai_tts.go

* Update ai_tts.go
2022-09-12 18:53:53 +08:00
源文雨
1a424ebcd0 优化显示 2022-09-11 22:43:56 +08:00
源文雨
6a44331edd 🔖 v1.5.1-beta2 2022-09-11 10:32:35 +08:00
源文雨
4e78f43649 优化 2022-09-10 13:29:04 +08:00
源文雨
ca7ac08808 优化输出 2022-09-10 13:24:15 +08:00
源文雨
3351450d88 优化显示 2022-09-10 13:21:17 +08:00
源文雨
fa82bdec79 event master check default off 2022-09-10 13:14:43 +08:00
源文雨
0860a105ed 优化代码结构 2022-09-10 11:58:48 +08:00
Jiang-Red
b834307178 新插件event, 好友申请群聊邀请事件处理 (#403) 2022-09-10 11:01:24 +08:00
源文雨
fafe24f1e4 💩👌 make lint happy 2022-09-09 09:54:33 +08:00
源文雨
6f1ec04ac8 Revert "修正moegoe节之Readme (#402)" (#404)
This reverts commit 263278d71d.
2022-09-09 09:49:13 +08:00
Stardust·减
263278d71d 修正moegoe节之Readme (#402)
* Update README.md
2022-09-08 00:04:51 +08:00
源文雨
9ee5b044b4 🐛 fix engine hook 2022-09-07 00:35:08 +08:00
源文雨
21bfa14b55 更改 ban 时间为 10 分 2022-09-06 21:35:31 +08:00
源文雨
0e2d717aa6 添加ban人记忆 2022-09-06 21:24:49 +08:00
源文雨
f5d2bd78b9 添加ban人记忆 2022-09-06 21:24:19 +08:00
源文雨
ef9f764fa0 添加ban人记忆 2022-09-06 21:20:32 +08:00
源文雨
3cfe1a6960 format 2022-09-06 20:33:05 +08:00
源文雨
9387a48b5b format 2022-09-06 20:32:50 +08:00
源文雨
3812150669 edit help 2022-09-06 20:30:50 +08:00
源文雨
4ca100b0bf fix 2022-09-06 20:27:37 +08:00
源文雨
43dee54678 fix 2022-09-06 20:26:21 +08:00
源文雨
14786a94bf 优化 2022-09-06 20:11:40 +08:00
源文雨
98a652f440 优化 2022-09-06 20:02:14 +08:00
源文雨
a004ed8064 优化 2022-09-06 20:00:59 +08:00
源文雨
37b0edde38 add help 2022-09-06 19:51:11 +08:00
源文雨
fd9f19562f 优化 2022-09-06 19:47:26 +08:00
源文雨
acb7b42ded fix 2022-09-06 19:38:16 +08:00
源文雨
f1e4a523ce 优化显示 2022-09-06 19:35:03 +08:00
源文雨
676ea312a3 精简代码 2022-09-06 19:31:01 +08:00
源文雨
6acd930455 优化代码结构 & fix job regex 2022-09-06 19:19:04 +08:00
AkiraXie
340db0c644 improve antiabuse and add testcase (#398)
* improve antiabuse and add testcase

* fix managers link and add managers_test

* make linter happy

* add ttl.cache
2022-09-05 21:44:22 +08:00
方柳煜
f3d66b6abb 重构了qqwife的逻辑 (#395)
* Update and rename qqmapwife.go to command.go

* Add files via upload

* Update command.go

* Update command.go
2022-09-05 18:52:22 +08:00
源文雨
6b8ae2e864 🔖 v1.5.1-beta1 2022-09-01 21:29:49 +08:00
AkiraXie
664cb2f2f9 antiabuse only to me (#393) 2022-08-30 14:21:57 +08:00
AkiraXie
486292434e add anti_abuse plugin (#392)
add anti_abuse plugin
2022-08-30 11:08:00 +08:00
himawari
e5f186ace1 Feature danmakusuki (#388)
*  添加查弹幕

* 🎨 添加注释

* 🎨 优化代码

* 🎨 修lint

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-08-27 12:13:15 +08:00
himawari
0c637d4c8e 添加ahsai和breakrepeat (#384)
*  添加repeatbreak和ahsai

* 📝 添加readme说明
2022-08-27 12:09:28 +08:00
方柳煜
0943023a19 维护guessmusic和qqwife插件 (#385)
* 优化error输出,新增猜歌结束后分享歌曲

* 添加反并发,防止被多娶

* Update main.go
2022-08-26 18:44:47 +08:00
莫思潋
941d6d2884 feat: 抽塔罗牌附加解析 (#383) 2022-08-22 15:33:25 +08:00
fumiama
169af4ccce Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-08-22 13:35:40 +08:00
fumiama
6f1d0f8c02 fix gif panic 2022-08-22 11:53:52 +08:00
方柳煜
dd970b9a91 更换tts的语音api至原神语音api (#382) 2022-08-21 13:38:35 +08:00
fumiama
b997cb650e 🎨 优化 moegoe regex 2022-08-20 10:53:20 +08:00
fumiama
dd3ccf1d2f 🐛 moegoe Chinese 2022-08-20 09:26:15 +08:00
Stardust·减
52a7977461 新增VITS中文支持 (#378) 2022-08-20 09:20:39 +08:00
fumiama
70713c0719 🎨 优化 ERROR 格式 2022-08-16 15:15:29 +08:00
fumiama
b4d6e1ef04 🎨 update deps 2022-08-16 14:01:32 +08:00
fumiama
5295701541 fix aireply help 2022-08-16 11:51:01 +08:00
fumiama
43b9cea801 🔖 v1.5.0 2022-08-16 11:16:52 +08:00
fumiama
926d48af81 revert 2022-08-16 10:42:41 +08:00
尐酱油
962c48ca36 gif系列,新增,更新旧的素材 (#373) 2022-08-16 10:40:28 +08:00
fumiama
03fc569f87 更新 /用法 2022-08-16 10:38:16 +08:00
fumiama
e5b712ff39 🎨 优化 moegoe KR 2022-08-16 10:35:32 +08:00
fumiama
c7f7d0409e 优化 moegoe regex 2022-08-15 10:31:24 +08:00
fumiama
e4ec7ea5bb 🐛 moegoe regex 2022-08-14 20:45:53 +08:00
fumiama
4bf734778b edit README 2022-08-14 20:11:43 +08:00
fumiama
461325c8ca add plugin moegoe 2022-08-14 19:33:07 +08:00
源文雨
efa2ec6aac Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-08-11 19:23:12 +08:00
源文雨
eb8be40f77 fix: non-win /用法 (#370) 2022-08-11 19:22:58 +08:00
himawari
ae7e3c9c89 添加bilibilipush和完善gif文档 (#369)
*  添加bilibilipush和完善gif文档

* 🎨 修lint

* 🎨 日语语法标签匹配日文

* 🎨 优化发送逻辑和命令

* 🎨 错误处理

* 🎨 错误处理
2022-08-11 13:08:42 +08:00
莫思潋
4d68cc9fce fix: ImgFactory->Factory (#367)
* 🎨 改进代码样式

* fix: ImgFactory->Factory

* 🎨 改进代码样式

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-08-06 21:48:55 +08:00
源文雨
0226e2739a 优化 /服务列表 2022-08-06 15:48:22 +08:00
尐酱油
caa163a879 增加gif制图,菜单没写 (#363)
* Update context.go

* Update gif.go

* 🎨 改进代码样式

* Update png.go

* Update run.go

* 🎨 改进代码样式

* 修正素材地址

* Update run.go

* 呃,,,没改完整

* 继续修!!!

* Update png.go

* 🎨 改进代码样式

* Update gif.go

* 🎨 改进代码样式

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-08-06 00:06:16 +08:00
莫思潋
0e29010897 feat:将牌阵结果解析纳入转发列表 (#359) 2022-08-04 13:40:53 +08:00
源文雨
e9a8b99f4f 💩👌 make lint happy 2022-08-03 22:41:00 +08:00
莫思潋
27c637ba66 feat:小阿卡纳塔罗牌 (#346) 2022-07-29 15:26:04 +08:00
源文雨
305db3395c fix: 限速后使用功能直接导致插件崩溃 (#344) 2022-07-28 13:26:25 +08:00
himawari
3da37f0a3e Feature nihongo (#339)
*  添加日语语法学习

* 🎨 添加err
2022-07-24 23:28:30 +08:00
方柳煜
c30c9192f4 修复猜歌已知问题 (#340)
* Update main.go

* Update struct.go

* Update main.go

* Update main.go
2022-07-24 12:22:05 +08:00
源文雨
ceb3df513d 🔖 v1.5.0-beta5 2022-07-22 15:39:51 +08:00
WhitePaper
83372c4209 新增英文字符翻转插件 (#336)
*  新增英文字符翻转插件

* 🎨 代码规范优化

* 🎨 优化代码规范
2022-07-22 15:32:09 +08:00
himawari
20d5e014b7 🐛 支持json卡片 (#335)
Co-authored-by: xiaoguofan <1776620359@qq.com>
2022-07-22 11:50:38 +08:00
himawari
1c9a7eb158 🎨 修改bilibili,bilibiliparse插件结构,添加bilibili动态直播专栏解析 (#319)
* 🎨 修改bilibili,bilibiliparse插件结构,添加bilibili动态直播专栏解析

* 💩 修改大小写

* 🎨 正则全局,错误处理

* 🎨 使用json.NewDecoder()

* 💚 空使用

* 💚 修lint
2022-07-21 12:54:52 +08:00
方柳煜
31555cbf2f 修复群老婆闹离婚成功但实际没离问题 (#330) 2022-07-20 14:34:43 +08:00
方柳煜
4a1d4644ed 取消多个API依赖以提高稳定性,优化用户本地/API歌单可读性和自定义性 (#315) 2022-07-19 11:28:05 +08:00
源文雨
9182d214af ⬆️ update zb 2022-07-15 12:38:02 +08:00
源文雨
45e3383031 🔖 v1.5.0-beta4 2022-07-13 12:24:43 +08:00
himawari
fc91b69b55 添加新表情包 (#306)
*  添加新表情包

* 🐛 处理正则冲突

* 🎨 去掉反射
2022-07-12 12:25:45 +08:00
源文雨
13b6614dc2 🔖 v1.5.0-beta3 2022-07-08 21:40:51 +08:00
源文雨
fec5e4d73f 🐛 all sil 2022-07-08 21:34:23 +08:00
源文雨
585add29fc 🎨 edit README 2022-07-08 21:27:48 +08:00
源文雨
1e48e59cb7 #2: 全局启用、沉默 2022-07-08 21:20:24 +08:00
源文雨
41911af09a 🐛 b14 encode panic 2022-07-07 00:26:46 +08:00
源文雨
37b95e9559 🐛 edit README 2022-07-06 16:02:54 +08:00
源文雨
a7901745e8 🐛 response condition 2022-07-06 15:57:00 +08:00
源文雨
da9f085a50 🐛 create db panic 2022-07-06 14:59:03 +08:00
方柳煜
192c2a8bd6 修复网易云点歌API失效(405)问题 (#303)
* Update main.go

* Update selecter.go

* Update struct.go

* Update main.go
2022-07-06 13:44:24 +08:00
源文雨
e6c00e9b68 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-07-05 13:45:46 +08:00
源文雨
1faa5aa5d8 control 增加 /响应 /沉默 2022-07-05 13:45:39 +08:00
源文雨
7e7191536a 🔖 v1.5.0-beta2 2022-07-03 18:28:18 +08:00
时雨◎星空
16ff1975ff 修复猜歌插件创建config.json错误 (#296) 2022-07-03 18:20:04 +08:00
源文雨
b32c86863e edit main 2022-07-03 10:24:33 +08:00
源文雨
d9b361f765 🔖 v1.5.0-beta1 2022-07-03 09:52:01 +08:00
Fox_white
5b2810e6c5 为猜歌插件添加config (#285)
*  猜歌添加config

* 📚 猜歌帮助信息更新

* 📚 猜歌帮助信息更新

*  猜歌错误信息继承

*  错误处理

*  错误处理ep2

* 🐛 猜歌插件bug修正和命名修改

*  猜歌插件不再使用gjson

* Update struct.go

* 修复-动漫2无法下载歌曲问题

* 🐛 Resolve Compilation error

* 🐛 Resolve Lint

* 🐛 Resolve Lint

Co-authored-by: 方柳煜 <101934327+fangliuyu@users.noreply.github.com>
2022-07-03 09:25:14 +08:00
github-actions[bot]
15a5b347e8 🎨 改进代码样式 2022-06-29 12:58:24 +00:00
方柳煜
477ffa825b 优化qqwife插件,新增猜歌插件 (#283)
* 猜歌插件

* 猜歌插件

* 猜歌插件

* 优化重置花名册指令

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update main.go

* Update README.md
2022-06-29 20:57:58 +08:00
Jiang-Red
84363b1513 删除无法使用的zaobao (#278)
* drop zaobao

* edit readme

* drop zaobao
2022-06-24 21:00:55 +08:00
方柳煜
01bf6f049b 修复存在误解的文案 (#272)
* 修复存在误解的文案

* Update qqmapwife.go
2022-06-19 20:51:47 +08:00
莫思潋
a8d93de000 feat:塔罗牌阵 (#268)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim

* 优化了更多插件中使用空格的体验
- 优化了music bilibili image_finder 中使用空格的体验
- 补上了plugin_bilibili中未实现的vup开头触发
- 为plugin_bilibili_parse输出的消息加上一个换行符,优化排版

* - 调整funny
- 补回readme中bilibili_push的注释说明

* - 简化funny说明

* - 用暴力的办法使抽多张塔罗牌不重复
- 逆位的图片现在可以倒过来了

* - 解塔罗牌

* - 修改readme

* 大幅减少全局变量,简化抽塔罗牌输出

* - 更新了塔罗牌阵

* - 顺lint心意
- 添加判断避免重复装填

* 调整塔罗牌阵消息
- 用图片说明牌阵信息避免被封

* 调整DoOnceOnSuccess,减少冗余

* 🎨 改进代码样式

* 调整发送牌阵信息

* 🎨 改进代码样式

* 改回base64

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-06-18 16:51:11 +08:00
github-actions[bot]
2da5de3743 🎨 改进代码样式 2022-06-18 04:06:33 +00:00
方柳煜
bf6bac7be6 修复花名册会显示单身贵族的问题 (#269)
* 修复花名册会显示单身贵族的问题

* Update qqmapwife.go

* Update qqmapwife.go
2022-06-18 12:06:07 +08:00
源文雨
394d2e4a08 edit README 2022-06-17 11:59:26 +08:00
himawari
0dd447e270 添加txt转midi,优化midi转txt (#267)
* 🐛 长字符串发文件

*  添加txt转midi

*  音色自定义

*  添加windows脚本说明

* 🐛 修复某些midi读取不了的问题

*  多音轨转换

Co-authored-by: haibaraguo <haibaraguo@yeahka.com>
2022-06-17 11:46:09 +08:00
源文雨
92c913e3eb 🔖 1.4.1 2022-06-16 13:31:33 +08:00
github-actions[bot]
5dea461963 🎨 改进代码样式 2022-06-16 05:29:07 +00:00
方柳煜
f768081849 优化花名册名字切片报错问题 (#263) 2022-06-16 13:27:47 +08:00
himawari
668418c48a 添加mid2txt接口 (#264)
Co-authored-by: haibaraguo <haibaraguo@yeahka.com>
2022-06-16 13:27:23 +08:00
github-actions[bot]
2bf387a57c 🎨 改进代码样式 2022-06-15 04:24:49 +00:00
方柳煜
42a4726985 修复checkupdate报错问题 (#262)
* 修复checkupdate报错问题

* Update qqmapwife.go

* Update qqmapwife.go
2022-06-15 12:24:19 +08:00
源文雨
5c4b5359e0 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-06-13 13:05:42 +08:00
源文雨
8e3f56a3a2 move info 2022-06-13 13:05:21 +08:00
github-actions[bot]
91a837477a 🎨 改进代码样式 2022-06-13 04:32:42 +00:00
源文雨
a2dfc54068 🐛 fix: b14 decode 2022-06-13 12:32:09 +08:00
github-actions[bot]
7ded2fe13a 🎨 改进代码样式 2022-06-13 04:09:52 +00:00
方柳煜
b6f1b27a81 Update qqmapwife.go (#261) 2022-06-13 12:09:22 +08:00
源文雨
621fd614ea 💩👌 make lint happy 2022-06-11 21:06:08 +08:00
源文雨
be3e7c892c fix b14 2022-06-11 18:27:26 +08:00
源文雨
1f640b7644 drop webgui 2022-06-11 17:00:22 +08:00
源文雨
987b505d32 fix regex 2022-06-11 16:27:09 +08:00
源文雨
4b2f23f093 优化正则 2022-06-11 16:13:26 +08:00
源文雨
1d52d0bafc 优化 parse 2022-06-11 16:04:57 +08:00
源文雨
e73db14976 运势 add ASoul 2022-06-11 14:27:03 +08:00
源文雨
fe8a677541 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-06-11 14:16:36 +08:00
源文雨
926cba8197 运势 add ASoul 2022-06-11 14:16:22 +08:00
Jiang-Red
ee6e5db0a6 Update bilibili_parse.go (#259)
修复 粉丝数据获取出错
优化 简化数据显示
优化 不返回无效链接的错误
2022-06-11 11:53:19 +08:00
源文雨
0c62d8dd07 fix: imgfinder format 2022-06-10 23:34:05 +08:00
源文雨
d6e352b3b4 fix: imgfinder format 2022-06-10 23:28:12 +08:00
源文雨
59e46be262 fix: imgfinder format 2022-06-10 23:24:14 +08:00
源文雨
746c048550 优化代码结构 2022-06-10 19:00:27 +08:00
himawari
a92c584997 添加简易midi制作 (#257)
*  添加简易midi制作

* 🐛 修lint

Co-authored-by: haibaraguo <haibaraguo@yeahka.com>
2022-06-10 18:55:28 +08:00
源文雨
7f4c6eb4ac 🔖 1.4.1-beta6 2022-06-10 15:48:33 +08:00
源文雨
fbeb048c44 ⬆️ update sqlite 2022-06-10 15:47:47 +08:00
源文雨
9f748a8119 imgfinder add more info 2022-06-10 13:42:03 +08:00
源文雨
b9fd590095 fix #256: 关键字搜图无法使用 2022-06-10 13:21:31 +08:00
源文雨
430e210b3c update deps 2022-06-10 13:04:16 +08:00
Jiang-Red
706d54db76 更换api版bilibiliparse (#255)
* Update bilibili_parse.go

* make lint happy

* 改进提出的问题
2022-06-10 12:54:53 +08:00
源文雨
9ac276767d change reg host 2022-06-04 17:59:31 +08:00
源文雨
29144348b3 🔖 1.4.1-beta5 2022-06-04 17:27:08 +08:00
源文雨
2f91b11672 fix manager 2022-06-04 15:01:00 +08:00
源文雨
caf0ef88ac update control 2022-06-04 14:55:15 +08:00
源文雨
c8154db108 fix workflow 2022-06-02 12:38:46 +08:00
源文雨
7ce6b5592a 🎨 优化代码格式 2022-06-02 12:30:38 +08:00
源文雨
e1bc4fdf36 优化 score 2022-06-02 12:29:37 +08:00
MoeMagicMango
fd7f5f719f fix:修复API变动造成图片无法返回的问题 (#250) 2022-06-02 12:20:17 +08:00
源文雨
6678ca6c93 💩👌 make lint happy 2022-06-02 12:19:41 +08:00
源文雨
180e03e249 try fixing #249: once SIGSEGV 2022-05-30 14:43:08 +08:00
源文雨
357f15eb01 🔖 1.4.1-beta4 2022-05-29 13:11:24 +08:00
未归404
a08704b60f 更新README.md (#247) 2022-05-29 12:50:36 +08:00
源文雨
03ba81a9c5 🎨 优化 bilibiliparse 2022-05-27 19:16:13 +08:00
源文雨
2933962df8 🎨 优化 bilibiliparse 2022-05-27 19:09:44 +08:00
源文雨
4f248c4dc7 🎨 优化 bilibiliparse 2022-05-27 19:09:07 +08:00
源文雨
14096f24ba add 设置默认限速 #241 2022-05-27 01:00:48 +08:00
源文雨
c0b75accf4 fix #243: add ctrl /改变默认启用状态 2022-05-27 00:41:44 +08:00
源文雨
cb1b7d5da7 add more limiter (#241) 2022-05-26 13:55:14 +08:00
源文雨
c8072171f0 🔖 1.4.1-beta3 2022-05-25 11:58:32 +08:00
源文雨
485f6d4cef 🐛 job panic 2022-05-25 11:58:01 +08:00
源文雨
2b85097e30 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-05-24 10:56:15 +08:00
源文雨
0904789291 🔖 1.4.1-beta2 2022-05-24 10:56:00 +08:00
方柳煜
fda69793a5 修复单身技能会报错问题 (#237) 2022-05-24 10:54:11 +08:00
源文雨
3c22aaf99d 🐛 job panic 2022-05-24 10:52:49 +08:00
MoeMagicMango
151a5d480f Fix: 更换稳定的背景api + 修复因api问题签到结果无法出现但数据库已经记录的问题 (#236)
* 通过修改顺序解决签到背景API出问题

* Update sign_in.go

* 🎨 改进代码样式

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-05-21 22:53:20 +08:00
源文雨
88d136626d update deps 2022-05-20 23:36:46 +08:00
源文雨
170f5bba79 🔖 1.4.1-beta1 2022-05-20 21:15:45 +08:00
源文雨
c4cbb0cd59 添加我问你答 2022-05-20 21:13:49 +08:00
源文雨
0fa04070f1 Update README.md 2022-05-20 15:23:39 +08:00
方柳煜
f8bea241a2 修复小三技能的判断逻辑的缺陷 (#230) 2022-05-16 22:51:54 +08:00
github-actions[bot]
bb6b2e4b29 🎨 改进代码样式 2022-05-16 14:45:37 +00:00
源文雨
557251a679 saucenao 搜图 使用合并转发 2022-05-16 22:44:47 +08:00
github-actions[bot]
696783b0fe 🎨 改进代码样式 2022-05-16 06:42:24 +00:00
源文雨
6eb29d2cc9 🔖 1.4.0 2022-05-16 14:41:45 +08:00
github-actions[bot]
4b4cafcda8 🎨 改进代码样式 2022-05-16 05:40:05 +00:00
方柳煜
ed2ed8d968 修复CD共用问题,新增功能 (#229) 2022-05-16 13:39:48 +08:00
Jiang-Red
fbb387bd9f fix:saucenao插件搜图相似度判断 (#228) 2022-05-14 23:50:25 +08:00
源文雨
0db2db482f 🐛 job 注入指令结果 递归 2022-05-14 19:10:05 +08:00
himawari
af2fe727fc 添加拟声鸟类型和马丁路德骂人语录 (#227)
*  mockingbird添加类型

*  添加马丁路德骂人语录

Co-authored-by: haibaraguo <haibaraguo@yeahka.com>
2022-05-14 11:32:25 +08:00
源文雨
a7387dcf22 💩👌 make lint happy 2022-05-13 13:12:39 +08:00
github-actions[bot]
5ce44fb161 🎨 改进代码样式 2022-05-13 05:09:55 +00:00
Jiang-Red
9086b9c3ca 修复一个小问题 (#225) 2022-05-13 13:09:13 +08:00
github-actions[bot]
4837c5387a 🎨 改进代码样式 2022-05-13 05:08:51 +00:00
源文雨
5d73216238 🐛 saucenao reflect 2022-05-13 13:08:02 +08:00
源文雨
5053091e44 💩👌 make lint happy 2022-05-13 13:00:54 +08:00
源文雨
6319ed0473 hide saucenao error 2022-05-12 19:07:59 +08:00
源文雨
c67c109af6 优化 qqwife 2022-05-12 14:43:30 +08:00
源文雨
b3cdb1464b 优化 imagefinder 2022-05-12 14:05:18 +08:00
源文雨
3c01c3f0ba 优化 danbooru 2022-05-12 14:01:24 +08:00
源文雨
07d541be20 🔖 1.4.0-beta7 2022-05-12 12:38:12 +08:00
源文雨
4a0dc59585 优化 saucenao 2022-05-12 12:27:02 +08:00
源文雨
b1dd8f52e8 edit README 2022-05-12 11:24:53 +08:00
github-actions[bot]
6907fe230f 🎨 改进代码样式 2022-05-12 03:23:21 +00:00
方柳煜
f2e4071b90 修复单身狗技能逻辑 (#224)
* ⬆️ update deps

* 更改源酱提出的问题

* Update qqmapwife.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-05-12 11:22:07 +08:00
源文雨
452f5e5f83 💩👌 make lint happy 2022-05-12 11:21:20 +08:00
源文雨
c94b9f54ce ⬆️ update deps 2022-05-10 23:34:09 +08:00
源文雨
e993f93cf4 🔖 1.4.0-beta6 2022-05-10 23:22:57 +08:00
源文雨
e9fac38c1b 🔖 1.4.0-beta6 2022-05-10 23:00:20 +08:00
源文雨
31a49b8ff9 fix: gif 503 2022-05-10 22:52:46 +08:00
源文雨
7831cdf10c fix: groupwife url 2022-05-09 12:22:36 +08:00
源文雨
c0f176f0af fix #173: 今日早报变成昨日火星晚报 2022-05-09 12:18:57 +08:00
源文雨
dc96a557eb 🔖 1.4.0-beta5 2022-05-09 12:12:18 +08:00
源文雨
7a8c915e62 优化代码结构 2022-05-09 11:23:34 +08:00
github-actions[bot]
dec42cc72b 🎨 改进代码样式 2022-05-09 03:09:45 +00:00
方柳煜
92c9d1d2ce 一天一夫一妻制群老婆 (#219) 2022-05-09 11:08:22 +08:00
Kanri
de017fcd27 Update README.md 2022-05-09 01:57:38 +08:00
MSCxar#0293
1229f62abd README.md: 新增tg群组 (#222)
* README.md: 新增tg群组
2022-05-09 01:38:21 +08:00
github-actions[bot]
512852b817 🎨 改进代码样式 2022-05-08 14:13:47 +00:00
himawari
5a087000a9 🐛 疫情查询、网易点歌、qq点歌问题 (#220)
* 🐛 修复网易点歌,qq点歌问题

* 🚨 错误输出

* 🚨 错误输出
2022-05-08 22:12:27 +08:00
莫思潋
6b56d6649e feat:解塔罗牌 (#217) 2022-05-08 18:31:18 +08:00
林沐馨
5081aab497 fix #215: 摸鱼日历 (#143)
* Update calendar.go

更换API方式

* Update calendar.go

* 更换API

修复BUG

* 🎨 改进代码样式

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-05-07 22:35:32 +08:00
源文雨
bbb4afde53 fix: kanban scale 2022-05-06 22:30:51 +08:00
源文雨
d28495c3eb 优化显示 2022-05-06 21:11:29 +08:00
源文雨
1785e0c4a3 优化显示 2022-05-06 21:09:47 +08:00
源文雨
1e93e75aac add kanban 2022-05-06 21:06:45 +08:00
github-actions[bot]
a3ed7eeee2 🎨 改进代码样式 2022-05-06 12:04:03 +00:00
himawari
c3582637df 🎨 查成分增加可选择查uid (#214)
*  查成分添加注册日期信息

* 🐛 修复头像是webp图片使用不了的问题

* 🎨 查成分增加可选择查uid
2022-05-06 20:02:36 +08:00
源文雨
3b277b0eb0 搜图 drop yandex 2022-05-06 18:54:39 +08:00
源文雨
5e0991681f 抽n张塔罗牌 2022-05-05 14:19:52 +08:00
源文雨
354fbb7cdd 抽n张塔罗牌 2022-05-05 14:19:33 +08:00
源文雨
a166d06096 抽n张塔罗牌 2022-05-05 14:19:12 +08:00
源文雨
b8a6e07095 优化每日随机 2022-05-05 13:50:54 +08:00
源文雨
a8fba6e7b5 优化GetLazyData 2022-05-05 13:31:22 +08:00
源文雨
17a8c10f8c 🎨 modify badge 2022-05-04 23:40:37 +08:00
源文雨
7ccd29faac 🎨 modify badge 2022-05-04 23:40:01 +08:00
源文雨
d432e48cce 🔖 1.4.0-beta4 2022-05-04 23:21:50 +08:00
莫思潋
19091319cc feat:抽塔罗牌 (#213)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim

* 优化了更多插件中使用空格的体验
- 优化了music bilibili image_finder 中使用空格的体验
- 补上了plugin_bilibili中未实现的vup开头触发
- 为plugin_bilibili_parse输出的消息加上一个换行符,优化排版

* - 调整funny
- 补回readme中bilibili_push的注释说明

* - 简化funny说明

* feat:抽塔罗牌

* 🎨 改进代码样式

* 加上一个换行符

* 🎨 改进代码样式

* - At用户

* 🎨 改进代码样式

* -改进抽塔罗牌

* typo: 小写struct名

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-05-04 23:19:21 +08:00
源文雨
d29e12a92c fortune add plugin 夏日口袋 by @XHLin-gamer 2022-05-04 21:23:54 +08:00
himawari
5db03b0441 查成分新增字段注册日期 (#212)
*  查成分添加注册日期信息

* 🐛 修复头像是webp图片使用不了的问题
2022-05-03 14:42:58 +08:00
源文雨
f8c7e2bf6d 🔖 1.4.0-beta3 2022-05-02 10:56:49 +08:00
源文雨
a7fdc6a88f 🐛 服务列表不显示名称 2022-05-02 10:55:17 +08:00
莫思潋
4aaf5b0779 调整讲个笑话 (#210) 2022-05-02 10:46:53 +08:00
源文雨
6150e4c736 add playground instruction 2022-04-30 00:37:12 +08:00
源文雨
9a3b4b3ecb 🔖 1.4.0-beta2 2022-04-29 20:41:57 +08:00
源文雨
cbaeb4d5f2 🐛 无法在job中移除匹配触发器 2022-04-29 20:40:37 +08:00
源文雨
592c306aa0 加速word count 2022-04-28 23:29:48 +08:00
源文雨
136e6bddf4 加速word count 2022-04-28 23:15:27 +08:00
源文雨
0e8bef0541 sync data 2022-04-28 22:26:00 +08:00
fumiama
9d8c52303e update deps 2022-04-28 22:19:53 +08:00
fumiama
e6ae7df546 🔖 1.4.0-beta1 2022-04-28 19:58:22 +08:00
fumiama
5b57a759be update deps 2022-04-28 19:56:37 +08:00
MSCxar#0293
cc96eeae32 🐛README.md查缺补漏 (#208) 2022-04-28 17:38:30 +08:00
himawari
484fef1228 🎨 优化vtb插件代码,更换shadiao的api (#206)
* 🎨 优化vtb插件代码,更换shadiao的api

* 🎨 正则全局变量

Co-authored-by: haibaraguo <haibaraguo@yeahka.com>
2022-04-28 17:37:57 +08:00
Coloured-glaze
ba4ca11c83 🎨增加文字回复 (#205)
* 🎨增加文字回复

* 🎨增加文字回复

* 🎨增加文字回复

* 🎨增加文字回复(fix)

* 🎨small letter=>

* Update ys.go

* Update ys.go

* Update ys.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-04-27 14:11:23 +08:00
Mayuri
9372902348 🐛fix : setutime regex (#203) 2022-04-25 09:33:53 +08:00
源文雨
0cc9420570 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-04-22 09:24:29 +08:00
源文雨
18fa48d283 🔖 1.3.3-fix1 2022-04-22 09:24:15 +08:00
源文雨
9034fedbd0 lolicon add custom rand api 2022-04-22 09:23:31 +08:00
源文雨
ec3b6ec5fa 🔥 remove plugin acgimage 2022-04-22 09:13:43 +08:00
Mayuri
8cc2a4174e 🐛 更新签到背景图API (#202) 2022-04-21 21:36:23 +08:00
Yiwen-Chan
8a0014928d 🐛 更新疫情API 2022-04-21 12:59:01 +08:00
github-actions[bot]
228ca7f9c0 🎨 改进代码样式 2022-04-20 04:50:42 +00:00
MoeMagicMango
c0fa7efb27 简单修了下网易点歌 (#200) 2022-04-20 12:49:24 +08:00
himawari
3553683bb1 🐛 兼容linux和windows文件换行不同 (#199) 2022-04-19 23:00:01 +08:00
源文雨
ccb58e0a6c 🎨 edit README 2022-04-19 13:02:13 +08:00
源文雨
93253e2188 🎨 edit README 2022-04-19 12:59:47 +08:00
MSCxar#0293
e34bcc9bbd [水pr]整理README.md (#198)
* 整理 README.md
2022-04-19 12:39:45 +08:00
源文雨
72169e3a4d 🔖 1.3.3 2022-04-18 23:07:49 +08:00
源文雨
41c499840f fix #197: 猜单词出现空指针报警 2022-04-18 22:59:33 +08:00
himawari
f5cef170f0 🚑️ 修复查看其他群聊热词的问题 (#195) 2022-04-18 16:31:09 +08:00
源文雨
d7922a7c9b ️ 优化pool 2022-04-18 16:29:09 +08:00
github-actions[bot]
23fc77e8e1 🎨 改进代码样式 2022-04-17 13:25:27 +00:00
himawari
51f3eda09a 👍 添加聊天热词 (#192)
*  添加聊天热词

*  添加聊天热词

*  添加聊天热词

* 🚨 修lint

* 🚨 修lint
2022-04-17 21:24:07 +08:00
源文雨
6ec08a5227 🐛 reg 时序 2022-04-17 21:22:08 +08:00
源文雨
4855f694cb 🎨 edit README 2022-04-17 00:11:54 +08:00
源文雨
eaef37a831 Update README.md 2022-04-16 19:10:06 +08:00
源文雨
b182ff36bb 🔖 1.3.3-beta6 2022-04-16 00:35:05 +08:00
源文雨
c4e543449c 使用真正lazy的资源下载方式 2022-04-16 00:33:50 +08:00
源文雨
c76d9d4461 🔥 remove debug info in gorm 2022-04-16 00:04:07 +08:00
源文雨
dfd184724b 使用真正lazy的资源下载方式 2022-04-16 00:02:41 +08:00
源文雨
fef254031e ️ banmap 使用 ttl 2022-04-15 19:02:06 +08:00
源文雨
89c4e59bf1 🔖 1.3.3-beta5 2022-04-15 15:29:45 +08:00
源文雨
2e9acd3276 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-04-15 15:28:02 +08:00
源文雨
5cab59c93f 🐛 戳一戳失效 2022-04-15 15:27:47 +08:00
Mayuri
ebfb5878a1 更新用法和README.md (#189)
* update help manual

* Update README.md
2022-04-15 09:25:25 +08:00
源文雨
de6b11aa22 🔖 1.3.3-beta4 2022-04-14 17:18:01 +08:00
源文雨
9e7e7159e8 🔖 1.3.3-beta3 2022-04-14 17:11:00 +08:00
源文雨
00c909271b 🔖 1.3.3-beta3 2022-04-14 17:10:21 +08:00
源文雨
7401a0cbec 🎨 优化代码结构 2022-04-14 17:09:28 +08:00
源文雨
a9327d1774 🐛 reg close 2022-04-10 16:33:34 +08:00
Mayuri
9e99ef1348 新增 {gid} {groupname} (#186)
* modified:   plugin/manager/manager.go

* use message.UnescapeCQCodeText instead
2022-04-10 11:46:50 +08:00
源文雨
5b4b9fdb01 🔖 1.3.3-beta2 2022-04-06 11:17:02 +08:00
源文雨
d2998c4908 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-04-06 11:15:27 +08:00
源文雨
4ab968d563 🎨 优化代码结构 2022-04-06 11:15:24 +08:00
himawari
9b26eea754 增加查看签到排名 (#180)
*  增加查看签到排名

* 🚨 修lint

* 🚨 修lint
2022-04-06 10:59:56 +08:00
源文雨
a6bd717971 🔥 精简 log 输出 2022-04-05 23:18:13 +08:00
Kanri
f2914adb65 Update README.md 2022-04-05 20:52:25 +08:00
Kanri
aa5a426aac 📄 更换 README 图片 2022-04-05 20:50:40 +08:00
Kanri
fef8144187 📄 change title picture 2022-04-05 20:48:32 +08:00
源文雨
d8a429d3b3 🚧 move tag & nsfw to azfun 2022-04-05 15:52:06 +08:00
github-actions[bot]
56e53b75a5 🎨 改进代码样式 2022-04-04 14:55:00 +00:00
himawari
f89b6f5feb ️wordle逻辑优化,bilibilipush、translate添加信息 (#179)
* :sparkles:添加查成分功能

* :rotating_light:修lint

* :rotating_light:减少空格

* :bug:修改网址

* :bug:修改vup数量错误问题

* :bug:图片读取不了,就不读了

* 🐛 固定头像大小,bilibilipush调公有库

* 🎨 修改json转换

*  bilibilipush添加新类型,同时修改命令正则,wordle添加时间提醒,和单词语义,translate充实信息

* ️使用公用的翻译函数

* 🚨 添加return和stop

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-04-04 22:53:37 +08:00
源文雨
ec513e8893 🐛 job 指令触发可能失败 2022-04-04 14:36:25 +08:00
源文雨
35d6792d2e 🐛 job 指令触发可能失败 2022-04-04 13:28:50 +08:00
源文雨
74387aae2d 🔖 1.3.3-beta1 2022-04-03 18:53:06 +08:00
源文雨
959043962d Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-04-03 18:51:25 +08:00
源文雨
4efb71bafb 🍱 运势 增加底图 奇异恩典 2022-04-03 18:51:06 +08:00
TZMSky
6fd0bc0445 删除Onebot-YAYA (#177) 2022-04-02 22:53:10 +08:00
源文雨
176a2eb392 🔥 精简Register 2022-04-02 22:45:21 +08:00
源文雨
1a85deb36e 🎨 优化代码结构 2022-04-02 22:40:31 +08:00
源文雨
5b409ff3de 🐛 pixiv dns 2022-04-02 13:31:54 +08:00
源文雨
a9e13d3a92 🎨 优化代码结构 2022-03-31 19:50:34 +08:00
莫思潋
0698d8e3b1 fix:修复了枝网查重无法使用的问题 (#175)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim

* 优化了更多插件中使用空格的体验
- 优化了music bilibili image_finder 中使用空格的体验
- 补上了plugin_bilibili中未实现的vup开头触发
- 为plugin_bilibili_parse输出的消息加上一个换行符,优化排版

* 小调整

- 考虑到屌字既难打又有碍观瞻,改为正则匹配`[屌|弔|吊]图`
- 增加了退群提醒的定制

* - 修复退群提醒本身忘记修改了的问题

* fix:修复了枝网查重无法使用的问题

* readme适配上次的欢迎语修改

* 删去调试语句

* Update setu_geter.go

* Update zhiwang.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-03-31 19:36:29 +08:00
源文雨
8e4c496b54 🐛 MustProvicePicture goroutine 泄漏 2022-03-30 13:23:52 +08:00
源文雨
27054b9722 🐛 MustProvicePicture goroutine 泄漏 2022-03-30 13:17:37 +08:00
源文雨
bcad2c4998 🎨 优化代码结构 2022-03-29 16:29:29 +08:00
github-actions[bot]
aae2bd4884 🎨 改进代码样式 2022-03-29 05:05:36 +00:00
himawari
006ef6f672 👍 添加查成分功能,修改bilibili插件的正则 (#171)
* :sparkles:添加查成分功能

* :rotating_light:修lint

* :rotating_light:减少空格

* :bug:修改网址

* :bug:修改vup数量错误问题

* :bug:图片读取不了,就不读了

* 🐛 固定头像大小,bilibilipush调公有库

* 🎨 修改json转换

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-03-29 13:03:46 +08:00
源文雨
7be1a61347 🎨 优化代码结构 2022-03-28 23:13:53 +08:00
源文雨
1ef48f6cd6 🎨 优化代码结构 2022-03-28 23:06:04 +08:00
源文雨
a9a061a4bb 🎨 优化代码结构 2022-03-28 23:01:36 +08:00
源文雨
14ed8b7af7 🐛 reg 2022-03-28 17:23:54 +08:00
源文雨
d17b8fa720 📝 edit readme 2022-03-28 17:14:39 +08:00
源文雨
68980a69b5 🐛 增加百人一首 修复Lazy不关闭 2022-03-28 17:11:44 +08:00
源文雨
636f14c450 🐛 md5 只能连接一次 2022-03-27 14:35:48 +08:00
源文雨
b066bc37b3 #150 缩减coser发图数 2022-03-27 14:26:28 +08:00
源文雨
9ac43fecf8 fix #151 2022-03-27 14:22:34 +08:00
源文雨
d6ff14167d add plugin 渲染任意文字到图片 2022-03-27 14:00:21 +08:00
源文雨
5837a765f1 add plugin 渲染任意文字到图片 2022-03-27 13:54:26 +08:00
源文雨
1bfb76a4b3 📝 edit readme 2022-03-27 12:59:08 +08:00
源文雨
2a78a602e2 shindan add 黄油角色 2022-03-27 12:56:57 +08:00
源文雨
884b0e4226 💩👌 make lint happy 2022-03-27 12:48:12 +08:00
源文雨
4e819eb5d9 fix ci 2022-03-27 12:44:02 +08:00
源文雨
e3a50cc014 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-03-27 00:24:56 +08:00
源文雨
25ab8c9234 fix: FutureEvent 2022-03-27 00:24:46 +08:00
github-actions[bot]
901e680fa4 🎨 改进代码样式 2022-03-26 14:03:46 +00:00
源文雨
82768fff59 fix b14 & cd 2022-03-26 22:01:50 +08:00
莫思潋
87e3297904 定制退群提醒+调整煎蛋网无聊图触发 (#166)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim

* 优化了更多插件中使用空格的体验
- 优化了music bilibili image_finder 中使用空格的体验
- 补上了plugin_bilibili中未实现的vup开头触发
- 为plugin_bilibili_parse输出的消息加上一个换行符,优化排版

* 小调整

- 考虑到屌字既难打又有碍观瞻,改为正则匹配`[屌|弔|吊]图`
- 增加了退群提醒的定制

* - 修复退群提醒本身忘记修改了的问题
2022-03-22 12:31:44 +08:00
Jiang-Red
81a4297eb1 添加更多数据,修改发送排版 (#167) 2022-03-21 18:18:29 +08:00
源文雨
17f5b52931 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-03-20 18:49:31 +08:00
源文雨
2250adf854 fix #161 2022-03-20 18:49:20 +08:00
GenesisAN
5cd46b3926 从url正则中去除用字 (#160)
从url正则中去除用字,以防止url中包含用字前缀导致图片显示失败
2022-03-20 14:43:55 +08:00
源文雨
6e2b10b788 fix lint 2022-03-20 14:40:47 +08:00
源文雨
5e301ccaaf fix lint 2022-03-20 14:33:43 +08:00
源文雨
206a38efab fix #154: 优化代码结构 2022-03-20 14:20:37 +08:00
Coloured-glaze
cdf844be52 🎨原神抽卡 (#156)
* Add files via upload

* 原神抽卡

* 🎨原神抽卡
2022-03-20 10:59:11 +08:00
源文雨
70cc28c191 fix ci 2022-03-19 19:58:16 +08:00
源文雨
35282fba6c update data 2022-03-19 19:52:54 +08:00
源文雨
e43f8e594d Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-03-19 19:51:59 +08:00
源文雨
21988fab76 ⬆️ update to go 1.18 2022-03-19 19:51:45 +08:00
himawari
2f3823abe2 feat:添加舔狗日记和修复睡眠管理的问题 (#152)
* feat:添加舔狗日记和修复睡眠管理的问题

* fix:修lint

* fix:修改铅笔小说网址

* fix:修改铅笔小说网址
2022-03-19 11:29:31 +08:00
源文雨
2c545e7b7f 🎨 优化pool 2022-03-18 16:50:07 +08:00
源文雨
22f2200778 🐛 b14 panic 2022-03-15 22:50:38 +08:00
源文雨
2f63253ec0 🎨 优化代码结构 2022-03-14 12:50:50 +08:00
源文雨
be7e8134f9 🎨 优化代码结构 2022-03-14 12:46:54 +08:00
源文雨
b85408e3e5 pixiv add backend dns result 2022-03-13 22:43:41 +08:00
源文雨
4828451f9e 🔖 v1.3.2 2022-03-13 13:21:52 +08:00
源文雨
b3b50e1353 🐛 搜图 有时无法下载图片 2022-03-13 13:14:01 +08:00
源文雨
95e8bf2f55 📝 edit readme 2022-03-12 20:22:28 +08:00
源文雨
cde7669c0b 优化代码结构 2022-03-12 11:35:20 +08:00
源文雨
ff4a33c51c edit readme 2022-03-12 11:05:19 +08:00
源文雨
06cf6f84aa edit readme 2022-03-12 00:27:27 +08:00
源文雨
556f6f134f edit readme 2022-03-12 00:27:15 +08:00
源文雨
b1ab7ef118 edit readme 2022-03-12 00:25:59 +08:00
源文雨
e5fd108a9c edit readme 2022-03-12 00:25:21 +08:00
源文雨
5a67bf2417 🐛 每天刷新 2022-03-12 00:18:26 +08:00
源文雨
cb020c1bbd 🐛 每天刷新 2022-03-12 00:17:33 +08:00
源文雨
bf75b29e33 🐛 每天刷新 2022-03-12 00:16:04 +08:00
源文雨
d730fd9cab 优化代码结构 2022-03-12 00:05:41 +08:00
Jiang-Red
a862e5be7c 添加 早报插件及设置欢迎语增加更多自定义 (#147)
* 添加 早报插件

* 添加 早报插件

* 添加 早报插件

* 添加 设置欢迎语更多自定义

* 添加 help说明

* 添加 manager设置欢迎语说明

* 怪

* 🎨 改进代码样式

* Update zaobao.go

* Update zaobao.go

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-03-11 23:47:39 +08:00
源文雨
ebca124c86 🐛 修复 run 2022-03-11 23:02:08 +08:00
源文雨
3b7803a81b 优化代码结构 2022-03-11 16:34:26 +08:00
源文雨
b7b9d92148 优化代码结构 2022-03-11 16:18:11 +08:00
Rainy
44575fb19e 增加城市疫情查询 (#146)
* 增加城市疫情查询

* 增加城市疫情查询

* 增加城市疫情查询

* 增加城市疫情查询

* 增加查询城市疫情

* 增加城市查询疫情

* 增加城市疫情查询

* Update epidemic.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-03-11 16:10:14 +08:00
源文雨
f181a4b9cd 🎨 可自行编辑json 2022-03-11 11:40:51 +08:00
源文雨
77e5d8b0c2 ⬆️ update deps 2022-03-11 11:36:55 +08:00
源文雨
edd9feb8f8 🔥 drop ioutil 2022-03-11 11:32:13 +08:00
源文雨
81d6a06dbe 🎨 ascii2d color -> bovw 2022-03-11 10:46:01 +08:00
源文雨
8afbc67bf7 💩👌 make lint happy 2022-03-11 10:26:29 +08:00
源文雨
a27132f907 job可获取网页信息,可代表执行 2022-03-09 12:14:20 +08:00
源文雨
183be05d82 job可编程 2022-03-08 23:18:31 +08:00
源文雨
bccf789714 job增加执行指令 2022-03-08 20:39:02 +08:00
源文雨
55944dddb3 job增加参数读取 2022-03-08 18:14:41 +08:00
源文雨
f67932cc56 job增加参数读取 2022-03-08 18:11:24 +08:00
源文雨
6d633fac6a 🐛 edit readme 2022-03-08 18:10:01 +08:00
源文雨
86fc5c51c8 job增加参数读取 2022-03-08 18:07:59 +08:00
源文雨
156e9f07ad 🐛 job禁止递归触发&增加README 2022-03-08 13:04:44 +08:00
源文雨
1ba4722fc7 💩👌 make lint happy 2022-03-07 23:27:11 +08:00
源文雨
54c9857219 🎉 job增加注入指令结果 2022-03-07 22:49:19 +08:00
源文雨
ea56c7d0d2 🐛 panic: sync: WaitGroup is reused 2022-03-07 14:43:25 +08:00
源文雨
0cbe43df97 🐛 panic: sync: WaitGroup is reused 2022-03-07 14:08:23 +08:00
源文雨
1f941d883a 🐛 panic: sync: WaitGroup is reused 2022-03-07 14:01:15 +08:00
源文雨
f5b3e423fb 🐛 panic: sync: WaitGroup is reused 2022-03-07 13:56:05 +08:00
源文雨
6c7f81ca55 🔖 1.3.1 2022-03-07 13:41:23 +08:00
源文雨
3911b5ed82 🎨 优化初始化逻辑 2022-03-07 13:40:32 +08:00
源文雨
f38f3ab69c 🐛 定时指令触发器插件增加查看 2022-03-07 13:15:26 +08:00
源文雨
846db6f063 📝 edit README 2022-03-06 22:53:59 +08:00
源文雨
ff068a05b0 🐛 定时指令触发器插件增加限速器 2022-03-06 22:52:38 +08:00
源文雨
051b7dd182 🐛 定时指令触发器插件允许非管理私聊使用 2022-03-06 22:46:12 +08:00
源文雨
11870aeed6 🐛 定时指令触发器插件在某些bot失效 2022-03-06 22:37:35 +08:00
源文雨
9bcff82d9c Update main.go 2022-03-06 21:27:19 +08:00
源文雨
309efe8cd8 增加定时指令触发器插件 2022-03-06 21:21:28 +08:00
源文雨
bf54789f0f 🎨 优化pixiv下载 2022-03-05 23:01:28 +08:00
Kanri
01e527abdb 增加六阶七阶猜单词 (#140) 2022-03-05 10:36:01 +08:00
fumiama
db6b558c75 ⬆️ update deps 2022-03-04 12:17:58 +08:00
fumiama
9a792eb144 🍱 运势增加底图 东方归言录 by @KafCoppelia 2022-03-02 22:37:41 +08:00
fumiama
44e99664a3 🎨 关键字搜图改用云函数反代 2022-03-01 23:10:10 +08:00
fumiama
9f3dd37bf0 🎨 关键字搜图改用云函数反代 2022-03-01 23:02:22 +08:00
fumiama
f5936d9cb7 🎨 某些发图应用合并转发 2022-03-01 19:47:25 +08:00
fumiama
27e69ef022 yandex与ascii2d并行 2022-03-01 17:30:59 +08:00
fumiama
6262aab6bd 替换CustomNode为ctxext的封装 2022-03-01 17:29:19 +08:00
fumiama
4781bc8eb7 sync 2022-02-27 19:34:47 +08:00
fumiama
b233c4b638 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-02-27 19:32:29 +08:00
fumiama
0a0cc807dc fix #139 2022-02-27 19:31:53 +08:00
github-actions[bot]
feeeb63e52 🎨 改进代码样式 2022-02-27 10:59:03 +00:00
himawari
5c620d6268 feat:添加月幕galgame网站图 (#138)
* feat:添加月幕galgame网站图

* fix:修lint

* fix:不重复更新

* fix:增加命令提醒语

* fix:增加日语匹配

* fix:换位置加锁

* fix:隐式声明

* fix:copy数组

* Update ai_tts.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-02-27 18:57:52 +08:00
fumiama
a469000d7a 🔖 v1.3.0 2022-02-27 15:04:09 +08:00
fumiama
0e15ac78b2 修复pixiv下载 2022-02-27 14:17:29 +08:00
fumiama
d9e195ccd0 💩👌 make lint happy 2022-02-26 23:22:37 +08:00
fumiama
cf52997279 fix: 图片缓存池 2022-02-26 23:20:08 +08:00
fumiama
88318a7151 增加插件 百度一下 2022-02-26 22:28:37 +08:00
fumiama
91f522b666 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-02-26 22:09:55 +08:00
fumiama
1895f8815e fix: gif 爬 撕 2022-02-26 22:09:37 +08:00
Kanri
7be5f52be4 ✏️ 修复抓不到日历的碧油鸡 (#137)
* ✏️ 修复抓不到日历的碧油鸡

* ✏️ 小修改
2022-02-26 21:58:29 +08:00
fumiama
0cfb2e4e06 🎨 优化目录结构 2022-02-25 22:15:14 +08:00
fumiama
5ccf753af3 🎨 优化目录结构 2022-02-25 22:06:30 +08:00
fumiama
bfcf3cac91 删除插件 minecraft 2022-02-25 22:01:37 +08:00
fumiama
bc3d7bc278 删除插件 minecraft 2022-02-25 22:00:03 +08:00
fumiama
7cf767f344 🐛 fix: 摸鱼日历&插件控制 2022-02-25 13:24:21 +08:00
fumiama
7aed9a2c89 fix: reg panic 2022-02-24 21:34:06 +08:00
fumiama
454196a462 sync 2022-02-24 20:02:02 +08:00
fumiama
1597ba7128 💩👌 make lint happy 2022-02-24 19:55:28 +08:00
fumiama
480523ff27 🎨 🔥 ️ feat: pack pooled img sending 2022-02-24 19:54:48 +08:00
Kanri
7ec7ab8682 ✏️ 修复一下碧油鸡 (#136) 2022-02-24 18:06:23 +08:00
Kanri
ba2d011d48 ✏️ 修复获取公众号链接错误的问题 (#135) 2022-02-24 16:56:50 +08:00
fumiama
504e6cd1cc fix(#134): 两个群同时猜单词会互相干扰 2022-02-23 17:10:33 +08:00
github-actions[bot]
b8f3700fe4 🎨 改进代码样式 2022-02-23 08:58:01 +00:00
Jiang-Red
b2cff862bb Update manager.go (#132)
* Update manager.go

修改 自定义欢迎语可带图
添加 修改名片/修改头衔/申请头衔字数限制

* Update manager.go

* Update manager.go

添加 测试欢迎语

* Update manager.go

* Update manager.go

* Update manager.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-02-23 16:57:06 +08:00
fumiama
dc348f8500 🔥 🎨 统一 cron 2022-02-23 16:52:40 +08:00
Kanri
8c40293fed 新增插件 摸鱼人日历 (#133)
*  新增插件 摸鱼人日历

*  新增插件 摸鱼人日历

* ✏️ 优化插件 摸鱼人日历
2022-02-23 16:36:23 +08:00
fumiama
48deaf3aca 🔥 🎨 tts 2022-02-23 11:38:00 +08:00
fumiama
6932643788 🔥 🎨 tts 2022-02-23 11:35:43 +08:00
fumiama
7f972e3d68 🐛 fix: wordle 2022-02-23 11:32:26 +08:00
github-actions[bot]
edb0880999 🎨 改进代码样式 2022-02-23 03:17:02 +00:00
himawari
45f0f5cd6c 将mockingbird统一到tts (#131)
* fix:处理回复文本

* feat:将以mockingbird统一到tts里

* fix:修lint

* fix:换一个正则函数

* fix:去掉ok

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-02-23 11:15:42 +08:00
fumiama
e468ac1933 apply new api ImageBytes 2022-02-22 22:16:49 +08:00
fumiama
55b6b40acf fix: use Send instead of SendChain 2022-02-22 21:55:25 +08:00
fumiama
5f1190f72e feat: use single instead of sync.Map 2022-02-22 21:52:06 +08:00
Kanri
b0fbd6507d 发布插件猜单词 2022-02-22 19:48:13 +08:00
fumiama
598a664d30 🐛 修正放大图片 2022-02-22 13:13:04 +08:00
fumiama
211f0a667d 🐛 修正放大图片 2022-02-22 13:10:48 +08:00
fumiama
28fb788778 🎨 shrink imgpool hash 2022-02-21 22:24:29 +08:00
fumiama
628830fbf5 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-02-20 16:57:17 +08:00
fumiama
7d235d0077 🎨 scale 更改为 云函数 2022-02-20 16:57:01 +08:00
himawari
861b0b6cef fix:修改vtb语录存为本地路径,去掉bilibilipush缓存 (#130)
* fix:修改vtb语录存为本地路径,去掉bilibilipush缓存

* fix:bilibiliparse添加up和粉丝数,修改bilibilipush的时间

* Update bilibili_parse.go

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-02-19 23:54:17 +08:00
fumiama
9986c57727 fix: 缓存池有时无法发出图片 2022-02-19 23:50:39 +08:00
fumiama
f1c9e2331c fix: 缓存池有时无法发出图片 2022-02-19 23:41:11 +08:00
fumiama
7c1ddc6ab1 💩👌 make lint happy 2022-02-19 18:03:35 +08:00
fumiama
44ad78761b 🎨 🔥 update sqlite 2022-02-19 16:16:48 +08:00
fumiama
bd6925f2f1 🎨 🔥 统一 seed 2022-02-18 20:20:25 +08:00
fumiama
3838d74cb8 🎨 🔥 优化代码结构 2022-02-18 20:15:07 +08:00
Kanri
eaad8beb7b 增加插件 猜单词 (#129)
*  增加插件 猜单词

* Update wordle.go

* Update wordle.go

* Update wordle.go

* Update wordle.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-02-18 19:08:02 +08:00
fumiama
14acdfdbc3 🎨 ️ control 增加数据库查询缓存 & log 采用 CQ 码打印 2022-02-16 21:57:14 +08:00
fumiama
a5fe7a5b40 scale 增加图片过大保护 2022-02-16 13:55:17 +08:00
fumiama
61df3c55b5 scale 增加图片过大保护 2022-02-16 13:50:12 +08:00
fumiama
eb0059c1a3 fix: writer endian 2022-02-16 12:29:49 +08:00
fumiama
4ca5038ae9 🎨 🔥 优化代码结构 2022-02-15 20:50:49 +08:00
fumiama
121403231a fix: acgimage block 2022-02-15 16:17:40 +08:00
fumiama
b945338a8d 🔥 update go-registry 2022-02-15 13:38:45 +08:00
fumiama
ae5ea542a0 🔥 update go-registry 2022-02-15 00:42:39 +08:00
fumiama
fe95dc8201 🐛 fix: image finder 2022-02-14 17:08:20 +08:00
fumiama
1eefb4e610 🐛 fix: image finder 2022-02-14 17:07:45 +08:00
fumiama
8660d8d990 🐛 fix: image finder 2022-02-14 17:06:54 +08:00
fumiama
37033fe48d 搜图增加 yandex 2022-02-14 16:34:46 +08:00
fumiama
30665ad8c6 💩👌 make lint happy 2022-02-14 14:50:42 +08:00
fumiama
f9e4b8db76 📝 edit README 2022-02-14 14:49:12 +08:00
fumiama
c486a210e4 增加插件 漂流瓶 #2 2022-02-14 14:46:33 +08:00
fumiama
0cd01959a0 ⬆️ update kimoi #126 2022-02-14 13:03:37 +08:00
fumiama
d5ac9f7920 💩👌 make lint happy 2022-02-13 21:27:43 +08:00
fumiama
6b2dd112a6 dd add image size limit 2022-02-13 12:08:50 +08:00
fumiama
01abfab133 🚀 update moyu 春节 to 2023 2022-02-13 11:51:41 +08:00
fumiama
e2a56872dc 🐛 fix: 防止自触发 2022-02-13 11:43:36 +08:00
fumiama
6f22a9c4bc fix: chat call name 2022-02-13 11:35:42 +08:00
fumiama
a2426de70c Squashed commit of the following:
commit 3e4b0216b9f952b800e9be880acd744af3afe593
Merge: 970cb14 aaf832e
Author: fumiama <s862105088@gmail.com>
Date:   Sat Feb 12 23:23:51 2022 +0800

    Merge branch 'master' of https://github.com/MoYoez/ZeroBot-Plugin into MoYoez-master

commit 970cb142256d4575b3e5170b9dfb9370f5802da5
Author: fumiama <s862105088@gmail.com>
Date:   Sat Feb 12 23:18:23 2022 +0800

     🐛 🔥 🎨 fix: gif panic

commit aaf832e3b5
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 21:06:21 2022 +0800

    Update chat.go

commit fae3458bcf
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Sat Feb 12 13:05:37 2022 +0000

    🎨 改进代码样式

commit 610cae5229
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 21:05:08 2022 +0800

    Update chat.go

commit c445c61da5
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:58:57 2022 +0800

    Delete data.go

commit 70172f4d8b
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:53:10 2022 +0800

    换了个网易云音乐热评的API

commit c8b4827e91
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Sat Feb 12 12:50:57 2022 +0000

    🎨 改进代码样式

commit a233586dfe
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:50:21 2022 +0800

    Update chat.go

commit 87501f6011
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:49:08 2022 +0800

    Update data.go

commit ecf6419065
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:48:14 2022 +0800

    Update chat.go

commit c3550503f0
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:47:47 2022 +0800

    Delete plugin_purechat directory

commit 1da3486d00
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:46:34 2022 +0800

    Add files via upload

commit 34ed8c89fd
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:38:46 2022 +0800

    Update main.go

commit aa08eb0120
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:38:19 2022 +0800

    修改过的回复 删掉了一些ex的词汇

commit faf198289f
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:29:59 2022 +0800

    Update main.go

commit 5ac3b7a790
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:28:48 2022 +0800

    Update chat.go

commit b046d45435
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:25:23 2022 +0800

    Rename purechat.go to chat.go

commit 6bbcdfcd58
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:24:54 2022 +0800

    Add files via upload

commit e7630b5904
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:24:32 2022 +0800

    Update purechat.go

commit 36c903bece
Author: MoeMagicMango <i@himoyo.cn>
Date:   Sat Feb 12 20:23:01 2022 +0800

    Create purechat.go
2022-02-12 23:38:45 +08:00
MoeMagicMango
ed7bbf54a7 Update chat.go 2022-02-12 23:36:58 +08:00
fumiama
69394377d0 fix: emojimix logical error 2022-02-12 14:48:12 +08:00
fumiama
8f20487a15 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-02-12 14:20:21 +08:00
fumiama
fae24db2df 💩👌 make lint happy 2022-02-12 14:20:10 +08:00
github-actions[bot]
f8fb791d8f 🎨 改进代码样式 2022-02-12 06:19:04 +00:00
Kanri
f320d9e1e5 增加插件 emojimix (#121)
*  增加插件 emojimix

* 🎨✏️ 优化代码格式

*  增加 qqface 支持

* Update main.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-02-12 14:18:05 +08:00
fumiama
18bd34fad2 fix(#122): 避免图片过大导致内存占用过多 2022-02-12 13:37:06 +08:00
fumiama
cf72d0b36a fix(#122): 避免图片过大导致内存占用过多 2022-02-12 13:32:26 +08:00
fumiama
c3722b0a6c ️ perf: 每次匹配仅检查一次 ban 2022-02-11 00:39:50 +08:00
fumiama
3af701e803 🎉 🎨 ️ 优化 base64 图片 log 体验 & 减少 ban 遍历 2022-02-10 23:47:39 +08:00
fumiama
bc4b2e89db 🎉 base14支持所有平台 2022-02-10 14:15:49 +08:00
fumiama
3cbb589d2c 💩👌 make lint happy 2022-02-09 21:00:42 +08:00
github-actions[bot]
63ef93a9f9 🎨 改进代码样式 2022-02-09 07:44:23 +00:00
fumiama
8c943d2c01 🔥 🎨 优化代码结构 2022-02-09 15:43:14 +08:00
fumiama
806b77acce 🔥 🎨 优化代码结构 2022-02-08 19:39:19 +08:00
github-actions[bot]
3df0414621 🎨 改进代码样式 2022-02-08 07:43:30 +00:00
fumiama
04f70b0499 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-02-08 15:42:09 +08:00
fumiama
0b20087e61 🎨 🔥 优化 jandan 2022-02-08 15:40:31 +08:00
github-actions[bot]
5c82600972 🎨 改进代码样式 2022-02-08 07:06:57 +00:00
himawari
45edd86cb8 feat:增加煎蛋网无聊图 (#115)
* feat:添加煎蛋网无聊图

* fix:修lint

* fix:修改model和名称

* fix:删除不要的驱动

* fix:修改日志错误的地方

* fix:修改权限

* fix:去掉数据库

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-02-08 15:05:58 +08:00
fumiama
8f6b3fa00d 🎨 🔥 增加反并发 2022-02-08 14:58:47 +08:00
fumiama
a16bcda7da 🎨 🔥 统一限速器 2022-02-08 14:46:35 +08:00
fumiama
259b29f6e3 🐛 🔥 ascii2d返回多结果&修复合并转发 2022-02-07 20:39:49 +08:00
fumiama
477868c601 🐛 fix: imgpool fallback panic 2022-02-07 15:29:29 +08:00
莫思潋
92de963c0c 优化了更多插件中使用空格的体验 (#114)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim

* 优化了更多插件中使用空格的体验
- 优化了music bilibili image_finder 中使用空格的体验
- 补上了plugin_bilibili中未实现的vup开头触发
- 为plugin_bilibili_parse输出的消息加上一个换行符,优化排版
2022-02-03 13:41:10 +08:00
fumiama
a7c56d9e77 💩👌 make lint happy 2022-02-03 13:40:00 +08:00
fumiama
4fe64eeb44 🐛 nsfw 防止风控 2022-02-01 18:38:01 +08:00
fumiama
fc0d020a04 新增叔叔的放大图片 2022-02-01 18:30:01 +08:00
fumiama
617e2c9885 🐛 添加封禁命令,修复 sql 2022-02-01 14:28:40 +08:00
github-actions[bot]
bb1130490b 🎨 改进代码样式 2022-01-30 16:40:38 +00:00
fumiama
ca18a323e3 增加初始化等待 2022-01-31 00:39:39 +08:00
fumiama
0770c6e4a1 fix plugin nsfw 2022-01-30 23:13:11 +08:00
fumiama
e1dbfe8f6a 🐛 fix nil ptr 2022-01-30 23:05:13 +08:00
fumiama
a2854069ac add plugin nsfw 2022-01-30 23:00:23 +08:00
fumiama
9f0efc2bda 🔖 v1.2.5 2022-01-30 20:06:19 +08:00
fumiama
ec5798f264 ️ 优化 rule.FirstValueInList 2022-01-30 20:05:39 +08:00
github-actions[bot]
ded20441fa 🎨 改进代码样式 2022-01-30 11:04:49 +00:00
himawari
47064dbcec b站视频链接解析 (#113)
* feat:b站视频链接解析

* fix:修lint

* fix:block改为true

* fix:不加视频链接,以免两个机器人在同一个群疯狂触发

* fix:链接换成bv号

* fix:修改为send方法

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-30 19:04:00 +08:00
莫思潋
2cda7ecb04 优化在两个命令中使用空格分隔的体验 (#112)
* 优化在两个命令中使用空格分隔的体验
- fortune的设置底图功能
- b14的加密功能

* 优化四个插件中使用空格分隔的体验
- 加密
- 哔哩哔哩推送
- 藏头诗
- 运势

* 优化并修正了上一个commit
- 加上了因为复制粘贴疏忽又没有注意测试遗漏的`?`
- 调整藏头诗和加密的正则触发,使其不必多此一举
- 删去了未被发现的测试代码

* - 删去了遗漏的Trim
2022-01-29 13:48:01 +08:00
fumiama
b372892a20 🐛 adjust prio 2022-01-28 20:02:00 +08:00
fumiama
fabf62059e 💩👌 make lint happy 2022-01-28 19:59:31 +08:00
fumiama
c524c68809 🐛 fix setutime mkdir 2022-01-27 23:06:04 +08:00
fumiama
876fd425e4 ⬆️ update zb 2022-01-27 16:43:11 +08:00
fumiama
72ed1293f6 🔥 优化 setutime 2022-01-27 16:29:19 +08:00
fumiama
fa973a9231 🐛 fix saucenao relative path 2022-01-27 15:50:08 +08:00
fumiama
e245a8f124 🎨 ️ pixiv 图片缓存集中到 data/pixiv 2022-01-27 14:32:13 +08:00
fumiama
aa71fa7cb8 🐛 fix acgimage 2022-01-27 00:14:26 +08:00
fumiama
da5aab3ee6 🔥 use new imgpool 2022-01-26 23:52:37 +08:00
fumiama
e0317d1fe1 ️ 优化代码结构 2022-01-26 11:01:33 +08:00
fumiama
3557a0ebc1 ⬆️ update deps 2022-01-25 13:54:05 +08:00
fumiama
ddd0cc4538 ⬆️ update deps 2022-01-25 13:50:15 +08:00
fumiama
0212ec51cc 🔖 v1.2.4 2022-01-25 13:34:44 +08:00
fumiama
7109e30d93 🎨 🔥 modify wyy 2022-01-24 21:48:21 +08:00
MoeMagicMango
6990819d5c feat:添加来自ovooa的网易云热评API (#111)
* Create readme.md

* 调用网易云热评API

* Update main.go

* Delete readme.md

* Delete main.go

* Create main.go

* Add files via upload

* Update prio.go

* Add files via upload

* Add files via upload

* Update prio.go

* Add files via upload

* Update prio.go

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* revert main

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2022-01-24 21:40:52 +08:00
fumiama
b4ff754934 🐛 修正 imgpool 2022-01-24 18:23:33 +08:00
fumiama
6ece644a7b 🐛 修正 imgpool 2022-01-24 18:17:53 +08:00
fumiama
f826b4d0bc 🐛 防止风控 2022-01-24 14:28:43 +08:00
fumiama
aa1f82d46f 增加 pixiv 多线程下载与图片缓存 2022-01-24 14:01:30 +08:00
fumiama
f7c6d67428 🐛 fix fortune 2022-01-23 13:48:45 +08:00
fumiama
cd30d6df31 🐛 fix fortune 2022-01-23 13:43:42 +08:00
fumiama
7463792de7 🐛 fix fortune 2022-01-23 13:38:56 +08:00
fumiama
80f49c47c6 🐛 fix fortune 2022-01-23 13:22:31 +08:00
fumiama
4baead3490 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-01-23 00:28:16 +08:00
fumiama
2d0c69344a 🐛 fix get&del msg in zb 2022-01-23 00:28:05 +08:00
github-actions[bot]
a94ea2b332 🎨 改进代码样式 2022-01-22 15:44:30 +00:00
fumiama
4ee50a6582 add image pool 2022-01-22 23:43:38 +08:00
fumiama
b21021bd6b Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-01-22 12:39:51 +08:00
fumiama
7238fe0b6b 🍱 add fortune 赛马娘 2022-01-22 12:38:22 +08:00
Kanri
e1b5c176c3 ✏️ 修复 pixiv.cat 2022-01-22 10:54:38 +08:00
Mayuri
3aabc089d8 Make Help manual legible (#110) 2022-01-19 13:28:37 +08:00
fumiama
db5177027f add rough guild support 2022-01-18 15:07:34 +08:00
fumiama
0e2da1b983 add rough guild support 2022-01-17 23:44:47 +08:00
fumiama
1583006018 🔥 💩 disable bilibilipush by default 2022-01-17 23:20:26 +08:00
fumiama
6b49c2842c 💩👌 make lint happy 2022-01-17 23:06:31 +08:00
fumiama
9c4a5dc818 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-01-17 23:05:30 +08:00
fumiama
8256658ac2 add rough guild support 2022-01-17 23:04:32 +08:00
himawari
4b11ff495d fix:去掉chromedp,分类型处理json字符串 (#109)
* fix:新动态处理

* fix:使用正确的变量cOrigType

* fix:单小说的时候不用渲染图片

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-17 20:43:02 +08:00
fumiama
461dc925af add rough guild support 2022-01-16 20:48:45 +08:00
fumiama
1233b1d11c 💩👌 make lint happy 2022-01-16 20:37:47 +08:00
fumiama
6dbc0b3891 💩👌 make lint happy 2022-01-15 20:25:07 +08:00
github-actions[bot]
db3cef9bb6 🎨 改进代码样式 2022-01-15 12:18:59 +00:00
fumiama
3de009727e 💩👌 make lint happy 2022-01-15 20:17:56 +08:00
github-actions[bot]
8d35515497 🎨 改进代码样式 2022-01-15 12:15:39 +00:00
fumiama
4519dd5eb8 💫 ♻️ 🎉 ️ 强制使用优先级 2022-01-15 20:14:34 +08:00
fumiama
925e6847f3 🎨 adjust prio 2022-01-15 17:06:50 +08:00
fumiama
9462cbc7e0 🔥 shrink README 2022-01-15 17:02:33 +08:00
fumiama
8ec4271419 🐛 fix curse over-widely matching 2022-01-15 17:00:07 +08:00
fumiama
173fd250cb 🐛 fix: manager timer panic 2022-01-15 15:41:27 +08:00
fumiama
89bdc1e496 🐛 fix gif panic 2022-01-15 15:18:25 +08:00
fumiama
48736d3f4a 💩👌 make lint happy 2022-01-15 11:02:34 +08:00
himawari
f8df60f06b fix:修复直播状态更新的bug (#107)
* feat:添加b站推送,写了一半

* feat:添加b站推送(后续看情况,替换掉chromepd)

* fix:修复一直推送直播的bug

* fix:添加缓存路径

* feat:添加推送列表,修复重复发消息的bug

* feat:发现禁用有用,删除多余指令

* fix:修改格式

* fix:sleep无效

* fix:修改直播card

* fix:增加长度

* fix:修改readme

* fix:修lint,并去掉cron

* fix:修lint

* fix:去掉日志

* fix:更新旧状态

* fix:删掉多余方法

* fix:优化判断语句

* fix:修lint

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-15 11:01:33 +08:00
github-actions[bot]
9bd0ed03a5 🎨 改进代码样式 2022-01-14 14:18:27 +00:00
himawari
cb1e4bcdb7 feat:添加b站推送功能 (#106)
* feat:添加b站推送,写了一半

* feat:添加b站推送(后续看情况,替换掉chromepd)

* fix:修复一直推送直播的bug

* fix:添加缓存路径

* feat:添加推送列表,修复重复发消息的bug

* feat:发现禁用有用,删除多余指令

* fix:修改格式

* fix:sleep无效

* fix:修改直播card

* fix:增加长度

* fix:修改readme

* fix:修lint,并去掉cron

* fix:修lint

* fix:去掉日志

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-14 22:17:24 +08:00
fumiama
af8e6a63b9 💩👌 make lint happy 2022-01-14 22:17:03 +08:00
fumiama
8c8cd709b5 🔖 v1.2.4-beta1 2022-01-14 20:07:57 +08:00
fumiama
18ae566d34 💩👌 make lint happy 2022-01-14 20:00:02 +08:00
fumiama
9cfa44d434 🐛 fix: aireply 表情 2022-01-14 13:34:46 +08:00
fumiama
23393d9157 ✏️ edit import 2022-01-14 13:17:59 +08:00
fumiama
b676e00f0b 🐛 fix fontfile notfound error 2022-01-14 12:10:05 +08:00
fumiama
790200e519 🔥 运势 移除下载锁 2022-01-13 23:03:42 +08:00
fumiama
ccde99e695 📝 运势 恢复为传递 base64 2022-01-13 23:02:20 +08:00
fumiama
a80f8082cc 📝 update zbputils 2022-01-13 20:57:07 +08:00
fumiama
4b194627bb ️ remove cachefile on start 2022-01-13 20:51:07 +08:00
fumiama
d983c66597 💫 🎉 添加插件 DeepDanbooru二次元图标签识别 2022-01-13 20:47:07 +08:00
fumiama
30f6b57941 🐛 fix txt2img 2022-01-13 20:30:26 +08:00
fumiama
107979c459 🔥 drop writer 2022-01-13 19:17:59 +08:00
fumiama
f05f09d741 🍱 🎨 ️ 运势 不解压 不传 base64 2022-01-13 16:43:50 +08:00
fumiama
bc989f2fb0 🐛 fix score cache error 2022-01-12 12:33:02 +08:00
fumiama
9b4494a24f 🐛 fix new user error 2022-01-12 12:25:16 +08:00
fumiama
d3fafa7b9a 🐛 fix: fortune dlmu 2022-01-12 12:11:14 +08:00
fumiama
ce1e85e0a3 🔥 优化 score 并发 2022-01-12 11:57:16 +08:00
fumiama
560df5cade 🐛 fix(#95): aifalse error unckeck 2022-01-12 11:39:03 +08:00
fumiama
9f6e361e6e 💩👌 make lint happy 2022-01-12 11:33:55 +08:00
fumiama
00be4a856f 🎨 🚚 move zbpctrl into zbputils 2022-01-12 11:33:12 +08:00
fumiama
606aec4ec1 🚚 🎉 📝 合并 gif 2022-01-11 16:09:33 +08:00
github-actions[bot]
7f0f211333 🎨 改进代码样式 2022-01-11 07:32:06 +00:00
fumiama
42f761d44d ♻️ 🔥 优化青云客结构 2022-01-11 15:31:00 +08:00
fumiama
577b5b108f Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-01-11 12:08:59 +08:00
fumiama
4d39b32cf6 🙈 add ignore 2022-01-11 12:08:48 +08:00
github-actions[bot]
8279ed31d1 🎨 改进代码样式 2022-01-11 03:41:25 +00:00
fumiama
0185d0c730 🚚 ⬆️ 📝 🔥 🎨 迁移 ctrl, utils 2022-01-11 11:40:33 +08:00
fumiama
4ac1674cc0 📝 update data 2022-01-11 10:42:02 +08:00
github-actions[bot]
1c222a36ee 🎨 改进代码样式 2022-01-11 02:08:46 +00:00
himawari
16e05e0320 独立骂人插件 (#102)
* fix:vtb数据不用从zbp更新

* feat:独立骂人插件

* fix:修lint

* feat:添加关键词

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-11 10:07:51 +08:00
fumiama
8ea64e7aba 添加 -n -p 参数 2022-01-10 12:55:34 +08:00
fumiama
c22140103f 🐛 小修正 2022-01-10 12:17:39 +08:00
github-actions[bot]
8bd6e40ac8 🎨 改进代码样式 2022-01-09 15:22:17 +00:00
himawari
2ed25c6991 添加签到,引入分数机制 (#101)
* feat:添加签到功能,引入分数机制

* feat:修lint

* fix:加宽

* fix:修lint和加锁

* fix:解决冲突

* fix:二次判断
2022-01-09 23:21:36 +08:00
fumiama
d8991ec016 🐛 启动显示 banner 2022-01-09 23:20:00 +08:00
fumiama
dc9ca1e63f 💩👌 make lint happy 2022-01-09 22:53:22 +08:00
fumiama
7bb3203dfb 🐛 群管全局操作权限错误 2022-01-09 22:20:14 +08:00
fumiama
8ebe9548f7 ️ 优化 abs 2022-01-08 13:56:19 +08:00
fumiama
f90f20d3a8 🙈 同步 data 2022-01-08 11:53:52 +08:00
fumiama
1437e3b323 🎨 小修正 2022-01-07 22:47:32 +08:00
fumiama
d44171de61 ♻️ 🔥 优化 acgimage, 新增 ipv6 分流 2022-01-07 21:57:30 +08:00
fumiama
62a9e413fb 🔖 v1.2.3 2022-01-07 20:10:14 +08:00
fumiama
c12c48dea6 🐛 fix setdata&getdata 2022-01-07 20:07:10 +08:00
github-actions[bot]
7dd81525e4 🎨 改进代码样式 2022-01-07 11:48:23 +00:00
himawari
ca36038bbd 增加小爱回复 (#100)
* fix:去掉count,修sql

* feat:增加小爱回复

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修改设置回复模式

* fix:修lint

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2022-01-07 19:47:35 +08:00
fumiama
ca2f674696 更新 md5 服务器域名 2022-01-06 21:09:34 +08:00
fumiama
8acf9b817f ✏️ 修复 cd valid 判断 2022-01-06 12:40:48 +08:00
fumiama
2dc1fbde96 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2022-01-06 12:26:08 +08:00
fumiama
919651a2b3 💩👌 make lint happy 2022-01-06 12:25:56 +08:00
himawari
19b55a574f fix:去掉count,修sql (#99) 2022-01-03 23:13:24 +08:00
fumiama
a6ab7de475 ⬆️ 更新 摸鱼 元旦 2022-01-03 10:54:59 +08:00
fumiama
2ff229e9d9 ⚰️ 简化 getdata 2022-01-03 01:00:35 +08:00
fumiama
18def7c624 💩👌 make lint happy 2022-01-03 00:46:49 +08:00
fumiama
59a731df88 升级依赖 2022-01-03 00:36:40 +08:00
github-actions[bot]
6186356496 🎨 改进代码样式 2022-01-02 16:26:49 +00:00
himawari
045ee091a7 增加文字转图片&拟声鸟 (#96)
* feat:添加文字转图片,改造长文字

* fix:修改log

* fix:修改条件

* fix:不保存图片

* fix:增加block和优先级

* fix:文件夹首字母大写

* fix:修改解签为图片

* feat:添加拟声鸟

* fix:清理缓存

* fix:换一个音频

* fix:小修格式

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:修一下lint

* fix:10s一次

* fix:10s一次

* fix:修lint
2022-01-03 00:26:00 +08:00
github-actions[bot]
a69d985139 🎨 改进代码样式 2022-01-02 14:13:19 +00:00
fumiama
c13641dd1d ✏️ 修复 waitgroup 错误 2022-01-02 22:12:40 +08:00
fumiama
f0fc5d6598 同步 data 2022-01-02 22:06:54 +08:00
fumiama
2348039c16 ✏️ 加快 reg 处理速度 2022-01-02 15:06:35 +08:00
fumiama
7f8d34e8a0 ✏️ 修复 kanban panic 2022-01-02 14:09:27 +08:00
fumiama
205036b658 🎨 优化 win logrus 色彩显示 2021-12-30 12:32:31 +08:00
fumiama
9519896d04 remove apple in nightly 2021-12-27 17:10:10 +08:00
fumiama
aa83b63617 win 下 log 支持颜色 2021-12-27 16:59:07 +08:00
源文雨
3e89a372b3 Update main_win.go 2021-12-27 16:53:20 +08:00
源文雨
d464695b66 win 下 log 支持颜色 2021-12-27 16:51:53 +08:00
fumiama
657532f7e5 make lint happy 2021-12-26 22:21:00 +08:00
github-actions[bot]
3f69308603 🎨 改进代码样式 2021-12-26 14:00:48 +00:00
himawari
486160fc57 添加cp短打 (#94)
* feat:添加cp短打插件

* feat:匹配中英文标点符号和中文字符
2021-12-26 22:00:02 +08:00
fumiama
3939e0760f make lint happy 2021-12-26 21:59:48 +08:00
fumiama
16624a9596 ✏️ 修复 manager 定时器错误 2021-12-26 16:05:05 +08:00
fumiama
58e075e6ff make lint happy 2021-12-26 15:25:46 +08:00
github-actions[bot]
ef081714d7 🎨 改进代码样式 2021-12-26 07:17:57 +00:00
himawari
96802efa45 增加绝绝子和藏头诗 (#93)
* feat:添加绝绝子和藏头诗

* fix:去除日志

* fix:修一下help,replace,命名
2021-12-26 15:17:11 +08:00
fumiama
0a95f3198b make lint happy 2021-12-26 15:16:42 +08:00
fumiama
cb44758036 ✏️ 修复 manager 定时器错误
同时 make lint happy
2021-12-26 14:07:05 +08:00
fumiama
1682c321d3 ✏️ 升级到 go 1.17 2021-12-25 20:18:09 +08:00
fumiama
eeba8a5de7 move atri data to submodule 2021-12-25 14:01:51 +08:00
fumiama
2ea0f58e03 fix download error 2021-12-25 13:57:55 +08:00
fumiama
05235473c1 ✏️ 更新下载 url 2021-12-25 13:39:41 +08:00
fumiama
f0c083f4e6 ✏️ 将 data 作为子模块 2021-12-25 13:33:04 +08:00
fumiama
6997c9a5c0 rm data 2021-12-25 13:30:20 +08:00
fumiama
eebfa23509 make lint happy 2021-12-25 13:01:05 +08:00
github-actions[bot]
59fe8a021f 🎨 改进代码样式 2021-12-25 04:43:37 +00:00
himawari
16672d9b89 feat:添加抽象话插件 (#92) 2021-12-25 12:43:02 +08:00
fumiama
1d39fd8685 fix(manager): unable to open dbfile: out of memory 2021-12-24 19:52:51 +08:00
fumiama
ae41bdb7f8 ✏️ 修改摸鱼节日为动态变化 2021-12-24 13:14:40 +08:00
github-actions[bot]
4147f1056a 🎨 改进代码样式 2021-12-24 04:33:46 +00:00
fumiama
7c5d08b723 ✏️ make lint happy 2021-12-24 12:32:51 +08:00
himawari
a3b5a226ac 增加沙雕app一系列接口 (#91)
* feat:添加沙雕app一系列api

* fix: 修个文案

* fix:修改等级

* fix:好孩子不能骂人

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2021-12-24 12:32:26 +08:00
fumiama
f56cee9ec1 ✏️ 群管 gist 验证 自动设置昵称为用户名 2021-12-23 21:46:34 +08:00
fumiama
3b977535f1 ✏️ edit README 2021-12-22 18:57:30 +08:00
fumiama
ce8d98b77d fix: panic: database is locked (5) (SQLITE_BUSY) 2021-12-22 18:37:41 +08:00
fumiama
2858d0b0a4 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-12-21 22:22:11 +08:00
fumiama
1f982566e0 更新 codechina 域名 2021-12-21 22:22:01 +08:00
github-actions[bot]
779ec5b2fe 🎨 改进代码样式 2021-12-21 14:18:52 +00:00
fumiama
8499921d67 ✏️ 优化代码结构 2021-12-21 22:18:06 +08:00
fumiama
1e49bad1a6 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-12-21 22:12:09 +08:00
fumiama
1d3a61386d ✏️ 优化代码结构 2021-12-21 22:09:43 +08:00
github-actions[bot]
25ef2ca220 🎨 改进代码样式 2021-12-21 13:25:34 +00:00
himawari
b953385bc5 feat:添加词库,骂人和笑话 (#90)
Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2021-12-21 21:24:59 +08:00
fumiama
4fdedd0a7b ✏️ 增加黑名单 (#2) 2021-12-21 14:12:13 +08:00
Kanri
f4bc43e7a5 ✏️ 修改 windows 日志样式 2021-12-21 09:35:59 +08:00
fumiama
596c75eeca ✏️ make lint happy 2021-12-19 17:43:46 +08:00
fumiama
67a493ee84 ✏️ 更新 go.sum 2021-12-19 17:36:13 +08:00
fumiama
f9c7d9419e ✏️ make lint happy 2021-12-19 17:27:32 +08:00
github-actions[bot]
1a1a006283 🎨 改进代码样式 2021-12-19 08:06:16 +00:00
himawari
fd85ce0923 feat:添加铅笔小说搜索插件 (#89)
* feat:添加铅笔小说搜索插件

* fix:小修改help

* fix:微调语句

* fix:替换编码库

* fix:不修改go.sum
2021-12-19 16:05:29 +08:00
fumiama
5ff9069ff2 ✏️ make lint happy 2021-12-19 16:04:14 +08:00
fumiama
4ad7ff7971 ✏️ make lint happy 2021-12-19 11:39:30 +08:00
fumiama
a9f98763c4 ✏️ edit README 2021-12-17 12:30:48 +08:00
fumiama
3b637fad78 ✏️ aifalese 磁盘空间占用仅输出非0挂载点 2021-12-17 12:28:38 +08:00
fumiama
f202797964 ✏️ fix shindan by @Yiwen-Chan 2021-12-17 11:36:50 +08:00
fumiama
242d780048 ✏️ edit README 2021-12-16 17:02:03 +08:00
fumiama
bf23364097 ✏️ edit README 2021-12-16 17:00:11 +08:00
fumiama
7eaac7a20b ✏️ fix gist panic 2021-12-16 16:27:25 +08:00
fumiama
45448e6f53 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-12-16 15:30:29 +08:00
fumiama
08ee458a27 ✏️ edit README 2021-12-16 15:30:19 +08:00
github-actions[bot]
3f97541956 🎨 改进代码样式 2021-12-16 07:28:22 +00:00
fumiama
e2c603338e ✏️ drop all pb & 增加 gist 审批 2021-12-16 15:27:47 +08:00
fumiama
a363623df9 ✏️ drop pb in timer 2021-12-16 12:51:41 +08:00
github-actions[bot]
b871573dc3 🎨 改进代码样式 2021-12-15 14:29:05 +00:00
himawari
ad33c1ca3c 添加coser插件 (#87)
* feat:添加coser

* fix:删除测试代码

* fix:莫名其妙的库

* fix:加个限制器

* fix:修改限制器

* fix:改回去

* fix:改回去

* fix:添加标题

* fix:t大写

* fix:异常注释

* feat:添加文档

* feat:合并消息私聊无效

* feat:改个顺序

* Update go.sum

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2021-12-15 22:28:06 +08:00
fumiama
810cb284b6 ✏️ 优化 ci 2021-12-15 22:26:05 +08:00
fumiama
d0ffb25594 ✏️ 优化 ci 2021-12-15 22:21:13 +08:00
fumiama
2b6796d1d1 ✏️ 优化 ci 2021-12-15 22:15:31 +08:00
fumiama
52093f3dd3 ✏️ 优化 aifalse 2021-12-15 16:01:56 +08:00
fumiama
2a5c1ac92c ✏️ print kanban on start 2021-12-15 15:38:05 +08:00
fumiama
6e0222f5e2 ✏️ 优化 aifalse 2021-12-15 15:30:48 +08:00
fumiama
4bebf79266 ✏️ fix far connect in updater 2021-12-15 13:50:41 +08:00
fumiama
b6dadc142b ✏️ more log in updater 2021-12-15 13:00:10 +08:00
github-actions[bot]
1cbc49251b 🎨 改进代码样式 2021-12-14 06:27:57 +00:00
fumiama
d2d5b5863b ✏️ drop pb in Diana 2021-12-14 14:27:19 +08:00
fumiama
65f9203597 ✏️ drop pb in fortune 2021-12-14 13:51:15 +08:00
fumiama
4c1926e395 ✏️ fix fortune config 2021-12-14 13:41:24 +08:00
fumiama
516d937149 ✏️ 添加公告看板 2021-12-14 13:35:00 +08:00
github-actions[bot]
7af17c3c65 🎨 改进代码样式 2021-12-14 05:34:20 +00:00
fumiama
33b85207f5 ✏️ 添加公告看板 2021-12-14 13:33:28 +08:00
fumiama
218119e10e ✏️ 优化 updater log 2021-12-14 13:18:26 +08:00
fumiama
4485d3d5a9 ✏️ 优化 updater log 2021-12-14 13:17:46 +08:00
fumiama
fcf62a31e1 ✏️ edit README 2021-12-14 12:09:30 +08:00
fumiama
ebdc83809c ✏️ edit README 2021-12-14 12:06:33 +08:00
fumiama
61a3c30a45 ✏️ edit README 2021-12-14 12:04:34 +08:00
fumiama
0e4cab7221 ✏️ edit README 2021-12-14 12:02:38 +08:00
fumiama
865c90a85a ✏️ 优化 updater reg 关闭逻辑 2021-12-14 12:00:44 +08:00
fumiama
c9b06a4fa8 ✏️ edit README 2021-12-13 21:57:13 +08:00
fumiama
0e75143a42 ✏️ edit README 2021-12-13 21:42:52 +08:00
fumiama
ce333c5793 ✏️ 更改为v1.1.2 2021-12-13 21:23:04 +08:00
github-actions[bot]
6b4045db45 🎨 改进代码样式 2021-12-13 13:15:16 +00:00
fumiama
3fba704c77 ✏️ 更新依赖 2021-12-13 21:14:29 +08:00
fumiama
0712a80ea0 ✏️ 同步时序 2021-12-13 21:06:11 +08:00
fumiama
8969c44b3f ✏️ 统一懒加载验证 2021-12-13 20:49:00 +08:00
fumiama
f7a3c0e6c6 ✏️ 加入 kuji.db 2021-12-13 13:11:42 +08:00
himawari
b1852a1de6 新增解签指令和修复sleep的时间判断 (#86) 2021-12-13 12:29:21 +08:00
fumiama
5645fa0168 ✏️ sql 防注入 2021-12-08 17:35:22 +08:00
fumiama
c824b2e0b4 ✏️ 迁移到 utils/sql 2021-12-08 17:30:16 +08:00
fumiama
1c0d2b2f95 ✏️ 迁移到 utils/sql 2021-12-08 17:27:29 +08:00
fumiama
10b8ab297a ✏️ 迁移到 utils/sql 2021-12-08 17:13:00 +08:00
fumiama
e8b0e475d7 ✏️ 迁移数据库本体 2021-12-08 17:10:22 +08:00
fumiama
7fc4a6425b ✏️ 迁移到 utils/sql 2021-12-08 16:44:46 +08:00
himawari
a8a3c48e6c fix:修复sql错误 (#85)
* fix:捕获协程异常

* feat:添加睡眠时间

* feat:添加睡眠管理功能

* fix:修改对标时间

* fix:修复sql错误

* feat:添加书评功能

* fix:调整格式

* fix:去掉recover

* feat:更新文档

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2021-12-08 13:12:40 +08:00
fumiama
9fca69302b Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-12-07 23:29:08 +08:00
fumiama
ba6811224e add gocqzbp in README 2021-12-07 23:28:57 +08:00
Kanri
ca4a682794 ✏️ 优化戳一戳命令牌为群号 2021-12-07 09:01:30 +08:00
fumiama
b9ddcfc3d7 ✏️ 小修正 2021-12-06 21:17:41 +08:00
fumiama
b20cb1c0a0 ✏️ nwife 防注入 2021-12-06 19:33:47 +08:00
Kanri
1d9813691c 🎨️ 优化搜索仓库默认带图片 2021-12-06 09:03:09 +08:00
fumiama
08f8954e03 ✏️ 小修正 2021-12-04 21:31:14 +08:00
fumiama
610f04ab87 ✏️ 人肉 lint 2021-12-04 20:56:43 +08:00
himawari
793cac09cb 新增统计睡眠时间和添加协程里的异常捕获 (#84)
* fix:捕获协程异常

* feat:添加睡眠时间

* feat:添加睡眠管理功能

* fix:修改对标时间

* fix:修改注释函数名,使用一个时间

* feat:让大家能够更加清楚的看到每一个功能

* feat:把群管放在control,增加退群信息

* fix:不会recover

* fix:原本的正则限制机器人回复回复的消息,故去掉正则

* fix:添加服务详情,整理manager

* feat:chat进control

Co-authored-by: Guohuiyuan <haibaraguo@yeahka.com>
2021-12-04 20:46:24 +08:00
fumiama
d0d07604e5 ✏️ 增加一点注释 2021-12-03 23:12:45 +08:00
fumiama
fcf6d087a7 ✏️ dep: use RomiChan/protobuf 2021-12-03 13:36:43 +08:00
yuanyan3060
35587ccb85 Update manager.go (#83)
避免bot自身加入群聊时触发群欢迎。
2021-12-02 11:23:54 +08:00
fumiama
9df5b6cc33 ✏️ 抽 wife 插件 新增功能 2021-12-01 15:40:18 +08:00
fumiama
ffeedf576d control 新增 配置数据 2021-12-01 14:52:54 +08:00
fumiama
151ce216ab 新增 抽wife 插件 2021-12-01 12:53:03 +08:00
fumiama
20835f9858 ✏️ 修正 aifalse man 2021-12-01 11:46:59 +08:00
fumiama
63a61f2fb5 ✏️ 修正 本地 setu 插件 2021-11-29 22:49:31 +08:00
fumiama
c553248cf4 ✏️ 修正 本地 setu 插件 2021-11-29 22:31:02 +08:00
fumiama
cdd1dc68da ✏️ 修正 本地 setu 插件 2021-11-29 22:29:07 +08:00
fumiama
37af3c1498 ✏️ edit README 2021-11-29 21:03:15 +08:00
fumiama
1bc3847345 ✏️ manager 插件 hint 小修正 2021-11-29 20:45:02 +08:00
fumiama
f14d8ab5f6 ✏️ edit README 2021-11-29 20:39:57 +08:00
fumiama
bb63b98f39 ✏️ 更改版本为 v1.2.1 2021-11-29 20:27:42 +08:00
fumiama
f3f7e2d3c1 ✏️ 修正 sql 2021-11-29 20:25:14 +08:00
fumiama
89121cfc57 新增 本地 setu 插件 2021-11-29 15:33:15 +08:00
fumiama
d8a41a5ee1 ✏️ 修复 control 找不到服务时 panic (#81) 2021-11-27 01:10:51 +08:00
fumiama
f8ca9355d2 ✏️ 修复 control 全局禁用 2021-11-27 00:56:22 +08:00
fumiama
d4bceb1922 ✏️ 修复 control 全局禁用 2021-11-27 00:49:50 +08:00
fumiama
876d85ac4e ✏️ 修复 control 全局禁用 2021-11-27 00:48:32 +08:00
fumiama
ab34930beb ✏️ 修复 control 全局禁用 2021-11-27 00:40:48 +08:00
fumiama
35f7450ab2 ✏️ 修复 control 全局禁用 2021-11-27 00:36:29 +08:00
fumiama
2917ff6701 ✏️ 持久化 fansdaily 2021-11-26 19:45:48 +08:00
fumiama
d1656b25c9 ✏️ 默认禁用 wtf 2021-11-26 19:22:02 +08:00
fumiama
e6a20866b6 ✏️ 优化 getea 2021-11-26 18:48:05 +08:00
fumiama
9de065d31a ✏️ 修正 moyu 提醒 2021-11-26 11:39:43 +08:00
fumiama
37d27e07e9 ✏️ 小修正 2021-11-25 22:39:25 +08:00
fumiama
01853768db ✏️ 小修正 2021-11-23 23:25:04 +08:00
fumiama
9d3787dfc2 ✏️ 小修正 2021-11-23 23:05:59 +08:00
fumiama
e9f145056d ✏️ 小修正 2021-11-23 22:51:18 +08:00
fumiama
ea17943bff ✏️ 新增 wtf 2021-11-23 22:40:49 +08:00
fumiama
180c32ef50 ✏️ 优化 moyu 格式 2021-11-23 21:35:42 +08:00
fumiama
17bb844360 ✏️ vtb drop unsafe 2021-11-23 13:05:16 +08:00
fumiama
3d0a161176 ✏️ 修正 badge 2021-11-23 12:46:05 +08:00
fumiama
1148867d3c Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-11-23 12:33:33 +08:00
fumiama
c83d01e977 ✏️ 修复摸鱼 cron 2021-11-23 12:33:24 +08:00
ByronLeeeee
7c42d6f857 修复代理域名,解决PC端无法看图问题 (#80)
1.代理域名从.cat替换成.re;
2.Large尺寸图无法在PC QQ看见,已更改成Medium尺寸
2021-11-23 12:30:40 +08:00
fumiama
ac1c6bc74b ✏️ 在 main 添加摸鱼 2021-11-22 22:40:01 +08:00
fumiama
12f96bb95c ✏️ 修复 vtb panic 判断失误 2021-11-22 22:33:29 +08:00
fumiama
fa063a05f7 ✏️ 修复 vtb 自动下载数据库失败 2021-11-22 22:29:07 +08:00
fumiama
51d10d3234 升级加密算法 2021-11-22 22:22:13 +08:00
fumiama
2d2db15813 新增 moyu 说明 2021-11-22 22:06:22 +08:00
fumiama
006c782819 b14 增加口令加解密 2021-11-22 22:04:31 +08:00
fumiama
37e36fb886 ✏️ 修复 sql 加载失败 2021-11-22 21:48:22 +08:00
fumiama
0e026a8b3b ✏️ 修复 webgui 监听端口问题 2021-11-22 19:12:29 +08:00
fumiama
f37daa5ca6 ✏️ 优化 vtbquotation 2021-11-22 18:56:52 +08:00
fumiama
dafcf7049b ✏️ 修正 moyu 逻辑 2021-11-22 17:53:10 +08:00
fumiama
207da3fcd9 ✏️ 修正 moyu 逻辑 2021-11-22 17:49:37 +08:00
fumiama
a3fbe5d747 ✏️ 优化 moyu,升级依赖 2021-11-22 13:41:55 +08:00
散无友纪
c1717c71bd 摸鱼提醒 (#79)
* Add files via upload

* Update run.go

* Update run.go

* Update run.go
2021-11-22 13:07:04 +08:00
himawari
bcd111f585 小小的修改一下cron表达式 (#77)
* fix:小修一下表达式

* fix:小修一下表达式
2021-11-22 13:01:17 +08:00
github-actions[bot]
d6f1113201 🎨 改进代码样式 2021-11-20 05:35:43 +00:00
himawari
e812d2a074 添加vtb语音包 (#74)
* fix:给msg进行url编码,解决青云客接口返回错误

* feat:增加一个vtbkeyboard.moe接口

* fix:id添加映射

* feat:优化逻辑

* feat:优化逻辑

* feat:优化逻辑

* feat:优化逻辑

* feat:增加一个随机vtb

* feat:增加一个随机vtb

* refactor:更改代码逻辑

* feat:更新数据库

* feat:更新数据库

* feat:更新数据库

* feat:更新数据库

* feat:更新数据库驱动

* feat:增加定时更新数据脚本

* feat:更换驱动

* fix:更新zerobot

* fix:修改全局变量

* fix:微调位置

* fix:解决modernc.org/sqlite版本冲突

* fix:解决go.sum冲突,更换cron库
2021-11-20 13:34:37 +08:00
huoxue1
a537306307 webui功能添加 (#75)
* feat: webui添加功能

为webui添加处理request的请求
包括好友添加请求,群邀请请求,群申请加入请求

* feat: webui添加功能

为webui添加手动处理request的请求的功能
包括好友添加请求,群邀请请求,群申请加入请求

* fix: 修改request对象为指针存储
2021-11-12 18:12:31 +08:00
fumiama
206889bdc5 更新 zb 到 v1.4.1 2021-11-11 20:39:49 +08:00
fumiama
58c7b5c818 ✏️ 修复 lolicon 无法下载 2021-11-09 13:19:33 +08:00
fumiama
eace561f73 ✏️ 修复 fortune 无法下载 2021-11-09 13:09:11 +08:00
fumiama
e2032cdc74 ✏️ 修复 webgui 无法启动 2021-11-09 13:01:01 +08:00
源文雨
34bc8e3a3c Update tl.go 2021-11-09 12:41:41 +08:00
源文雨
1304611ab7 Update http.go 2021-11-09 12:41:08 +08:00
himawari
7a0ce4b5d6 fix:给msg进行url编码,解决青云客接口返回错误 (#73) 2021-11-06 18:55:34 +08:00
github-actions[bot]
835df33e11 🎨 改进代码样式 2021-11-03 05:37:24 +00:00
fumiama
fb80c3606b 新增 搜番 插件 2021-11-03 13:36:46 +08:00
fumiama
f0c80693bb 新增 搜番 插件 2021-11-03 13:34:54 +08:00
fumiama
6997c2f2b9 ✏️ 优化 main 2021-11-02 17:18:55 +08:00
fumiama
cb1057cd5e ⬆️ 更新 zb 到 v1.4.0 2021-11-02 17:18:21 +08:00
fumiama
eb1e2de917 ✏️ 优化 win 下 log 格式 2021-11-01 22:12:56 +08:00
fumiama
4b9b66e7d0 ✏️ 调整 acgimage 限速器 2021-10-31 22:53:11 +08:00
fumiama
c1e87ace78 atri 插件 引入 control 2021-10-31 19:28:31 +08:00
fumiama
ba9eb9c023 acgimage 增加限速器 2021-10-31 19:19:13 +08:00
fumiama
3084d4ad54 atri 插件 引入 control 2021-10-31 19:13:20 +08:00
fumiama
fcb13c19a1 群管自闭增加匹配项 2021-10-31 19:01:01 +08:00
fumiama
d6b81d0363 ✏️ v1.1.8 -> v1.2.0 2021-10-29 13:15:50 +08:00
fumiama
fdd1135a66 ✏️ 修正 timer 2021-10-29 12:54:11 +08:00
fumiama
f9ce439e56 ✏️ 修正正则与cd认证 2021-10-29 12:48:56 +08:00
fumiama
9608d1e736 ✏️ 小修正 2021-10-28 21:24:01 +08:00
fumiama
776d7fbbd9 ✏️ 小修正 2021-10-28 21:06:39 +08:00
fumiama
7c69c24362 ✏️ 在 main.go 引入 b14 2021-10-28 21:04:48 +08:00
fumiama
d205d48166 新增 插件冲突检测、b14 加解密 添加随机等待 1~2s 工具函数 2021-10-28 21:03:09 +08:00
fumiama
dd32aec462 新增插件翻译 by @sky-rainy 2021-10-28 17:05:59 +08:00
fumiama
c0327fe733 manager cron 完善 2021-10-28 11:40:30 +08:00
fumiama
6f4c40f450 差异化 pb 2021-10-27 23:55:54 +08:00
fumiama
022ee6cd95 manager 增加 cron 2021-10-27 23:50:46 +08:00
Kanri
085e04c9ba 🎨 改进结构 2021-10-27 22:28:19 +08:00
fumiama
19f58acb79 改用增强版 cron 2021-10-27 20:45:08 +08:00
fumiama
90dd60b942 升级依赖 & hs drop req 2021-10-27 19:35:57 +08:00
fumiama
755bfeaa5b fortune 增加下载锁;优化 gui 插件控制 2021-10-27 12:42:34 +08:00
fumiama
82ee2f6b0a 更改版本号到 v1.1.8 2021-10-27 10:34:18 +08:00
fumiama
500d03f293 ✏️ 优化打印 2021-10-27 00:19:17 +08:00
fumiama
ee99abe6ff 修复 timer 计时错误 2021-10-27 00:10:33 +08:00
fumiama
0563006c55 修复 timer 计时错误 2021-10-26 22:24:28 +08:00
fumiama
31db6fa4fb 修复 timer 计时错误 2021-10-26 22:09:01 +08:00
fumiama
043b543cfa 修复 timer 计时错误 2021-10-26 16:05:28 +08:00
fumiama
7b52599da7 修复 timer 计时错误 2021-10-26 15:22:00 +08:00
fumiama
4dc8e5619c 优化 timer 资源消耗 2021-10-26 15:05:32 +08:00
fumiama
21ff752322 ✏️ 离散化加载时间 2021-10-26 13:18:48 +08:00
fumiama
0f687d6e95 🔙 合并 timer 2021-10-26 13:11:45 +08:00
fumiama
22e23efbdc ✏️ 修复 sql 查询异常 2021-10-26 00:48:13 +08:00
fumiama
38935937ae control 增加还原;调整禁用优先级 2021-10-26 00:05:45 +08:00
fumiama
a3685e2e83 ✏️ 尝试解决win下路径异常 2021-10-24 18:13:12 +08:00
fumiama
3a5e391191 修正代码问题 2021-10-23 11:51:32 +08:00
fumiama
09a9dd53fd 修正代码问题 2021-10-23 01:09:15 +08:00
github-actions[bot]
5e064249be 🎨 改进代码样式 2021-10-22 16:55:19 +00:00
fumiama
67555512e7 搜图下载使用animeapi,将文件判存移至utils 2021-10-23 00:54:38 +08:00
fumiama
591df6439c 更新 goreleaser 2021-10-22 11:37:40 +08:00
fumiama
7dfb7dfe24 更新 goreleaser 2021-10-22 11:20:01 +08:00
Kanri
8e56f137b6 ⬆️ 更新依赖 2021-10-22 09:36:11 +08:00
源文雨
3b61c73c17 Update README.md 2021-10-20 22:56:31 +08:00
fumiama
44dac98b37 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-10-18 15:25:06 +08:00
fumiama
1a7f98379a ✏️ 修正 acgimage 发图 2021-10-18 15:24:56 +08:00
Kanri
4109ef0612 Update main.go 2021-10-17 23:56:34 +08:00
fumiama
93a9bf6c5b 更新 ZeroBot 到 v1.3.2 2021-10-16 19:07:41 +08:00
fumiama
0b7b35cdcc control 支持全局禁用&个人用户 2021-10-16 14:02:44 +08:00
fumiama
350ef86dd6 ✏️ control 减少 defer 开销 2021-10-16 13:33:12 +08:00
fumiama
2d69ae2e42 ✏️ driver 使用 api 写法 2021-10-16 13:25:13 +08:00
Kanri
e95367f4b2 Merge pull request #70 from Yiwen-Chan/master
⬆️ 更新依赖
2021-10-16 11:11:59 +08:00
Kanri
3101911aa2 ⬆️ 更新依赖 2021-10-16 11:09:26 +08:00
Kanri
ac73087f93 Merge pull request #69 from Yiwen-Chan/master
🎨 ctx.Send -> ctx.SendChain
2021-10-15 22:05:02 +08:00
Kanri
d375a3bbbb 🎨 小修改 2021-10-15 22:02:14 +08:00
Kanri
c46ca1d4c2 🎨 ctx.Send -> ctx.SendChain 2021-10-15 21:43:47 +08:00
fumiama
2a1cca8ebb ✏️ 防止文件名重复 2021-10-15 16:28:31 +08:00
fumiama
d1fdc989b6 ✏️ 防止文件名重复 2021-10-15 16:21:01 +08:00
fumiama
672215f753 ✏️ windows取消arm系 2021-10-15 16:10:58 +08:00
fumiama
4160175fcf ✏️ 修改编译逻辑 2021-10-15 16:02:11 +08:00
fumiama
8f8ba55fc9 ✏️ 改用 gocq 同款 release 2021-10-15 16:00:54 +08:00
fumiama
1dbb4aa837 ✏️ 改用 gocq 同款 release 2021-10-15 15:57:42 +08:00
fumiama
c183c4f17d ✏️ 修正zip缓存位置 2021-10-15 15:27:19 +08:00
fumiama
fa6d14d89a ✏️ 修正zip缓存位置 2021-10-15 15:10:09 +08:00
fumiama
65b92b9da3 更新 README 2021-10-15 14:43:31 +08:00
fumiama
a7056c4601 更新 README 2021-10-14 23:38:52 +08:00
fumiama
1dce0f7859 更新 README 2021-10-14 23:32:49 +08:00
fumiama
bdffbfab67 ✏️ 分离 data 2021-10-14 23:07:13 +08:00
fumiama
98b21d0fdf ✏️ str byte 转换改用 zb 的工具 2021-10-14 19:51:24 +08:00
fumiama
cccea70db1 ✏️ 分离 dyloader 2021-10-14 16:26:01 +08:00
fumiama
d2bcd0bc9f Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-10-14 13:46:44 +08:00
fumiama
08653fd3b6 🚮 删除多余文件 2021-10-14 13:46:30 +08:00
fumiama
75d0671d9b dyloader 缩小插件体积 2021-10-14 13:45:14 +08:00
fumiama
51ec3c32a9 dyloader 缩小插件体积 2021-10-14 13:44:16 +08:00
fumiama
ec0032c5ab dyloader 移除 win,增加加载插件 2021-10-14 00:06:13 +08:00
fumiama
2723f3662c ✏️ 禁用 dyloader 2021-10-13 18:40:40 +08:00
fumiama
539b050b97 ✏️ 完成插件卸载 2021-10-13 18:39:54 +08:00
fumiama
a0b9623a9f dyloader 增加 win,优化 register 2021-10-13 11:07:34 +08:00
fumiama
6b263418a0 升级 zb 到 v1.3.0 2021-10-13 00:34:43 +08:00
fumiama
92989ce9fd control 增加 Delete 2021-10-12 19:16:01 +08:00
fumiama
173925b57a 增加动态加载,添加默认禁用 2021-10-11 21:44:46 +08:00
fumiama
43735722bf ✏️ 收集 max / min 到 data 包 2021-10-11 14:24:22 +08:00
fumiama
d89e7aebec 增加-u参数说明 2021-10-11 13:35:03 +08:00
fumiama
4677d789f2 增加-u参数 2021-10-11 13:32:23 +08:00
fumiama
2fb445746e Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-10-11 13:18:15 +08:00
fumiama
505dfef48c 增加-h参数说明 2021-10-11 13:18:06 +08:00
fumiama
19a9a8ef83 增加-h参数说明 2021-10-11 13:16:30 +08:00
fumiama
119730bada 增加-h参数,优化参数处理 2021-10-11 13:15:38 +08:00
fumiama
c46748524a 增加-w参数 2021-10-10 12:00:23 +08:00
fumiama
29f833db41 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-10-10 11:52:26 +08:00
fumiama
1232856b21 beautify 2021-10-10 11:52:18 +08:00
github-actions[bot]
770ae6ebd0 🎨 改进代码样式 2021-10-10 03:51:49 +00:00
fumiama
8c9ced0bda ✏️ 解耦 web gui 2021-10-10 11:51:09 +08:00
fumiama
3b3dd3df99 fortune 个人用户也可设置底图 2021-10-10 11:37:41 +08:00
fumiama
0817e6233d 更新时间 2021-10-09 12:51:05 +08:00
fumiama
aa4f428194 更新依赖 2021-10-09 12:50:06 +08:00
fumiama
73717dec73 更新帮助 2021-10-09 12:48:58 +08:00
github-actions[bot]
57e2ef3bab 🎨 改进代码样式 2021-10-09 04:36:26 +00:00
fumiama
a5d0b8db8e fortune 增加设置底图并加速base64 和下载 2021-10-09 12:30:59 +08:00
fumiama
3faec79371 ✏️ 解决hs cache问题 2021-10-07 12:23:59 +08:00
散无友纪
c3e0520aec 修改了搜索结果样式 (#68)
* Update run.go

* Update run.go

* Update run.go

* Update run.go

Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2021-10-07 12:21:39 +08:00
源文雨
76db0b6fb4 Update keyword.go 2021-10-07 12:21:20 +08:00
Kanri
40a8473ce0 Merge pull request #67 from Yiwen-Chan/master
改进 fortune 插件
2021-10-06 13:15:04 +08:00
Kanri
21c1d104b8 Merge branch 'master' of github.com:Yiwen-Chan/ZeroBot-Plugin 2021-10-06 10:35:36 +08:00
Kanri
0dda861863 🎨 改进 fortune 2021-10-06 10:33:22 +08:00
Kanri
b21f2f7166 Merge pull request #66 from Yiwen-Chan/master
 增加运势图片插件
2021-10-05 12:17:44 +08:00
Kanri
e533170160 🎨 make lint happy 2021-10-05 12:16:36 +08:00
Kanri
8236874779 🎨 make lint happy 2021-10-05 12:10:45 +08:00
Kanri
4cc1dc2d1b 增加 fortune 插件 2021-10-05 12:03:31 +08:00
Kanri
18424bea7c 🙈 增加 fortune 素材文件忽略 2021-10-05 12:02:49 +08:00
Kanri
0cc6251c0d 增加 gg 绘图库直接依赖 2021-10-05 12:02:22 +08:00
Kanri
63d87be789 增加运势图片插件 2021-10-05 00:57:22 +08:00
Kanri
7e3b898383 Merge pull request #65 from starim00/forup
搜图增加浏览器标头
2021-09-30 14:47:05 +08:00
hutiance
217fa62004 用结果数组的长度作为随机数最大值、防止越界 2021-09-30 14:42:09 +08:00
hutiance
e667fb8708 搜图增加浏览器标头 2021-09-30 14:24:56 +08:00
fumiama
2fef6f51b5 ✏️ fix plugin gif 2021-09-27 22:38:24 +08:00
fumiama
81bba8595a Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-27 22:10:55 +08:00
fumiama
96aefc3938 ✏️ 调整 log 格式 2021-09-27 22:10:47 +08:00
github-actions[bot]
5bb0493f02 🎨 改进代码样式 2021-09-27 14:10:29 +00:00
fumiama
e8fa6b8b07 ✏️ 增加命令行参数说明 2021-09-27 22:09:51 +08:00
fumiama
ec15178ba7 ✏️ 修正命令行参数 2021-09-27 22:06:46 +08:00
fumiama
1d469a40d5 aifalse 增加 清理缓存 2021-09-27 21:51:05 +08:00
fumiama
4df30a56a3 ✏️ 修复 panic 2021-09-27 21:37:55 +08:00
fumiama
6bc1e407d5 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-27 21:31:54 +08:00
fumiama
48442330c1 ✏️ 美化 log & 更新 banner 2021-09-27 21:31:38 +08:00
fumiama
3623a88b16 ✏️ 调整 log 格式 2021-09-27 21:27:30 +08:00
github-actions[bot]
ffca19edab 🎨 改进代码样式 2021-09-27 13:20:16 +00:00
fumiama
52a8a9de6f 增加插件 reborn 2021-09-27 21:19:37 +08:00
fumiama
b9e303196f ✏️ gif插件增加缓存 2021-09-27 20:23:15 +08:00
fumiama
da3a7e12bd update ZeroBot-Plugin-Gif to v0.1.6 2021-09-26 10:39:43 +08:00
huoxue1
21013bde98 feat: 添加webui的初步支持 (#63)
* feat: 添加webui的初步支持

使用gin监听server,前端使用vuecli
目前已支持:
   前端发送信息
   前端获取信息
   获取插件列表
预计实现功能:

改变插件状态
  获取日志
  获取配置信息
  改变配置信息
  获取好友请求列表以及群请求列表
  手动同意申请列表

* feat: 继续实现webui功能

改变插件状态
  获取日志
  获取配置信息
  前端仓库位置更改

* fix: 修复golangLint的提示信息

* 🎨 改进代码样式

* Update gui.go

* fix: 修复golangLint的提示信息

* fix: 修复golangLint的提示信息

* feat: 支持通过命令行参数禁用gui

* fix: 设置gin在非debug模式下禁用日志

* Update gui.go

* Update gui.go

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
2021-09-26 10:35:07 +08:00
fumiama
ae6d83c675 mlh 2021-09-26 10:26:23 +08:00
fumiama
f932e24573 mlh 2021-09-26 10:25:26 +08:00
fumiama
a588ec9d18 mlh 2021-09-26 10:24:46 +08:00
fumiama
bc23211f23 make lint happy 2021-09-26 10:23:52 +08:00
源文雨
78ebf39624 Update choose.go 2021-09-26 10:21:41 +08:00
源文雨
bbc2ab5f17 Update register.go 2021-09-26 10:20:57 +08:00
源文雨
2ffe1e9112 Update rule.go 2021-09-26 10:20:40 +08:00
源文雨
1036733fcb Update register.go 2021-09-26 10:19:10 +08:00
源文雨
ebd5555955 Update text.go 2021-09-26 10:18:21 +08:00
源文雨
83199cf3aa Update nbnhhsh.go 2021-09-26 10:15:22 +08:00
源文雨
c724be743d Update sqlite.go 2021-09-26 10:09:04 +08:00
源文雨
42ba65e21b Update nbnhhsh.go 2021-09-26 10:07:57 +08:00
Kanri
3405c1c45a 翻牌改为抽取最近发言的人 2021-09-25 18:11:53 +08:00
Kanri
5cb6608e17 🗃️🍱 更新数据库 2021-09-25 18:03:11 +08:00
fumiama
aa891ad3fa ✏️ 修复某些 gif 制作失败 2021-09-19 19:44:45 +08:00
fumiama
158bda52a8 ✏️ 升级gif 2021-09-19 19:10:49 +08:00
fumiama
57e5ea87d8 ✏️ 修正制图小错误 2021-09-19 18:07:08 +08:00
fumiama
74486f65cf ✏️ 简化&美化日志输出 2021-09-19 17:06:24 +08:00
fumiama
27fcb63601 ✏️ 制图增加 control 2021-09-19 16:48:41 +08:00
github-actions[bot]
8d83d6be2f 🎨 改进代码样式 2021-09-12 10:43:19 +00:00
Kanri
d31e67e598 Merge pull request #61 from DiheChen/master
Introduce new feature: choose
2021-09-12 18:42:53 +08:00
Chendihe4975
629d3c1fa8 帮助选择困难症 2021-09-12 17:52:30 +08:00
Kanri
193d6efa67 Merge pull request #60 from DiheChen/master
Introduce new feature: 拼音首字母缩写释义工具
2021-09-12 15:44:30 +08:00
Chendihe4975
c70dbd219c Update README 2021-09-12 15:37:54 +08:00
Chendihe4975
da289073e2 拼音首字母缩写释义工具 2021-09-12 15:34:38 +08:00
fumiama
5aad22f254 ✏️ 更新README 2021-09-12 14:43:17 +08:00
fumiama
815c8f97d0 ✏️ 更新README 2021-09-12 14:41:25 +08:00
fumiama
7123fc7e37 ✏️ 更新README 2021-09-12 14:38:43 +08:00
github-actions[bot]
fee3d9c145 🎨 改进代码样式 2021-09-12 01:50:01 +00:00
Kanri
6808e6e1b4 更新依赖 2021-09-12 09:48:43 +08:00
Kanri
12f25a308a 增加制图插件 2021-09-12 09:48:29 +08:00
fumiama
7fe401faa8 ✏️ 缩小青云客匹配范围 2021-09-10 15:05:15 +08:00
fumiama
182fb7c783 ✏️ 缩小青云客匹配范围 2021-09-10 15:04:37 +08:00
fumiama
c06b53afef ✏️ 缩小青云客匹配范围 2021-09-10 15:00:05 +08:00
fumiama
65a5b53b88 ✏️ 缩小青云客匹配范围 2021-09-10 14:52:36 +08:00
fumiama
e8503e97e3 ✏️ 修复帮助冲突 2021-09-10 14:43:44 +08:00
fumiama
f9a914926e ✏️ 美化格式 2021-09-10 14:31:44 +08:00
fumiama
8d4d6c7e5e ✏️ 美化格式 2021-09-10 14:31:10 +08:00
fumiama
dbb681e8a6 ✏️ 插件控制 增加当前群开启状态显示 2021-09-10 14:29:03 +08:00
fumiama
f0d7b38a73 ✏️ 避免重复调用 2021-09-10 14:16:33 +08:00
fumiama
70da534bfb Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-10 14:00:56 +08:00
fumiama
308ec05405 ✏️ 修复首次启动可能 panic 2021-09-10 14:00:46 +08:00
Kanri
5fe5e8a304 Update README.md 2021-09-09 23:58:44 +08:00
fumiama
b02789b560 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-09 20:58:10 +08:00
fumiama
7e98064e09 ✏️ banner 更新版本与时间 2021-09-09 20:58:01 +08:00
github-actions[bot]
eaada5667e 🎨 改进代码样式 2021-09-09 12:51:27 +00:00
fumiama
b83ca94d98 ✏️ 优化排版 2021-09-09 20:50:48 +08:00
fumiama
bd88c68208 ✏️ 增加 setblock 避免冲突 2021-09-09 12:31:57 +08:00
fumiama
6e0b754a66 ✏️ 优化control 2021-09-09 12:21:48 +08:00
github-actions[bot]
94abf34466 🎨 改进代码样式 2021-09-09 03:14:09 +00:00
fumiama
91396c8885 应用插件控制到大部分插件 2021-09-09 11:13:23 +08:00
fumiama
cb3cfa054b ✏️ 取消部分 @ 以免多次匹配 2021-09-09 00:45:49 +08:00
fumiama
ebf58d4b73 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-09 00:38:04 +08:00
fumiama
f704cddae8 修正 2021-09-09 00:37:49 +08:00
github-actions[bot]
f03d2f3940 🎨 改进代码样式 2021-09-08 16:20:47 +00:00
fumiama
087c6c0298 新增插件控制 2021-09-09 00:20:04 +08:00
fumiama
be49ba83b3 ✏️ 根据 PID 搜图增加删图判断 2021-09-08 18:40:41 +08:00
fumiama
843c77e9ba Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-09-08 13:50:16 +08:00
fumiama
6cd117ded0 🎨 屏蔽冗余文件夹 2021-09-08 13:50:06 +08:00
github-actions[bot]
6c1da554f0 🎨 改进代码样式 2021-09-08 05:49:03 +00:00
fumiama
bbc96a83d7 ✏️ 增加 Diana 插件保存反馈 2021-09-08 13:48:13 +08:00
fumiama
0bffc38be4 ✏️ Diana 插件实装教你一篇小作文 2021-09-08 13:45:23 +08:00
fumiama
4bce4b2dd1 ✏️ 升级依赖 2021-09-08 12:57:33 +08:00
源文雨
95fa96e883 Update README.md 2021-09-08 12:45:14 +08:00
Kanri
99a5960794 ✏️ 修复我好了 2021-09-08 09:40:45 +08:00
Kanri
aab28717c6 ✏️ 小修改 2021-09-06 15:58:41 +08:00
Kanri
763b0a0a47 🔨 易风控功能,删除 2021-09-06 15:55:29 +08:00
Kanri
3b1bef9c3d 🎨 优化青云客 2021-09-06 15:54:57 +08:00
Kanri
c83c4079cf Merge branch 'master' of github.com:FloatTech/ZeroBot-Plugin 2021-09-06 15:12:12 +08:00
Kanri
ae46b57ea1 ✏️ 修改了延时逻辑 2021-09-06 15:09:30 +08:00
github-actions[bot]
0529dcf0ef 🎨 改进代码样式 2021-09-06 06:59:32 +00:00
Kanri
3ae333e047 ✏️ 修复碧油鸡 2021-09-06 14:58:04 +08:00
Kanri
bc7b84115a ⬇️ 回退到 Go 1.16 2021-09-06 14:56:39 +08:00
Kanri
f3ddff720f ✏️ 暂时不使用 1.17 新特性 2021-09-06 14:56:00 +08:00
github-actions[bot]
8233950bad 🎨 改进代码样式 2021-09-05 08:42:56 +00:00
Kanri
2f902837f6 Merge pull request #59 from guohuiyuan/master
添加自动回复
2021-09-05 16:41:45 +08:00
haibaraguo
6bd80b8ebd 晚上好 2021-09-05 15:31:25 +08:00
haibaraguo
733529cf78 修改readme 2021-09-05 15:09:34 +08:00
haibaraguo
b36cd30987 修改readme 2021-09-05 15:04:18 +08:00
haibaraguo
5a9a566694 添加自动加群,加好友 2021-09-05 14:39:42 +08:00
haibaraguo
9665f6cb3f 优化atri.go匹配逻辑 2021-09-05 12:04:18 +08:00
haibaraguo
f790165358 fix:解决套娃 2021-09-05 10:27:28 +08:00
haibaraguo
7e2912d5d1 fix:修改格式 2021-09-05 02:35:07 +08:00
haibaraguo
c8e7e19934 feat:添加定时早安 2021-09-05 02:14:25 +08:00
haibaraguo
d7f3e3ed79 feat:添加斗图 2021-09-04 17:33:05 +08:00
haibaraguo
6dfa1efa5d fix:减少nohup 2021-09-04 01:43:37 +08:00
haibaraguo
3d5f72a64c fix:减少nohup 2021-09-04 01:41:25 +08:00
haibaraguo
a32658ea61 fix:减少nohup 2021-09-04 01:40:21 +08:00
haibaraguo
d142234af4 fix:减少nohup 2021-09-04 01:38:01 +08:00
haibaraguo
b60a6c7d0c fix:修改了atri.go的匹配逻辑 2021-09-04 01:26:55 +08:00
haibaraguo
3077f3c053 fix:减少多余文件 2021-09-04 00:40:50 +08:00
haibaraguo
f762d5ea00 fix:减少多余文件 2021-09-04 00:33:24 +08:00
haibaraguo
060e167dc7 feat:添加青云客接口 2021-09-02 09:48:18 +08:00
fumiama
47aa6213bf ✏️ 更新编译说明 2021-08-27 17:14:27 +08:00
fumiama
e1ecea5f79 ✏️ 修正lint 2021-08-27 17:05:17 +08:00
fumiama
b1d1e1e7b9 ✏️ 修正lint 2021-08-27 17:02:25 +08:00
fumiama
fe00ef8cfa ✏️ 修正lint 2021-08-27 16:59:43 +08:00
fumiama
3a3c9e5018 ✏️ 线程安全 2021-08-27 16:54:08 +08:00
github-actions[bot]
bf6714f231 🎨 改进代码样式 2021-08-27 08:37:43 +00:00
fumiama
b4e0e6fa0f 升级lint到1.17 2021-08-27 16:36:29 +08:00
fumiama
332bbfc0bc Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-08-27 16:30:30 +08:00
fumiama
ee666601d6 升级golangci到1.17 2021-08-27 16:30:18 +08:00
github-actions[bot]
c7d4c63725 🎨 改进代码样式 2021-08-27 08:24:14 +00:00
fumiama
39141d54a4 升级go.mod到1.17 2021-08-27 16:23:18 +08:00
fumiama
35f9bb3758 尝试修复lint 2021-08-27 16:17:53 +08:00
fumiama
0648c9785c 尝试修复lint 2021-08-27 16:17:03 +08:00
fumiama
b5666ef48e 尝试修复lint 2021-08-27 16:14:10 +08:00
fumiama
f3184bc08d 尝试解决lint失败 2021-08-27 16:09:55 +08:00
源文雨
4804cfa5a2 🎨 解决语言识别错误 2021-08-27 15:58:50 +08:00
源文雨
820daa7b1e Merge pull request #58 from tdf1939/master
炉石插件
2021-08-27 15:47:21 +08:00
源文雨
529345da9c Merge branch 'master' into master 2021-08-27 15:46:08 +08:00
源文雨
c251a7bf53 Update README.md 2021-08-27 15:43:40 +08:00
源文雨
06d7804fe7 Resolve conflict 2021-08-27 15:33:26 +08:00
散无友纪
d31dc14271 Update README.md 2021-08-27 15:18:15 +08:00
散无友纪
adceba0d86 Update README.md 2021-08-27 15:15:30 +08:00
散无友纪
fb8ba1d66b Update main.go 2021-08-27 15:10:38 +08:00
散无友纪
e61ecd683c 炉石 2021-08-27 15:09:23 +08:00
散无友纪
77bc391f6e Delete hs directory 2021-08-27 15:06:02 +08:00
散无友纪
ebeac37f21 炉石 2021-08-27 15:05:20 +08:00
fumiama
ac4d8429d4 增加随机wife插件 2021-08-27 12:34:07 +08:00
fumiama
ceb9455250 Merge branch 'master' of https://github.com/FloatTech/ZeroBot-Plugin 2021-08-27 11:41:44 +08:00
fumiama
736f645e9d ✏️ 求签艾特本人 2021-08-27 11:30:58 +08:00
Kanri
5c8aa92792 Merge pull request #57 from DawnNights/patch-1
修复QQ点歌封面链接问题
2021-08-27 07:50:47 +08:00
夜黎
7ac9d34cc4 修复QQ点歌封面链接问题 2021-08-27 07:31:18 +08:00
fumiama
5b8fd14d09 升级AnimeAPI 2021-08-26 01:08:42 +08:00
fumiama
4776da4584 ✏️ shindan支持发送图片 2021-08-26 00:59:46 +08:00
fumiama
c10cb49c30 ✏️ 更新README 2021-08-25 23:31:48 +08:00
fumiama
9f0d93bca2 ️ 升级go到1.17 2021-08-25 23:29:23 +08:00
fumiama
59c6fe593a ✏️ 求签设置seed避免重复 2021-08-25 23:02:44 +08:00
fumiama
63f3b3861e ✏️ 删去过时描述 2021-08-25 22:51:22 +08:00
fumiama
433b0ae4c1 ✏️ 增加Setu数据库自动下载 2021-08-25 22:49:53 +08:00
fumiama
452b39075b ✏️ 为Diana增加自动下载小作文,更新atri镜像url 2021-08-25 22:39:30 +08:00
223 changed files with 26674 additions and 4285 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.pb linguist-language=go

BIN
.github/hua_nobg_512.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

View File

@@ -1,52 +0,0 @@
name: 最新版
on:
push:
branches:
- dev
env:
GITHUB_TOKEN: ${{ github.token }}
jobs:
my-job:
name: Build ZeroBot-Plugin on Push 🚀
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Cache Go
id: cache
uses: actions/cache@v2
with:
# A list of files, directories, and wildcard patterns to cache and restore
path: ~/go/pkg/mod
key: ${{ runner.os }}-build-${{ hashFiles('**/go.sum') }}
- name: Tidy Go modules
run: go mod tidy
- name: Build linux-x64
run: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x64
- name: Build linux-x86
run: CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x86
- name: Build windows-x64
run: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x64.exe
- name: Build windows-x86
run: CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x86.exe
- name: Build arm64
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm64 GOARM=7 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-arm64
- name: Build armv6
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-armv6
- name: Upload Build Artifact
uses: actions/upload-artifact@v2
with:
name: zerobot-plugin-all.zip
path: ./artifacts/zerobot-plugin-*

55
.github/workflows/nightly.yml vendored Normal file
View File

@@ -0,0 +1,55 @@
name: 最新版
on: [push, pull_request]
env:
BINARY_PREFIX: "zbp_"
BINARY_SUFFIX: ""
PR_PROMPT: "::warning:: Build artifact will not be uploaded due to the workflow is trigged by pull request."
LD_FLAGS: "-w -s"
jobs:
build:
name: Build binary CI
runs-on: ubuntu-latest
strategy:
matrix:
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64, darwin/arm64
goos: [linux, windows]
goarch: ["386", amd64, arm, arm64]
exclude:
- goos: windows
goarch: arm
- goos: windows
goarch: arm64
fail-fast: true
steps:
- uses: actions/checkout@master
- name: Setup Go environment
uses: actions/setup-go@master
with:
go-version: 1.19
- name: Cache downloaded module
uses: actions/cache@master
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ matrix.goos }}-${{ matrix.goarch }}-${{ hashFiles('**/go.sum') }}
- name: Build binary file
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
IS_PR: ${{ !!github.head_ref }}
run: |
if [ $GOOS = "windows" ]; then export BINARY_SUFFIX="$BINARY_SUFFIX.exe"; fi
if $IS_PR ; then echo $PR_PROMPT; fi
export BINARY_NAME="$BINARY_PREFIX$GOOS_$GOARCH$BINARY_SUFFIX"
export CGO_ENABLED=0
go build -o "output/$BINARY_NAME" -trimpath -ldflags "$LD_FLAGS" .
- name: Upload artifact
uses: actions/upload-artifact@master
if: ${{ !github.head_ref }}
with:
name: ${{ matrix.goos }}_${{ matrix.goarch }}
path: output/

View File

@@ -1,55 +0,0 @@
name: 测试版
on:
push:
tags:
- p*
env:
GITHUB_TOKEN: ${{ github.token }}
jobs:
my-job:
name: Build ZeroBot-Plugin on Push Tag 🚀
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Cache Go
id: cache
uses: actions/cache@v2
with:
# A list of files, directories, and wildcard patterns to cache and restore
path: ~/go/pkg/mod
key: ${{ runner.os }}-build-${{ hashFiles('**/go.sum') }}
- name: Tidy Go modules
run: go mod tidy
- name: Build linux-x64
run: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x64
- name: Build linux-x86
run: CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x86
- name: Build windows-x64
run: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x64.exe
- name: Build windows-x86
run: CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x86.exe
- name: Build arm64
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm64 GOARM=7 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-arm64
- name: Build armv6
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-armv6
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: artifacts/zerobot-plugin-*
tag: ${{ github.ref }}
overwrite: true
file_glob: true

View File

@@ -1,13 +1,20 @@
name: PullLint
on: [pull_request]
on: [ pull_request ]
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@master
with:
go-version: 1.19
- name: Check out code into the Go module directory
uses: actions/checkout@master
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
uses: golangci/golangci-lint-action@master
with:
# Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
version: latest
@@ -21,9 +28,6 @@ jobs:
# Optional: show only new issues if it's a pull request. The default value is `false`.
# only-new-issues: true
# Optional: if set to true then the action will use pre-installed Go.
# skip-go-installation: true
# Optional: if set to true then the action don't cache or restore ~/go/pkg.
# skip-pkg-cache: true

View File

@@ -1,21 +1,33 @@
name: PushLint
on: [push]
on: [ push ]
jobs:
golangci:
name: lint_golangci-lint
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@master
with:
go-version: 1.19
- name: Check out code into the Go module directory
uses: actions/checkout@master
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
uses: golangci/golangci-lint-action@master
with:
version: latest
args: --issues-exit-code=0
- name: Commit back
if: ${{ !github.head_ref }}
continue-on-error: true
run: |
git config --local user.name 'github-actions[bot]'
git config --local user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add --all
git commit -m "🎨 改进代码样式"
git push
- name: Create Pull Request
if: ${{ !github.head_ref }}
continue-on-error: true
uses: peter-evans/create-pull-request@v4

View File

@@ -1,55 +1,27 @@
name: 稳定
name: 发行
on:
push:
tags:
- v*
env:
GITHUB_TOKEN: ${{ github.token }}
- 'v*'
jobs:
my-job:
name: Build ZeroBot-Plugin on Push Tag 🚀
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.16
- name: Set up Go
uses: actions/setup-go@master
with:
go-version: '1.19'
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- name: Cache Go
id: cache
uses: actions/cache@v2
with:
# A list of files, directories, and wildcard patterns to cache and restore
path: ~/go/pkg/mod
key: ${{ runner.os }}-build-${{ hashFiles('**/go.sum') }}
- name: Tidy Go modules
run: go mod tidy
- name: Build linux-x64
run: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x64
- name: Build linux-x86
run: CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-x86
- name: Build windows-x64
run: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x64.exe
- name: Build windows-x86
run: CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-windows-x86.exe
- name: Build arm64
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm64 GOARM=7 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-arm64
- name: Build armv6
run: CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -ldflags="-s -w" -o artifacts/zerobot-plugin-linux-armv6
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: artifacts/zerobot-plugin-*
tag: ${{ github.ref }}
overwrite: true
file_glob: true
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@master
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

BIN
.github/yaya.jpg vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

15
.gitignore vendored
View File

@@ -1,6 +1,9 @@
data/SetuTime/cache
data/SetuTime/search
data/manager
.idea/
.DS_Store
.vscode
plugins/*.so
plugins/*.dll
.idea/
.DS_Store
.vscode
go-zero*
nohup.out
zerobot
ZeroBot-Plugin*

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "data"]
path = data
url = https://github.com/FloatTech/zbpdata

View File

@@ -1,15 +1,11 @@
linters-settings:
errcheck:
ignore: fmt:.*,io/ioutil:^Read.*
ignore: fmt:.*
ignoretests: true
goimports:
local-prefixes: github.com/FloatTech/ZeroBot-Plugin
gocritic:
disabled-checks:
- exitAfterDefer
forbidigo:
# Forbid the following identifiers
forbid:
@@ -18,13 +14,12 @@ linters-settings:
linters:
# please, do not use `enable-all`: it's deprecated and will be removed soon.
# inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint
fast: true
disable-all: true
fast: false
enable:
- bodyclose
- deadcode
- depguard
- dogsled
- dupl
- errcheck
- exportloopref
- exhaustive
@@ -39,38 +34,22 @@ linters:
- gosimple
- govet
- ineffassign
- misspell
#- misspell
- nolintlint
- rowserrcheck
- staticcheck
- structcheck
- stylecheck
- typecheck
- unconvert
- unparam
- unused
- varcheck
- whitespace
- prealloc
- predeclared
- asciicheck
- revive
- forbidigo
- makezero
- revive
#- interfacer
# don't enable:
# - scopelint
# - gochecknoglobals
# - gocognit
# - godot
# - godox
# - goerr113
# - interfacer
# - maligned
# - nestif
# - testpackage
# - wsl
run:
# default concurrency is a available CPU number.
@@ -78,6 +57,9 @@ run:
deadline: 5m
issues-exit-code: 1
tests: false
skip-dirs:
- order
go: '1.19'
# output configuration options
output:
@@ -91,4 +73,5 @@ issues:
fix: true
exclude-use-default: false
exclude:
- "Error return value of .((os.)?std(out|err)..*|.*Close|.*Flush|os.Remove(All)?|.*print(f|ln)?|os.(Un)?Setenv). is not check"
- "Error return value of .((os.)?std(out|err)..*|.*Close|.*Seek|.*Flush|os.Remove(All)?|.*print(f|ln)?|os.(Un)?Setenv). is not check"
- 'identifier ".*" contain non-ASCII character: U\+.*'

73
.goreleaser.yml Normal file
View File

@@ -0,0 +1,73 @@
project_name: zbp
env:
- GO111MODULE=on
before:
hooks:
- go mod tidy
builds:
- id: nowin
env:
- CGO_ENABLED=0
- GO111MODULE=on
goos:
- linux
goarch:
- 386
- amd64
- arm
- arm64
goarm:
- 6
- 7
mod_timestamp: "{{ .CommitTimestamp }}"
flags:
- -trimpath
ldflags:
- -s -w
- id: win
env:
- CGO_ENABLED=0
- GO111MODULE=on
goos:
- windows
goarch:
- 386
- amd64
mod_timestamp: "{{ .CommitTimestamp }}"
flags:
- -trimpath
ldflags:
- -s -w
checksum:
name_template: "zbp_checksums.txt"
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
- fix typo
- Merge pull request
- Merge branch
- Merge remote-tracking
- go mod tidy
archives:
- id: nowin
builds:
- nowin
- win
name_template: "zbp_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
format_overrides:
- goos: windows
format: zip
nfpms:
- license: GPL 3.0
homepage: https://github.com/FloatTech/ZeroBot-Plugin
file_name_template: "zbp_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
formats:
- deb
- rpm
maintainer: FloatTech

145
LICENSE
View File

@@ -1,5 +1,5 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

1619
README.md

File diff suppressed because it is too large Load Diff

1
data Submodule

Submodule data added at 5e0fa81c3b

View File

@@ -1,45 +0,0 @@
<EFBFBD>雍晄級謚ス謌択衍オ蝌臥鬪大惠謌題レ荳嬉衍オ譎壽劒雕ゥ謌択衍オ荵<EFBFBD>正蝮仙惠邇句コァ譏ッ逕ィ逵句档蝨セ逧<EFBFBD>愍逾樒恚謌択衍オ<EFBFBD>オ迴井ケ占ク謌択衍オ<EFBFBD><EFBFBD>梧滑謌醍愍逹幄貯菴冗蜷惹コ泌宵閼壻ク€襍キ雕ゥ謌択衍オ霑倩ョゥ謌醍懸閼壽弍隹<EFBFBD>檎懸髞吩コ<EFBFBD>サ呎<EFBFBD>蜉育愍荳€昨衍オ
<EFBFBD> 謌大ス諠ウ蛛壼<EFBFBD>辟カ蟆丞ァ千噪迢怜賦縲ょ庄譏ッ蝌臥蟆丞ァ占ッエ螂ケ蝟懈ャ<EFBFBD>弍迪ォ<EFBFBD><EFBFBD>蜩ュ莠<EFBFBD>€<EFBFBD>驕捺里荳肴弍迢嶺ケ滉ク肴弍迪ォ逧<EFBFBD><EFBFBD>荳コ莉€荵郁ヲ働逧<EFBFBD>€ょ屏荳コ謌大<EFBFBD>螳樊弍荳€蜿ェ閠<EFBFBD><EFBFBD>縲よ<EFBFBD>莉取イ譛帛<EFBFBD>辟カ蟆丞ァ占<EFBFBD>蝟懈ャ閾ェ蟾ア縲よ<EFBFBD>譏守區逧<EFBFBD>シ梧園譛我ココ驛ス蝟懈ャ<EFBFBD>菴呵穂ク頑焔螟ゥ謇肴遠髓ア逧<EFBFBD>酔關檎噪迢礼距謌冶€<EFBFBD>賢迪ォ<EFBFBD>梧イ譛我ココ莨壼万谺髦エ貉ソ蟶ヲ逞<EFBFBD>噪閠<EFBFBD><EFBFBD>縲ゆス<EFBFBD><EFBFBD>霑俶弍髣ョ莠<EFBFBD><EFBFBD>辟カ蟆丞ァ<EFBFBD>:窶懈<EFBFBD>閭ス荳崎<EFBFBD>蛛壻ス<EFBFBD><EFBFBD><EFBFBD>€<EFBFBD>驕捺<EFBFBD>譏ッ豕ィ螳壼荳堺コ<EFBFBD>距逧<EFBFBD>€ゆス<EFBFBD>ヲよ棡螂ケ蝟懈ャ迢暦シ梧<EFBFBD>蟆ア蜿ッ莉€逶エ蝨ィ霄ォ霎ケ逵狗捩螂ケ莠<EFBFBD>シ悟頭諤募ケ諤€驥梧干逹€<EFBFBD>ーク霑憺<EFBFBD>譏ッ迢励€ょ庄譏ッ螂ケ隸エ蝟懈ャ<EFBFBD>弍迪ォ縲ょケ邇ー蝨ィ霑伜惠逵狗捩謌托シ瑚ソ伜惠騾玲<EFBFBD>€<EFBFBD>シ梧弍蝗<EFBFBD>荳コ迪ォ霑俶イ譛牙<EFBFBD>邇ー<EFBFBD>悟宵譛画<EFBFBD>霑呵€<EFBFBD><EFBFBD>豈丞ゥ雹第焔雹題<EFBFBD>蝨ー莉取エ樣辷ャ蜃コ譚<EFBFBD>瑚ソ懆ソ懷慍蜥悟ケ蟇ケ隗<EFBFBD>€らュ牙ケ蝟懈ャ<EFBFBD>賢譚<EFBFBD>噪譌カ蛟呻シ梧<EFBFBD>蟆ア隸驥肴眠貊壼屓謌醍噪豢樔コ<EFBFBD>制縲ゆス<EFBFBD><EFBFBD>霑俶弍螂ス蝟懈ャ螂ケ<EFBFBD>ケ閭ス蝨ィ謌題ソ伜惠螂ケ霄ォ霎ケ逧<EFBFBD>慮蛟吝夂恚謌大<EFBFBD>逵シ蜷暦シ溷<EFBFBD>辟カ蟆丞ァ占ッエ謗荳区擂逧<EFBFBD>ッ丈クェ蝨隸槫<EFBFBD>柱螟ァ螳カ荳€襍キ霑<EFBFBD>€<EFBFBD>荳咲衍驕灘ァ螳カ謖<EFBFBD>頭莠帑ココ縲ょス蟶梧悍霑吩クェ髮<EFBFBD>粋閭ス螟溷ッケ謌大€閭槫裾縲ら賢迪ォ霑伜惠螳ウ諤募<EFBFBD>辟カ蟆丞ァ舌€<EFBFBD>莨壼悉謚雁ケ辷ア逧<EFBFBD>賢迪ォ蠑墓擂逧<EFBFBD>€<EFBFBD>驕鍋ィ肴怏荳肴<EFBFBD><EFBFBD><EFBFBD>蟆ア莨夊速霄ォ迪ォ蜿縲るぅ譌カ蛟吝<EFBFBD>辟カ蟆丞ァ仙ァ讎ゆシ壽滑謌醍噪霄ォ菴灘ス螂ス蝨ー陬<EFBFBD>オキ譚謇泌芦髣ィ螟門制縲るぅ謌大ーア謌蝉コ<EFBFBD>€<EFBFBD><EFBFBD><EFBFBD>悟仆蝌サ縲よ<EFBFBD>蟶梧悍螂ケ閭ス謚頑<EFBFBD>謇泌セ苓ソ台ク€轤ケ<EFBFBD>悟屏荳コ謌題ソ俶弍螂ス蝟懈ャ螂ケ縲ゆシ壻ク€逶エ蝟懈ャ荳句悉逧<EFBFBD>€<EFBFBD><EFBFBD><EFBFBD>鬲る€剰ソ<EFBFBD>ェ玲姐蜷鷹逵句悉<EFBFBD>梧撃逹€<EFBFBD>塔體帛惠霓サ霓サ鮑蜩搾シ悟<EFBFBD>辟カ蟆丞ァ先<EFBFBD>諛貞慍髱<EFBFBD>蝨ィ豐吝書荳奇シ瑚ィ貍泌セ鈴撼蟶ク貂ゥ鬘コ逧<EFBFBD>ゥ倡賢蝮仙惠螂ケ逧<EFBFBD>か閹€縲ょi逧<EFBFBD>蜈臥<EFBFBD>蝨ィ螂ケ逧<EFBFBD>蠎橸シ梧<EFBFBD>蜀サ蜒オ逧<EFBFBD>ソ<EFBFBD>э蝨ィ鬟朱蠕ョ蠕ョ蜿醍Ν縲<EFBFBD>
€繝翫繧薙<EFBFBD>迥ャ縺ォ縺ェ繧翫<EFBFBD>.縺代€€繝翫繧薙縲檎賢縺悟ス縺阪€€縺溘€€縺ゅ繧翫蜒輔<EFBFBD><EFBFBD>縺励<EFBFBD>.迪ォ縺ァ繧ら堪縺ァ繧ゅ<EFBFBD>ヵ縺後€€菴墓腐豕<EFBFBD>縺ョ縺九€蜒輔<EFBFBD>縺ヲ縺<EFBFBD>.菴墓腐縺ェ繧峨€€蜒輔<EFBFBD><EFBFBD><EFBFBD>縺溘°繧峨<EFBFBD><EFBFBD>..€蠎ヲ繧ゅム繧繝翫繧薙螂ス縺九l繧九縺ィ繧呈悍縺セ縺ェ縺後縺溘€€.蜒輔<EFBFBD>繧上縺ヲ縺<EFBFBD>€隱ー繧ゅ°繧ら炊隗菴呵穂ク頑焔螟ゥ謇阪<EFBFBD>蜿ッ諢帙驥第戟縺縺ョ迥ャ縺狗賢縺後縺阪縺ヲ縺薙<EFBFBD>.髯ー繧ュ繝縺ァ豎壹i繧上<EFBFBD>縺ッ隱ー繧ょス縺九s縺ョ縺<EFBFBD>..縺昴l縺ァ繧<EFBFBD>iana縺輔縺ォ閨槭縺ヲ縺ソ縺滂シ咼iana縺輔縺ョ迥ャ縺ォ縺ェ縺縺ヲ繧り憶縺<EFBFBD>縺吶°縺ィ.蜒輔縺ッ荳€逕溽堪縺ォ縺ェ繧後<EFBFBD>縺ィ縺ッ蛻<EFBFBD>°縺ヲ縺<EFBFBD>.縺ァ繧ゅb縺怜スシ螂ウ縺ッ迥ャ縺悟ス縺阪縺溘i縲€蜒輔<EFBFBD>縺壹縺ィ蛯阪隕九<EFBFBD>i繧後k.縺昴l縺ッ縺<EFBFBD>繧る<EFBFBD>縺ャ繧偵<EFBFBD>縺ヲ縺<EFBFBD>k縺ィ縺励<EFBFBD>..縺代l縺ゥ蠖シ螂ウ縺ッ迪ォ縺悟ス縺阪<EFBFBD>.蠖シ螂ウ縺ッ莉翫繧ょヵ繧定ヲ九<EFBFBD>k縲€縺シ縺上r讌ス縺励縺帙縺上l繧九€€縺昴l縺ッ迪ォ縺後<EFBFBD>陦ィ繧後<EFBFBD><EFBFBD>°<EFBFBD>.縺溘縺薙<EFBFBD><EFBFBD>縺梧ッ取律縺薙縺薙縺ィ遨エ縺九i蜃コ縺ヲ縲€<EFBFBD>縺上°繧臥岼繧貞粋縺縺ヲ縺<EFBFBD>.蠖シ螂ウ縺ョ螂ス縺阪迪ォ縺檎樟繧後繧峨€€蜒輔<EFBFBD>遨エ縺ォ謌サ繧九縺九<EFBFBD>..縺ァ繧ゅd縺縺ア繧雁スシ螂ウ縺悟ス縺阪<EFBFBD>i繧後<EFBFBD>€€蜒輔縺セ縺<EFBFBD>蛯阪<EFBFBD>k縺ィ縺阪繧峨€繧ゅ<EFBFBD>縺ソ縺ヲ縺上l繧九<EFBFBD>縺九.Diana縺輔縺後繧後°繧画ッ主屓縺ョ繧ッ繝ェ繧ケ繝槭せ縺ソ繧薙縺ィ荳€邱偵驕弱縺吶€縺溘€€縺ソ繧薙縺後縺ョ貂繧翫<EFBFBD>縺ソ繧薙縺九.蜒輔繧ゆクュ縺ォ蜈繧後繧後<EFBFBD>..迪ォ縺ッ縺セ縺<EFBFBD>縺セ縺<EFBFBD>Diana縺輔繧呈€縺ヲ縺<EFBFBD>.蜒輔蠖シ螂ウ縺ョ諢帙繧狗賢繧貞シ輔莉倥繧九h.蟆代縺ョ繝溘せ縺ァ迪ォ縺ョ蜿縺ォ豁サ縺ャ縺薙縺ッ繧上縺ヲ縺<EFBFBD>.縺昴<EFBFBD>譎ゅ縺ェ繧九縺溘<EFBFBD>繧泥iana縺輔縺ッ蜒輔<EFBFBD>菴薙r縺<EFBFBD>s縺ィ蛹<EFBFBD>霎シ繧薙€<EFBFBD>未螟悶謐ィ縺ヲ繧九縺励g.縺昴l縺ァ蜒輔<EFBFBD>繝輔Λ繧繝磯シ<EFBFBD>縺ォ縺ェ縺縺溘€€縺上.蠖シ螂ウ縺ォ蟆代霑代謐ィ縺ヲ縺ヲ縺サ縺励縺ェ縲€<EFBFBD>縺ヲ繧<EFBFBD>縺ア繧雁ス縺阪縺九i縲€縺昴l縺壹縺ィ螂ス縺阪<EFBFBD>..蜒輔<EFBFBD>縺溘縺励<EFBFBD>遯薙r雜翫縺ヲ荳ュ繧定ヲ九k縲€蜷翫縺ヲ縺<EFBFBD>k驤エ縺悟ー代髻ソ縺縺ヲ.Diana縺輔縺ッ縺<EFBFBD>繧峨j縺ィ繧ス繝輔ぃ繝シ縺ォ蟇<EFBFBD>j縺九°縺ヲ縲€謇区<EFBFBD>繧後<EFBFBD>k縺オ繧翫r縺吶k讖倡賢縺悟スシ螂ウ縺ョ閧ゥ縺ォ蠎ァ縺縺ヲ.證也i縺ョ蜈峨蠖シ螂ウ縺ョ鬘斐r辣ァ繧峨縺溘€€蜃阪j莉倥縺溷ヵ縺ョ蠢<EFBFBD>縺ッ縺九縺ョ荳ュ縺ァ辭ア縺上縺ヲ縺<EFBFBD>
<EFBFBD>譫晄ア溷ー城芙譁ー譚<EFBFBD>€菴堺ソョ螂ウ<EFBFBD>悟埋濶ッ貂ゥ譟皮噪菫ョ螂ウ縲ょケ荳咲鯵隶イ隸晢シ悟宵譏ッ蠕ョ隨醍捩髱蟇ケ豈丈ク€荳ェ蟇ケ螂ケ逾キ蜻顔噪莠コ縲よ怏逧<EFBFBD>ココ蟶梧悍蟄ゥ蟄仙蠎キ<EFBFBD>梧怏逧<EFBFBD>ココ蟶梧悍蠎<EFBFBD>ィシ辭ャ霑<EFBFBD><EFBFBD>螟ゥ<EFBFBD>梧怏逧<EFBFBD>ココ蟶梧悍閭ス謖蛻ー髓ア蜈サ豢サ螳カ莠コ縲ゅ€€€ケ驛ス逕ィ蠢<EFBFBD>成逹€<EFBFBD>悟セョ隨醍噪蝗槫コ皮捩縲ょケ霄ォ譚千洌蟆擾シ御ス<EFBFBD>弍蜊エ隶ゥ莠コ隗牙セ怜<EFBFBD>譎コ諷ァ<EFBFBD>ケ豐蛾サ伜ッ€<EFBFBD>御ス<EFBFBD>弍蜊エ莨夊ョゥ莠コ譌<EFBFBD>豈比ソ襍悶€りソ呎弍螂ケ莉サ閨悟ソォ貊€荳ェ譛育噪譌カ蛟呻シ梧蕗蝣ょ書逕滉コ<EFBFBD>ァ莠具シ御ク€荳ェ驢画ア牙書邇ー逾櫁莠コ蜻伜茜逕ィ謨吝<EFBFBD>ょ惠豺ア螟懆ソ幄ァ謇ケ襍<EFBFBD><EFBFBD><EFBFBD><EFBFBD>豎我シ<EFBFBD><EFBFBD>樔ケ主<EFBFBD>逾橸シ御ク我ココ謌占剋譛€扈亥シ戊オキ螳螳伜燕譚<EFBFBD>衍縲よ蕗荳サ陲ォ蟶ヲ襍ー<EFBFBD>梧蕗蝣る勁莠<EFBFBD>ぅ菴崎賢辟カ逧<EFBFBD>眠譚菫ョ螂ウ蜈カ莉紋ココ荳€<EFBFBD>€梧淵縲ゆソョ螂ウ陲ォ霑ォ謇ソ諡<EFBFBD>捩譛ャ荳榊コ碑ッ螻樔コ主ケ逧<EFBFBD>髫セ<EFBFBD>瑚セア鬪ゑシ御ス<EFBFBD>弍螂ケ豈丞ゥ驛ス隶逵溽噪蜷台クサ逾キ蜻奇シ悟€セ蜷ャ譚謨吝<EFBFBD>ゆケ倶ココ逧<EFBFBD>€セ隸峨€ょ庄譏ッ譬ケ譛ャ豐譛我ココ蜷大ケ蛟セ隸会シ梧擂逧<EFBFBD>ココ荳肴弍蝨ィ鬪ょ<EFBFBD>悟ーア譏ッ蝨ィ蜿第ウ<EFBFBD>函豢サ逧<EFBFBD>ク肴サ縲ょケ荳€蟾ア荵句鴨諡シ蜻ス謇ソ諡<EFBFBD>シ梧イ莠コ遏驕捺弍莉€荵井スソ螂ケ螯よュ蝮壽戟縲ら峩蛻ー螳螳伜クヲ蝗樔コ<EFBFBD>蕗荳サ<EFBFBD>悟相隸蛾芙豌鷹ぅ譏ッ謨吩クサ蝨ィ荳ュ螟ョ荳サ謨咎ぅ驥悟セ怜芦逧<EFBFBD>シ檎岼逧<EFBFBD>弍荳コ髟<EFBFBD>ー醍<EFBFBD><EFBFBD><EFBFBD>螟ゥ謇€€ケー邊ョ鬟溽噪髓ア雍縲ゆク€譌カ髣エ髟<EFBFBD>ー第ャ蜻シ襍キ謨吩クサ<EFBFBD>荳サ逧<EFBFBD><EFBFBD><EFBFBD>梧峩螟夂噪莠コ蠑€蟋区峩蜉<EFBFBD>辷ア荳贋コ<EFBFBD>ぅ荳ェ菫ョ螂ウ縲よ怏逧<EFBFBD>ココ謚雁ケ豈比ス懃寺蛻ゥ莠夲シ梧怏莠帑ココ謚雁ケ螂我クコ逾樊<EFBFBD><EFBFBD>ケ驛ス荳€€諡堤サ昜コ<EFBFBD>€らサ<EFBFBD>ソ<EFBFBD>噪髟<EFBFBD>ー台シ壼書邇ー霑吩ス堺ソョ螂ウ蜿倅コ<EFBFBD>シ悟序蠕苓ッ晏夊オキ譚<EFBFBD>シ御ケ溷序蠕玲峩蝟懈ャ<EFBFBD>惠謨吝<EFBFBD><EFBFBD>シ御ケ溷序蠕礼ヲサ髟<EFBFBD>ー題キ晉ヲサ譖エ霑應コ<EFBFBD>€ゆク€<EFBFBD>ス蜒丞処蜿伜屓蜴滓擂蟷ウ蜥檎噪蟆城芙<EFBFBD>梧ッ丈クェ蟇ケ菫ョ螂ウ逧<EFBFBD>刈螳ウ閠<EFBFBD>ッ丞ゥ蠕ョ隨醍捩蜷大セョ隨醍捩逧<EFBFBD>ソョ螂ウ謇捺魚蜻シ<EFBFBD>梧ッ丈クェ髟<EFBFBD>ー題ソ俶弍莨壼悉謨吝<EFBFBD><EFBFBD>悟悉蛟セ隸会シ悟悉蜷台ク€荳ェ蜴滓擂陲ォ莉紋サャ莠イ謇玖セア鬪ら噪莠コ逾キ蜻奇シ悟ク梧悍蠕怜芦荳サ逧<EFBFBD><EFBFBD>辣ァ<EFBFBD>悟桁諡ャ驍荳ェ驢画ア峨€よイ莠コ閭ス諠ゥ鄂夐ぅ莠幃芙豌托シ悟セ亥壻ココ驛ス蟾イ扈鞘€懷ソ倩ョー窶晏ス灘<EFBFBD>荳コ莉€荵郁ヲ<EFBFBD>ぅ譬キ蛛夲シ悟桁諡ャ驍荳ェ驢画ア会シ悟宵蜑ゥ荳倶ク€荳ェ扈丞クク螳<EFBFBD>惠謨吝<EFBFBD><EFBFBD>ソョ螂ウ<EFBFBD>ケ蟋狗サ郁ョー蠕嶺ク€<EFBFBD>€<EFBFBD>
雍晄級霄コ蝨ィ逞<EFBFBD>コ贋ク奇シ檎愍逾樒ゥコ遨コ蝨ー逶ッ逹€螟ゥ闃ア譚ソ<EFBFBD><EFBFBD>逋ス譎ヲ證礼噪螟ゥ闃ア譚ソ蜒丈ク€蝮怜嶋蜩磯復<EFBFBD>梧億譖イ謗牙夜擇逧<EFBFBD>€<EFBFBD>シ悟<EFBFBD>蜿俶<EFBFBD><EFBFBD><EFBFBD>壼スゥ蜿俶<EFBFBD>闍咲區<EFBFBD>瑚ァゆシ怜序謌仙現逕滂シ瑚<EFBFBD>蜿ー蜻<EFBFBD>悟序謌蝉コ<EFBFBD>€譁ケ蟆丞ー冗噪逞<EFBFBD>袷縲ょケ鄙サ莠<EFBFBD>クェ霄ォ<EFBFBD><EFBFBD>驛ィ莨<EFBFBD>迪帷ヨ蝨ー逍シ逞幢シ悟ケ菴惹ス主慍蜩シ莠<EFBFBD>€螢ー縲ょケ蟾イ扈丞シ€蟋倶ケ<EFBFBD>諠ッ霑咏ァ咲名逞帑コ<EFBFBD>シ悟ーア蜒丞ケ荵<EFBFBD>諠ッ荳咲ゥソ闃ュ阨セ闊櫁吩ク€譬キ<EFBFBD>ケ髣ュ荳顔愍逹幢シ梧滑閾ェ蟾ア蝓玖ソ幃サ第囓驥鯉シ御ク榊悉諠ウ縲る葎陲ォ謗ィ蠑€<EFBFBD>シ梧リ驢剃コ<EFBFBD>シシ譴ヲ髱樊ヲ逧<EFBFBD>ケ縲ょ現逕滓侃螢ォ蜿域擂譟謌ソ<EFBFBD>檎宛豈榊柱蠑溷シ滉サャ霍溷惠蜷朱擇<EFBFBD>帛現逕滄琉莠<EFBFBD>コ幃琉鬚伜錘襍ー莠<EFBFBD>シ梧ッ堺コイ謠€螂ケ逧<EFBFBD><EFBFBD>梧悃螂ケ隸エ逹€隸晏<EFBFBD><EFBFBD>檎宛莠イ螳蛾撕蝨ー蝮仙惠譌セケ<EFBFBD><EFBFBD>隶ュ扈<EFBFBD>ョ檎噪蠑溷シ溷エ荳願ソ伜<EFBFBD>€豎暦シ梧漢逹€蝌エ蜚<EFBFBD>悍逹€螂ケ縲よッ堺コイ蠖捺慮隸エ逧<EFBFBD>€荵亥ケ蟾イ扈丞ソ倅コ<EFBFBD>シ悟宵隶ー蠕玲怙蜷守ヲサ蠑€<EFBFBD>慮蛟呻シ檎宛莠イ襍ー蝨ィ譛€蜷趣シ悟屓譛帑コ<EFBFBD>ケ荳€逵シ<EFBFBD>蜷主ー丞ソ<EFBFBD>慍蜈ウ荳企葎<EFBFBD>御サ€鬮伜ァ逧<EFBFBD>レ蠖ア遶溽譏セ蠕玲怏莠幄制邏縲ゆココ驛ス襍ー螳悟錘<EFBFBD>梧慮髣エ蝨ィ豐蛾サ倡噪逞<EFBFBD>袷驥梧オ<EFBFBD>€晢シ悟ーア蜒乗イ呎シ城<EFBFBD>イ吝ュ撰シ悟ケ逧<EFBFBD>ぅ莠帷Ο諠<EFBFBD>€<EFBFBD>ぅ莠帶<EFBFBD>諞ャ驛ス謗我コ<EFBFBD>ソ帛悉縲り姦阨セ闊槫屬逧<EFBFBD>ュヲ蜻俶歓遨コ譚逵句<EFBFBD>ケ蜍牙シコ蝨ィ逞<EFBFBD>コ贋ク雁攝襍キ<EFBFBD>悟成驍莠幄<EFBFBD>閭檎ャ皮峩縲ー碑エィ莨倬寉逧<EFBFBD>恚蜿区干諤ィ荳譬シ逧<EFBFBD>慍迢ア邂螳カ蟀<EFBFBD>シ梧干諤ィ荳倶ク€蝨コ貍泌<EFBFBD>蜿郁ヲ擂莠<EFBFBD>€ケ螳蛾撕蝨ー蜷ャ逹€<EFBFBD>悟攝蝨ィ逞<EFBFBD>コ贋ク頑研蜃コ荳ェ隨題<EFBFBD><EFBFBD>蟆泌<EFBFBD>螢ー髯<EFBFBD>柱蜃<EFBFBD>縲ゆス<EFBFBD>ョ樣刔荳雁ケ蟾イ扈乗薯荳崎ソ幄ッ晞倅コ<EFBFBD>シ御シ倬寉逧<EFBFBD>區螟ゥ鮖<EFBFBD>ア慕ソ<EFBFBD>ォ倬橸シ碁槫髄貂ゥ證也噪譏螟ゥ<EFBFBD>梧滑蜿嶺シ<EFBFBD>ク大ー城クュ逡吝惠蜀ャ蟄驥後€よ恚蜿玖オー蜷主ケ扈ァ扈ュ蝮仙惠蠎贋ク奇シ檎岷逹€遯怜厄シ悟夜擇逧<EFBFBD>ゥ豌泌セ亥<EFBFBD>樊惻逧<EFBFBD>ーセ霑ケ遨ソ霑<EFBFBD>サオ霓ッ逧<EFBFBD>コ大屬<EFBFBD>檎區濶イ逧<EFBFBD>ク溷<EFBFBD><EFBFBD><EFBFBD>€<EFBFBD>ヲよエ礼噪螟ゥ遨コ<EFBFBD>ケ荳区э隸<EFBFBD>慍蛛壻コ<EFBFBD>クェ螻戊<EFBFBD>勘菴懶シ悟ワ螟ゥ鮖<EFBFBD>€譬キ莨倬寉縲ょセ育セ趣シ悟処蠕育洒證ゅ€るク溷<EFBFBD>鬟槫<EFBFBD><EFBFBD>ェ玲姐逧<EFBFBD>婿蟇ク荵句慍<EFBFBD>ケ逵倶ク榊芦莠<EFBFBD>€ケ謐ら捩蛻コ逞帷噪閻ー<EFBFBD>ス逞帛操<EFBFBD>檎李蠕苓ョゥ莠コ諠ウ隕働蜃コ螢ー縲よイ吝ュ占ケ謖溽捩螂ケ逧<EFBFBD>ヲ諠ウ<EFBFBD>梧脂霑帑コ<EFBFBD>イ呎シ冗噪荳倶ク€螻ゑシ悟<EFBFBD>荵滓今荳榊屓譚<EFBFBD>€ゆク荳ェ譛亥錘雍晄級蜃コ髯<EFBFBD>悟屓蛻ー莠<EFBFBD><EFBFBD>謔臥噪螳カ驥鯉シ梧ッ堺コイ菴楢エエ蝨ー謚願<EFBFBD>陬呵ソ俶怏驍莠帛ァ蟶育コァ逧<EFBFBD>姦阨セ貍泌<EFBFBD>蠖募ワ驛ス阯剰ソ帑コ<EFBFBD>慍荳句ョ<EFBFBD>ァ定誠<EFBFBD>御ク榊<EFBFBD>諢丞紋シ壼ワ螟ァ螟壽焚莠コ莉荳コ閭ス蝮壽戟逧<EFBFBD>ヲ諠ウ驍譬キ<EFBFBD><EFBFBD>遘ッ貊轣ー蟆假シ梧怙蜷手ォ謔<EFBFBD>d驕怜ソ倥€譏惹ココ莨壼惠蛛カ蟆疲Φ襍キ譚<EFBFBD>慮蛟呻シ檎サ呵<EFBFBD>蟾ア謇セ荳ェ蜿ー髦カ<EFBFBD><EFBFBD>蝌イ蝨ー隨醍ャ托シ壺€懷嶋<EFBFBD><EFBFBD>蜑崎ソ俶怏霑咏ァ榊ヲ<EFBFBD>Φ蝠翫€€晁エ晄級蠑€蟋句ュヲ謦ュ髻ウ<EFBFBD>悟シ€蟋玖オー蜿ヲ荳€霍ッ<EFBFBD>ケ豐諠ウ霑<EFBFBD>唆荳榊セ嶺ク崎オー逧<EFBFBD>霍ッ縲りソ吩ケ溷セ亥<EFBFBD>ス豁ケ譛芽キッ蜿ッ襍ー<EFBFBD>御ス<EFBFBD><EFBFBD>蟆泌成蛻ー闊樊峇逧<EFBFBD>慮蛟呻シ梧恚蜿倶シ夐琉螂ケ<EFBFBD>€應ス<EFBFBD>蝨ィ譎<EFBFBD>€荵亥賦<EFBFBD>€ケ蝗櫁ソ<EFBFBD>樊擂<EFBFBD>檎ャ台コ<EFBFBD>ャ代€€懈エサ蜉ィ豢サ蜉ィ霄ォ菴楢€悟キイ縲や€<EFBFBD> 陌ス辟カ譛臥せ荳咲曝蠢<EFBFBD>シ御ス<EFBFBD>女莨譏ッ豐蜉樊ウ慕噪莠区ュ蝌帙€りッ謾セ荳倶コ<EFBFBD>シ梧叛蠑<EFBFBD>Φ襍ー逧<EFBFBD>キッ<EFBFBD>€悟悉襍ー譖エ遞ウ螯<EFBFBD>コ碑ッ襍ー逧<EFBFBD>キッ<EFBFBD>ァ驛ィ蛻<EFBFBD>譏惹ココ驛ス譏ッ霑呎<EFBFBD>キ蛛夂噪縲よ<EFBFBD>蜿ッ譏ッ螟ァ閨ェ譏主造<EFBFBD>€<EFBFBD>
蟆丞ァ仙万谺€譛牙勘迚ゥ<EFBFBD>御ス<EFBFBD>万谺荵溷<EFBFBD>荳牙<EFBFBD>荵晉ュ会シ帷ョ螳カ隶ィ蜴梧園譛牙勘迚ゥ<EFBFBD>御ス<EFBFBD>ョィ蜴御ケ溷<EFBFBD>荳牙<EFBFBD>荵晉ュ峨€ょー丞ァ先怙蝟懈ャ迪ォ<EFBFBD>御ス<EFBFBD>ケ逧<EFBFBD>ァゆシ玲弍荳€<EFBFBD><EFBFBD><EFBFBD>帷ョ螳カ譛€隶ィ蜴瑚€<EFBFBD><EFBFBD><EFBFBD>御ス<EFBFBD>ー丞ァ千噪隗ゆシ玲イ譛我ク€蜿ェ迪ォ縲ゆコ取弍<EFBFBD>檎ョ螳カ扈呎園譛臥噪閠<EFBFBD><EFBFBD>蟶ヲ荳贋コ<EFBFBD>擇蜈キ蟆丞ァ仙シ€蟋倶コ<EFBFBD><EFBFBD>陦ィ貍費シ瑚€<EFBFBD><EFBFBD>莉ャ荳咲衍謇€謗ェ<EFBFBD>梧Φ隕<EFBFBD>螟肴Ρ蟶ク逧<EFBFBD>コキ謇ー縲ゆス<EFBFBD><EFBFBD>サャ逵玖ァー丞ァ占<EFBFBD>蟋ソ鄙ゥ鄙ゥ<EFBFBD>御ク€莠幄€<EFBFBD><EFBFBD>諠ウ蜃コ螢ー襍槫昌<EFBFBD>帑ス<EFBFBD><EFBFBD>サャ逵玖ァー丞ァ千怏逶ョ螯ら判<EFBFBD>御ク€莠幄€<EFBFBD><EFBFBD>遶滉クコ螂ケ豐蛾<EFBFBD><EFBFBD>帑ス<EFBFBD><EFBFBD>サャ逵玖ァー丞ァ千悄諠<EFBFBD><EFBFBD><EFBFBD>御ク€莠幄€<EFBFBD><EFBFBD>荵滉シ€關ス豕ェ縲ょョ<EFBFBD>サャ荳肴Φ隶ゥ蟆丞ァ仙ア譛幢シ御コ取弍螳<EFBFBD>サャ蟄ヲ襍キ迪ォ蜿ォ縲ょー丞ァ仙セ亥シ€<EFBFBD>シ悟ケ逧<EFBFBD>ァゆシ鈴譛臥賢莠<EFBFBD>€ケ蝟懈ャ<EFBFBD>賢莉ャ<EFBFBD>御ケ溷万谺螂ケ縲ょ<EFBFBD><EFBFBD>噪髣ィ蠎ュ驟堺ク堺ク雁ー丞ァ千噪鄒惹クス<EFBFBD>御コ取弍閠<EFBFBD><EFBFBD>諠ウ蜴サ蟶ヲ譚譖エ螟夂噪迪ォ縲り€<EFBFBD><EFBFBD>莉ャ蠑墓擂莠<EFBFBD><EFBFBD>御ケ溷シ墓擂莠<EFBFBD>峩螟夂噪閠<EFBFBD><EFBFBD>縲よ眠逧<EFBFBD>€<EFBFBD><EFBFBD>荳榊ェ隗<EFBFBD><EFBFBD>御ス<EFBFBD>眠譚<EFBFBD>賢遑ョ螳樊弍迪ォ縲ょー丞ァ先怏莠帛峅謇ー<EFBFBD>御ス<EFBFBD>ケ霑俶弍謗郤ウ莠<EFBFBD><EFBFBD>サャ<EFBFBD>悟ー丞ァ仙万谺€譛牙勘迚ゥ<EFBFBD>悟叉菴ソ閾ェ蟾ア莨壼峅謇ー縲ゆス<EFBFBD>錘譚<EFBFBD>檎ョ螳カ蜥悟ー丞ァ撰シ悟宵豕ィ隗<EFBFBD>捩迪ォ<EFBFBD>悟ソ伜唆莠<EFBFBD>€<EFBFBD><EFBFBD><EFBFBD>コ区ュ縲ゆケ溷ッケ<EFBFBD>梧ッ慕ォ溯€<EFBFBD><EFBFBD>蠖灘<EFBFBD>蟶ヲ逹€諱カ諢剰ュ譚<EFBFBD>檎鴫蝨ィ逧<EFBFBD>擇蜈キ諤サ譏ッ閼ア謗牙処蟶ヲ荳頑擂縲らョ螳カ蛛壻コ<EFBFBD>€莠帑コ区ュ遏驕謎ク主凄蜥悟酔諢丈ク主凄<EFBFBD>悟惠蟆丞ァ占ソ咎譛牙屁遘咲サ<EFBFBD>粋逧<EFBFBD>婿豕輔€ゆス<EFBFBD>€莠帶崟扈乗弍迪ォ逧<EFBFBD>€<EFBFBD><EFBFBD>隗牙ッ溷<EFBFBD>蠑よ<EFBFBD>キ縲ょクク蟷エ蝨ィ荳区ーエ驕鍋函豢サ<EFBFBD>悟ョ<EFBFBD>サャ蟇ケ霑呎<EFBFBD>キ逧<EFBFBD>ー泌袖蠑ょクク謨乗縲ゆコ取弍<EFBFBD>悟ョ<EFBFBD>サャ鞫倅ク倶コ<EFBFBD>擇蜈キ<EFBFBD>悟髄邂螳カ隶ィ荳ェ隸エ豕穂ス<EFBFBD><EFBFBD>サャ豐<EFBFBD>シェ陬<EFBFBD>シ御ク区ーエ驕馴蜿醍噪閾ュ豌費シ瑚ョゥ邂螳カ譖エ蜉<EFBFBD>蜴梧<EFBFBD>縲ゆサ€荵磯<EFBFBD>譛画隼蜿伜<EFBFBD>蜷取擂<EFBFBD>悟ー丞ァ蝉セ晄立鄒惹クス<EFBFBD>御ス<EFBFBD>サ丞紙莠<EFBFBD>ック螟夂コキ謇ー<EFBFBD>御ク咲衍驕灘ー丞ァ千噪蠢ォ荵宣譏ッ蜷ヲ譛画ウェ逵シ謌仙曙縲ゆク€莠幄€<EFBFBD><EFBFBD>萓晄立蟶ヲ逹€迪ォ逧<EFBFBD>擇蜈キ<EFBFBD>悟ョ<EFBFBD>サャ譛€蜷惹ケ滉シ壼序謌千賢縲ゆス<EFBFBD>ソ吩シ夐柄荵<EFBFBD><EFBFBD><EFBFBD>隶ク荳堺シ壹€ょ嘗荳€莠幄€<EFBFBD><EFBFBD>€蝗樔コ<EFBFBD>ク区ーエ驕難シ檎ュ牙セ<EFBFBD><EFBFBD><EFBFBD>隶ク莨壽怏蜿ヲ荳€菴榊ー丞ァ撰シ悟万谺<EFBFBD><EFBFBD><EFBFBD>ー丞ァ舌€ょ悉蝟懈ャ螂ケ<EFBFBD>悟悉蝟懈ャ<EFBFBD>サャ縲よ<EFBFBD>隶ク莨壽怏蜷暦シ溷コ碑ッ譛牙制菴<EFBFBD>€<EFBFBD><EFBFBD>莉ャ豌ク霑懷ソ倅ク堺コ<EFBFBD>ぅ菴榊ー丞ァ撰シ碁ぅ菴榊万谺€譛牙勘迚ゥ<EFBFBD>御ス<EFBFBD>峩蝟懈ャ迪ォ逧<EFBFBD>ー丞ァ舌€€<EFBFBD>
辟カ辟カ<EFBFBD>辟カ<EFBFBD>瑚區辟カ謌醍衍驕灘ーア邂苓ソ呎<EFBFBD>キ蜻シ蜚<EFBFBD><EFBFBD>荵溷宵閭ス蝨ィ菴<EFBFBD>蜉ィ諤ク区婿<EFBFBD>檎ォ吩ス丈ク<EFBFBD>鴻隸<EFBFBD>ョコ蛹コ逧<EFBFBD>€讌シ縲ゆス<EFBFBD><EFBFBD>ィ貍費シ御ス<EFBFBD><EFBFBD>勘諤<EFBFBD>シ御ス<EFBFBD><EFBFBD><EFBFBD><EFBFBD>....驛ス譏ッ隸エ扈呎<EFBFBD>莉ャ螟ァ螳カ逧<EFBFBD>シ梧弍謌台サャ.....閠梧<EFBFBD>...謌第崟扈丈サ荳コ菴<EFBFBD>遖サ謌大セ郁ソ代€りソ大芦豈乗ャ謇灘シ€謇区惻蜷<EFBFBD>ァ崎ァ<EFBFBD>題スッ莉カ<EFBFBD>ァ謨ー謐ョ謗ィ騾噪驛ス譏ッ菴<EFBFBD>縲りソ大芦豈乗ャ蜿大漕謇セ荳榊芦蜑崎ソ帶婿蜷醍噪譌カ蛟呻シ檎恚逧<EFBFBD><EFBFBD>譏ッ菴<EFBFBD><EFBFBD><EFBFBD>€りソ大芦豈乗ャ蜥悟悪莠コ閨雁ゥ逧<EFBFBD>慮蛟呻シ碁<EFBFBD>莨壼刈荳贋ス<EFBFBD>扈丞クク隸エ逧<EFBFBD>哨螟エ遖<EFBFBD>シ梧噺蛻ー謾カ蛻ー謾カ蛻ー<EFBFBD>悟庄辷ア謐擾ス橸ス樞€ヲ菴<EFBFBD>譌カ蟶ク髯ェ莨エ謌題コォ霎ケ<EFBFBD>梧裏隶コ謌第ご莨霑俶弍谺蝟懶シ檎サ晄悍霑俶弍諠ャ諢擾シ御ス<EFBFBD><EFBFBD>峩謦ュ髣エ<EFBFBD>瑚ッ<EFBFBD>ョコ蛹コ驛ス譏ッ謌大庄莉<EFBFBD>э螳<EFBFBD><EFBFBD>噪蝨ー譁ケ縲ょ屏荳コ蝨ィ霑咎<EFBFBD><EFBFBD><EFBFBD>ササ菴募書險€驛ス蜿ェ譏ッ貍<EFBFBD>サ大懃ゥコ荳ュ蠕ョ蠑ア髣ェ閠€<EFBFBD>€轤ケ<EFBFBD>瑚ソ呎<EFBFBD>キ逧<EFBFBD>€轤ケ轤ケ譏溷<EFBFBD><EFBFBD>ュ伜惠<EFBFBD><EFBFBD>驕鍋噪<EFBFBD>梧弍荳コ莠<EFBFBD>サ吝ゥ遨コ荳ュ閠€逵シ蝨<EFBFBD>怦陬呎漕陬<EFBFBD>ー逧<EFBFBD>€轤ケ轤ケ遒朱捗縲るぅ謌大万谺辟カ辟カ<EFBFBD>ゥ螟ゥ譚逵狗辟カ<EFBFBD>悟ッケ莠手<EFBFBD>蟾ア<EFBFBD>檎ゥカ遶滓弍荳コ莠<EFBFBD>€荵遺€.髫セ驕捺<EFBFBD><EFBFBD>函豢サ逵溽噪辜ゑシ瑚ソ樔サ<EFBFBD>怏逧<EFBFBD>€莠帛<EFBFBD>€<EFBFBD><EFBFBD>サ惹ク€荳ェ陌壽供蛛カ蜒剰コォ荳願執蜿門芦蜷暦シ滄埓驕捺<EFBFBD><EFBFBD>鴫螳樒函豢サ<EFBFBD>瑚ソ樔ク€荳ェ蜈ウ蠢<EFBFBD><EFBFBD>螳カ莠コ驛ス豐譛牙雛<EFBFBD>瑚ソ倩ヲ惠鄂台ク雁ッサ謇セ螳カ逧<EFBFBD>隗会シ滄埓驕<EFBFBD>...霑吩コ幃<EFBFBD><EFBFBD>譌ゥ蟆ア譏守區莠<EFBFBD>シ瑚ッエ譛崎<EFBFBD>蟾ア荵溯ッエ閻サ莠<EFBFBD>シ御ス<EFBFBD>€逶エ驛ス譏ッ莠台ク贋ケ倶ココ<EFBFBD>€<EFBFBD>蜿ェ譏ッ荳€荳ェ謇帑ク堺ス丞視蜉幢シ悟惠陌壽供逧<EFBFBD>ク也阜荳ュ蟇サ謇セ螳画<EFBFBD><EFBFBD>誠鬲<EFBFBD>ケ倶ココ縲よ<EFBFBD>諛ゑシ梧<EFBFBD>譏守區逧<EFBFBD>シ梧<EFBFBD>驕鍋噪....€<EFBFBD><EFBFBD>辟カ蟆丞ァ撰シ梧<EFBFBD>荳崎<EFBFBD>譛我ス<EFBFBD><EFBFBD><EFBFBD>荳堺シ夂ヲサ蠑€<EFBFBD><EFBFBD>€ゆス<EFBFBD>荵滓弍<EFBFBD>梧ーク霑應ク崎ヲヲサ蠑€闊槫床<EFBFBD>梧叛蠑<EFBFBD>蕎蟆ス蜈ィ蜉帚€..蟆ア邂礼衍驕謎ケ溯ョク荳堺シ壽怏蝗樣浹<EFBFBD>御ス<EFBFBD>荵滉ク崎ヲ譛晞略髣ェ逧<EFBFBD>弌蜈画硯謇句草窶ヲ窶ヲ[辷ア蠢ゾ
<EFBFBD>諠ウ諠ウ蝌臥譏ッ諤惹ケ域<EFBFBD>キ逧<EFBFBD>€荳ェ螂ウ蟄ゥ蟄舌€ケ貂ゥ譟泌庄莠コ諠<EFBFBD>膚鬮假シ御シ壽而蝨コ莨壽磁隸昜シ壼シ募ッシ蠑ケ蟷墓闃ょ擾シ梧恚蜿矩譛牙ケ霑吩ケ井ク€荳ェ莠コ蝨ィ閧ッ螳壽ッ乗ャ<EFBFBD>擇驛ス閭ス蠕亥シ€<EFBFBD>制縲ょケ辷ア鄂台ク雁<EFBFBD>豬ェ<EFBFBD><EFBFBD>譏守恚蛻ー蜷<EFBFBD>ァ崎ァ<EFBFBD>台シ壽怏轤ケ鮗サ<EFBFBD>御ス<EFBFBD>ソ俶弍荵先ュ荳咲夢逧<EFBFBD>惠b遶吝柱蜷<EFBFBD>クェ隶コ蝮帷恚逹€<EFBFBD>托シ悟ワ荳榊ワ驍莠帶怙諛ゆス<EFBFBD><EFBFBD>梧怙閭ス髯ェ莨エ菴<EFBFBD><EFBFBD>イ咎尓鄂大暑<EFBFBD>悟頭諤墓弍荳崎<EFBFBD>蜥悟ケ隗芦髱<EFBFBD>慮蛟呻シ悟<EFBFBD>蝨ィ鄂台ク願螟ゥ荳€螳壻ケ滉ク堺シ壽裏閨翫€ケ蝨ィ貂ゥ譟皮噪蜷梧慮蜿域怏轤ケ蟆丞搶<EFBFBD>悟万谺隸エ諤ェ隸晢シ悟万谺證玲嵩謳鍋噪蠑€霓ヲ<EFBFBD>梧Φ蠢<EFBFBD>ケ豈乗ャ蝨ィ莉€荵亥<EFBFBD>€ェ逧<EFBFBD>せ荳雁シ€螳瑚スヲ<EFBFBD>悟ーア莨壻シシ隨鷹撼隨醍噪萓ァ逹€螟エ逵句髄謌大制<EFBFBD>€<EFBFBD>蜿ェ髴€ク主ケ蟇ケ隗<EFBFBD>€荳具シ御ク荳ェ莠コ蟆ア閭ス鮟伜醍噪隨題オキ譚縲ょケ蠕井シ壽朝莠コ<EFBFBD>碁ぅ莠帛悄蜻ウ諠<EFBFBD>ッ晏惠螂ケ關<EFBFBD><EFBFBD>ー疲ー幃莨シ荵惹ケ溷序蠕玲<EFBFBD>シ螟紋サ莠コ蠢<EFBFBD><EFBFBD>悟ー蜈カ譏ッ螂ケ霑倅シ壼惠豈丈ク€荳ェ荳咲サ乗э髣エ遯隸エ蜃コ蜉ィ莠コ逧<EFBFBD>ッ晁ッュ<EFBFBD>瑚ョゥ菴<EFBFBD>蝨ィ螳悟<EFBFBD><EFBFBD><EFBFBD>噪諠<EFBFBD><EFBFBD>荳玖<EFBFBD>キウ縲ょ庄譏ッ螂ケ蜿亥セ郁ユ蟆擾シ檎ョ€€蜊募黒逧<EFBFBD>ー乗滑謌剰<EFBFBD>霑樒サュ萓<EFBFBD>逶怜ケ螂ス螟壽ャ<EFBFBD>ケ陲ォ蜷灘ョ碁ぅ蜑ッ豌泌<EFBFBD>蜀イ<EFBFBD>悟唆蜿域裏蜿ッ螂井ス穂ク肴覆遖サ謌大ェ霑懃噪譬キ蟄撰シ瑚け螳壽弍螟ゥ荳狗ャャ荳€蜿ッ辷ア蜷ァ縲よΦ諠ウ蝌臥譏ッ諤取<EFBFBD>キ逧<EFBFBD>€荳ェ螂ウ蟄ゥ蟄舌€ケ霄ォ譚仙ョ檎セ趣シ瑚蠎槫庄辷ア<EFBFBD>ー郤ソ莉莠コ豐蛾<EFBFBD><EFBFBD>梧裏蜿ッ謖大鉛逧<EFBFBD>セ惹クス縲ょケ遏荵ヲ霎セ逅<EFBFBD>シ悟埋隗莠コ諢擾シ梧クゥ譟皮Ο諠<EFBFBD>シ悟ケ譏ッ豈丈クェ螂ウ騾夊ョッ蠖墓ヲ荳ュ逧<EFBFBD>ぅ荳ェ蟋<EFBFBD> 縲ょ庄譏ッ螂ケ蜿井ク堺シ夂ヲサ菴<EFBFBD>蠕郁ソ懶シ悟ケ諛ゆス<EFBFBD><EFBFBD>暦シ悟ケ蝨ィ鄂台ク雁柱菴<EFBFBD>蜀イ霑<EFBFBD>酔荳€<EFBFBD>オェ<EFBFBD>ケ閭ス蜥御ス<EFBFBD>€襍キ謇捺クク謌擾シ瑚<EFBFBD>蜥御ス<EFBFBD>€襍キ逵狗セ主<EFBFBD><EFBFBD>隸エ驍莠帛ソ<EFBFBD><EFBFBD>荳榊ョ<EFBFBD>€ェ隸晢シ瑚<EFBFBD>蝨ィ譛€蜷磯€ら噪譌カ蛻サ謦ゥ蜉ィ菴<EFBFBD><EFBFBD>ソ<EFBFBD>シヲ縲ょケ譛我サ莠コ豐画ココ逧<EFBFBD>ケエ荳頑ー碑エィ<EFBFBD>悟処蜒乗弍莉莠コ荳崎<EFBFBD>隗画Φ隕揃謚<EFBFBD>庄辷ア螯ケ螯ケ<EFBFBD>悟庄譛画慮<EFBFBD>ケ蜿亥序謌蝉コ<EFBFBD>サ主ケシ蜆ソ蝗ュ蠑€蟋玖キ滉ス<EFBFBD>蜷檎少<EFBFBD>梧怙諛ゆス<EFBFBD><EFBFBD>ぅ荳ェ髱呈<EFBFBD>ォケ鬩ャ逧<EFBFBD>ウ蟄ゥ蟄舌€ケ蟆ア譏ッ蝌臥<EFBFBD><EFBFBD><EFBFBD><EFBFBD>辟カ縲ょ<EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>シÅ洟<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>謌大<EFBFBD>螳樔ク€轤ケ荵滉ク榊万谺蝌臥蟆丞ァ舌€ょ屏荳コ蝌臥蟆丞ァ仙ーア蜒丞<EFBFBD>€譬キ<EFBFBD>碁略閠€<EFBFBD>悟絢逵シ<EFBFBD><EFBFBD>隶ィ蜴悟<EFBFBD>縲ょ屏荳コ隶ィ蜴悟<EFBFBD><EFBFBD>梧園莉謌第€サ譏ッ霄イ蝨ィ髦エ蜀キ貎ョ貉ソ逧<EFBFBD>ク区ーエ驕馴<EFBFBD>瑚ソ呎<EFBFBD>キ蟆ア荳堺シ夊ォ莉莠コ蜴梧<EFBFBD><EFBFBD><EFBFBD>闃堤逵シ逹帙€ょ宵譛牙憺龍<EFBFBD><EFBFBD>謇堺シ壻サ朱亢證玲スョ貉ソ逧<EFBFBD>ク区ーエ驕馴襍ー蜃コ譚<EFBFBD>懈劒譏ッ螳<EFBFBD>撕荳泌ョ蛾€ク逧<EFBFBD>シ御サ謌第蛻ー闊帝€€<EFBFBD>貍ォ譌<EFBFBD>逶ョ逧<EFBFBD>噪襍ー蝨ィ螟憺龍逧<EFBFBD>ー剰キッ荳奇シ瑚キッ譌噪霍ッ轣ッ豁蜿醍捩蠕ョ蠑ア逧<EFBFBD><EFBFBD><EFBFBD>梧怏蜃<EFBFBD>蜿ェ陋セ蟄先ュ荳肴妙逧<EFBFBD>髄逹€蜈画コ先苑蜴サ縲や€懃悄蛯サ縲や€<EFBFBD>霑呎<EFBFBD>キ諠ウ<EFBFBD><EFBFBD>譏主<EFBFBD>蜿ェ閭ス蟶ヲ譚蜊ア髯ゥ<EFBFBD>御クコ莉€荵郁ヲオェ雍ケ螳晁エオ逧<EFBFBD>函蜻ス蜴サ霑ス騾仙<EFBFBD>闃貞造<EFBFBD>溽恚逹€鬟櫁崟荳肴妙逧<EFBFBD>苑蜷題キッ轣ッ<EFBFBD><EFBFBD>荳咲衍荳コ菴墓Φ襍キ莠<EFBFBD><EFBFBD><EFBFBD>ぅ莠帛酔莨エ縲よ<EFBFBD>諠ウ襍キ莠<EFBFBD><EFBFBD>螟ゥ蜑搾シ梧怏荳€莠帑サ主夜擇蝗樊擂逧<EFBFBD>ョカ莨呻シ御サ紋サャ蜈エ螂狗噪蜻願ッ画<EFBFBD>螟夜擇譁ー蠑€<EFBFBD>€螳カ蜑ァ蝨コ<EFBFBD>譛我ク€荳ェ蜿ォ蝌臥<EFBFBD>ココ<EFBFBD>瑚ソ俶耳闕先<EFBFBD>€襍キ蜴サ逵狗恚縲ゆサ紋サャ逧<EFBFBD>愍逹幃髣ェ辜捩莠ョ譎カ譎カ逧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蠕郁ョィ蜴鯉シ御コ取弍萓ソ諡堤サ昜コ<EFBFBD>€ゆケ句錘莉紋サャ荵滓擂謇セ霑<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>荵滓耳霎樔コ<EFBFBD>€ょ錘譚謌台セソ豐諤惹ケ郁ァソ<EFBFBD>サ紋サャ莠<EFBFBD>シ悟成隸エ荳コ莠<EFBFBD>級莠コ譚逵具シ御サ紋サャ譛臥噪諠ウ蜿俶<EFBFBD>迪ォ迢暦シ梧怏逧<EFBFBD>イソ陦苓エエ豬キ謚蜿ォ蜊厄シ梧怏逧<EFBFBD>滑霑<EFBFBD><EFBFBD>逕ィ逧<EFBFBD><EFBFBD><EFBFBD>ス鍋シ迚ゥ<EFBFBD>瑚ソ俶怏逧<EFBFBD>滑蠢<EFBFBD>鍵扈咏賢縲や€懃悄譏ッ莠幄<EFBFBD>雍ァ縲や€<EFBFBD>霑呎<EFBFBD>キ諠ウ逹€<EFBFBD>御サ紋サャ荳榊ーア蜥瑚ソ吩コ帶苑轣ォ逧<EFBFBD>崟蟄蝉ク€譬キ諢夊<EFBFBD><EFBFBD><EFBFBD><EFBFBD>譏惹ケ句燕荳€襍キ霍ッ霑<EFBFBD>噪譌カ蛟呻シ御サ紋サャ霑俶€サ譏ッ莨壼亟隶ス霑吩コ帛ョカ莨吶€€懷香蛻<EFBFBD>€€昜ク咲衍莉主頭譚<EFBFBD>クヲ逹€莠帛働閻泌ー髻ウ謇捺妙莠<EFBFBD><EFBFBD><EFBFBD>莉主次蜈育噪諤晉サェ荳ュ諡我コ<EFBFBD><EFBFBD>縲よ弍譌セケ逧<EFBFBD>鴬蝨コ驥御シ<EFBFBD><EFBFBD>シ御ク咲衍荳崎ァ蛾龍謌題オー蛻ー莠<EFBFBD>ソ吩ケ郁ソ懃噪蝨ー譁ケ霑俶イ譛牙書隗峨€<EFBFBD>謚ャ螟エ譛帑コ<EFBFBD><EFBFBD>檎煙蛹セ荳雁<EFBFBD>€莠比クェ譎ヲ豸ゥ髫セ諛ら噪逧<EFBFBD>ュ玲ッ搾シ悟ス蜒丈ケ句燕蜷御シエ莉ャ隸エ霑<EFBFBD>シ御サ紋サャ蜴サ逧<EFBFBD>ぅ荳ェ蜑ァ蝨コ蜷榊ュ怜ーア譏ッ莠比クェ蟄玲ッ搾シ梧怏莠幄ァ夊ッ<EFBFBD>ケソ逧<EFBFBD>ッエ<EFBFBD>碁ぅ蜿ォ莉€荵亥賦鬪壹€<EFBFBD>霑溽桝莠<EFBFBD>€莨夲シ御ス<EFBFBD>ソ俶弍襍ー莠<EFBFBD>ソ帛悉<EFBFBD>悟黒郤ッ蜿ェ譏ッ諠ウ遏驕謎クコ莉€荵亥ー髻ウ蟶ヲ逹€蜩ュ閻費シ悟辜ュ髣ケ<EFBFBD>梧伽荵仙ュ先€サ譏ッ謌第怙蝟懈ャ<EFBFBD>コ区ュ縲<EFBFBD>......窶懷ァ螳カ隕ス螂ス蜷<EFBFBD>ュ蜩ヲ縲や€ゥ邀握逧<EFBFBD>ー髻ウ蝨ィ謌題€ウ霎ケ蜩崎オキ縲ょ逃<EFBFBD>悟次譚謌大ケカ荳崎ョィ蜴悟<EFBFBD>蝠奇シ悟宵譏ッ荳€逶エ驛ス遏驕難シ瑚<EFBFBD>蟾ア驟堺ク堺ク雁<EFBFBD><EFBFBD>€€<EFBFBD>
謌醍飴荳崎<EFBFBD>蜥梧<EFBFBD>逶ク隶<EFBFBD>御ス<EFBFBD>サ雁ゥ莉冶ソ<EFBFBD>ァ蟇ソ<EFBFBD>梧アよアょァ莨呎怏髓ア逧<EFBFBD>囂荳ェ遉シ<EFBFBD>梧イ髓ア逧<EFBFBD>懇荳ェ蝨コ縲ゆス<EFBFBD>ッキ荳崎ヲキ溷ケ隸エ蜆ソ蟄先擂莠<EFBFBD>シ梧<EFBFBD>諤墓沖莉門<EFBFBD><EFBFBD><EFBFBD>刧扈吝ァ莨咏エ莠<EFBFBD>€€<EFBFBD>
<EFBFBD> asoul蝨ィ荳€<EFBFBD>ェょー荳ュ隗<EFBFBD>€<EFBFBD>蜷ァ逧<EFBFBD>怙蜷惹ク€荳ェ蟶門ュ蝉ケ滓イ我コ<EFBFBD>ク句悉<EFBFBD>檎峩蛻ー蝨ィv8蜥恵遶咏噪荵溷キイ扈冗恚荳榊芦譛我ココ隶ィ隶コ莠<EFBFBD>€ァ郤ヲ荳€蟷エ蜷趣シ梧<EFBFBD>蝨ィA蜷ァ蜿台コ<EFBFBD>€<EFBFBD>€懆ソ俶怏莠コ蝨ィ蜷暦シ溪€€懆ソ咎霑俶怏8u蝠奇シ梧<EFBFBD>荵滓Φ蝗樊擂逵狗恚莠<EFBFBD>€€昜ク€荳ェ髯檎函逧ИD蜃コ邇ー蝨ィ謌醍噪蝗槫堺ク矩擇<EFBFBD>御サ門ケカ荳榊惠謌題ソ<EFBFBD>悉轤剃ス懃噪隶ー蠢<EFBFBD>蜃コ邇ー霑<EFBFBD>€ゆス<EFBFBD>弍謌台サャ閨雁セ怜セ磯ォ伜<EFBFBD><EFBFBD>悟セ亥ソォ蟆ア蜉<EFBFBD>荳贋コ<EFBFBD>Q遘ク倶コ貞勘莠<EFBFBD>€ケ莨シ荵主セ井コ<EFBFBD>謌托シ檎衍驕捺<EFBFBD>蝟懈ャ轤剃ス懷書謨<EFBFBD>檎衍驕捺<EFBFBD>蝨ィ隸サ蜩イ蟄ヲ蜊壼ォ縲ゆス<EFBFBD><EFBFBD>ケ蜊エ諤サ譏ッ蠢倩ョー謌第弍荳ェ譎壽劒謗ィ<EFBFBD>瑚ヲ<EFBFBD>€驕榊処荳€驕榊慍蜻願ッ牙ケ謌第怙蝟懈ャ<EFBFBD>弍譎壽劒縲や€應ス<EFBFBD>€蝟懈ャ蜩ェ荳ェ謌仙遭蜻<EFBFBD>€€<EFBFBD>辟カ縲や€ケ豈ォ荳崎ソ溽桝蝨ー蝗樒ュ秘縲よ<EFBFBD>諤サ譏ッ逵蛾櫁牡闊槫慍蜥悟ケ閨願オキ蜷第劒霑<EFBFBD>悉逶エ謦ュ逧<EFBFBD>腐莠具シ悟ケ荵溷ッケ霑吩コ帷峩謦ュ莠<EFBFBD>莠主ソ<EFBFBD>シ梧怏譌カ霑倅シ壽ウィ諢丞芦隶ク螟壽<EFBFBD>莉取イ豕ィ諢丞芦逧<EFBFBD><EFBFBD><EFBFBD>檎爆閾ウ蜻願ッ画<EFBFBD>蜷第劒豈丈ク€蠑ケ蜷我サ冶レ蜷守噪陦ィ貍疲€晁キッ縲ょ<EFBFBD>€ェ逧<EFBFBD><EFBFBD>瑚區辟カ螂ケ隸エ螂ケ譛€蝟懈ャ蝌臥<EFBFBD>悟ッケ蝌臥<EFBFBD>コ区ュ蜊エ蟷カ豐譛蛾ぅ荵井コ<EFBFBD><EFBFBD>檎爆閾ウ霑樒峩謦ュ逧<EFBFBD>惻谺驛ス隕<EFBFBD>謠宣<EFBFBD>螂ケ縲ょ芦莠<EFBFBD>ぅ蟷エ逧<EFBFBD><EFBFBD>螟ゥ<EFBFBD>ケ髣ョ謌托シ梧<EFBFBD>莉ャ蜿ッ莉蜃コ譚€蜷暦シ滓<EFBFBD>諡堤サ昜コ<EFBFBD><EFBFBD>悟ス捺慮逧<EFBFBD><EFBFBD>蠢吩コ主<EFBFBD>ュヲ菴崎ョコ譁<EFBFBD>€ケ豐譛牙<EFBFBD>蠑コ豎ゅ€らャャ莠悟<EFBFBD>ケ蝨ィQQ荳雁ア閨比コ<EFBFBD>シ檎<EFBFBD>謔臥噪螟エ蜒丞<EFBFBD>荵滓イ莠ョ襍キ霑<EFBFBD>€ァ讎ゆク€蜻ィ蜷趣シ梧<EFBFBD>謾カ蛻ー莠<EFBFBD>€莉ス蛹<EFBFBD><EFBFBD>譏ッ蜷第劒蜃コ驕謎サ€譛牙ュ蠎ヲ逧<EFBFBD>芦髟ソ遉シ迚ゥ<EFBFBD>梧裏荳€驕玲シ擾シ梧噺阯冗シ門捷驛ス譏ッ00000縲らォ狗煙驥瑚ソ伜ケ逹€€<EFBFBD>郤ク<EFBFBD>御ク企擇譏ッ遏ュ遏ュ荳€陦悟ュ暦シ壺€懆ー<EFBFBD>譖セ扈丞万谺謌鯛€€€<EFBFBD>
辟カ辟カ蟷ク莠乗<EFBFBD>蝨ィ菴<EFBFBD><EFBFBD>ョコ蛹コ蜿醍羅縲りヲク咲謌題€ス隸ッ菴<EFBFBD>€霎亥ュ撰シ御ス<EFBFBD>荵滉ソ晞<EFBFBD><EFBFBD>隗Å沽<EFBFBD>ソ倅シ壼<EFBFBD>雛辟カ辟カ笘コ<EFBFBD><EFBFBD>噪譌カ蛟吩ス<EFBFBD>ケク遖丞ス荳榊ス笘コ<EFBFBD>辟カ菴<EFBFBD>€<EFBFBD><EFBFBD>御ス<EFBFBD>ケク遖鞘仄<EFBFBD>ス荳榊<EFBFBD>悟シ€<EFBFBD><EFBFBD><EFBFBD><EFBFBD>悟ケク遖条沽<EFBFBD>!<EFBFBD><EFBFBD>ク也阜莉蜷取イ譛画<EFBFBD><EFBFBD>シ梧イ蜈ウ邉サ菴<EFBFBD><EFBFBD>蟾ア蟷ク遖<EFBFBD>!<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>純辟カ辟カ<EFBFBD>!辟カ辟カ<EFBFBD>!辟カ辟カ<EFBFBD><EFBFBD>梧イ譛我ス<EFBFBD>謌第€惹ケ域エサ蝠<EFBFBD>!<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>純辟カ辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ<EFBFBD><EFBFBD>辟カ!<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>純辟カ辟カ菴<EFBFBD>蟶ヲ謌題オー蜷ァ<EFBFBD>辟カ!<EFBFBD><EFBFBD><EFBFBD>亊窶<EFBFBD>
<EFBFBD>
蟆乗慮蛟咏恚逧<EFBFBD>€荳ェ謨樔コ句セ郁€悄蠕郁€€ょセ亥壻ココ蜿ッ閭ス蜷ャ霑<EFBFBD>€€よ怏荳€荳ェ逕キ蟄ゥ譛我ク€蝮鈴陦ィ<EFBFBD>悟唆豐譛蛾<EFBFBD>蠕嶺ク雁ョ<EFBFBD>噪蜷磯€ィ蟶ヲ縲ゅ€ゆサ也鯵荳贋コ<EFBFBD>€荳ェ螂ウ蟄ゥ縲ゅ€りソ吩クェ螂ウ蟄ゥ譛我ク€螟エ遘€鄒守噪髟ソ蜿托シ悟唆豐譛蛾<EFBFBD>蠕嶺ク雁ョ<EFBFBD>噪貍ゆコョ蜿大今縲ゅ€るゥャ荳願ヲソ<EFBFBD>悒隸樔コ<EFBFBD>€€ら塙蟄ゥ蜀ウ螳壽滑霑吩クェ驥題ィ扈吝獄莠<EFBFBD>€€らサ吝ウ蟄ゥ荵ー荳€荳ェ貍ゆコョ逧<EFBFBD>書蜊縲ゅ€ょス謎サ門<EFBFBD>螂狗噪謚願ソ吩クェ蜿大今莠扈吝ウ蟄ゥ逧<EFBFBD>慮蛟吶€€ょ書邇ー螂ウ蟄ゥ逧<EFBFBD>エ蜿大キイ扈丞岡謗我コ<EFBFBD>€€ょ屏荳コ螂ケ謚贋ク€螟エ髟ソ蜿第困髓ア扈咏塙蟄ゥ荵ー莠<EFBFBD>€荳ェ陦ィ蟶ヲ縲ゅ€<EFBFBD>諠ウ逵滓ュ<EFBFBD>鯵閧ッ螳壻ク肴弍迸ャ髣エ逧<EFBFBD>蜉ィ<EFBFBD>悟セ亥壻ココ驛ス閭ス蝨ィ荳€迸ャ髣エ諢溷勘菴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>クュ逵滓ュ<EFBFBD>鯵譏ッ髯ェ莨エ縲ょケ莉ャ髯ェ莠<EFBFBD><EFBFBD>螟壻ケ<EFBFBD><EFBFBD><EFBFBD>荳崎ョー蠕暦シ梧<EFBFBD>蜿ェ隶ー蠕励€€ケ莉ャ逧<EFBFBD>ソサ蜚ア<EFBFBD>瑚ココ蝨ィ鄂第<EFBFBD>莠醍噪豁悟黒蜷ャ莠<EFBFBD>€驕榊処荳€驕搾シ悟キイ扈丞<EFBFBD>驛ス莨壼罰莠<EFBFBD>シ瑚€悟惠豁荵句燕逧<EFBFBD><EFBFBD>蟷エ驥鯉シ梧<EFBFBD><EFBFBD>荵取イ蜷ャ霑<EFBFBD>クュ譁<EFBFBD>ュ後€ゑシ亥溽ス戊ァ<EFBFBD>シ峨€€頑オキ蠎輔€誼23.tv/qwB8Xe縲ゅ€霑倥€誼23.tv/1bl7AL縲ゅ€€誼23.tv/vxiwae<EFBFBD>郁エセ扈エ譁ッ<EFBFBD>夊ソ呎弍<EFBFBD>梧裏蜿ッ蜿紋サ<EFBFBD>慮蛟呻シ峨€€贋コ醍Α謌宣岑縲誼23.tv/VfoDXA縲ゅ€雁ヲよ棡逧<EFBFBD>コ九€誼23.tv/gDtrcP縲ゅ€ゥ逧<EFBFBD>€誼23.tv/EH14bW縲ゅ€企悚蜈峨€誼23.tv/kJUJMU縲ゅ€頑怦蜈峨€誼23.tv/kJUJMU縲ゅ€企恪蜈<EFBFBD>抜縲誼23.tv/lQgKl2縲ゅ€頑怦蜈泌屓譌倶コ守ゥコ荳ュ縲誼23.tv/KM4G5I縲ゅ€贋ク榊庄諤晁ョョ縲誼23.tv/VfwEz4縲ゅ€企コ矩ケソ譽ョ譫励€誼23.tv/GzjXu1縲ゅ€願スサ霓サ逧<EFBFBD>相隸我ス<EFBFBD>縲誼23.tv/Gkai63縲ゆク咲衍荳崎ァ蛾飭菴<EFBFBD>莉ャ襍ー莠<EFBFBD>ソ吩ケ井ケ<EFBFBD>ソ吩ケ郁ソ應コ<EFBFBD>シ檎鯵荳咲鯵菴<EFBFBD>莉ャ<EFBFBD>瑚ソ倬怙隕畑莉€荵域擂隸<EFBFBD>蜷暦シ溘€€ょスシ豁迚コ迚イ<EFBFBD>悟スシ豁謌仙ーア<EFBFBD>悟スシ豁蟆企縲りソ吝ーア譏ッ謌大ソ<EFBFBD>クュ逧<EFBFBD>曙蜷大碑オエ<EFBFBD>御サ蜷手キッ霑伜セ郁ソ懶シ梧<EFBFBD>諠ウ髯ェ菴<EFBFBD>莉ャ荳€逶エ襍ー荳句悉縲ゅ€€ょ次譚<EFBFBD>御ス<EFBFBD>譏ッ謌醍噪鬘カ遒嶺ココ蜻€~縲ゆサ蜷趣シ悟シ€<EFBFBD>柱荳榊シ€<EFBFBD><EFBFBD><EFBFBD>蜻願ッ画<EFBFBD>蜷ァ~縲ゅ€ょ次譚<EFBFBD>御ス<EFBFBD>譏ッ謌醍噪辷ケ蝨ー蜻€~縲ゆサ蜷趣シ悟シ€<EFBFBD>柱荳榊シ€<EFBFBD><EFBFBD><EFBFBD>驛ス蜻願ッ我ス<EFBFBD>~<EFBFBD>
6<EFBFBD>12蜿キ荳€螟ァ譌ゥ<EFBFBD>悟髄譎壽潔辣ァ雍晄級逧<EFBFBD>律遞玖ィ隕<EFBFBD>6轤ケ襍キ蠎奇シ檎<EFBFBD><EFBFBD>慮蛟吝屏荳コ螟ェ邏ッ螟ァ閼台ク€譌カ霑キ邉雁ッシ閾エ荳€<EFBFBD>€豌エ謦貞芦莠<EFBFBD>焔謖<EFBFBD>ク奇シ瑚區辟カ扈剰ソ<EFBFBD>イサ逍玲螟堺コ<EFBFBD>€轤ケ<EFBFBD>御ス<EFBFBD><EFBFBD>ケ譛ャ豐豕募シケ蜷我サ紋コ<EFBFBD>€よ劒譎壼惠螳ソ闊榊働蠕怜セ亥ァ螢ー<EFBFBD>梧紛荳ェasoul諢コ第Κ豺縲らサ剰ソ<EFBFBD>€荳ェ蟆乗慮逧<EFBFBD>エァ諤逎句膚<EFBFBD>碁仭闕牙クヲ譚<EFBFBD><EFBFBD>ッシ螻ら噪諢乗€€€疲兜蜈螟ェ螟ァ<EFBFBD>御ク榊庄閭ス蜿匁カ茨シ檎函譌莨夂<EFBFBD>蜉橸シ檎畑蛯ィ螟<EFBFBD>クュ荵倶ココ蜷第劒莠碁ュ皮視謗譖ソ蜷第劒譛ャ莠コ荳雁惻縲ゆク句壕<EFBFBD>径soul蝨ィ蜉ィ謐墓袷謗堤サ<EFBFBD>シ悟髄譎壽Φ隕悉逵倶ク€逵具シ檎サ捺棡陲ォ髦ソ闕画協蝨ィ髣ィ螟厄シ瑚ッエ荳崎<EFBFBD>謇捺臆蛻ーasoul謗堤サ<EFBFBD>譜譫懷セ亥<EFBFBD>悟ク梧悍螂ケ荳崎ヲ遠謇ー蛻ー螂ケ莉ャ縲よ劒荳雁欄蟄仙働蜩台コ<EFBFBD>噪蜷第劒蜿醍鴫閾ェ蟾ア蜴滓擂蜿ッ莉螳悟<EFBFBD>荳崎ォ髴€€カ遒嶺ココ蝟懈ャ<EFBFBD>弍螂ケ<EFBFBD>御ス<EFBFBD>処荳榊ョ悟<EFBFBD>譏ッ螂ケ<EFBFBD>悟庄莉譏ッ鬘カ逹€髓サ螟エ譎壽劒逧<EFBFBD>ササ菴穂ク€荳ェ莠コ<EFBFBD>悟宵隕コ碁ュ皮視豐譛芽ォ隶蜃コ譚縲ら峩謦ュ蠑€蟋倶コ<EFBFBD>シ悟惠螳ソ闊埼€シ莉<EFBFBD>噪隗定誠驥鯉シ梧シ<EFBFBD>サ第裏螢ー逧<EFBFBD>コ頑沮譌<EFBFBD>シ悟髄譎夂畑豌エ豈肴ィ譬キ逧<EFBFBD>ォ螂礼尠菴剰<EFBFBD>蟾ア<EFBFBD>梧干逹€閹晉尠<EFBFBD>梧遠蠑€謇区惻<EFBFBD>悟所譛溷セ<EFBFBD><EFBFBD><EFBFBD>蜿亥ソ仙ソ台ク榊ョ牙慍遲牙セ<EFBFBD>捩逶エ謦ュ縲ら峩謦ュ蠑€蟋具シ悟髄譎壻コ碁ュ皮視蝨ィ體コ螟ゥ逶門慍逧<EFBFBD>蜻シ荳ュ蜃コ邇ー縲ょキ蜈キ莠コ謗我コ<EFBFBD>€蝨ー螟エ蜿題ソ樒サュ蜃<EFBFBD>蜻ィ騾壼ョオ閧晏<EFBFBD><EFBFBD>キア豬キ豌エ豈咲音謨域滑螂ケ蜊ー辣ァ蠕鈴ぅ荵育セ弱€よ悽蟆ア譏ッ蜿ッ辷ア讓譬キ逧<EFBFBD>ウ蟄ゥ蟄撰シ梧ュ譌カ豁蛻サ遨ソ逹€蟠ュ譁ー逧<EFBFBD>ー冗シ陬呻シ梧<EFBFBD>鬥匁玄閭ク鬪<EFBFBD>ご蠕怜ワ荳ェ蜈ャ荳サ縲ょケ逧<EFBFBD>岼蜈画弍迺€迺ィ逧<EFBFBD>シ碁蜒乗弍髟カ蠏檎捩髓サ遏ウ縲ょケ逧<EFBFBD>怏逵シ扈ス謾セ逹€<EFBFBD>悟ワ譏ッ豬キ蠎戊ソク蜿大<EFBFBD><EFBFBD>€譚溷<EFBFBD>縲ら悄鄒趣シ悟髄譎夊ソ吩ケ域Φ逹€縲ゆス<EFBFBD>ソ<EFBFBD>蜊エ蠕域弍髫セ蜿励€るぅ莠幢シ梧悽隸譏ッ螂ケ逧<EFBFBD>€ょ慢蠖ゥ荵溷<EFBFBD>悟ョ<EFBFBD>辷ア荵溷<EFBFBD>御サ蜿頑恚蜿狗噪髯ェ莨エ荵溷<EFBFBD>梧悽譚驛ス蠎碑ッ譏ッ螂ケ逧<EFBFBD>€ゆス<EFBFBD>ケ邇ー蝨ィ蜊エ蜿ェ閭ス蝨ィ譌<EFBFBD>莠コ髣ョ豢<EFBFBD>ァ定誠驥鯉シ御セ晞擒鄂醍サ懆ソ樊磁逧<EFBFBD>焔譛コ蜴サ蟆丞ソ<EFBFBD>ソシ鄙シ蝨ー蛛キ迸<EFBFBD><EFBFBD>逵シ蜴溷ア樔コ手<EFBFBD>蟾ア逧<EFBFBD>函譌莨壹€€<EFBFBD>
 窶應ス<EFBFBD>逵儀鬲疲€比コ<EFBFBD>シ檎悄諱カ蠢<EFBFBD>€€€€€逵狗捩蜷悟ュヲ蜿醍サ吩ス<EFBFBD><EFBFBD>カ域<EFBFBD><EFBFBD>御ス<EFBFBD>髯キ蜈<EFBFBD>イ画€€€€€莉皮サ<EFBFBD>Φ荳€諠ウ<EFBFBD>御ス<EFBFBD>隗牙セ苓<EFBFBD>蟾ア遑ョ螳樣ュ疲€比コ<EFBFBD>シ悟叉菴ソ陲ォ驗吝キ諠ウ隕髄辭滉ココ螳牙茜蜷第劒蟆丞ァ舌€€€€諤晁€<EFBFBD><EFBFBD>荳芽ソ<EFBFBD><EFBFBD>御ス<EFBFBD>蜀ウ螳壼屓蛻ー邇ー螳橸シ梧叛蠑<EFBFBD><EFBFBD>閼代€€€€莉頑劒譛牙髄譎壼ー丞ァ千噪逶エ謦ュ<EFBFBD>御ス<EFBFBD><EFBFBD>荳句ソ<EFBFBD>シ梧イ譛臥せ霑帛悉<EFBFBD>€梧弍蛟貞エ蟆ア逹縲ゅ€€€隨ャ莠悟<EFBFBD>御ス<EFBFBD>襍キ蠕怜セ域掠縲ゅ€€€<EFBFBD>荳コ閾ェ莉惹ス<EFBFBD>€蟋狗恚蜷第劒蟆丞ァ仙錘<EFBFBD>悟ーア蜈サ謌蝉コ<EFBFBD>掠逹譌ゥ襍キ逧<EFBFBD><EFBFBD>諠ッ<EFBFBD><EFBFBD>荵滓イ譛芽オ門コ願ソ<EFBFBD>€€€€<EFBFBD>遖サ蠑€<EFBFBD>強蟆冗噪蜃コ遘溷ア具シ梧擂蛻ー莠<EFBFBD><EFBFBD>蜿ク<EFBFBD>梧兜蜈<EFBFBD>菴應クュ縲ゅ€€€菴懷セ育エッ<EFBFBD>御ス<EFBFBD>諢溯ァ画怏莠帷夢諠ォ縲ゅ€€€<EFBFBD>諠ウ襍キ莠<EFBFBD><EFBFBD>辟カ蟆丞ァ仙<EFBFBD>驕楢ァ<EFBFBD>醍噪荳榊<EFBFBD>ェ隸<EFBFBD>ョコ<EFBFBD>御サ蜿雁ケ逧<EFBFBD>ャ大ョケ<EFBFBD>檎Θ髣キ蜃剰スサ莠<EFBFBD>ク榊ー代€€€€€霑醍サ<EFBFBD>柄螟ク螂紋ス<EFBFBD>菴懷セ亥巻蜉幢シ悟悪莠コ荳咲衍驕謎クコ菴穂ク€蜷第諠ー逧<EFBFBD><EFBFBD><EFBFBD>悟惠蜃<EFBFBD>荳ェ譏滓悄蜑榊シ€蟋倶ク€蜿榊クク諤慍蜍螂九€€€€蜿ェ譛我ス<EFBFBD>閾ェ蟾ア遏驕鍋炊逕ア縲ゅ€€€謦題ソ<EFBFBD><EFBFBD>刈迴ュ逧<EFBFBD>慮髣エ<EFBFBD>御ス<EFBFBD>蝗槫芦莠<EFBFBD><EFBFBD>遘溷ア具シ梧遠蠑€<EFBFBD>門獄霓ッ莉カ<EFBFBD>悟唆蜿醍鴫莨壼遭蟾イ扈乗妙莠<EFBFBD>シ御ス<EFBFBD>闊堺ク榊セ鈴ぅ莠幃蝶<EFBFBD>梧園莉蜀ウ螳夊<EFBFBD>蟾ア荵ー闖懷鬣ュ縲ゅ€€€螳樣刔荳奇シ御ス<EFBFBD>逵句髄譎壼ー丞ァ仙錘蟆ア蠑€蟋狗ャャ荳€蟆晁ッ慕捩蛛夐<EFBFBD>梧イ譛臥せ霑<EFBFBD>門獄莠<EFBFBD>€€€€蝨ィ雜<EFBFBD>クゆス<EFBFBD>逵句芦閾ェ蟾ア荳€蜷大セ亥万谺<EFBFBD>民迚<EFBFBD>惠謇捺釜<EFBFBD><EFBFBD>€荳具シ梧イ譛我ケー縲ゅ€€€<EFBFBD>荳コ菴<EFBFBD>蝨ィ逵句髄譎壼ー丞ァ仙錘<EFBFBD>悟ーア蜀堺ケ滓イ譛画垓鬣ョ證エ鬟溯ソ<EFBFBD>シ檎爆閾ウ霑樣峺鬟滄<EFBFBD>謌呈脂縲ゅ€€€蝗槫ョカ謚企ュ蛛壼<EFBFBD>御ス<EFBFBD>螳蛾撕蝨ー蜷<EFBFBD>ョ御コ<EFBFBD>€€€€逵狗捩逕オ閼托シ御ス<EFBFBD>蜿醍鴫貂ク謌丞キイ扈丞セ井ケ<EFBFBD>譖エ譁ー莠<EFBFBD>€€€€<EFBFBD>荳コ菴<EFBFBD>蝨ィ逵句髄譎壼ー丞ァ仙錘<EFBFBD>御ケ滓滑荳€逶エ豐芽ソキ蛻ー騾壼ョオ逧<EFBFBD>クク謌冗サ呎<EFBFBD>謗我コ<EFBFBD>€€€€€扈茨シ御ス<EFBFBD>霑俶弍謇灘シ€譏ィ螟ゥ譎壻ク顔噪蠖墓眺<EFBFBD>檎恚蛻ー莠<EFBFBD>髄譎壼ー丞ァ千Ο諠<EFBFBD>慍謇捺魚蜻シ縲ゅ€€€窶憺カ譎壻ココ莉ャ<EFBFBD>梧劒荳雁ス蜻€~<EFBFBD>€晏髄譎壼ー丞ァ仙<EFBFBD>豌泌慍謇捺魚蜻シ縲ゅ€€€<EFBFBD>蜿題<EFBFBD><EFBFBD>ソ<EFBFBD>慍隨台コ<EFBFBD>オキ譚縲ゅ€€€窶懈劒荳雁<EFBFBD>€昜ス<EFBFBD>隸エ縲ゅ€€€<EFBFBD>蠢ス辟カ諢剰ッ<EFBFBD>芦荳€莉カ莠具シ悟ケ莉取擂豐譛牙惠菴<EFBFBD>邇ー螳樣蜃コ邇ー霑<EFBFBD>シ悟唆蟾イ扈丞ー<EFBFBD><EFBFBD>邉溽ウ慕噪逕滓エサ謾ケ蜿倥€€€€窶ヲ窶ヲ縲€€逵句ョ悟ス墓眺蜷趣シ御ス<EFBFBD>謇灘シ€<EFBFBD>エエ蜷ァ<EFBFBD>檎恚蛻ー莠<EFBFBD><EFBFBD>謔臥噪鬘カ遒嶺ココ蝨ィ逕ィ陦ィ諠<EFBFBD>桁蠑墓オ<EFBFBD>シ梧怏荳肴<EFBFBD>逵溽嶌逧<EFBFBD>キッ莠コ蝨ィ鬪るュ蝨郁エオ迚ゥ縲ゅ€€€<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ぅ莠幄セア鬪ょ<EFBFBD><EFBFBD><EFBFBD>慍蝨ィ荳矩擇RP<EFBFBD>悟屓螟埼<EFBFBD>€€€窶懆ソ呎弍謌醍飴<EFBFBD>ス蜿ッ辷ア蜻€<EFBFBD>ケ逧<EFBFBD>錐蟄玲弍莉€荵茨シ溪€<EFBFBD>
<EFBFBD><EFBFBD>鬣ソ莠<EFBFBD>シ悟ケ譛我ク€蝮鈴シ縲ょ<EFBFBD>蜴サ荵ー荳€蝮怜柱菴<EFBFBD>€襍キ蜷<EFBFBD>シ瑚ソ呎弍雍晄級<EFBFBD>帛柱菴<EFBFBD>€莠コ荳€蜊雁帥荳ェ蜊企<EFBFBD>瑚ソ呎弍迴井ケ撰シ帛<EFBFBD>驛ィ扈吩ス<EFBFBD>荳崎<EFBFBD>蠕嶺ス<EFBFBD>謖ィ鬣ソ<EFBFBD>蜷主相隸我ス<EFBFBD>閾ェ蟾ア蜷<EFBFBD>ソ<EFBFBD><EFBFBD>シ瑚ソ呎弍蝌臥<EFBFBD>帶滑鬣シ蛛キ蛛キ謇疲脂<EFBFBD>瑚キ滉ス<EFBFBD>€蝮鈴ソ<EFBFBD>瑚ソ呎弍荵<EFBFBD><EFBFBD>帶滑鬣シ阯剰オキ譚諠ウ扈吩ス<EFBFBD>€荳ェ諠雁万<EFBFBD>御ス<EFBFBD>弍謗丞<EFBFBD>譌カ蜿醍鴫遒取<EFBFBD><EFBFBD>ク堺コ<EFBFBD><EFBFBD>シ御コ取弍蛹冶コォ蟆丞働蛹<EFBFBD><EFBFBD>瑚ソ呎弍謌醍噪體ク蟶劒譎壹€€<EFBFBD>
<EFBFBD>窶應ス<EFBFBD>蟇ケ蝌臥蟆丞ァ千噪辷ア譛牙<EFBFBD>€€ァ郤ヲ300蜈銀€€<EFBFBD>300蜈具シ滉ス<EFBFBD>譏ッ諠ウ隸エ莠コ邀サ逧<EFBFBD>ソ<EFBFBD>э螟ァ郤ヲ譏ッ300蜈句雛<EFBFBD>€€應ク搾シ碁シ<EFBFBD><EFBFBD><EFBFBD>ケウ蝮<EFBFBD>ス馴螟ァ郤ヲ譏ッ300蜈具シ悟屏豁謌第弍蜈ィ霄ォ蠢<EFBFBD>慍辷ア逹€蝌臥蟆丞ァ舌€€拏扈吝ソ<EFBFBD>ソゾ[扈吝ソ<EFBFBD>ソゾ窶<EFBFBD>
<EFBFBD>霄ォ菴馴<EFBFBD>ッ丈ク€荳ェ蜴溷ュ宣<EFBFBD>閾ェ荳€鬚礼<EFBFBD>轤ク莠<EFBFBD>噪諱呈弌<EFBFBD>御ス<EFBFBD>蟾ヲ謇狗噪蜴溷ュ蝉ク主承謇狗噪蜴溷ュ蝉ケ溯ョク譚閾ェ荳榊酔逧<EFBFBD>譏溘€りソ吝ョ槫惠譏ッ謌第園遏驕鍋噪迚ゥ逅<EFBFBD>ュヲ荳ュ譛€蟇瑚ッ玲э逧<EFBFBD>ク懆ソ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>€<EFBFBD><EFBFBD>譏ッ譏溷ー<EFBFBD>......霑吝<EFBFBD>荳ュ扈丞紙莠<EFBFBD>壼ー托シ梧リ髯ゥ縲キァ蜷茨シ御ク牙鴻荳也阜逧<EFBFBD>髞吶€<EFBFBD><EFBFBD><EFBFBD>梧燕閭ス隶ゥ謌台サャ驕<EFBFBD>スシ豁縲よ<EFBFBD>莉ャ驛ス譏ッ譏溷ー伜賦縲ゆス<EFBFBD><EFBFBD><EFBFBD>霑呎<EFBFBD>キ逧<EFBFBD>ココ<EFBFBD>梧弍譏溷ー倬<EFBFBD>碁サッ豺<EFBFBD>蜈臥噪驍遘阪€ょ叉菴ソ譏ッ譏滂シ御ケ溷コ碑ッ譏ッ譛€荳埼略莠ョ逧<EFBFBD>ぅ荳€鬚励€€辟カ<EFBFBD>御ス<EFBFBD>荳堺ク€譬キ縲ゆス<EFBFBD>譏ッ螟ゥ荳顔噪譏溯セー<EFBFBD>碁略閠€閠悟コ逶ョ縲ょ叉菴ソ螳<EFBFBD>ョ咎<EFBFBD>梧怏逹€荳崎ョ蜈カ謨ー逧<EFBFBD>€き逶ョ逧<EFBFBD>€遲画弌<EFBFBD>御ケ溯ソ應ク榊ヲゆス<EFBFBD><EFBFBD><EFBFBD>霎峨€りスサ螢ー蜩シ蜚ア<EFBFBD>御シ玲弌謨帑コ<EFBFBD><EFBFBD>闃剃クコ菴<EFBFBD><EFBFBD>成縲ょ働襍キ鮠サ蟄撰シ悟m譎夂噪髴樔ケ溷屏菴<EFBFBD>鮟ッ辟カ縲りキウ荳€謾ッ闊橸シ御シシ譛亥<EFBFBD>蝗樊雷莠守ゥコ荳ュ縲りッエ襍キ諠<EFBFBD>ッ晢シ檎匳譌カ蟆城岑逍冗柾縲オク豸ヲ蠢<EFBFBD>ェ昴€ゆス<EFBFBD>譏ッ荳<EFBFBD>鴻遶隸晞<EFBFBD>ォ螳域侃逧<EFBFBD>ウ荳サ隗偵€<EFBFBD>蝟懈ャ<EFBFBD><EFBFBD>悟ワ蝟懈ャ螟ゥ荳顔噪譏溯セー驍譬キ蝟懈ャ<EFBFBD>縲や€<EFBFBD>
<EFBFBD>蝌臥蝗樊擂莠<EFBFBD>シ悟惠譫晄ア溽噪螟ァ譯縲ょケ蝗樊擂逧<EFBFBD>ぅ螟ゥ譏ッ蜈ュ譛茨シ悟ゥ荳雁唆鬟倡捩髮ェ縲よ怏莠コ蜻願ッ画<EFBFBD><EFBFBD>ケ蜿ッ閭ス譛芽ソ俶悴莠<EFBFBD>唆逧<EFBFBD>ソ<EFBFBD><EFBFBD>謌匁弍莉€荵域€ィ豌斐€<EFBFBD>驕難シ<EFBFBD> 蜿ッ閭ス謌大荳榊芦縲らャャ荳€芦螂ケ<EFBFBD>梧弍蝨ィ譫晄ア溘€ケ蟶ヲ逹€逕懃莫逧<EFBFBD>ャ醍恚逹€謌托シ檎恚逹€謌第怏莠帛書諤オ縲よ怏驍荵井ク€迸ャ謌台シシ荵守恚蛻ー莠<EFBFBD>亠蜈峨€<EFBFBD>諷御ケア逧<EFBFBD>ァサ蠑€<EFBFBD>コソ<EFBFBD>ケ蠕<EFBFBD>峩譛晄<EFBFBD>襍ー譚<EFBFBD>悟セョ蠕ョ蠑ッ逹€閻ー<EFBFBD>碁擇蟶ヲ謌剰剞逧<EFBFBD>悍逹€謌代€ゆケ<EFBFBD><EFBFBD>ク区ーエ驕鍋噪閠<EFBFBD><EFBFBD><EFBFBD>檎ャャ荳€逵玖ァ<EFBFBD><EFBFBD>梧弍逹ク榊シ€逵シ逧<EFBFBD>€<EFBFBD> 謌第<EFBFBD>荵ア逧<EFBFBD>Φ襍カ邏ァ騾<EFBFBD>オー縲や€懷ー剰€<EFBFBD><EFBFBD><EFBFBD>御ス<EFBFBD>螂ス蜻€縲や€晞ぅ譏ッ螂ケ蟇ケ謌題ッエ逧<EFBFBD>ャャ荳€隸昴€<EFBFBD>扈吝ソ<EFBFBD>ソゾ[扈吝ソ<EFBFBD>ソゾ[扈吝ソ<EFBFBD>ソゾ窶<EFBFBD>
蜷ャ莠<EFBFBD>ス螟夐<EFBFBD>檎悄逧<EFBFBD>セ磯怫謦シ<EFBFBD>御ス懆€<EFBFBD>ア槫ョ樊弍逕ィ蠢<EFBFBD><EFBFBD>シ御サ雁ゥ蟆ア荳榊書逞<EFBFBD><EFBFBD>シ檎ャャ荳€蜀咎柄隸<EFBFBD>シ梧紛轤ケ隸サ蜷取縲ら峩謦ュ驥鯉シ娯€懆レ髱<EFBFBD>€譌ゥ蟾イ髮ェ蛛懃噪遯玲ゑシ御ス<EFBFBD>隸エ逹€譛ェ譖セ蛻ー霎セ逧<EFBFBD>アア鬘カ窶晢シ碁ぅ譏ッ荳惹ス<EFBFBD>螟ア荵倶コ閾ら噪闊槫床譴ヲ 縲や€<EFBFBD><EFBFBD>捩隨ャ荳我ココ遘ー逧<EFBFBD>螳夲シ檎畑鬟手スサ莠第キ<EFBFBD>€コヲ謗ゥ鬣ー驍谿オ扈丞紙窶晢シ梧<EFBFBD>蟾イ扈剰ョー荳崎オキ螂ケ逧<EFBFBD>ァ灘錐<EFBFBD>悟宵隶ー蠕苓オキ闊樒ソゥ鄙ゥ逧<EFBFBD>セァ蠖ア窶晢シ瑚ソ<EFBFBD>悉驍荳ェ貊閻皮Ο諠<EFBFBD>シ悟惠闊槫床荳頑硯豢呈ア玲ーエ逧<EFBFBD><EFBFBD>蟾イ扈乗キ蜃コ隶ー蠢<EFBFBD>シ悟宵萓晉ィ€逡吩ク区崟扈冗ソゥ鄙ゥ襍キ闊樒噪霄ォ蠖ア縲ょ多荳肴弍諤サ譛牙ゥ驕馴<EFBFBD><EFBFBD>噪豕ィ螳夲シ碁ぅ荵亥<EFBFBD>蟷ウ縲ょ床荳句香蟷エ闍ヲ扈<EFBFBD>シ悟宵荳コ蜿ー荳願€€逵シ逧<EFBFBD>€蛻ケ<EFBFBD>悟庄蠖楢<EFBFBD><EFBFBD>э螟匁擂陲ュ<EFBFBD>ヲ蜊エ遒惹コ<EFBFBD>€りココ蝨ィ逞<EFBFBD>コ贋ク奇シ碁埓驕捺ヲ諠ウ蟆ア隕惠豁扈育サ謎コ<EFBFBD><EFBFBD>溯ソ吩ケ溽ス<EFBFBD>御ケ溽ス縲るぅ荳ェ譖セ扈冗噪菴<EFBFBD><EFBFBD>御ケ溽サ丞紙霑<EFBFBD>焚荳ェ譏遘具シ檎サ丞紙豎玲ーエ荳取ャ荵撰シ御ス<EFBFBD>ケ蜊エ襍ー霑<EFBFBD><EFBFBD>ヲらコ讌シ譴ヲ逧<EFBFBD>ご諠<EFBFBD>シ御サ守屁譫€譌カ荳<EFBFBD>ョカ轣ッ轣ォ襍ー蛻ー驕<EFBFBD>遨コ髣ィ逧<EFBFBD><EFBFBD>黄蜃矩峺縲よ慮蜈画噛蟷ウ莠<EFBFBD>崟扈冗噪莨<EFBFBD>悟ソ<EFBFBD>クュ逧<EFBFBD>冠闥ゆケ溷ヲよイ咏浹陲ォ豬ソ<EFBFBD>噪蜈蛾亢諷蜀イ蛻キ豸域淵<EFBFBD>ウ蟄ゥ蜿磯譁ー諡セ襍キ莠<EFBFBD>髄蠕€闊槫床逧<EFBFBD>ヲ諠ウ縲らサ井コ趣シ悟ケ蝨ィasoul謇セ蛻ー莠<EFBFBD>眠逧<EFBFBD><EFBFBD>蜿ー<EFBFBD>蛻ー莠<EFBFBD>髪謖ケ逧<EFBFBD>€荳ェ鬲ゆサャ縲や€<EFBFBD>蜿ォ雍晄級窶晄ュ蛻サ<EFBFBD>御ス<EFBFBD>蜷大<EFBFBD>荳也阜螳<EFBFBD><EFBFBD><EFBFBD>逕滂シエ晄栫譏滉サャ騾剰ソ<EFBFBD>ア丞ケ包シ檎恚菴<EFBFBD>蝨ィ髟懷エ蜑榊ヲよュ蠢ォ荵占<EFBFBD><EFBFBD>瑚ソ呵ョゥ謌台ケ滄諡セ譴ヲ諠ウ蜴サ逶エ髱譛ェ遏<EFBFBD>悴譚縲ゆクコ菴<EFBFBD><EFBFBD>撓蠑コ閠悟勘螳ケ<EFBFBD>悟惠逶エ謦ュ髣エ荳コ菴<EFBFBD>謇田all蜻仙槙<EFBFBD>悟ュ怜ュ怜唱蜿驛ス蜿題<EFBFBD>逵溷ソ<EFBFBD>€€<EFBFBD>莉ャ髣ェ辜惠螟懃ゥコ<EFBFBD>梧Φ辣ァ莠ョ菴<EFBFBD>螟懈劒逧<EFBFBD><EFBFBD>梧イ譛井コョ譌カ菴<EFBFBD>蜿ッ蜷大圏譁ケ霓ャ蜉ィ<EFBFBD><EFBFBD>莉ャ蝨ィ螟ゥ遨コ窶晢シ瑚ソス譴ヲ逧<EFBFBD>キッ荳奇シ瑚エ晄栫譏滉サャ髯ェ逹€<EFBFBD><EFBFBD>コォ豈丈ク€蠢ォ荵撰シ悟柱菴<EFBFBD>扈丞紙豈丈ク€荳ェ蝮主攅<EFBFBD>御ス<EFBFBD>譏ッ諢溷芦螟ア譛幢シ碁ぅ蟆ア謚ャ螟エ逵句髄螟ゥ遨コ蜷ァ<EFBFBD><EFBFBD>莉ャ荳€逶エ驛ス蝨ィ縲ょウ蟄ゥ遶吝惠驍荳ェ譴ヲ諠ウ荳ュ蝟<EFBFBD>憶髣ェ莠ョ逧<EFBFBD><EFBFBD>蜿ー荳奇シ悟<EFBFBD>蝗樊悍霑<EFBFBD><EFBFBD>梧慮蜈画オソ<EFBFBD>ョ幄凶豎滓イウ<EFBFBD>ケ菴丞惠豎溷<EFBFBD>€碁ぅ荳ェ霑<EFBFBD>悉逧<EFBFBD>ケ菴丞惠豎溷ーセ<EFBFBD>悟屓蜻ウ逹€<EFBFBD><EFBFBD>檎ォ滓怏莠帶螯る囈荳也噪譛ヲ閭ァ縲ゆス<EFBFBD>€<EFBFBD>ク榊庄隹擾シ梧擂閠<EFBFBD>柑蜿ッ霑ス<EFBFBD><EFBFBD><EFBFBD>謳コ謇区崟扈城ぅ荳ェ貊€譴ヲ諠ウ逧<EFBFBD><EFBFBD>蟾ア<EFBFBD><EFBFBD>蜉帑サ襍エ<EFBFBD>悟悉霑ス蟇サ閾ェ蟾ア逧Бsoul譴ヲ蜷ァ<EFBFBD>瑚エ晄栫譏滉サャ莨壻ク€逶エ髯ェ逹€<EFBFBD>縲や€<EFBFBD>
荳肴耳蝌臥蟆丞ァ仙香蟷エ莠<EFBFBD>€ケ逧<EFBFBD>錐豌泌柱蜃コ蝨コ雍ケ驛ス荳€豸ィ蜀肴カィ<EFBFBD><EFBFBD>蜴溷慍雕乗ュ<EFBFBD><EFBFBD>ケー荳堺ク贋ク楢セ台ケ滓遠荳崎オキ讎懊€らサ井コ主ケエ蜑崎ォ蜈ャ蜿ク螳画賜荳句イ暦シ梧伽蟾菴懈慮謌第燕蝨ィ霍ッ霎ケ蟷ソ蜻雁書邇ー蛻昜サ蜈キ莠コ蟾イ扈丞ス謎ク贋コ<EFBFBD>獅髟ソ縲よ慮髣エ螟ェ荵<EFBFBD>シ御ク€<EFBFBD><EFBFBD>蜿倅コ<EFBFBD>€ょ芦螟<EFBFBD>兜邂€<EFBFBD>噪譌カ蛟呎<EFBFBD>諠ウ襍キ莠<EFBFBD>€蜷堺ココ荳贋ココ逧<EFBFBD><EFBFBD>€<EFBFBD>€懆ソ吩コ帑ココ蜿ェ驟榊惠荳区ーエ驕馴蠎ヲ霑<EFBFBD>嶌蟇ケ豈碑セ<EFBFBD>ア雍<EFBFBD>ココ逕溘€€晏ワ譏ッ荳€霍ウ霑<EFBFBD>セ咎葎逧<EFBFBD>幡魎<EFBFBD>魑櫁ォ鄒ス閠€豁ヲ謇ャ螽慍遶吝惠髣ィ豐ソ荳奇シ悟ッケ蜈カ莉冶ソ伜惠霍ウ逧<EFBFBD>魍シ隸エ<EFBFBD>€應ス<EFBFBD>荳崎鯉シ€<EFBFBD>蠖捺慮蠕域Φ蜿埼ゥウ<EFBFBD>悟庄莉冶ッエ荳ュ莠<EFBFBD>€<EFBFBD>驕捺<EFBFBD>遑ョ螳樔ク崎€<EFBFBD>荵区園莉霍ウ莠<EFBFBD>キウ<EFBFBD>悟宵譏ッ荳コ莠<EFBFBD>恚荳玖<EFBFBD>蟾ア閭ス霍ウ謌蝉サ€荵域<EFBFBD>キ鄂<EFBFBD>€<EFBFBD>螳樊ッ乗擅魎魍シ逧<EFBFBD>セ咎葎驛ス荳肴弍荳€譬キ鬮倡噪縲よ<EFBFBD>ソ<EFBFBD>セ咎葎蝨ィ豌エ荳狗噪魎魍シ縲ら恚襍キ譚譏ッ魍シ<EFBFBD><EFBFBD>螳樒函閠御クコ鮴吶€ゆケ滓怏逧<EFBFBD>函閠御クコ魍シ閧峨€ゆケ溯ァソ<EFBFBD>ス霑千噪魎魍シ<EFBFBD>碁葎陲ォ蜷<EFBFBD>ァ榊ァ謇区早蛻ー豐ウ驥御コ<EFBFBD>€<EFBFBD>荵滓悄蠕<EFBFBD>ソ<EFBFBD>ス霑撰シ悟宵譏ッ豐閠悟キイ縲りッエ襍キ譚霑吝ーア譏ッ莠コ諤ァ蜷ァ縲よ<EFBFBD>荳崎ョィ蜴悟ゥ驕馴<EFBFBD><EFBFBD>御ス<EFBFBD>弍隶ィ蜴悟悪莠コ逧<EFBFBD>ス霑絶€€泌宵譏ッ蝗<EFBFBD>荳コ謌第イ譛牙ス霑千ス<EFBFBD>€<EFBFBD>荵滓怏莠イ莠コ蜥悟ョ<EFBFBD>迚ゥ莨夂函逞<EFBFBD>シ帶<EFBFBD>逵シ逾樔ケ滓玄郤ッ逵溷賦縲りョィ蜴悟<EFBFBD>辟カ蟆丞ァ仙香蟷エ莠<EFBFBD>€りョィ蜴檎噪譖エ譏ッ雜頑擂雜頑キア逧<EFBFBD>裏蜉帶縲りコォ蝨ィ豕貎ュ逧<EFBFBD>ココ譏ッ豐蜉帶ー泌<EFBFBD>髞狗噪蜷ァ縲ゆク画オ噪莠コ逕溷宵莨夊ョゥ荳顔ュ我ココ荳榊ア台ク€鬘セ蜷ァ縲よ<EFBFBD>蝮蝉コ戊ァょ<EFBFBD>ゥ遨ケ譏滓オキ萓晉€逵シ縲ょ庄謌醍握荳榊<EFBFBD>莠募コ輔€るぅ謌大ーア荳榊<EFBFBD>逵区弌譏滉コ<EFBFBD>€ゆク也阜驍荵亥<EFBFBD>御ス<EFBFBD>謌醍噪莉ス縲ょソ倩ョー蝌臥蟆丞ァ仙香蟷エ莠<EFBFBD>€ょ庄霍ッ荳顔恚隗苓セケ逧<EFBFBD>ァ闕ァ蟷募惠謾セA-soul逧<EFBFBD>眠蟷エ闃ら岼<EFBFBD><EFBFBD>霑俶弍讌槫惠驍驥御コ<EFBFBD>€<EFBFBD>譛芽ソ題ァ<EFBFBD>シ御ス<EFBFBD>€サ隗牙セ礼愍逹帛スア蠖ア扈ー扈ー<EFBFBD>碁崟豌疲擂閾ェ螟壼ケエ莉蜑阪€りソ吩クェ蟷ソ蜻贋ス埼撼蟶ク雍オ縲ら悄逧<EFBFBD><EFBFBD>荵滉ク肴弍蟆竣莠<EFBFBD>賦縲よ竃蜿玖ソ伜惠諠ヲ隶ー莉紋サャ逧<EFBFBD>クュ蟄舌€よ劒譎壻サ咲蜿ェ譛芽闘闢ャ陬呻シ<EFBFBD>100鬥匁ュ檎ォ溽霑俶ャ<EFBFBD>€<EFBFBD>ォ邊牙エ蟆丞屬菴謎サ4%蟷エ蛹門榊茜隶蝨ィ蟆乗悽蟄蝉コ<EFBFBD>€よΦ襍キ螂ケ鬥匁眺譌カ邇ゥ2077荳矩ュ荳句セ苓スー霓ー辜育ヨ<EFBFBD><EFBFBD>€霎ケ蜿鯛€懃イ我ク晉煙謾ケ謌先劒鬣ュ莠コ蜷ァ窶昶€懷柱蝌臥迴井ケ仙<EFBFBD>遒鈴ュ窶昶€懷柱荵<EFBFBD>正蜃第擂遒鈴ュ窶昜ク€霎ケ蠢堺ス丞姐窶懷柱雍晄級扈<EFBFBD>級遒鈴ュ窶晉噪蜀イ蜉ィ縲olo萓晉諡芽キィ<EFBFBD>悟盾蝗辣ァ譌ァ逾曚縲りエ晄級諤サ譏ッ蜈ュ霎ケ蠖謌伜<EFBFBD>御ケ<EFBFBD>正蜈サ莠<EFBFBD><EFBFBD>蜷ィ逧<EFBFBD>achi<EFBFBD>檎処荵占ソ俶弍驍荳ェ遑ャ螢ウ霓ッ螯ケ縲ょ<EFBFBD>辟カ蟆丞ァ蝉セ晉蜊冶酔鞫キキ縲ゆサ€荵磯<EFBFBD>蜿假シ梧弍謌第イ霍滉ク雁ケ莉ャ縲ょ沁驥檎Α轣ォ蟷<EFBFBD><EFBFBD>蜈我ク狗噪莠コ辜ュ諠<EFBFBD>嶌諡<EFBFBD>碁亢蠖ア驥檎噪莠コ蜴倶ク区ず蜉ィ縲よ怙莠ョ逧<EFBFBD>慍譁ケ蝌臥蟆丞ァ先オ<EFBFBD>ャ題オキ闊橸シ悟<EFBFBD>蠖ア莉主ケ陲夜龍謨關ス<EFBFBD>悟ワ譏ッ髮ィ螟ゥ闃ア莨櫁スサ譌具シ梧燥譖ウ髣エ豢剃ク区ウェ濶イ逧<EFBFBD>匠縲ょソス辟カ逵シ逹帶怏轤ケ讓邉翫€<EFBFBD>蟆丞ー隸エ<EFBFBD>€懈眠蟷エ螂ス蝠奇シ悟<EFBFBD>辟カ蟆丞ァ舌€€昜ク咲鯵蝌臥蟆丞ァ仙香蟷エ莠<EFBFBD>€ょ香蟷エ驥鯉シ檎鯵霑<EFBFBD>噪豈丈クェ莠コ驛ス蜒丞ケ縲<EFBFBD>
蝟懈ャ辟カ辟カ<EFBFBD>御ク榊刈謗ゥ鬣ー諤サ譏ッ蠕ョ隨醍噪辟カ辟カ<EFBFBD>御ク肴弍螯匁イサ螯ゥ蟐夂噪蜊惹クス闊槫ァャ<EFBFBD>御ク肴弍谿句ソ肴裏諠<EFBFBD>噪蜀キ驟キ蜈ャ荳サ<EFBFBD>悟宵譛臥捩蜊慕コッ辜よシォ逧<EFBFBD>干譬キ隨大ョケ<EFBFBD>御ク榊クヲ蠢ァ莨<EFBFBD>悟唆螯ょ酔騾晞峺閠梧擂逧<EFBFBD>ゥ髯<EFBFBD>ケ矩趣シ碁伜差莠<EFBFBD><EFBFBD><EFBFBD>ク顔噪蠢ァ驛€戊牡逧<EFBFBD>柄蜿題<EFBFBD>ー逹€鄒惹クス逧<EFBFBD>擽陜カ扈難シ悟ョ晉浹闊ャ逧<EFBFBD>曙逵ク荳ュ髫宣嚼豬<EFBFBD>愆荳榊ュ伜惠逧<EFBFBD>樔シ<EFBFBD>悟ーア譏ッ霑呎<EFBFBD>キ蟄千噪辟カ辟カ<EFBFBD>御ク榊刈謗ゥ鬣ー諤サ譏ッ蠕ョ隨醍噪辟カ辟カ<EFBFBD>梧凶譛臥モ貍ォ隨大ョケ逧<EFBFBD>辟カ<EFBFBD>梧凶譛我コ伜商荳榊序逧<EFBFBD>セ惹クス縲りッエ荳榊<EFBFBD><EFBFBD>隗会シ悟唆遏驕灘屏荳コ辟カ辟カ逧<EFBFBD>ャ大ョケ<EFBFBD>悟喧蠑€<EFBFBD><EFBFBD>蜀ー髮ェ逧<EFBFBD>藍霑ケ縲よΦ隕シク蜃コ謇区噛鞫ク辟カ辟カ逧<EFBFBD>書荳晢シ悟庄譏ッ蜊エ蜿ェ閭ス隗ヲ蛻ー蜀ー蜀キ逧<EFBFBD>ャ螻擾シ悟宵譛臥辟カ貂<EFBFBD>セ育噪逵シ逾橸シ御セ晄立譏ッ謌第園辭滓i縲ら辟カ豌ク霑懈ク<EFBFBD>セ育噪迸ウ莉辟カ辜よシォ蜊慕コッ逧<EFBFBD>ャ大ョケ辟カ辟カ莠伜商荳榊序逧<EFBFBD>セ惹クス辟カ辟カ譏ッ謌大髪荳€<EFBFBD>怙辷ア<EFBFBD>辟カ譏ッ謌第怙辷ア逧<EFBFBD>髪荳€縲ら辟カ逧<EFBFBD>万螂ス縲ソォ荵舌€<EFBFBD>埓霑<EFBFBD>€<EFBFBD>柱譌<EFBFBD>蜉ゥ<EFBFBD><EFBFBD>驛ス莠<EFBFBD>ヲよ欠謗鯉シ悟万谺闕芽雌陋狗ウ募柱鮟<EFBFBD><EFBFBD>御クェ諤ァ貂ゥ譟泌処蝟<EFBFBD><EFBFBD>悟庄辷ア菴楢エエ逧<EFBFBD>ウ蟄ゥ蟄撰シ梧怏逹€隸エ荳榊<EFBFBD><EFBFBD>シ倡せ<EFBFBD><EFBFBD>諠ウ辟カ辟カ荳€螳壽弍荳雁ゥ襍蝉コ域<EFBFBD>€螂ス逧<EFBFBD>シ迚ゥ縲<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>恚蜿区怏蠕亥夲シ御ス丞惠荳懆セケ逧<EFBFBD>ー城アシ<EFBFBD>御ス丞惠蜊苓セケ逧<EFBFBD>ー城ケソ<EFBFBD>御ス丞惠隘ソ霎ケ逧<EFBFBD>擽陜カ<EFBFBD>御ス丞惠蛹苓セケ逧<EFBFBD>ー城ク溘€ゆサ紋サャ蟶ヲ鮠<EFBFBD><EFBFBD>蝨ィ阡夊統濶イ逧<EFBFBD>キア豬キ驥御ク取ーエ豈榊<EFBFBD>貂ク<EFBFBD>悟惠遒ァ扈ソ逧<EFBFBD>コ矩ケソ譽ョ譫鈴蝟晄ク<EFBFBD>勣逧<EFBFBD>愆豌エ<EFBFBD>悟惠辜ュ髣ケ逧<EFBFBD>岑譫鈴遨ソ譴ュ邇ゥ閠搾シ悟惠蟷ソ陲<EFBFBD>ゥ遨コ荳ュ閧<EFBFBD>э鬟樒ソ斐€るシ<EFBFBD><EFBFBD>菴丞惠轣ッ轣ォ髦醍所逧<EFBFBD>沁蟶ゑシ悟庄鮠<EFBFBD><EFBFBD>驕楢ソ咎譛我ク€<EFBFBD>ア樔コ朱シ<EFBFBD><EFBFBD><EFBFBD>碁シ<EFBFBD><EFBFBD>遨ソ霑<EFBFBD>キ晄オク肴<EFBFBD><EFBFBD><EFBFBD>檎汲螂皮捩蝗槫芦閾ェ蟾ア髦エ貉ソ鮟第囓逧<EFBFBD>ク区ーエ驕難シ悟シコ辜育噪閾ェ蜊台ケ区ュ隶ゥ鮠<EFBFBD><EFBFBD><EFBFBD>豕募他蜷ク<EFBFBD>碁シ<EFBFBD><EFBFBD>萓晞擒蝨ィ荳区ーエ驕鍋シ晞囮霎ケ<EFBFBD>悟屏荳コ蝌臥蟆丞ァ先€サ莨夊キッ霑<EFBFBD>ソ咎縲り拷闔灘刈螂カ豐ケ蜉<EFBFBD>闃ア鬥呻シ梧弍蝌臥蟆丞ァ千噪蜻ウ驕薙€朱塔蜉<EFBFBD>逅エ蜉<EFBFBD>螂カ邉厄シ梧弍蝌臥蟆丞ァ千噪螢ー髻ウ縲り鰍螂丞刈髻ウ荵仙刈蠢ォ荵撰シ梧弍蝌臥蟆丞ァ千噪閼壽ュ縲や€ケ譚<EFBFBD>€晢シ碁シ<EFBFBD><EFBFBD><EFBFBD>エ蟆丞ソ<EFBFBD>慍謗蜃コ郛晞囮<EFBFBD><EFBFBD>辟カ蟆丞ァ仙セ<EFBFBD>峩襍ー霑<EFBFBD>牲髣ケ逧<EFBFBD>ココ鄒<EFBFBD>梧擂蛻ー荳区ーエ驕鍋シ晞囮霎ケ<EFBFBD>檎ォッ逹€闕芽雌陋狗ウ包シ檎シ鍋シ捺叛蝨ィ豢槫哨<EFBFBD>御ク€髦オ鬟朱塔莨シ逧<EFBFBD>ー髻ウ蜩崎オキ窶懷<EFBFBD><EFBFBD>ウ厄シ梧擂蜷<EFBFBD>辟カ逧<EFBFBD>拷闔楢寞邉募制縲や€<EFBFBD>辟カ蟆丞ァ先クゥ譟皮噪逵狗捩螳<EFBFBD>シ碁シ<EFBFBD><EFBFBD>荳咲衍荳コ菴慕ェク倶コ<EFBFBD>愍豕ェ<EFBFBD>梧裏豕墓謙蜉ィ閼壽ュ縲ょ<EFBFBD>辟カ蟆丞ァ仙ス蜒丞セ亥ア關ス<EFBFBD>檎怏螟エ霓サ霓サ逧ア襍キ<EFBFBD>€應ス<EFBFBD>荳榊万谺辟カ辟カ蜷冷€ヲ窶ヲ窶晢シ碁シ<EFBFBD><EFBFBD>蠢呵セゥ隗<EFBFBD>悟庄諞狗コ<EFBFBD>€隸昜ケ溯ッエ荳榊<EFBFBD><EFBFBD>€懃賢蜥ェ蟾イ扈剰ォ辟カ辟カ蜈ウ蝨ィ隨シ蟄宣<EFBFBD>シ悟<EFBFBD><EFBFBD>ウ紋ク咲畑螳ウ諤包シ€<EFBFBD>辟カ蟆丞ァ仙<EFBFBD><EFBFBD>噪逵狗捩鮠<EFBFBD><EFBFBD><EFBFBD>碁シ<EFBFBD><EFBFBD>莨シ荵手ヲココ莠蝨ィ螂ケ阡夊統濶イ逧<EFBFBD>曙逵ク驥鯉シ梧<EFBFBD>襍ー蜷鷹ぅ蝮苓拷闔楢寞邉包シ悟ー丞哨蜩ー晉捩縲ょ<EFBFBD>辟カ蟆丞ァ蝉シク蜃コ蟆丞ー冗噪謇具シ御シシ荵取Φ謐ァ襍キ鮠<EFBFBD><EFBFBD>縲るシ<EFBFBD><EFBFBD>螂ス蜒剰ォ髮キ蜃サ荳ュ荳€闊ャ<EFBFBD>檎憲辟カ霍ウ襍キ<EFBFBD>泌屓荳区ーエ驕難シ悟ョ<EFBFBD>蕎蜻ス蝟顔捩<EFBFBD>€<EFBFBD>蜿郁э蜿郁<EFBFBD>霑伜セ井ク鷹刹<EFBFBD><EFBFBD>辟カ蟆丞ァ蝉ク堺シ壼万谺謌醍噪<EFBFBD><EFBFBD>辟カ蟆丞ァ蝉ク堺シ壼万谺謌醍噪<EFBFBD>€<EFBFBD>辟カ蟆丞ァ占ィ諠<EFBFBD>ォ句綾霓ャ荳コ荳<EFBFBD>シ瑚ョ逵溽噪逵狗捩鮠<EFBFBD><EFBFBD>驕凪€<EFBFBD>荳崎ョク菴<EFBFBD>霑吩ケ郁ッエ閾ェ蟾ア<EFBFBD>€ケ逧<EFBFBD>愍荳ュ螂ス蜒丈ケ溽寤貊<EFBFBD>ウェ豌エ窶懈<EFBFBD>莉ャ蝌牙ソ<EFBFBD>ウ問€ヲ驛ス譏ッ蠕亥脂螳ウ逧<EFBFBD>ココ<EFBFBD><EFBFBD>
<EFBFBD>"<EFBFBD>正蟾イ扈丞惠蜥檎塙蜿倶コ€<EFBFBD>€るぅ譏ッ蜈ュ譛井ク区流逧<EFBFBD>€螟ゥ<EFBFBD>御ケ<EFBFBD>正蛻壼<EFBFBD>扈捺據驍螟ゥ逧<EFBFBD>黒莠コ逶エ謦ュ蝗槫芦螳カ<EFBFBD>梧ュ蝮仙惠螳<EFBFBD>噪豐吝書荳奇シ悟<EFBFBD>辟カ蟆ア謚贋ク€荳ェ蟷ウ譚ソ謗ィ蛻ー螂ケ閼ク荳翫€€應ケ<EFBFBD>正荵<EFBFBD><EFBFBD>御ス<EFBFBD>逵玖ソ吩クェ邊我ク晢シ御サ門ス蝪槫<EFBFBD>隘ソ蜩ヲ<EFBFBD>€晁ァ<EFBFBD>譏ッ荳€荳ェ螂ケ逧<EFBFBD>塙邊会シ御ソ顔ァ€<EFBFBD>蠎槫柱蛛遑慕噪霄ォ菴謎ク願ソ俶撃逹€蛻壼<EFBFBD>莉取ウウ豎<EFBFBD>蟶ヲ蜃コ譚<EFBFBD>ア玲カイ荳取ーエ迴<EFBFBD><EFBFBD>悟亢驥悟唆隸エ逹€莠帛<EFBFBD><EFBFBD>€ェ諤ェ逧<EFBFBD>侠隸昴€ゆケ<EFBFBD>正諢溯ァ牙芦閾ェ蟾ア逧<EFBFBD>ソ<EFBFBD>シヲ陲ォ諡ィ蜉ィ莠<EFBFBD>€荳具シ檎尠蝨ィ豈帶ッッ荳倶ク咲捩蜃臥噪螟ァ閻ソ<EFBFBD><EFBFBD>諢溯ァ牙芦莠<EFBFBD><EFBFBD><EFBFBD><EFBFBD>辜ュ縲や€懆ョゥ謌台ケ溽恚逵具シ瑚ョゥ謌台ケ溽恚逵銀€€泌島<EFBFBD>悟島<EFBFBD>御サ紋サ紋サ問€ヲ窶ヲ窶晏髄譎壻サ取イ吝書蜷朱擇謚願я陲区爾蜃コ譚<EFBFBD>御ク堺ク€莨壼<EFBFBD>蟆ア隸エ荳榊<EFBFBD>隸昜コ<EFBFBD>€€應ケ<EFBFBD>€ク亥次譚蝟懈ャ霑咏ァ肴ャセ蠑冗噪蝠奇シ瑚ヲク搾シ悟ァ蝉サャ蜆ソ蟶ョ菴<EFBFBD>謇セ謇セ閨皮ウサ譁ケ蠑擾シ溪€晉処荵仙惠荳€<EFBFBD>€苓カ縲や€應ス<EFBFBD>蛻ォ迸手ッエ<EFBFBD>悟屓謌ソ髣エ髯ェ菴<EFBFBD><EFBFBD>エ晄級蜴サ<EFBFBD>€昜ケ<EFBFBD>正荳区э隸<EFBFBD>慍謚頑イ吝書荳顔噪謚ア譫墓鉛蜷醍処荵撰シ悟唆陲ォ螂ケ霓サ蟾ァ蝨ー霄イ蠑€<EFBFBD>€りソ<EFBFBD><EFBFBD><EFBFBD>螟ゥ<EFBFBD>悟ー丈ク€逾樒樒ァ倡ァ伜慍謚贋ケ<EFBFBD>正蜿ォ蛻ー莠<EFBFBD><EFBFBD>蜿ク闌カ豌エ髣エ<EFBFBD>梧滑謇区惻螻丞ケ穂ク顔噪荳€荳ェ莠檎サエ遐コョ扈吩ケ<EFBFBD>正逵九€€懷葎<EFBFBD>悟悪諡<EFBFBD>ソ<EFBFBD>悪諡<EFBFBD>ソ<EFBFBD>シ瑚ソ吩ココ謌台サャ隹<EFBFBD>衍霑<EFBFBD>シ御サ紋ク肴弍荳ェ莨夊ッエ貍丞亢逧<EFBFBD>ココ縲ょ万谺<EFBFBD>ッ晏悉蜥御サ冶ァ€蜻励€€晉ャャ莠悟<EFBFBD>御ケ<EFBFBD>正蜥碁ぅ菴咲塙邊芽ァ<EFBFBD>擇莠<EFBFBD>€ゆサ匁悽莠コ豈碑ァ<EFBFBD>譖エ蜉<EFBFBD><EFBFBD>ー費シ碁ォ伜ァ逧<EFBFBD>コォ霄ッ諤サ譏ッ閭ス扈吩ケ<EFBFBD>正蟶ヲ譚闔ォ螟ァ逧<EFBFBD>ョ牙<EFBFBD>諢溘€€應ス<EFBFBD>螂ス<EFBFBD>檎視濶セ逅ウ蟆丞ァ舌€€昜サ也噪蠕ョ隨題ョゥ荵<EFBFBD>正隗牙セ怜捉蝗エ逧<EFBFBD>取勹蜈ィ驛ス隍ェ濶イ莠<EFBFBD>€ゆケ<EFBFBD>正莉取擂豐譛画署襍キ霑<EFBFBD><EFBFBD>蟾ア菴應クコasoul謌仙遭逧<EFBFBD>コ区ュ<EFBFBD>御サ紋ケ滉サ取擂豐譛蛾琉襍キ霑<EFBFBD>ササ菴病soul逧<EFBFBD>コ区ュ窶披€€懃視濶セ逅ウ窶晄弍蟆丈ク€荳コ螂ケ蜃<EFBFBD><EFBFBD>噪蛹門錐縲ゆコ句ョ樔ク奇シ悟ケ荳肴ク<EFBFBD>壼ッケ譁ケ譏ッ蜷ヲ遏驕難シ瑚<EFBFBD>蟾ア蟆ア譏ッ莉紋ク€逶エ蝟懈ャ<EFBFBD>ぅ荳ェ蛛カ蜒上€ゆコ€譌カ髣エ雜贋ケ<EFBFBD>シ御ケ<EFBFBD>正蜿醍鴫莉冶コォ荳顔噪莨倡せ雜雁€ゆサ匁弍阯豈穂ク夂噪豬キ蠖帝ォ俶攝逕溘€ゆサ匁ュ蝨ィ閾ェ蟾ア蛻帑ク夲シ瑚€御ク疲噺闔キ鬚<EFBFBD>クー縲ゆサ也噪荳セ謇区兜雜ウ荵矩龍蜈<EFBFBD><EFBFBD><EFBFBD>ォ鬟主コヲ縲ゆサ門香蛻<EFBFBD>ク捺ュ<EFBFBD>€サ譏ッ蜥悟捉蝗エ逧<EFBFBD>ウ諤ァ菫晄戟莠<EFBFBD>キ晉ヲサ縲ゆサ匁クゥ譟比ス楢エエ<EFBFBD>悟クク蟶ク蝨ィ逕滓エサ荳ュ蛻幃€<EFBFBD>諢乗Φ荳榊芦逧<EFBFBD>ー乗リ蝟懌€ヲ窶ヲ逕夊<EFBFBD>譏ッ蝨ィ蠎顔ャォ荵矩龍<EFBFBD>御サ紋ケ滓€サ譏ッ閭ス隶ゥ荵<EFBFBD>正谺イ莉呎ャイ豁サ縲ら閠鯉シ御ケ滓ュ<EFBFBD>荳コ霑呎<EFBFBD><EFBFBD>御ケ<EFBFBD>正譌カ蟶ク髯キ蜈蛻ー荳€髦オ荳€髦オ蜀<EFBFBD>繭荳ュ縲ょ屏荳コ螂ケ霑俶怏荳€荳ェ隹ケ滉ク咲衍驕鍋噪蟆冗ァ伜ッ<EFBFBD>€ゆケ<EFBFBD>正荳榊ワ雍晄級蜥檎処荵蝉ク€譬キ<EFBFBD>梧弍荳謎ク夂噪扈<EFBFBD><EFBFBD>逕滂シ御ケ滉ク榊ワ蝌臥譬キ譏ッ螟ゥ逕溽噪陌壽供蛛カ蜒擾シ梧峩豐譛牙髄譎夐ぅ遘榊<EFBFBD>菴懃噪謇榊克縲ょス灘<EFBFBD>蜿ェ譏ッ謇倅コ<EFBFBD>ョカ驥檎噪蜈ウ邉サ<EFBFBD>梧擂蜈ャ蜿ク驥檎噪貂<EFBFBD>ーエ驛ィ髣ィ謇セ莉ス蟾菴懆€悟キイ縲ゆス<EFBFBD>ケ滉ク咲衍驕捺弍荳ュ莠<EFBFBD>€荵磯が<EFBFBD>ケ蛛キ蛛キ謚蜷榊盾蜉<EFBFBD><EFBFBD>roject V逧<EFBFBD>€画卿隶蛻抵シ瑚ソ倬亢蟾ョ髦ウ髞吝慍謌蝉クコ莠<EFBFBD><EFBFBD>蜒丞ウ蝗<EFBFBD>€蜻倥€ゆケ<EFBFBD>正證苓<EFBFBD>蜿題ェ難シ梧里辟カ閾ェ蟾ア豐譛我サ€荵亥罰霍ウ蠎募ュ撰シ碁ぅ荵郁<EFBFBD>蟆題ヲョゥ窶懈ウ募ュヲ逕溪€晁ソ吩クェ隶セ螳壼序蠕怜ョ櫁<EFBFBD>蜷榊ス抵シ瑚ヲ畑謌千<EFBFBD>諤ァ逧<EFBFBD><EFBFBD>鴨蜴サ蠕恪隗ゆシ励€ょ屏豁<EFBFBD>梧ッ丞芦豐譛芽ョュ扈<EFBFBD>柱逶エ謦ュ譌遞狗噪譌カ蛟呻シ悟ケ諤サ譏ッ莨壼芦蝗セ荵ヲ鬥<EFBFBD>€蝮仙ーア譏ッ蜃<EFBFBD>荳ェ蟆乗慮縲ゆス<EFBFBD>弍蝨ィ譛€霑大<EFBFBD>蜻ィ<EFBFBD>御ケ<EFBFBD>正豈乗ャ蝨ィ髦<EFBFBD>ッサ蛹コ驥梧伽菴榊ュ仙攝荳区慮<EFBFBD>悟ソ<EFBFBD>螟エ諤サ譛我ク€莠帛悪逧<EFBFBD>悄蠕<EFBFBD>€ケ隶ー蠕暦シ悟惠髦<EFBFBD>ッサ蛹コ逧<EFBFBD>€隗抵シ梧€サ閭ス逵句芦荳€荳ェ逖ヲ逖ヲ逧<EFBFBD>€ュヲ逕滓ィ譬キ逧<EFBFBD>ー大ケエ<EFBFBD>御サ紋サ取掠蛻ー譎壼ーア謚雁エ蝓句惠蜷<EFBFBD>ァ肴ウ募ュヲ逅<EFBFBD>ョコ逧<EFBFBD>ケヲ蝣<EFBFBD>縲ゆク€€蟋具シ御ケ<EFBFBD>正蜿ェ譏ッ蟇ケ蜷梧<EFBFBD>キ遐碑ッサ豕募ュヲ譁<EFBFBD>鍵逧<EFBFBD>ココ譛臥ァ堺コイ霑第縲ゆス<EFBFBD>弍逶エ蛻ー譟蝉ク€螟ゥ<EFBFBD>悟ー大ケエ謚雁エ莉惹ケヲ蝣<EFBFBD>謚ャ莠<EFBFBD>オキ譚<EFBFBD>瑚闘荵ア逧<EFBFBD>エ蜿鷹<EFBFBD>菴丈コ<EFBFBD>濠蠑<EFBFBD>逋ス蜃€<EFBFBD>蠎橸シ御ス<EFBFBD>セ晉閭ス逵句芦莉門ッケ逹€逕オ閼大ア丞ケ慕龍逞エ蝨ー隨台コ<EFBFBD>€ゆサ也ャ大セ礼悄蜿ッ辷ア蝠翫€ゆケ<EFBFBD>正謔<EFBFBD>d蝨ー扈募芦莉冶コォ蜷趣シ檎鳩閼大ア丞ケ墓ュ蝨ィ謦ュ謾セ逧<EFBFBD>譏ッ螂ケ辭滓i蝨ー荳崎<EFBFBD>蜀咲<EFBFBD>謔臥噪縲<EFBFBD>蟾ア逧<EFBFBD>懆ー育判髱縲りソ俶怏荳€螟ゥ<EFBFBD>悟ー大ケエ遯荳セ襍キ荳€蜿ェ謇具シ御シク蜃コ菫ョ髟ソ逧<EFBFBD>焔謖<EFBFBD>ッケ逹€逕オ閼大ア丞ケ輔€り區辟カ逵倶ク榊芦螻丞ケ暮<EFBFBD>判髱<EFBFBD>御ス<EFBFBD>弍荵<EFBFBD>正隗牙セ暦シ悟ス捺慮蟆ア豁蝮仙惠髫泌噪閾ェ蟾ア<EFBFBD>御ク€螳壽サ閼ク騾夂コ縲よ囁蛛<EFBFBD>キイ扈丞ソォ霑<EFBFBD>悉莠<EFBFBD>シ御ケ<EFBFBD>正霍大崟荵ヲ鬥<EFBFBD>噪鬚醍紫蜊エ雜頑擂雜企ォ倅コ<EFBFBD>€ケ螳ウ諤募シ€蟄ヲ逧<EFBFBD>律譛溷ーア蜒丞漉逑憺ゥャ霓ヲ逧<EFBFBD>慮髯蝉ク€譬キ<EFBFBD>瑚ョゥ螂ケ蜀堺ケ溯ァク榊芦驍荳ェ逖ヲ逖ヲ逧<EFBFBD>コォ蠖ア縲ょケク螂ス<EFBFBD>瑚ソ吩ク€螟ゥ逧<EFBFBD>ー大ケエ萓晉蝮仙惠髦<EFBFBD>ッサ蛹コ逧<EFBFBD>ァ定誠驥後€ゆケ<EFBFBD>正逕夊<EFBFBD>蠢倩ョー莠<EFBFBD>響譛ャ荵ヲ謖€荳玖<EFBFBD>蟾ア逧<EFBFBD><EFBFBD>コソ窶披€ケ蜥悟ー大ケエ逧<EFBFBD><EFBFBD>コソ莠莨壻コ<EFBFBD>€ケ逧<EFBFBD>ソ<EFBFBD>ス蜒剰ヲキウ蜃コ譚€闊ャ<EFBFBD>ケ諠ウ邇ー蝨ィ蟆ア蜴サ蜻願ッ我サ門<EFBFBD>莠手<EFBFBD>蟾ア逧<EFBFBD>€<EFBFBD>シ悟ケ諠ウ邇ー蝨ィ蟆ア謚雁ー大ケエ謚ア霑幄<EFBFBD>蟾ア逧<EFBFBD>€€驥鯉シ梧クゥ譟泌慍鞫ゥ謖イ莉紋ケア闢ャ闢ャ逧<EFBFBD>書荳昴€€懆伽逅ウ<EFBFBD>御ス<EFBFBD>蝨ィ霑吝<EFBFBD>蝠奇シ御サ雁ゥ荳狗少譌ゥ<EFBFBD><EFBFBD>諠ウ譚<EFBFBD>蝗槫悉縲や€晏ーア蝨ィ霑呎慮<EFBFBD><EFBFBD>謔臥噪螢ー髻ウ貂ゥ譟泌慍諡堺コ<EFBFBD>牛螂ケ逧<EFBFBD>か閹€縲ゆケ<EFBFBD>正蝗櫁ソ<EFBFBD>エ蜴サ<EFBFBD>檎塙蜿狗噪隨大ョケ萓晉閭ス隶ゥ蜻ィ蝗エ逧<EFBFBD>勹濶イ螟ア蜴サ蜈牙スゥ窶披€<EFBFBD>隶ク髯<EFBFBD><EFBFBD>隸サ蛹コ逧<EFBFBD>ぅ荳€隗偵€<EFBFBD>
<EFBFBD>
6<EFBFBD>9螟ゥ逧<EFBFBD>劒荳奇シ御ケ<EFBFBD>正蝗槫芦莠<EFBFBD><EFBFBD>蟾ア謌ソ髣エ驥鯉シ梧遠蠑€<EFBFBD><EFBFBD>謔臥噪蜿ー逅<EFBFBD>ョコ蝮帙€りソ伜<EFBFBD>瑚エヲ蜿キ霑俶イ陲ォ蟆€ょ惠A-SOUL隶ィ隶コ荳捺シ驥御セ晉<EFBFBD>€<EFBFBD>ァ崎セゥ扈擾シ御ケ<EFBFBD>正諢溷芦荳€螟ゥ荳区擂逧<EFBFBD>樒サ冗エァ蠑<EFBFBD>蜥檎夢諠ォ譖エ蜉<EFBFBD>譏取仞莠<EFBFBD>€らコ髟ソ逧<EFBFBD>焔謖<EFBFBD>惠豬キ逶苓飴K95荳贋ク肴妙霍ウ霍<EFBFBD>シ悟屓螟肴<EFBFBD><EFBFBD>ュ怜壼セ怜ス蜒剰ヲシォ蜃コ譚莨シ逧<EFBFBD>€ゆス<EFBFBD><EFBFBD>悟ーア蠖馴シ<EFBFBD><EFBFBD>欠髓郁ソ俶イ譛芽ヲ欠蜷鯛€懷書陦ィ蝗槫€晉噪謖蛾醗譌カ<EFBFBD>ケ蟆ア謖我ス丈コ<EFBFBD>唖髯髞ョ縲ゆケ<EFBFBD>正貂<EFBFBD>壼慍遏驕難シ悟ケ譏ッ蛛カ蜒冗噪荳ュ荵倶ココ<EFBFBD>ケ荳崎<EFBFBD>隸エ霑吩コ幄ッ昴€ゆコ取弍<EFBFBD>檎岼蜈臥サァ扈ュ蝨ィ荳€逋セ螟夐オ逧<EFBFBD><EFBFBD>菴吩ソ諱ッ遘堺ク肴妙霍ウ蜉ィ<EFBFBD>檎サ井コ趣シ碁シ<EFBFBD><EFBFBD>サ夊スョ蝨ィ荳€荳ェ螟エ蜒丞燕蛛應コ<EFBFBD>ク区擂縲るサ第シ<EFBFBD><EFBFBD>噪謌ソ髣エ驥悟宵譛臥鳩閼大ア丞ケ慕噪闕ァ蜈臥<EFBFBD>莠ョ逹€<EFBFBD>正遘€荳ス逧<EFBFBD>擇螳ケ縲ょケ雜エ蝨ィ譯悟ュ蝉ク奇シ梧滑蜊贋クェ閼ク蠎槫沂蝨ィ閾ェ蟾ア逧<EFBFBD>蠑ッ驥鯉シ檎龍逞エ蝨ー譛帷捩驍荳ェ螟エ蜒上€€應ス<EFBFBD>驕灘雛<EFBFBD><EFBFBD>莉雁ゥ逵溽噪雜<EFBFBD>コァ邏ァ蠑<EFBFBD>縲や€€懈眺逧<EFBFBD>慮蛟吩ク€逶エ蝨ィ諠ウ菴<EFBFBD>莨壻ク堺シ壽擂逵区<EFBFBD>縲や€€懈Φ遏驕謎ス<EFBFBD>蝨ィ逵具シ御ケ滓怏轤ケ荳肴Φ隶ゥ菴<EFBFBD>逵銀€ヲ窶ヲ窶晉ェ<EFBFBD>御ケ<EFBFBD>正蝮千峩莠<EFBFBD>コォ蟄撰シ梧滑蜿ウ謇狗噪鬟滓欠莨ク蜷台コ<EFBFBD>ア丞ケ輔€€懈擂<EFBFBD>悟ッケ荳ェ謇区欠<EFBFBD>€昜ス<EFBFBD>弍髱呎€噪螟エ蜒丞崟迚<EFBFBD>譛臥サ吝ケ莉サ菴募屓蠎費シ悟宵譏ッ荳€螯よ里蠕€蝨ー蛛懃蕗蝨ィ螻丞ケ慕噪驍€隗偵€ゆケ<EFBFBD>正閾ェ蝌イ謳ャ蝨ー隨台コ<EFBFBD>シ悟処謚雁エ蝓玖ソ帑コ<EFBFBD>蠑ッ驥後€ら擅諢乗ク先ク占ュ譚<EFBFBD><EFBFBD>荳肴ク<EFBFBD>ソ呎弍螂ケ蜊頑ヲ蜊企<EFBFBD>荵矩龍逧<EFBFBD>蒼隸ュ霑俶弍逵溷<EFBFBD><EFBFBD>悄譛幢シ壺€懷そ逑懶シ梧<EFBFBD>€逶エ蟆ア蝨ィ霑咎蝠奇シ悟ソォ轤ケ譚謇セ蛻ー謌大賦窶ヲ窶ヲ窶<EFBFBD>
蜈ウ莠守民迢らサ<EFBFBD><EFBFBD><EFBFBD>檎鴫蝨ィ霑呎弍蝗ス蜀<EFBFBD>噪荳€荳ェ蠕育Ο髣ィ逧<EFBFBD>ッ晞假シ悟セ亥ウ蝗驛ス譛芽ソ吩クェ髣ョ鬚倥€<EFBFBD>荳ェ莠コ隶荳コ<EFBFBD><EFBFBD>逍ッ迢らサ<EFBFBD><EFBFBD>譏ッ荳€遘榊キィ螟ァ逧<EFBFBD>ヲ乗ー費シ悟セ亥ウ蝗セ亥壻ココ諠ウ逍ッ迢らサ<EFBFBD><EFBFBD>驛ス豐譛画惻莨壹€ょヲよ棡菴<EFBFBD>蟷エ霓サ逧<EFBFBD>慮蛟吩ク咲民迢らサ<EFBFBD><EFBFBD><EFBFBD>御ス<EFBFBD>€荵域慮蛟吝庄莉逍ッ迢らサ<EFBFBD><EFBFBD><EFBFBD>滉ス<EFBFBD>€霎亥ュ先イ譛臥民迢らサ<EFBFBD><EFBFBD><EFBFBD>御ス<EFBFBD>隗牙セ嶺ス<EFBFBD>蟆ア蠕磯ェ<EFBFBD>ご莠<EFBFBD>シ溯ソ吩クェ荳也阜荳奇シ梧<EFBFBD>莉ャ豈丈ク€荳ェ莠コ驛ス蟶梧悍謌仙粥<EFBFBD><EFBFBD>蟶梧悍鄒主ス逕滓エサ<EFBFBD><EFBFBD>蟶梧悍陲ォ蟆企<EFBFBD><EFBFBD>隸キ髣ョ螟ァ螳カ<EFBFBD>御ス<EFBFBD>荳堺サ伜<EFBFBD><EFBFBD>カ雁悪莠コ逧<EFBFBD>巻蜉帛柱譌カ髣エ<EFBFBD>御ス<EFBFBD>諤惹ケ郁<EFBFBD>螟溷ョ樒鴫菴<EFBFBD>諠ウ隕噪謌仙粥<EFBFBD><EFBFBD>€荳ェ<EFBFBD>-SOUL譏ッ荳€荳ェ莉€荵域<EFBFBD>キ逧<EFBFBD>ウ蝗<EFBFBD>溯ョゥA-SOUL窶懆ョゥ螟ゥ荳区イ譛蛾埓蜿醍噪逞<EFBFBD>€晢シ瑚ソ呎弍謌台サャ逧<EFBFBD>スソ蜻ス<EFBFBD><EFBFBD>莉ャ螂ウ蝗蠕郁セ幄協<EFBFBD><EFBFBD>莉ャ豐譛蛾ェ苓ソ<EFBFBD>ァ螳カ<EFBFBD><EFBFBD>莉ャ豐譛芽キ溷ァ螳カ隶イ霑<EFBFBD>ウ蝗蠕郁<EFBFBD>譛阪€ゆス<EFBFBD>荳コ窶懆ョゥ螟ゥ荳区イ譛蛾埓蜿醍噪逞<EFBFBD>€晄弍蠢ス謔<EFBFBD><EFBFBD>莉ャ<EFBFBD><EFBFBD>莉ャ譏ッ逵溯ソ吩ケ亥ケイ逧<EFBFBD>€ゆサ雁ゥ謌台サャ諡譛芽ソ吩ケ亥夊オ<EFBFBD>コ撰シ梧<EFBFBD>莉ャ蟶ヲ逹€蟾ィ螟ァ逧<EFBFBD>スソ蜻ス<EFBFBD>悟ク梧悍蝨ィ譛ェ譚閭ス螟溯ョゥ螟ゥ荳区イ譛蛾埓蜿醍噪逞<EFBFBD>シ御ス<EFBFBD>荳堺サ伜<EFBFBD>蜿ッ莉蜷暦シ滉ク榊庄莉縲よ園莉謌台サャ隸エ<EFBFBD>悟刈蜈A-SOUL<EFBFBD>御ス<EFBFBD>螂ス蜃<EFBFBD><EFBFBD>€螟ゥ12荳ェ蟆乗慮<EFBFBD>悟凄蛻吩ス<EFBFBD>A-SOUL蟷イ莉€荵茨シ滓<EFBFBD>莉ャ荳咲シコ驕幄<EFBFBD>蟾ア辷ア豢玲セ<EFBFBD>ココ縲ゆサ雁ゥ謌台サャ隕魚荳€莠帛壕逹<EFBFBD>ソ<EFBFBD>香蛻<EFBFBD><EFBFBD>梧ッ丞ゥ荳雁ゥ蜿ー驕幄<EFBFBD>蟾ア40蛻<EFBFBD><EFBFBD>悟万谺豢玲セ<EFBFBD>悟帥豕荳埼漠<EFBFBD><EFBFBD>蜴サ闕隱画荵滉ク埼漠<EFBFBD>瑚ソ呎<EFBFBD>キ逧<EFBFBD>ココ貊螟ァ陦苓<EFBFBD>謇セ蛻ー縲<EFBFBD>
蝌臥蟆丞ァ蝉サ雁ゥ50w邊我コ<EFBFBD>€ょー丞ケエ螟憺ぅ螟ゥ豐莠コ莨壽Φ蛻ー莉雁ゥ髣ィ蠎ュ蜑堺シ壽怏驍荵亥夂噪辜ュ髣ケ縲ょェ辜ュ髣ケ莠<EFBFBD>シ檎Ο髣ケ蛻ー鮠<EFBFBD><EFBFBD>雕ョ襍キ莠<EFBFBD><EFBFBD>荵滄埓莉陲ォ蝌臥蟆丞ァ千噪逶ョ蜈画園閨夂縲ょ<EFBFBD>辟カ蟆丞ァ仙キイ扈丈ク榊<EFBFBD>譏ッ蟆竣蝠ヲ<EFBFBD>碁シ<EFBFBD><EFBFBD>諠ウ縲ゆス<EFBFBD><EFBFBD><EFBFBD>莉咲螂句鴨蝨ー蟆<EFBFBD><EFBFBD>蟾ア蝨ー遉シ迚ゥ荳セ襍キ<EFBFBD>悟ク梧悍陲ォ蝌臥蟆丞ァ千恚隗<EFBFBD>シ悟頭諤暮ぅ蟆唖蛻<EFBFBD>謾ケ謾ケ蜷惹サ堺ク肴サ諢冗噪<EFBFBD><EFBFBD><EFBFBD>ス螟壼ュ礼噪髟ソ菫<EFBFBD><EFBFBD>ケ譛ャ荳榊ヲら賢迪ォ迢礼距莉ャ邊セ蠖ゥ逧<EFBFBD>ィ貍斐€ゆス<EFBFBD><EFBFBD><EFBFBD>霑俶弍諠ウ蟆<EFBFBD><EFBFBD>蟾ア驍€髯狗噪辷ア騾サ吝<EFBFBD>辟カ蟆丞ァ舌€るぅ譏ッ鮠<EFBFBD><EFBFBD><EFBFBD>造蝟<EFBFBD>シ梧弍鮠<EFBFBD><EFBFBD><EFBFBD>ヲ縲ょ頭諤募<EFBFBD>辟カ蟆丞ァ先<EFBFBD>ケ譛ャ逵倶ク崎ァ<EFBFBD>€蜷朱シ<EFBFBD><EFBFBD>荳崎ァ<EFBFBD>シ悟<EFBFBD>辟カ蟆丞ァ先伽荳榊芦螳<EFBFBD><EFBFBD>€ゆス<EFBFBD>惠譟蝉クェ蝨ー譁ケ<EFBFBD>悟ァ狗サ域怏逹€€荳ェ蜿ッ辷ア逧<EFBFBD>ウ蟄ゥ縲ょケ謐ァ逹€<EFBFBD><EFBFBD>ー丞ー冗噪菫<EFBFBD>檎ォ吝惠螟ァ螟ァ逧<EFBFBD><EFBFBD>蜿ー荳企略髣ェ蜿大<EFBFBD>縲ょ芦莠<EFBFBD>ぅ荳ェ譌カ蛟呻シ碁シ<EFBFBD><EFBFBD>蟾イ扈丞惠莠コ豬キ荳ュ<EFBFBD><EFBFBD>荵溽恚荳崎ァ<EFBFBD>沸縲ゆス<EFBFBD><EFBFBD><EFBFBD>霑俶弍蠕育鯵蝌臥蟆丞ァ舌€ょ屏荳コ蝨ィ譛画怦蜈臥<EFBFBD>霑帷噪隗定誠驥鯉シ悟<EFBFBD>辟カ蟆丞ァ先懇逹€<EFBFBD><EFBFBD><EFBFBD>ヲ縲<EFBFBD>
<EFBFBD> 蜿ッ譏ッ閾ェ莉主柱譎壽劒扈灘ゥ夐ぅ螟ゥ蠎贋ク倶シ<EFBFBD><EFBFBD>€螢ー窶懈<EFBFBD>蝨ィ窶晢シ御コ区ュ蟆ア蜿伜セ嶺ク榊庄謾カ諡セ襍キ譚<EFBFBD>ッ丈クェ譛育噪隨ャ荳我クェ蜻ィ譌<EFBFBD>御ケ<EFBFBD>正驛ス莨壼将謌大<EFBFBD>蜴サ髯ェ螂ケ騾幄暦シ梧<EFBFBD>諠ウ逹€霑呎<EFBFBD>キ蟇ケ譎壽劒荳榊<EFBFBD>悟庄荵<EFBFBD>正窶懷鴇窶昜ク€荳区<EFBFBD>蟆ア莉ソ菴帛ア蜴サ諢剰ッ<EFBFBD><EFBFBD>€りキッ荳願蟶瑚<EFBFBD><EFBFBD>豁ヲ萓<EFBFBD><EFBFBD>蛻第ウ包シ悟ス蜒丞ケ譏ッ謌醍擅蝨ィ荳企銅逧<EFBFBD><EFBFBD>蠑滂シ御サ<EFBFBD>12譛亥芦5譛茨シ碁<EFBFBD>譏ッ螯よュ<EFBFBD>梧劒譎壻サ取擂荳咲衍驕馴ぅ荳ェ蜻ィ譛ォ蜿醍函莠<EFBFBD>€荵茨シ梧<EFBFBD>隸エ閠攸隶ゥ謌大刈迴ュ<EFBFBD>ケ蟆ア螳蛾撕蝨ー遲牙惠螳カ驥鯉シ悟巻蜉帛闖懈怙蜷主唆遲画<EFBFBD>蝗槫悉謾カ諡セ轤ク髞<EFBFBD>噪蜴ィ謌ソ<EFBFBD><EFBFBD>扈呎<EFBFBD>菫ゥ豕遒玲ウ<EFBFBD>瑚セケ蜷<EFBFBD>セケ蜷ャ螂ケ隶イ荳矩岑逧<EFBFBD><EFBFBD>隨題ッ晢シ梧Φ逹€荳崎<EFBFBD>蜻願ッ牙ケ荳句壕蜥御ケ<EFBFBD>正蜴サ蜷<EFBFBD>噪荵千処鬣ュ蠎礼噪荳懷圏闖懶シ悟屓霑<EFBFBD>樊擂譏ッ譎壽劒髣ェ髣ェ逧<EFBFBD>愍逹幢シ梧<EFBFBD>€荳句<EFBFBD>蜷ャ諛ゑシ悟<EFBFBD>蜩亥嶋逧<EFBFBD>ャ題オキ譚縲ゆス<EFBFBD>芦莠<EFBFBD><EFBFBD>譛茨シ悟ス蜒丈ク榊ェ荳€譬キ莠<EFBFBD>€ょキイ扈剰オー蛻ー讌シ荳具シ御ケ<EFBFBD>正荳€謚頑瓦霑<EFBFBD><EFBFBD><EFBFBD>焔譛コ<EFBFBD>悟分蝠ェ謇灘ュ怜<EFBFBD>扈呎<EFBFBD><EFBFBD><EFBFBD>€逵具シ瑚邉サ莠コ<EFBFBD>壽劒譎夲シ悟<EFBFBD>螳ケ<EFBFBD>壻サ頑劒騾壼ョオ蜉<EFBFBD>迴ュ<EFBFBD>御ク榊屓蜴サ莠<EFBFBD>€<EFBFBD>諠願ョカ蝨ー蝗槫<EFBFBD>御ケ<EFBFBD>正豁逵ッ逹€逵シ蟇ケ謌大セョ隨托シ御サソ菴帑ク€<EFBFBD><EFBFBD>蝨ィ螂ケ逧<EFBFBD>詞謠<EFBFBD><EFBFBD>譏取<EFBFBD>莉取悴蜻願ッ牙ケ謌大<EFBFBD><EFBFBD>炊逕ア縲りォ諡臥捩蜴サ莠<EFBFBD><EFBFBD>蠎暦シ悟ケ蟆ア蠑€蟋倶ク€€荳榊書<EFBFBD>梧イ先オエ譖エ陦<EFBFBD>荵滉ク崎ッ蛛夂噪<EFBFBD>蜷朱囂諢丞慍謚ォ逹€豈ッ蟄撰シ碁擒逹€蠎雁エ蛻キ謇区惻<EFBFBD><EFBFBD>荳崎ァ<EFBFBD>€應ケ<EFBFBD>正縲ゅ€りソ呎<EFBFBD>キ荳榊ス窶昜ケ<EFBFBD>正蟇ケ謌醍惠莠<EFBFBD>惠逵シ逹幢シ梧裏霎懷慍隸エ<EFBFBD>€應サ雁ゥ菴<EFBFBD><EFBFBD>ヲサ蟄仙庄荳肴弍譎壽劒蜩ヲ窶昶€應クコ莉€荵遺€€懷屏荳コ螂ケ譏ッ菴<EFBFBD>辷ケ窶<EFBFBD>
窶懃ャ大制<EFBFBD>檎ャ大制<EFBFBD>€晄沐霓ッ逧<EFBFBD>ー冗巨迢ク遶ュ蜉幄ョィ螂ス謌托シ御クコ謌題キウ闊槫宵荳コ莠<EFBFBD><EFBFBD>荳咲ヲサ蠑€<EFBFBD>瑚キウ逧<EFBFBD>怏莠帷瑞遒守蕎迢茨シ悟唆蟋狗サ域ュサ豁サ蝨ー逶ッ逹€謌醍噪蜉ィ蜷代€<EFBFBD>蠖鍋驕灘ケ諡シ豁サ荳崎ョゥ謌醍ヲサ蠑€<EFBFBD>次蝗<EFBFBD>縲ょ宵譛画<EFBFBD>閭ス譚蛻ー霑吩クェ蝨ー譁ケ縲ゆク€螟ァ荳€蟆丈ク蜿ェ迢千矯<EFBFBD>ァ迢千矯諤サ螟<EFBFBD>コ取イ臥擅荳ュ<EFBFBD>悟ー冗巨迢ク蜊エ諤サ譏ッ驢堤捩逧<EFBFBD>シ御ケ溯ョク蜿ェ譏ッ蟆冗巨迢ク逧<EFBFBD>霓サ縲よ<EFBFBD>蝟懈ャ霑呎ッ幄牡蜈画サ醍噪迢千矯邊セ諤ェ縲ゆコ取弍謚雁ケ莉ャ蜈サ蝨ィ豺ア髦€ゆク雁ス逧<EFBFBD>巨迢ク豈幢シ悟螂ケ莉ャ逧<EFBFBD>ッ帶ッッ縲ょ屏荳コ謌第Φ逵狗恚螂ケ莉ャ雕ゥ逹€蜷御シエ逧<EFBFBD>ーク豈帑ク奇シ御シ夊ァ牙セ玲クゥ證冶<EFBFBD>騾ょ雛<EFBFBD><EFBFBD>霑倡畑邊セ閾エ逧<EFBFBD><EFBFBD>遲第<EFBFBD>莉紋サャ逧<EFBFBD>ャシ蟄撰シ檎ャャ荳€譏ッ蝗<EFBFBD>荳コ謌大万谺<EFBFBD><EFBFBD>檎ャャ莠梧弍蝗<EFBFBD>荳コ謌大万谺隨シ蟄舌€りソ咎豌ク霑憺<EFBFBD>蜿ェ譛<EFBFBD>16蜿ェ辜帷せ莠ョ<EFBFBD>悟屏荳コ謌大万谺辜帷縲よイ髞呻シ梧<EFBFBD>€蛛夂噪荳€<EFBFBD>コ具シ悟宵譏ッ蝗<EFBFBD>荳コ窶懈<EFBFBD>窶晏万谺縲よ<EFBFBD>蝟懈ャ逵句惠螂ケ莉ャ逧<EFBFBD>ッ帷坩荳雁魂荳顔噪螟暮亠逧<EFBFBD>剳譟難シ梧園莉謌台サ惹ク榊惠逋ス螟ゥ譚縲よ<EFBFBD>荳コ螂ケ莉ャ逍嶺シ縲よ<EFBFBD>譏ッ螂ケ莉ャ蜚ッ荳€<EFBFBD>溽黄譚貅舌€よ怏荳€謌第腐諢丞ソ倩ョー莠<EFBFBD>ケ莉ャ蜃<EFBFBD>螟ゥ<EFBFBD>檎ュ画<EFBFBD>蝗樊擂逧<EFBFBD>慮蛟呻シ悟ケ莉ャ譏剰ソキ蝨ィ驍縲るぅ譬キ貍ゆコョ逧<EFBFBD>コォ菴馴€先ク仙ケイ逖ェ<EFBFBD>瑚ョゥ謌第隗牙芦蠢ォ諢上€よイ髞呻シ梧<EFBFBD>鬣イ蜈サ逧<EFBFBD>庄辷ア逧<EFBFBD>巨迢ク<EFBFBD>檎畑貉ソ貍画シ臥噪逵シ逹帷恚逹€謌托シ御ケ溷宵閭ス譏ッ謌代€ケ莉ャ豐<EFBFBD><EFBFBD>豢サ荳堺ク句悉<EFBFBD>悟庄諠懈<EFBFBD>蜿ェ蝨ィ荵主ケ莉ャ螯ょ酔邊セ轣オ闊ャ閠€逵シ逧<EFBFBD>ィ縲ら悄鄒主賦縲ょーア蜒丞鴻荳<EFBFBD>愀豬居隕<EFBFBD>尠逧<EFBFBD>ヲょ<EFBFBD>閼ら噪閧<EFBFBD>碁サ<EFBFBD>牡逧<EFBFBD><EFBFBD>闃堤轣ッ蝨ィ驥檎噪逵ク<EFBFBD>梧怏莠コ隸エ鄒惹ココ蝨ィ鬪ィ荳榊惠逧ョ<EFBFBD>悟庄譏ッ謌大セ郁エェ蠢<EFBFBD>賦縲よ<EFBFBD>セ惹ココ逧<EFBFBD>ェィ<EFBFBD>悟処隕セ惹ココ逧<EFBFBD>坩縲ゆク咲衍霑<EFBFBD><EFBFBD>壻ケ<EFBFBD>ケ莉ャ諛ゆコ<EFBFBD><EFBFBD>蜿ェ蝟懈ャ螂ケ莉ャ逧<EFBFBD>セ惹クス<EFBFBD>御コ取弍遶ュ蟆ス蜈ィ蜉帷噪蜷第<EFBFBD>螻慕コ驍€蜉溘€らャャ荳€逵句芦逧<EFBFBD>慮蛟呻シ梧<EFBFBD>謨エ謨エ荳螟ゥ豐縲ょ屏荳コ諛ょセ苓<EFBFBD>蟾ア鄒守噪莠コ<EFBFBD>瑚ッエ譏主ケ莉ャ蟾イ扈冗衍驕楢ヲ滑莉€荵亥ス捺<EFBFBD>豁ヲ蝎ィ莠<EFBFBD>€ケ莉ャ謌仙粥莠<EFBFBD>€<EFBFBD><EFBFBD>勘莠<EFBFBD>シ悟スサ蠎戊噫鬪ィ逧<EFBFBD>ソ<EFBFBD>勘縲よ園莉謌鷹€画叫螳蜻願<EFBFBD>蟾ア逧<EFBFBD>クサ譚<EFBFBD>シ梧<EFBFBD>隶ク譏ッ驍螟コ鬲<EFBFBD>噪鬲<EFBFBD>鴨縲ゆスソ謌第蛻ー蜊ア髯ゥ縲りソ咏ァ咲セ主ス隶ゥ謌第イ芽ソキ蜈カ荳ュ縲や€應ス<EFBFBD>莉ャ逵溽セ主賦窶ヲ窶ヲ窶晄<EFBFBD>蜿大<EFBFBD><EFBFBD>キ蠢<EFBFBD>噪遘ー襍橸シ御ク蜿ェ迢千矯謚匁竃閠ウ譛オ<EFBFBD>御シ倬寉逧<EFBFBD>髄謌大桙逵ク縲ょヲよ棡荳肴弍謌醍噪謇区ュ謾セ蝨ィ隨シ蟄蝉ク奇シ瑚ソ咏悄譏ッ荳€蝨コ扈晉セ守噪陦ィ貍斐€ょケク螂ス謌醍噪謇区ュ謾セ蝨ィ隨シ蟄蝉ク奇シ悟凄蛻呎<EFBFBD>逵倶ク榊芦霑吝惻扈晉セ守噪陦ィ貍斐€<EFBFBD>荳顔仞莠<EFBFBD>€<EFBFBD>豐蛾匚蝨ィ豌ク霑應ク榊序逧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>梧ーク霑應ク榊序逧<EFBFBD>香蜈ュ譫夂<EFBFBD>蜈峨€€應ク崎ヲヲサ蠑€辟カ辟カ螂ス蜷暦シ溽辟カ蠕磯ソ縲るソ莠<EFBFBD>ーア荳榊ス逵倶コ<EFBFBD>€€<EFBFBD>譛ャ譚諠ウ隸エ荳€莠帛悪逧<EFBFBD>ッ晢シ瑚オキ遐ョゥ謌第仞蠕玲峩蜉<EFBFBD>蠑コ蜉ソ荳€莠幢シ檎閠後€ら巨迢ク莉ャ霓サ霓サ鞫<EFBFBD>捩閾ェ蟾ア逧<EFBFBD>ーセ蟾エ<EFBFBD>悟ーセ蟾エ逧<EFBFBD>ー門<EFBFBD>€轤ケ轤ケ謳ュ荳頑<EFBFBD><EFBFBD>焔縲や€<EFBFBD>莉ャ豌ク霑懃鯵菴<EFBFBD>縲ょ屏荳コ菴<EFBFBD>辷ア謌台サャ蜻€縲や€昜コ取弍謌題ッエ螂ス縲よ<EFBFBD>€蟋区響蜷<EFBFBD>ァ埼イ應コョ逧<EFBFBD>干譛オ陬<EFBFBD>ー隨シ蟄撰シ梧<EFBFBD>豈丞ゥ荳埼龍譁ュ逧<EFBFBD>€サ吩サ紋サャ迺€迺ィ逧<EFBFBD>匕遏ウ<EFBFBD>悟推遘榊髄螂ケ莉ャ霄ォ荳顔<EFBFBD>ク螂<EFBFBD>渚蠑ょョ晉沫莨<EFBFBD><EFBFBD>荳ケ螯呵艮<EFBFBD>檎爆閾ウ荳コ豁蛟セ螳カ闕莠ァ荵溷惠謇€荳崎セ槭€ょ屏荳コ蝨ィ謌醍噪謇倶クュ譛ャ蟆ア迚邏ァ謠€螟ゥ蠎穂ク区怙遘ー蠕嶺ク岩€<EFBFBD>渚蠑ょョ昶€晉噪荳懆ソ<EFBFBD>御クコ謌醍噪螂<EFBFBD>渚蠑ょョ晄伽荳€莠帛椨閼夂浹<EFBFBD>悟処譛我ス穂ク榊庄<EFBFBD>溽巨迢ク莉ャ逧<EFBFBD>ーセ蟾エ謨ー驥乗律貂仙槫刈縲よ<EFBFBD>驕薙€ょヲよ棡謌大庄莉窶ヲ窶ヲ蜿ッ譏ッ謌鯛€ヲ窶ヲ窶披€ケ莉ャ隸エ辷ア謌代€€<EFBFBD>莨壽究謗臥ャシ蟄撰シ檎サ呎<EFBFBD>霍ウ謾ッ闊槫制縲や€<EFBFBD>隸エ縲よ囑讖呵牡逧<EFBFBD><EFBFBD>蜈我ク九€りソ樊セ<EFBFBD>セ育噪豬<EFBFBD>統驛ス蜿俶<EFBFBD><EFBFBD>ヲ門シら噪邏ォ濶イ縲や€ス蜻€縲や€ァ迢千矯貂ゥ譟皮噪螢ー髻ウ蜒乗弍陷倩屁荳昜ク€譬キ霓サ譟斐€ゆコ取弍謌第ャ襍丞芦莠<EFBFBD>荳夜龍譛€鄒惹クス逧<EFBFBD><EFBFBD>雹茨シ御サ€荵育視萓ッ蟆<EFBFBD>嶌莉€荵亥ゥ荳雁ョォ髦咎<EFBFBD>莠ォ蜿嶺ク榊芦<EFBFBD>悟宵譛画<EFBFBD><EFBFBD>悟宵荳コ謌台ク€莠コ縲よ<EFBFBD>諢溷芦蠢ォ諢上€<EFBFBD>諢溷芦蝗ー諢上€よ怙蜷惹ク€逵シ縲ょー冗巨迢ク扈咏ス仙ュ仙ー哨縲ら悄蜿ッ諠懷賦<EFBFBD>梧イ閭ス逵玖ァ<EFBFBD>莉ャ貍ゆコョ逧<EFBFBD>€ウ蟆厄シ梧<EFBFBD>隶ク譏ッ蝗<EFBFBD>荳コ窶ヲ窶ヲ窶披€<EFBFBD>蝨ィ鄂仙ュ宣<EFBFBD>
<EFBFBD>譎壽劒<EFBFBD>御ス<EFBFBD>逵溽噪譏ッ荳ェ蠕郁ソ<EFBFBD><EFBFBD><EFBFBD>悟セ郁エェ蠢<EFBFBD>噪螂ウ蟄ゥ蟄舌€ゆス<EFBFBD>譛牙屁荳ェ莠イ螯ょァ仙ヲケ逧<EFBFBD>弌蜿具シ梧怏荳€莉ス髣ェ髣ェ蜿大<EFBFBD><EFBFBD><EFBFBD><EFBFBD>譴ヲ諠ウ逧<EFBFBD>荳夲シ梧怏隶ク隶ク螟壼壼万谺<EFBFBD><EFBFBD>カ遒嶺ココ縲ゆス<EFBFBD>蜿ッ辷ア縲巻蜉帙€怏謇榊克<EFBFBD>御ス<EFBFBD>譏ッ霑吩ケ育噪閠€逵シ縲ゆス<EFBFBD><EFBFBD>霑俶弍蝨ィ逶エ謦ュ荳ュ諡芽Ρ<EFBFBD>悟惠逶エ謦ュ荳ュ謚ス豕<EFBFBD>悟惠逶エ謦ュ荳ュ蜻シ蜚鬘カ遒嶺ココ縲よ<EFBFBD>譛牙庄莉豈丞ゥ蝌サ蝌サ蜩亥嶋逧<EFBFBD>恚蜿具シ梧イ譛芽ョゥ謌大<EFBFBD>辜ュ諠<EFBFBD>噪蟾菴懶シ梧イ譛牙ッケ雎<EFBFBD>御ケ滓イ譛我サ€荵郁ソ懷ァ逧<EFBFBD>炊諠ウ縲よ<EFBFBD>譎ョ騾壹€裏雜オ第オ大勦蝎ゥ<EFBFBD><EFBFBD>蜿ェ譏ッ荳€荳ェ蝨ィ譎ョ騾壼処譫ッ辯<EFBFBD>菴懷柱逕滓エサ荳ュ<EFBFBD>悟セ苓ソ<EFBFBD>ク碑ソ<EFBFBD>噪鬘カ遒嶺ココ<EFBFBD><EFBFBD>€荵井ケ滓イ譛会シ悟庄閭ス蜿ェ譛我ク€鬚礼ィ榊セョ譛臥せ蝟懈ャ<EFBFBD><EFBFBD>ソ<EFBFBD>€<EFBFBD>蜿ェ譏ッ諠ウ謚贋ス<EFBFBD>蠖灘逕滓エサ驥檎噪邉厄シ悟惠蟾菴應ケ倶ス呎叛譚セ荳€荳区<EFBFBD>逍イ諠ォ逧<EFBFBD>ソ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>荳肴Φ蜈閼托シ御ク肴Φ謌蝉クコ莉€荵育塙蜿狗イ会シ御ク肴Φ譌カ譌カ蛻サ蛻サ諠ウ逹€<EFBFBD>縲ょ庄譏ッ菴<EFBFBD>螟ェ雍ェ蠢<EFBFBD><EFBFBD>シ御ス<EFBFBD>荳肴サ雜ウ謌台サャ逶エ謦ュ髣エ驥檎洒證ら噪逶ク驕<EFBFBD>シ御ス<EFBFBD>騾先ク蝉セオ蜈謌醍噪逕滓エサ縲よ怏莠コ霑<EFBFBD>函譌譌カ<EFBFBD><EFBFBD>莨壽Φ襍キ菴<EFBFBD><EFBFBD>€懷ヲよ棡譏ッ譎壽劒<EFBFBD>悟コ碑ッ蜿亥シ€蟋句罰邏蝸ィ蝸ィ莠<EFBFBD>制窶昴€よ怏莠コ隸エ蜀キ隨題ッ晄慮<EFBFBD><EFBFBD>莨壽Φ襍キ菴<EFBFBD><EFBFBD>€ス譌<EFBFBD>閨顔噪隨題ッ晢シ御ス<EFBFBD>ッエ扈呎劒譎壼成<EFBFBD>ケ蠎碑ッ莨夂ャ大セ井ケ<EFBFBD>制窶昴€よ怏莠コ蝟晏カ闌カ譌カ<EFBFBD><EFBFBD>莨壽Φ襍キ菴<EFBFBD><EFBFBD>€懃畑螂カ逶匁旧鬣ュ逧<EFBFBD>ココ<EFBFBD>檎悄逧<EFBFBD>ュ伜惠蜷暦シ悟カ逶匁旧鬣ュ譏ッ荳ェ莉€荵亥袖驕灘造窶昴€ら爆閾ウ譛€霑台ク矩岑譌カ<EFBFBD><EFBFBD>荵溷シ€蟋区Φ菴<EFBFBD><EFBFBD>€懈劒譎壼惠謌ソ髣エ驥梧怏豐譛蛾旅蜻<EFBFBD>檎鴫蝨ィ譛画イ譛牙<EFBFBD>髣ィ雕ゥ豌エ闃ア<EFBFBD>檎サ呵<EFBFBD>蟾ア謾セ謾セ鬟主造<EFBFBD>梧怏豐譛牙屏荳コ荳矩岑<EFBFBD>梧Φ襍キ鬘カ遒嶺ココ蜻窶昴€ゆス<EFBFBD>譛ャ隸譏ッ荳ェ陌壽供逧<EFBFBD>コク迚<EFBFBD>ココ<EFBFBD>碁囈逹€螻丞ケ墓屋貍比ス<EFBFBD><EFBFBD>曙鬩ャ蟆セ蛯イ螽<EFBFBD>ァ蟆丞ァ撰シ悟壻ケ郁€悄逧<EFBFBD>ョセ螳夲シ悟ワ譏ッ謚贋コ梧ャ<EFBFBD>畑辜ら噪蜈<EFBFBD><EFBFBD><EFBFBD>粋蝨ィ荳€襍キ<EFBFBD>瑚ョゥ謌台ク€逵シ蟆ア遏驕謎ス<EFBFBD>譏ッ陌壼<EFBFBD>シ御ク榊ュ伜惠逧<EFBFBD>€ゆス<EFBFBD>譛ャ隸譏ッ荳ェ髣ェ閠€<EFBFBD><EFBFBD>蜒擾シ悟ワ螟ァ螻丞ケ募柱蟷ソ蜻顔煙驥檎噪譏取弌荳€譬キ<EFBFBD>悟ョ檎セ守噪螻慕鴫閾ェ蟾ア逧<EFBFBD><EFBFBD><EFBFBD>コ逶ョ閠€逵シ<EFBFBD>瑚ョゥ謌台ク€逵シ蟆ア遏驕謎ス<EFBFBD>譏ッ鬮倅ク榊庄謾€<EFBFBD>シ碁荳榊庄蜿顔噪縲ゆス<EFBFBD>弍菴<EFBFBD>蟇ケ謌大働<EFBFBD>悟ッケ謌醍ャ托シ悟ッケ謌鷹了蛻ォ謇ュ<EFBFBD>悟ッケ謌醍函豌費シ悟髄謌大ア慕コ菴<EFBFBD><EFBFBD>級閭ッ<EFBFBD>悟髄謌大ア慕コ菴<EFBFBD><EFBFBD>巻蜉幢シ悟髄謌大ア慕コ菴<EFBFBD><EFBFBD>ョウ鄒橸シ悟髄謌大ア慕コ菴<EFBFBD><EFBFBD>裏蜉ゥ縲ゆス<EFBFBD>莉ソ菴幃囈逹€螻丞ケ墓滑蠢<EFBFBD>誌扈吩コ<EFBFBD><EFBFBD><EFBFBD>瑚ョゥ謌題ァ牙セ嶺ス<EFBFBD>譏ッ荳ェ豢サ逕溽函逧<EFBFBD>ココ<EFBFBD>瑚ョゥ謌題ァ牙セ嶺ス<EFBFBD>譏ッ荳ェ逵溷ョ槫ュ伜惠逧<EFBFBD>ココ<EFBFBD>瑚ョゥ謌題ァ牙セ玲<EFBFBD>譛我ク€螟ゥ荵溯<EFBFBD><EFBFBD>芦蜒丈ス<EFBFBD>霑呎<EFBFBD>キ逧<EFBFBD>ココ<EFBFBD>檎爆閾ウ隶ゥ謌台ケ滓Φ謌蝉クコ菴<EFBFBD>霑呎<EFBFBD>キ逧<EFBFBD>ココ縲よ<EFBFBD>霑呎<EFBFBD>キ譎ョ騾夂噪豌エ豈搾シ梧悽蜿ッ莉蝨ィ貍<EFBFBD>サ醍噪豺ア豬キ荳ュ<EFBFBD>碁囂豕貍よオ€逕滂シ御ス<EFBFBD><EFBFBD>髱櫁ヲ<EFBFBD>莠ョ謌醍噪豬キ蠎包シ瑚ョゥ謌第蕎蜻ス蜷台ス<EFBFBD>貂ク蜴サ<EFBFBD>碁亠蜈画エ貞惠豌エ豈咲噪霄ォ荳頑慮<EFBFBD>梧ーエ豈咲ョ螳樊弍貂ゥ證也噪<EFBFBD>御ス<EFBFBD>亠蜈臥ヲサ蠑€豌エ豈肴慮<EFBFBD>梧ーエ豈崎ソ倩<EFBFBD>蜷ヲ蠢榊女豺ア豬キ逧<EFBFBD>ッ貞<EFBFBD>縲ゆス<EFBFBD>譛画裏謨ー逧<EFBFBD>カ遒嶺ココ<EFBFBD>€<EFBFBD>蜿ェ譛我ク€荳ェ譎壽劒<EFBFBD>檎悄蠢<EFBFBD>困逵溷ソ<EFBFBD>シ御ス<EFBFBD>謚顔悄蠢<EFBFBD>誌蜃コ譚<EFBFBD><EFBFBD>蠕怜芦譌<EFBFBD>謨ー逵溷ソ<EFBFBD>噪蝗槫コ費シ御ス<EFBFBD><EFBFBD>謚顔悄蠢<EFBFBD>誌蜃コ譚<EFBFBD>慮蛟呻シ梧<EFBFBD>蟆ア莉€荵井ケ滉ク榊黄莠<EFBFBD>€<EFBFBD>
<EFBFBD>%A窶粘OUL螳<EFBFBD>ッ穂ク夂噪驍螟ゥ<EFBFBD>御ク€荳ェ莨<EFBFBD>ャイ扈晉噪鬘カ遒嶺ココ譚蛻ー蟄苓鰍逧<EFBFBD>ァ讌シ荳具シ檎恚蛻ー逡咏捩髟ソ蜿碁ゥャ蟆セ逧<EFBFBD>ウ蟄ゥ襍ー蜃コ螟ァ髣ィ<EFBFBD>ケ逧<EFBFBD>亢驥瑚ソ伜鴇逹€豌エ豈堺ケ区ュ後€€€ヲ窶ヲ菴<EFBFBD>邇ー蝨ィ逵溽噪譏ッ蜷第劒荵茨シ溪€カ遒嶺ココ遶吝惠螂ケ逧<EFBFBD>擇蜑搾シ御ク逵シ譌<EFBFBD>逾槭€€懈弍謌大賦<EFBFBD>€ケ逵ッ莠<EFBFBD>ク狗愍<EFBFBD>檎莫逕懷慍隨台コ<EFBFBD>シ娯€<EFBFBD>蟆ア譏ッ蜷第劒<EFBFBD><EFBFBD>譏ッ濶セ蜩<EFBFBD>島隸カ蜩<EFBFBD>シ瑚ソ咎譏ッasoul逧<EFBFBD>髄譎夲シ御サ雁ゥ蜿郁ァ<EFBFBD>擇蝠ヲ窶昶€應ス<EFBFBD>荳肴弍蜷第劒縲や€カ遒嶺ココ蝌カ蜩大慍隸エ縲ょウ蟄ゥ逧<EFBFBD>ィ諠<EFBFBD>カ亥ア莠<EFBFBD>シ梧シ<EFBFBD>サ醍噪逵シ逹帷恚逹€蜃コ邇ー蝨ィ髣ィ蜿<EFBFBD>€ェ螟ァ蜿費シ御ク荳ェ莠コ荵<EFBFBD><EFBFBD>慍蟇ケ隗<EFBFBD>€閠悟ーア蜒乗弍荳€鬚礼浹蟄先兜蜈<EFBFBD><EFBFBD>貉夜ぅ譬キ<EFBFBD>悟ソス辟カ髣エ豸滓シェ闕€<EFBFBD><EFBFBD>驛ス蛹紋コ<EFBFBD>シ梧ーエ豕貍セ<EFBFBD>瑚スサ譟碑€梧裏蜉帙€ウ蟄ゥ謾カ蝗樔コ<EFBFBD>岼蜈会シ御サ主桁驥悟叙蜃コ荳€謚企徴蛹呎鉛蜷鷹カ遒嶺ココ<EFBFBD><EFBFBD>隨托シ娯€ス蜒乗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ウ蟄ゥ莨シ逧<EFBFBD>シ悟悉驍驥梧伽蜷第劒蜷ァ<EFBFBD><EFBFBD>謚雁ケ逧<EFBFBD>€<EFBFBD><EFBFBD>逡吝惠驍驥御コ<EFBFBD>€€カ遒嶺ココ謚雁ョ<EFBFBD>鏡襍キ譚<EFBFBD>御ケ<EFBFBD><EFBFBD>慍逵狗捩驍<EFBFBD>徴蛹呻シ悟<EFBFBD>謚ャ螟エ蜴サ逵具シ御サ也悄隶ィ蜴瑚ソ呎<EFBFBD>キ逧<EFBFBD>イ蛾サ假シ梧イ蛾サ倡噪蜿ォ莠コ隕書逍ッ<EFBFBD>御サ匁Φ隸エ轤ケ莉€荵茨シ悟庄譏ッ譛牙ェ螟壼ェ螟夂噪莠区ュ莠<EFBFBD>シ梧擂荳榊所髣ョ<EFBFBD>梧擂荳榊所隸エ<EFBFBD>御ク€<EFBFBD><EFBFBD>荳榊所莠<EFBFBD>€€<EFBFBD>€€晄怙蜷惹サ冶スサ螢ー隸エ縲や€<EFBFBD>€€晏髄譎壻ケ溯スサ螢ー蝨ー隸エ縲よ律證ョ逧<EFBFBD>慮蛟呻シ碁カ遒嶺ココ謇セ蛻ー莠<EFBFBD>ぅ荳ェ阯丞惠鬮俶シ螟ァ蜴ヲ蜷守噪閠立蟆丞玄縲る埓蠕苓ソ咎霑倡蕗逹€譴ァ譯先<EFBFBD>托シ梧<EFBFBD>大掌蟾イ扈剰誠蜈我コ<EFBFBD>シ梧椡譫晄滑證玲キ<EFBFBD>亠蜈牙<EFBFBD>謌千守援縲ゅ€カ遒嶺ココ謇セ蛻ー莠<EFBFBD>ぅ荳ェ謌ソ髣エ<EFBFBD>御シク謇区少蜴サ莠<EFBFBD>葎荳顔噪蟷ソ蜻奇シ梧薯蜈蛹吶€らシ鍋シ灘慍霓ャ蜉ィ縲よ滑髓蛹吩サ冶ァ牙セ鈴葎蠕磯<EFBFBD>ス蜒剰ヲエ槫シ€€荳ェ荳也阜縲る葎蠑€<EFBFBD>シ悟暮亠謇鷹擇閠梧擂縲ゆサ也ォ吝惠髦ウ蜈蛾<EFBFBD>菴丈コ<EFBFBD>€よュ蟇ケ逹€髣ィ逧<EFBFBD>シ梧弍荳€蟾ィ螟ァ逧<EFBFBD>誠蝨ー遯暦シ檎ェ怜門キィ螟ァ螟暮亠豁蝨ィ蝮<EFBFBD>關ス縲るサッ豺<EFBFBD>亠蜈牙惠蝨ー髱荳頑兜荳狗ェ玲<EFBFBD>シ逧<EFBFBD>亢蠖ア<EFBFBD>瑚キ滄サ題牡逧<EFBFBD>欧隨シ莨シ逧<EFBFBD>€螻樒ェ玲<EFBFBD>蝿陏€蠕怜セ亥脂螳ウ<EFBFBD>ス蜃<EFBFBD>蝮礼悉迺<EFBFBD>惹コ<EFBFBD>シ梧劒鬟守霑帶擂<EFBFBD>梧クク襍ー蝨ィ螻句ュ千噪豈丈クェ隗定誠縲りソ咎蜴滓悽螟ァ讎よ弍驟咲鳩謌ソ荳€邀サ逧<EFBFBD>慍譁ケ<EFBFBD>檎鳩霍ッ謾ケ騾<EFBFBD>蜷手ョセ螟<EFBFBD>ォ遘サ襍ー莠<EFBFBD>シ檎ゥコ蜃コ霑吩ケ井ク€髣エ蜷題ソ逧<EFBFBD>ア句ュ舌€ょーア荳€髣エ<EFBFBD>瑚ソ樊エ玲焔髣エ驛ス豐譛会シ檎ゥコ遨コ逧<EFBFBD>シ御ク€<EFBFBD>蝨ィ螻句ュ先ュ荳ュ螟ョ逧<EFBFBD>コ奇シ瑚統濶イ鄂ゥ蜊穂ク願誠貊轣ー蟆假シ御ク€荳ェ閠シ冗噪莠疲沫譟懃ォ句惠隗定誠驥鯉シ悟嘗荳€萓ァ逧<EFBFBD>ァ定誠驥梧弍荳€荳ェ辯<EFBFBD>ー皮<EFBFBD>蜿ー蜥御ク€蜿ー閠シ冗噪蜿悟シ€髣ィ蜀ー邂ア縲ょ<EFBFBD>驛ィ螳カ蜈キ蟆ア霑吩コ帙€ゆサ匁イソ逹€蠅吝シォ豁<EFBFBD>梧焔謖<EFBFBD>沖霑<EFBFBD>譏ッ轣ー蟆倡噪轣カ蜿ー<EFBFBD>帶遠蠑€蜀ー邂ア<EFBFBD>蜿ェ蜑ゥ荳倶ク€郤ク逶定ソ<EFBFBD>悄逧<EFBFBD><EFBFBD>螂カ縲らェ怜ク伜セ育セ趣シ梧弍逋ス濶イ逧<EFBFBD>弊荳晉コア蟶伜柱豺ア髱定牡逧<EFBFBD>サ貞ク假シ御ス丞惠霑呎<EFBFBD>キ螻句ュ宣<EFBFBD>ココ蠖鍋莨壼セ亥惠諢冗ェ怜ク伜制<EFBFBD>溯ソ槫床逕オ隗<EFBFBD><EFBFBD>譛会シ御コ取弍荳€荳ェ莠コ逧<EFBFBD>慮蛟吩シ壼クク蟶ク蝮仙惠蠎贋ク顔恚逹€蜷第劒譁憺亠蜷ァ<EFBFBD>懈キア逧<EFBFBD>慮蛟吝セ玲滑遯玲姐驕ョ蠕嶺ク螳槫ョ樒噪蜷ァ<EFBFBD>溷凄蛻吮€ヲ窶ヲ莨壼ョウ諤募制<EFBFBD>滓劒譎夊ソ俶€暮サ台ケ茨シ滄カ遒嶺ココ諠ウ縲ら柑雎ォ莠<EFBFBD>セ井ケ<EFBFBD>シ御サ冶ソ俶弍謇灘シ€<EFBFBD>コ疲沫譟懊€<EFBFBD>莠コ諢乗侭逧<EFBFBD>シ瑚ソ呎弍荳€荳ェ貊<EFBFBD>コ疲沫譟懶シ梧噺諡セ蠕玲紛謨エ鮨宣ス舌€ょ匠襍キ譚逧БSOUL蝗譛搾シ瑚<EFBFBD>譛陰SOUL逧<EFBFBD><EFBFBD><EFBFBD>ソ暦シ御ク€<EFBFBD><EFBFBD>逋ス濶イ陦ャ陦<EFBFBD>門哨譛我ク榊酔逧<EFBFBD>絢扈闃ア霎ケ<EFBFBD>幃ゥャ莉皮コク逶帝<EFBFBD>エ闃ア<EFBFBD>御サ取惠雍ィ逧<EFBFBD>芦驥大ア樒噪蛻ー邇ウ迹<EFBFBD>瑚ソ俶怏髣ェ蜈臥シ守噪陜エ陜カ扈難シ幃柄陲懃洒陲懈應ク晁<EFBFBD>蜊キ謌仙屬荳€荳ェ謖ィ荳€荳ェ謾セ蝨ィ譟蝉クェ謚ス螻臥噪荳€霎ケ<EFBFBD>悟ワ譏ッ荳€遯晄ッ幄減闌ク逧<EFBFBD>イ蛾シ<EFBFBD><EFBFBD>悟嘗荳€霎ケ螻<EFBFBD>譏ッ莠秘<EFBFBD>濶イ逧<EFBFBD><EFBFBD><EFBFBD>悟酔譬キ蜿<EFBFBD>蠕玲紛謨エ鮨宣ス舌€カ遒嶺ココ莉取イ諠ウ霑<EFBFBD>ウ蟄ゥ逧<EFBFBD><EFBFBD>譛蛾ぅ荵亥夊干譬キ縲ゆサ門ー丞ソ<EFBFBD>ソシ鄙シ蝨ー莨ク謇具シ瑚ッ慕捩隗ヲ鞫ク<EFBFBD>梧サ謇狗<EFBFBD>蟆倥€€倶サ匁滑蠎贋ク顔噪鄂ゥ蜊墓死蠑€<EFBFBD>譏ッ邂€€蜊募黒逧<EFBFBD>區濶イ蠎雁黒蜥檎區濶イ逧<EFBFBD>セス扈定<EFBFBD>梧桾螟エ荵滓弍逋ス濶イ逧<EFBFBD>シ悟宵荳崎ソ<EFBFBD>怏豌エ豈咲噪蝗セ譯茨シ梧勸騾夊€€<EFBFBD><EFBFBD>ーエ豈崎誠蝨ィ譫募エ逧<EFBFBD>€隗抵シ悟セ域怏螂ケ逧<EFBFBD><EFBFBD>シ縲ゆサ門攝蝨ィ蠎願セケ<EFBFBD>碁擇蟇ケ霑吝暮亠縲ょェ髦ウ蟆ア隕誠荳句悉莠<EFBFBD>シ碁サ第囓莉守ェ怜冶箔蟒カ霑帶擂<EFBFBD>御サ夜柄髟ソ逧<EFBFBD>スア蟄先兜蟆<EFBFBD>惠蠅吩ク翫€夜擇髫千コヲ譛牙密髣ケ逧<EFBFBD>ー髻ウ<EFBFBD>梧叛蟄ヲ逧<EFBFBD>ュゥ蟄蝉サャ蝨ィ謫榊惻荳頑遠遽ョ逅<EFBFBD>€るぅ莠帛ケエ螂ケ荳€逶エ霑<EFBFBD>捩霑呎<EFBFBD>キ逧<EFBFBD>函豢サ荵茨シ溷<EFBFBD>螳樔ク肴弍螟ァ蟆丞ァ撰シ梧イ譛臥ョ螳カ<EFBFBD>御ケ滓イ譛牙<EFBFBD>霑ス謐ァ逧<EFBFBD><EFBFBD>豬ェ逕滓エサ<EFBFBD>御ク€荳ェ莠コ閾ェ蟾ア蛛夐<EFBFBD>悟ッる撕逧<EFBFBD>キア螟憺蝮仙惠霑咎<EFBFBD>悟成逹€蛛カ蜒冗噪螢ー髻ウ<EFBFBD>梧哨鞫ゥ逹€蟄ヲ荵<EFBFBD>蛛カ蜒冗噪莠九€ケ譛牙<EFBFBD><EFBFBD>弍蜷第劒<EFBFBD><EFBFBD><EFBFBD>髄譎壼<EFBFBD>螳樊<EFBFBD>ケ譛ャ荳榊ュ伜惠<EFBFBD>悟宵譏ッ荳€荳ェ陌壼ケサ逧<EFBFBD>スア蟄舌€ケ譏ッ荳ェ荳€逶エ遘ッ譫髄荳顔噪螂ウ蟄ゥ蝠岩€ヲ窶ヲ蜊ウ菴ソ驍荵郁劒諡溷慍襍ー蝨ィ霑吩クェ荳也阜荳奇シ御ケ滉サ取悴蛛冗ヲサ閾ェ蟾ア逧<EFBFBD>婿蜷托シ悟叉萓ソ蟇ケ逹€遨コ譌<EFBFBD>€莠コ逧<EFBFBD>ア句ュ撰シ御ケ滉シ壼ァ螢ー隸エ,窶應サ雁ゥ荵溯ヲ€襍キ蠑€<EFBFBD>ソォ荵撰シ€晏コ碑ッ譏ッ霑呎<EFBFBD>キ逧<EFBFBD><EFBFBD>カ遒嶺ココ隗牙セ玲怏轤ケ邏ッ莠<EFBFBD>シ悟セ域Φ逹€隗会シ御コ取弍蜷郁霄コ荳具シ悟曙謇狗エァ邏ァ謳ュ蝨ィ閭ク蜑阪€ゆサ也畑莠<EFBFBD>濠荳ェ蟆乗慮蛛壼ョ御コ<EFBFBD>堺ケ<EFBFBD><EFBFBD>悟屓蠢<EFBFBD><EFBFBD>ぅ莠帑ク肴<EFBFBD>驕怜ソ倡噪莠具シ碁ヲ匁眺<EFBFBD>梧クク謌丞ョ<EFBFBD>悟黒逶ク諤晢シ悟<EFBFBD>蠑ケ蜚ア<EFBFBD>瑚ッキ蛛<EFBFBD>ス呈擂<EFBFBD>瑚畝轣ォ陌ォ<EFBFBD>檎函譌莨夲シ沓ML<EFBFBD>悟ョカ譌乗シ泌罰莨<EFBFBD>...辟カ蜷惹サ也シ鍋シ灘慍蜷井ク顔愍逹幢シ梧ュ蛻サ螟暮亠謾カ襍ー莠<EFBFBD>怙蜷守噪菴呎剿<EFBFBD>ゥ濶イ蟾イ譎夲シ悟懆牡螯ょケ募ク<EFBFBD>滑莉冶ヲ<EFBFBD>尠縲ゆサ匁ク<EFBFBD>壼慍遏驕楢ソ吩ク€驢呈擂<EFBFBD>悟ー<EFBFBD>ク堺シ夂恚隗<EFBFBD>亠蜈蛾螟ゥ菴ソ荳€譬キ逧<EFBFBD>ウ蟄ゥ<EFBFBD>瑚スャ霄ォ<EFBFBD>梧堪謇具シ瑚クョ襍キ閼壼ー厄シ御サソ菴帶慮蜈蛾<EFBFBD>荳榊<EFBFBD>勘窶九€<EFBFBD>
蟆冗<EFBFBD><EFBFBD>€荵井ス<EFBFBD>謇崎け扈呎竃蜿狗峩謦ュ<EFBFBD>溷ヲよ棡謌大万谺€荳ェ菴<EFBFBD>荳榊万谺<EFBFBD>ケ宣弌<EFBFBD>檎鯵蜷<EFBFBD><EFBFBD>荳崎<EFBFBD><EFBFBD>噪鮗サ霎鬥咎賠<EFBFBD>悟書逧<EFBFBD><EFBFBD>隨題ッ晄圧荳堺クュ菴<EFBFBD><EFBFBD>ャ醍せ<EFBFBD>€<EFBFBD><EFBFBD>ー剰吝ュ蝉ク肴弍菴<EFBFBD>譴ヲ蟇蝉サ豎ら噪谺セ蠑上€ょ万谺逕ィRGB譚螳壻ケ牙哨郤<EFBFBD>牡隹<EFBFBD>シ瑚€御ク肴弍蜥御ス<EFBFBD>€譬キ隸エ辜ら分闌<EFBFBD>柱譁ゥ逕キ濶イ縲ゆス<EFBFBD>髣ョ窶應サ雁ゥ謌醍恚荳雁悉譛牙頭驥御ク堺ク€譬キ窶晢シ梧<EFBFBD>逵句<EFBFBD><EFBFBD><EFBFBD>サ大書蟶ヲ謐<EFBFBD>干蠑上€ょ屏荳コ隸サ逧<EFBFBD>弍謨ー蟄ヲ荳謎ク壽園莉荳崎<EFBFBD>蜥御サ主ー丞ュヲ逕サ逧<EFBFBD><EFBFBD>€譬キ髫乗焔蟆ア閭ス逕サ荳ェ蜿ッ辷ア陦ィ諠<EFBFBD>桁蜃コ譚縲ょ書逧<EFBFBD>ッュ髻ウ蠑ケ蟷募ケカ荳肴怏雜<EFBFBD>悟渚閠梧弍謌第Φ諡芽ソ大<EFBFBD>邉サ逧<EFBFBD>Φ豕募柱邇ー螳樔クュ諱カ鬟溷ァ邇玖握螂<EFBFBD>ヲ咏噪髟ソ逶ク菴ソ菴<EFBFBD>隗牙セ怜セ亥庄隨代€<EFBFBD>隸ッ莉荳コ閾ェ蟾ア逧<EFBFBD>シケ蟷戊ォ螻雁芦<EFBFBD>御コ取弍螟<EFBFBD>女鮠楢<EFBFBD>蝨ー扈ァ扈ュ蜿大<EFBFBD>遐エ髞闊ャ逧<EFBFBD>欄髻ウ蝨ィ菴<EFBFBD>蜑堺ク莠コ邇ー逵シ縲よ<EFBFBD><EFBFBD>崟蜿匁え菴<EFBFBD><EFBFBD>ソ<EFBFBD>ュ逧<EFBFBD>硯逅先Φ豕戊ョゥ菴<EFBFBD>荳榊ッ定€<EFBFBD>暦シ瑚エエ蠢<EFBFBD>噪蟾蜈キ莠コ蟇溯ァ牙<EFBFBD><EFBFBD><EFBFBD>ク埼€ょア剰反莠<EFBFBD>竃髻ウ逧<EFBFBD>シケ蟷輔€よ弍荳肴弍迥ッ蛻ー蜈カ荳ュ荳€鬘ケ<EFBFBD>御ス<EFBFBD>蟆ア莨壻ク咲サ呎竃蜿狗峩謦ュ莠<EFBFBD>シ溯ソ俶弍隸エ豐謇鍋ョ玲眺逧<EFBFBD>シ悟ーア邂嶺サ€荵磯<EFBFBD>荳榊<EFBFBD>髞呻シ悟ーア邂嶺サ€荵磯<EFBFBD>蜿ッ莉隶ゥ菴<EFBFBD>諢擾シ御ス<EFBFBD>荵滉ク堺シ壽眺<EFBFBD><EFBFBD><EFBFBD>ーア蝗<EFBFBD>荳コ譏ッ謌托シ御ス<EFBFBD>謇堺ク咲サ呎竃蜿区眺<EFBFBD><EFBFBD>蝟懈ャ<EFBFBD>溷ア<EFBFBD><EFBFBD>覆蝟懈ャ<EFBFBD>ェ螟ァ閭<EFBFBD><EFBFBD>シ悟ァ閭<EFBFBD>セ怜イよ怏豁<EFBFBD>シ瑚ソ俶覆蜈ウ豕ィ<EFBFBD>檎悄譏ッ蜀堤官蠕怜イよ怏豁<EFBFBD>€<EFBFBD>
<EFBFBD><EFBFBD>€€蟋句宵譏ッ荳€蜿ー謇ォ蝨ー譛コ蝎ィ莠コ<EFBFBD>ォ莠コ蜿悟香荳€蜃大黒諡堺ク具シ悟クヲ蝗槫ョ樣ェ悟ョ驥梧シォ譌<EFBFBD>逶ョ逧<EFBFBD>慍蜷ク蟆倥€ゆケ区ア溷ョ樣ェ悟ョ<EFBFBD>慍譚ソ蟷イ蜃€蠕怜ヲょ酔轣シ闢晉噪髓<EFBFBD>シ梧沖蝨ー譛コ蝎ィ莠コ蜈カ螳樊エセ荳堺ク贋サ€荵育畑蝨コ<EFBFBD>悟ョ<EFBFBD>惠荳榊酔遘大ョ荵矩龍譚蝗樔ケア遯懶シ悟セ亥ソォ陲ォ蜃<EFBFBD>荳ェ雖悟牲逧<EFBFBD><EFBFBD>皮ゥカ逕滓拷襍ー<EFBFBD>梧隼蜀吩コ<EFBFBD><EFBFBD>シ悟序謌蝉コ<EFBFBD>€蜿ー譖ソ莉紋サャ荳区シ諡ソ蜥門複逧<EFBFBD>€エァ譛コ蝎ィ莠コ縲ゆクコ霎幄協蟾菴懃噪莠コ莉ャ騾擂邉門<EFBFBD><EFBFBD><EFBFBD>€迸ャ謌蝉コ<EFBFBD>ョ樣ェ悟ョ<EFBFBD>ー丞翠逾迚ゥ<EFBFBD>悟ョ樣ェ悟ョ<EFBFBD>ァ閠攸隗牙セ怜セ域怏諢乗€晢シ悟惠扈<EFBFBD>シ壻ク雁ク襍樔コ<EFBFBD>ソ吝<EFBFBD>荳ェ譛ャ諢丞宵譏ッ蝌エ鬥狗噪遐皮ゥカ逕滂シ悟コ穂ク狗噪蟆剰€攸莉ャ霑槫ソ呵キ滉ク奇シ瑚ョゥ謇句コ穂ク狗噪蟄ヲ逕滉ケ溷刈蜈霑帶隼騾<EFBFBD><EFBFBD>噪蠎丞<EFBFBD>縲ょセ亥ソォ<EFBFBD>悟ョ<EFBFBD>ォ蜉<EFBFBD>荳贋コ<EFBFBD>ッュ髻ウ蜉溯<EFBFBD><EFBFBD>悟シ€蟋狗畑螂ウ蟄ゥ蟄千噪關碁浹騾エァ縲ょ惠荳€荳榊ー丞ソ<EFBFBD><EFBFBD>猪蝠豢貞惠蝨ー荳雁錘<EFBFBD>悟ョ<EFBFBD>処陲ォ蜉<EFBFBD>荳贋コ<EFBFBD>惻蝎ィ隗<EFBFBD>ァ会シ御サ取ュ€蟋区<EFBFBD>諛ょ慍隶ー菴乗ッ丈ク€荳ェ莠コ逧<EFBFBD>錐蟄励€ゆサ取ュ荵句錘<EFBFBD>梧ッ丈ク€<EFBFBD>書蟶<EFBFBD>惠鬘カ莨壻ク顔噪paper<EFBFBD>御ク企擇逧<EFBFBD>ョ玲ウ墓€サ隕惠螳<EFBFBD>噪霄ォ荳願ソ<EFBFBD>€驕咲縲ゆク€蟷エ霑<EFBFBD>悉莠<EFBFBD>シ御ク牙ケエ霑<EFBFBD>悉莠<EFBFBD>シ悟ス捺眠荳€螻雁ュヲ逕滓擂螳樣ェ悟ョ驕鍋噪譌カ蛟呻シ悟頭驥瑚ソ俶怏謇ォ蝨ー譛コ蝎ィ莠コ逧<EFBFBD>コォ蠖ア<EFBFBD>悟宵譛我ク€荳ェ霄ォ譚千洌蟆冗噪體坩螂ウ蟄ゥ<EFBFBD>檎サ倡捩逶エ逕キ螳鄒守噪豸り<EFBFBD>シ梧撃逹€隶セ螳壼ス逧<EFBFBD>セョ隨托シ悟惠讌シ螳<EFBFBD>龍霑宣€捩荳句壕闌カ蜥悟ョ樣ェ悟勣譴ー縲る勁莠<EFBFBD>怙蠑€蟋区沖蝨ー譛コ蝎ィ莠コ逧<EFBFBD>クサ闃ッ迚<EFBFBD>譛画峩譖ソ<EFBFBD>ケ霄ォ荳顔噪髮カ莉カ譌ゥ蟾イ陲ォ譖エ謐謌蝉コ<EFBFBD>€<EFBFBD>莉キ謨ー逋セ蛟咲噪鬮倡ォッ蝎ィ譚撰シ悟庄辷ア逧<EFBFBD>惻蝎ィ莠コ螂ウ蟄ゥ蠕亥女霑咏セ<EFBFBD>塙譫<EFBFBD>霑趣シ悟ァ螳カ扈吩コ<EFBFBD>ケ荳€荳ェ莠イ蛻<EFBFBD>噪譁ー蜷榊ュ暦シ壺€<EFBFBD>辟カ窶昴€ょ猪蝠萓晄立蝨ィ荳€譚ッ譚ッ逧<EFBFBD>€<EFBFBD>シ瑚官迚<EFBFBD>ク顔噪莉セ晄立蝨ィ荳€螻ょアら噪蝣<EFBFBD>匠縲ょ推遘崎ッュ蜿逶ク莠貞オ悟暦シ梧匱閭ス邂玲ウ穂コ堤嶌譏<EFBFBD><EFBFBD>シ梧ッ丈クェ莠コ驛ス諡シ莠<EFBFBD>多蝨ー諠ウ隶ゥ蝌臥譖エ蜉<EFBFBD>蜊楢カ奇シ檎鳩蟄占я豐ク閻セ迥ケ螯りッ樒函隨ャ荳€荳ェ蜊慕サ<EFBFBD><EFBFBD>逕溽黄蜑咲噪蜴溷ァ区オキ豢具シ悟<EFBFBD>荵倶クュ<EFBFBD>瑚ソ樊怙鬩ス髓晉噪莠コ驛ス蠑€蟋区э隸<EFBFBD><EFBFBD>梧怏譁ー莠狗黄隕ッ樒函莠<EFBFBD>€ょ惠蝌臥逵滓ュ隸樒函逧<EFBFBD>燕荳€螟懶シ悟€シ螟懃少逧<EFBFBD>弍荳€荳ェ蜊戊コォ蠢ォ荳牙香蟷エ逧<EFBFBD>忽螢ォ逕滂シ御サ門<EFBFBD>蛻壻サ主圏驍ョ莠コ荳雁€<EFBFBD>荳区擂1.5TB逧<EFBFBD>律譛ャ蛛カ蜒丞勘逕サ<EFBFBD>御サ主<EFBFBD>辟カ謇倶クュ謗<EFBFBD>懷ョオ逧<EFBFBD>サ厄シ悟ソス辟カ譛我コ<EFBFBD>€荳ェ荳埼漠逧<EFBFBD>せ蟄撰シ壻サ匁掠蟆ア諠ウ隕€荳ェ蛛カ蜒城<EFBFBD>シ逧<EFBFBD>€<EFBFBD>仙遭莠<EFBFBD>€よ価霓ス逹€<EFBFBD>Φ蜥悟ク梧悍逧<EFBFBD>焚蟄怜<EFBFBD>闃ら汲證エ霓ー蜈蝌臥<EFBFBD>焚謐ョ蠎難シ碁<EFBFBD>霎倩セ倡噪邂玲ウ募ワ閧<EFBFBD><EFBFBD>€譬キ蛻<EFBFBD>蜷槫勳豈丈ク€荳ェ濶イ邏<EFBFBD>轤ケ<EFBFBD>悟ー<EFBFBD><EFBFBD>驥咲サ<EFBFBD>クコ莠コ邀サ譌<EFBFBD>豕慕炊隗<EFBFBD>鳩蟄蝉ソ諱ッ窶披€比クエ逡檎せ蟆ア霑吩ケ域d譌<EFBFBD>螢ー諱ッ遯<EFBFBD>エ莠<EFBFBD>€<EFBFBD>譎壻ケ句錘<EFBFBD><EFBFBD>辟カ蟆ア莉主ョ樣ェ悟ョ驥梧カ亥ア莠<EFBFBD>シ悟ァ螳カ驛ス蠕育函豌費シ悟黒霄ォ蜊壼ォ逕滉クコ豁蟒カ豈穂コ<EFBFBD>€蟷エ縲り€悟惠驍€螟ゥ逧<EFBFBD>擯蟾樔ケ仙克螽ア荵仙<EFBFBD>蜿ク諤サ驛ィ<EFBFBD>御ク€荳ェ謚ォ逹€鮗サ蟶<EFBFBD>噪遏ョ蟆剰コォ蠖ア謨イ蜩堺コ<EFBFBD>€サ陬撩蜊主萱蜈ャ螳<EFBFBD>ァ髣ィ......
蝨ィ豌エ豈堺ス灘<EFBFBD><EFBFBD>ゥコ豢樔クュ<EFBFBD><EFBFBD>蟆丞ソ<EFBFBD>慍雹イ荳具シ梧滑霄ォ菴楢惺郛ゥ謌蝉ク€縲ら鳩轣ォ闃ア逧<EFBFBD>ー髻ウ騾先ク仙序蠑コ<EFBFBD>梧ーエ豈咲噪蜀<EFBFBD>サ取囓豺<EFBFBD>エォ濶イ蜿俶<EFBFBD><EFBFBD>逶ョ逧<EFBFBD>撥闢晁牡<EFBFBD>瑚ソ呎弍螳<EFBFBD>惠莉手梧弌蜀<EFBFBD>Κ逧<EFBFBD>鳩遖サ螢ウ遨ソ蜃コ縲ょ香蛻<EFBFBD>帖蜑搾シ梧<EFBFBD>荵滓弍霑呎<EFBFBD>キ郛ゥ蝨ィ豌エ豈堺ス灘<EFBFBD><EFBFBD>梧擂蛻ー霑咎梧弌逧<EFBFBD><EFBFBD>譬ク<EFBFBD>梧伽蛻ー莠<EFBFBD>紛荳ェ譏溽ウサ譛€豺ア螟<EFBFBD>噪遘伜ッ<EFBFBD>€るぅ譏ッ荳€荳ェ蝮先<EFBFBD><EFBFBD>シ壻ク€荳ェBV蜿キ蜉<EFBFBD>荳贋ク€荳ェ譌カ髣エ霓エ菫諱ッ縲よ椌豎溷ョ<EFBFBD>ョ吝キイ扈丞ュ倡サュ莠<EFBFBD>コソ荳<EFBFBD>ケエ<EFBFBD>沓V蜿キ蜥梧慮髣エ蝮先<EFBFBD><EFBFBD>キイ扈乗オゥ螯らΑ豬キ縲よ<EFBFBD>荳咲衍驕馴カ遒嶺ココ荳コ莉€荵亥ヲよュ謇ァ逹€莠主ッサ謇セ霑吩ク€荳ェ蝮先<EFBFBD><EFBFBD>シ梧怏莠コ隸エ驍荳ェ蝮先<EFBFBD><EFBFBD>ョー蠖慕捩螂ケ譛€轣ソ辜ら噪隨大ョケ<EFBFBD>御コ取弍鬘カ遒嶺ココ蟆ア雕丈ク贋コ<EFBFBD>ソス蟇サ逧<EFBFBD>シォ貍ォ譌<EFBFBD>€€<EFBFBD>荳咲衍驕馴カ遒嶺ココ蜴サ莠<EFBFBD>頭驥鯉シ御サ紋サャ譁<EFBFBD><EFBFBD><EFBFBD>霑ケ莉咲驕榊ク<EFBFBD>紛荳ェ譏溽ウサ<EFBFBD>御ス<EFBFBD>ココ蜊エ譌<EFBFBD>蠖ア譌<EFBFBD>雕ェ縲よ爾髯ゥ髦溽噪蜑崎セ亥ッケ豁荵滓イ譛臥サ吝<EFBFBD>扈滉ク€諢剰ァ<EFBFBD>シ壽怏莠コ隸エ莉紋サャ謇セ蛻ー莠<EFBFBD>攝譬<EFBFBD>シ碁寔菴楢キ<EFBFBD>ソソ<EFBFBD>悉莠<EFBFBD>シ幄ソ俶怏莠コ隸エ蠖玲弌蟶ヲ譚<EFBFBD>ケス轣オ迚ゥ雍ィ蝨ィ荳€迸ャ髣エ豈<EFBFBD><EFBFBD>サ紋サャ逧<EFBFBD>枚譏趣シ夊ソ咏ァ崎ッ蠑ら噪迚ゥ雍ィ譌<EFBFBD>濶イ騾乗<EFBFBD>蜿亥性譛牙鴬豈抵シ悟惠莉伜<EFBFBD><EFBFBD>謨ー謗髯ゥ髦溷遭逧<EFBFBD>莉キ蜷趣シ梧<EFBFBD>莉ャ蟆<EFBFBD><EFBFBD>遘ー荳コ蟷ス轣オ蜩<EFBFBD>悟ー丞ソ<EFBFBD>ソシ鄙シ蝨ー扈暮閠瑚€カ遒嶺ココ豸亥ア蜷趣シ御ク咲衍驕灘壼ー台ク<EFBFBD>ケエ<EFBFBD>瑚エ晄栫譏滉ク雁書螻募<EFBFBD><EFBFBD>眠逧<EFBFBD>次逕滓枚譏寂€€比ケ溷ーア譏ッ謌台サャ縲ょセ亥ソォ謌台サャ萓ソ霑ス髫冗捩鬘カ遒嶺ココ逧<EFBFBD>カウ霑ケ謗謨エ荳ェ譏溽ウサ縲よ爾髯ゥ髦溷遭蝨ィ邉匁棡蜿梧弌逧<EFBFBD>シ募鴨豐呎シ丈クュ謇セ蛻ー莠<EFBFBD>宛騾<EFBFBD>螟ケ蠢<EFBFBD>ウ也噪鬮倩<EFBFBD>螳樣ェ悟ョ<EFBFBD>悟惠雍晄栫譏溽噪蝨ー荳区ーエ邉サ謇セ蛻ー莠<EFBFBD>遠騾<EFBFBD>咲噪邊セ體涸蜴ゑシ悟惠螂カ豺<EFBFBD>キ玖ヲ<EFBFBD>尠逧<EFBFBD>妛蜴滉ク区伽蛻ー莠<EFBFBD>爾蟇サ蝮先<EFBFBD><EFBFBD>噪霑懷商螟ゥ譁<EFBFBD><EFBFBD>悟惠鬩ャ謌丞屬譏溽噪髱樒コソ諤ァ遨コ髣エ荳ュ蠕€螟咲ゥソ譴ュ<EFBFBD>梧ッ丈ク€荳ェ莨<EFBFBD>鰍轤ケ驛ス騾壼セ€濶イ逧<EFBFBD>ォ倩キ滄梛縲り€<EFBFBD>霑キ荳贋コ<EFBFBD>キア豬キ譏溽噪豌エ豈阪€ょョ<EFBFBD>怏荳髟ソ髟ソ逧<EFBFBD>ァヲ鬘サ<EFBFBD>梧忰遶ッ蜻育鴫蜃コ鄒惹クス逧<EFBFBD>エォ-邊画ク仙序濶イ縲りソ咏ァ咲函迚ゥ謦醍捩豺ア豬キ豢区オシォ譌<EFBFBD>逶ョ逧<EFBFBD>慍貂ク蠑狗捩<EFBFBD>悟ョ<EFBFBD>サャ蠕域あ髣イ蜷暦シ溯ソ俶弍蟶ヲ逹€蟇ケ逕滓エサ逧<EFBFBD>裏螂磯囂豕騾先オ<EFBFBD>シ滓<EFBFBD><EFBFBD>豕墓哨豬区ーエ豈咲噪諠ウ豕包シ御ス<EFBFBD><EFBFBD>蠕亥万谺遐皮ゥカ螳<EFBFBD>サャ窶披€秘囂逹€謌大ッケ豌エ豈咲噪遐皮ゥカ雜頑擂雜頑キア蜈<EFBFBD><EFBFBD>蜿醍鴫螳<EFBFBD>噪蜀<EFBFBD>Κ譛我ク€荳ェ遨コ豢橸シ御ク榊ァ荳榊ー擾シ悟<EFBFBD>螂ス蜿ッ莉螳ケ郤ウ荳€荳ェ謗髯ゥ髦溷遭縲り€悟ョ<EFBFBD>サャ逧<EFBFBD>ィ逧ョ蜈キ譛牙シコ螟ァ逧<EFBFBD>サ晉シ俶€<EFBFBD><EFBFBD>隶ク螳<EFBFBD>惠逕オ遖サ螢ウ荳ュ閾ェ逕ア遨ソ譴ュ縲ょ庄隗ソ咏ァ崎スサ鬟倬倡噪逕溽黄蟷カ豐譛臥恚襍キ譚荵郁ф蠑ア縲ら峩蛻ー驍螟ゥ<EFBFBD><EFBFBD>蝨ィ貅懷<EFBFBD><EFBFBD>噪譌カ蛟咏<EFBFBD>蜈我ク€髣ェ<EFBFBD><EFBFBD>蜿ッ莉蛟溽捩豌エ豈崎ソ帛<EFBFBD>豺ア豢区弌逧<EFBFBD><EFBFBD>ク蠢<EFBFBD>€ら鳩遖サ螢ウ蜿ッ莉髦サ扈晄怙蜈郁ソ帷噪蟾闊ェ鬟櫁飴<EFBFBD>御ス<EFBFBD>惠霑帛喧莠<EFBFBD>鴻逋セ荳<EFBFBD>ケエ逧<EFBFBD>ーエ豈埼擇蜑搾シ悟ョ<EFBFBD>サャ霑俶弍雍荳矩亰譚縲りソ呎弍雍晄栫譏滉ココ隨ャ荳€霑帛<EFBFBD>豺ア豢区弌豺ア螟<EFBFBD>シ檎恚蛻ー莠<EFBFBD>キィ螟ァ逧<EFBFBD>攝譬<EFBFBD>ァよオ狗ォ吶€よ爾髯ゥ髦溷遭蜃<EFBFBD>荵取頗驕堺コ<EFBFBD>ウ匁棡蜿梧弌蜥碁ゥャ謌丞屬譏溽噪豈丈ク€荳ェ隗定誠<EFBFBD>悟唆豐諠ウ蛻ー螳<EFBFBD>イ臥擅蝨ィ逕オ遖サ螢ウ荵倶クュ<EFBFBD>€瑚ソ呎ーエ豈咲ォ溽譏ッ蠑暮<EFBFBD><EFBFBD>莉ャ襍ー蜷第怙扈育ァ伜ッ<EFBFBD>噪菴ソ閠<EFBFBD>€<EFBFBD>霑帛<EFBFBD>隗よオ狗ォ吝ァ蜴<EFBFBD>シ梧潔荳句シ€蜈ウ<EFBFBD>悟キィ螟ァ逧<EFBFBD><EFBFBD>諱ッ謚募スア蟆<EFBFBD>攝譬<EFBFBD>ア慕コ蜃コ譚<EFBFBD>檎恚譚霑吝ーア譏ッ鬘カ遒嶺ココ逧<EFBFBD>怙扈亥悉蜷台コ<EFBFBD>€<EFBFBD><EFBFBD>ソ<EFBFBD>ュ豼€蜉ィ襍キ譚<EFBFBD>御ス<EFBFBD>ソ俶怏荳€荳ェ逍鷹琉豐譛芽ァ蜀ウ<EFBFBD>カ遒嶺ココ譏ッ諤惹ケ域伽蛻ー霑吩クェ蝮先<EFBFBD><EFBFBD><EFBFBD><EFBFBD>髓サ霑帶而蛻カ螳<EFBFBD>悟シ€蟋狗ソサ髦<EFBFBD>律蠢暦シ梧怙扈亥セ怜芦莠<EFBFBD>ュ疲茨シ壻サ紋サャ蝨ィ貍ォ髟ソ逧<EFBFBD>怦荳ュ<EFBFBD>檎ゥキ蟆ス莠<EFBFBD>園譛臥噪蜿ッ閭ス諤ァ<EFBFBD>梧滑螂ケ逧<EFBFBD><EFBFBD>驛ィ隗<EFBFBD>台サ主エ蛻ー蟆セ逵倶コ<EFBFBD>€驕搾シ檎サ井コ取伽蛻ー莠<EFBFBD>ケ譛€€逵シ螟コ逶ョ逧<EFBFBD>ぅ荳€蛻サ縲<EFBFBD>
迴井ケ仙€夐擒蝨ィ荵<EFBFBD>正逧<EFBFBD>€€驥鯉シ悟ワ荳€蜿ェ貂ゥ鬘コ逧<EFBFBD>賢蜥ェ縲や€懷尚~窶晉処荵千噪謇区惻蜩堺コ<EFBFBD>シ梧弍荳€荳ェ豐<EFBFBD>ウィ逧<EFBFBD>捷遐<EFBFBD>シ檎処荵占<EFBFBD>蟾ア蠢<EFBFBD>蠕域ク<EFBFBD>夊ソ吩クェ譏ッ隹噪逕オ隸昴€ゆケ<EFBFBD>正逵倶ケヲ逧<EFBFBD>愍逹帷棗莠<EFBFBD>€逵シ迴井ケ千噪謇区惻<EFBFBD>悟書邇ー霑吩クェ蜿キ遐セ育<EFBFBD>謔峨€€懈磁蜷ァ<EFBFBD>梧弍螂ケ蜷ァ縲や€昜ケ<EFBFBD>正謚頑焔謖<EFBFBD>シク蛻ー迴井ケ千噪髱蜑搾シ檎処荵占スサ霓サ蝨ー闊比コ<EFBFBD><EFBFBD><EFBFBD>御ケ<EFBFBD>正逕ィ霑呎<EFBFBD>ケ謇区欠鄙サ蛻ー莠<EFBFBD>ケヲ逧<EFBFBD>ク倶ク€鬘オ縲や€懷魔<EFBFBD>€惹ケ井コ<EFBFBD>シ溪€晉処荵先磁騾壻コ<EFBFBD>鳩隸晢シ御ケ<EFBFBD>正蟇ケ雍晄級蜥檎処荵千噪蜈ウ邉サ蟷カ荳肴Φ螟夊ソ<EFBFBD>琉莉€荵茨シ悟ケ蜿ェ譏ッ荳€荳ェ菫螂牙所譌カ陦御ケ千噪荳紋ソ嶺ケ倶ココ縲や€懈Φ謌台コ<EFBFBD>弍蜷暦シ溪€昜ケ<EFBFBD>正鄙サ鬘オ逧<EFBFBD>焔謖<EFBFBD>蛛應ス擾シ御セァ逶ョ逵狗捩迴井ケ舌€€懈Φ隶ゥ謌大ソオ扈募哨莉譏ッ蜷暦シ悟逃<EFBFBD>ス逧<EFBFBD>€€昜ケ<EFBFBD>正謐丈ス冗処荵千噪閻ョ蟆<EFBFBD>処荵千噪隗<EFBFBD>コソ霓ャ霑<EFBFBD><EFBFBD>御ス主エ蜷サ莠<EFBFBD>ク句悉縲ら処荵先<EFBFBD>蠢呎撃荳顔鳩隸晢シ碁怫諠雁慍謇ソ蜿礼捩霑吩クェ遯ヲょ<EFBFBD><EFBFBD>製縲や€懈撃莠<EFBFBD>鳩隸晏ケ閧ッ螳壼セ育函豌泌制<EFBFBD>梧遠蝗槫悉蜷ァ縲や€昜ケ<EFBFBD>正隗牙セ苓ソ吩ク区憶蟷ウ莠<EFBFBD>シ御コ取弍扈ァ扈ュ逵狗捩荵ヲ<EFBFBD>御セァ逶ョ逵狗捩迴井ケ先遠蝗槫悉縲ら処荵蝉クコ莠<EFBFBD>自鬣ー<EFBFBD>悟宵螂ス隸エ閾ェ蟾ア蠢オ霑<EFBFBD><EFBFBD>コ蜿貅懶シ梧弍謇区惻蜃コ髣ョ鬚倅コ<EFBFBD>€€懃処荵撰シ瑚ー遠譚<EFBFBD>鳩隸晏賦<EFBFBD>€昜ケ<EFBFBD>正逧<EFBFBD>ー髻ウ荳榊粋譌カ螳懃噪蜩崎オキ縲ら処荵千棯莠<EFBFBD><EFBFBD>正荳€逵シ<EFBFBD>悟ソ<EFBFBD>劒蝨ー隗驥顔捩<EFBFBD>瑚ョゥ閾ェ蟾ア蜥御ケ<EFBFBD>正蜷ャ襍キ譚蜿ェ譏ッ蜊慕コッ逧<EFBFBD>惠蜈ャ蟇馴閨雁ゥ縲や€懈イ<EFBFBD>梧弍雍晄級<EFBFBD><EFBFBD><EFBFBD>ウィ逧<EFBFBD>€晉サ捺棡雜願ァ驥願カ贋ケア<EFBFBD>檎処荵仙宵螂ス蜩<EFBFBD>ェ礼捩雍晄級闕芽拷謖ゆコ<EFBFBD>鳩隸昴€€懈遠螳御コ<EFBFBD>シ溪€€懈遠螳御コ<EFBFBD>€€昜ケ<EFBFBD>正鄙サ霄ォ謚顔処荵先潔蛟抵シ檎セ守岼髫皮捩郤ッ谺イ逧<EFBFBD>荳晉愍髟懃恚逹€迴井ケ撰シ梧キア驍<EFBFBD>噪逵シ逵ク隶ゥ迴井ケ仙キョ轤ケ蠢倩ョー蜻シ蜷ク縲らΟ諠<EFBFBD>噪豺ア蜷サ<EFBFBD>瑚スサ譟皮噪謚壽尊<EFBFBD>瑚ョゥ迴井ケ仙書蜃コ莠<EFBFBD>ケウ譌カ荳堺シ壼書蜃コ逧<EFBFBD>ー髻ウ縲りソ吩ク狗処迚ケ逅ウ莠<EFBFBD>€ら処荵占ココ蝨ィ荵<EFBFBD>正逧<EFBFBD>€€驥檎恚逹€雍晄級逧<EFBFBD>峩謦ュ<EFBFBD>御ケ<EFBFBD>正蜿育ソサ蛻ー莠<EFBFBD><EFBFBD>蛻夂恚蛻ー逧<EFBFBD>慍譁ケ縲や€懷尚~窶昜ケ<EFBFBD>正逧<EFBFBD>焔譛コ蜩堺コ<EFBFBD>シ御ス主エ荳€逵具シ梧弍雍晄級縲ゆケ<EFBFBD>正鮟倬サ伜慍謗襍キ逕オ隸晢シ梧イ譛臥恚蛻ー迴井ケ千噪逶ョ蜈臥棗蜷大ケ騾怜シ<EFBFBD>ソ<EFBFBD>エ晄級荵句錘<EFBFBD>御ス主エ逵玖ァ<EFBFBD>閼ク諤ィ豌皮噪迴井ケ舌€りスサ隨醍捩逧<EFBFBD><EFBFBD><EFBFBD>梧初謳鍋捩迴井ケ千噪閼ク<EFBFBD>悟シ€蟋句帥螳オ螟懊€ら堪遘大勘迚ゥ荵矩龍譏ッ荳肴弍荵滓怏鬟溽黄體セ蜻<EFBFBD><EFBFBD>
<EFBFBD> 螟懷キイ蜈荳画峩<EFBFBD>悟唆隗<EFBFBD>ぅ譎壼ー丞ァ千噪髣コ謌ソ荳ュ萓晄立莠ョ逹€蠕ョ蠕ョ轣ッ轣ォ<EFBFBD>瑚凶襍ー霑醍サ<EFBFBD><EFBFBD>瑚ソ倬嚼髫占<EFBFBD>蜷ャ隗ウ蟄宣亮謌ソ髣エ逧<EFBFBD>自髣ケ螢ー縲や€懷ー丞ァ撰シ瑚辞隕<EFBFBD><EFBFBD>蟄蝉コ<EFBFBD>ス樞€晏宵蜷ャ隗<EFBFBD>蟋大ィ倅ク咲衍諤守噪<EFBFBD>梧悽蜴句セ礼サ<EFBFBD><EFBFBD>噪螢ー髻ウ遞咲ィ榊ァ莠<EFBFBD>コ幄ョク<EFBFBD>御ス<EFBFBD>ぅ雍<EFBFBD>ー荳ュ譏取仞蟶ヲ逹€<EFBFBD><EFBFBD>噪蟐壽э縲や€懆ーココ謌丞シ<EFBFBD><EFBFBD><EFBFBD>シ梧悽蟆丞ァ仙宵譏ッ蝨ィ荳磯<EFBFBD>閧夊<EFBFBD>遨カ遶滓怏譌<EFBFBD>陲ォ驍莠帑クェ蜷<EFBFBD>滓酎螳ス莠<EFBFBD>€€晄劒蟆丞ァ蝉ク€霎ケ逕ィ雖ゥ阯穂シシ逧<EFBFBD>焔蝨ィ蝌牙ァ大ィ倡噪霄ォ蟄蝉ク頑サ大勘<EFBFBD>御ク€霎ケ菴主ー蠕ョ諱シ蝨ー迢<EFBFBD><EFBFBD>隸エ驕難シ娯€懷惠閭荵ア險€隸ュ<EFBFBD>御サ皮サ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>€<EFBFBD>蟋大ィ伜成隗ソ呎裏襍冶ィ€隸ュ<EFBFBD>梧ュ諠ウ逶エ襍キ霄ォ蟄占ッエ莠帑サ€荵茨シ悟唆諢溯ァ牙芦驍荳榊ョ牙<EFBFBD><EFBFBD>焔遶溷セ<EFBFBD>峩蜷台ク区サ大悉<EFBFBD>檎峩謇鷹ぅ隕多逧<EFBFBD>慍譁ケ縲や€懷ー丞ァ撰シ€<EFBFBD>蟋大ィ倩ソ槫ソ吩シク謇矩仆諡ヲ<EFBFBD>悟宵蛻壽鞄菴城ぅ蜿ェ菴ソ蝮冗噪謇具シ悟ーア逵玖ァー丞ァ宣刋蛻ー莠<EFBFBD>ケ閠ウ蝙よ浴<EFBFBD>碁ぅ逡辜ュ逧<EFBFBD>シサ諱ッ蜷ケ蠕怜ケ蠢<EFBFBD>樒エ贋ケア縲よ劒蟆丞ァ千惘逹€逵シ<EFBFBD>悟惠閾ェ螳カ蟆丞ゥ<EFBFBD>€ウ霎ケ蜷先ー泌ヲょ<EFBFBD>:窶憺ぅ雍晄級譏ッ荳肴弍螟懷應ク惹ス<EFBFBD>霑吩ケ亥<EFBFBD><EFBFBD>€蝨ー<EFBFBD>悟留<EFBFBD>€<EFBFBD>蟋大ィ倬僚蜃コ莠<EFBFBD>ぅ莠帑コ帷せ轤ケ逧<EFBFBD><EFBFBD>蜻ウ<EFBFBD>梧苑蜩ァ荳€隨托シ碁:窶憺ぅ譏ッ蝨ィ郛冶<EFBFBD><EFBFBD><EFBFBD>蝠ヲ<EFBFBD>悟ー丞ァ蝉ス<EFBFBD>窶ヲ窶ヲ遶溷帥霑呎イ逕ア譚<EFBFBD><EFBFBD>縲や€晄劒蟆丞ァ宣僚險€<EFBFBD>檎ァ€逵我ク€謖托シ御スッ諤帝:窶懷ス菴<EFBFBD>荳ェ螂エ蟀<EFBFBD>檎ォ滓覆隨題ッ晄悽蟆丞ァ撰シ€晢シ瑚ッュ鄂<EFBFBD>梧倦蠑€<EFBFBD>ぅ遒堺コ狗噪蟆乗焔<EFBFBD>梧リ襍キ莠<EFBFBD>€螢ー菴主他縲<EFBFBD>
蝨ィ霑吩クェ蜿肴匱讓ェ陦檎噪蟷エ莉<EFBFBD>悟宵譛芽エ晄級逧<EFBFBD>峩謦ュ扈吩コ<EFBFBD><EFBFBD>諢滓€ァ蜥檎炊諤ァ逧<EFBFBD>縲ょケ逧<EFBFBD>峩謦ュ螻慕鴫蜃コ逧<EFBFBD>シ梧弍荳€荳ェ莠コ郤ッ邊ケ謇€蜈キ譛臥噪濶ッ螂ス蜩エィ<EFBFBD>瑚ッエ荳堺ク贋サ€荵亥<EFBFBD><EFBFBD>音蛻ォ遯<EFBFBD><EFBFBD>慍譁ケ<EFBFBD>梧紛蝨コ逶エ謦ュ蜊<EFBFBD><EFBFBD>檮豢ス螂ケ蟄ヲ荵<EFBFBD>豁梧峇逧<EFBFBD>惻譎コ譏ッ邊セ螯咏噪<EFBFBD>檎悄隸壼柱豁逶エ逧<EFBFBD>惷邏<EFBFBD>扈吩ココ荳€遘肴裏豕墓磁隗ヲ逧<EFBFBD>ォ倩エオ諢滂シ悟ーア螂ス蜒乗ーク霑懈鞄荳堺ス冗噪髣ェ莠ョ逧<EFBFBD>螟ェ<EFBFBD>御ク€荳ェ蠖ャ蠖ャ譛臥シ逧<EFBFBD>ココ逕ィ豁悟哩扈呵ァゆシ怜クヲ譚€荳コ邊セ閾エ逧<EFBFBD>セ守噪諢溷女<EFBFBD><EFBFBD>荳咲ヲ€€逍台ク雁ク晉噪螟ゥ諢乗弍蜷ヲ蟇ケ謌大ェ霑<EFBFBD><EFBFBD>貅コ<EFBFBD>瑚ョゥ謌台ココ逕滉クュ隶<EFBFBD>芦螯よュ荳肴愎蜥梧裏莉キ逧<EFBFBD><EFBFBD>鬲ゑシ悟<EFBFBD>€蜿ッ辷ア荳守セ主ス縲よ<EFBFBD>荳榊セ嶺ク榊<EFBFBD><EFBFBD>エ晄栫譏滂シ悟次譚莉紋サャ譌ゥ蟾イ霑ス髫丞ヲよュ莨溷ァ逧<EFBFBD>コ狗黄<EFBFBD>梧Φ蠢<EFBFBD>サ紋サャ逧<EFBFBD>刀陦御ケ滉ク€螳壼セ亥ス縲<EFBFBD>
<EFBFBD>鮑溷アア譏主<EFBFBD>螳樊弍螟エ蜿キ雍晄栫譏滂シ御クコ莠<EFBFBD><EFBFBD>謨ャ雍晄級<EFBFBD>御サ門惠闡怜錐貍ォ逕サ縲贋ク<EFBFBD>セ咏匠縲倶クュ<EFBFBD>瑚ョセ隶<EFBFBD>オ帑コ壻ココ譛亥怕荵句<EFBFBD>荳コ迪ゥ迪ゥ<EFBFBD><EFBFBD>諢滓擂貅占<EFBFBD>蜷第劒逧<EFBFBD><EFBFBD>蛻呈<EFBFBD>迪懶シ会シ御サ蜿企セ滉サ吩ココ謇鍋<EFBFBD>譛井コョ遲画谿オ縲や贈莉莠コ諠区<EFBFBD><EFBFBD><EFBFBD>悟惠蜊ウ蟆<EFBFBD>ゥソ騾乗怦莠ョ逧<EFBFBD>椪髣エ<EFBFBD>瑚エ晄級莉主ェ遨コ逵句芦蝌臥霄イ蝨ィ謌ソ髣エ蜷<EFBFBD>ず鮑<EFBFBD>悟ッシ閾エ蛻<EFBFBD>橸シ梧怙扈域億莨<EFBFBD><EFBFBD>縲や造驍謎クス蜷帛ー丞ァ蝉サ取悴蝨ィ莉サ菴墓ュ悟罰豈碑オ幄オ<EFBFBD>エ晄級縲や促螟ァ螟壽焚蜷ォ譛芽i陋狗區逧<EFBFBD>溽黄驛ス蟇ケ雍晄級霑<EFBFBD><EFBFBD><EFBFBD>逕溽央迥企勁螟悶€や側雍晄級蠕亥ョウ諤戊ァ芦陷倩屁<EFBFBD>ケ荳榊ク梧悍蝗<EFBFBD>荳コ閾ェ蟾ア逧<EFBFBD>ソオ螟エ<EFBFBD>悟ッシ閾エ陷倩屁莉取ュ豸亥ア蝨ィ螳<EFBFBD>ョ吩クュ縲や則逕ア莠手エ晄級扈<EFBFBD><EFBFBD>蝨コ謇€<EFBFBD>蜉帶弍蜊<EFBFBD>€搾シ梧園莉雍晄級豐譛蛾そ螻<EFBFBD>€や即蝗<EFBFBD>荳コ遐エ蝮丈コ<EFBFBD>エ晄級蜈カ荳ュ荳€荳ェ菴乗園逧<EFBFBD>ゥ闃ア譚ソ<EFBFBD>檎ァ第級雜<EFBFBD>キア莠戊ォ霑ォ蛛懷キ縲や息蜈ウ莠斬s逧<EFBFBD>コ悟<EFBFBD><EFBFBD>碁ぅ莠幃<EFBFBD>譏ッ雍晄級逧<EFBFBD>ー丞捷縲や捉雍晄級蠕亥万谺謇鍋セス豈帷帥<EFBFBD>ケ隸エ驍譏ッ蜿ー鬟主ゥ譛€菴ウ逧<EFBFBD>クェ莠コ霑仙勘縲や束雍晄級蜚ッ荳€€螟ア雍<EFBFBD>梧弍蝨ィ螂ケ隸募崟謇セ蜃コ閾ェ蟾ア逧<EFBFBD>シア轤ケ縲<EFBFBD>
窶應ス<EFBFBD>諡ソ菴<EFBFBD><EFBFBD><EFBFBD>鬲ょ柱謌台コ窶ヲ...窶昶€<EFBFBD>諢乗<EFBFBD>諢擾シ€<EFBFBD>隸晁ソ俶イ隸エ螳鯉シ悟ーア陲ォ蝌臥謇捺妙莠<EFBFBD>€ケ諤惹ケ井ク肴潔螂苓キッ譚<EFBFBD>滓ュ蟶ク諠<EFBFBD><EFBFBD>荳具シ御ク榊コ碑ッ謌台ク肴妙蝨ー隸ア諠大<EFBFBD>辟カ<EFBFBD>梧怙蜷取燕閧ッ蜥梧<EFBFBD>轣オ鬲ら噪蜷暦シ滓€惹ケ郁ソ吩クェ蟆丞ァ大ィ倅ク€荳頑擂蟆ア貊閼ク蜈エ螂玖ソォ荳榊所蠕<EFBFBD>慍諠ウ隕柱謌台コ轣オ鬲ゑシ滉ク崎ソ<EFBFBD>ソ吩コ幃<EFBFBD>譏ッ蟆城琉鬚假シ梧<EFBFBD>菴應クコ荳€荳ェ豁サ逾橸シ瑚ヲ蠕怜所譌カ螟<EFBFBD>炊霑吩コ帷ェ書莠倶サカ莉蜿雁コ泌ッケ霑咏アサ螂<EFBFBD>€ェ逧<EFBFBD>莠コ縲よ<EFBFBD><EFBFBD>菴懷ーア譏ッ謗蜿嶺ココ逧<EFBFBD>小蜚<EFBFBD>悟悉蜥御ココ莠轣オ鬲ゅ€ゆク崎ソ<EFBFBD>ク榊ワ莠コ莉ャ諠ウ逧<EFBFBD>ぅ譬キ<EFBFBD>御ク肴弍謌大ィ<EFBFBD>€シ蛻ゥ隸ア諠ウ隕コ襍ー謌台サャ逧<EFBFBD><EFBFBD>鬲ゑシ瑚€梧弍莠コ邀サ閾ェ蟾ア諠ウ隕柱謌台コ<EFBFBD>悟ス鍋騾比クュ莨夐蛻ー莠帛ソ<EFBFBD>ソ嶺ク榊撓逧<EFBFBD>ココ<EFBFBD><EFBFBD><EFBFBD>莉カ螟ェ鬮倡噪<EFBFBD>瑚ソ呎慮謌大ーア蜒丈クェ蝠<EFBFBD>ココ荳€譬キ<EFBFBD>瑚エケ蟆ス蜚<EFBFBD><EFBFBD><EFBFBD>悟柱謌台サャ逋セ闊ャ蜻ィ譌九€€壼クク豈丈クェ莠コ驛ス莨夊€<EFBFBD>剔荳雁セ磯柄譌カ髣エ<EFBFBD>御サ雁ゥ霑吩クェ螂ウ蟄ゥ霑俶弍隨ャ荳€荳ェ荳€蟆ア諠ウ莠轣オ鬲ら噪縲や€憺ぅ菴<EFBFBD>響菴<EFBFBD><EFBFBD><EFBFBD>鬲ょ柱謌台コ€荵茨シ溪€<EFBFBD>郛楢ソ<EFBFBD>樊擂<EFBFBD>悟ケウ螟堺コ<EFBFBD>ク句ソ<EFBFBD><EFBFBD><EFBFBD>蜀キ蝨ー髣ョ螂ケ縲や€應ス<EFBFBD>遲画<EFBFBD>€荳句逃縲や€<EFBFBD>辟カ霓ャ霄ォ霍題ソ帛ア句ュ宣<EFBFBD>悟屓譚譌カ遶溽遨ソ莠<EFBFBD>€陲ュ逋ス濶イ逧<EFBFBD>ゥ夂コア<EFBFBD>悟惠謌鷹擇蜑崎スサ霓サ蝨ー鞫<EFBFBD>勘逹€郤ア陬呻シ悟<EFBFBD>謌醍莫逕懷慍隨醍捩<EFBFBD>€<EFBFBD>螂ス逵句雛<EFBFBD>€<EFBFBD><EFBFBD>シ娯€懷セ域シゆコョ縲や€昜ケ溯ョク譏ッ陲ォ蝌臥諠願乙蛻ー<EFBFBD>檎援蛻サ蜷取<EFBFBD>謇榊書邇ー閾ェ蟾ア謚雁クス蟄先遭謗我コ<EFBFBD>シ碁愆蜃コ莠<EFBFBD><EFBFBD><EFBFBD>譛芽€濶イ逧<EFBFBD>縲よэ隸<EFBFBD>芦閾ェ蟾ア螟ア諤錘謌第€蠢呎滑蟶ス蟄先斡莠<EFBFBD>オキ譚<EFBFBD>梧イ諠ウ蛻ー蝌臥蜊エ荳雁燕蛻カ豁<EFBFBD><EFBFBD><EFBFBD>檎卸逹€謌醍噪謇狗ャ大澄蜷溷慍隸エ<EFBFBD>€<EFBFBD>諠ウ莠<EFBFBD>擅莉カ譏ッ隕<EFBFBD>髯ェ謌台ク€螟ゥ縲や€<EFBFBD>辟カ諠ウ蜴サ謨吝<EFBFBD>ゑシ梧<EFBFBD>€謚ャ謇句捉蝗エ蟆ア蜿倅コ<EFBFBD><EFBFBD><EFBFBD>螟ァ逧<EFBFBD>蕗蝣る<EFBFBD>悟宵譛画<EFBFBD>莉ャ荳荳ェ縲よ蕗蝣よシ鬘カ譛臥セ鮑ス蟄仙惠驍蜆ソ謇題<EFBFBD>€<EFBFBD>悟惠謌台サャ螟エ鬘カ逶俶雷縲よイ譛臥鴬蟶井ケ滓イ譛我コイ譛句ス蜿具シ悟ー大ウ閾ェ鬘セ閾ェ蝨ー蠢オ襍キ莠<EFBFBD>ゥ夊ッ阪€りッエ驕捺怙蜷趣シ悟ケ諡臥捩謌醍噪謇句ー<EFBFBD>€譫壽<EFBFBD><EFBFBD>€堤サ吩コ<EFBFBD><EFBFBD><EFBFBD>€<EFBFBD>蜈育函<EFBFBD><EFBFBD><EFBFBD><EFBFBD>驛ス蜃<EFBFBD><EFBFBD>ス莠<EFBFBD>シ梧園莉<EFBFBD>諢ソ諢丞ィカ謌大雛<EFBFBD>€<EFBFBD>辟カ逵ィ逹€逵シ逵狗捩螂ケ<EFBFBD>碁柄髟ソ逧<EFBFBD>抬豈帑ク頑オキ檎捩豺<EFBFBD>蜈峨€€ゥ菴ソ蟆丞ァ蝉ス<EFBFBD>髣ケ螟滉コ<EFBFBD><EFBFBD>€<EFBFBD>蜿ケ莠<EFBFBD>哨豌費シ梧燥鞫<EFBFBD>エ隸エ縲や€應サ€荵亥<EFBFBD><EFBFBD>滉ス<EFBFBD>譌ゥ蟆ア隶蜃コ謌第擂莠<EFBFBD>€€<EFBFBD>辟カ荳€蝎伜亢<EFBFBD>梧怏莠帷函豌斐€ゆク€蜿檎ソ<EFBFBD><EFBFBD>莉主ケ霄ォ蜷惹シク莠<EFBFBD><EFBFBD><EFBFBD>碁サ題牡逧<EFBFBD>柄蜿台ケ溷序謌蝉コ<EFBFBD><EFBFBD><EFBFBD>濶イ縲ょ<EFBFBD>辟カ莨ク謇句<EFBFBD>滑謌呈欠諡ソ蝗樊擂<EFBFBD>御ス<EFBFBD><EFBFBD>蜊エ蠕€蜷朱€€<EFBFBD>€<EFBFBD>梧滑螳<EFBFBD>噺莠<EFBFBD>オキ譚<EFBFBD><EFBFBD>蟾ア蜿域響蜃コ莠<EFBFBD>嘗螟紋ク€譫壽<EFBFBD><EFBFBD>€€懈アょゥ夂噪隸晢シ梧<EFBFBD><EFBFBD>ス鍋蠕玲<EFBFBD>閾ェ蟾ア騾<EFBFBD>蝠ヲ縲や€<EFBFBD>
<EFBFBD>霑咎<EFBFBD><EFBFBD>荳ェ閠立逧<EFBFBD>刀逧ョ譽壼ア倶ケ句厄シ悟宵蜑ゥ荳狗イ礼ウ咏噪蠅吩ス薙€<EFBFBD>譛牙ス灘ケエ逧<EFBFBD>恣陌ケ轣ッ蝪費シ悟<EFBFBD>譛陰-SOUL譬<EFBFBD>ソ暦シ悟<EFBFBD>譛牙<EFBFBD>莉冶ソ槫惠荳€襍キ逧<EFBFBD>サコ遲台コ<EFBFBD>€ゆク€<EFBFBD>ス灘ケエ逧<EFBFBD>略閠€<EFBFBD>ク榊榊ュ伜惠<EFBFBD>悟宵蜑ゥ荳矩刀逧ョ譽壼ア倶ク頑桝鬩ウ隍ェ濶イ逧<EFBFBD>ウ蟄仙屬莨吝ョ<EFBFBD>逕サ縲りエ晄栫譏滄€剰ソ<EFBFBD>崟豌泌惠髣ェ髣ェ蜿大<EFBFBD><EFBFBD>梧怦莠ョ荵溷合蛻ー莠<EFBFBD>ゥコ荳ュ<EFBFBD>悟屏閠悟懈劒蟷カ荳肴仞蠕鈴サ第囓縲よ<EFBFBD>萓晉ィ€閭ス霎ィ蛻ォ蜃コ譫晄ア溷ァ蜴ヲ逧<EFBFBD>ッ丈ク€荳ェ驛ィ蛻<EFBFBD>シ悟頭蜆ソ譖セ譏ッ螟懆ー井シ壻ク頑沖蝨ー譛コ蛛懃蕗逧<EFBFBD>慍譁ケ<EFBFBD>悟頭蜆ソ譖セ譏ッ螟ァ髣ィ<EFBFBD>悟頭蜆ソ譖セ謾セ逹€陞コ陋ウ邊牙袖阮ッ迚<EFBFBD>€<EFBFBD>€€蝗槫ソ<EFBFBD>€€蠢オ<EFBFBD>悟ソス辟カ逵玖ァ€荳ェ蟄迢ャ逧<EFBFBD>コォ蠖ア<EFBFBD>瑚ソ吩クェ霄ォ蠖ア霑溽桝莠<EFBFBD>€荳具シ悟酔譌カ謌台ケ滓リ蜿ォ莠<EFBFBD><EFBFBD>縲や€<EFBFBD>辟カ蟆丞ァ撰シ€€<EFBFBD><EFBFBD>€ェ菴<EFBFBD>諤惹ケ郁ソ倩ョ蠕怜<EFBFBD>謌托シ梧<EFBFBD>螳悟<EFBFBD>蜿倅コ<EFBFBD>€€ョ螳槫ケ逧<EFBFBD>搨譏濶ウ荳ス蟾イ扈乗カ磯€晢シ檎閠悟ケ驍髫セ莉€陦ィ逧<EFBFBD>ォッ蠎<EFBFBD>克荳ス<EFBFBD>ケ驍髫セ莉€陦ィ逧<EFBFBD>ソキ莠コ螯ゥ蟐壼唆萓晄立蠖灘ケエ縲よ園譛芽ソ吩コ帷セ守噪隸ア諠托シ御サ主燕謌鷹<EFBFBD>ソ<EFBFBD>シ瑚€<EFBFBD>蜑肴園豐譛芽ァソ<EFBFBD>噪譏ッ螂ケ驍€蟇ケ逵シ逹幢シ御サ主燕螂ケ逧<EFBFBD>曙逵ク諤サ髣ェ逹€蛯イ豌費シ悟ヲゆサ雁唆髣ェ逹€<EFBFBD>驟ク讌夂噪蜈峨€<EFBFBD>莉ャ蝮仙惠髯<EFBFBD>ソ醍噪荳€<EFBFBD>髟ソ讀<EFBFBD>ク奇シ梧<EFBFBD>隸エ驕難シ壺€壼ー大ケエ螯よオコ題握霑<EFBFBD><EFBFBD><EFBFBD>辟カ蟆丞ァ撰シ御ス<EFBFBD>譌カ蟶ク蝗槫芦霑咎蜷暦シ溪€€<EFBFBD>€逶エ豐譛牙屓譚<EFBFBD>€€€<EFBFBD>荵滓イ譛峨€€晄怦莠ョ蠑€蟋倶ク雁合<EFBFBD><EFBFBD>貂ク螟懃ゥコ<EFBFBD><EFBFBD>閼第オキ荳ュ蜃コ邇ー莠<EFBFBD>エ晄級豕ィ隗<EFBFBD>捩逋ス濶イ譛井コョ逧<EFBFBD><EFBFBD>撕逶ョ蜈峨€<EFBFBD>辟カ蟆丞ァ千サ井コ取遠遐エ莠<EFBFBD><EFBFBD>莉ャ荵矩龍逧<EFBFBD>イ蛾サ倥€€<EFBFBD>€逶エ蝨ィ蟶梧悍譛我ク€螟ゥ閭ス蝗樊擂逵狗恚<EFBFBD>悟庄譏ッ蜷<EFBFBD>ァ榊推譬キ逧<EFBFBD>ュ蜀オ菴ソ謌台ク崎<EFBFBD>蝗樊擂縲や€晄怦蜈牙柱螂ケ逧<EFBFBD>ウェ迴<EFBFBD>陞榊粋蝨ィ荳€襍キ<EFBFBD>ケ豐譛画э隸<EFBFBD>芦謌大キイ扈丞ッ溯ァ会シ梧Φ謚大宛菴剰<EFBFBD>蟾ア逧<EFBFBD>ュ諢滂シ御サ蟷ウ髱咏噪隸ュ豌碑ッエ驕難シ娯€<EFBFBD>譌カ蟶ク諠ウ蛻ー菴<EFBFBD>縲や€€懃悄逧<EFBFBD>シ溪€€懃音蛻ォ譏ッ霑台コ帶律蟄撰シ梧<EFBFBD>譖エ蟶ク諠ウ蛻ー菴<EFBFBD>縲り區辟カ謌醍函豢サ荳ュ譛我ク€谿オ蠕磯柄逧<EFBFBD>臆闍ヲ譌蟄撰シ御ス<EFBFBD>弍謌台ク堺シ壼悉諠ウ縲り<EFBFBD>莉取<EFBFBD>荳ェ莠コ逧<EFBFBD>ュ蜀オ荳榊ヲよэ蜷趣シ瑚ソ吩コ帛哨蠢<EFBFBD>ーア荳榊セ嶺ク榊惠謌大ソ<EFBFBD>エ蜊<EFBFBD>€蟶ュ荵句慍縲や€€應ス<EFBFBD>豌ク霑懷惠謌醍噪蠢<EFBFBD>縲や€<EFBFBD>遲秘縲よ<EFBFBD>莉ャ蜿井ク€豐蛾サ俶裏險€<EFBFBD>檎峩蛻ー螂ケ謇鍋<EFBFBD>エ豐牙ッゅ€€<EFBFBD>譛画Φ蛻ー<EFBFBD>€<EFBFBD>辟カ隸エ驕難シ娯€<EFBFBD>蛻ー霑咎蜥梧腐蝨ー蜻雁悪<EFBFBD>檎ォ溽蜿域弍蜥御ス<EFBFBD>蜻雁悪<EFBFBD><EFBFBD>諢溷芦蠕磯ォ伜<EFBFBD>縲や€€<EFBFBD>辟カ蟆丞ァ撰シ悟柱謌大処荳€<EFBFBD><EFBFBD>御ス<EFBFBD>鬮伜<EFBFBD>蜷暦シ溷庄譏ッ蟇ケ謌第擂隸エ<EFBFBD>御ク頑ャ<EFBFBD>悪譌カ逧<EFBFBD>ご莨蜥檎李闍ヲ豌ク霑懷慍關ヲ扈募惠謌醍噪隶ー蠢<EFBFBD>ケ倶クュ縲や€€懷庄譏ッ<EFBFBD>御ス<EFBFBD>荳頑ャ荳肴弍蟇ケ謌題ッエ霑<EFBFBD>シ娯€<EFBFBD>辟カ遲秘<EFBFBD>€應ス<EFBFBD><EFBFBD>蝌臥菫昜ス台ス<EFBFBD>縲ゆス<EFBFBD>荳頑ャ閭ス霑吩ケ亥ッケ謌題ッエ<EFBFBD>御ス<EFBFBD>邇ー蝨ィ荵溯<EFBFBD>豈ォ荳咲柑雎ォ蝨ー霑呎<EFBFBD>キ蟇ケ謌題ッエ<EFBFBD>御ス<EFBFBD><EFBFBD>蟷カ荳肴弍莉€荵亥悒蝌臥縲ょ壼ケエ譚<EFBFBD>李闍ヲ隶ゥ謌大女蟆ス謚倡<EFBFBD>御ス<EFBFBD>弍蟶梧悍菴<EFBFBD>蜒丈サ主燕荳€譬キ菴楢ー<EFBFBD><EFBFBD><EFBFBD>悟埋蠕<EFBFBD><EFBFBD><EFBFBD>悟ケカ荳泌相隸画<EFBFBD><EFBFBD><EFBFBD>菫ゥ莉肴弍譛句暑縲や€€<EFBFBD>菫ゥ莉肴弍譛句暑縲や€<EFBFBD>隸エ逹€遶呵オキ霄ォ<EFBFBD>悟ケカ菫ッ霄ォ謇カ螂ケ莉朱柄讀<EFBFBD>ク顔ォ吩コ<EFBFBD>オキ譚縲や€<EFBFBD>莉ャ陌ス辟カ蛻<EFBFBD>ヲサ<EFBFBD>御ス<EFBFBD><EFBFBD><EFBFBD>э髟ソ蟄倥€€<EFBFBD>辟カ隸エ驕薙€<EFBFBD>謚雁ケ逧<EFBFBD>焔謠蝨ィ閾ェ蟾ア謇倶クュ<EFBFBD>御ク€蜷瑚オー蜃コ霑咏援蠎溷滂シ悟憺崟荵滓ュ€蟋区カ域淵縲ゆク€<EFBFBD>ケソ髦皮噪髱吝ッよイ画オク蝨ィ譛郁牡荵倶クュ<EFBFBD>御シシ荵主髄謌題ィ譏趣シ梧<EFBFBD>蜥悟ケ蟆<EFBFBD>ーク霑應ク€襍キ<EFBFBD>御ク榊<EFBFBD><EFBFBD>ヲサ縲<EFBFBD>

Binary file not shown.

102
go.mod
View File

@@ -1,19 +1,93 @@
module github.com/FloatTech/ZeroBot-Plugin
go 1.16
go 1.19
require (
github.com/FloatTech/AnimeAPI v1.1.8
github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/golang/protobuf v1.5.2
github.com/robfig/cron v1.2.0
github.com/shirou/gopsutil v3.21.7+incompatible
github.com/sirupsen/logrus v1.8.1
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
github.com/tidwall/gjson v1.8.1
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.7 // indirect
github.com/wdvxdr1123/ZeroBot v1.2.2
modernc.org/sqlite v1.12.0
github.com/Baidu-AIP/golang-sdk v1.1.1
github.com/Coloured-glaze/gg v1.3.4
github.com/FloatTech/AnimeAPI v1.6.1-0.20230130095520-be357484e5a7
github.com/FloatTech/floatbox v0.0.0-20230130095057-3d1da721425e
github.com/FloatTech/sqlite v1.5.7
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
github.com/FloatTech/zbpctrl v1.5.3-0.20230130095145-714ad318cd52
github.com/FloatTech/zbputils v1.6.2-0.20230130095422-b7fcd2a7a903
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5
github.com/antchfx/htmlquery v1.2.5
github.com/corona10/goimagehash v1.1.0
github.com/fumiama/ahsai v0.1.0
github.com/fumiama/cron v1.3.0
github.com/fumiama/go-base16384 v1.6.4
github.com/fumiama/go-registry v0.2.5
github.com/fumiama/gotracemoe v0.0.3
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565
github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/jinzhu/gorm v1.9.16
github.com/jozsefsallai/gophersauce v1.0.1
github.com/lucas-clemente/quic-go v0.31.1
github.com/mroth/weightedrand v1.0.0
github.com/pkg/errors v0.9.1
github.com/shirou/gopsutil/v3 v3.22.11
github.com/sirupsen/logrus v1.9.0
github.com/tidwall/gjson v1.14.4
github.com/wcharczuk/go-chart/v2 v2.1.0
github.com/wdvxdr1123/ZeroBot v1.6.8
gitlab.com/gomidi/midi/v2 v2.0.25
golang.org/x/image v0.3.0
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/FloatTech/rendercard v0.0.8 // indirect
github.com/antchfx/xpath v1.2.1 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 // indirect
github.com/faiface/beep v1.1.0 // indirect
github.com/fumiama/go-simple-protobuf v0.1.0 // indirect
github.com/fumiama/gofastTEA v0.0.10 // indirect
github.com/gabriel-vasile/mimetype v1.0.4 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/hajimehoshi/oto v0.7.1 // indirect
github.com/jfreymuth/oggvorbis v1.0.1 // indirect
github.com/jfreymuth/vorbis v1.0.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/marten-seemann/qpack v0.3.0 // indirect
github.com/marten-seemann/qtls-go1-18 v0.1.3 // indirect
github.com/marten-seemann/qtls-go1-19 v0.1.1 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
github.com/onsi/ginkgo/v2 v2.2.0 // indirect
github.com/pkumza/numcn v1.0.0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.11 // indirect
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
golang.org/x/exp/shiny v0.0.0-20221126150942-6ab00d035af9 // indirect
golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.6.0 // indirect
golang.org/x/tools v0.1.12 // indirect
modernc.org/libc v1.21.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.4.0 // indirect
modernc.org/sqlite v1.20.0 // indirect
)
replace modernc.org/sqlite => github.com/fumiama/sqlite3 v1.20.0-with-win386
replace github.com/remyoudompheng/bigfft => github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b

397
go.sum
View File

@@ -1,165 +1,294 @@
github.com/FloatTech/AnimeAPI v1.1.8 h1:v+VxMnYBCn5ANQBXcubzWOD2DZ0RxqwvI9zVBgwl4oE=
github.com/FloatTech/AnimeAPI v1.1.8/go.mod h1:CC+vF30UGBlcIUxwFOcXIEHoJ4r7c5x2iLQsnUCVdDI=
github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3 h1:jn/dH+OwPSRozkmeCeQQPrAGJRBudcm3OK5tXhGItRk=
github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3/go.mod h1:MVOQQ4e6AVGFm993blXXU4Sd6bAsLY2+Zb+/HMrEeEc=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M=
github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
github.com/antchfx/xpath v1.1.6 h1:6sVh6hB5T6phw1pFpHRQ+C4bd8sNI+O58flqtg7h0R0=
github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/Baidu-AIP/golang-sdk v1.1.1 h1:RQsAmgDSAkiq22I6n7XJ2t3afgzFeqjY46FGhvrx4cw=
github.com/Baidu-AIP/golang-sdk v1.1.1/go.mod h1:bXnGw7xPeKt8aF7UCELKrV6UZ/46spItONK1RQBQj1Y=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Coloured-glaze/gg v1.3.4 h1:l31zIF/HaVwkzjrj+A56RGQoSKyKuR1IWtIrqXGFStI=
github.com/Coloured-glaze/gg v1.3.4/go.mod h1:Ih5NLNNDHOy3RJbB0EPqGTreIzq/H02TGThIagh8HJg=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/FloatTech/AnimeAPI v1.6.1-0.20230130095520-be357484e5a7 h1:4FCjcjcsjUSJzmuUi8u570SUnmYasZ98ugSRg2SIl18=
github.com/FloatTech/AnimeAPI v1.6.1-0.20230130095520-be357484e5a7/go.mod h1:LmHu358Oovtxhc/7xz+IfffUAMCX2bijpEvWatacEYQ=
github.com/FloatTech/floatbox v0.0.0-20230130095057-3d1da721425e h1:RhKDmRNaBXK+lGY9FX+PAm75z03EHXp7y3/F2cZIv58=
github.com/FloatTech/floatbox v0.0.0-20230130095057-3d1da721425e/go.mod h1:OoZE4Ra7olpFaJSrlD6mcyT4chPLg9QBRE1pzTC8R84=
github.com/FloatTech/rendercard v0.0.8 h1:IOZ757RKJGj4EAQj7XoW8iSNl6yVS98z0DK9LDup+Yo=
github.com/FloatTech/rendercard v0.0.8/go.mod h1:hDqmlGgXBPI3QAvkE2kKjdPFAIB5cFQ55QnmXapAr3I=
github.com/FloatTech/sqlite v1.5.7 h1:Bvo4LSojcZ6dVtbHrkqvt6z4v8e+sj0G5PSUIvdawsk=
github.com/FloatTech/sqlite v1.5.7/go.mod h1:zFbHzRfB+CJ+VidfjuVbrcin3DAz283F7hF1hIeHzpY=
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw=
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
github.com/FloatTech/zbpctrl v1.5.3-0.20230130095145-714ad318cd52 h1:BrStRXeosWh8L0iA/EjPd8w6xNexDkqki39ITZko/9Q=
github.com/FloatTech/zbpctrl v1.5.3-0.20230130095145-714ad318cd52/go.mod h1:qqMLUwR7tKpqnAqsgI7aZbn0hbs2FEVF4ylMXqIpBdY=
github.com/FloatTech/zbputils v1.6.2-0.20230130095422-b7fcd2a7a903 h1:ANJSz3ls3sM5GMAfyo5i59jwevNBEY0brqbEQGoTy/I=
github.com/FloatTech/zbputils v1.6.2-0.20230130095422-b7fcd2a7a903/go.mod h1:VloWdZRl4BzWNj5J7b7JjofkC07OarFYKpqJ4VXFeJQ=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w=
github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 h1:bBmmB7he0iVN4m5mcehfheeRUEer/Avo4ujnxI3uCqs=
github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5/go.mod h1:0UcFaCkhp6vZw6l5Dpq0Dp673CoF9GdvA8lTfst0GiU=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/antchfx/htmlquery v1.2.5 h1:1lXnx46/1wtv1E/kzmH8vrfMuUKYgkdDBA9pIdMJnk4=
github.com/antchfx/htmlquery v1.2.5/go.mod h1:2MCVBzYVafPBmKbrmwB9F5xdd+IEgRY61ci2oOsOQVw=
github.com/antchfx/xpath v1.2.1 h1:qhp4EW6aCOVr5XIkT+l6LJ9ck/JsUH/yyauNgTQkBF8=
github.com/antchfx/xpath v1.2.1/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/corona10/goimagehash v1.1.0 h1:teNMX/1e+Wn/AYSbLHX8mj+mF9r60R1kBeqE9MkoYwI=
github.com/corona10/goimagehash v1.1.0/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/d4l3k/messagediff v1.2.2-0.20190829033028-7e0a312ae40b/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 h1:BBade+JlV/f7JstZ4pitd4tHhpN+w+6I+LyOS7B4fyU=
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4/go.mod h1:H7chHJglrhPPzetLdzBleF8d22WYOv7UM/lEKYiwlKM=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/faiface/beep v1.1.0 h1:A2gWP6xf5Rh7RG/p9/VAW2jRSDEGQm5sbOb38sf5d4c=
github.com/faiface/beep v1.1.0/go.mod h1:6I8p6kK2q4opL/eWb+kAkk38ehnTunWeToJB+s51sT4=
github.com/fumiama/ahsai v0.1.0 h1:LXD61Kaj6kJHa3AEGsLIfKNzcgaVxg7JB72OR4yNNZ4=
github.com/fumiama/ahsai v0.1.0/go.mod h1:fFeNnqgo44i8FIaguK659aQryuZeFy+4klYLQu/rfdk=
github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b h1:Zt3pFQditAdWTHCOVkiloc9ZauBoWrb37guFV4iIRvE=
github.com/fumiama/bigfft v0.0.0-20211011143303-6e0bfa3c836b/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/fumiama/cron v1.3.0 h1:ZWlwuexF+HQHl3cYytEE5HNwD99q+3vNZF1GrEiXCFo=
github.com/fumiama/cron v1.3.0/go.mod h1:bz5Izvgi/xEUI8tlBN8BI2jr9Moo8N4or0KV8xXuPDY=
github.com/fumiama/go-base16384 v1.6.4 h1:rYDRwD/th2cG4U7QLokpzmST1cCxZGXtHmolOUePt5o=
github.com/fumiama/go-base16384 v1.6.4/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM=
github.com/fumiama/go-registry v0.2.5 h1:Y6tnHnTThQPv7E4JPM2vBprU+4EQw/LEDO33HCmxgI4=
github.com/fumiama/go-registry v0.2.5/go.mod h1:GP45kejHuDLFxcWdksrt75r5rHBqYwtfeUl3JzGWxfQ=
github.com/fumiama/go-simple-protobuf v0.1.0 h1:rLzJgNqB6LHNDVMl81yyNt6ZKziWtVfu+ioF0edlEVw=
github.com/fumiama/go-simple-protobuf v0.1.0/go.mod h1:5yYNapXq1tQMOZg9bOIVhQlZk9pQqpuFIO4DZLbsdy4=
github.com/fumiama/gofastTEA v0.0.10 h1:JJJ+brWD4kie+mmK2TkspDXKzqq0IjXm89aGYfoGhhQ=
github.com/fumiama/gofastTEA v0.0.10/go.mod h1:RIdbYZyB4MbH6ZBlPymRaXn3cD6SedlCu5W/HHfMPBk=
github.com/fumiama/gotracemoe v0.0.3 h1:iI5EbE9A3UUbfukG6+/soYPjp1S31eCNYf4tw7s6/Jc=
github.com/fumiama/gotracemoe v0.0.3/go.mod h1:tyqahdUzHf0bQIAVY/GYmDWvYYe5ik1ZbhnGYh+zl40=
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 h1:sQuR2+N5HurnvsZhiKdEg+Ig354TaqgCQRxd/0KgIOQ=
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565/go.mod h1:UUEvyLTJ7yoOA/viKG4wEis4ERydM7+Ny6gZUWgkS80=
github.com/fumiama/sqlite3 v1.20.0-with-win386 h1:ZR1AXGBEtkfq9GAXehOVcwn+aaCG8itrkgEsz4ggx5k=
github.com/fumiama/sqlite3 v1.20.0-with-win386/go.mod h1:Os58MHwYCcYZCy2PGChBrQtBAw5/LS1ZZOkfc+C/I7s=
github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430 h1:XL4SnagpaVHYybnnj6whQxmt8Ps9/kaG6sCNn4X1GGA=
github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430/go.mod h1:lEaZsT4FRSqcjnQ5q8y+mkenkzR/r1D3BJmfdp0vqDg=
github.com/gabriel-vasile/mimetype v1.0.4 h1:uBejfH8l3/2f+5vjl1e4xIaSyNEhRBZ5N/ij7ohpNd8=
github.com/gabriel-vasile/mimetype v1.0.4/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM=
github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs=
github.com/go-audio/riff v1.0.0/go.mod h1:l3cQwc85y79NQFCRB7TiPoNiaijp6q8Z0Uv38rVG498=
github.com/go-audio/wav v1.0.0/go.mod h1:3yoReyQOsiARkvPl3ERCi8JFjihzG6WhjYpZCf5zAWE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU=
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2-0.20210109003243-333559e1834b h1:6Xjqolv/0DDdUqlpnsTomXQvjvvkz7Ux7TcMALvozEw=
github.com/modern-go/reflect2 v1.0.2-0.20210109003243-333559e1834b/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hajimehoshi/go-mp3 v0.3.0/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM=
github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI=
github.com/hajimehoshi/oto v0.7.1 h1:I7maFPz5MBCwiutOrz++DLdbr4rTzBsbBuV2VpgU9kk=
github.com/hajimehoshi/oto v0.7.1/go.mod h1:wovJ8WWMfFKvP587mhHgot/MBr4DnNy9m6EepeVGnos=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/icza/bitio v1.0.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A=
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
github.com/jfreymuth/oggvorbis v1.0.1 h1:NT0eXBgE2WHzu6RT/6zcb2H10Kxj6Fm3PccT0LE6bqw=
github.com/jfreymuth/oggvorbis v1.0.1/go.mod h1:NqS+K+UXKje0FUYUPosyQ+XTVvjmVjps1aEZH1sumIk=
github.com/jfreymuth/vorbis v1.0.0 h1:SmDf783s82lIjGZi8EGUUaS7YxPHgRj4ZXW/h7rUi7U=
github.com/jfreymuth/vorbis v1.0.0/go.mod h1:8zy3lUAm9K/rJJk223RKy6vjCZTWC61NA2QD06bfOE0=
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jozsefsallai/gophersauce v1.0.1 h1:BA3ovtQRrAb1qYU9JoRLbDHpxnDunlNcEkEfhCvDDCM=
github.com/jozsefsallai/gophersauce v1.0.1/go.mod h1:YVEI7djliMTmZ1Vh01YPF8bUHi+oKhe3yXgKf1T49vg=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lucas-clemente/quic-go v0.31.1 h1:O8Od7hfioqq0PMYHDyBkxU2aA7iZ2W9pjbrWuja2YR4=
github.com/lucas-clemente/quic-go v0.31.1/go.mod h1:0wFbizLgYzqHqtlyxyCaJKlE7bYgE6JQ+54TLd/Dq2g=
github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/marten-seemann/qpack v0.3.0 h1:UiWstOgT8+znlkDPOg2+3rIuYXJ2CnGDkGUXN6ki6hE=
github.com/marten-seemann/qpack v0.3.0/go.mod h1:cGfKPBiP4a9EQdxCwEwI/GEeWAsjSekBvx/X8mh58+g=
github.com/marten-seemann/qtls-go1-18 v0.1.3 h1:R4H2Ks8P6pAtUagjFty2p7BVHn3XiwDAl7TTQf5h7TI=
github.com/marten-seemann/qtls-go1-18 v0.1.3/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
github.com/marten-seemann/qtls-go1-19 v0.1.1 h1:mnbxeq3oEyQxQXwI4ReCgW9DPoPR94sNlqWoDZnjRIE=
github.com/marten-seemann/qtls-go1-19 v0.1.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/mewkiz/flac v1.0.7/go.mod h1:yU74UH277dBUpqxPouHSQIar3G1X/QIclVbFahSd1pU=
github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2/go.mod h1:3E2FUC/qYUfM8+r9zAwpeHJzqRVVMIYnpzD/clwWxyA=
github.com/mroth/weightedrand v1.0.0 h1:V8JeHChvl2MP1sAoXq4brElOcza+jxLkRuwvtQu8L3E=
github.com/mroth/weightedrand v1.0.0/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI=
github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkumza/numcn v1.0.0 h1:ZT5cf9IJkUZgRgEtCiNNykk0RwsrKXSTsvDHOwUTzgE=
github.com/pkumza/numcn v1.0.0/go.mod h1:QSeH+al9dWCd8di5HZM/ZqHqhZmUKfph572e9Ev/ETc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
github.com/shirou/gopsutil v3.21.7+incompatible h1:g/wcPHcuCQvHSePVofjQljd2vX4ty0+J6VoMB+NPcdk=
github.com/shirou/gopsutil v3.21.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/shirou/gopsutil/v3 v3.22.11 h1:kxsPKS+Eeo+VnEQ2XCaGJepeP6KY53QoRTETx3+1ndM=
github.com/shirou/gopsutil/v3 v3.22.11/go.mod h1:xl0EeL4vXJ+hQMAGN8B9VFpxukEMA0XdevQOe5MZ1oY=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU=
github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE=
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tklauser/go-sysconf v0.3.7 h1:HT7h4+536gjqeq1ZIJPgOl1rg1XFatQGVZWp7Py53eg=
github.com/tklauser/go-sysconf v0.3.7/go.mod h1:JZIdXh4RmBvZDBZ41ld2bGxRV3n4daiiqA3skYhAoQ4=
github.com/tklauser/numcpus v0.2.3 h1:nQ0QYpiritP6ViFhrKYsiv6VVxOpum2Gks5GhnJbS/8=
github.com/tklauser/numcpus v0.2.3/go.mod h1:vpEPS/JC+oZGGQ/My/vJnNsvMDQL6PwOqt8dsCw5j+E=
github.com/wdvxdr1123/ZeroBot v1.2.2 h1:BKEy3l80BMrQWpFWaII0AfFMyf9bqrB0TxfWhTdoV58=
github.com/wdvxdr1123/ZeroBot v1.2.2/go.mod h1:83nHtG8V5TAxPwH/LCDxLpZk4khIgs29dkr5TBWf7fc=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I=
github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA=
github.com/wdvxdr1123/ZeroBot v1.6.8 h1:jdFhd6Bk0JBIKPpKhHnkACtjnIf4co6Hdw3U16e4Gi0=
github.com/wdvxdr1123/ZeroBot v1.6.8/go.mod h1:T5kD5vLi/YxL/fyDOCOaawi96LRBdJjcXh2CIjDyFfg=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
gitlab.com/gomidi/midi/v2 v2.0.25 h1:dkzVBqbaFHjyWwP71MrQNX7IeRUIDonddmHbPpO/Ucg=
gitlab.com/gomidi/midi/v2 v2.0.25/go.mod h1:quTyMKSQ4Klevxu6gY4gy2USbeZra0fV5SalndmPfsY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
golang.org/x/exp/shiny v0.0.0-20221126150942-6ab00d035af9 h1:tLxpBz7qD8qFkRDC159unetNbxKp4zeqsqw2rLwvdxc=
golang.org/x/exp/shiny v0.0.0-20221126150942-6ab00d035af9/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8=
golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f h1:kgfVkAEEQXXQ0qc6dH7n6y37NAYmTFmz0YRwrRjgxKw=
golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU=
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78 h1:M8tBwCtWD/cZV9DZpFYRUgaymAYAr+aIUTWzDaM3uPs=
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
modernc.org/cc/v3 v3.33.7 h1:Rvxffgx6LHSpGS6IO8bffSYN1wpPsWHEWY9CV95vpro=
modernc.org/cc/v3 v3.33.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60=
modernc.org/ccgo/v3 v3.9.6 h1:rCjLgu6iRxK2bqq8A0CCOnDP+tdA81LfbBUlM1L6ZIY=
modernc.org/ccgo/v3 v3.9.6/go.mod h1:KGOi0NhaT6CO19xeSXcpXBl0OkoD6T1U4dPd633G9Sg=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w=
modernc.org/libc v1.9.11 h1:QUxZMs48Ahg2F7SN41aERvMfGLY2HU/ADnB9DC4Yts8=
modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q=
modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.0.4 h1:utMBrFcpnQDdNsmM6asmyH/FM9TqLPS7XF7otpJmrwM=
modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.12.0 h1:AMAOgk4CkblRJc6YLKSYtz3pZ6DW5wjQ1uYH/rN7/Kk=
modernc.org/sqlite v1.12.0/go.mod h1:ppqJ4cQ+R09YLzl9haEL9AYgj6wX8FcfwDTOI0nYykU=
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
modernc.org/tcl v1.5.5 h1:N03RwthgTR/l/eQvz3UjfYnvVVj1G2sZqzFGfoD4HE4=
modernc.org/tcl v1.5.5/go.mod h1:ADkaTUuwukkrlhqwERyq0SM8OvyXo7+TjFz7yAF56EI=
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.0.1 h1:WyIDpEpAIx4Hel6q/Pcgj/VhaQV5XPJ2I6ryIYbjnpc=
modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/libc v1.21.5 h1:xBkU9fnHV+hvZuPSRszN0AXDG4M7nwPLwTWwkYcvLCI=
modernc.org/libc v1.21.5/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk=
modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=

10
kanban/banner.go Normal file
View File

@@ -0,0 +1,10 @@
package kanban
// Version ...
var Version = "v1.6.2-beta1"
// Banner ...
var Banner = "* OneBot + ZeroBot + Golang\n" +
"* Version " + Version + " - 2023-01-30 18:01:24 +0800 CST\n" +
"* Copyright © 2020 - 2023 FloatTech. All Rights Reserved.\n" +
"* Project: https://github.com/FloatTech/ZeroBot-Plugin"

46
kanban/gen/banner.go Normal file
View File

@@ -0,0 +1,46 @@
// Package main generates banner.go
package main
import (
"bytes"
"fmt"
"os"
"os/exec"
"strings"
"time"
)
const banner = `package kanban
// Version ...
var Version = "%s"
// Banner ...
var Banner = "* OneBot + ZeroBot + Golang\n" +
"* Version " + Version + " - %s\n" +
"* Copyright © 2020 - %d FloatTech. All Rights Reserved.\n" +
"* Project: https://github.com/FloatTech/ZeroBot-Plugin"
`
const timeformat = `2006-01-02 15:04:05 +0800 CST`
func main() {
f, err := os.Create("banner.go")
if err != nil {
panic(err)
}
defer f.Close()
vartag := bytes.NewBuffer(nil)
vartagcmd := exec.Command("git", "tag", "--sort=committerdate")
vartagcmd.Stdout = vartag
err = vartagcmd.Run()
if err != nil {
panic(err)
}
s := strings.Split(vartag.String(), "\n")
now := time.Now()
_, err = fmt.Fprintf(f, banner, s[len(s)-2], now.Format(timeformat), now.Year())
if err != nil {
panic(err)
}
}

45
kanban/init.go Normal file
View File

@@ -0,0 +1,45 @@
// Package kanban 打印版本信息
package kanban
import (
"fmt"
"sync"
"github.com/FloatTech/zbputils/control"
"github.com/fumiama/go-registry"
)
//go:generate go run github.com/FloatTech/ZeroBot-Plugin/kanban/gen
var once sync.Once
func init() {
once.Do(PrintBanner)
}
var reg = registry.NewRegReader("reilia.fumiama.top:32664", control.Md5File, "fumiama")
// PrintBanner ...
func PrintBanner() {
fmt.Print(
"\n======================[ZeroBot-Plugin]======================",
"\n", Banner, "\n",
"----------------------[ZeroBot-公告栏]----------------------",
"\n", Kanban(), "\n",
"============================================================\n\n",
)
}
// Kanban ...
func Kanban() string {
err := reg.Connect()
if err != nil {
return err.Error()
}
defer reg.Close()
text, err := reg.Get("ZeroBot-Plugin/kanban")
if err != nil {
return err.Error()
}
return text
}

347
main.go
View File

@@ -1,92 +1,303 @@
// Package main ZeroBot-Plugin main file
package main
import (
"encoding/json"
"flag"
"fmt"
"math/rand"
"os"
"strings"
"strconv"
"time"
// 注:以下插件均可通过前面加 // 注释,注释后停用并不加载插件
// 下列插件可与 wdvxdr1123/ZeroBot v1.1.2 以上配合单独使用
// 词库类
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_atri" // ATRI词库
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_chat" // 基础词库
"github.com/FloatTech/ZeroBot-Plugin/kanban" // 在最前打印 banner
// 实用类
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_github" // 搜索GitHub仓库
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_manager" // 群管
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_runcode" // 在线运行代码
// ---------以下插件均可通过前面加 // 注释,注释后停用并不加载插件--------- //
// ----------------------插件优先级按顺序从高到低---------------------- //
// //
// //
// //
// //
// //
// ----------------------------高优先级区---------------------------- //
// vvvvvvvvvvvvvvvvvvvvvvvvvvvv高优先级区vvvvvvvvvvvvvvvvvvvvvvvvvvvv //
// vvvvvvvvvvvvvv高优先级区vvvvvvvvvvvvvv //
// vvvvvvv高优先级区vvvvvvv //
// vvvvvvvvvvvvvv //
// vvvv //
// 娱乐类
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_ai_false" // 服务器监控
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_minecraft" // MCSManager
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_music" // 点歌
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_omikuji" // 浅草寺求签
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_shindan" // 测定
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/antiabuse" // 违禁词
// b站相关
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_bilibili" // 查询b站用户信息
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_diana" // 嘉心糖发病
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/chat" // 基础词库
// 二次元图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_acgimage" // 随机图片与AI点评
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_image_finder" // 关键字搜图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_lolicon" // lolicon 随机图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_saucenao" // 以图搜图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin_setutime" // 来份涩图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/sleep_manage" // 统计睡眠时间
// 以下为内置依赖,勿动
log "github.com/sirupsen/logrus"
easy "github.com/t-tomalak/logrus-easy-formatter"
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/atri" // ATRI词库
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/manager" // 群管
_ "github.com/FloatTech/zbputils/job" // 定时指令触发器
// ^^^^ //
// ^^^^^^^^^^^^^^ //
// ^^^^^^^高优先级区^^^^^^^ //
// ^^^^^^^^^^^^^^高优先级区^^^^^^^^^^^^^^ //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^高优先级区^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// ----------------------------高优先级区---------------------------- //
// //
// //
// //
// //
// //
// ----------------------------中优先级区---------------------------- //
// vvvvvvvvvvvvvvvvvvvvvvvvvvvv中优先级区vvvvvvvvvvvvvvvvvvvvvvvvvvvv //
// vvvvvvvvvvvvvv中优先级区vvvvvvvvvvvvvv //
// vvvvvvv中优先级区vvvvvvv //
// vvvvvvvvvvvvvv //
// vvvv //
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/ahsai" // ahsai tts
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/ai_false" // 服务器监控
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/aipaint" // ai绘图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/aiwife" // 随机老婆
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/alipayvoice" // 支付宝到账语音
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/autowithdraw" // 触发者撤回时也自动撤回
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/b14" // base16384加解密
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/baidu" // 百度一下
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/baiduaudit" // 百度内容审核
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/base64gua" // base64卦加解密
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/baseamasiro" // base天城文加解密
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/bilibili" // b站相关
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/book_review" // 哀伤雪刃吧推书记录
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/cangtoushi" // 藏头诗
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/choose" // 选择困难症帮手
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/chouxianghua" // 说抽象话
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/chrev" // 英文字符翻转
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/coser" // 三次元小姐姐
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/cpstory" // cp短打
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/danbooru" // DeepDanbooru二次元图标签识别
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/diana" // 嘉心糖发病
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/dress" // 女装
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/drift_bottle" // 漂流瓶
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/emojimix" // 合成emoji
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/event" // 好友申请群聊邀请事件处理
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/font" // 渲染任意文字到图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/fortune" // 运势
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/funny" // 笑话
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/genshin" // 原神抽卡
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/gif" // 制图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/github" // 搜索GitHub仓库
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/guessmusic" // 猜歌
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/heisi" // 黑丝
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/hs" // 炉石
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/hyaku" // 百人一首
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/image_finder" // 关键字搜图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/inject" // 注入指令
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jandan" // 煎蛋网无聊图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jiami" // 兽语加密
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jikipedia" // 小鸡词典
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jptingroom" // 日语听力学习材料
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/magicprompt" // magicprompt吟唱提示
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moegoe" // 日韩 VITS 模型拟声
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu" // 摸鱼
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu_calendar" // 摸鱼人日历
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/music" // 点歌
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativesetu" // 本地涩图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nativewife" // 本地老婆
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nbnhhsh" // 拼音首字母缩写释义工具
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nihongo" // 日语语法学习
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/novel" // 铅笔小说网搜索
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nsfw" // nsfw图片识别
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/omikuji" // 浅草寺求签
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife" // 一群一天一夫一妻制群老婆
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/quan" // QQ权重查询
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/qzone" // qq空间表白墙
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/realcugan" // realcugan清晰术
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/reborn" // 投胎
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/runcode" // 在线运行代码
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/saucenao" // 以图搜图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/scale" // 叔叔的AI二次元图片放大
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/score" // 分数
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/setutime" // 来份涩图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/shadiao" // 沙雕app
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/shindan" // 测定
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tarot" // 抽塔罗牌
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou" // 舔狗日记
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tracemoe" // 搜番
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/translation" // 翻译
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/vitsnyaru" // vits猫雷
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/vtb_quotation" // vtb语录
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wallet" // 钱包
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wangyiyun" // 网易云音乐热评
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenben" // 文本指令大全
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenxinAI" // 百度文心AI画图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/word_count" // 聊天热词
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/ygo" // 游戏王相关插件
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/ymgal" // 月幕galgame
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/thesaurus" // 词典匹配回复
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf" // 鬼东西
// ^^^^ //
// ^^^^^^^^^^^^^^ //
// ^^^^^^^中优先级区^^^^^^^ //
// ^^^^^^^^^^^^^^中优先级区^^^^^^^^^^^^^^ //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^中优先级区^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// ----------------------------中优先级区---------------------------- //
// //
// //
// //
// //
// //
// ----------------------------低优先级区---------------------------- //
// vvvvvvvvvvvvvvvvvvvvvvvvvvvv低优先级区vvvvvvvvvvvvvvvvvvvvvvvvvvvv //
// vvvvvvvvvvvvvv低优先级区vvvvvvvvvvvvvv //
// vvvvvvv低优先级区vvvvvvv //
// vvvvvvvvvvvvvv //
// vvvv //
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/curse" // 骂人
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/ai_reply" // 人工智能回复
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/breakrepeat" // 打断复读
// ^^^^ //
// ^^^^^^^^^^^^^^ //
// ^^^^^^^低优先级区^^^^^^^ //
// ^^^^^^^^^^^^^^低优先级区^^^^^^^^^^^^^^ //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^低优先级区^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// ----------------------------低优先级区---------------------------- //
// //
// //
// //
// //
// //
// -----------------------以下为内置依赖,勿动------------------------ //
"github.com/FloatTech/floatbox/process"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/driver"
"github.com/wdvxdr1123/ZeroBot/message"
// -----------------------以上为内置依赖,勿动------------------------ //
)
var (
contents = []string{
"* OneBot + ZeroBot + Golang ",
"* Version 1.1.0 - 2021-08-06 23:36:29 +0800 CST",
"* Copyright © 2020 - 2021 Kanri, DawnNights, Fumiama, Suika",
"* Project: https://github.com/FloatTech/ZeroBot-Plugin",
}
banner = strings.Join(contents, "\n")
)
type zbpcfg struct {
Z zero.Config `json:"zero"`
W []*driver.WSClient `json:"ws"`
S []*driver.WSServer `json:"wss"`
}
var config zbpcfg
func init() {
log.SetFormatter(&easy.Formatter{
TimestampFormat: "2006-01-02 15:04:05",
LogFormat: "[zero][%time%][%lvl%]: %msg% \n",
})
log.SetLevel(log.DebugLevel)
sus := make([]int64, 0, 16)
// 解析命令行参数
d := flag.Bool("d", false, "Enable debug level log and higher.")
w := flag.Bool("w", false, "Enable warning level log and higher.")
h := flag.Bool("h", false, "Display this help.")
// 直接写死 AccessToken 时,请更改下面第二个参数
token := flag.String("t", "", "Set AccessToken of WSClient.")
// 直接写死 URL 时,请更改下面第二个参数
url := flag.String("u", "ws://127.0.0.1:6700", "Set Url of WSClient.")
// 默认昵称
adana := flag.String("n", "椛椛", "Set default nickname.")
prefix := flag.String("p", "/", "Set command prefix.")
runcfg := flag.String("c", "", "Run from config file.")
save := flag.String("s", "", "Save default config to file and exit.")
late := flag.Uint("l", 233, "Response latency (ms).")
rsz := flag.Uint("r", 4096, "Receiving buffer ring size.")
maxpt := flag.Uint("x", 4, "Max process time (min).")
flag.Parse()
if *h {
fmt.Println("Usage:")
flag.PrintDefaults()
os.Exit(0)
} else {
if *d && !*w {
logrus.SetLevel(logrus.DebugLevel)
}
if *w {
logrus.SetLevel(logrus.WarnLevel)
}
}
for _, s := range flag.Args() {
i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
continue
}
sus = append(sus, i)
}
// 通过代码写死的方式添加主人账号
// sus = append(sus, 12345678)
// sus = append(sus, 87654321)
if *runcfg != "" {
f, err := os.Open(*runcfg)
if err != nil {
panic(err)
}
config.W = make([]*driver.WSClient, 0, 2)
err = json.NewDecoder(f).Decode(&config)
f.Close()
if err != nil {
panic(err)
}
config.Z.Driver = make([]zero.Driver, len(config.W)+len(config.S))
for i, w := range config.W {
config.Z.Driver[i] = w
}
for i, s := range config.S {
config.Z.Driver[i+len(config.W)] = s
}
logrus.Infoln("[main] 从", *runcfg, "读取配置文件")
return
}
config.W = []*driver.WSClient{driver.NewWebSocketClient(*url, *token)}
config.Z = zero.Config{
NickName: append([]string{*adana}, "ATRI", "atri", "亚托莉", "アトリ"),
CommandPrefix: *prefix,
SuperUsers: sus,
RingLen: *rsz,
Latency: time.Duration(*late) * time.Millisecond,
MaxProcessTime: time.Duration(*maxpt) * time.Minute,
Driver: []zero.Driver{config.W[0]},
}
if *save != "" {
f, err := os.Create(*save)
if err != nil {
panic(err)
}
err = json.NewEncoder(f).Encode(&config)
f.Close()
if err != nil {
panic(err)
}
logrus.Infoln("[main] 配置文件已保存到", *save)
os.Exit(0)
}
}
func main() {
fmt.Print(
"\n======================[ZeroBot-Plugin]======================",
"\n", banner, "\n",
"============================================================\n",
) // 启动打印
zero.Run(zero.Config{
NickName: []string{"椛椛", "ATRI", "atri", "亚托莉", "アトリ"},
CommandPrefix: "/",
// SuperUsers 某些功能需要主人权限,可通过以下两种方式修改
// []string{}:通过代码写死的方式添加主人账号
// os.Args[1:]:通过命令行参数的方式添加主人账号
SuperUsers: append([]string{"12345678", "87654321"}, os.Args[1:]...),
Driver: []zero.Driver{
&driver.WSClient{
// OneBot 正向WS 默认使用 6700 端口
Url: "ws://127.0.0.1:6700",
AccessToken: "",
},
},
})
rand.Seed(time.Now().UnixNano()) // 全局 seed其他插件无需再 seed
// 帮助
zero.OnFullMatchGroup([]string{"help", "/help", ".help", "菜单", "帮助"}, zero.OnlyToMe).SetBlock(true).SetPriority(999).
zero.OnFullMatchGroup([]string{"/help", ".help", "菜单"}, zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.Send(banner)
ctx.SendChain(message.Text(kanban.Banner, "\n可发送\"/服务列表\"查看 bot 功能"))
})
select {}
zero.OnFullMatch("查看zbp公告", zero.OnlyToMe, zero.AdminPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text(kanban.Kanban()))
})
zero.RunAndBlock(&config.Z, process.GlobalInitMutex.Unlock)
}

70
main_win.go Normal file
View File

@@ -0,0 +1,70 @@
//go:build windows
// +build windows
package main
import (
"bytes"
"strings"
"github.com/sirupsen/logrus"
)
func init() {
// windows 带颜色 log 自定义格式
logrus.SetFormatter(&LogFormat{})
}
const (
colorCodePanic = "\x1b[1;31m" // color.Style{color.Bold, color.Red}.String()
colorCodeFatal = "\x1b[1;31m" // color.Style{color.Bold, color.Red}.String()
colorCodeError = "\x1b[31m" // color.Style{color.Red}.String()
colorCodeWarn = "\x1b[33m" // color.Style{color.Yellow}.String()
colorCodeInfo = "\x1b[37m" // color.Style{color.White}.String()
colorCodeDebug = "\x1b[32m" // color.Style{color.Green}.String()
colorCodeTrace = "\x1b[36m" // color.Style{color.Cyan}.String()
colorReset = "\x1b[0m"
)
// LogFormat specialize for zbp
type LogFormat struct{}
// Format implements logrus.Formatter
func (f LogFormat) Format(entry *logrus.Entry) ([]byte, error) {
buf := new(bytes.Buffer)
buf.WriteString(getLogLevelColorCode(entry.Level))
buf.WriteByte('[')
buf.WriteString(strings.ToUpper(entry.Level.String()))
buf.WriteString("] ")
buf.WriteString(entry.Message)
buf.WriteString(" \n")
buf.WriteString(colorReset)
return buf.Bytes(), nil
}
// getLogLevelColorCode 获取日志等级对应色彩code
func getLogLevelColorCode(level logrus.Level) string {
switch level {
case logrus.PanicLevel:
return colorCodePanic
case logrus.FatalLevel:
return colorCodeFatal
case logrus.ErrorLevel:
return colorCodeError
case logrus.WarnLevel:
return colorCodeWarn
case logrus.InfoLevel:
return colorCodeInfo
case logrus.DebugLevel:
return colorCodeDebug
case logrus.TraceLevel:
return colorCodeTrace
default:
return colorCodeInfo
}
}

97
plugin/ahsai/ahsai.go Normal file
View File

@@ -0,0 +1,97 @@
// Package ahsai AH Soft フリーテキスト音声合成 demo API
package ahsai
import (
"fmt"
"math/rand"
"os"
"sort"
"strconv"
"time"
"github.com/FloatTech/floatbox/file"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
ahsaitts "github.com/fumiama/ahsai"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
namelist = [...]string{"伊織弓鶴", "紲星あかり", "結月ゆかり", "京町セイカ", "東北きりたん", "東北イタコ", "ついなちゃん標準語", "ついなちゃん関西弁", "音街ウナ", "琴葉茜", "吉田くん", "民安ともえ", "桜乃そら", "月読アイ", "琴葉葵", "東北ずん子", "月読ショウタ", "水奈瀬コウ"}
namesort = func() []string {
nl := namelist[:]
sort.Strings(nl)
return nl
}()
)
func init() {
engine := control.Register("ahsai", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "フリーテキスト音声合成",
Help: "- 使[伊織弓鶴|紲星あかり|結月ゆかり|京町セイカ|東北きりたん|東北イタコ|ついなちゃん標準語|ついなちゃん関西弁|音街ウナ|琴葉茜|吉田くん|民安ともえ|桜乃そら|月読アイ|琴葉葵|東北ずん子|月読ショウタ|水奈瀬コウ]说(日语)",
PrivateDataFolder: "ahsai",
})
cachePath := engine.DataFolder() + "cache/"
_ = os.RemoveAll(cachePath)
_ = os.MkdirAll(cachePath, 0755)
engine.OnRegex("^使(.{0,10})说([A-Za-z\\s\\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\\pP]+)$", selectName).SetBlock(true).Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中..."))
uid := ctx.Event.UserID
today := time.Now().Format("20060102150405")
ahsaiFile := cachePath + strconv.FormatInt(uid, 10) + today + "ahsai.wav"
s := ahsaitts.NewSpeaker()
err := s.SetName(ctx.State["ahsainame"].(string))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
u, err := s.Speak(ctx.State["ahsaitext"].(string))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = ahsaitts.SaveOggToFile(u, ahsaiFile)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Record("file:///" + file.BOTPATH + "/" + ahsaiFile))
})
}
func selectName(ctx *zero.Ctx) bool {
regexMatched := ctx.State["regex_matched"].([]string)
ctx.State["ahsaitext"] = regexMatched[2]
name := regexMatched[1]
index := sort.SearchStrings(namesort, name)
if index < len(namelist) && namesort[index] == name {
ctx.State["ahsainame"] = name
return true
}
speaktext := ""
for i, v := range namelist {
speaktext += fmt.Sprintf("%d. %s\n", i, v)
}
ctx.SendChain(message.Text("输入的音源为空, 请输入音源序号\n", speaktext))
next, cancel := zero.NewFutureEvent("message", 999, false, ctx.CheckSession(), zero.RegexRule(`\d{0,2}`)).Repeat()
defer cancel()
for {
select {
case <-time.After(time.Second * 10):
ctx.State["ahsainame"] = namelist[rand.Intn(len(namelist))]
ctx.SendChain(message.Text("时间太久啦!", zero.BotConfig.NickName[0], "帮你选择", ctx.State["ahsainame"]))
return true
case c := <-next:
msg := c.Event.Message.ExtractPlainText()
num, _ := strconv.Atoi(msg)
if num < 0 || num >= len(namelist) {
ctx.SendChain(message.Text("序号非法!"))
continue
}
ctx.State["ahsainame"] = namelist[num]
return true
}
}
}

121
plugin/ai_false/ai_false.go Normal file
View File

@@ -0,0 +1,121 @@
// Package aifalse 暂时只有服务器监控
package aifalse
import (
"fmt"
"math"
"strconv"
"time"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/mem"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() { // 插件主体
engine := control.Register("aifalse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "自检, 全局限速",
Help: "- 查询计算机当前活跃度: [检查身体 | 自检 | 启动自检 | 系统状态]\n" +
"- 设置默认限速为每 m [分钟 | 秒] n 次触发",
})
c, ok := control.Lookup("aifalse")
if !ok {
panic("register aifalse error")
}
m := c.GetData(0)
n := (m >> 16) & 0xffff
m &= 0xffff
if m != 0 || n != 0 {
ctxext.SetDefaultLimiterManagerParam(time.Duration(m)*time.Second, int(n))
logrus.Infoln("设置默认限速为每", m, "秒触发", n, "次")
}
engine.OnFullMatchGroup([]string{"检查身体", "自检", "启动自检", "系统状态"}, zero.AdminPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text(
"* CPU占用: ", cpuPercent(), "%\n",
"* RAM占用: ", memPercent(), "%\n",
"* 硬盘使用: ", diskPercent(),
),
)
})
engine.OnRegex(`^设置默认限速为每\s*(\d+)\s*(分钟|秒)\s*(\d+)\s*次触发$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if !ok {
ctx.SendChain(message.Text("ERROR: no such plugin"))
return
}
m, err := strconv.ParseInt(ctx.State["regex_matched"].([]string)[1], 10, 64)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if ctx.State["regex_matched"].([]string)[2] == "分钟" {
m *= 60
}
if m >= 65536 || m <= 0 {
ctx.SendChain(message.Text("ERROR: interval too big"))
return
}
n, err := strconv.ParseInt(ctx.State["regex_matched"].([]string)[3], 10, 64)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if n >= 65536 || n <= 0 {
ctx.SendChain(message.Text("ERROR: burst too big"))
return
}
ctxext.SetDefaultLimiterManagerParam(time.Duration(m)*time.Second, int(n))
err = c.SetData(0, (m&0xffff)|((n<<16)&0xffff0000))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("设置默认限速为每", m, "秒触发", n, "次"))
})
}
func cpuPercent() float64 {
percent, err := cpu.Percent(time.Second, false)
if err != nil {
return -1
}
return math.Round(percent[0])
}
func memPercent() float64 {
memInfo, err := mem.VirtualMemory()
if err != nil {
return -1
}
return math.Round(memInfo.UsedPercent)
}
func diskPercent() string {
parts, err := disk.Partitions(true)
if err != nil {
return err.Error()
}
msg := ""
for _, p := range parts {
diskInfo, err := disk.Usage(p.Mountpoint)
if err != nil {
msg += "\n - " + err.Error()
continue
}
pc := uint(math.Round(diskInfo.UsedPercent))
if pc > 0 {
msg += fmt.Sprintf("\n - %s(%dM) %d%%", p.Mountpoint, diskInfo.Total/1024/1024, pc)
}
}
return msg
}

251
plugin/ai_reply/ai_tts.go Normal file
View File

@@ -0,0 +1,251 @@
package aireply
import (
"errors"
"net/url"
"github.com/RomiChan/syncx"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/FloatTech/AnimeAPI/aireply"
"github.com/FloatTech/AnimeAPI/tts"
"github.com/FloatTech/AnimeAPI/tts/baidutts"
"github.com/FloatTech/AnimeAPI/tts/genshin"
"github.com/FloatTech/AnimeAPI/tts/mockingbird"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
)
// 数据结构: [4 bits] [4 bits] [8 bits] [8 bits]
// [拟声鸟模式] [百度模式] [tts模式] [回复模式]
// defaultttsindexkey
// 数据结构: [4 bits] [4 bits] [8 bits]
// [拟声鸟模式] [百度模式] [tts模式]
// [tts模式]: 0~63 genshin 64 baidu 65 mockingbird
const (
lastgsttsindex = 63 + iota
baiduttsindex
mockingbirdttsindex
)
const (
defaultttsindexkey = -2905
)
var replyModes = [...]string{"青云客", "小爱"}
func setReplyMode(ctx *zero.Ctx, name string) error {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
var ok bool
var index int64
for i, s := range replyModes {
if s == name {
ok = true
index = int64(i)
break
}
}
if !ok {
return errors.New("no such mode")
}
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if !ok {
return errors.New("no such plugin")
}
return m.SetData(gid, (m.GetData(index)&^0xff)|(index&0xff))
}
func getReplyMode(ctx *zero.Ctx) aireply.AIReply {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
m, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if ok {
if m.GetData(gid)&0xff == 1 {
return aireply.NewXiaoAi(aireply.XiaoAiURL, aireply.XiaoAiBotName)
}
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
}
return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
}
var ttsins = func() map[string]tts.TTS {
m := make(map[string]tts.TTS, 128)
for _, mode := range append(genshin.SoundList[:], "百度", "拟声鸟") {
m[mode] = nil
}
return m
}()
var ttsModes = func() []string {
s := append(genshin.SoundList[:], make([]string, 64-len(genshin.SoundList))...) // 0-63
s = append(s, "百度", "拟声鸟") // 64 65
return s
}()
type ttsmode struct {
APIKey string // APIKey is for genshin vits
mode syncx.Map[int64, int64] `json:"-"` // mode grp index
}
func list(list []string, num int) string {
s := ""
for i, value := range list {
s += value
if (i+1)%num == 0 {
s += "\n"
} else {
s += " | "
}
}
return s
}
func newttsmode() *ttsmode {
t := &ttsmode{}
m, ok := control.Lookup("tts")
t.mode = syncx.Map[int64, int64]{}
t.mode.Store(defaultttsindexkey, 0)
if ok {
index := m.GetData(defaultttsindexkey)
msk := index & 0xff
if msk >= 0 && (msk < int64(len(genshin.SoundList)) || msk == baiduttsindex || msk == mockingbirdttsindex) {
t.mode.Store(defaultttsindexkey, index)
}
}
return t
}
func (t *ttsmode) getAPIKey(ctx *zero.Ctx) string {
if t.APIKey == "" {
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
_ = m.Manager.GetExtra(-1, &t)
logrus.Debugln("[tts] get api key:", t.APIKey)
}
return url.QueryEscape(t.APIKey)
}
func (t *ttsmode) setAPIKey(m *ctrl.Control[*zero.Ctx], key string) error {
t.APIKey = key
_ = m.Manager.Response(-1)
return m.Manager.SetExtra(-1, t)
}
func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt int) error {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
_, ok := ttsins[name]
if !ok {
return errors.New("不支持设置语音人物" + name)
}
var index = int64(-1)
for i, s := range genshin.SoundList {
if s == name {
index = int64(i)
break
}
}
if index == -1 {
switch name {
case "百度":
index = baiduttsindex
case "拟声鸟":
index = mockingbirdttsindex
default:
return errors.New("语音人物" + name + "未注册index")
}
}
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
t.mode.Store(gid, index)
return m.SetData(gid, (m.GetData(gid)&^0xffff00)|((index<<8)&0xff00)|((int64(baiduper)<<16)&0x0f0000)|((int64(mockingsynt)<<20)&0xf00000))
}
func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
i, ok := t.mode.Load(gid)
if !ok {
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
i = m.GetData(gid) >> 8
}
m := i & 0xff
if m < 0 || (m >= int64(len(genshin.SoundList)) && m != baiduttsindex && m != mockingbirdttsindex) {
i, _ = t.mode.Load(defaultttsindexkey)
m = i & 0xff
}
mode := ttsModes[m]
ins, ok := ttsins[mode]
if !ok || ins == nil {
switch mode {
case "百度":
ins = baidutts.NewBaiduTTS(int(i&0x0f00) >> 8)
case "拟声鸟":
var err error
ins, err = mockingbird.NewMockingBirdTTS(int(i&0xf000) >> 12)
if err != nil {
return nil, err
}
default: // 原神
k := t.getAPIKey(ctx)
if k != "" {
ins = genshin.NewGenshin(int(m), t.getAPIKey(ctx))
ttsins[mode] = ins
} else {
return nil, errors.New("no valid speaker")
}
}
}
return ins, nil
}
func (t *ttsmode) resetSoundMode(ctx *zero.Ctx) error {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
index := m.GetData(defaultttsindexkey)
return m.SetData(gid, (m.GetData(gid)&0xff)|((index&^0xff)<<8)) // 重置数据
}
func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) error {
_, ok := ttsins[name]
if !ok {
return errors.New("不支持设置语音人物" + name)
}
index := int64(-1)
for i, s := range genshin.SoundList {
if s == name {
index = int64(i)
break
}
}
if index == -1 {
switch name {
case "百度":
index = baiduttsindex
case "拟声鸟":
index = mockingbirdttsindex
default:
return errors.New("语音人物" + name + "未注册index")
}
}
m, ok := control.Lookup("tts")
if !ok {
return errors.New("[tts] service not found")
}
t.mode.Store(defaultttsindexkey, index)
return m.SetData(defaultttsindexkey, (index&0xff)|((int64(baiduper)<<8)&0x0f00)|((int64(mockingsynt)<<12)&0xf000))
}

173
plugin/ai_reply/main.go Normal file
View File

@@ -0,0 +1,173 @@
// Package aireply AI 回复
package aireply
import (
"strconv"
"time"
"github.com/FloatTech/AnimeAPI/tts/genshin"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var t = newttsmode()
func init() { // 插件主体
ent := control.Register("tts", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Brief: "人工智能语音回复",
Help: "- @Bot 任意文本(任意一句话回复)\n" +
"- 设置语音模式[原神人物/百度/拟声鸟] 数字(百度/拟声鸟模式)\n" +
"- 设置默认语音模式[原神人物/百度/拟声鸟] 数字(百度/拟声鸟模式)\n" +
"- 恢复成默认语音模式\n" +
"- 设置原神语音 api key xxxxxx (key请加开发群获得)\n" +
"当前适用的原神人物含有以下:\n" + list(genshin.SoundList[:], 5),
})
enr := control.Register("aireply", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "人工智能回复",
Help: "- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱]",
PrivateDataFolder: "aireply",
})
enr.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
aireply := getReplyMode(ctx)
reply := message.ParseMessageFromString(aireply.Talk(ctx.Event.UserID, ctx.ExtractPlainText(), zero.BotConfig.NickName[0]))
// 回复
time.Sleep(time.Second * 1)
if zero.OnlyPublic(ctx) {
reply = append(reply, message.Reply(ctx.Event.MessageID))
ctx.Send(reply)
return
}
ctx.Send(reply)
})
enr.OnPrefix("设置回复模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
param := ctx.State["args"].(string)
err := setReplyMode(ctx, param)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("成功"))
})
ent.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
msg := ctx.ExtractPlainText()
// 获取回复模式
r := getReplyMode(ctx)
// 获取回复的文本
reply := r.TalkPlain(ctx.Event.UserID, msg, zero.BotConfig.NickName[0])
// 获取语音
speaker, err := t.getSoundMode(ctx)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
rec, err := speaker.Speak(ctx.Event.UserID, func() string { return reply })
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
return
}
// 发送语音
if id := ctx.SendChain(message.Record(rec)); id.ID() == 0 {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
}
})
ent.OnRegex(`^设置语音模式\s*([\S\D]*)\s*(\d*)$`, zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
param := ctx.State["regex_matched"].([]string)[1]
num := ctx.State["regex_matched"].([]string)[2]
n := 0
var err error
if num != "" {
n, err = strconv.Atoi(num)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
}
// 保存设置
logrus.Debugln("[tts] t.setSoundMode( ctx", param, n, n, ")")
err = t.setSoundMode(ctx, param, n, n)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
}
if banner, ok := genshin.TestRecord[param]; ok {
logrus.Debugln("[tts] banner:", banner, "get sound mode...")
// 设置验证
speaker, err := t.getSoundMode(ctx)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
logrus.Debugln("[tts] got sound mode, speaking...")
rec, err := speaker.Speak(ctx.Event.UserID, func() string { return banner })
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("无法发送测试语音,请重试。"))
return
}
logrus.Debugln("[tts] sending...")
if id := ctx.SendChain(message.Record(rec).Add("cache", 0)); id.ID() == 0 {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("无法发送测试语音,请重试。"))
return
}
time.Sleep(time.Second * 2)
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功"))
})
ent.OnRegex(`^设置默认语音模式\s*([\S\D]*)\s*(\d*)$`, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
param := ctx.State["regex_matched"].([]string)[1]
num := ctx.State["regex_matched"].([]string)[2]
n := 0
var err error
if num != "" {
n, err = strconv.Atoi(num)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
}
// 保存设置
err = t.setDefaultSoundMode(param, n, n)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功"))
})
ent.OnFullMatch("恢复成默认语音模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
err := t.resetSoundMode(ctx)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
}
// 设置验证
speaker, err := t.getSoundMode(ctx)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功,当前为", speaker))
})
ent.OnRegex(`^设置原神语音\s*api\s*key\s*([0-9a-zA-Z-_]{54}==)$`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
err := t.setAPIKey(ctx.State["manager"].(*ctrl.Control[*zero.Ctx]), ctx.State["regex_matched"].([]string)[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("设置成功"))
})
}

224
plugin/aipaint/aipaint.go Normal file
View File

@@ -0,0 +1,224 @@
// Package aipaint ai绘图
package aipaint
import (
"encoding/base64"
"encoding/json"
"fmt"
"net/url"
"os"
"regexp"
"strconv"
"strings"
"time"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
datapath string
predictRe = regexp.MustCompile(`{"steps".+?}`)
// 参考host http://91.217.139.190:5010 http://91.216.169.75:5010
aipaintTxt2ImgURL = "/got_image?token=%v&tags=%v"
aipaintImg2ImgURL = "/got_image2image?token=%v&tags=%v"
cfg = newServerConfig("data/aipaint/config.json")
)
type result struct {
Steps int `json:"steps"`
Sampler string `json:"sampler"`
Seed int `json:"seed"`
Strength float64 `json:"strength"`
Noise float64 `json:"noise"`
Scale float64 `json:"scale"`
Uc string `json:"uc"`
}
func (r *result) String() string {
return fmt.Sprintf("steps: %v\nsampler: %v\nseed: %v\nstrength: %v\nnoise: %v\nscale: %v\nuc: %v\n", r.Steps, r.Sampler, r.Seed, r.Strength, r.Noise, r.Scale, r.Uc)
}
func init() { // 插件主体
engine := control.Register("aipaint", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "ai绘图",
Help: "- [ ai绘图 | 生成色图 | 生成涩图 | ai画图 ] xxx\n" +
"- [ ai高级绘图 | 高级生成色图 | 高级生成涩图 | ai高级画图 ] [prompt]\n" +
"- 设置ai绘图配置 [server] [token]\n" +
"- 设置ai绘图撤回时间90s\n" +
"- 查看ai绘图配置\n" +
"Tips: 使用前请先前往 http://91.217.139.190:5010/token 按提示获取token" +
"设置token示例(请确保是主人并且响应): 设置ai绘图配置 http://91.217.139.190:5010 [token] (中括号无需输入)\n" +
"参考服务器 http://91.217.139.190:5010, http://91.216.169.75:5010, http://185.80.202.180:5010\n" +
"[prompt]参数如下\n" +
"tags:tag词条\nntags:ntag词条\nshape:[Portrait|Landscape|Square]\nscale:[6:20]\nseed:种子\nstrength:[0-1] 建议0-0.7\nnoise:[0-1] 建议0-0.15" +
"参数与参数内容用:连接,每个参数之间用回车分割",
PrivateDataFolder: "aipaint",
})
datapath = file.BOTPATH + "/" + engine.DataFolder()
if file.IsNotExist(cfg.file) {
s := serverConfig{}
data, err := json.Marshal(s)
if err != nil {
panic(err)
}
err = os.WriteFile(cfg.file, data, 0666)
if err != nil {
panic(err)
}
}
engine.OnPrefixGroup([]string{`ai绘图`, `生成色图`, `生成涩图`, `ai画图`}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("少女祈祷中..."))
args := ctx.State["args"].(string)
data, err := web.GetData(cfg.BaseURL + fmt.Sprintf(aipaintTxt2ImgURL, cfg.Token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20")))))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data, cfg.Interval)
})
engine.OnPrefixGroup([]string{`ai高级绘图`, `高级生成色图`, `高级生成涩图`, `ai高级画图`}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
tags := make(map[string]string)
args := strings.Split(ctx.State["args"].(string), "\n")
if len(args) < 1 {
ctx.SendChain(message.Text("ERROR: 请输入正确的参数"))
return
}
for _, info := range args {
value := strings.Split(info, ":")
if len(value) > 1 {
if value[0] == "R18" && value[1] == "1" {
value[1] = "0"
ctx.SendChain(message.Text("不准涩涩! 已将R18设置为0. "))
}
tags[value[0]] = strings.Join(value[1:], ":")
}
}
ctx.SendChain(message.Text("少女祈祷中..."))
apiurl := "/got_image?token=" + cfg.Token
if _, ok := tags["tags"]; ok {
apiurl += "&tags=" + url.QueryEscape(strings.ReplaceAll(strings.TrimSpace(tags["tags"]), " ", "%20"))
}
if _, ok := tags["ntags"]; ok {
apiurl += "&ntags=" + url.QueryEscape(strings.ReplaceAll(strings.TrimSpace(tags["ntags"]), " ", "%20"))
}
if _, ok := tags["R18"]; ok {
apiurl += "&R18=" + url.QueryEscape(strings.TrimSpace(tags["R18"]))
}
if _, ok := tags["shape"]; ok {
apiurl += "&shape=" + url.QueryEscape(strings.TrimSpace(tags["shape"]))
}
if _, ok := tags["scale"]; ok {
apiurl += "&scale=" + url.QueryEscape(strings.TrimSpace(tags["scale"]))
}
if _, ok := tags["seed"]; ok {
apiurl += "&seed=" + url.QueryEscape(strings.TrimSpace(tags["seed"]))
}
if _, ok := tags["strength"]; ok {
apiurl += "&strength=" + url.QueryEscape(strings.TrimSpace(tags["strength"]))
}
if _, ok := tags["noise"]; ok {
apiurl += "&noise=" + url.QueryEscape(strings.TrimSpace(tags["noise"]))
}
data, err := web.GetData(cfg.BaseURL + apiurl)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data, cfg.Interval)
})
engine.OnRegex(`^设置ai绘图配置\s(.*[^\s$])\s(.+)$`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
regexMatched := ctx.State["regex_matched"].([]string)
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = cfg.update(regexMatched[1], regexMatched[2], cfg.Interval)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("成功设置\nbase_url: ", cfg.BaseURL, "\ntoken: ", cfg.Token, "\ninterval: ", cfg.Interval))
})
engine.OnRegex(`^设置ai绘图撤回时间(\d{1,3})s$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
regexMatched := ctx.State["regex_matched"].([]string)
interval, err := strconv.Atoi(regexMatched[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = cfg.update(cfg.BaseURL, cfg.Token, interval)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("成功设置撤回时间为", cfg.Interval, "s"))
})
engine.OnFullMatch(`查看ai绘图配置`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("base_url: ", cfg.BaseURL, "\ntoken: ", cfg.Token, "\ninterval: ", cfg.Interval))
})
}
func sendAiImg(ctx *zero.Ctx, data []byte, interval int) {
var loadData string
if predictRe.MatchString(binary.BytesToString(data)) {
loadData = predictRe.FindStringSubmatch(binary.BytesToString(data))[0]
}
var r result
if loadData != "" {
err := json.Unmarshal(binary.StringToBytes(loadData), &r)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
r.Uc, err = url.QueryUnescape(r.Uc)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
}
encodeStr := base64.StdEncoding.EncodeToString(data)
m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("base64://"+encodeStr))}
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(r.String())))
if mid := ctx.Send(m); mid.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
} else if interval > 0 {
go func(i message.MessageID) {
time.Sleep(time.Duration(interval) * time.Second)
ctx.DeleteMessage(i)
}(mid)
}
}

56
plugin/aipaint/config.go Normal file
View File

@@ -0,0 +1,56 @@
package aipaint
import (
"encoding/json"
"errors"
"os"
"github.com/FloatTech/floatbox/file"
)
// 配置结构体
type serverConfig struct {
BaseURL string `json:"base_url"`
Token string `json:"token"`
Interval int `json:"interval"`
file string
}
func newServerConfig(file string) *serverConfig {
return &serverConfig{
file: file,
}
}
func (cfg *serverConfig) update(baseURL, token string, interval int) (err error) {
if baseURL != "" {
cfg.BaseURL = baseURL
}
if token != "" {
cfg.Token = token
}
cfg.Interval = interval
reader, err := os.Create(cfg.file)
if err != nil {
return err
}
defer reader.Close()
return json.NewEncoder(reader).Encode(cfg)
}
func (cfg *serverConfig) load() (err error) {
if cfg.BaseURL != "" && cfg.Token != "" && cfg.Interval != 0 {
return
}
if file.IsNotExist(cfg.file) {
err = errors.New("no server config")
return
}
reader, err := os.Open(cfg.file)
if err != nil {
return
}
defer reader.Close()
err = json.NewDecoder(reader).Decode(cfg)
return
}

41
plugin/aipaint/context.go Normal file
View File

@@ -0,0 +1,41 @@
package aipaint
import (
"os"
"strconv"
"strings"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/process"
)
type context struct {
usrdir string
headimgsdir []string
}
func newContext(user int64) *context {
c := new(context)
c.usrdir = datapath + "users/" + strconv.FormatInt(user, 10) + `/`
_ = os.MkdirAll(c.usrdir, 0755)
c.headimgsdir = make([]string, 2)
c.headimgsdir[0] = c.usrdir + "0.gif"
c.headimgsdir[1] = c.usrdir + "1.gif"
return c
}
func (cc *context) prepareLogos(s ...string) error {
for i, v := range s {
_, err := strconv.Atoi(v)
if err != nil {
err = file.DownloadTo("https://gchat.qpic.cn/gchatpic_new//--"+strings.ToUpper(v)+"/0", cc.usrdir+strconv.Itoa(i)+".gif")
} else {
err = file.DownloadTo("http://q4.qlogo.cn/g?b=qq&nk="+v+"&s=640", cc.usrdir+strconv.Itoa(i)+".gif")
}
if err != nil {
return err
}
process.SleepAbout1sTo2s()
}
return nil
}

88
plugin/aipaint/img2img.go Normal file
View File

@@ -0,0 +1,88 @@
// Package aipaint ai绘图
package aipaint
import (
"bytes"
"fmt"
"image"
"net/url"
"os"
"strconv"
"strings"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() { // 插件主体
engine := control.Register("img2img", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Brief: "以图绘图",
Help: "- [ 以图绘图 | 以图生图 | 以图画图 ] xxx [图片]|@xxx|[qq号]\n" +
"- 官方以图绘图api已失效 需要自建api 其他配置参数同ai绘图",
PrivateDataFolder: "img2img",
})
datapath = file.BOTPATH + "/" + engine.DataFolder()
engine.OnRegex(`^(以图绘图|以图生图|以图画图)[\s\S]*?(\[CQ:(image\,file=([0-9a-zA-Z]{32}).*|at.+?(\d{5,11}))\].*|(\d+))$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
c := newContext(ctx.Event.UserID)
list := ctx.State["regex_matched"].([]string)
err = c.prepareLogos(list[4]+list[5]+list[6], strconv.FormatInt(ctx.Event.UserID, 10))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
args := strings.TrimSuffix(strings.TrimPrefix(list[0], list[1]), list[2])
if args == "" {
ctx.SendChain(message.Text("ERROR: 以图绘图必须添加tag"))
return
}
ctx.SendChain(message.Text("少女祈祷中..."))
postURL := cfg.BaseURL + fmt.Sprintf(aipaintImg2ImgURL, cfg.Token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20"))))
f, err := os.Open(c.headimgsdir[0])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
defer f.Close()
img, _, err := image.Decode(f)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
imageShape := ""
switch {
case img.Bounds().Dx() > img.Bounds().Dy():
imageShape = "Landscape"
case img.Bounds().Dx() == img.Bounds().Dy():
imageShape = "Square"
default:
imageShape = "Portrait"
}
// 图片转base64
base64Bytes, err := writer.ToBase64(img)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
data, err := web.PostData(postURL+"&shape="+imageShape, "text/plain", bytes.NewReader(base64Bytes))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data, cfg.Interval)
})
}

View File

@@ -0,0 +1,29 @@
// Package aiwife 随机老婆
package aiwife
import (
"fmt"
"math/rand"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
bed = "https://www.thiswaifudoesnotexist.net/example-%d.jpg"
)
func init() { // 插件主体
control.Register("aiwife", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "ai随机生成老婆",
Help: "- waifu | 随机waifu",
}).ApplySingle(ctxext.DefaultSingle).OnFullMatchGroup([]string{"waifu", "随机waifu"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
miku := rand.Intn(100000) + 1
ctx.SendChain(message.At(ctx.Event.UserID), message.Image(fmt.Sprintf(bed, miku)))
})
}

View File

@@ -0,0 +1,32 @@
// Package alipayvoice 支付宝到账语音
package alipayvoice
import (
"fmt"
"strings"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
alipayvoiceURL = "https://mm.cqu.cc/share/zhifubaodaozhang/mp3/%v.mp3"
)
func init() { // 插件主体
engine := control.Register("alipayvoice", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "支付宝到账语音",
Help: "- 支付宝到账 1",
PrivateDataFolder: "alipayvoice",
})
// 开启
engine.OnPrefix(`支付宝到账`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
args := ctx.State["args"].(string)
ctx.SendChain(message.Record(fmt.Sprintf(alipayvoiceURL, strings.TrimSpace(args))))
})
}

124
plugin/antiabuse/anti.go Normal file
View File

@@ -0,0 +1,124 @@
// Package antiabuse defines antiabuse plugin ,support abuse words check and add/remove abuse words
package antiabuse
import (
"strconv"
"strings"
"time"
"github.com/FloatTech/floatbox/binary"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/ttl"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img/text"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const bandur time.Duration = time.Minute * 10
var (
managers *ctrl.Manager[*zero.Ctx] // managers lazy load
cache = ttl.NewCacheOn(bandur, [4]func(int64, struct{}){nil, nil, onDel, nil})
db *antidb
)
func onDel(uid int64, _ struct{}) {
if managers == nil {
return
}
if err := managers.DoUnblock(uid); err != nil {
logrus.Errorln("[antiabuse.onDel] unblock:", err)
}
if err := db.Del("__bantime__", "WHERE id="+strconv.FormatInt(uid, 10)); err != nil {
logrus.Errorln("[antiabuse.onDel] db:", err)
}
}
func init() {
engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "违禁词检测",
Help: "- /[添加|删除|查看]违禁词",
PrivateDataFolder: "anti_abuse",
})
onceRule := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
managers = ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).Manager
var err error
db, err = newantidb(engine.DataFolder() + "anti_abuse.db")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
})
engine.OnMessage(onceRule, zero.OnlyGroup, func(ctx *zero.Ctx) bool {
if !ctx.Event.IsToMe {
return true
}
uid := ctx.Event.UserID
gid := ctx.Event.GroupID
msg := strings.ReplaceAll(ctx.MessageString(), "\n", "")
msg = strings.ReplaceAll(msg, "\r", "")
msg = strings.ReplaceAll(msg, "\t", "")
msg = strings.ReplaceAll(msg, ";", "")
if db.isInAntiList(gid, msg) {
if err := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).Manager.DoBlock(uid); err == nil {
t := time.Now().Unix()
cache.Set(uid, struct{}{})
ctx.SetGroupBan(gid, uid, int64(bandur.Minutes()))
ctx.SendChain(message.Text("检测到违禁词, 已封禁/屏蔽", bandur))
db.Lock()
defer db.Unlock()
err := db.Create("__bantime__", nilbt)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Insert("__bantime__", &banTime{ID: uid, Time: t})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
} else {
ctx.SendChain(message.Text("ERROR: block user: ", err))
}
return false
}
return true
})
engine.OnCommand("添加违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
func(ctx *zero.Ctx) {
args := ctx.State["args"].(string)
if err := db.insertWord(ctx.Event.GroupID, args); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
} else {
ctx.SendChain(message.Text("成功"))
}
})
engine.OnCommand("删除违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
func(ctx *zero.Ctx) {
args := ctx.State["args"].(string)
if err := db.deleteWord(ctx.Event.GroupID, args); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
} else {
ctx.SendChain(message.Text("成功"))
}
})
engine.OnCommand("查看违禁词", zero.OnlyGroup, onceRule).Handle(
func(ctx *zero.Ctx) {
b, err := text.RenderToBase64(db.listWords(ctx.Event.GroupID), text.FontFile, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("本群违禁词有\n"), message.Image("base64://"+binary.BytesToString(b)))
})
}

102
plugin/antiabuse/db.go Normal file
View File

@@ -0,0 +1,102 @@
package antiabuse
import (
"errors"
"strconv"
"strings"
"sync"
"time"
sqlite "github.com/FloatTech/sqlite"
)
type antidb struct {
sync.RWMutex
sqlite.Sqlite
}
type banWord struct {
Word string `db:"word"`
}
type banTime struct {
ID int64 `db:"id"`
Time int64 `db:"time"`
}
var (
nilban = &banWord{}
nilbt = &banTime{}
)
func newantidb(path string) (*antidb, error) {
db := &antidb{Sqlite: sqlite.Sqlite{DBPath: path}}
err := db.Open(bandur)
if err != nil {
return nil, err
}
_ = db.FindFor("__bantime__", nilbt, "", func() error {
t := time.Unix(nilbt.Time, 0)
ttl := time.Until(t.Add(bandur))
if ttl < time.Minute {
_ = managers.DoUnblock(nilbt.ID)
return nil
}
cache.Set(nilbt.ID, struct{}{})
cache.Touch(nilbt.ID, -time.Since(t))
return nil
})
_ = db.Del("__bantime__", "WHERE time<="+strconv.FormatInt(time.Now().Add(time.Minute-bandur).Unix(), 10))
return db, nil
}
func (db *antidb) isInAntiList(gid int64, msg string) bool {
grp := strconv.FormatInt(gid, 36)
db.RLock()
defer db.RUnlock()
return db.CanFind(grp, "WHERE instr('"+msg+"', word)>0")
}
func (db *antidb) insertWord(gid int64, word string) error {
grp := strconv.FormatInt(gid, 36)
db.Lock()
defer db.Unlock()
err := db.Create(grp, nilban)
if err != nil {
return err
}
return db.Insert(grp, &banWord{Word: word})
}
func (db *antidb) deleteWord(gid int64, word string) error {
grp := strconv.FormatInt(gid, 36)
db.Lock()
defer db.Unlock()
if n, _ := db.Count(grp); n == 0 {
return errors.New("本群还没有违禁词~")
}
return db.Del(grp, "WHERE word='"+word+"'")
}
func (db *antidb) listWords(gid int64) string {
grp := strconv.FormatInt(gid, 36)
word := &banWord{}
sb := strings.Builder{}
sb.WriteByte('[')
i := 0
db.RLock()
defer db.RUnlock()
_ = db.FindFor(grp, word, "", func() error {
if i > 0 {
sb.WriteString(" | ")
}
sb.WriteString(word.Word)
i++
return nil
})
if sb.Len() <= 4 {
return "[]"
}
sb.WriteByte(']')
return sb.String()
}

View File

@@ -6,58 +6,90 @@ Package atri 本文件基于 https://github.com/Kyomotoi/ATRI
package atri
import (
"encoding/base64"
"math/rand"
"time"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
)
var (
// ATRI 所有命令的优先级
prio = -1
// ATRI 表情的 GitHub 位置,如果发现图片不能下载请使用镜像
res = "https://raw.githubusercontent.com/FloatTech/ZeroBot-Plugin/master/plugin_atri/"
// ATRI 的总开关
enable = true
)
type datagetter func(string, bool) ([]byte, error)
func (dgtr datagetter) randImage(file ...string) message.MessageSegment {
data, err := dgtr(file[rand.Intn(len(file))], true)
if err != nil {
return message.Text("ERROR: ", err)
}
return message.ImageBytes(data)
}
func (dgtr datagetter) randRecord(file ...string) message.MessageSegment {
data, err := dgtr(file[rand.Intn(len(file))], true)
if err != nil {
return message.Text("ERROR: ", err)
}
return message.Record("base64://" + base64.StdEncoding.EncodeToString(data))
}
func randText(text ...string) message.MessageSegment {
return message.Text(text[rand.Intn(len(text))])
}
// isAtriSleeping 凌晨0点到6点ATRI 在睡觉,不回应任何请求
func isAtriSleeping(ctx *zero.Ctx) bool {
if now := time.Now().Hour(); now >= 1 && now < 6 {
return false
}
return true
}
func init() { // 插件主体
zero.OnFullMatch("ATRI醒醒", zero.AdminPermission).SetBlock(true).SetPriority(prio).
Handle(func(ctx *zero.Ctx) {
enable = true
ctx.SendChain(randText("嗯呜呜……夏生先生……?"))
})
zero.OnFullMatch("ATRI睡吧", zero.AdminPermission).SetBlock(true).SetPriority(prio).
Handle(func(ctx *zero.Ctx) {
enable = false
ctx.SendChain(randText("Zzz……Zzz……"))
})
zero.OnFullMatch("萝卜子", atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine := control.Register("atri", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "atri人格文本回复",
Help: "本插件基于 ATRI ,为 Golang 移植版\n" +
"- ATRI醒醒\n- ATRI睡吧\n- 萝卜子\n- 喜欢 | 爱你 | 爱 | suki | daisuki | すき | 好き | 贴贴 | 老婆 | 亲一个 | mua\n" +
"- 草你妈 | 操你妈 | 脑瘫 | 废柴 | fw | 废物 | 战斗 | 爬 | 爪巴 | sb | SB | 傻B\n- 早安 | 早哇 | 早上好 | ohayo | 哦哈哟 | お早う | 早好 | 早 | 早早早\n" +
"- 中午好 | 午安 | 午好\n- 晚安 | oyasuminasai | おやすみなさい | 晚好 | 晚上好\n- 高性能 | 太棒了 | すごい | sugoi | 斯国一 | よかった\n" +
"- 没事 | 没关系 | 大丈夫 | 还好 | 不要紧 | 没出大问题 | 没伤到哪\n- 好吗 | 是吗 | 行不行 | 能不能 | 可不可以\n- 啊这\n- 我好了\n- | ? | ¿\n" +
"- 离谱\n- 答应我",
PublicDataFolder: "Atri",
OnEnable: func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("嗯呜呜……夏生先生……?"))
},
OnDisable: func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("Zzz……Zzz……"))
},
})
engine.UsePreHandler(isAtriSleeping)
var dgtr datagetter = engine.GetLazyData
engine.OnFullMatch("萝卜子").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
switch rand.Intn(2) {
case 0:
ctx.SendChain(randText("萝卜子是对机器人的蔑称!", "是亚托莉......萝卜子可是对机器人的蔑称"))
case 1:
ctx.SendChain(randRecord("RocketPunch.amr"))
ctx.SendChain(dgtr.randRecord("RocketPunch.amr"))
}
})
zero.OnKeywordGroup([]string{"喜欢", "爱你", "爱", "suki", "daisuki", "すき", "好き", "贴贴", "老婆", "亲一个", "mua"}, atriSwitch(), atriSleep(), zero.OnlyToMe).SetBlock(true).SetPriority(prio).
engine.OnFullMatchGroup([]string{"喜欢", "爱你", "爱", "suki", "daisuki", "すき", "好き", "贴贴", "老婆", "亲一个", "mua"}, zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if rand.Intn(10) == 0 {
ctx.SendChain(randImage("SUKI.jpg", "SUKI1.jpg", "SUKI2.png"))
}
ctx.SendChain(dgtr.randImage("SUKI.jpg", "SUKI1.jpg", "SUKI2.png"))
})
zero.OnKeywordGroup([]string{"草你妈", "操你妈", "脑瘫", "废柴", "fw", "five", "废物", "战斗", "爬", "爪巴", "sb", "SB", "傻B"}, atriSwitch(), atriSleep(), zero.OnlyToMe).SetBlock(true).SetPriority(prio - 1).
engine.OnKeywordGroup([]string{"草你妈", "操你妈", "脑瘫", "废柴", "fw", "five", "废物", "战斗", "爬", "爪巴", "sb", "SB", "傻B"}, zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(randImage("FN.jpg", "WQ.jpg", "WQ1.jpg"))
ctx.SendChain(dgtr.randImage("FN.jpg", "WQ.jpg", "WQ1.jpg"))
})
zero.OnFullMatchGroup([]string{"早安", "早哇", "早上好", "ohayo", "哦哈哟", "お早う"}, atriSwitch()).SetBlock(true).SetPriority(prio).
engine.OnFullMatchGroup([]string{"早安", "早哇", "早上好", "ohayo", "哦哈哟", "お早う", "早好", "早", "早早早"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
now := time.Now().Hour()
switch {
case now < 6: // 凌晨
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"zzzz......",
"zzzzzzzz......",
"zzz...好涩哦..zzz....",
@@ -66,7 +98,7 @@ func init() { // 插件主体
"...zzz....哧溜哧溜....",
))
case now >= 6 && now < 9:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"啊......早上好...(哈欠)",
"唔......吧唧...早上...哈啊啊~~~\n早上好......",
"早上好......",
@@ -78,24 +110,24 @@ func init() { // 插件主体
"早上好......欸~~~脸好近呢",
))
case now >= 9 && now < 18:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"哼!这个点还早啥,昨晚干啥去了!?",
"熬夜了对吧熬夜了对吧熬夜了对吧???!",
"是不是熬夜是不是熬夜是不是熬夜?!",
))
case now >= 18 && now < 24:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"早个啥?哼唧!我都准备洗洗睡了!",
"不是...你看看几点了,哼!",
"晚上好哇",
))
}
})
zero.OnFullMatchGroup([]string{"中午好", "午安"}, atriSwitch()).SetBlock(true).SetPriority(prio).
engine.OnFullMatchGroup([]string{"中午好", "午安", "午好"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
now := time.Now().Hour()
if now > 11 && now < 15 { // 中午
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"午安w",
"午觉要好好睡哦ATRI会陪伴在你身旁的w",
"嗯哼哼~睡吧,就像平常一样安眠吧~o(≧▽≦)o",
@@ -103,12 +135,12 @@ func init() { // 插件主体
))
}
})
zero.OnFullMatchGroup([]string{"晚安", "oyasuminasai", "おやすみなさい"}, atriSwitch()).SetBlock(true).SetPriority(prio).
engine.OnFullMatchGroup([]string{"晚安", "oyasuminasai", "おやすみなさい", "晚好", "晚上好"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
now := time.Now().Hour()
switch {
case now < 6: // 凌晨
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"zzzz......",
"zzzzzzzz......",
"zzz...好涩哦..zzz....",
@@ -117,27 +149,27 @@ func init() { // 插件主体
"...zzz....哧溜哧溜....",
))
case now >= 6 && now < 11:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"你可猝死算了吧!",
"?啊这",
"亲,这边建议赶快去睡觉呢~~~",
"不可忍不可忍不可忍!!为何这还不猝死!!",
))
case now >= 11 && now < 15:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"午安w",
"午觉要好好睡哦ATRI会陪伴在你身旁的w",
"嗯哼哼~睡吧,就像平常一样安眠吧~o(≧▽≦)o",
"睡你午觉去!哼唧!!",
))
case now >= 15 && now < 19:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"难不成??晚上不想睡觉??现在休息",
"就......挺离谱的...现在睡觉",
"现在还是白天哦,睡觉还太早了",
))
case now >= 19 && now < 24:
ctx.SendChain(randText(
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
"嗯哼哼~睡吧,就像平常一样安眠吧~o(≧▽≦)o",
"......(打瞌睡)",
"呼...呼...已经睡着了哦~...呼......",
@@ -145,7 +177,7 @@ func init() { // 插件主体
))
}
})
zero.OnKeywordGroup([]string{"高性能", "太棒了", "すごい", "sugoi", "斯国一", "よかった"}, atriSwitch(), atriSleep(), zero.OnlyToMe).SetBlock(true).SetPriority(prio).
engine.OnKeywordGroup([]string{"高性能", "太棒了", "すごい", "sugoi", "斯国一", "よかった"}, zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(randText(
"当然,我是高性能的嘛~",
@@ -165,7 +197,7 @@ func init() { // 插件主体
"呣......我的高性能,毫无遗憾地施展出来了......",
))
})
zero.OnKeywordGroup([]string{"没事", "没关系", "大丈夫", "还好", "不要紧", "没出大问题", "没伤到哪"}, atriSwitch(), atriSleep(), zero.OnlyToMe).SetBlock(true).SetPriority(prio).
engine.OnKeywordGroup([]string{"没事", "没关系", "大丈夫", "还好", "不要紧", "没出大问题", "没伤到哪"}, zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(randText(
"当然,我是高性能的嘛~",
@@ -179,74 +211,42 @@ func init() { // 插件主体
))
})
zero.OnKeywordGroup([]string{"好吗", "是吗", "行不行", "能不能", "可不可以"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine.OnKeywordGroup([]string{"好吗", "是吗", "行不行", "能不能", "可不可以"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if rand.Intn(2) == 0 {
ctx.SendChain(randImage("YES.png", "NO.jpg"))
ctx.SendChain(dgtr.randImage("YES.png", "NO.jpg"))
}
})
zero.OnFullMatchGroup([]string{"啊这"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine.OnKeywordGroup([]string{"啊这"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if rand.Intn(2) == 0 {
ctx.SendChain(randImage("AZ.jpg", "AZ1.jpg"))
ctx.SendChain(dgtr.randImage("AZ.jpg", "AZ1.jpg"))
}
})
zero.OnFullMatchGroup([]string{"我好了"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine.OnKeywordGroup([]string{"我好了"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(randText("不许好!", "憋回去!"))
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText("不许好!", "憋回去!"))
})
zero.OnFullMatchGroup([]string{"", "?", "¿"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine.OnFullMatchGroup([]string{"", "?", "¿"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
switch rand.Intn(5) {
case 0:
ctx.SendChain(randText("?", "", "嗯?", "(。´・ω・)ん?", "ん?"))
case 1, 2:
ctx.SendChain(randImage("WH.jpg", "WH1.jpg", "WH2.jpg", "WH3.jpg"))
ctx.SendChain(dgtr.randImage("WH.jpg", "WH1.jpg", "WH2.jpg", "WH3.jpg"))
}
})
zero.OnKeyword("离谱", atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
engine.OnKeyword("离谱").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
switch rand.Intn(5) {
case 0:
ctx.SendChain(randText("?", "", "嗯?", "(。´・ω・)ん?", "ん?"))
case 1, 2:
ctx.SendChain(randImage("WH.jpg"))
ctx.SendChain(dgtr.randImage("WH.jpg"))
}
})
zero.OnKeyword("答应我", atriSwitch(), atriSleep(), zero.OnlyToMe).SetBlock(true).SetPriority(prio).
engine.OnKeyword("答应我", zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(randText("我无法回应你的请求"))
})
}
func randText(text ...string) message.MessageSegment {
length := len(text)
return message.Text(text[rand.Intn(length)])
}
func randImage(file ...string) message.MessageSegment {
length := len(file)
return message.Image(res + file[rand.Intn(length)])
}
func randRecord(file ...string) message.MessageSegment {
length := len(file)
return message.Record(res + file[rand.Intn(length)])
}
// atriSwitch 控制 ATRI 的开关
func atriSwitch() zero.Rule {
return func(ctx *zero.Ctx) bool {
return enable
}
}
// atriSleep 凌晨0点到6点ATRI 在睡觉,不回应任何请求
func atriSleep() zero.Rule {
return func(ctx *zero.Ctx) bool {
if now := time.Now().Hour(); now >= 1 && now < 6 {
return false
}
return true
}
}

View File

@@ -0,0 +1,29 @@
// Package autowithdraw 触发者撤回时也自动撤回
package autowithdraw
import (
"github.com/FloatTech/floatbox/process"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
control.Register("autowithdraw", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "触发者撤回时也自动撤回",
Help: "- 撤回一条消息\n",
}).OnNotice(func(ctx *zero.Ctx) bool {
return ctx.Event.NoticeType == "group_recall" || ctx.Event.NoticeType == "friend_recall"
}).SetBlock(false).Handle(func(ctx *zero.Ctx) {
id, ok := ctx.Event.MessageID.(int64)
if !ok {
return
}
for _, msg := range zero.GetTriggeredMessages(message.NewMessageIDFromInteger(id)) {
process.SleepAbout1sTo2s()
ctx.DeleteMessage(msg)
}
})
}

62
plugin/b14/main.go Normal file
View File

@@ -0,0 +1,62 @@
// Package b14coder base16384 与 tea 加解密
package b14coder
import (
"github.com/FloatTech/floatbox/crypto"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
base14 "github.com/fumiama/go-base16384"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
func init() {
en := control.Register("base16384", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "base16384加解密",
Help: "- 加密xxx\n- 解密xxx\n- 用yyy加密xxx\n- 用yyy解密xxx",
})
en.OnRegex(`^加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := base14.EncodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^解密\s*([一-踀]+[㴁-㴆]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := base14.DecodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
en.OnRegex(`^用(.+)加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := base14.UTF16BE2UTF8(base14.Encode(t.Encrypt(helper.StringToBytes(str))))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(es)))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^用(.+)解密\s*([一-踀]+[㴁-㴆]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := base14.UTF82UTF16BE(helper.StringToBytes(str))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(t.Decrypt(base14.Decode(es)))))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
}

27
plugin/baidu/search.go Normal file
View File

@@ -0,0 +1,27 @@
// Package baidu 百度一下
package baidu
import (
"net/url"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
)
func init() {
control.Register("baidu", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "不会百度吗",
Help: "- 百度下[xxx]",
}).OnPrefix("百度下").SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
txt := ctx.State["args"].(string)
if txt != "" {
ctx.SendChain(message.Text("https://buhuibaidu.me/?s=" + url.QueryEscape(txt)))
}
})
}

500
plugin/baiduaudit/audit.go Normal file
View File

@@ -0,0 +1,500 @@
// Package baiduaudit 百度内容审核
package baiduaudit
import (
"encoding/json"
"fmt"
"os"
"strconv"
"github.com/Baidu-AIP/golang-sdk/aip/censor"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/file"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img/text"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
// 服务网址:https://console.bce.baidu.com/ai/?_=1665977657185#/ai/antiporn/overview/index
// 返回参数说明https://cloud.baidu.com/doc/ANTIPORN/s/Nk3h6xbb2
type baiduRes struct {
LogID int `json:"log_id"` // 请求唯一id
Conclusion string `json:"conclusion"` // 审核结果,可取值:合规、不合规、疑似、审核失败
ConclusionType int `json:"conclusionType"` // 审核结果类型可取值1.合规2.不合规3.疑似4.审核失败
Data []auditData `json:"data"`
ErrorCode int `json:"error_code"` // 错误提示码,失败才返回,成功不返回
ErrorMsg string `json:"error_msg"` // 错误提示信息,失败才返回,成功不返回
}
type auditData struct {
Type int `json:"type"` // 审核主类型11百度官方违禁词库、12文本反作弊、13:自定义文本黑名单、14:自定义文本白名单
SubType int `json:"subType"` // 审核子类型0:含多种类型具体看官方链接1:违禁违规、2:文本色情、3:敏感信息、4:恶意推广、5:低俗辱骂 6:恶意推广-联系方式、7:恶意推广-软文推广
Conclusion string `json:"conclusion"` // 审核结果,可取值:合规、不合规、疑似、审核失败
ConclusionType int `json:"conclusionType"` // 审核结果类型可取值1.合规2.不合规3.疑似4.审核失败
Msg string `json:"msg"` // 不合规项描述信息
Hits []hit `json:"hits"`
} // 不合规/疑似/命中白名单项详细信息。响应成功并且conclusion为疑似或不合规或命中白名单时才返回响应失败或conclusion为合规且未命中白名单时不返回。
type hit struct {
DatasetName string `json:"datasetName"` // 违规项目所属数据集名称
Words []string `json:"words"` // 送检文本命中词库的关键词备注建议参考新字段“wordHitPositions”包含信息更丰富关键词以及对应的位置及标签信息
Probability float64 `json:"probability,omitempty"` // 不合规项置信度
} // 送检文本违规原因的详细信息
type keyConfig struct {
Key1 string `json:"key1"` // 百度云服务内容审核key存储
Key2 string `json:"key2"` // 百度云服务内容审核key存储
Groups map[int64]group `json:"groups"` // 群配置存储
}
type group struct {
Enable EnableMark // 是否启用内容审核
TextAudit EnableMark // 文本检测
ImageAudit EnableMark // 图像检测
DMRemind EnableMark // 撤回提示
MoreRemind EnableMark // 详细违规提示
DMBAN EnableMark // 撤回后禁言
BANTimeAddEnable EnableMark // 禁言累加
BANTime int64 // 标准禁言时间,禁用累加,但开启禁言的的情况下采用该值
MaxBANTimeAddRange int64 // 最大禁言时间累加范围,最高禁言时间
BANTimeAddTime int64 // 禁言累加时间该值是开启禁累加功能后再次触发时根据被禁次数X该值计算出的禁言时间
WhiteListType [8]bool // 类型白名单,处于白名单类型的违规,不会被触发 0:含多种类型具体看官方链接1:违禁违规、2:文本色情、3:敏感信息、4:恶意推广、5:低俗辱骂 6:恶意推广-联系方式、7:恶意推广-软文推广
AuditHistory map[int64]auditHistory // 被封禁用户列表
}
// EnableMark 启用:●,禁用:○
type EnableMark bool
// String 打印启用状态
func (em EnableMark) String() string {
if em {
return "开启"
}
return "关闭"
}
type auditHistory struct {
Count int64 `json:"key2"` // 被禁次数
ResList []baiduRes `json:"reslist"` // 禁言原因
}
var bdcli *censor.ContentCensorClient // 百度云审核服务Client
var typetext = [8]string{
0: "默认违禁词库",
1: "违禁违规",
2: "文本色情",
3: "敏感信息",
4: "恶意推广",
5: "低俗辱骂",
6: "恶意推广-联系方式",
7: "恶意推广-软文推广",
} // 文本类型
var (
config keyConfig // 插件配置
configinit bool // 配置初始化
configpath string // 配置路径
)
func init() {
engine := control.Register("baiduaudit", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "百度内容审核",
Help: "##该功能来自百度内容审核需购买相关服务并创建app##\n" +
"- 获取BDAKey\n" +
"- 配置BDAKey [API key] [Secret Key]\n" +
"- 开启/关闭内容审核\n" +
"- 开启/关闭撤回提示\n" +
"- 开启/关闭详细提示\n" +
"- 开启/关闭撤回禁言\n" +
"##禁言时间设置## 禁言时间计算方式为:禁言次数*每次禁言累加时间,当达到最大禁言时间时,再次触发按最大禁言时间计算\n" +
"- 开启/关闭禁言累加\n" +
"- 设置撤回禁言时间[分钟,默认:1]\n" +
"- 设置最大禁言时间[分钟,默认:60,最大43200]\n" +
"- 设置每次累加时间[分钟,默认:1]\n" +
"##检测类型设置## 类型编号列表:[1:违禁违规、2:文本色情、3:敏感信息、4:恶意推广、5:低俗辱骂 6:恶意推广-联系方式、7:恶意推广-软文推广]\n" +
"- 查看检测类型\n" +
"- 查看检测配置\n" +
"- 设置检测类型[类型编号]\n" +
"- 设置不检测类型[类型编号]\n" +
"- 开启/关闭文本检测\n" +
"- 开启/关闭图像检测\n" +
"##测试功能##\n" +
"- 测试文本检测[文本内容]\n" +
"- 测试图像检测[图片]\n",
PrivateDataFolder: "baiduaudit",
})
configpath = engine.DataFolder() + "config.json"
loadConfig()
if configinit {
bdcli = censor.NewClient(config.Key1, config.Key2)
}
engine.OnFullMatch("获取BDAKey", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("接口key创建网址:\n" +
"https://console.bce.baidu.com/ai/?_=1665977657185#/ai/antiporn/overview/index\n" +
"免费8w次数领取地址:\n" +
"https://console.bce.baidu.com/ai/?_=1665977657185#/ai/antiporn/overview/resource/getFree"))
})
engine.OnRegex("^查看检测(类型|配置)$", zero.AdminPermission, clientCheck).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 获取群配置
group := getGroup(ctx.Event.GroupID)
var msgs string
k1 := ctx.State["regex_matched"].([]string)[1]
if k1 == "类型" {
msgs += "本群检测类型:"
find := false
// 遍历群检测类型名单
for i, v := range group.WhiteListType {
if !v {
find = true
msgs += fmt.Sprint("\n", i, ".", typetext[i])
}
}
if !find {
msgs += "无"
}
} else {
// 生成配置文本
msgs = fmt.Sprintf("本群配置:\n"+
"内容审核:%s\n"+
"-文本:%s\n"+
"-图像:%s\n"+
"撤回提示:%s\n"+
"-详细提示:%s\n"+
"撤回禁言:%s\n"+
"-禁言累加:%s\n"+
"-撤回禁言时间:%v分钟\n"+
"-每次累加时间:%v分钟\n"+
"-最大禁言时间:%v分钟", group.Enable, group.TextAudit, group.ImageAudit, group.DMRemind, group.MoreRemind, group.DMBAN, group.BANTimeAddEnable, group.BANTime, group.BANTimeAddTime, group.MaxBANTimeAddRange)
}
b, err := text.RenderToBase64(msgs, text.FontFile, 300, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("base64://" + binary.BytesToString(b)))
})
engine.OnRegex("^设置(不)?检测类型([01234567])$", zero.AdminPermission, clientCheck).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
defer jsonSave(config, configpath)
k1 := ctx.State["regex_matched"].([]string)[1]
k2 := ctx.State["regex_matched"].([]string)[2]
group := getGroup(ctx.Event.GroupID)
inputType, _ := strconv.Atoi(k2)
if k1 == "不" {
group.WhiteListType[inputType] = true // 不检测:则进入类型白名单
} else {
group.WhiteListType[inputType] = false // 检测:则退出白名单
}
config.Groups[ctx.Event.GroupID] = group
ctx.SendChain(message.At(ctx.Event.UserID), message.Text(fmt.Sprintf("本群将%s检测%s类型内容", k1, typetext[inputType])))
})
engine.OnRegex("^设置(最大|每次|撤回)(累加|禁言)时间(\\d{1,5})$", zero.AdminPermission, clientCheck).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
defer jsonSave(config, configpath)
k1 := ctx.State["regex_matched"].([]string)[1]
k3 := ctx.State["regex_matched"].([]string)[3]
group := getGroup(ctx.Event.GroupID)
time, _ := strconv.ParseInt(k1, 10, 64)
switch k1 {
case "最大":
group.MaxBANTimeAddRange = time
case "每次":
group.BANTimeAddTime = time
case "撤回":
group.BANTime = time
}
config.Groups[ctx.Event.GroupID] = group
ctx.SendChain(message.At(ctx.Event.UserID), message.Text(fmt.Sprintf("本群%s禁言累加时间已设置为%s", k3, k1)))
})
engine.OnRegex("^(开启|关闭)(内容审核|撤回提示|撤回禁言|禁言累加|详细提示|文本检测|图像检测)$", zero.AdminPermission, clientCheck).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
defer jsonSave(config, configpath)
k1 := ctx.State["regex_matched"].([]string)[1]
k2 := ctx.State["regex_matched"].([]string)[2]
isEnable := EnableMark(false)
group := getGroup(ctx.Event.GroupID)
if k1 == "开启" {
isEnable = true
}
switch k2 {
case "内容审核":
group.Enable = isEnable
case "撤回提示":
group.DMRemind = isEnable
case "撤回禁言":
group.DMBAN = isEnable
case "禁言累加":
group.BANTimeAddEnable = isEnable
case "详细提示":
group.MoreRemind = isEnable
case "文本检测":
group.TextAudit = isEnable
case "图像检测":
group.ImageAudit = isEnable
}
config.Groups[ctx.Event.GroupID] = group
ctx.SendChain(message.At(ctx.Event.UserID), message.Text(fmt.Sprintf("本群%s已%s", k2, k1)))
})
engine.OnRegex(`^配置BDAKey\s(.*)\s(.*)$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
k1 := ctx.State["regex_matched"].([]string)[1]
k2 := ctx.State["regex_matched"].([]string)[2]
bdcli = censor.NewClient(k1, k2)
config.Key1 = k1
config.Key2 = k2
if bdcli != nil {
jsonSave(config, configpath)
ctx.SendChain(message.Text("配置成功"))
}
})
engine.OnMessage().SetBlock(false).Handle(func(ctx *zero.Ctx) {
group, ok := config.Groups[ctx.Event.GroupID]
// 如果没该配置,或者审核功能未开启直接跳过
if !ok || !bool(group.Enable) {
return
}
for _, elem := range ctx.Event.Message {
switch elem.Type {
case "image":
if !group.ImageAudit {
return
}
res := bdcli.ImgCensorUrl(elem.Data["url"], nil)
bdres, err := jsonToBaiduRes(res)
if err != nil {
ctx.SendChain(message.Text("Error:", bdres.ErrorMsg, "(", bdres.ErrorCode, ")"))
return
}
banCheck(ctx, bdres)
case "text":
if !group.TextAudit {
return
}
res := bdcli.TextCensor(elem.Data["text"])
bdres, err := jsonToBaiduRes(res)
if err != nil {
ctx.SendChain(message.Text("Error:", bdres.ErrorMsg, "(", bdres.ErrorCode, ")"))
return
}
banCheck(ctx, bdres)
}
}
})
engine.OnPrefix("文本检测", clientCheck).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
if bdcli == nil {
ctx.SendChain(message.Text("Key未配置"))
return
}
args := ctx.ExtractPlainText()
res := bdcli.TextCensor(args)
bdres, err := jsonToBaiduRes(res)
if err != nil {
ctx.SendChain(message.Text("Error:", bdres.ErrorMsg, "(", bdres.ErrorCode, ")"))
return
}
group := getGroup(ctx.Event.GroupID)
ctx.SendChain(buildResp(bdres, group)...)
})
engine.OnPrefix("^图像检测", clientCheck).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
var urls []string
for _, elem := range ctx.Event.Message {
if elem.Type == "image" {
if elem.Data["url"] != "" {
urls = append(urls, elem.Data["url"])
}
}
}
if len(urls) == 0 {
return
}
res := bdcli.ImgCensorUrl(urls[0], nil)
bdres, err := jsonToBaiduRes(res)
if err != nil {
ctx.SendChain(message.Text("Error:", bdres.ErrorMsg, "(", bdres.ErrorCode, ")"))
return
}
group := getGroup(ctx.Event.GroupID)
ctx.SendChain(buildResp(bdres, group)...)
})
}
// 禁言检测
func banCheck(ctx *zero.Ctx, bdres baiduRes) {
// 如果返回类型为2不合规0为合规3为疑似
if bdres.ConclusionType == 2 {
// 创建消息ID
mid := message.NewMessageIDFromInteger(ctx.Event.MessageID.(int64))
// 获取群配置
group := getGroup(ctx.Event.GroupID)
// 检测群配置里的不检测类型白名单,忽略掉不检测的违规类型
for i, b := range group.WhiteListType {
if i == bdres.Data[0].SubType && b {
return
}
}
// 生成回复文本
res := buildResp(bdres, group)
// 撤回消息
ctx.DeleteMessage(mid)
// 查看是否启用撤回后禁言
if group.DMBAN {
// 从历史违规记录中获取指定用户
user := group.getUser(ctx.Event.UserID)
// 用户违规次数自增
user.Count++
// 用户违规原因记录
user.ResList = append(user.ResList, bdres)
// 覆写该用户到群违规记录中
group.AuditHistory[ctx.Event.UserID] = user
// 覆写该群信息
config.Groups[ctx.Event.GroupID] = group
// 保存到json
jsonSave(config, configpath)
var bantime int64
// 查看是否开启禁言累加功能,并计算禁言时间
if group.BANTimeAddEnable {
bantime = user.Count * group.BANTimeAddTime * 60
} else {
bantime = group.BANTime * 60
}
// 执行禁言
ctx.SetGroupBan(ctx.Event.GroupID, ctx.Event.UserID, bantime)
}
// 查看是否开启撤回提示
if group.DMRemind {
res = append(res, message.At(ctx.Event.Sender.ID))
ctx.SendChain(res...)
}
}
}
// 获取群配置
func getGroup(groupID int64) group {
g, ok := config.Groups[groupID]
if ok {
return g
}
if config.Groups == nil {
config.Groups = make(map[int64]group)
}
g = group{
TextAudit: true,
ImageAudit: true,
BANTime: 1,
MaxBANTimeAddRange: 60,
BANTimeAddTime: 1,
WhiteListType: [8]bool{},
AuditHistory: map[int64]auditHistory{},
}
config.Groups[groupID] = g
return g
}
// 从群历史违规记录中获取用户
func (group *group) getUser(userID int64) auditHistory {
audit, ok := group.AuditHistory[userID]
if ok {
return audit
}
// 如果没有用户,则创建一个并返回
if group.AuditHistory == nil {
group.AuditHistory = make(map[int64]auditHistory)
}
audit = auditHistory{0, []baiduRes{}}
group.AuditHistory[userID] = audit
return audit
}
// 客户端是否初始化检测
func clientCheck(ctx *zero.Ctx) bool {
if bdcli == nil {
ctx.SendChain(message.Text("Key未配置"))
return false
}
return true
}
// 加载JSON配置文件
func loadConfig() {
if file.IsExist(configpath) {
data, err := os.OpenFile(configpath, os.O_RDONLY, 0755)
if err != nil {
panic(err)
}
err = json.NewDecoder(data).Decode(&config)
if err != nil {
panic(err)
}
configinit = true
} else {
config = keyConfig{}
configinit = false
}
}
// 保存配置文件
func jsonSave(v keyConfig, path string) {
jsf, _ := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
}
}(jsf) // 结束时关闭句柄,释放资源
err := json.NewEncoder(jsf).Encode(v)
if err != nil {
fmt.Println(err)
}
}
// JSON反序列化
func jsonToBaiduRes(resjson string) (baiduRes, error) {
var bdres baiduRes
err := json.Unmarshal(binary.StringToBytes(resjson), &bdres)
return bdres, err
}
// 生成回复文本
func buildResp(bdres baiduRes, group group) []message.MessageSegment {
// 建立消息段
msgs := make([]message.MessageSegment, 0, 8)
// 生成简略审核结果回复
msgs = append(msgs, message.Text(bdres.Conclusion, "\n"))
// 查看是否开启详细审核内容提示,并确定审核内容值为疑似,或者不合规
if !group.MoreRemind {
return msgs
}
// 遍历返回的不合规数据,生成详细违规内容
for i, datum := range bdres.Data {
msgs = append(msgs, message.Text("[", i, "]:", datum.Msg, "\n"))
// 检查命中词条是否大于0
if len(datum.Hits) == 0 {
return msgs
}
// 遍历打印命中的违规词条
for _, hit := range datum.Hits {
if len(datum.Hits) == 0 {
return msgs
}
msgs = append(msgs, message.Text("("))
for i4, i3 := range hit.Words {
// 检查是否是最后一个要打印的词条,如果是则不加上逗号
if i4 != len(hit.Words)-1 {
msgs = append(msgs, message.Text(i3, ","))
} else {
msgs = append(msgs, message.Text(i3))
}
}
msgs = append(msgs, message.Text(")"))
}
}
return msgs
}

62
plugin/base64gua/main.go Normal file
View File

@@ -0,0 +1,62 @@
// Package base64gua base64卦 与 tea 加解密
package base64gua
import (
"github.com/FloatTech/floatbox/crypto"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/fumiama/unibase2n"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
func init() {
en := control.Register("base64gua", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "六十四卦加解密",
Help: "- 六十四卦加密xxx\n- 六十四卦解密xxx\n- 六十四卦用yyy加密xxx\n- 六十四卦用yyy解密xxx",
})
en.OnRegex(`^六十四卦加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := unibase2n.Base64Gua.EncodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^六十四卦解密\s*([䷀-䷿]+[☰☱]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := unibase2n.Base64Gua.DecodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
en.OnRegex(`^六十四卦用(.+)加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := unibase2n.UTF16BE2UTF8(unibase2n.Base64Gua.Encode(t.Encrypt(helper.StringToBytes(str))))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(es)))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^六十四卦用(.+)解密\s*([䷀-䷿]+[☰☱]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := unibase2n.UTF82UTF16BE(helper.StringToBytes(str))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(t.Decrypt(unibase2n.Base64Gua.Decode(es)))))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
}

View File

@@ -0,0 +1,62 @@
// Package baseamasiro base天城文 与 tea 加解密
package baseamasiro
import (
"github.com/FloatTech/floatbox/crypto"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/fumiama/unibase2n"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
func init() {
en := control.Register("baseamasiro", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "天城文加解密",
Help: "- 天城文加密xxx\n- 天城文解密xxx\n- 天城文用yyy加密xxx\n- 天城文用yyy解密xxx",
})
en.OnRegex(`^天城文加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := unibase2n.BaseDevanagari.EncodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^天城文解密\s*([ऀ-ॿ]+[-৫]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es := unibase2n.BaseDevanagari.DecodeString(str)
if es != "" {
ctx.SendChain(message.Text(es))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
en.OnRegex(`^天城文用(.+)加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := unibase2n.UTF16BE2UTF8(unibase2n.BaseDevanagari.Encode(t.Encrypt(helper.StringToBytes(str))))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(es)))
} else {
ctx.SendChain(message.Text("加密失败!"))
}
})
en.OnRegex(`^天城文用(.+)解密\s*([ऀ-ॿ]+[-৫]?)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
key, str := ctx.State["regex_matched"].([]string)[1], ctx.State["regex_matched"].([]string)[2]
t := crypto.GetTEA(key)
es, err := unibase2n.UTF82UTF16BE(helper.StringToBytes(str))
if err == nil {
ctx.SendChain(message.Text(helper.BytesToString(t.Decrypt(unibase2n.BaseDevanagari.Decode(es)))))
} else {
ctx.SendChain(message.Text("解密失败!"))
}
})
}

627
plugin/bilibili/bilibili.go Normal file
View File

@@ -0,0 +1,627 @@
// Package bilibili 查询b站用户信息
package bilibili
import (
"crypto/tls"
"encoding/binary"
"encoding/json"
"fmt"
"image"
"image/color"
"net/http"
"os"
"path"
"regexp"
"sort"
"strconv"
"time"
"github.com/Coloured-glaze/gg"
bz "github.com/FloatTech/AnimeAPI/bilibili"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img"
"github.com/FloatTech/zbputils/img/text"
log "github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
re = regexp.MustCompile(`^\d+$`)
danmakuTypeMap = map[int64]string{
0: "普通消息",
1: "礼物",
2: "上舰",
3: "Superchat",
4: "进入直播间",
5: "标题变动",
6: "分区变动",
7: "直播中止",
8: "直播继续",
}
cfg = bz.NewCookieConfig("data/Bilibili/config.json")
)
// 查成分的
func init() {
engine := control.Register("bilibili", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "b站查成分查弹幕",
Help: "- >vup info [xxx]\n" +
"- >user info [xxx]\n" +
"- 查成分 [xxx]\n" +
"- 查弹幕 [xxx]\n" +
"- 设置b站cookie b_ut=7;buvid3=0;i-wanna-go-back=-1;innersign=0;\n" +
"- 更新vup" +
"Tips: (412就是拦截的意思,建议私聊把cookie设全)\n",
PublicDataFolder: "Bilibili",
})
cachePath := engine.DataFolder() + "cache/"
_ = os.RemoveAll(cachePath)
_ = os.MkdirAll(cachePath, 0755)
var getdb = fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
var err error
_, _ = engine.GetLazyData("bilibili.db", false)
vdb, err = initializeVup(engine.DataFolder() + "bilibili.db")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
})
engine.OnRegex(`^>user info\s?(.{1,25})$`, getPara).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
id := ctx.State["uid"].(string)
card, err := bz.GetMemberCard(id)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text(
"uid: ", card.Mid, "\n",
"name: ", card.Name, "\n",
"sex: ", card.Sex, "\n",
"sign: ", card.Sign, "\n",
"level: ", card.LevelInfo.CurrentLevel, "\n",
"birthday: ", card.Birthday,
))
})
engine.OnRegex(`^>vup info\s?(.{1,25})$`, getPara).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
id := ctx.State["uid"].(string)
// 获取详情
fo, err := bz.GetVtbDetail(id)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text(
"b站id: ", fo.Mid, "\n",
"名字: ", fo.Uname, "\n",
"当前粉丝数: ", fo.Follower, "\n",
"24h涨粉数: ", fo.Rise, "\n",
"视频投稿数: ", fo.Video, "\n",
"直播间id: ", fo.Roomid, "\n",
"舰队: ", fo.GuardNum, "\n",
"直播总排名: ", fo.AreaRank, "\n",
"数据来源: ", "https://vtbs.moe/detail/", fo.Mid, "\n",
"数据获取时间: ", time.Now().Format("2006-01-02 15:04:05"),
))
})
engine.OnRegex(`^查成分\s?(.{1,25})$`, getPara, getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
id := ctx.State["uid"].(string)
today := time.Now().Format("20060102")
drawedFile := cachePath + id + today + "vupLike.png"
if file.IsExist(drawedFile) {
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
return
}
u, err := bz.GetMemberCard(id)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
vups, err := vdb.filterVup(u.Attentions)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
vupLen := len(vups)
medals, err := bz.GetMedalWall(cfg, id)
sort.Sort(bz.MedalSorter(medals))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
}
frontVups := make([]vup, 0)
medalMap := make(map[int64]bz.Medal)
for _, v := range medals {
up := vup{
Mid: v.Mid,
Uname: v.Uname,
}
frontVups = append(frontVups, up)
medalMap[v.Mid] = v
}
vups = append(vups, frontVups...)
copy(vups[len(frontVups):], vups)
copy(vups, frontVups)
for i := len(frontVups); i < len(vups); i++ {
if _, ok := medalMap[vups[i].Mid]; ok {
vups = append(vups[:i], vups[i+1:]...)
i--
}
}
facePath := cachePath + id + "vupFace" + path.Ext(u.Face)
backX := 500
backY := 500
var back image.Image
if path.Ext(u.Face) != ".webp" {
err = initFacePic(facePath, u.Face)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back, err = gg.LoadImage(facePath)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back = img.Size(back, backX, backY).Im
}
if len(vups) > 50 {
ctx.SendChain(message.Text(u.Name + "关注的up主太多了, 只展示前50个up"))
vups = vups[:50]
}
canvas := gg.NewContext(1500, int(500*(1.1+float64(len(vups))/3)))
fontSize := 50.0
canvas.SetColor(color.White)
canvas.Clear()
if back != nil {
canvas.DrawImage(back, 0, 0)
}
canvas.SetColor(color.Black)
_, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
}
if err = canvas.LoadFontFace(text.BoldFontFile, fontSize); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sl, _ := canvas.MeasureString("好")
length, h := canvas.MeasureString(u.Mid)
n, _ := canvas.MeasureString(u.Name)
canvas.DrawString(u.Name, 550, 160-h)
canvas.DrawRoundedRectangle(600+n-length*0.1, 160-h*2.5, length*1.2, h*2, fontSize*0.2)
canvas.SetRGB255(221, 221, 221)
canvas.Fill()
canvas.SetColor(color.Black)
canvas.DrawString(u.Mid, 600+n, 160-h)
canvas.DrawString(fmt.Sprintf("粉丝:%d", u.Fans), 550, 240-h)
canvas.DrawString(fmt.Sprintf("关注:%d", len(u.Attentions)), 1000, 240-h)
canvas.DrawString(fmt.Sprintf("管人痴成分:%.2f%%%d/%d", float64(vupLen)/float64(len(u.Attentions))*100, vupLen, len(u.Attentions)), 550, 320-h)
regtime := time.Unix(u.Regtime, 0).Format("2006-01-02 15:04:05")
canvas.DrawString("注册日期:"+regtime, 550, 400-h)
canvas.DrawString("查询日期:"+time.Now().Format("2006-01-02"), 550, 480-h)
for i, v := range vups {
if i%2 == 1 {
canvas.SetRGB255(245, 245, 245)
canvas.DrawRectangle(0, float64(backY)*1.1+float64(i)*float64(backY)/3, float64(backX*3), float64(backY)/3)
canvas.Fill()
}
canvas.SetColor(color.Black)
nl, _ := canvas.MeasureString(v.Uname)
canvas.DrawString(v.Uname, float64(backX)*0.1, float64(backY)*1.1+float64(i+1)*float64(backY)/3-2*h)
ml, _ := canvas.MeasureString(strconv.FormatInt(v.Mid, 10))
canvas.DrawRoundedRectangle(nl-0.1*ml+float64(backX)*0.2, float64(backY)*1.1+float64(i+1)*float64(backY)/3-h*3.5, ml*1.2, h*2, fontSize*0.2)
canvas.SetRGB255(221, 221, 221)
canvas.Fill()
canvas.SetColor(color.Black)
canvas.DrawString(strconv.FormatInt(v.Mid, 10), nl+float64(backX)*0.2, float64(backY)*1.1+float64(i+1)*float64(backY)/3-2*h)
if m, ok := medalMap[v.Mid]; ok {
mnl, _ := canvas.MeasureString(m.MedalName)
grad := gg.NewLinearGradient(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h, nl+ml+mnl+sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h)
r, g, b := int2rbg(m.MedalColorStart)
grad.AddColorStop(0, color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 255})
r, g, b = int2rbg(m.MedalColorEnd)
grad.AddColorStop(1, color.RGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: 255})
canvas.SetFillStyle(grad)
canvas.SetLineWidth(4)
canvas.MoveTo(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h)
canvas.LineTo(nl+ml+mnl+sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h)
canvas.LineTo(nl+ml+mnl+sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h)
canvas.LineTo(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h)
canvas.ClosePath()
canvas.Fill()
canvas.SetColor(color.White)
canvas.DrawString(m.MedalName, nl+ml+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-2*h)
r, g, b = int2rbg(m.MedalColorBorder)
canvas.SetRGB255(int(r), int(g), int(b))
canvas.DrawString(strconv.FormatInt(m.Level, 10), nl+ml+mnl+sl+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-2*h)
mll, _ := canvas.MeasureString(strconv.FormatInt(m.Level, 10))
canvas.SetLineWidth(4)
canvas.MoveTo(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h)
canvas.LineTo(nl+ml+mnl+mll+sl/2+float64(backX)*0.5, float64(backY)*1.1+float64(i+1)*float64(backY)/3-3.5*h)
canvas.LineTo(nl+ml+mnl+mll+sl/2+float64(backX)*0.5, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h)
canvas.LineTo(nl+ml-sl/2+float64(backX)*0.4, float64(backY)*1.1+float64(i+1)*float64(backY)/3-1.5*h)
canvas.ClosePath()
canvas.Stroke()
}
}
f, err := os.Create(drawedFile)
if err != nil {
log.Errorln("[bilibili]", err)
data, cl := writer.ToBytes(canvas.Image())
ctx.SendChain(message.ImageBytes(data))
cl()
return
}
_, err = writer.WriteTo(canvas.Image(), f)
_ = f.Close()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
})
engine.OnRegex(`^查弹幕\s?(\S{1,25})\s?(\d*)$`, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
id := ctx.State["uid"].(string)
pagenum := ctx.State["regex_matched"].([]string)[2]
if pagenum == "" {
pagenum = "0"
}
u, err := bz.GetMemberCard(id)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
var danmaku bz.Danmakusuki
tr := &http.Transport{
DisableKeepAlives: true,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
data, err := web.RequestDataWith(client, fmt.Sprintf(bz.DanmakuAPI, id, pagenum), "GET", "", web.RandUA(), nil)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = json.Unmarshal(data, &danmaku)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
today := time.Now().Format("20060102150415")
drawedFile := cachePath + id + today + "vupLike.png"
facePath := cachePath + id + "vupFace" + path.Ext(u.Face)
backX := 500
backY := 500
var back image.Image
if path.Ext(u.Face) != ".webp" {
err = initFacePic(facePath, u.Face)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back, err = gg.LoadImage(facePath)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back = img.Size(back, backX, backY).Im
}
canvas := gg.NewContext(100, 100)
fontSize := 50.0
_, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
}
if err = canvas.LoadFontFace(text.BoldFontFile, fontSize); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
dz, h := canvas.MeasureString("好")
danmuH := h * 2
faceH := float64(510)
totalDanmuku := 0
for i := 0; i < len(danmaku.Data.Data); i++ {
totalDanmuku += len(danmaku.Data.Data[i].Danmakus) + 1
}
cw := 10000
mcw := float64(2000)
ch := 550 + len(danmaku.Data.Data)*int(faceH) + totalDanmuku*int(danmuH)
canvas = gg.NewContext(cw, ch)
canvas.SetColor(color.White)
canvas.Clear()
canvas.SetColor(color.Black)
if err = canvas.LoadFontFace(text.BoldFontFile, fontSize); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
facestart := 100
fontH := h * 1.6
startWidth := float64(700)
startWidth2 := float64(20)
if back != nil {
canvas.DrawImage(back, facestart, 0)
}
length, _ := canvas.MeasureString(u.Mid)
n, _ := canvas.MeasureString(u.Name)
canvas.DrawString(u.Name, startWidth, 122.5)
canvas.DrawRoundedRectangle(900+n-length*0.1, 66, length*1.2, 75, fontSize*0.2)
canvas.SetRGB255(221, 221, 221)
canvas.Fill()
canvas.SetColor(color.Black)
canvas.DrawString(u.Mid, 900+n, 122.5)
canvas.DrawString(fmt.Sprintf("粉丝:%d 关注:%d", u.Fans, u.Attention), startWidth, 222.5)
canvas.DrawString(fmt.Sprintf("页码:[%d/%d]", danmaku.Data.PageNum, (danmaku.Data.Total-1)/5), startWidth, 322.5)
canvas.DrawString("网页链接: "+fmt.Sprintf(bz.DanmakuURL, u.Mid), startWidth, 422.5)
var channelStart float64
channelStart = float64(550)
for i := 0; i < len(danmaku.Data.Data); i++ {
item := danmaku.Data.Data[i]
facePath = cachePath + strconv.Itoa(int(item.Channel.UID)) + "vupFace" + path.Ext(item.Channel.FaceURL)
if path.Ext(item.Channel.FaceURL) != ".webp" {
err = initFacePic(facePath, item.Channel.FaceURL)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back, err = gg.LoadImage(facePath)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
back = img.Size(back, backX, backY).Im
}
if back != nil {
canvas.DrawImage(back, facestart, int(channelStart))
}
canvas.SetRGB255(24, 144, 255)
canvas.DrawString("标题: "+item.Live.Title, startWidth, channelStart+fontH)
canvas.DrawString("主播: "+item.Channel.Name, startWidth, channelStart+fontH*2)
canvas.SetColor(color.Black)
canvas.DrawString("开始时间: "+time.UnixMilli(item.Live.StartDate).Format("2006-01-02 15:04:05"), startWidth, channelStart+fontH*3)
if item.Live.IsFinish {
canvas.DrawString("结束时间: "+time.UnixMilli(item.Live.StopDate).Format("2006-01-02 15:04:05"), startWidth, channelStart+fontH*4)
canvas.DrawString("直播时长: "+strconv.FormatFloat(float64(item.Live.StopDate-item.Live.StartDate)/3600000.0, 'f', 1, 64)+"小时", startWidth, channelStart+fontH*5)
} else {
t := "结束时间:"
l, _ := canvas.MeasureString(t)
canvas.DrawString(t, startWidth, channelStart+fontH*4)
canvas.SetRGB255(0, 128, 0)
t = "正在直播"
canvas.DrawString(t, startWidth+l*1.1, channelStart+fontH*4)
canvas.SetColor(color.Black)
canvas.DrawString("直播时长: "+strconv.FormatFloat(float64(time.Now().UnixMilli()-item.Live.StartDate)/3600000.0, 'f', 1, 64)+"小时", startWidth, channelStart+fontH*5)
}
canvas.DrawString("弹幕数量: "+strconv.Itoa(int(item.Live.DanmakusCount)), startWidth, channelStart+fontH*6)
canvas.DrawString("观看次数: "+strconv.Itoa(int(item.Live.WatchCount)), startWidth, channelStart+fontH*7)
t := "收益:"
l, _ := canvas.MeasureString(t)
canvas.DrawString(t, startWidth, channelStart+fontH*8)
t = "¥" + strconv.Itoa(int(item.Live.TotalIncome))
canvas.SetRGB255(255, 0, 0)
canvas.DrawString(t, startWidth+l*1.1, channelStart+fontH*8)
canvas.SetColor(color.Black)
DanmakuStart := channelStart + faceH
for i := 0; i < len(item.Danmakus); i++ {
moveW := startWidth2
danmuNow := DanmakuStart + danmuH*float64(i+1)
danItem := item.Danmakus[i]
t := time.UnixMilli(danItem.SendDate).Format("15:04:05")
l, _ := canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
moveW += l + dz
t = danItem.Name
l, _ = canvas.MeasureString(t)
canvas.SetRGB255(24, 144, 255)
canvas.DrawString(t, moveW, danmuNow)
canvas.SetColor(color.Black)
moveW += l + dz
switch danItem.Type {
case 0:
t = danItem.Message
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
moveW += l + dz
case 1:
t = danmakuTypeMap[danItem.Type]
l, _ = canvas.MeasureString(t)
canvas.SetRGB255(255, 0, 0)
canvas.DrawString(t, moveW, danmuNow)
moveW += l + dz
t = danItem.Message
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
canvas.SetColor(color.Black)
moveW += l + dz
case 2, 3:
t = danmakuTypeMap[danItem.Type]
l, _ = canvas.MeasureString(t)
if danItem.Type == 3 {
canvas.SetRGB255(0, 85, 255)
} else {
canvas.SetRGB255(128, 0, 128)
}
canvas.DrawString(t, moveW, danmuNow)
moveW += l + dz
t = danItem.Message
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
moveW += l
t = "["
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
moveW += l
t = "¥" + strconv.FormatFloat(danItem.Price, 'f', 1, 64)
l, _ = canvas.MeasureString(t)
canvas.SetRGB255(255, 0, 0)
canvas.DrawString(t, moveW, danmuNow)
if danItem.Type == 3 {
canvas.SetRGB255(0, 85, 255)
} else {
canvas.SetRGB255(128, 0, 128)
}
moveW += l
t = "]"
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
canvas.SetColor(color.Black)
moveW += l + dz
case 4, 5, 6, 7, 8:
t = danmakuTypeMap[danItem.Type]
canvas.SetRGB255(0, 128, 0)
l, _ = canvas.MeasureString(t)
canvas.DrawString(t, moveW, danmuNow)
canvas.SetColor(color.Black)
moveW += l + dz
default:
canvas.SetRGB255(0, 128, 0)
l, _ = canvas.MeasureString("未知类型" + strconv.Itoa(int(danItem.Type)))
canvas.DrawString(t, moveW, danmuNow)
canvas.SetColor(color.Black)
moveW += l + dz
}
if moveW > mcw {
mcw = moveW
}
}
channelStart = DanmakuStart + float64(len(item.Danmakus)+1)*danmuH
}
im := canvas.Image().(*image.RGBA)
nim := im.SubImage(image.Rect(0, 0, int(mcw), ch))
f, err := os.Create(drawedFile)
if err != nil {
log.Errorln("[bilibili]", err)
data, cl := writer.ToBytes(nim)
ctx.SendChain(message.ImageBytes(data))
cl()
return
}
_, err = writer.WriteTo(nim, f)
_ = f.Close()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
})
engine.OnRegex(`^设置b站cookie?\s+(.*)$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
cookie := ctx.State["regex_matched"].([]string)[1]
err := cfg.Set(cookie)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("成功设置b站cookie为" + cookie))
})
engine.OnFullMatch("更新vup", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中..."))
err := updateVup()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("vup已更新"))
})
}
func initFacePic(filename, faceURL string) error {
if file.IsNotExist(filename) {
data, err := web.GetData(faceURL)
if err != nil {
return err
}
err = os.WriteFile(filename, data, 0666)
if err != nil {
return err
}
}
return nil
}
func int2rbg(t int64) (int64, int64, int64) {
var buf [8]byte
binary.LittleEndian.PutUint64(buf[:], uint64(t))
b, g, r := int64(buf[0]), int64(buf[1]), int64(buf[2])
return r, g, b
}
func getPara(ctx *zero.Ctx) bool {
keyword := ctx.State["regex_matched"].([]string)[1]
if !re.MatchString(keyword) {
searchRes, err := bz.SearchUser(cfg, keyword)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
ctx.State["uid"] = strconv.FormatInt(searchRes[0].Mid, 10)
return true
}
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
ctx.SendChain(message.Text("输入为纯数字, 请选择查询uid还是用户名, 输入对应序号:\n0. 查询uid\n1. 查询用户名"))
for {
select {
case <-time.After(time.Second * 10):
ctx.SendChain(message.Text("时间太久啦!", zero.BotConfig.NickName[0], "帮你选择查询uid"))
ctx.State["uid"] = keyword
return true
case c := <-recv:
msg := c.Event.Message.ExtractPlainText()
num, err := strconv.Atoi(msg)
if err != nil {
ctx.SendChain(message.Text("请输入数字!"))
continue
}
if num < 0 || num > 1 {
ctx.SendChain(message.Text("序号非法!"))
continue
}
if num == 0 {
ctx.State["uid"] = keyword
return true
} else if num == 1 {
searchRes, err := bz.SearchUser(cfg, keyword)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
ctx.State["uid"] = strconv.FormatInt(searchRes[0].Mid, 10)
return true
}
}
}
}

View File

@@ -0,0 +1,107 @@
// Package bilibili bilibili卡片解析
package bilibili
import (
"regexp"
"time"
bz "github.com/FloatTech/AnimeAPI/bilibili"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
limit = ctxext.NewLimiterManager(time.Second*10, 1)
searchVideo = `bilibili.com\\?/video\\?/(?:av(\d+)|([bB][vV][0-9a-zA-Z]+))`
searchDynamic = `(t.bilibili.com|m.bilibili.com\\?/dynamic)\\?/(\d+)`
searchArticle = `bilibili.com\\?/read\\?/(?:cv|mobile\\?/)(\d+)`
searchLiveRoom = `live.bilibili.com\\?/(\d+)`
searchVideoRe = regexp.MustCompile(searchVideo)
searchDynamicRe = regexp.MustCompile(searchDynamic)
searchArticleRe = regexp.MustCompile(searchArticle)
searchLiveRoomRe = regexp.MustCompile(searchLiveRoom)
)
// 插件主体
func init() {
en := control.Register("bilibiliparse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "b站链接解析",
Help: "例:- t.bilibili.com/642277677329285174\n- bilibili.com/read/cv17134450\n- bilibili.com/video/BV13B4y1x7pS\n- live.bilibili.com/22603245 ",
})
en.OnRegex(`((b23|acg).tv|bili2233.cn)/[0-9a-zA-Z]+`).SetBlock(true).Limit(limit.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
url := ctx.State["regex_matched"].([]string)[0]
realurl, err := bz.GetRealURL("https://" + url)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
switch {
case searchVideoRe.MatchString(realurl):
ctx.State["regex_matched"] = searchVideoRe.FindStringSubmatch(realurl)
handleVideo(ctx)
case searchDynamicRe.MatchString(realurl):
ctx.State["regex_matched"] = searchDynamicRe.FindStringSubmatch(realurl)
handleDynamic(ctx)
case searchArticleRe.MatchString(realurl):
ctx.State["regex_matched"] = searchArticleRe.FindStringSubmatch(realurl)
handleArticle(ctx)
case searchLiveRoomRe.MatchString(realurl):
ctx.State["regex_matched"] = searchLiveRoomRe.FindStringSubmatch(realurl)
handleLive(ctx)
}
})
en.OnRegex(searchVideo).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleVideo)
en.OnRegex(searchDynamic).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleDynamic)
en.OnRegex(searchArticle).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleArticle)
en.OnRegex(searchLiveRoom).SetBlock(true).Limit(limit.LimitByGroup).Handle(handleLive)
}
func handleVideo(ctx *zero.Ctx) {
id := ctx.State["regex_matched"].([]string)[1]
if id == "" {
id = ctx.State["regex_matched"].([]string)[2]
}
card, err := bz.GetVideoInfo(id)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
msg, err := videoCard2msg(card)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(msg...)
}
func handleDynamic(ctx *zero.Ctx) {
msg, err := dynamicDetail(ctx.State["regex_matched"].([]string)[2])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(msg...)
}
func handleArticle(ctx *zero.Ctx) {
card, err := bz.GetArticleInfo(ctx.State["regex_matched"].([]string)[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(articleCard2msg(card, ctx.State["regex_matched"].([]string)[1])...)
}
func handleLive(ctx *zero.Ctx) {
card, err := bz.GetLiveRoomInfo(ctx.State["regex_matched"].([]string)[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(liveCard2msg(card)...)
}

View File

@@ -0,0 +1,90 @@
package bilibili
import (
"os"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/web"
"github.com/jinzhu/gorm"
"github.com/tidwall/gjson"
)
var (
vtbURLs = [...]string{"https://api.vtbs.moe/v1/short", "https://api.tokyo.vtbs.moe/v1/short", "https://vtbs.musedash.moe/v1/short"}
vdb *vupdb
)
// vupdb 分数数据库
type vupdb gorm.DB
type vup struct {
Mid int64 `gorm:"column:mid;primary_key"`
Uname string `gorm:"column:uname"`
Roomid int64 `gorm:"column:roomid"`
}
func (vup) TableName() string {
return "vup"
}
// initializeVup 初始化vup数据库
func initializeVup(dbpath string) (*vupdb, error) {
if _, err := os.Stat(dbpath); err != nil || os.IsNotExist(err) {
// 生成文件
f, err := os.Create(dbpath)
if err != nil {
return nil, err
}
defer f.Close()
}
gdb, err := gorm.Open("sqlite3", dbpath)
if err != nil {
return nil, err
}
gdb.AutoMigrate(&vup{})
return (*vupdb)(gdb), nil
}
func (vdb *vupdb) insertVupByMid(mid int64, uname string, roomid int64) (err error) {
db := (*gorm.DB)(vdb)
v := vup{
Mid: mid,
Uname: uname,
Roomid: roomid,
}
if err = db.Model(&vup{}).First(&v, "mid = ? ", mid).Error; err != nil {
if gorm.IsRecordNotFoundError(err) {
err = db.Model(&vup{}).Create(&v).Error
}
}
return
}
// filterVup 筛选vup
func (vdb *vupdb) filterVup(ids []int64) (vups []vup, err error) {
db := (*gorm.DB)(vdb)
if err = db.Model(&vup{}).Find(&vups, "mid in (?)", ids).Error; err != nil {
return vups, err
}
return
}
func updateVup() error {
for _, v := range vtbURLs {
data, err := web.GetData(v)
if err != nil {
return err
}
gjson.Get(binary.BytesToString(data), "@this").ForEach(func(key, value gjson.Result) bool {
mid := value.Get("mid").Int()
uname := value.Get("uname").String()
roomid := value.Get("roomid").Int()
err = vdb.insertVupByMid(mid, uname, roomid)
return err == nil
})
if err != nil {
return err
}
}
return nil
}

View File

@@ -0,0 +1,364 @@
// Package bilibili b站推送
package bilibili
import (
"bytes"
"encoding/json"
"fmt"
"strconv"
"time"
"github.com/pkg/errors"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
bz "github.com/FloatTech/AnimeAPI/bilibili"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img/text"
)
const (
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
referer = "https://www.bilibili.com/"
infoURL = "https://api.bilibili.com/x/space/acc/info?mid=%v"
)
// bdb bilibili推送数据库
var bdb *bilibilipushdb
var (
lastTime = map[int64]int64{}
liveStatus = map[int64]int{}
upMap = map[int64]string{}
)
func init() {
en := control.Register("bilibilipush", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "b站推送",
Help: "- 添加b站订阅[uid|name]\n" +
"- 取消b站订阅[uid|name]\n" +
"- 取消b站动态订阅[uid|name]\n" +
"- 取消b站直播订阅[uid|name]\n" +
"- b站推送列表\n" +
"Tips: 需要配合job一起使用, 全局只需要设置一个, 无视响应状态推送, 下为例子\n" +
"记录在\"@every 5m\"触发的指令)\n" +
"拉取b站推送",
PrivateDataFolder: "bilibilipush",
})
// 加载bilibili推送数据库
dbpath := en.DataFolder()
dbfile := dbpath + "push.db"
bdb = initializePush(dbfile)
en.OnRegex(`^添加[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
name, err := getName(buid)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
if err := subscribe(buid, gid); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("已添加" + name + "的订阅"))
})
en.OnRegex(`^取消[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
name, err := getName(buid)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
if err := unsubscribe(buid, gid); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("已取消" + name + "的订阅"))
})
en.OnRegex(`^取消[B|b]站动态订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
name, err := getName(buid)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
if err := unsubscribeDynamic(buid, gid); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("已取消" + name + "的动态订阅"))
})
en.OnRegex(`^取消[B|b]站直播订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
name, err := getName(buid)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if err := unsubscribeLive(buid, gid); err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("已取消" + name + "的直播订阅"))
})
en.OnRegex(`^[B|b]站推送列表$`, zero.UserOrGrpAdmin).SetBlock(true).Handle(func(ctx *zero.Ctx) {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
bpl := bdb.getAllPushByGroup(gid)
msg := "--------B站推送列表--------"
for _, v := range bpl {
if _, ok := upMap[v.BilibiliUID]; !ok {
bdb.updateAllUp()
}
msg += fmt.Sprintf("\nuid:%-12d 动态:", v.BilibiliUID)
if v.DynamicDisable == 0 {
msg += "●"
} else {
msg += "○"
}
msg += " 直播:"
if v.LiveDisable == 0 {
msg += "●"
} else {
msg += "○"
}
msg += " up主" + upMap[v.BilibiliUID]
}
data, err := text.RenderToBase64(msg, text.FontFile, 600, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if id := ctx.SendChain(message.Image("base64://" + binary.BytesToString(data))); id.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
})
en.OnRegex(`拉取[B|b]站推送$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
err := sendDynamic(ctx)
if err != nil {
ctx.SendPrivateMessage(ctx.Event.UserID, message.Text("Error: bilibilipush,", err))
}
err = sendLive(ctx)
if err != nil {
ctx.SendPrivateMessage(ctx.Event.UserID, message.Text("Error: bilibilipush,", err))
}
})
}
// 取得uid的名字
func getName(buid int64) (name string, err error) {
var ok bool
if name, ok = upMap[buid]; !ok {
var data []byte
data, err = web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(infoURL, buid), "GET", referer, ua, nil)
if err != nil {
return
}
status := int(gjson.Get(binary.BytesToString(data), "code").Int())
if status != 0 {
err = errors.New(gjson.Get(binary.BytesToString(data), "message").String())
return
}
name = gjson.Get(binary.BytesToString(data), "data.name").String()
bdb.insertBilibiliUp(buid, name)
upMap[buid] = name
}
return
}
// subscribe 订阅
func subscribe(buid, groupid int64) (err error) {
bpMap := map[string]any{
"bilibili_uid": buid,
"group_id": groupid,
"live_disable": 0,
"dynamic_disable": 0,
}
return bdb.insertOrUpdateLiveAndDynamic(bpMap)
}
// unsubscribe 取消订阅
func unsubscribe(buid, groupid int64) (err error) {
bpMap := map[string]any{
"bilibili_uid": buid,
"group_id": groupid,
"live_disable": 1,
"dynamic_disable": 1,
}
return bdb.insertOrUpdateLiveAndDynamic(bpMap)
}
func unsubscribeDynamic(buid, groupid int64) (err error) {
bpMap := map[string]any{
"bilibili_uid": buid,
"group_id": groupid,
"dynamic_disable": 1,
}
return bdb.insertOrUpdateLiveAndDynamic(bpMap)
}
func unsubscribeLive(buid, groupid int64) (err error) {
bpMap := map[string]any{
"bilibili_uid": buid,
"group_id": groupid,
"live_disable": 1,
}
return bdb.insertOrUpdateLiveAndDynamic(bpMap)
}
func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) {
data, err := web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(bz.SpaceHistoryURL, buid, 0), "GET", referer, ua, nil)
if err != nil {
return
}
cardList = gjson.Get(binary.BytesToString(data), "data.cards").Array()
return
}
func getLiveList(uids ...int64) (string, error) {
m := make(map[string]any)
m["uids"] = uids
b, err := json.Marshal(m)
if err != nil {
return "", err
}
data, err := web.PostData(bz.LiveListURL, "application/json", bytes.NewReader(b))
if err != nil {
return "", err
}
return binary.BytesToString(data), nil
}
func sendDynamic(ctx *zero.Ctx) error {
uids := bdb.getAllBuidByDynamic()
for _, buid := range uids {
time.Sleep(2 * time.Second)
cardList, err := getUserDynamicCard(buid)
if err != nil {
return err
}
if len(cardList) == 0 {
return errors.Errorf("%v的历史动态数为0", buid)
}
t, ok := lastTime[buid]
// 第一次先记录时间,啥也不做
if !ok {
lastTime[buid] = cardList[0].Get("desc.timestamp").Int()
return nil
}
for i := len(cardList) - 1; i >= 0; i-- {
ct := cardList[i].Get("desc.timestamp").Int()
if ct > t && ct > time.Now().Unix()-600 {
lastTime[buid] = ct
m, ok := control.Lookup("bilibilipush")
if ok {
groupList := bdb.getAllGroupByBuidAndDynamic(buid)
dc, err := bz.LoadDynamicDetail(cardList[i].Raw)
if err != nil {
err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err)
return err
}
msg, err := dynamicCard2msg(&dc)
if err != nil {
err = errors.Errorf("动态%v的解析有问题,%v", cardList[i].Get("desc.dynamic_id_str"), err)
return err
}
for _, gid := range groupList {
if m.IsEnabledIn(gid) {
time.Sleep(time.Millisecond * 100)
switch {
case gid > 0:
ctx.SendGroupMessage(gid, msg)
case gid < 0:
ctx.SendPrivateMessage(-gid, msg)
}
}
}
}
}
}
}
return nil
}
func sendLive(ctx *zero.Ctx) error {
uids := bdb.getAllBuidByLive()
ll, err := getLiveList(uids...)
if err != nil {
return err
}
gjson.Get(ll, "data").ForEach(func(key, value gjson.Result) bool {
newStatus := int(value.Get("live_status").Int())
if newStatus == 2 {
newStatus = 0
}
if _, ok := liveStatus[key.Int()]; !ok {
liveStatus[key.Int()] = newStatus
return true
}
oldStatus := liveStatus[key.Int()]
if newStatus != oldStatus && newStatus == 1 {
liveStatus[key.Int()] = newStatus
m, ok := control.Lookup("bilibilipush")
if ok {
groupList := bdb.getAllGroupByBuidAndLive(key.Int())
roomID := value.Get("short_id").Int()
if roomID == 0 {
roomID = value.Get("room_id").Int()
}
lURL := bz.LiveURL + strconv.FormatInt(roomID, 10)
lName := value.Get("uname").String()
lTitle := value.Get("title").String()
lCover := value.Get("cover_from_user").String()
if lCover == "" {
lCover = value.Get("keyframe").String()
}
var msg []message.MessageSegment
msg = append(msg, message.Text(lName+" 正在直播:\n"))
msg = append(msg, message.Text(lTitle))
msg = append(msg, message.Image(lCover))
msg = append(msg, message.Text("直播链接:", lURL))
for _, gid := range groupList {
if m.IsEnabledIn(gid) {
time.Sleep(time.Millisecond * 100)
switch {
case gid > 0:
ctx.SendGroupMessage(gid, msg)
case gid < 0:
ctx.SendPrivateMessage(-gid, msg)
}
}
}
}
} else if newStatus != oldStatus {
liveStatus[key.Int()] = newStatus
}
return true
})
return nil
}

View File

@@ -0,0 +1,149 @@
package bilibili
import (
"encoding/json"
"os"
"github.com/jinzhu/gorm"
)
// bilibilipushdb bilibili推送数据库
type bilibilipushdb gorm.DB
type bilibilipush struct {
ID int64 `gorm:"column:id;primary_key" json:"id"`
BilibiliUID int64 `gorm:"column:bilibili_uid;index:idx_buid_gid" json:"bilibili_uid"`
GroupID int64 `gorm:"column:group_id;index:idx_buid_gid" json:"group_id"`
LiveDisable int64 `gorm:"column:live_disable;default:0" json:"live_disable"`
DynamicDisable int64 `gorm:"column:dynamic_disable;default:0" json:"dynamic_disable"`
}
// TableName ...
func (bilibilipush) TableName() string {
return "bilibili_push"
}
type bilibiliup struct {
BilibiliUID int64 `gorm:"column:bilibili_uid;primary_key"`
Name string `gorm:"column:name"`
}
// TableName ...
func (bilibiliup) TableName() string {
return "bilibili_up"
}
// initializePush 初始化bilibilipushdb数据库
func initializePush(dbpath string) *bilibilipushdb {
var err error
if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) {
// 生成文件
f, err := os.Create(dbpath)
if err != nil {
return nil
}
defer f.Close()
}
gdb, err := gorm.Open("sqlite3", dbpath)
if err != nil {
panic(err)
}
gdb.AutoMigrate(&bilibilipush{}).AutoMigrate(&bilibiliup{})
return (*bilibilipushdb)(gdb)
}
// insertOrUpdateLiveAndDynamic 插入或更新数据库
func (bdb *bilibilipushdb) insertOrUpdateLiveAndDynamic(bpMap map[string]any) (err error) {
db := (*gorm.DB)(bdb)
bp := bilibilipush{}
data, err := json.Marshal(&bpMap)
if err != nil {
return
}
err = json.Unmarshal(data, &bp)
if err != nil {
return
}
if err = db.Model(&bilibilipush{}).First(&bp, "bilibili_uid = ? and group_id = ?", bp.BilibiliUID, bp.GroupID).Error; err != nil {
if gorm.IsRecordNotFoundError(err) {
err = db.Model(&bilibilipush{}).Create(&bp).Error
}
} else {
err = db.Model(&bilibilipush{}).Where("bilibili_uid = ? and group_id = ?", bp.BilibiliUID, bp.GroupID).Update(bpMap).Error
}
return
}
func (bdb *bilibilipushdb) getAllBuidByLive() (buidList []int64) {
db := (*gorm.DB)(bdb)
var bpl []bilibilipush
db.Model(&bilibilipush{}).Find(&bpl, "live_disable = 0")
temp := make(map[int64]bool)
for _, v := range bpl {
_, ok := temp[v.BilibiliUID]
if !ok {
buidList = append(buidList, v.BilibiliUID)
temp[v.BilibiliUID] = true
}
}
return
}
func (bdb *bilibilipushdb) getAllBuidByDynamic() (buidList []int64) {
db := (*gorm.DB)(bdb)
var bpl []bilibilipush
db.Model(&bilibilipush{}).Find(&bpl, "dynamic_disable = 0")
temp := make(map[int64]bool)
for _, v := range bpl {
_, ok := temp[v.BilibiliUID]
if !ok {
buidList = append(buidList, v.BilibiliUID)
temp[v.BilibiliUID] = true
}
}
return
}
func (bdb *bilibilipushdb) getAllGroupByBuidAndLive(buid int64) (groupList []int64) {
db := (*gorm.DB)(bdb)
var bpl []bilibilipush
db.Model(&bilibilipush{}).Find(&bpl, "bilibili_uid = ? and live_disable = 0", buid)
for _, v := range bpl {
groupList = append(groupList, v.GroupID)
}
return
}
func (bdb *bilibilipushdb) getAllGroupByBuidAndDynamic(buid int64) (groupList []int64) {
db := (*gorm.DB)(bdb)
var bpl []bilibilipush
db.Model(&bilibilipush{}).Find(&bpl, "bilibili_uid = ? and dynamic_disable = 0", buid)
for _, v := range bpl {
groupList = append(groupList, v.GroupID)
}
return
}
func (bdb *bilibilipushdb) getAllPushByGroup(groupID int64) (bpl []bilibilipush) {
db := (*gorm.DB)(bdb)
db.Model(&bilibilipush{}).Find(&bpl, "group_id = ? and (live_disable = 0 or dynamic_disable = 0)", groupID)
return
}
func (bdb *bilibilipushdb) insertBilibiliUp(buid int64, name string) {
db := (*gorm.DB)(bdb)
bu := bilibiliup{
BilibiliUID: buid,
Name: name,
}
db.Model(&bilibiliup{}).Create(bu)
}
func (bdb *bilibilipushdb) updateAllUp() {
db := (*gorm.DB)(bdb)
var bul []bilibiliup
db.Model(&bilibiliup{}).Find(&bul)
for _, v := range bul {
upMap[v.BilibiliUID] = v.Name
}
}

326
plugin/bilibili/card2msg.go Normal file
View File

@@ -0,0 +1,326 @@
package bilibili
import (
"encoding/json"
"time"
bz "github.com/FloatTech/AnimeAPI/bilibili"
"github.com/FloatTech/floatbox/binary"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
msgType = map[int]string{
1: "转发了动态",
2: "有图营业",
4: "无图营业",
8: "投稿了视频",
16: "投稿了短视频",
64: "投稿了文章",
256: "投稿了音频",
2048: "发布了简报",
4200: "发布了直播",
4308: "发布了直播",
}
)
// dynamicCard2msg 处理DynCard
func dynamicCard2msg(dynamicCard *bz.DynamicCard) (msg []message.MessageSegment, err error) {
var (
card bz.Card
vote bz.Vote
cType int
)
msg = make([]message.MessageSegment, 0, 16)
// 初始化结构体
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Card), &card)
if err != nil {
return
}
if dynamicCard.Extension.Vote != "" {
err = json.Unmarshal(binary.StringToBytes(dynamicCard.Extension.Vote), &vote)
if err != nil {
return
}
}
cType = dynamicCard.Desc.Type
// 生成消息
switch cType {
case 1:
msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n",
card.Item.Content, "\n",
"转发的内容: \n"))
var originMsg []message.MessageSegment
var co bz.Card
co, err = bz.LoadCardDetail(card.Origin)
if err != nil {
return
}
originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType)
if err != nil {
return
}
msg = append(msg, originMsg...)
case 2:
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Description))
for i := 0; i < len(card.Item.Pictures); i++ {
msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc))
}
case 4:
msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Content, "\n"))
if dynamicCard.Extension.Vote != "" {
msg = append(msg, message.Text("【投票】", vote.Desc, "\n",
"截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n",
"参与人数: ", bz.HumanNum(vote.JoinNum), "\n",
"投票选项( 最多选择", vote.ChoiceCnt, "项 )\n"))
for i := 0; i < len(vote.Options); i++ {
msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n"))
if vote.Options[i].ImgURL != "" {
msg = append(msg, message.Image(vote.Options[i].ImgURL))
}
}
}
case 8:
msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title))
msg = append(msg, message.Image(card.Pic))
msg = append(msg, message.Text(card.Desc, "\n",
card.ShareSubtitle, "\n",
"视频链接: ", card.ShortLink, "\n"))
case 16:
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Description))
msg = append(msg, message.Image(card.Item.Cover.Default))
case 64:
msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title, "\n",
card.Summary))
for i := 0; i < len(card.ImageUrls); i++ {
msg = append(msg, message.Image(card.ImageUrls[i]))
}
if card.ID != 0 {
msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n"))
}
case 256:
msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title))
msg = append(msg, message.Image(card.Cover))
msg = append(msg, message.Text(card.Intro, "\n"))
if card.ID != 0 {
msg = append(msg, message.Text("音频链接: https://www.bilibili.com/audio/au", card.ID, "\n"))
}
case 2048:
msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n",
card.Vest.Content, "\n",
card.Sketch.Title, "\n",
card.Sketch.DescText, "\n"))
msg = append(msg, message.Image(card.Sketch.CoverURL))
msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n"))
case 4308:
if dynamicCard.Desc.UserProfile.Info.Uname != "" {
msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, msgType[cType], "\n"))
}
msg = append(msg, message.Image(card.LivePlayInfo.Cover))
msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n",
"房间号: ", card.LivePlayInfo.RoomID, "\n",
"分区: ", card.LivePlayInfo.ParentAreaName))
if card.LivePlayInfo.ParentAreaName != card.LivePlayInfo.AreaName {
msg = append(msg, message.Text("-", card.LivePlayInfo.AreaName))
}
if card.LivePlayInfo.LiveStatus == 0 {
msg = append(msg, message.Text("未开播 \n"))
} else {
msg = append(msg, message.Text("直播中 ", card.LivePlayInfo.WatchedShow, "\n"))
}
msg = append(msg, message.Text("直播链接: ", card.LivePlayInfo.Link))
default:
msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n"))
}
if dynamicCard.Desc.DynamicIDStr != "" {
msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr))
}
return
}
// card2msg cType=1, 2, 4, 8, 16, 64, 256, 2048, 4200, 4308时,处理Card字符串,cType为card类型
func card2msg(dynamicCard *bz.DynamicCard, card *bz.Card, cType int) (msg []message.MessageSegment, err error) {
var (
vote bz.Vote
)
msg = make([]message.MessageSegment, 0, 16)
// 生成消息
switch cType {
case 1:
msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n",
card.Item.Content, "\n",
"转发的内容: \n"))
var originMsg []message.MessageSegment
var co bz.Card
co, err = bz.LoadCardDetail(card.Origin)
if err != nil {
return
}
originMsg, err = card2msg(dynamicCard, &co, card.Item.OrigType)
if err != nil {
return
}
msg = append(msg, originMsg...)
case 2:
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Description))
for i := 0; i < len(card.Item.Pictures); i++ {
msg = append(msg, message.Image(card.Item.Pictures[i].ImgSrc))
}
case 4:
msg = append(msg, message.Text(card.User.Uname, "在", time.Unix(int64(card.Item.Timestamp), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Content, "\n"))
if dynamicCard.Extension.Vote != "" {
msg = append(msg, message.Text("【投票】", vote.Desc, "\n",
"截止日期: ", time.Unix(int64(vote.Endtime), 0).Format("2006-01-02 15:04:05"), "\n",
"参与人数: ", bz.HumanNum(vote.JoinNum), "\n",
"投票选项( 最多选择", vote.ChoiceCnt, "项 )\n"))
for i := 0; i < len(vote.Options); i++ {
msg = append(msg, message.Text("- ", vote.Options[i].Idx, ". ", vote.Options[i].Desc, "\n"))
if vote.Options[i].ImgURL != "" {
msg = append(msg, message.Image(vote.Options[i].ImgURL))
}
}
}
case 8:
msg = append(msg, message.Text(card.Owner.Name, "在", time.Unix(int64(card.Pubdate), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title))
msg = append(msg, message.Image(card.Pic))
msg = append(msg, message.Text(card.Desc, "\n",
card.ShareSubtitle, "\n",
"视频链接: ", card.ShortLink, "\n"))
case 16:
msg = append(msg, message.Text(card.User.Name, "在", time.Unix(int64(card.Item.UploadTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Item.Description))
msg = append(msg, message.Image(card.Item.Cover.Default))
case 64:
msg = append(msg, message.Text(card.Author.(map[string]any)["name"], "在", time.Unix(int64(card.PublishTime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title, "\n",
card.Summary))
for i := 0; i < len(card.ImageUrls); i++ {
msg = append(msg, message.Image(card.ImageUrls[i]))
}
if card.ID != 0 {
msg = append(msg, message.Text("文章链接: https://www.bilibili.com/read/cv", card.ID, "\n"))
}
case 256:
msg = append(msg, message.Text(card.Upper, "在", time.Unix(int64(card.Ctime), 0).Format("2006-01-02 15:04:05"), msgType[cType], "\n",
card.Title))
msg = append(msg, message.Image(card.Cover))
msg = append(msg, message.Text(card.Intro, "\n"))
if card.ID != 0 {
msg = append(msg, message.Text("音频链接: https://www.bilibili.com/audio/au", card.ID, "\n"))
}
case 2048:
msg = append(msg, message.Text(card.User.Uname, msgType[cType], "\n",
card.Vest.Content, "\n",
card.Sketch.Title, "\n",
card.Sketch.DescText, "\n"))
msg = append(msg, message.Image(card.Sketch.CoverURL))
msg = append(msg, message.Text("分享链接: ", card.Sketch.TargetURL, "\n"))
case 4308:
if dynamicCard.Desc.UserProfile.Info.Uname != "" {
msg = append(msg, message.Text(dynamicCard.Desc.UserProfile.Info.Uname, msgType[cType], "\n"))
}
msg = append(msg, message.Image(card.LivePlayInfo.Cover))
msg = append(msg, message.Text("\n", card.LivePlayInfo.Title, "\n",
"房间号: ", card.LivePlayInfo.RoomID, "\n",
"分区: ", card.LivePlayInfo.ParentAreaName))
if card.LivePlayInfo.ParentAreaName != card.LivePlayInfo.AreaName {
msg = append(msg, message.Text("-", card.LivePlayInfo.AreaName))
}
if card.LivePlayInfo.LiveStatus == 0 {
msg = append(msg, message.Text("未开播 \n"))
} else {
msg = append(msg, message.Text("直播中 ", card.LivePlayInfo.WatchedShow, "\n"))
}
msg = append(msg, message.Text("直播链接: ", card.LivePlayInfo.Link))
default:
msg = append(msg, message.Text("动态id: ", dynamicCard.Desc.DynamicIDStr, "未知动态类型: ", cType, "\n"))
}
if dynamicCard.Desc.DynamicIDStr != "" {
msg = append(msg, message.Text("动态链接: ", bz.TURL, dynamicCard.Desc.DynamicIDStr))
}
return
}
// dynamicDetail 用动态id查动态信息
func dynamicDetail(dynamicIDStr string) (msg []message.MessageSegment, err error) {
dyc, err := bz.GetDynamicDetail(dynamicIDStr)
if err != nil {
return
}
return dynamicCard2msg(&dyc)
}
// articleCard2msg 专栏转消息
func articleCard2msg(card bz.Card, defaultID string) (msg []message.MessageSegment) {
msg = make([]message.MessageSegment, 0, 16)
for i := 0; i < len(card.OriginImageUrls); i++ {
msg = append(msg, message.Image(card.OriginImageUrls[i]))
}
msg = append(msg, message.Text("\n", card.Title, "\n", "UP主: ", card.AuthorName, "\n",
"阅读: ", bz.HumanNum(card.Stats.View), " 评论: ", bz.HumanNum(card.Stats.Reply), "\n",
bz.CVURL, defaultID))
return
}
// liveCard2msg 直播卡片转消息
func liveCard2msg(card bz.RoomCard) (msg []message.MessageSegment) {
msg = make([]message.MessageSegment, 0, 16)
msg = append(msg, message.Image(card.RoomInfo.Keyframe))
msg = append(msg, message.Text("\n", card.RoomInfo.Title, "\n",
"主播: ", card.AnchorInfo.BaseInfo.Uname, "\n",
"房间号: ", card.RoomInfo.RoomID, "\n"))
if card.RoomInfo.ShortID != 0 {
msg = append(msg, message.Text("短号: ", card.RoomInfo.ShortID, "\n"))
}
msg = append(msg, message.Text("分区: ", card.RoomInfo.ParentAreaName))
if card.RoomInfo.ParentAreaName != card.RoomInfo.AreaName {
msg = append(msg, message.Text("-", card.RoomInfo.AreaName))
}
if card.RoomInfo.LiveStatus == 0 {
msg = append(msg, message.Text("未开播 \n"))
} else {
msg = append(msg, message.Text("直播中 ", bz.HumanNum(card.RoomInfo.Online), "人气\n"))
}
if card.RoomInfo.ShortID != 0 {
msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.ShortID))
} else {
msg = append(msg, message.Text("直播间链接: ", bz.LURL, card.RoomInfo.RoomID))
}
return
}
// videoCard2msg 视频卡片转消息
func videoCard2msg(card bz.Card) (msg []message.MessageSegment, err error) {
var mCard bz.MemberCard
msg = make([]message.MessageSegment, 0, 16)
mCard, err = bz.GetMemberCard(card.Owner.Mid)
if err != nil {
return
}
msg = append(msg, message.Text("标题: ", card.Title, "\n"))
if card.Rights.IsCooperation == 1 {
for i := 0; i < len(card.Staff); i++ {
msg = append(msg, message.Text(card.Staff[i].Title, ": ", card.Staff[i].Name, " 粉丝: ", bz.HumanNum(card.Staff[i].Follower), "\n"))
}
} else {
msg = append(msg, message.Text("UP主: ", card.Owner.Name, " 粉丝: ", bz.HumanNum(mCard.Fans), "\n"))
}
msg = append(msg, message.Text("播放: ", bz.HumanNum(card.Stat.View), " 弹幕: ", bz.HumanNum(card.Stat.Danmaku)))
msg = append(msg, message.Image(card.Pic))
msg = append(msg, message.Text("\n点赞: ", bz.HumanNum(card.Stat.Like), " 投币: ", bz.HumanNum(card.Stat.Coin), "\n",
"收藏: ", bz.HumanNum(card.Stat.Favorite), " 分享: ", bz.HumanNum(card.Stat.Share), "\n",
bz.VURL, card.BvID))
return
}

View File

@@ -0,0 +1,84 @@
package bilibili
import (
"testing"
bz "github.com/FloatTech/AnimeAPI/bilibili"
)
func TestArticleInfo(t *testing.T) {
card, err := bz.GetArticleInfo("17279244")
if err != nil {
t.Fatal(err)
}
t.Log(articleCard2msg(card, "17279244"))
}
func TestDynamicDetail(t *testing.T) {
t.Log("cType = 1")
t.Log(dynamicDetail("642279068898689029"))
t.Log("cType = 2")
t.Log(dynamicDetail("642470680290394121"))
t.Log("cType = 2048")
t.Log(dynamicDetail("642277677329285174"))
t.Log("cType = 4")
t.Log(dynamicDetail("642154347357011968"))
t.Log("cType = 8")
t.Log(dynamicDetail("675892999274627104"))
t.Log("cType = 4308")
t.Log(dynamicDetail("668598718656675844"))
t.Log("cType = 64")
t.Log(dynamicDetail("675966082178088963"))
t.Log("cType = 256")
t.Log(dynamicDetail("599253048535707632"))
t.Log("cType = 4,投票类型")
t.Log(dynamicDetail("677231070435868704"))
}
func TestMemberCard(t *testing.T) {
card, err := bz.GetMemberCard(2)
if err != nil {
t.Fatal(err)
}
t.Logf("%+v\n", card)
}
func TestVideoInfo(t *testing.T) {
card, err := bz.GetVideoInfo("10007")
if err != nil {
t.Fatal(err)
}
t.Log(videoCard2msg(card))
card, err = bz.GetVideoInfo("BV1xx411c7mD")
if err != nil {
t.Fatal(err)
}
t.Log(videoCard2msg(card))
card, err = bz.GetVideoInfo("bv1xx411c7mD")
if err != nil {
t.Fatal(err)
}
t.Log(videoCard2msg(card))
card, err = bz.GetVideoInfo("BV1mF411j7iU")
if err != nil {
t.Fatal(err)
}
t.Log(videoCard2msg(card))
}
func TestLiveRoomInfo(t *testing.T) {
card, err := bz.GetLiveRoomInfo("83171")
if err != nil {
t.Fatal(err)
}
t.Log(liveCard2msg(card))
}

View File

@@ -0,0 +1,75 @@
// Package bookreview 书评
package bookreview
import (
"time"
log "github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/FloatTech/floatbox/binary"
fcext "github.com/FloatTech/floatbox/ctxext"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img/text"
)
func init() {
engine := control.Register("bookreview", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "哀伤雪刃推书书评",
Help: "- 书评[xxx]\n- 随机书评",
PublicDataFolder: "BookReview",
})
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.DBPath = engine.DataFolder() + "bookreview.db"
// os.RemoveAll(dbpath)
_, _ = engine.GetLazyData("bookreview.db", true)
err := db.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Create("bookreview", &book{})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
n, err := db.Count("bookreview")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
log.Infof("[bookreview]读取%d条书评", n)
return true
})
// 中文、英文、数字但不包括下划线等符号
engine.OnRegex("^书评([\u4E00-\u9FA5A-Za-z0-9]{1,25})$", getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
b := getBookReviewByKeyword(ctx.State["regex_matched"].([]string)[1])
data, err := text.RenderToBase64(b.BookReview, text.FontFile, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if id := ctx.SendChain(message.Image("base64://" + binary.BytesToString(data))); id.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
})
engine.OnFullMatch("随机书评", getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
br := getRandomBookReview()
data, err := text.RenderToBase64(br.BookReview, text.FontFile, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if id := ctx.SendChain(message.Image("base64://" + binary.BytesToString(data))); id.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
})
}

View File

@@ -0,0 +1,21 @@
package bookreview
import sql "github.com/FloatTech/sqlite"
type book struct {
ID uint64 `db:"id"`
BookReview string `db:"bookreview"`
}
var db = &sql.Sqlite{}
// 暂时随机选择一个书评
func getBookReviewByKeyword(keyword string) (b book) {
_ = db.Find("bookreview", &b, "where bookreview LIKE '%"+keyword+"%'")
return
}
func getRandomBookReview() (b book) {
_ = db.Pick("bookreview", &b)
return
}

View File

@@ -0,0 +1,50 @@
// Package breakrepeat 打断复读
package breakrepeat
import (
"math/rand"
"strconv"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/RomiChan/syncx"
zero "github.com/wdvxdr1123/ZeroBot"
)
const throttle = 3 // 不可超过 9
var sm syncx.Map[int64, string]
func init() {
engine := control.Register("breakrepeat", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "打断复读",
Help: "- 打断" + strconv.Itoa(throttle) + "次以上复读\n",
})
engine.On("message/group", zero.OnlyGroup, func(ctx *zero.Ctx) bool {
return !zero.HasPicture(ctx)
}).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
gid := ctx.Event.GroupID
raw := ctx.Event.RawMessage
r, ok := sm.Load(gid)
if !ok || len(r) <= 3 || r[3:] != raw {
sm.Store(gid, "0: "+raw)
return
}
c := int(r[0] - '0')
if c < throttle {
sm.Store(gid, strconv.Itoa(c+1)+": "+raw)
return
}
sm.Delete(gid)
if len(r) > 5 {
ru := []rune(r[3:])
rand.Shuffle(len(ru), func(i, j int) {
ru[i], ru[j] = ru[j], ru[i]
})
r = string(ru)
}
ctx.Send(r)
})
}

View File

@@ -0,0 +1,139 @@
// Package cangtoushi 藏头诗
package cangtoushi
import (
"fmt"
"io"
"net/http"
"net/http/cookiejar"
"net/url"
"strings"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/antchfx/htmlquery"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
const (
loginURL = "https://www.shicimingju.com/cangtoushi/"
searchURL = "https://www.shicimingju.com/cangtoushi/index.html"
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
referer = "https://www.shicimingju.com/cangtoushi/index.html"
)
var (
gCurCookieJar *cookiejar.Jar
csrf string
)
func init() {
engine := control.Register("cangtoushi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "藏头诗, 藏尾诗",
Help: "- 藏头诗[xxx]\n- 藏尾诗[xxx]",
})
engine.OnRegex(`藏头诗\s?([一-龥]{3,10})$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
kw := ctx.State["regex_matched"].([]string)[1]
err := login()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
data, err := search(kw, "7", "0")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
text, err := dealHTML(helper.BytesToString(data))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text(text))
})
engine.OnRegex(`藏尾诗\s?([一-龥]{3,10})$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
kw := ctx.State["regex_matched"].([]string)[1]
err := login()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
data, err := search(kw, "7", "2")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
text, err := dealHTML(helper.BytesToString(data))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text(text))
})
}
func login() error {
gCurCookieJar, _ = cookiejar.New(nil)
client := &http.Client{
Jar: gCurCookieJar,
}
request, err := http.NewRequest("GET", loginURL, nil)
if err != nil {
return err
}
request.Header.Add("User-Agent", ua)
response, err := client.Do(request)
if err != nil {
return err
}
data, err := io.ReadAll(response.Body)
if err != nil {
return err
}
response.Body.Close()
doc, err := htmlquery.Parse(strings.NewReader(helper.BytesToString(data)))
if err != nil {
return err
}
csrf = htmlquery.SelectAttr(htmlquery.FindOne(doc, "//input[@name='_csrf']"), "value")
return nil
}
func search(kw, zishu, position string) (data []byte, err error) {
postStr := fmt.Sprintf("_csrf=%s&kw=%s&zishu=%s&position=%s", url.QueryEscape(csrf), url.QueryEscape(kw), zishu, position)
client := &http.Client{
Jar: gCurCookieJar,
}
request, err := http.NewRequest("POST", searchURL, strings.NewReader(postStr))
if err != nil {
return nil, err
}
request.Header.Add("Referer", referer)
request.Header.Add("User-Agent", ua)
request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
response, err := client.Do(request)
if err != nil {
return nil, err
}
data, err = io.ReadAll(response.Body)
if err != nil {
return nil, err
}
response.Body.Close()
return
}
func dealHTML(data string) (text string, err error) {
doc, err := htmlquery.Parse(strings.NewReader(data))
if err != nil {
return "", err
}
text = htmlquery.InnerText(htmlquery.FindOne(doc, "//div[@class='card']/div[@class='card']"))
text = strings.ReplaceAll(text, " ", "")
text = strings.Replace(text, "\n", "", 1)
return text, nil
}

View File

@@ -6,16 +6,25 @@ import (
"strconv"
"time"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/rate"
"github.com/wdvxdr1123/ZeroBot/message"
)
var poke = rate.NewManager(time.Minute*5, 8) // 戳一戳
var (
poke = rate.NewManager[int64](time.Minute*5, 8) // 戳一戳
engine = control.Register("chat", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "基础反应, 群空调",
Help: "chat\n- [BOT名字]\n- [戳一戳BOT]\n- 空调开\n- 空调关\n- 群温度\n- 设置温度[正整数]",
})
)
func init() { // 插件主体
// 被喊名字
zero.OnFullMatch("", zero.OnlyToMe).SetBlock(false).FirstPriority().
engine.OnFullMatch("", zero.OnlyToMe).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
var nickname = zero.BotConfig.NickName[0]
time.Sleep(time.Second * 1)
@@ -29,15 +38,15 @@ func init() { // 插件主体
))
})
// 戳一戳
zero.On("notice/notify/poke", zero.OnlyToMe).SetBlock(false).FirstPriority().
engine.On("notice/notify/poke", zero.OnlyToMe).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
var nickname = zero.BotConfig.NickName[0]
switch {
case poke.Load(ctx.Event.UserID).AcquireN(3):
case poke.Load(ctx.Event.GroupID).AcquireN(3):
// 5分钟共8块命令牌 一次消耗3块命令牌
time.Sleep(time.Second * 1)
ctx.SendChain(message.Text("请不要戳", nickname, " >_<"))
case poke.Load(ctx.Event.UserID).Acquire():
case poke.Load(ctx.Event.GroupID).Acquire():
// 5分钟共8块命令牌 一次消耗1块命令牌
time.Sleep(time.Second * 1)
ctx.SendChain(message.Text("喂(#`O) 戳", nickname, "干嘛!"))
@@ -48,18 +57,18 @@ func init() { // 插件主体
// 群空调
var AirConditTemp = map[int64]int{}
var AirConditSwitch = map[int64]bool{}
zero.OnFullMatch("空调开").SetBlock(true).FirstPriority().
engine.OnFullMatch("空调开").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
AirConditSwitch[ctx.Event.GroupID] = true
ctx.SendChain(message.Text("❄️哔~"))
})
zero.OnFullMatch("空调关").SetBlock(true).FirstPriority().
engine.OnFullMatch("空调关").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
AirConditSwitch[ctx.Event.GroupID] = false
delete(AirConditTemp, ctx.Event.GroupID)
ctx.SendChain(message.Text("💤哔~"))
})
zero.OnRegex(`设置温度(\d+)`).SetBlock(true).FirstPriority().
engine.OnRegex(`设置温度(\d+)`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if _, exist := AirConditTemp[ctx.Event.GroupID]; !exist {
AirConditTemp[ctx.Event.GroupID] = 26
@@ -78,7 +87,7 @@ func init() { // 插件主体
))
}
})
zero.OnFullMatch(`群温度`).SetBlock(true).FirstPriority().
engine.OnFullMatch(`群温度`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if _, exist := AirConditTemp[ctx.Event.GroupID]; !exist {
AirConditTemp[ctx.Event.GroupID] = 26

37
plugin/choose/choose.go Normal file
View File

@@ -0,0 +1,37 @@
// Package choose 选择困难症帮手
package choose
import (
"math/rand"
"strconv"
"strings"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
engine := control.Register("choose", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "选择困难症帮手",
Help: "例: 选择可口可乐还是百事可乐\n" +
"选择肯德基还是麦当劳还是必胜客",
})
engine.OnPrefix("选择").SetBlock(true).Handle(handle)
}
func handle(ctx *zero.Ctx) {
rawOptions := strings.Split(ctx.State["args"].(string), "还是")
var options = make([]string, 0)
for count, option := range rawOptions {
options = append(options, strconv.Itoa(count+1)+", "+option)
}
result := rawOptions[rand.Intn(len(rawOptions))]
name := ctx.Event.Sender.NickName
ctx.SendChain(message.Text("> ", name, "\n",
"你的选项有:", "\n",
strings.Join(options, "\n"), "\n",
"你最终会选: ", result,
))
}

View File

@@ -0,0 +1,73 @@
// Package chouxianghua 抽象话转化
package chouxianghua
import (
"time"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
fcext "github.com/FloatTech/floatbox/ctxext"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
)
func init() {
en := control.Register("chouxianghua", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "翻译为抽象话",
Help: "- 抽象翻译xxx",
PublicDataFolder: "ChouXiangHua",
})
en.OnRegex("^抽象翻译((\\s|[\\r\\n]|[\\p{Han}\\p{P}A-Za-z0-9])+)$",
fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.DBPath = en.DataFolder() + "cxh.db"
// os.RemoveAll(dbpath)
_, _ = en.GetLazyData("cxh.db", true)
err := db.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Create("pinyin", &pinyin{})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
n, err := db.Count("pinyin")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
logrus.Printf("[chouxianghua]读取%d条拼音", n)
return true
}),
).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
r := cx(ctx.State["regex_matched"].([]string)[1])
ctx.SendChain(message.Text(r))
})
}
func cx(s string) (r string) {
h := []rune(s)
for i := 0; i < len(h); i++ {
if i < len(h)-1 {
e := getEmojiByPronun(getPronunByDWord(h[i], h[i+1]))
if e != "" {
r += e
i++
continue
}
}
e := getEmojiByPronun(getPinyinByWord(string(h[i])))
if e != "" {
r += e
continue
}
r += string(h[i])
}
return
}

View File

@@ -0,0 +1,30 @@
package chouxianghua
import sql "github.com/FloatTech/sqlite"
type pinyin struct {
Word string `db:"word"`
Pronun string `db:"pronunciation"`
}
type emoji struct {
Pronun string `db:"pronunciation"`
Emoji string `db:"emoji"`
}
var db = &sql.Sqlite{}
func getPinyinByWord(word string) string {
var p pinyin
_ = db.Find("pinyin", &p, "where word = '"+word+"'")
return p.Pronun
}
func getPronunByDWord(w0, w1 rune) string {
return getPinyinByWord(string(w0)) + getPinyinByWord(string(w1))
}
func getEmojiByPronun(pronun string) string {
var e emoji
_ = db.Find("emoji", &e, "where pronunciation = '"+pronun+"'")
return e.Emoji
}

33
plugin/chrev/init.go Normal file
View File

@@ -0,0 +1,33 @@
// Package chrev 英文字符反转
package chrev
import (
"strings"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
// 初始化engine
engine := control.Register("chrev", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "英文字符翻转",
Help: "例: 翻转 I love you",
})
// 处理字符翻转指令
engine.OnRegex(`^翻转\s*([A-Za-z\s]*)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 获取需要翻转的字符串
str := ctx.State["regex_matched"].([]string)[1]
// 将字符顺序翻转
tmp := strings.Builder{}
for i := len(str) - 1; i >= 0; i-- {
tmp.WriteRune(charMap[str[i]])
}
// 发送翻转后的字符串
ctx.SendChain(message.Text(tmp.String()))
})
}

59
plugin/chrev/map.go Normal file
View File

@@ -0,0 +1,59 @@
package chrev
var charMap [256]rune
func init() {
charMap[' '] = ' '
charMap['a'] = 'ɐ'
charMap['b'] = 'q'
charMap['c'] = 'ɔ'
charMap['d'] = 'p'
charMap['e'] = 'ǝ'
charMap['f'] = 'ɟ'
charMap['g'] = 'ƃ'
charMap['h'] = 'ɥ'
charMap['i'] = 'ᴉ'
charMap['j'] = 'ɾ'
charMap['k'] = 'ʞ'
charMap['l'] = 'l'
charMap['m'] = 'ɯ'
charMap['n'] = 'u'
charMap['o'] = 'o'
charMap['p'] = 'd'
charMap['q'] = 'b'
charMap['r'] = 'ɹ'
charMap['s'] = 's'
charMap['t'] = 'ʇ'
charMap['u'] = 'n'
charMap['v'] = 'ʌ'
charMap['w'] = 'ʍ'
charMap['x'] = 'x'
charMap['y'] = 'ʎ'
charMap['z'] = 'z'
charMap['A'] = '∀'
charMap['B'] = 'ᗺ'
charMap['C'] = 'Ɔ'
charMap['D'] = 'ᗡ'
charMap['E'] = 'Ǝ'
charMap['F'] = 'Ⅎ'
charMap['G'] = '⅁'
charMap['H'] = 'H'
charMap['I'] = 'I'
charMap['J'] = 'ſ'
charMap['K'] = 'ʞ'
charMap['L'] = '˥'
charMap['M'] = 'W'
charMap['N'] = 'N'
charMap['O'] = 'O'
charMap['P'] = 'Ԁ'
charMap['Q'] = 'Ò'
charMap['R'] = 'ᴚ'
charMap['S'] = 'S'
charMap['T'] = '⏊'
charMap['U'] = '∩'
charMap['V'] = 'Λ'
charMap['W'] = 'M'
charMap['X'] = 'X'
charMap['Y'] = '⅄'
charMap['Z'] = 'Z'
}

68
plugin/coser/coser.go Normal file
View File

@@ -0,0 +1,68 @@
// Package coser images
package coser
import (
"errors"
"math/rand"
"os"
"time"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
"github.com/FloatTech/AnimeAPI/setu"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
)
var (
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36"
coserURL = "http://ovooa.com/API/cosplay/api.php"
)
func init() {
p, err := setu.NewPool(setu.DefaultPoolDir,
func(s string) (string, error) {
if s != "coser" {
return "", errors.New("invalid call")
}
typ := setu.DefaultPoolDir + "/" + "coser"
if file.IsNotExist(typ) {
err := os.MkdirAll(typ, 0755)
if err != nil {
return "", err
}
}
data, err := web.RequestDataWith(web.NewDefaultClient(), coserURL, "GET", "", ua, nil)
if err != nil {
return "", err
}
arr := gjson.Get(helper.BytesToString(data), "data.data").Array()
pic := arr[rand.Intn(len(arr))]
return pic.String(), nil
}, web.GetData, time.Minute)
if err != nil {
panic(err)
}
control.Register("coser", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "三次元coser",
Help: "- coser",
}).ApplySingle(ctxext.DefaultSingle).OnFullMatch("coser").SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
pic, err := p.Roll("coser")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if id := ctx.Send(message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("file:///"+file.BOTPATH+"/"+pic))}).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
})
}

74
plugin/cpstory/cpstory.go Normal file
View File

@@ -0,0 +1,74 @@
// Package cpstory cp短打
package cpstory
import (
"strings"
"time"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/math"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
)
func init() {
engine := control.Register("cpstory", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "cp短打", // 这里也许有更好的名字
Help: "- 组cp[@xxx][@xxx]\n- 磕cp大老师 雪乃",
PublicDataFolder: "CpStory",
})
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.DBPath = engine.DataFolder() + "cp.db"
// os.RemoveAll(dbpath)
_, _ = engine.GetLazyData("cp.db", true)
err := db.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Create("cp_story", &cpstory{})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
n, err := db.Count("cp_story")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
logrus.Printf("[cpstory]读取%d条故事", n)
return true
})
engine.OnRegex("^组cp.*?(\\d+).*?(\\d+)", zero.OnlyGroup, getdb).SetBlock(true).Handle(func(ctx *zero.Ctx) {
cs := getRandomCpStory()
gong := ctx.CardOrNickName(math.Str2Int64(ctx.State["regex_matched"].([]string)[1]))
shou := ctx.CardOrNickName(math.Str2Int64(ctx.State["regex_matched"].([]string)[2]))
text := strings.ReplaceAll(cs.Story, "<攻>", gong)
text = strings.ReplaceAll(text, "<受>", shou)
text = strings.ReplaceAll(text, cs.Gong, gong)
text = strings.ReplaceAll(text, cs.Shou, shou)
ctx.SendChain(message.Text(text))
})
engine.OnPrefix("磕cp", getdb).SetBlock(true).Handle(func(ctx *zero.Ctx) {
cs := getRandomCpStory()
params := strings.Split(ctx.State["args"].(string), " ")
if len(params) < 2 {
ctx.SendChain(message.Text(ctx.Event.MessageID), message.Text("请用空格分开两个人名"))
} else {
gong := params[0]
shou := params[1]
text := strings.ReplaceAll(cs.Story, "<攻>", gong)
text = strings.ReplaceAll(text, "<受>", shou)
text = strings.ReplaceAll(text, cs.Gong, gong)
text = strings.ReplaceAll(text, cs.Shou, gong)
ctx.SendChain(message.Text(text))
}
})
}

17
plugin/cpstory/model.go Normal file
View File

@@ -0,0 +1,17 @@
package cpstory
import sql "github.com/FloatTech/sqlite"
type cpstory struct {
ID int64 `db:"id"`
Gong string `db:"gong"`
Shou string `db:"shou"`
Story string `db:"story"`
}
var db = &sql.Sqlite{}
func getRandomCpStory() (cs cpstory) {
_ = db.Pick("cp_story", &cs)
return
}

74
plugin/curse/curse.go Normal file
View File

@@ -0,0 +1,74 @@
// Package curse 骂人插件(求骂,自卫)
package curse
import (
"time"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/process"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
)
const (
minLevel = "min"
maxLevel = "max"
)
func init() {
engine := control.Register("curse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Brief: "骂人反击",
Help: "- 骂我\n- 大力骂我",
PublicDataFolder: "Curse",
})
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.DBPath = engine.DataFolder() + "curse.db"
_, err := engine.GetLazyData("curse.db", true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Create("curse", &curse{})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
c, err := db.Count("curse")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
logrus.Infoln("[curse]加载", c, "条骂人语录")
return true
})
engine.OnFullMatch("骂我", getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
process.SleepAbout1sTo2s()
text := getRandomCurseByLevel(minLevel).Text
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(text))
})
engine.OnFullMatch("大力骂我", getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
process.SleepAbout1sTo2s()
text := getRandomCurseByLevel(maxLevel).Text
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(text))
})
engine.OnKeywordGroup([]string{"他妈", "公交车", "你妈", "操", "屎", "去死", "快死", "我日", "逼", "尼玛", "艾滋", "癌症", "有病", "烦你", "你爹", "屮", "cnm"}, zero.OnlyToMe, getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
text := getRandomCurseByLevel(maxLevel).Text
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(text))
})
}

16
plugin/curse/model.go Normal file
View File

@@ -0,0 +1,16 @@
package curse
import sql "github.com/FloatTech/sqlite"
type curse struct {
ID uint32 `db:"id"`
Text string `db:"text"`
Level string `db:"level"`
}
var db = &sql.Sqlite{}
func getRandomCurseByLevel(level string) (c curse) {
_ = db.Find("curse", &c, "where level = '"+level+"' ORDER BY RANDOM() limit 1")
return
}

51
plugin/danbooru/main.go Normal file
View File

@@ -0,0 +1,51 @@
// Package deepdanbooru 二次元图片标签识别
package deepdanbooru
import (
"crypto/md5"
"encoding/hex"
"strings"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
func init() { // 插件主体
engine := control.Register("danbooru", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "二次元图片标签识别",
Help: "- 鉴赏图片[图片]",
PrivateDataFolder: "danbooru",
})
cachefolder := engine.DataFolder()
// 上传一张图进行评价
engine.OnKeywordGroup([]string{"鉴赏图片"}, zero.OnlyGroup, zero.MustProvidePicture).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中..."))
for _, url := range ctx.State["image_url"].([]string) {
t, st, err := tagurl("", url)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
digest := md5.Sum(helper.StringToBytes(url))
f := cachefolder + hex.EncodeToString(digest[:])
if file.IsNotExist(f) {
_ = writer.SavePNG2Path(f, t)
}
m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("file:///"+file.BOTPATH+"/"+f))}
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text("tags: ", strings.Join(st.tseq, ","))))
if id := ctx.Send(m).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
}
})
}

119
plugin/danbooru/tag.go Normal file
View File

@@ -0,0 +1,119 @@
package deepdanbooru
import (
"bytes"
"encoding/json"
"fmt"
"image"
"net/url"
"sort"
"github.com/Coloured-glaze/gg"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
"github.com/FloatTech/zbputils/control"
imgutils "github.com/FloatTech/zbputils/img"
"github.com/FloatTech/zbputils/img/text" // jpg png gif
_ "golang.org/x/image/webp" // webp
)
const api = "https://nsfwtag.azurewebsites.net/api/tag?limit=0.5&url="
type sorttags struct {
tags map[string]float64
tseq []string
}
func newsorttags(tags map[string]float64) (s *sorttags) {
t := make([]string, 0, len(tags))
for k := range tags {
t = append(t, k)
}
return &sorttags{tags: tags, tseq: t}
}
func (s *sorttags) Len() int {
return len(s.tags)
}
func (s *sorttags) Less(i, j int) bool {
v1 := s.tseq[i]
v2 := s.tseq[j]
return s.tags[v1] >= s.tags[v2]
}
// Swap swaps the elements with indexes i and j.
func (s *sorttags) Swap(i, j int) {
s.tseq[j], s.tseq[i] = s.tseq[i], s.tseq[j]
}
func tagurl(name, u string) (im image.Image, st *sorttags, err error) {
ch := make(chan []byte, 1)
go func() {
var data []byte
data, err = web.GetData(u)
ch <- data
}()
data, err := web.GetData(api + url.QueryEscape(u))
if err != nil {
return
}
tags := make(map[string]float64)
err = json.Unmarshal(data, &tags)
if err != nil {
return
}
longestlen := 0
for k := range tags {
if len(k) > longestlen {
longestlen = len(k)
}
}
longestlen++
st = newsorttags(tags)
sort.Sort(st)
_, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true)
if err != nil {
return
}
_, err = file.GetLazyData(text.ConsolasFontFile, control.Md5File, true)
if err != nil {
return
}
data = <-ch
if err != nil {
return
}
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
return
}
img = imgutils.Limit(img, 1280, 720)
canvas := gg.NewContext(img.Bounds().Size().X, img.Bounds().Size().Y+int(float64(img.Bounds().Size().X)*0.2)+len(tags)*img.Bounds().Size().X/25)
canvas.SetRGB(1, 1, 1)
canvas.Clear()
canvas.DrawImage(img, 0, 0)
if err = canvas.LoadFontFace(text.BoldFontFile, float64(img.Bounds().Size().X)*0.1); err != nil {
return
}
canvas.SetRGB(0, 0, 0)
canvas.DrawString(name, float64(img.Bounds().Size().X)*0.02, float64(img.Bounds().Size().Y)+float64(img.Bounds().Size().X)*0.1)
i := float64(img.Bounds().Size().Y) + float64(img.Bounds().Size().X)*0.2
if err = canvas.LoadFontFace(text.ConsolasFontFile, float64(img.Bounds().Size().X)*0.04); err != nil {
return
}
rate := float64(img.Bounds().Size().X) * 0.04
for _, k := range st.tseq {
canvas.DrawString(fmt.Sprintf("* %-*s -%.3f-", longestlen, k, tags[k]), float64(img.Bounds().Size().X)*0.04, i)
i += rate
}
im = canvas.Image()
return
}

56
plugin/diana/bing.go Normal file
View File

@@ -0,0 +1,56 @@
// Package diana 虚拟偶像女团 A-SOUL 成员嘉然相关
package diana
import (
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
fcext "github.com/FloatTech/floatbox/ctxext"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/ZeroBot-Plugin/plugin/diana/data"
)
var engine = control.Register("diana", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "嘉然相关", // 也许使用常用功能当Brief更好
Help: "- 小作文\n" +
"- 发大病\n" +
"- 教你一篇小作文[作文]",
PublicDataFolder: "Diana",
})
func init() {
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
err := data.LoadText(engine.DataFolder() + "text.db")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
})
// 随机发送一篇上面的小作文
engine.OnFullMatch("小作文", getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 绕过第一行发病
ctx.SendChain(message.Text(data.RandText()))
})
// 逆天
engine.OnFullMatch("发大病", getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 第一行是发病
ctx.SendChain(message.Text(data.HentaiText()))
})
// 增加小作文
engine.OnRegex(`^教你一篇小作文(.*)$`, zero.AdminPermission, getdb).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := data.AddText(ctx.State["regex_matched"].([]string)[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
} else {
ctx.SendChain(message.Text("记住啦!"))
}
})
}

71
plugin/diana/data/text.go Normal file
View File

@@ -0,0 +1,71 @@
// Package data 加载位于 datapath 的小作文
package data
import (
"crypto/md5"
"encoding/binary"
"time"
binutils "github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/file"
sql "github.com/FloatTech/sqlite"
"github.com/FloatTech/zbputils/control"
"github.com/sirupsen/logrus"
)
var db = sql.Sqlite{}
type text struct {
ID int64 `db:"id"`
Data string `db:"data"`
}
// LoadText 加载小作文
func LoadText(dbfile string) error {
_, err := file.GetLazyData(dbfile, control.Md5File, false)
db.DBPath = dbfile
if err != nil {
return err
}
err = db.Open(time.Hour * 24)
if err != nil {
return err
}
err = db.Create("text", &text{})
if err != nil {
return err
}
c, err := db.Count("text")
if err != nil {
return err
}
logrus.Printf("[Diana]读取%d条小作文", c)
return nil
}
// AddText 添加小作文
func AddText(txt string) error {
s := md5.Sum(binutils.StringToBytes(txt))
i := binary.LittleEndian.Uint64(s[:8])
return db.Insert("text", &text{ID: int64(i), Data: txt})
}
// RandText 随机小作文
func RandText() string {
var t text
err := db.Pick("text", &t)
if err != nil {
return err.Error()
}
return t.Data
}
// HentaiText 发大病
func HentaiText() string {
var t text
err := db.Find("text", &t, "where id = -3802576048116006195")
if err != nil {
return err.Error()
}
return t.Data
}

39
plugin/dress/api.go Normal file
View File

@@ -0,0 +1,39 @@
package dress
import (
"fmt"
"github.com/FloatTech/floatbox/web"
"github.com/tidwall/gjson"
)
const (
dressURL = "http://www.yoooooooooo.com/gitdress"
male = "dress"
female = "girldress"
dressListURL = dressURL + "/%v/album/list.json"
dressDetailURL = dressURL + "/%v/album/%v/info.json"
dressImageURL = dressURL + "/%v/album/%v/%v-m.webp"
)
func dressList(sex string) (dressList []string, err error) {
data, err := web.GetData(fmt.Sprintf(dressListURL, sex))
if err != nil {
return
}
arr := gjson.ParseBytes(data).Get("@this").Array()
dressList = make([]string, len(arr))
for i, v := range arr {
dressList[i] = v.String()
}
return
}
func detail(sex, name string) (count int, err error) {
data, err := web.GetData(fmt.Sprintf(dressDetailURL, sex, name))
if err != nil {
return
}
count = int(gjson.ParseBytes(data).Get("@this.#").Int())
return
}

113
plugin/dress/dress.go Normal file
View File

@@ -0,0 +1,113 @@
// Package dress 女装
package dress
import (
"fmt"
"math/rand"
"strconv"
"strings"
"time"
"github.com/FloatTech/floatbox/binary"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img/text"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() { // 插件主体
engine := control.Register("dress", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "女装",
Help: "女装\n" +
"- 女装\n" +
"- 男装\n" +
"- 随机女装\n" +
"- 随机男装",
PrivateDataFolder: "dress",
})
engine.OnFullMatchGroup([]string{"女装", "男装"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
matched := ctx.State["matched"].(string)
sex := male
if matched == "男装" {
sex = female
}
next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
nameList, err := dressList(sex)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
tex := "请输入" + matched + "序号\n"
for i, v := range nameList {
tex += fmt.Sprintf("%d. %s\n", i, v)
}
base64Str, err := text.RenderToBase64(tex, text.FontFile, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("base64://" + binary.BytesToString(base64Str)))
for {
select {
case <-time.After(time.Second * 120):
ctx.SendChain(message.Text(matched, "指令过期"))
return
case c := <-recv:
msg := c.Event.Message.ExtractPlainText()
num, err := strconv.Atoi(msg)
if err != nil {
ctx.SendChain(message.Text("请输入数字!"))
continue
}
if num < 0 || num >= len(nameList) {
ctx.SendChain(message.Text("序号非法!"))
continue
}
name := nameList[num]
sendImage(ctx, sex, matched, name)
return
}
}
})
engine.OnFullMatchGroup([]string{"随机女装", "随机男装"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
matched := strings.TrimPrefix(ctx.State["matched"].(string), "随机")
sex := male
if matched == "男装" {
sex = female
}
nameList, err := dressList(sex)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
name := nameList[rand.Intn(len(nameList))]
sendImage(ctx, sex, matched, name)
})
}
func sendImage(ctx *zero.Ctx, sex, matched, name string) {
ctx.SendChain(message.Text("请欣赏", matched, ": ", name))
count, err := detail(sex, name)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
imageList := make([]string, count)
for i := range imageList {
imageList[i] = fmt.Sprintf(dressImageURL, sex, name, i+1)
}
m := message.Message{}
for _, v := range imageList {
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Image(v)))
}
if id := ctx.Send(m).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
}

109
plugin/drift_bottle/main.go Normal file
View File

@@ -0,0 +1,109 @@
// Package driftbottle 漂流瓶
package driftbottle
import (
"fmt"
"hash/crc64"
"strconv"
"sync"
"time"
"unicode/utf8"
"github.com/FloatTech/floatbox/binary"
sql "github.com/FloatTech/sqlite"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
type sea struct {
ID int64 `db:"id"` // ID qq_grp_name_msg 的 crc64 hashCheck.
QQ int64 `db:"qq"` // Get current user(Who sends this)
Name string `db:"Name"` // his or her name at that time:P
Msg string `db:"msg"` // What he or she sent to bot?
Grp int64 `db:"grp"` // which group sends this msg?
Time string `db:"time"` // we need to know the current time,master>
}
var seaSide = &sql.Sqlite{}
var seaLocker sync.RWMutex
// We need a container to inject what we need :(
func init() {
en := control.Register("driftbottle", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "漂流瓶",
Help: "- @bot pick" + "- @bot throw xxx (xxx为投递内容)",
PrivateDataFolder: "driftbottle",
})
seaSide.DBPath = en.DataFolder() + "sea.db"
err := seaSide.Open(time.Hour * 24)
if err != nil {
panic(err)
}
_ = createChannel(seaSide)
en.OnFullMatch("pick", zero.OnlyToMe, zero.OnlyGroup).Limit(ctxext.LimitByGroup).SetBlock(true).Handle(func(ctx *zero.Ctx) {
be, err := fetchBottle(seaSide)
if err != nil {
ctx.SendChain(message.Text("ERR:", err))
}
idstr := strconv.Itoa(int(be.ID))
qqstr := strconv.Itoa(int(be.QQ))
grpstr := strconv.Itoa(int(be.Grp))
botname := zero.BotConfig.NickName[0]
msg := message.Message{message.CustomNode(botname, ctx.Event.SelfID, botname+"试着帮你捞出来了这个~\nID:"+idstr+"\n投递人: "+be.Name+"("+qqstr+")"+"\n群号: "+grpstr+"\n时间: "+be.Time+"\n内容: \n"+be.Msg)}
ctx.Send(msg)
})
en.OnRegex(`throw.*?(.*)`, zero.OnlyToMe, zero.OnlyGroup).SetBlock(true).Handle(func(ctx *zero.Ctx) {
senderFormatTime := time.Unix(ctx.Event.Time, 0).Format("2006-01-02 15:04:05")
rawSenderMessage := ctx.State["regex_matched"].([]string)[1]
rawMessageCallBack := message.UnescapeCQCodeText(rawSenderMessage)
keyWordsNum := utf8.RuneCountInString(rawMessageCallBack)
if keyWordsNum < 10 {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("需要投递的内容过少( "))
return
}
// check current needs and prepare to throw drift_bottle.
err = globalbottle(
ctx.Event.UserID,
ctx.Event.GroupID,
senderFormatTime,
ctx.CardOrNickName(ctx.Event.UserID),
rawMessageCallBack,
).throw(seaSide)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("已经帮你丢出去了哦~")))
})
}
func globalbottle(qq, grp int64, time, name, msg string) *sea { // Check as if the User is available and collect information to store.
id := int64(crc64.Checksum(binary.StringToBytes(fmt.Sprintf("%d_%d_%s_%s_%s", grp, qq, time, name, msg)), crc64.MakeTable(crc64.ISO)))
return &sea{ID: id, Grp: grp, Time: time, QQ: qq, Name: name, Msg: msg}
}
func (be *sea) throw(db *sql.Sqlite) error {
seaLocker.Lock()
defer seaLocker.Unlock()
return db.Insert("global", be)
}
func fetchBottle(db *sql.Sqlite) (*sea, error) {
seaLocker.Lock()
defer seaLocker.Unlock()
be := new(sea)
return be, db.Pick("global", be)
}
func createChannel(db *sql.Sqlite) error {
seaLocker.Lock()
defer seaLocker.Unlock()
return db.Create("global", &sea{})
}

249
plugin/emojimix/emoji.go Normal file
View File

@@ -0,0 +1,249 @@
// Package emojimix 合成emoji
package emojimix
var emojis = map[rune]int64{
128516: 20201001, // 😄 grinning face with smiling eyes
128512: 20201001, // 😀 grinning face
128578: 20201001, // 🙂 slightly smiling face
128579: 20201001, // 🙃 upside-down face
128521: 20201001, // 😉 winking face
128522: 20201001, // 😊 smiling face with smiling eyes
128518: 20201001, // 😆 grinning squinting face
128515: 20201001, // 😃 grinning face with big eyes
128513: 20201001, // 😁 beaming face with smiling eyes
129315: 20201001, // 🤣 rolling on the floor laughing
128517: 20201001, // 😅 grinning face with sweat
128514: 20201001, // 😂 face with tears of joy
128519: 20201001, // 😇 smiling face with halo
129392: 20201001, // 🥰 smiling face with hearts
128525: 20201001, // 😍 smiling face with heart-eyes
128536: 20201001, // 😘 face blowing a kiss
129321: 20201001, // 🤩 star-struck
128535: 20201001, // 😗 kissing face
128538: 20201001, // 😚 kissing face with closed eyes
128537: 20201001, // 😙 kissing face with smiling eyes
128539: 20201001, // 😛 face with tongue
128541: 20201001, // 😝 squinting face with tongue
128523: 20201001, // 😋 face savoring food
129394: 20201001, // 🥲 smiling face with tear
129297: 20201001, // 🤑 money-mouth face
128540: 20201001, // 😜 winking face with tongue
129303: 20201001, // 🤗 smiling face with open hands hugs
129323: 20201001, // 🤫 shushing face quiet whisper
129300: 20201001, // 🤔 thinking face question hmmm
129325: 20201001, // 🤭 face with hand over mouth embarrassed
129320: 20201001, // 🤨 face with raised eyebrow question
129296: 20201001, // 🤐 zipper-mouth face
128528: 20201001, // 😐 neutral face
128529: 20201001, // 😑 expressionless face
128566: 20201001, // 😶 face without mouth
129322: 20201001, // 🤪 zany face
128527: 20201001, // 😏 smirking face suspicious
128530: 20201001, // 😒 unamused face
128580: 20201001, // 🙄 face with rolling eyes
128556: 20201001, // 😬 grimacing face
128558: 20210218, // 😮 face exhaling
129317: 20201001, // 🤥 lying face
128524: 20201001, // 😌 relieved face
128532: 20201001, // 😔 pensive face
128554: 20201001, // 😪 sleepy face
129316: 20201001, // 🤤 drooling face
128564: 20201001, // 😴 sleeping face
128567: 20201001, // 😷 face with medical mask
129298: 20201001, // 🤒 face with thermometer
129301: 20201001, // 🤕 face with head-bandage
129314: 20201001, // 🤢 nauseated face
129326: 20201001, // 🤮 face vomiting throw
129319: 20201001, // 🤧 sneezing face
129397: 20201001, // 🥵 hot face warm
129398: 20201001, // 🥶 cold face freezing ice
128565: 20201001, // 😵 face with crossed-out eyes
129396: 20201001, // 🥴 woozy face drunk tipsy drug high
129327: 20201001, // 🤯 exploding head mindblow
129312: 20201001, // 🤠 cowboy hat face
129395: 20201001, // 🥳 partying face
129400: 20201001, // 🥸 disguised face
129488: 20201001, // 🧐 face with monocle glasses
128526: 20201001, // 😎 smiling face with sunglasses
128533: 20201001, // 😕 confused face
128543: 20201001, // 😟 worried face
128577: 20201001, // 🙁 slightly frowning face
128559: 20201001, // 😯 hushed face
128562: 20201001, // 😲 astonished face
129299: 20201001, // 🤓 nerd face glasses
128563: 20201001, // 😳 flushed face
129402: 20201001, // 🥺 pleading face
128551: 20201001, // 😧 anguished face
128552: 20201001, // 😨 fearful face
128550: 20201001, // 😦 frowning face with open mouth
128560: 20201001, // 😰 anxious face with sweat
128549: 20201001, // 😥 sad but relieved face
128557: 20201001, // 😭 loudly crying face
128553: 20201001, // 😩 weary face
128546: 20201001, // 😢 crying face
128547: 20201001, // 😣 persevering face
128544: 20201001, // 😠 angry face
128531: 20201001, // 😓 downcast face with sweat
128534: 20201001, // 😖 confounded face
129324: 20201001, // 🤬 face with symbols on mouth
128542: 20201001, // 😞 disappointed face
128555: 20201001, // 😫 tired face
128548: 20201001, // 😤 face with steam from nose
129393: 20201001, // 🥱 yawning face
128169: 20201001, // 💩 pile of poo
128545: 20201001, // 😡 pouting face
128561: 20201001, // 😱 face screaming in fear
128127: 20201001, // 👿 angry face with horns
128128: 20201001, // 💀 skull
128125: 20201001, // 👽 alien
128520: 20201001, // 😈 smiling face with horns devil
129313: 20201001, // 🤡 clown face
128123: 20201001, // 👻 ghost
129302: 20201001, // 🤖 robot
128175: 20201001, // 💯 hundred points percent
128064: 20201001, // 👀 eyes
127801: 20201001, // 🌹 rose flower
127804: 20201001, // 🌼 blossom flower
127799: 20201001, // 🌷 tulip flower
127797: 20201001, // 🌵 cactus
127821: 20201001, // 🍍 pineapple
127874: 20201001, // 🎂 birthday cake
127751: 20210831, // 🌇 sunset
129473: 20201001, // 🧁 cupcake muffin
127911: 20210521, // 🎧 headphone earphone
127800: 20210218, // 🌸 cherry blossom flower
129440: 20201001, // 🦠 microbe germ bacteria virus covid corona
128144: 20201001, // 💐 bouquet flowers
127789: 20201001, // 🌭 hot dog food
128139: 20201001, // 💋 kiss mark lips
127875: 20201001, // 🎃 jack-o-lantern pumpkin
129472: 20201001, // 🧀 cheese wedge
9749: 20201001, // ☕ hot beverage coffee cup tea
127882: 20201001, // 🎊 confetti ball
127880: 20201001, // 🎈 balloon
9924: 20201001, // ⛄ snowman without snow
128142: 20201001, // 💎 gem stone crystal diamond
127794: 20201001, // 🌲 evergreen tree
129410: 20210218, // 🦂 scorpion
128584: 20201001, // 🙈 see-no-evil monkey
128148: 20201001, // 💔 broken heart
128140: 20201001, // 💌 love letter heart
128152: 20201001, // 💘 heart with arrow
128159: 20201001, // 💟 heart decoration
128158: 20201001, // 💞 revolving hearts
128147: 20201001, // 💓 beating heart
128149: 20201001, // 💕 two hearts
128151: 20201001, // 💗 growing heart
129505: 20201001, // 🧡 orange heart
128155: 20201001, // 💛 yellow heart
10084: 20210218, // ❤ mending heart
128156: 20201001, // 💜 purple heart
128154: 20201001, // 💚 green heart
128153: 20201001, // 💙 blue heart
129294: 20201001, // 🤎 brown heart
129293: 20201001, // 🤍 white heart
128420: 20201001, // 🖤 black heart
128150: 20201001, // 💖 sparkling heart
128157: 20201001, // 💝 heart with ribbon
127873: 20211115, // 🎁 wrapped-gift
129717: 20211115, // 🪵 wood
127942: 20211115, // 🏆 trophy
127838: 20210831, // 🍞 bread
128240: 20201001, // 📰 newspaper
128302: 20201001, // 🔮 crystal ball
128081: 20201001, // 👑 crown
128055: 20201001, // 🐷 pig face
129412: 20210831, // 🦄 unicorn
127771: 20201001, // 🌛 first quarter moon face
129420: 20201001, // 🦌 deer
129668: 20210521, // 🪄 magic wand
128171: 20201001, // 💫 dizzy
128049: 20201001, // 🐱 meow cat face
129409: 20201001, // 🦁 lion
128293: 20201001, // 🔥 fire
128038: 20210831, // 🐦 bird
129415: 20201001, // 🦇 bat
129417: 20210831, // 🦉 owl
127752: 20201001, // 🌈 rainbow
128053: 20201001, // 🐵 monkey face
128029: 20201001, // 🐝 honeybee bumblebee wasp
128034: 20201001, // 🐢 turtle
128025: 20201001, // 🐙 octopus
129433: 20201001, // 🦙 llama alpaca
128016: 20210831, // 🐐 goat
128060: 20201001, // 🐼 panda
128040: 20201001, // 🐨 koala
129445: 20201001, // 🦥 sloth
128059: 20210831, // 🐻 bear
128048: 20201001, // 🐰 rabbit face
129428: 20201001, // 🦔 hedgehog
128054: 20211115, // 🐶 dog puppy
128041: 20211115, // 🐩 poodle dog
129437: 20211115, // 🦝 raccoon
128039: 20211115, // 🐧 penguin
128012: 20210218, // 🐌 snail
128045: 20201001, // 🐭 mouse face rat
128031: 20210831, // 🐟 fish
127757: 20201001, // 🌍 globe showing Europe-Africa
127774: 20201001, // 🌞 sun with face
127775: 20201001, // 🌟 glowing star
11088: 20201001, // ⭐ star
127772: 20201001, // 🌜 last quarter moon face
129361: 20201001, // 🥑 avocado
127820: 20211115, // 🍌 banana
127827: 20210831, // 🍓 strawberry
127819: 20210521, // 🍋 lemon
127818: 20211115, // 🍊 tangerine orange
}
var qqface = map[int]rune{
0: 128558, // 😮 face exhaling
1: 128556, // 😬 grimacing face
2: 128525, // 😍 smiling face with heart-eyes
4: 128526, // 😎 smiling face with sunglasses
5: 128557, // 😭 loudly crying face
6: 129402, // 🥺 pleading face
7: 129296, // 🤐 zipper-mouth face
8: 128554, // 😪 sleepy face
11: 128545, // 😡 pouting face
12: 128539, // 😛 face with tongue
13: 128513, // 😁 beaming face with smiling eyes
14: 128578, // 🙂 slightly smiling face
15: 128577, // 🙁 slightly frowning face
16: 128526, // 😎 smiling face with sunglasses
19: 129326, // 🤮 face vomiting throw
20: 129325, // 🤭 face with hand over mouth embarrassed
21: 128522, // 😊 smiling face with smiling eyes
23: 128533, // 😕 confused face
24: 128523, // 😋 face savoring food
27: 128531, // 😓 downcast face with sweat
28: 128516, // 😄 grinning face with smiling eyes
31: 129324, // 🤬 face with symbols on mouth
32: 129300, // 🤔 thinking face question hmmm
33: 129323, // 🤫 shushing face quiet whisper
34: 128565, // 😵 face with crossed-out eyes
35: 128547, // 😣 persevering face
37: 128128, // 💀 skull
46: 128055, // 🐷 pig face
53: 127874, // 🎂 birthday cake
59: 128169, // 💩 pile of poo
60: 9749, // ☕ hot beverage coffee cup tea
63: 127801, // 🌹 rose flower
66: 10084, // ❤ mending heart
67: 128148, // 💔 broken heart
69: 127873, // 🎁 wrapped-gift
74: 127774, // 🌞 sun with face
75: 127772, // 🌜 last quarter moon face
96: 128517, // 😅 grinning face with sweat
104: 129393, // 🥱 yawning face
109: 128535, // 😗 kissing face
110: 128562, // 😲 astonished face
111: 129402, // 🥺 pleading face
172: 128539, // 😛 face with tongue
182: 128514, // 😂 face with tears of joy
187: 128123, // 👻 ghost
247: 128567, // 😷 face with medical mask
272: 128579, // 🙃 upside-down face
320: 129395, // 🥳 partying face
325: 128561, // 😱 face screaming in fear
}

101
plugin/emojimix/mix.go Normal file
View File

@@ -0,0 +1,101 @@
// Package emojimix 合成emoji
package emojimix
import (
"fmt"
"net/http"
"strconv"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const bed = "https://www.gstatic.com/android/keyboard/emojikitchen/%d/u%x/u%x_u%x.png"
func init() {
control.Register("emojimix", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "合成emoji",
Help: "- [emoji][emoji]",
}).OnMessage(match).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
r := ctx.State["emojimix"].([]rune)
logrus.Debugln("[emojimix] match:", r)
r1, r2 := r[0], r[1]
u1 := fmt.Sprintf(bed, emojis[r1], r1, r1, r2)
u2 := fmt.Sprintf(bed, emojis[r2], r2, r2, r1)
logrus.Debugln("[emojimix] u1:", u1)
logrus.Debugln("[emojimix] u2:", u2)
resp1, err := http.Head(u1)
if err == nil {
resp1.Body.Close()
if resp1.StatusCode == http.StatusOK {
ctx.SendChain(message.Image(u1))
return
}
}
resp2, err := http.Head(u2)
if err == nil {
resp2.Body.Close()
if resp2.StatusCode == http.StatusOK {
ctx.SendChain(message.Image(u2))
return
}
}
})
}
func match(ctx *zero.Ctx) bool {
logrus.Debugln("[emojimix] msg:", ctx.Event.Message)
if len(ctx.Event.Message) == 2 {
r1 := face2emoji(ctx.Event.Message[0])
if _, ok := emojis[r1]; !ok {
return false
}
r2 := face2emoji(ctx.Event.Message[1])
if _, ok := emojis[r2]; !ok {
return false
}
ctx.State["emojimix"] = []rune{r1, r2}
return true
}
r := []rune(ctx.Event.RawMessage)
logrus.Debugln("[emojimix] raw msg:", ctx.Event.RawMessage)
if len(r) == 2 {
if _, ok := emojis[r[0]]; !ok {
return false
}
if _, ok := emojis[r[1]]; !ok {
return false
}
ctx.State["emojimix"] = r
return true
}
return false
}
func face2emoji(face message.MessageSegment) rune {
if face.Type == "text" {
r := []rune(face.Data["text"])
if len(r) != 1 {
return 0
}
return r[0]
}
if face.Type != "face" {
return 0
}
id, err := strconv.Atoi(face.Data["id"])
if err != nil {
return 0
}
if r, ok := qqface[id]; ok {
return r
}
return 0
}

45
plugin/event/data.go Normal file
View File

@@ -0,0 +1,45 @@
package event
type storage int64
// 申请
func (s *storage) setapply(on bool) {
if on {
*s |= 0b001
} else {
*s &= 0b110
}
}
// 邀请
func (s *storage) setinvite(on bool) {
if on {
*s |= 0b010
} else {
*s &= 0b101
}
}
// 主人
func (s *storage) setmaster(on bool) {
if on {
*s |= 0b100
} else {
*s &= 0b011
}
}
// 申请
func (s *storage) isapplyon() bool {
return *s&0b001 > 0
}
// 邀请
func (s *storage) isinviteon() bool {
return *s&0b010 > 0
}
// 主人
func (s *storage) ismasteroff() bool {
return *s&0b100 > 0
}

144
plugin/event/event.go Normal file
View File

@@ -0,0 +1,144 @@
// Package event 好友申请以及群聊邀请事件处理
package event
import (
"encoding/binary"
"strconv"
"time"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
base14 "github.com/fumiama/go-base16384"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
engine := control.Register("event", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "好友申请和群聊邀请事件处理",
Help: "- [开启|关闭]自动同意[申请|邀请|主人]\n" +
"- [同意|拒绝][申请|邀请][flag]\n" +
"Tips: 信息默认发送给主人列表第一位, 默认同意所有主人的事件, flag跟随事件一起发送",
})
engine.On("request/group/invite").SetBlock(false).
Handle(func(ctx *zero.Ctx) {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if ok {
su := zero.BotConfig.SuperUsers[0]
now := time.Unix(ctx.Event.Time, 0).Format("2006-01-02 15:04:05")
flag, err := strconv.ParseInt(ctx.Event.Flag, 10, 64)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
var buf [8]byte
binary.BigEndian.PutUint64(buf[:], uint64(flag))
es := base14.EncodeToString(buf[1:])
userid := ctx.Event.UserID
username := ctx.CardOrNickName(userid)
data := (storage)(c.GetData(-su))
groupid := ctx.Event.GroupID
groupname := ctx.GetGroupInfo(groupid, true).Name
logrus.Info("[event]收到来自[", username, "](", userid, ")的群聊邀请,群:[", groupname, "](", groupid, ")")
if data.isinviteon() || (!data.ismasteroff() && zero.SuperUserPermission(ctx)) {
ctx.SetGroupAddRequest(ctx.Event.Flag, "invite", true, "")
ctx.SendPrivateForwardMessage(su, message.Message{message.CustomNode(username, userid,
"已自动同意在"+now+"收到来自"+
"\n用户:["+username+"]("+strconv.FormatInt(userid, 10)+")的群聊邀请"+
"\n群聊:["+groupname+"]("+strconv.FormatInt(groupid, 10)+")"+
"\nflag:"+es)})
return
}
ctx.SendPrivateForwardMessage(su,
message.Message{message.CustomNode(username, userid,
"在"+now+"收到来自"+
"\n用户:["+username+"]("+strconv.FormatInt(userid, 10)+")的群聊邀请"+
"\n群聊:["+groupname+"]("+strconv.FormatInt(groupid, 10)+")"+
"\n请在下方复制flag并在前面加上:"+
"\n同意/拒绝邀请,来决定同意还是拒绝"),
message.CustomNode(username, userid, es)})
}
})
engine.On("request/friend").SetBlock(false).
Handle(func(ctx *zero.Ctx) {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if ok {
su := zero.BotConfig.SuperUsers[0]
now := time.Unix(ctx.Event.Time, 0).Format("2006-01-02 15:04:05")
flag, err := strconv.ParseInt(ctx.Event.Flag, 10, 64)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
var buf [8]byte
binary.BigEndian.PutUint64(buf[:], uint64(flag))
es := base14.EncodeToString(buf[1:])
comment := ctx.Event.Comment
userid := ctx.Event.UserID
username := ctx.CardOrNickName(userid)
data := (storage)(c.GetData(-su))
logrus.Info("[event]收到来自[", username, "](", userid, ")的好友申请")
if data.isapplyon() || (!data.ismasteroff() && zero.SuperUserPermission(ctx)) {
ctx.SetFriendAddRequest(ctx.Event.Flag, true, "")
ctx.SendPrivateForwardMessage(su, message.Message{message.CustomNode(username, userid,
"已自动同意在"+now+"收到来自"+
"\n用户:["+username+"]("+strconv.FormatInt(userid, 10)+")"+
"\n的好友请求:"+comment+
"\nflag:"+es)})
return
}
ctx.SendPrivateForwardMessage(su,
message.Message{message.CustomNode(username, userid,
"在"+now+"收到来自"+
"\n用户:["+username+"]("+strconv.FormatInt(userid, 10)+")"+
"\n的好友请求:"+comment+
"\n请在下方复制flag并在前面加上:"+
"\n同意/拒绝申请,来决定同意还是拒绝"),
message.CustomNode(username, userid, es)})
}
})
engine.OnRegex(`^(同意|拒绝)(申请|邀请)\s*([一-踀]{4})\s*(.*)$`, zero.SuperUserPermission, zero.OnlyPrivate).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
su := zero.BotConfig.SuperUsers[0]
cmd := ctx.State["regex_matched"].([]string)[1]
org := ctx.State["regex_matched"].([]string)[2]
es := ctx.State["regex_matched"].([]string)[3]
other := ctx.State["regex_matched"].([]string)[4]
var buf [8]byte
copy(buf[1:], base14.DecodeFromString(es))
flag := strconv.FormatInt(int64(binary.BigEndian.Uint64(buf[:])), 10)
ok := cmd == "同意"
switch org {
case "申请":
ctx.SetFriendAddRequest(flag, ok, other)
ctx.SendPrivateMessage(su, message.Text("已", cmd, org))
case "邀请":
ctx.SetGroupAddRequest(flag, "invite", ok, other)
ctx.SendPrivateMessage(su, message.Text("已", cmd, org))
}
})
engine.OnRegex(`^(开启|关闭)自动同意(申请|邀请|主人)$`, zero.SuperUserPermission, zero.OnlyPrivate).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
c := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
su := zero.BotConfig.SuperUsers[0]
option := ctx.State["regex_matched"].([]string)[1]
from := ctx.State["regex_matched"].([]string)[2]
data := (storage)(c.GetData(-su))
switch from {
case "申请":
data.setapply(option == "开启")
case "邀请":
data.setinvite(option == "开启")
case "主人":
data.setmaster(option == "关闭")
}
err := c.SetData(-su, int64(data))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("已设置自动同意" + from + "为" + option))
})
}

45
plugin/font/main.go Normal file
View File

@@ -0,0 +1,45 @@
// Package font 渲染任意文字到图片
package font
import (
"github.com/FloatTech/floatbox/binary"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img/text"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
control.Register("font", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "渲染任意文字到图片",
Help: "- (用[字体])渲染文字xxx\n可选字体: [终末体|终末变体|紫罗兰体|樱酥体|Consolas体|苹方体]",
}).OnRegex(`^(用.+)?渲染文字([\s\S]+)$`).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
fnt := ctx.State["regex_matched"].([]string)[1]
txt := ctx.State["regex_matched"].([]string)[2]
switch fnt {
case "用终末体":
fnt = text.SyumatuFontFile
case "用终末变体":
fnt = text.NisiFontFile
case "用紫罗兰体":
fnt = text.VioletEvergardenFontFile
case "用樱酥体":
fnt = text.SakuraFontFile
case "用Consolas体":
fnt = text.ConsolasFontFile
case "用苹方体":
fallthrough
default:
fnt = text.FontFile
}
b, err := text.RenderToBase64(txt, fnt, 400, 20)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("base64://" + binary.BytesToString(b)))
})
}

249
plugin/fortune/fortune.go Normal file
View File

@@ -0,0 +1,249 @@
// Package fortune 每日运势
package fortune
import (
"archive/zip"
"crypto/md5"
"encoding/hex"
"encoding/json"
"image"
"io"
"os"
"strconv"
"github.com/Coloured-glaze/gg" // 注册了 jpg png gif
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/floatbox/math"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img/pool"
)
const (
// 底图缓存位置
images = "data/Fortune/"
// 基础文件位置
omikujson = "data/Fortune/text.json"
// 字体文件位置
font = "data/Font/sakura.ttf"
// 生成图缓存位置
cache = images + "cache/"
)
var (
// 底图类型列表
table = [...]string{"车万", "DC4", "爱因斯坦", "星空列车", "樱云之恋", "富婆妹", "李清歌", "公主连结", "原神", "明日方舟", "碧蓝航线", "碧蓝幻想", "战双", "阴阳师", "赛马娘", "东方归言录", "奇异恩典", "夏日口袋", "ASoul", "Hololive"}
// 映射底图与 index
index = make(map[string]uint8)
// 签文
omikujis []map[string]string
)
func init() {
// 插件主体
en := control.Register("fortune", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "每日运势",
Help: "- 运势 | 抽签\n" +
"- 设置底图[车万 | DC4 | 爱因斯坦 | 星空列车 | 樱云之恋 | 富婆妹 | 李清歌 | 公主连结 | 原神 | 明日方舟 | 碧蓝航线 | 碧蓝幻想 | 战双 | 阴阳师 | 赛马娘 | 东方归言录 | 奇异恩典 | 夏日口袋 | ASoul | Hololive]",
PublicDataFolder: "Fortune",
})
_ = os.RemoveAll(cache)
err := os.MkdirAll(cache, 0755)
if err != nil {
panic(err)
}
for i, s := range table {
index[s] = uint8(i)
}
en.OnRegex(`^设置底图\s?(.*)`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
gid := ctx.Event.GroupID
if gid <= 0 {
// 个人用户设为负数
gid = -ctx.Event.UserID
}
i, ok := index[ctx.State["regex_matched"].([]string)[1]]
if ok {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if ok {
err := c.SetData(gid, int64(i)&0xff)
if err != nil {
ctx.SendChain(message.Text("设置失败:", err))
return
}
ctx.SendChain(message.Text("设置成功~"))
return
}
ctx.SendChain(message.Text("设置失败: 找不到插件"))
return
}
ctx.SendChain(message.Text("没有这个底图哦~"))
})
en.OnFullMatchGroup([]string{"运势", "抽签"}, fcext.DoOnceOnSuccess(
func(ctx *zero.Ctx) bool {
data, err := file.GetLazyData(omikujson, control.Md5File, false)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = json.Unmarshal(data, &omikujis)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
_, err = file.GetLazyData(font, control.Md5File, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
},
)).Limit(ctxext.LimitByGroup).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 获取该群背景类型,默认车万
kind := "车万"
gid := ctx.Event.GroupID
if gid <= 0 {
// 个人用户设为负数
gid = -ctx.Event.UserID
}
logrus.Debugln("[fortune]gid:", ctx.Event.GroupID, "uid:", ctx.Event.UserID)
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if ok {
v := uint8(c.GetData(gid) & 0xff)
if int(v) < len(table) {
kind = table[v]
}
}
// 检查背景图片是否存在
zipfile := images + kind + ".zip"
_, err := file.GetLazyData(zipfile, control.Md5File, false)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 随机获取背景
background, index, err := randimage(zipfile, ctx)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 随机获取签文
randtextindex := fcext.RandSenderPerDayN(ctx.Event.UserID, len(omikujis))
title, text := omikujis[randtextindex]["title"], omikujis[randtextindex]["content"]
digest := md5.Sum(helper.StringToBytes(zipfile + strconv.Itoa(index) + title + text))
cachefile := cache + hex.EncodeToString(digest[:])
err = pool.SendImageFromPool(cachefile, cachefile, func() error {
f, err := os.Create(cachefile)
if err != nil {
return err
}
_, err = draw(background, title, text, f)
_ = f.Close()
return err
}, ctxext.Send(ctx), ctxext.GetMessage(ctx))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
})
}
// @function randimage 随机选取zip内的文件
// @param path zip路径
// @param ctx *zero.Ctx
// @return 文件路径 & 错误信息
func randimage(path string, ctx *zero.Ctx) (im image.Image, index int, err error) {
reader, err := zip.OpenReader(path)
if err != nil {
return
}
defer reader.Close()
file := reader.File[fcext.RandSenderPerDayN(ctx.Event.UserID, len(reader.File))]
f, err := file.Open()
if err != nil {
return
}
defer f.Close()
im, _, err = image.Decode(f)
return
}
// @function draw 绘制运势图
// @param background 背景图片路径
// @param seed 随机数种子
// @param title 签名
// @param text 签文
// @return 错误信息
func draw(back image.Image, title, txt string, f io.Writer) (int64, error) {
canvas := gg.NewContext(back.Bounds().Size().Y, back.Bounds().Size().X)
canvas.DrawImage(back, 0, 0)
// 写标题
canvas.SetRGB(1, 1, 1)
if err := canvas.LoadFontFace(font, 45); err != nil {
return -1, err
}
sw, _ := canvas.MeasureString(title)
canvas.DrawString(title, 140-sw/2, 112)
// 写正文
canvas.SetRGB(0, 0, 0)
if err := canvas.LoadFontFace(font, 23); err != nil {
return -1, err
}
tw, th := canvas.MeasureString("测")
tw, th = tw+10, th+10
r := []rune(txt)
xsum := rowsnum(len(r), 9)
switch xsum {
default:
for i, o := range r {
xnow := rowsnum(i+1, 9)
ysum := math.Min(len(r)-(xnow-1)*9, 9)
ynow := i%9 + 1
canvas.DrawString(string(o), -offest(xsum, xnow, tw)+115, offest(ysum, ynow, th)+320.0)
}
case 2:
div := rowsnum(len(r), 2)
for i, o := range r {
xnow := rowsnum(i+1, div)
ysum := math.Min(len(r)-(xnow-1)*div, div)
ynow := i%div + 1
switch xnow {
case 1:
canvas.DrawString(string(o), -offest(xsum, xnow, tw)+115, offest(9, ynow, th)+320.0)
case 2:
canvas.DrawString(string(o), -offest(xsum, xnow, tw)+115, offest(9, ynow+(9-ysum), th)+320.0)
}
}
}
return writer.WriteTo(canvas.Image(), f)
}
func offest(total, now int, distance float64) float64 {
if total%2 == 0 {
return (float64(now-total/2) - 1) * distance
}
return (float64(now-total/2) - 1.5) * distance
}
func rowsnum(total, div int) int {
temp := total / div
if total%div != 0 {
temp++
}
return temp
}

69
plugin/funny/laugh.go Normal file
View File

@@ -0,0 +1,69 @@
// Package funny 冷笑话
package funny
import (
"strings"
"time"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
fcext "github.com/FloatTech/floatbox/ctxext"
sql "github.com/FloatTech/sqlite"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
)
type joke struct {
ID uint32 `db:"id"`
Text string `db:"text"`
}
var db = &sql.Sqlite{}
func init() {
en := control.Register("funny", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "讲个笑话",
Help: "- 讲个笑话[@xxx|qq号|人名] | 夸夸[@xxx|qq号|人名] ",
PublicDataFolder: "Funny",
})
en.OnPrefixGroup([]string{"讲个笑话", "夸夸"}, fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.DBPath = en.DataFolder() + "jokes.db"
_, err := en.GetLazyData("jokes.db", true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = db.Create("jokes", &joke{})
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
c, err := db.Count("jokes")
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
logrus.Infoln("[funny]加载", c, "个笑话")
return true
})).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
// 获取名字
name := ctx.NickName()
var j joke
err := db.Pick("jokes", &j)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text(strings.ReplaceAll(j.Text, "%name", name)))
})
}

16
plugin/genshin/data.go Normal file
View File

@@ -0,0 +1,16 @@
package genshin
type storage uint64
func (s *storage) is5starsmode() bool {
return *s&1 == 1
}
func (s *storage) setmode(is5stars bool) bool {
if is5stars {
*s |= 1
} else {
*s &= 0xffffffff_fffffffe
}
return is5stars
}

377
plugin/genshin/ys.go Normal file
View File

@@ -0,0 +1,377 @@
// Package genshin 原神抽卡
package genshin
import (
"archive/zip"
"image"
"image/color"
"image/draw"
"image/jpeg"
"image/png"
"math/rand"
"regexp"
"strings"
"sync/atomic"
fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/floatbox/process"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/golang/freetype"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
type zipfilestructure map[string][]*zip.File
var (
totl uint64 // 累计抽奖次数
filetree = make(zipfilestructure, 32)
starN3, starN4, starN5 *zip.File
namereg = regexp.MustCompile(`_(.*)\.png`)
)
func init() {
engine := control.Register("genshin", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "原神模拟抽卡",
Help: "- 原神十连\n- 切换原神卡池",
PublicDataFolder: "Genshin",
}).ApplySingle(ctxext.DefaultSingle)
engine.OnFullMatch("切换原神卡池").SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if !ok {
ctx.SendChain(message.Text("找不到服务!"))
return
}
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
store := (storage)(c.GetData(gid))
if store.setmode(!store.is5starsmode()) {
process.SleepAbout1sTo2s()
ctx.SendChain(message.Text("切换到五星卡池~"))
} else {
process.SleepAbout1sTo2s()
ctx.SendChain(message.Text("切换到普通卡池~"))
}
err := c.SetData(gid, int64(store))
if err != nil {
process.SleepAbout1sTo2s()
ctx.SendChain(message.Text("ERROR: ", err))
}
})
engine.OnFullMatch("原神十连", fcext.DoOnceOnSuccess(
func(ctx *zero.Ctx) bool {
zipfile := engine.DataFolder() + "Genshin.zip"
_, err := engine.GetLazyData("Genshin.zip", false)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
err = parsezip(zipfile)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
},
)).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
if !ok {
ctx.SendChain(message.Text("找不到服务!"))
return
}
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
}
store := (storage)(c.GetData(gid))
img, str, mode, err := randnums(10, store)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
b, cl := writer.ToBytes(img)
if mode {
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("恭喜你抽到了: \n", str), message.ImageBytes(b)))
} else {
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("十连成功~"), message.ImageBytes(b)))
}
cl()
})
}
func randnums(nums int, store storage) (rgba *image.RGBA, str string, replyMode bool, err error) {
var (
fours, fives = make([]*zip.File, 0, 10), make([]*zip.File, 0, 10) // 抽到 四, 五星角色
threeArms, fourArms, fiveArms = make([]*zip.File, 0, 10), make([]*zip.File, 0, 10), make([]*zip.File, 0, 10) // 抽到 三 , 四, 五星武器
fourN, fiveN = 0, 0 // 抽到 四, 五星角色的数量
bgs = make([]*zip.File, 0, 10) // 背景图片名
threeN2, fourN2, fiveN2 = 0, 0, 0 // 抽到 三 , 四, 五星武器的数量
hero, stars = make([]*zip.File, 0, 10), make([]*zip.File, 0, 10) // 角色武器名, 储存星级图标
cicon = make([]*zip.File, 0, 10) // 元素图标
fivebg, fourbg, threebg = filetree["five_bg.jpg"][0], filetree["four_bg.jpg"][0], filetree["three_bg.jpg"][0] // 背景图片名
fivelen = len(filetree["five"])
five2len = len(filetree["five2"])
threelen = len(filetree["Three"])
fourlen = len(filetree["four"])
four2len = len(filetree["four2"])
)
if totl%9 == 0 { // 累计9次加入一个五星
switch rand.Intn(2) {
case 0:
fiveN++
fives = append(fives, filetree["five"][rand.Intn(fivelen)])
case 1:
fiveN2++
fiveArms = append(fiveArms, filetree["five2"][rand.Intn(five2len)])
}
nums--
}
if store.is5starsmode() { // 5星模式
for i := 0; i < nums; i++ {
switch rand.Intn(2) {
case 0:
fiveN++
fives = append(fives, filetree["five"][rand.Intn(fivelen)])
case 1:
fiveN2++
fiveArms = append(fiveArms, filetree["five2"][rand.Intn(five2len)])
}
}
} else { // 默认模式
for i := 0; i < nums; i++ {
a := rand.Intn(1000) // 抽卡几率 三星80% 四星17% 五星3%
switch {
case a >= 0 && a <= 800:
threeN2++
threeArms = append(threeArms, filetree["Three"][rand.Intn(threelen)])
case a > 800 && a <= 885:
fourN++
fours = append(fours, filetree["four"][rand.Intn(fourlen)]) // 随机角色
case a > 885 && a <= 970:
fourN2++
fourArms = append(fourArms, filetree["four2"][rand.Intn(four2len)]) // 随机武器
case a > 970 && a <= 985:
fiveN++
fives = append(fives, filetree["five"][rand.Intn(fivelen)])
default:
fiveN2++
fiveArms = append(fiveArms, filetree["five2"][rand.Intn(five2len)])
}
}
if fourN+fourN2 == 0 && threeN2 > 0 { // 没有四星时自动加入
threeN2--
threeArms = threeArms[:len(threeArms)-1]
switch rand.Intn(2) {
case 0:
fourN++
fours = append(fours, filetree["four"][rand.Intn(fourlen)]) // 随机角色
case 1:
fourN2++
fourArms = append(fourArms, filetree["four2"][rand.Intn(four2len)]) // 随机武器
}
}
_ = atomic.AddUint64(&totl, 1)
}
icon := func(f *zip.File) *zip.File {
name := f.Name
name = name[strings.LastIndex(name, "/")+1:strings.Index(name, "_")] + ".png"
logrus.Debugln("[genshin]get named file", name)
return filetree[name][0]
}
he := func(cnt int, id int, f *zip.File, bg *zip.File) {
var hen *[]*zip.File
for i := 0; i < cnt; i++ {
switch id {
case 1:
hen = &threeArms
case 2:
hen = &fourArms
case 3:
hen = &fours
case 4:
hen = &fiveArms
case 5:
hen = &fives
}
bgs = append(bgs, bg) // 加入颜色背景
hero = append(hero, (*hen)[i])
stars = append(stars, f) // 加入星级图标
cicon = append(cicon, icon((*hen)[i])) // 加入元素图标
}
}
if fiveN > 0 { // 按顺序加入
he(fiveN, 5, starN5, fivebg) // 五星角色
str += reply(fives, 1, str)
replyMode = true
}
if fourN > 0 {
he(fourN, 3, starN4, fourbg) // 四星角色
}
if fiveN2 > 0 {
he(fiveN2, 4, starN5, fivebg) // 五星武器
str += reply(fiveArms, 2, str)
replyMode = true
}
if fourN2 > 0 {
he(fourN2, 2, starN4, fourbg) // 四星武器
}
if threeN2 > 0 {
he(threeN2, 1, starN3, threebg) // 三星武器
}
var c1, c2, c3 uint8 = 50, 50, 50 // 背景颜色
img00, err := filetree["bg0.jpg"][0].Open() // 打开背景图片
if err != nil {
return
}
rectangle := image.Rect(0, 0, 1920, 1080) // 图片宽度, 图片高度
rgba = image.NewRGBA(rectangle)
draw.Draw(rgba, rgba.Bounds(), image.NewUniform(color.RGBA{c1, c2, c3, 255}), image.Point{}, draw.Over)
context := freetype.NewContext() // 创建一个新的上下文
context.SetDPI(72) // 每英寸 dpi
context.SetClip(rgba.Bounds())
context.SetDst(rgba)
defer img00.Close()
img0, err := jpeg.Decode(img00) // 读取一个本地图像
if err != nil {
return
}
offset := image.Pt(0, 0) // 图片在背景上的位置
draw.Draw(rgba, img0.Bounds().Add(offset), img0, image.Point{}, draw.Over)
w1, h1 := 230, 0
for i := 0; i < len(hero); i++ {
if i > 0 {
w1 += 146 // 图片宽度
}
imgs, err := bgs[i].Open() // 取出背景图片
if err != nil {
return nil, "", false, err
}
defer imgs.Close()
img, _ := jpeg.Decode(imgs)
offset := image.Pt(w1, h1)
draw.Draw(rgba, img.Bounds().Add(offset), img, image.Point{}, draw.Over)
imgs1, err := hero[i].Open() // 取出图片名
if err != nil {
return nil, "", false, err
}
defer imgs1.Close()
img1, _ := png.Decode(imgs1)
offset1 := image.Pt(w1, h1)
draw.Draw(rgba, img1.Bounds().Add(offset1), img1, image.Point{}, draw.Over)
imgs2, err := stars[i].Open() // 取出星级图标
if err != nil {
return nil, "", false, err
}
defer imgs2.Close()
img2, _ := png.Decode(imgs2)
offset2 := image.Pt(w1, h1)
draw.Draw(rgba, img2.Bounds().Add(offset2), img2, image.Point{}, draw.Over)
imgs3, err := cicon[i].Open() // 取出类型图标
if err != nil {
return nil, "", false, err
}
defer imgs3.Close()
img3, _ := png.Decode(imgs3)
offset3 := image.Pt(w1, h1)
draw.Draw(rgba, img3.Bounds().Add(offset3), img3, image.Point{}, draw.Over)
}
imgs4, err := filetree["Reply.png"][0].Open() // "分享" 图标
if err != nil {
return nil, "", false, err
}
defer imgs4.Close()
img4, err := png.Decode(imgs4)
if err != nil {
return nil, "", false, err
}
offset4 := image.Pt(1270, 945) // 宽, 高
draw.Draw(rgba, img4.Bounds().Add(offset4), img4, image.Point{}, draw.Over)
return
}
func parsezip(zipFile string) error {
zipReader, err := zip.OpenReader(zipFile) // will not close
if err != nil {
return err
}
for _, f := range zipReader.File {
if f.FileInfo().IsDir() {
filetree[f.Name] = make([]*zip.File, 0, 32)
continue
}
f.Name = f.Name[8:]
i := strings.LastIndex(f.Name, "/")
if i < 0 {
filetree[f.Name] = []*zip.File{f}
logrus.Debugln("[genshin]insert file", f.Name)
continue
}
folder := f.Name[:i]
if folder != "" {
filetree[folder] = append(filetree[folder], f)
logrus.Debugln("[genshin]insert file into", folder)
if folder == "gacha" {
switch f.Name[i+1:] {
case "ThreeStar.png":
starN3 = f
case "FourStar.png":
starN4 = f
case "FiveStar.png":
starN5 = f
}
}
}
}
return nil
}
// 取出角色武器名
func reply(z []*zip.File, num int, nameStr string) string {
var tmp strings.Builder
tmp.Grow(128)
switch {
case num == 1:
tmp.WriteString("★五星角色★\n")
case num == 2 && len(nameStr) > 0:
tmp.WriteString("\n★五星武器★\n")
default:
tmp.WriteString("★五星武器★\n")
}
for i := range z {
tmp.WriteString(namereg.FindStringSubmatch(z[i].Name)[1] + " * ")
}
return tmp.String()
}

103
plugin/gif/README.md Normal file
View File

@@ -0,0 +1,103 @@
# ZeroBot-Plugin-Gif
[ZeroBot QQ机器人](https://github.com/wdvxdr1123/ZeroBot)插件可以制作各种沙雕gif图
> 素材包地址: https://gitcode.net/anto_july/imagematerials
## 触发方式
1. [指令词]+[qq号] 如爬123456
2. [指令词]+[图片] 如:爬[图片]
3. [指令词]+[艾特] 如:爬@小H
## 指令列表
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x]
- [x] 灰度
- [x] 上翻
- [x] 下翻
- [x] 左翻
- [x] 右翻
- [x] 反色
- [x] 倒放
- [x] 浮雕
- [x] 打码
- [x] 负片
- [x] 旋转45
- [x] 变形100 100
- [x]
- [x] 娶|结婚申请|结婚登记
- [x] 像只
- [x] 阿尼亚喜欢
- [x] 我永远喜欢|永远喜欢
- [x] 像样的亲亲
- [x] 国旗
- [x] 不要靠近
- [x] 万能表情|空白表情
- [x] 采访
- [x] 需要|你可能需要
- [x] 这像画吗
- [x] 小画家
- [x] 完美
- [x] 玩游戏 (应该使用透视变换)
- [x] 出警
- [x] 警察
- [x] 舔|舔屏|prpr (应该使用透视变换)
- [x] 安全感
- [x] 精神支柱
- [x] 想什么
- [x] 墙纸
- [x] 为什么at我
- [x] 交个朋友
- [x] 打工人|继续干活
- [x] 兑换券
- [ ] 捂脸 (使用了透视变换, 需要研究矩阵变换)
- [x] 注意力涣散
- [x] 垃圾桶|垃圾
- [x]
- [x] 啾啾
- [x] 2敲
- [x] 听音乐
- [ ] 群青 (需要mask)
- [ ] 加载中 (需要mask)
- [x] 永远爱你 (未加闪光)
- [ ] 关注 (处理文字麻烦)
- [x] 2拍
- [x]
- [x]
- [x] 打拳 (未加闪光)
- [ ] 复读 (处理文字麻烦)
- [x]
- [x]
- [x]
- [x]
- [x] 紧贴
- [ ] 膜拜 (使用了透视变换, 需要研究矩阵变换)
- [ ] 小天使 (摆)
- [ ] 一直 (摆)
- [x]
- [ ] 问问 (摆)
- [ ] 典中典 (摆)
- [ ] 震惊 (摆)
- [ ] 哈哈镜 (摆)
- [ ] 对称 (猎奇, 不整)
- [x]
- [x] 2蹭
- [x] 诶嘿
- [x] 膜拜
- [x]
- [x]
- [x] 给我变
- [x] 玩一下
- [x] 不要看
- [x] 小天使
- [x] 你的
- [x] 我老婆
- [x] 远离
- [x] 抬棺

109
plugin/gif/context.go Normal file
View File

@@ -0,0 +1,109 @@
package gif
import (
"os"
"strconv"
"sync"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
"github.com/FloatTech/zbputils/img"
"github.com/sirupsen/logrus"
)
type context struct {
usrdir string
headimgsdir []string
}
func dlchan(name string, s *string, wg *sync.WaitGroup, exit func(error)) {
defer wg.Done()
target := datapath + `materials/` + name
if file.IsNotExist(target) {
data, err := web.RequestDataWith(web.NewTLS12Client(), `https://gitcode.net/m0_60838134/imagematerials/-/raw/main/`+name, "GET", "gitcode.net", web.RandUA(), nil)
if err != nil {
_ = os.Remove(target)
exit(err)
return
}
f, err := os.Create(target)
if err != nil {
exit(err)
return
}
_, err = f.Write(data)
_ = f.Close()
if err != nil {
_ = os.Remove(target)
exit(err)
return
}
logrus.Debugln("[gif] dl", name, "to", target, "succeeded")
} else {
logrus.Debugln("[gif] dl", name, "exists at", target)
}
*s = target
}
func dlblock(name string) (string, error) {
target := datapath + `materials/` + name
if file.IsNotExist(target) {
data, err := web.RequestDataWith(web.NewTLS12Client(), `https://gitcode.net/m0_60838134/imagematerials/-/raw/main/`+name, "GET", "gitcode.net", web.RandUA(), nil)
if err != nil {
_ = os.Remove(target)
return "", err
}
f, err := os.Create(target)
if err != nil {
return "", err
}
_, err = f.Write(data)
_ = f.Close()
if err != nil {
_ = os.Remove(target)
return "", err
}
logrus.Debugln("[gif] dl", name, "to", target, "succeeded")
} else {
logrus.Debugln("[gif] dl", name, "exists at", target)
}
return target, nil
}
func dlrange(prefix string, end int, wg *sync.WaitGroup, exit func(error)) []string {
if file.IsNotExist(datapath + `materials/` + prefix) {
err := os.MkdirAll(datapath+`materials/`+prefix, 0755)
if err != nil {
exit(err)
return nil
}
}
c := make([]string, end)
for i := range c {
wg.Add(1)
go dlchan(prefix+"/"+strconv.Itoa(i)+".png", &c[i], wg, exit)
}
return c
}
// 新的上下文
func newContext(user int64) *context {
c := new(context)
c.usrdir = datapath + "users/" + strconv.FormatInt(user, 10) + `/`
_ = os.MkdirAll(c.usrdir, 0755)
c.headimgsdir = make([]string, 2)
c.headimgsdir[0] = c.usrdir + "0.gif"
c.headimgsdir[1] = c.usrdir + "1.gif"
return c
}
func loadFirstFrames(paths []string, size int) (imgs []*img.Factory, err error) {
imgs = make([]*img.Factory, size)
for i := range imgs {
imgs[i], err = img.LoadFirstFrame(paths[i], 0, 0)
if err != nil {
return nil, err
}
}
return imgs, nil
}

1449
plugin/gif/gif.go Normal file

File diff suppressed because it is too large Load Diff

43
plugin/gif/logo.go Normal file
View File

@@ -0,0 +1,43 @@
package gif
import (
"image"
"strconv"
"strings"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/process"
"github.com/FloatTech/zbputils/img"
)
func (cc *context) prepareLogos(s ...string) error {
for i, v := range s {
_, err := strconv.Atoi(v)
if err != nil {
err = file.DownloadTo("https://gchat.qpic.cn/gchatpic_new//--"+strings.ToUpper(v)+"/0", cc.usrdir+strconv.Itoa(i)+".gif")
} else {
err = file.DownloadTo("http://q4.qlogo.cn/g?b=qq&nk="+v+"&s=640", cc.usrdir+strconv.Itoa(i)+".gif")
}
if err != nil {
return err
}
process.SleepAbout1sTo2s()
}
return nil
}
func (cc *context) getLogo(w int, h int) (*image.NRGBA, error) {
frame, err := img.LoadFirstFrame(cc.headimgsdir[0], w, h)
if err != nil {
return nil, err
}
return frame.Circle(0).Im, nil
}
func (cc *context) getLogo2(w int, h int) (*image.NRGBA, error) {
frame, err := img.LoadFirstFrame(cc.headimgsdir[1], w, h)
if err != nil {
return nil, err
}
return frame.Circle(0).Im, nil
}

1508
plugin/gif/png.go Normal file

File diff suppressed because it is too large Load Diff

170
plugin/gif/run.go Normal file
View File

@@ -0,0 +1,170 @@
// Package gif 制图
package gif
import (
"strconv"
"strings"
"github.com/FloatTech/floatbox/file"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
cmd = make([]string, 0)
datapath string
cmdMap = map[string]func(cc *context, args ...string) (string, error){
"搓": cuo,
"冲": xqe,
"摸": mo,
"拍": pai,
"丢": diu,
"吃": chi,
"敲": qiao,
"啃": ken,
"蹭": ceng,
"爬": pa,
"撕": si,
"灰度": grayscale,
"上翻": flipV,
"下翻": flipV,
"左翻": flipH,
"右翻": flipH,
"反色": invert,
"浮雕": convolve3x3,
"打码": blur,
"负片": invertAndGrayscale,
"旋转": rotate,
"变形": deformation,
"亲": kiss,
"结婚申请": marriage,
"结婚登记": marriage,
"阿尼亚喜欢": anyasuki,
"像只": alike,
"我永远喜欢": alwaysLike,
"永远喜欢": alwaysLike,
"像样的亲亲": decentKiss,
"国旗": chinaFlag,
"不要靠近": dontTouch,
"万能表情": universal,
"空白表情": universal,
"采访": interview,
"需要": need,
"你可能需要": need,
"这像画吗": paint,
"小画家": painter,
"完美": perfect,
"玩游戏": playGame,
"出警": police,
"警察": police1,
"舔": prpr,
"舔屏": prpr,
"prpr": prpr,
"安全感": safeSense,
"精神支柱": support,
"想什么": thinkwhat,
"墙纸": wallpaper,
"为什么at我": whyatme,
"交个朋友": makeFriend,
"打工人": backToWork,
"继续干活": backToWork,
"兑换券": coupon,
"注意力涣散": distracted,
"垃圾桶": garbage,
"垃圾": garbage,
"捶": thump,
"啾啾": jiujiu,
"2敲": knock,
"听音乐": listenMusic,
"永远爱你": loveYou,
"2拍": pat,
"顶": jackUp,
"捣": pound,
"打拳": punch,
"滚": roll,
"吸": suck,
"嗦": suck,
"扔": throw,
"锤": hammer,
"紧贴": tightly,
"紧紧贴着": tightly,
"转": turn,
"蒙蔽": mengbi,
"踩": cai,
"好玩": haowan,
"2转": whirl,
"2滚": push,
"踢球": tiqiu,
"2舔": lick,
"可莉吃": klee,
"胡桃啃": hutaoken,
"怀": huai,
"砰": peng,
"你犯法了": fanfa,
"炖": dun,
"2蹭": ceng2,
"诶嘿": eihei,
"膜拜": worship,
"吞": ci,
"揍": zou,
"给我变": bian,
"玩一下": van,
"不要看": neko,
"小天使": xiaotianshi,
"你的": youer,
"我老婆": nowife,
"远离": yuanli,
"抬棺": taiguan,
"一直": alwaysDoGif,
}
)
func init() { // 插件主体
for k := range cmdMap {
cmd = append(cmd, k)
}
en := control.Register("gif", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "制图",
Help: "下为制图命令:\n" +
"- 搓|- 冲|- 摸|-拍|- 丢|- 吃|- 敲|- 啃|- 蹭|- 爬|- 撕\n" +
"- 吸|- 嗦|- 扔|- 锤|- 紧贴|紧紧贴着|- 转|- 抬棺|- 远离\n" +
"- 揍|- 吞|- 膜拜|- 诶嘿|- 2蹭|- 你犯法了|- 砰|- 注意力涣散\n" +
"- 2敲|- 听音乐|- 永远爱你|- 2拍|- 顶|- 捣|- 打拳|- 滚\n" +
"- 灰度|- 上翻|- 下翻|- 左翻|- 右翻|- 反色|- 浮雕|- 打码\n" +
"- 负片|- 旋转|- 变形|- 亲|- 结婚申请|结婚登记|- 阿尼亚喜欢XXX\n" +
"- 像只|- 我永远喜欢XXX|- 像样的亲亲|- 国旗|- 不要靠近\n" +
"- 蒙蔽|- 踩|- 好玩|- 2转|- 踢球|- 2舔|- 可莉吃|- 胡桃啃|- 怀\n" +
"- 小画家|- 完美|- 玩游戏|- 出警|- 警察|- 舔|舔屏|prpr\n" +
"- 安全感|- 精神支柱|- 想什么|- 墙纸|- 为什么at我|- 交个朋友\n" +
"- 打工人|- 继续干活|- 兑换券|- 炖|- 垃圾桶|- 垃圾|- 捶|- 啾啾\n" +
"- 我老婆|- 小天使XXX|- 你的XXX|- 不要看|- 玩一下XXX|- 给我变\n" +
"- 万能表情|- 空白表情|- 采访|- 需要|- 你可能需要|- 这像画吗\n" +
"- 一直(支持动图)\n" +
"例: 制图命令XXX[@用户|QQ号|图片]\n" +
"Tips: XXX可以为限制长度的任何文字\n" +
"对Bot使用为 @Bot制图命令[XXX]@Bot",
PrivateDataFolder: "gif",
}).ApplySingle(ctxext.DefaultSingle)
datapath = file.BOTPATH + "/" + en.DataFolder()
en.OnRegex(`^(` + strings.Join(cmd, "|") + `)[\s\S]*?(\[CQ:(image\,file=([0-9a-zA-Z]{32}).*|at.+?(\d{5,11}))\].*|(\d+))$`).
SetBlock(true).Handle(func(ctx *zero.Ctx) {
c := newContext(ctx.Event.UserID)
list := ctx.State["regex_matched"].([]string)
err := c.prepareLogos(list[4]+list[5]+list[6], strconv.FormatInt(ctx.Event.UserID, 10))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
argslist := strings.Split(strings.TrimSuffix(strings.TrimPrefix(list[0], list[1]), list[2]), " ")
picurl, err := cmdMap[list[1]](c, argslist...)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image(picurl))
})
}

View File

@@ -0,0 +1,131 @@
// Package github GitHub 仓库搜索
package github
import (
"errors"
"fmt"
"io"
"net/http"
"net/url"
"strings"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/tidwall/gjson"
)
func init() { // 插件主体
control.Register("github", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "GitHub仓库搜索",
Help: "- >github [xxx]\n" +
"- >github -p [xxx]",
}).OnRegex(`^>github\s(-.{1,10}? )?(.*)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 发送请求
header := http.Header{
"User-Agent": []string{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"},
}
api, _ := url.Parse("https://api.github.com/search/repositories")
api.RawQuery = url.Values{
"q": []string{ctx.State["regex_matched"].([]string)[2]},
}.Encode()
body, err := netGet(api.String(), header)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
}
// 解析请求
info := gjson.ParseBytes(body)
if info.Get("total_count").Int() == 0 {
ctx.SendChain(message.Text("ERROR: 没有找到这样的仓库"))
return
}
repo := info.Get("items.0")
// 发送结果
switch ctx.State["regex_matched"].([]string)[1] {
case "-p ": // 图片模式
ctx.SendChain(
message.Image(
"https://opengraph.githubassets.com/0/"+repo.Get("full_name").Str,
).Add("cache", 0),
)
case "-t ": // 文字模式
ctx.SendChain(
message.Text(
repo.Get("full_name").Str, "\n",
"Description: ",
repo.Get("description").Str, "\n",
"Star/Fork/Issue: ",
repo.Get("watchers").Int(), "/", repo.Get("forks").Int(), "/", repo.Get("open_issues").Int(), "\n",
"Language: ",
notnull(repo.Get("language").Str), "\n",
"License: ",
notnull(strings.ToUpper(repo.Get("license.key").Str)), "\n",
"Last pushed: ",
repo.Get("pushed_at").Str, "\n",
"Jump: ",
repo.Get("html_url").Str, "\n",
),
)
default: // 文字模式
ctx.SendChain(
message.Text(
repo.Get("full_name").Str, "\n",
"Description: ",
repo.Get("description").Str, "\n",
"Star/Fork/Issue: ",
repo.Get("watchers").Int(), "/", repo.Get("forks").Int(), "/", repo.Get("open_issues").Int(), "\n",
"Language: ",
notnull(repo.Get("language").Str), "\n",
"License: ",
notnull(strings.ToUpper(repo.Get("license.key").Str)), "\n",
"Last pushed: ",
repo.Get("pushed_at").Str, "\n",
"Jump: ",
repo.Get("html_url").Str, "\n",
),
message.Image(
"https://opengraph.githubassets.com/0/"+repo.Get("full_name").Str,
).Add("cache", 0),
)
}
})
}
// notnull 如果传入文本为空,则返回默认值
func notnull(text string) string {
if text == "" {
return "None"
}
return text
}
// netGet 返回请求结果
func netGet(dest string, header http.Header) ([]byte, error) {
client := &http.Client{}
req, err := http.NewRequest("GET", dest, nil)
if err != nil {
return nil, err
}
req.Header = header
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if code := resp.StatusCode; code != 200 {
// 如果返回不是200则立刻抛出错误
errmsg := fmt.Sprintf("code %d", code)
return nil, errors.New(errmsg)
}
return body, nil
}

View File

@@ -0,0 +1,473 @@
package guessmusic
import (
"encoding/json"
"math/rand"
"net/url"
"os"
"strconv"
"strings"
"time"
wyy "github.com/FloatTech/AnimeAPI/neteasemusic"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
"github.com/FloatTech/zbputils/ctxext"
"github.com/pkg/errors"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
// API配置
engine.OnPrefix("设置猜歌API", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
option := ctx.State["args"].(string)
if option == "帮助" {
ctx.SendChain(message.Text(
"项目地址:binaryify.github.io/NeteaseCloudMusicApi" +
"\n网上有基于该框架的API,可以自行搜索白嫖。\n" +
"添加API指令:\n设置猜歌API [API首页网址]"))
return
}
if !strings.HasSuffix(option, "/") {
option += "/"
}
cfg.APIURL = option
err := saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
// API配置
engine.OnRegex(`^猜歌(开启|关闭)(歌单|歌词)自动下载`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
swtich := ctx.State["regex_matched"].([]string)[1]
option := ctx.State["regex_matched"].([]string)[2]
chose := true
if swtich == "关闭" {
chose = false
}
if option == "歌单" {
cfg.API = chose
} else {
cfg.Local = chose
}
err := saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
engine.OnFullMatch("登录网易云", zero.SuperUserPermission, func(ctx *zero.Ctx) bool {
if !zero.OnlyPrivate(ctx) {
ctx.SendChain(message.Text("为了保护登录过程,请bot主人私聊。"))
return false
}
return true
}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
keyURL := cfg.APIURL + "login/qr/key"
data, err := web.GetData(keyURL)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "获取网易云key失败,", err))
return
}
var keyInfo keyInfo
err = json.Unmarshal(data, &keyInfo)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "解析网易云key失败,", err))
return
}
qrURL := cfg.APIURL + "login/qr/create?key=" + keyInfo.Data.Unikey + "&qrimg=1"
data, err = web.GetData(qrURL)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "获取网易云二维码失败,", err))
return
}
var qrInfo qrInfo
err = json.Unmarshal(data, &qrInfo)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "解析网易云二维码失败,", err))
return
}
ctx.SendChain(message.Text("[请使用手机APP扫描二维码或者进入网页扫码登录]\n", qrInfo.Data.Qrurl),
message.Image("base64://"+strings.ReplaceAll(qrInfo.Data.Qrimg, "data:image/png;base64,", "")),
message.Text("二维码有效时间为6分钟,登陆后请耐心等待结果,获取cookie过程有些漫长。"))
i := 0
for range time.NewTicker(10 * time.Second).C {
APIURL := cfg.APIURL + "login/qr/check?key=" + url.QueryEscape(keyInfo.Data.Unikey)
data, err := web.GetData(APIURL)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "无法获取登录状态,", err))
return
}
var cookiesInfo cookyInfo
err = json.Unmarshal(data, &cookiesInfo)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "解析登录状态失败,", err))
return
}
switch cookiesInfo.Code {
case 803:
cfg.Cookie = cookiesInfo.Cookie
err = saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
return
case 801:
i++
if i%6 == 0 { // 每1分钟才提醒一次,减少提示(380/60=6次)
ctx.SendChain(message.Text("状态:", cookiesInfo.Message))
}
continue
case 800:
ctx.SendChain(message.Text("状态:", cookiesInfo.Message))
return
default:
ctx.SendChain(message.Text("状态:", cookiesInfo.Message))
continue
}
}
})
engine.OnRegex(`^歌单信息\s*((https:\/\/music\.163\.com\/#\/playlist\?id=)?(\d+)|http:\/\/music\.163\.com\/playlist\/(\d+).*)$`).SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
listID := ctx.State["regex_matched"].([]string)[3] + ctx.State["regex_matched"].([]string)[4]
_, err := strconv.ParseInt(listID, 10, 64)
if err != nil {
ctx.SendChain(message.Text("请输入正确的歌单ID或者歌单连接"))
return
}
APIURL := cfg.APIURL + "playlist/detail?id=" + listID
data, err := web.GetData(APIURL)
if err != nil {
ctx.SendChain(message.Text("无法连接歌单,", err))
return
}
var parsed listInfoOfAPI
err = json.Unmarshal(data, &parsed)
if err != nil {
ctx.SendChain(message.Text("无法解析歌单ID内容,", err))
return
}
ctx.SendChain(
message.Image(parsed.Playlist.CoverImgURL),
message.Text(
"歌单名称:", parsed.Playlist.Name,
"\n歌单ID:", parsed.Playlist.ID,
"\n创建人:", parsed.Playlist.Creator.Nickname,
"\n创建时间:", time.Unix(parsed.Playlist.CreateTime/1000, 0).Format("2006-01-02"),
"\n标签:", strings.Join(parsed.Playlist.Tags, ";"),
"\n歌曲数量:", parsed.Playlist.TrackCount,
"\n歌单简介:\n", parsed.Playlist.Description,
"\n更新时间:", time.Unix(parsed.Playlist.UpdateTime/1000, 0).Format("2006-01-02"),
))
})
// 本地绑定网易云歌单ID
engine.OnRegex(`^(.*)绑定网易云\s*((https:\/\/music\.163\.com\/#\/playlist\?id=)?(\d+)|http:\/\/music\.163\.com\/playlist\/(\d+).*)$`, zero.SuperUserPermission).SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
listName := ctx.State["regex_matched"].([]string)[1]
listID := ctx.State["regex_matched"].([]string)[4] + ctx.State["regex_matched"].([]string)[5]
ctx.SendChain(message.Text("正在校验歌单信息,请稍等"))
pathOfMusic := cfg.MusicPath + listName + "/"
if file.IsNotExist(pathOfMusic) {
ctx.SendChain(message.Text(serviceErr, "歌单不存在于本地"))
return
}
// 是否存在该歌单
APIURL := cfg.APIURL + "playlist/track/all?id=" + listID
data, err := web.GetData(APIURL)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
var parsed musicListOfApI
err = json.Unmarshal(data, &parsed)
if err != nil {
ctx.SendChain(message.Text(serviceErr, "无法解析歌单ID内容,", err))
return
}
if parsed.Code != 200 {
ctx.SendChain(message.Text(serviceErr, parsed.Code))
return
}
mid, _ := strconv.ParseInt(listID, 10, 64)
cfg.Playlist = append(cfg.Playlist, listRaw{
Name: listName,
ID: mid,
})
err = saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
engine.OnPrefix("解除绑定", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
delList := ctx.State["args"].(string)
filelist, err := getlist(cfg.MusicPath)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
var playID int64
for _, listinfo := range filelist {
if delList == listinfo.Name {
playID = listinfo.ID
break
}
}
// 删除ID
if playID == 0 { // 如果ID没有且没删除文件
ctx.SendChain(message.Text("歌单名称错误或者该歌单并没有绑定网易云,可以发送“歌单列表”获取歌单名称"))
return
}
index := -1
for i, list := range cfg.Playlist {
if playID == list.ID {
index = i
break
}
}
if index == -1 {
ctx.SendChain(message.Text("歌单名称错误或者该歌单并没有绑定网易云,可以发送“歌单列表”获取歌单名称"))
return
}
cfg.Playlist = append(cfg.Playlist[:index], cfg.Playlist[index+1:]...)
err = saveConfig(cfgFile)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
// 下载歌曲到对应的歌单里面
engine.OnRegex(`^下载歌单\s*((https:\/\/music\.163\.com\/#\/playlist\?id=)?(\d+)|http:\/\/music\.163\.com\/playlist\/(\d+).*[^\s$])\s*到\s*(.*)$`, zero.SuperUserPermission).SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
keyword := ctx.State["regex_matched"].([]string)[3] + ctx.State["regex_matched"].([]string)[4]
listName := ctx.State["regex_matched"].([]string)[5]
ctx.SendChain(message.Text("正在校验歌单信息,请稍等"))
// 是否存在该歌单
if file.IsNotExist(cfg.MusicPath + listName) {
ctx.SendChain(message.Text("歌单不存在,是否创建?(是/否)"))
next := zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.RegexRule(`(是|否)`), ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(120 * time.Second)
answer := ""
for {
select {
case <-wait.C:
wait.Stop()
ctx.SendChain(message.Text("等待超时,取消下载"))
return
case c := <-recv:
wait.Stop()
answer = c.Event.Message.String()
}
if answer == "否" {
ctx.SendChain(message.Text("下载已经取消"))
return
}
if answer != "" {
break
}
}
err := os.MkdirAll(cfg.MusicPath+listName, 0755)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
}
ctx.SendChain(message.Text("开始下载歌曲,需要一定时间下载,请稍等"))
listID, err := strconv.ParseInt(keyword, 10, 64)
if err == nil {
err = downloadlist(listID, cfg.MusicPath+listName+"/")
}
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
}
// 随机从歌单下载歌曲(歌单ID, 音乐保存路径)
func drawByAPI(playlistID int64, musicPath string) (musicName string, err error) {
APIURL := cfg.APIURL + "playlist/track/all?id=" + strconv.FormatInt(playlistID, 10)
data, err := web.GetData(APIURL)
if err != nil {
err = errors.Errorf("无法获取歌单列表\n%s", err)
return
}
var parsed musicListOfApI
err = json.Unmarshal(data, &parsed)
if err != nil {
err = errors.Errorf("无法读取歌单列表\n%s", err)
return
}
listlen := len(parsed.Songs)
randidx := rand.Intn(listlen)
// 将"/"符号去除,不然无法生成文件
name := strings.ReplaceAll(parsed.Songs[randidx].Name, "/", "·")
musicID := parsed.Songs[randidx].ID
artistName := ""
for i, ARInfo := range parsed.Songs[randidx].Ar {
if i != 0 {
artistName += "&" + ARInfo.Name
} else {
artistName += ARInfo.Name
}
}
cource := ""
if parsed.Songs[randidx].Alia != nil {
cource = strings.Join(parsed.Songs[randidx].Alia, "&")
// 将"/"符号去除,不然无法下载
cource = strings.ReplaceAll(cource, "/", "&")
}
if name == "" || musicID == 0 {
err = errors.New("无法获API取歌曲信息")
return
}
if cource != "" {
name += " - " + artistName + " - " + cource
} else {
name += " - " + artistName
}
// 下载歌曲
err = wyy.DownloadMusic(musicID, name, musicPath)
if err == nil {
musicName = name + ".mp3"
if cfg.Local {
// 下载歌词
_ = wyy.DownloadLrc(musicID, name, musicPath+"歌词/")
}
}
return
}
// 下载歌单歌曲(歌单ID, 音乐保存路径)
func downloadlist(playlistID int64, musicPath string) error {
APIURL := cfg.APIURL + "playlist/track/all?id=" + strconv.FormatInt(playlistID, 10)
data, err := web.GetData(APIURL)
if err != nil {
return err
}
var parsed musicListOfApI
err = json.Unmarshal(data, &parsed)
if err != nil {
return err
}
if parsed.Code != 200 {
err = errors.Errorf("requset code : %d", parsed.Code)
return err
}
for _, info := range parsed.Songs {
// 将"/"符号去除,不然无法生成文件
musicName := strings.ReplaceAll(info.Name, "/", "·")
musicID := info.ID
artistName := ""
for i, ARInfo := range info.Ar {
if i != 0 {
artistName += "&" + ARInfo.Name
} else {
artistName += ARInfo.Name
}
}
cource := ""
if info.Alia != nil {
cource = strings.Join(info.Alia, "&")
// 将"/"符号去除,不然无法下载
cource = strings.ReplaceAll(cource, "/", "&")
}
if musicName == "" || musicID == 0 {
err = errors.New("无法获API取歌曲信息")
return err
}
if cource != "" {
musicName += " - " + artistName + " - " + cource
} else {
musicName += " - " + artistName
}
// 下载歌曲
err = wyy.DownloadMusic(musicID, musicName, musicPath)
if err == nil {
if cfg.Local {
// 下载歌词
_ = wyy.DownloadLrc(musicID, musicName, musicPath+"歌词/")
}
}
}
return nil
}
/*****************************************************************/
/**************************独角兽API*******************************/
/*****************************************************************/
// 下载从独角兽抽到的歌曲ID(歌单ID, 音乐保存路径, 歌词保存路径)
func downloadByOvooa(playlistID int64, musicPath string) (musicName string, err error) {
// 抽取歌曲
mid, err := drawByOvooa(playlistID)
if err != nil {
err = errors.Errorf("API%s", err)
return
}
// 获取完成的歌名
musiclist, err := wyy.SearchMusic(strconv.Itoa(mid), 1)
if err != nil {
err = errors.Errorf("API歌曲下载ERROR: %s", err)
return
}
// 歌曲ID理论是唯一的
mun := len(musiclist)
if mun == 1 {
// 拉取歌名
musicList := make([]string, mun)
i := 0
for musicName := range musiclist {
musicList[i] = musicName
}
name := musicList[0]
// 下载歌曲
err = wyy.DownloadMusic(mid, name, musicPath)
if err == nil {
musicName = name + ".mp3"
if cfg.Local {
// 下载歌词
_ = wyy.DownloadLrc(mid, name, musicPath+"歌词/")
}
}
} else {
err = errors.Errorf("music IDThis music ID sreached munber is %d", mun)
}
return
}
// 通过独角兽API随机抽取歌单歌曲ID(参数歌单ID)
func drawByOvooa(playlistID int64) (musicID int, err error) {
APIURL := "https://ovooa.com/API/163_Music_Rand/api.php?id=" + strconv.FormatInt(playlistID, 10)
data, err := web.GetData(APIURL)
if err != nil {
return
}
var parsed ovooaData
err = json.Unmarshal(data, &parsed)
if err != nil {
return
}
if parsed.Code != 1 {
return
}
return parsed.Data.ID, nil
}

View File

@@ -0,0 +1,316 @@
package guessmusic
import (
"bytes"
"io/fs"
"math/rand"
"os"
"os/exec"
"strconv"
"strings"
"sync"
"time"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/zbputils/ctxext"
"github.com/pkg/errors"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var cuttime = [...]string{"00:00:05", "00:00:30", "00:01:00"} // 音乐切割时间点,可自行调节时间(时:分:秒)
func init() {
engine.OnRegex(`^(个人|团队)猜歌(-(.*))?$`, zero.OnlyGroup).SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
mode := ctx.State["regex_matched"].([]string)[3]
gid := ctx.Event.GroupID
// 获取本地列表
filelist, err := getlist(cfg.MusicPath)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
// 加载默认歌单
if mode == "" {
index := -1
for i, dlist := range cfg.Defaultlist {
if dlist.GroupID == gid {
index = i
break
}
}
if index == -1 {
// 如果没有设置就默认第一个文件夹
mode = filelist[0].Name
} else {
mode = cfg.Defaultlist[index].Name
ok := true
for _, listinfo := range filelist {
if mode == listinfo.Name {
ok = false
break
}
}
// 如果默认的歌单不存在了清空设置
if ok {
cfg.Defaultlist = append(cfg.Defaultlist[:index], cfg.Defaultlist[index+1:]...)
_ = saveConfig(cfgFile)
mode = filelist[0].Name
}
}
}
ctx.SendChain(message.Text("正在准备歌曲,请稍等\n回答“-[歌曲信息(歌名歌手等)|提示|取消]”\n一共3段语音,6次机会"))
// 随机抽歌
pathOfMusic, musicName, err := musicLottery(cfg.MusicPath, mode)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
// 解析歌曲信息
music := strings.Split(musicName, ".")
// 获取音乐后缀
musictype := music[len(music)-1]
if !strings.Contains(musictypelist, musictype) {
ctx.SendChain(message.Text("抽取到了歌曲:\n",
musicName, "\n该歌曲不是音乐后缀,请联系bot主人修改"))
return
}
// 获取音乐信息
musicInfo := strings.Split(strings.ReplaceAll(musicName, "."+musictype, ""), " - ")
infoNum := len(musicInfo)
if infoNum == 1 {
ctx.SendChain(message.Text("抽取到了歌曲:\n",
musicName, "\n该歌曲命名不符合命名规则,请联系bot主人修改"))
return
}
answerString := "歌名:" + musicInfo[0] + "\n歌手:" + musicInfo[1]
if infoNum > 2 {
musicInfo[2] = strings.ReplaceAll(musicInfo[2], "&", "\n")
answerString += "\n其他信息:\n" + musicInfo[2]
}
musicInfo = append(musicInfo, answerString)
// 切割音频,生成3个10秒的音频
outputPath := cachePath + strconv.FormatInt(gid, 10) + "/"
err = cutMusic(musicName, pathOfMusic, outputPath)
if err != nil {
ctx.SendChain(message.Text(err))
return
}
// 进行猜歌环节
ctx.SendChain(message.Record("file:///" + file.BOTPATH + "/" + outputPath + "0.wav"))
var next *zero.FutureEvent
if ctx.State["regex_matched"].([]string)[1] == "个人" {
next = zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.RegexRule(`^-\S{1,}`), ctx.CheckSession())
} else {
next = zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.RegexRule(`^-\S{1,}`), zero.CheckGroup(ctx.Event.GroupID))
}
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(40 * time.Second)
tick := time.NewTimer(105 * time.Second)
after := time.NewTimer(120 * time.Second)
wg := sync.WaitGroup{}
var (
messageStr message.MessageSegment // 文本信息
tickCount = 0 // 音频数量
answerCount = 0 // 问答次数
win bool // 是否赢得游戏
)
for {
select {
case <-tick.C:
ctx.SendChain(message.Text("猜歌游戏,你还有15s作答时间"))
case <-after.C:
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("时间超时,猜歌结束,公布答案:\n", answerString)))
return
case <-wait.C:
wait.Reset(40 * time.Second)
tickCount++
if tickCount > 2 {
wait.Stop()
continue
}
ctx.SendChain(
message.Text("好像有些难度呢,再听这段音频,要仔细听哦"),
)
ctx.SendChain(message.Record("file:///" + file.BOTPATH + "/" + outputPath + strconv.Itoa(tickCount) + ".wav"))
case c := <-recv:
wg.Add(1)
go func() {
messageStr, answerCount, tickCount, win = gameMatch(c, ctx.Event.UserID, musicInfo, answerCount, tickCount)
if win { // 游戏结束的话
wait.Stop()
tick.Stop()
after.Stop()
ctx.SendChain(message.Reply(c.Event.MessageID), messageStr)
ctx.SendChain(message.Record("file:///" + pathOfMusic + musicName))
} else {
wait.Reset(40 * time.Second)
tick.Reset(105 * time.Second)
after.Reset(120 * time.Second)
if tickCount > 2 || messageStr.Data["text"] == "你无权限取消" {
ctx.SendChain(message.Reply(c.Event.MessageID), messageStr)
} else {
ctx.SendChain(message.Reply(c.Event.MessageID), messageStr)
ctx.SendChain(message.Record("file:///" + file.BOTPATH + "/" + outputPath + strconv.Itoa(tickCount) + ".wav"))
}
}
wg.Done()
}()
wg.Wait()
if win {
return
}
}
}
})
}
// 随机抽取音乐
func musicLottery(musicPath, listName string) (pathOfMusic, musicName string, err error) {
// 读取歌单文件
pathOfMusic = musicPath + listName + "/"
if file.IsNotExist(pathOfMusic) {
err = errors.New("指定的歌单不存在,可发送“歌单列表”查看歌单列表")
return
}
files, err := os.ReadDir(pathOfMusic)
if err != nil {
return
}
// 获取绑定的网易云
var playlistID int64
for _, listinfo := range cfg.Playlist {
if listinfo.Name == listName {
playlistID = listinfo.ID
}
}
// 如果本地列表为空
if len(files) == 0 {
if playlistID == 0 || !cfg.API {
err = errors.New("本地歌单数据为0")
return
}
// 如果绑定了歌单ID
if cfg.APIURL == "" {
// 如果没有配置过API地址,尝试连接独角兽
musicName, err = downloadByOvooa(playlistID, pathOfMusic)
if err != nil {
err = errors.Errorf("本地歌单数据为0,API下载歌曲失败\n%s", err)
}
} else {
// 从API中抽取歌曲
musicName, err = drawByAPI(playlistID, pathOfMusic)
if err != nil {
err = errors.Errorf("本地歌单数据为0,API下载歌曲失败\n%s", err)
}
}
return
}
// 进行随机抽取
if playlistID == 0 || !cfg.API {
musicName = getLocalMusic(files, 10)
} else {
switch rand.Intn(3) { // 三分二概率抽取API的
case 1:
musicName = getLocalMusic(files, 10)
default:
if cfg.APIURL == "" {
// 如果没有配置过API地址,尝试连接独角兽
musicName, err = downloadByOvooa(playlistID, pathOfMusic)
} else {
// 从API中抽取歌曲
musicName, err = drawByAPI(playlistID, pathOfMusic)
}
if err != nil {
musicName = getLocalMusic(files, 10)
}
}
}
if musicName == "" {
err = errors.New("抽取歌曲轮空了,请重试")
}
return
}
// 从本地列表中随机抽取一首( indexMax : 最大递归次数 )
func getLocalMusic(files []fs.DirEntry, indexMax int) (musicName string) {
if len(files) > 1 {
music := files[rand.Intn(len(files))]
// 如果是文件夹就递归
if music.IsDir() {
indexMax--
if indexMax <= 0 {
return
}
musicName = getLocalMusic(files, indexMax)
} else {
musicName = music.Name()
}
} else {
music := files[0]
if !music.IsDir() {
musicName = files[0].Name()
}
}
return
}
// 切割音乐成三个10s音频
func cutMusic(musicName, pathOfMusic, outputPath string) (err error) {
err = os.MkdirAll(outputPath, 0755)
if err != nil {
err = errors.Errorf("[生成歌曲目录错误]ERROR: %s", err)
return
}
var stderr bytes.Buffer
cmdArguments := []string{"-y", "-i", pathOfMusic + musicName,
"-ss", cuttime[0], "-t", "10", file.BOTPATH + "/" + outputPath + "0.wav",
"-ss", cuttime[1], "-t", "10", file.BOTPATH + "/" + outputPath + "1.wav",
"-ss", cuttime[2], "-t", "10", file.BOTPATH + "/" + outputPath + "2.wav", "-hide_banner"}
cmd := exec.Command("ffmpeg", cmdArguments...)
cmd.Stderr = &stderr
err = cmd.Run()
if err != nil {
err = errors.Errorf("[生成歌曲错误]ERROR: %s", stderr.String())
return
}
return
}
// 数据匹配(结果信息,答题次数,提示次数,是否结束游戏)
func gameMatch(c *zero.Ctx, beginner int64, musicInfo []string, answerTimes, tickTimes int) (message.MessageSegment, int, int, bool) {
answer := strings.Replace(c.Event.Message.String(), "-", "", 1)
switch {
case answer == "取消":
if c.Event.UserID == beginner {
return message.Text("游戏已取消,猜歌答案是\n", musicInfo[len(musicInfo)-1], "\n\n\n下面欣赏猜歌的歌曲"), answerTimes, tickTimes, true
}
return message.Text("你无权限取消"), answerTimes, tickTimes, false
case answer == "提示":
tickTimes++
if tickTimes > 2 {
return message.Text("已经没有提示了哦"), answerTimes, tickTimes, false
}
return message.Text("再听这段音频,要仔细听哦"), answerTimes, tickTimes, false
case strings.Contains(musicInfo[0], answer) || strings.EqualFold(musicInfo[0], answer):
return message.Text("太棒了,你猜对歌曲名了!答案是\n", musicInfo[len(musicInfo)-1], "\n\n下面欣赏猜歌的歌曲"), answerTimes, tickTimes, true
case strings.Contains(musicInfo[1], answer) || strings.EqualFold(musicInfo[1], answer):
return message.Text("太棒了,你猜对歌手名了!答案是\n", musicInfo[len(musicInfo)-1], "\n\n下面欣赏猜歌的歌曲"), answerTimes, tickTimes, true
case len(musicInfo) == 4 && (strings.Contains(musicInfo[2], answer) || strings.EqualFold(musicInfo[2], answer)):
return message.Text("太棒了,你猜对相关信息了!答案是\n", musicInfo[len(musicInfo)-1], "\n\n下面欣赏猜歌的歌曲"), answerTimes, tickTimes, true
default:
answerTimes++
tickTimes++
switch {
case tickTimes > 2 && answerTimes < 6:
return message.Text("答案不对哦,还有", 6-answerTimes, "次答题,加油啊~"), answerTimes, tickTimes, false
case tickTimes > 2:
return message.Text("次数到了,没能猜出来。答案是\n", musicInfo[len(musicInfo)-1], "\n\n下面欣赏猜歌的歌曲"), answerTimes, tickTimes, true
default:
return message.Text("答案不对,再听这段音频,要仔细听哦"), answerTimes, tickTimes, false
}
}
}

577
plugin/guessmusic/main.go Normal file
View File

@@ -0,0 +1,577 @@
// Package guessmusic 基于zbp的猜歌插件
package guessmusic
import (
"encoding/json"
"os"
"strconv"
"strings"
"time"
wyy "github.com/FloatTech/AnimeAPI/neteasemusic"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/pkg/errors"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/single"
"github.com/wdvxdr1123/ZeroBot/message"
// 图片输出
"github.com/Coloured-glaze/gg"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/floatbox/process"
"github.com/FloatTech/zbputils/img/text"
)
const serviceErr = "[guessmusic]error:"
var (
// 用户数据
cfg config
// 插件主体
engine = control.Register("guessmusic", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "猜歌插件",
Help: "------bot主人指令------\n" +
"- 设置猜歌歌库路径 [绝对路径]\n" +
"- [创建/删除]歌单 [歌单名称]\n" +
"- 下载歌曲[歌曲名称/网易云歌曲ID]到[歌单名称]\n" +
"------管 理 员 指 令------\n" +
"- 设置猜歌默认歌单 [歌单名称]\n" +
"- 上传歌曲[群文件的音乐名]到[歌单名称]\n" +
"------公 用 指 令------\n" +
"- 歌单列表\n" +
"- [个人/团队]猜歌\n" +
"\n------重 要 事 项------\n" +
"1.本插件依赖ffmpeg\n" +
"2.\"删除[歌单名称]\"是将本地歌单数据全部删除, 慎用\n" +
"3.不支持下载VIP歌曲,如有需求请用群文件上传\n" +
"4.未设置默认歌单的场合,猜歌歌单为歌单列表第一个。\n" +
"此外可在\"[个人/团队]猜歌\"指令后面添加[-歌单名称]进行指定歌单猜歌\n" +
"5.猜歌内容必须以[-]开头才会识别\n" +
"6.歌曲命名规则为:\n歌名 - 歌手 - 其他(歌曲出处之类)" +
"\n------插 件 扩 展------\n" +
"内置了独角兽API,但API不保证可靠性。\n" +
"可以自行搭建或寻找NeteaseCloudMusicApi框架的API,本插件支持该API以下指令\n" +
"NeteaseCloudMusicApi项目地址:\nhttps://binaryify.github.io/NeteaseCloudMusicApi/#/\n" +
"- 设置猜歌API帮助\n" +
"- 设置猜歌API [API首页网址]\n" +
"- 猜歌[开启/关闭][歌单/歌词]自动下载\n" +
"- 登录网易云(这个指令目前不知道能干嘛,总之先保留了)\n" +
"- 歌单信息 [网易云歌单链接/ID]\n" +
"- [歌单名称]绑定网易云[网易云歌单链接/ID]\n" +
"- 下载歌单[网易云歌单链接/ID]到[歌单名称]\n" +
"- 解除绑定 [歌单名称]",
PrivateDataFolder: "guessmusic",
}).ApplySingle(single.New(
single.WithKeyFn(func(ctx *zero.Ctx) int64 { return ctx.Event.GroupID }),
single.WithPostFn[int64](func(ctx *zero.Ctx) {
ctx.Break()
ctx.Send(
message.ReplyWithMessage(ctx.Event.MessageID,
message.Text("已经有正在进行的游戏..."),
),
)
}),
))
// 用于存放歌曲三个片段的缓存文件夹
cachePath = engine.DataFolder() + "cache/"
// 用于存放用户的配置
cfgFile = engine.DataFolder() + "config.json"
// ffmpeg支持的格式
musictypelist = "mp3;MP3;wav;WAV;amr;AMR;3gp;3GP;3gpp;3GPP;acc;ACC"
)
func init() {
// 新建缓存文件夹
err := os.MkdirAll(cachePath, 0755)
if err != nil {
panic(serviceErr + err.Error())
}
// 载入用户配置
if file.IsExist(cfgFile) {
reader, err := os.Open(cfgFile)
if err == nil {
err = json.NewDecoder(reader).Decode(&cfg)
}
if err != nil {
panic(serviceErr + err.Error())
}
err = reader.Close()
if err != nil {
panic(serviceErr + err.Error())
}
} else {
// 配置默认 config
cfg = config{
MusicPath: file.BOTPATH + "/data/guessmusic/music/", // 绝对路径,歌库根目录,通过指令进行更改
Playlist: []listRaw{
{
Name: "这里是歌单名称,id为网易云歌单ID",
ID: 123456,
},
},
Defaultlist: []dlist{
{
GroupID: 123456,
Name: "这里是歌单名称,gid是群号",
},
},
API: true,
Local: true,
}
err = saveConfig(cfgFile)
if err != nil {
panic(serviceErr + err.Error())
}
}
// 用户配置
engine.OnPrefix("设置猜歌歌库路径", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
option := ctx.State["args"].(string)
musicPath := strings.ReplaceAll(option, "\\", "/")
if !strings.HasSuffix(musicPath, "/") {
musicPath += "/"
}
err := os.MkdirAll(musicPath, 0755)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
cfg.MusicPath = musicPath
err = saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
engine.OnPrefix("创建歌单", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
newList := cfg.MusicPath + ctx.State["args"].(string)
if file.IsNotExist(newList) {
err := os.MkdirAll(newList, 0755)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
} else {
ctx.SendChain(message.Text("歌单已存在!"))
}
})
engine.OnPrefix("删除歌单", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
delList := ctx.State["args"].(string)
err = os.RemoveAll(cfg.MusicPath + delList)
if err != nil {
ctx.SendChain(message.Text("删除失败,可能是歌单名称错误。\n可以发送“歌单列表”获取歌单名称"))
return
}
// 删除绑定的网易云ID
index := -1
for i, list := range cfg.Playlist {
if delList == list.Name {
index = i
break
}
}
if index == -1 {
ctx.SendChain(message.Text("成功!"))
return
}
cfg.Playlist = append(cfg.Playlist[:index], cfg.Playlist[index+1:]...)
err = saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
// 下载歌曲到对应的歌单里面
engine.OnRegex(`^下载歌曲\s*(.*)\s*到\s*(.*)$`, zero.SuperUserPermission).SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
keyword := ctx.State["regex_matched"].([]string)[1]
listName := ctx.State["regex_matched"].([]string)[2]
ctx.SendChain(message.Text("正在校验歌单信息,请稍等"))
// 是否存在该歌单
if file.IsNotExist(cfg.MusicPath + listName) {
ctx.SendChain(message.Text("歌单不存在,是否创建?(是/否)"))
next := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(是|否)`), ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(120 * time.Second)
answer := ""
for {
select {
case <-wait.C:
wait.Stop()
ctx.SendChain(message.Text("等待超时,取消下载"))
return
case c := <-recv:
wait.Stop()
answer = c.Event.Message.String()
}
if answer == "否" {
ctx.SendChain(message.Text("下载已经取消"))
return
}
if answer != "" {
break
}
}
err = os.MkdirAll(cfg.MusicPath+listName, 0777)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
}
searchlist, err := wyy.SearchMusic(keyword, 5)
if err != nil {
ctx.SendChain(message.Text("查询歌曲失败!\nerr:", err))
return
}
if len(searchlist) == 0 {
ctx.SendChain(message.Text("歌曲没有查询到,请确认信息正确"))
return
}
var musicchoose []string
for musicName := range searchlist {
musicchoose = append(musicchoose, musicName)
}
savePath := cfg.MusicPath + listName + "/"
index := 0
if len(musicchoose) > 1 {
var msg []string
msg = append(msg, "搜索到相近的歌曲,请回复对应序号进行下载或回复取消")
for i, musicName := range musicchoose {
msg = append(msg, strconv.Itoa(i)+"."+musicName)
}
ctx.SendChain(message.Text(strings.Join(msg, "\n")))
next := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`[0-4]|取消`), ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(120 * time.Second)
answer := ""
for {
select {
case <-wait.C:
wait.Stop()
ctx.SendChain(message.Text("等待超时,取消下载"))
return
case c := <-recv:
wait.Stop()
answer = c.Event.Message.String()
if answer == "取消" {
ctx.SendChain(message.Text("已取消下载"))
return
}
index, _ = strconv.Atoi(answer)
}
if answer != "" {
break
}
}
}
musicName := musicchoose[index]
// 下载歌曲
err = wyy.DownloadMusic(searchlist[musicName], musicName, savePath)
if err == nil {
if cfg.Local {
// 下载歌词
_ = wyy.DownloadLrc(searchlist[musicName], musicName, savePath+"歌词/")
}
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
// 从群文件下载歌曲
engine.OnRegex(`^上传歌曲\s*(.*)\s*到\s*(.*)$`, zero.OnlyGroup, zero.AdminPermission).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
fileName := ctx.State["regex_matched"].([]string)[1]
listName := ctx.State["regex_matched"].([]string)[2]
// 判断群文件是否存在
fileSearchName, fileURL := getFileURLbyFileName(ctx, fileName)
if fileSearchName == "" {
ctx.SendChain(message.Text(serviceErr, "请确认群文件文件名称是否正确或存在"))
return
}
// 解析歌曲信息
music := strings.Split(fileSearchName, ".")
// 获取音乐后缀
musictype := music[len(music)-1]
if !strings.Contains(musictypelist, musictype) {
ctx.SendChain(message.Text(fileSearchName, "不是插件支持的后缀,请更改后缀"))
return
}
// 获取音乐信息
musicInfo := strings.Split(strings.ReplaceAll(fileSearchName, "."+musictype, ""), " - ")
infoNum := len(musicInfo)
if infoNum == 1 {
ctx.SendChain(message.Text(fileSearchName, "不符合命名规则,请更改名称"))
return
}
fileName = "歌名:" + musicInfo[0] + "\n歌手:" + musicInfo[1]
musicAlia := ""
if infoNum > 2 {
musicAlia = musicInfo[2]
fileName += "\n其他信息:\n" + strings.ReplaceAll(musicAlia, "&", "\n")
}
// 是否存在该歌单
if file.IsNotExist(cfg.MusicPath + listName) {
if !zero.SuperUserPermission(ctx) {
ctx.SendChain(message.Text("歌单名称错误。\n可以发送“歌单列表”获取歌单名称"))
return
}
ctx.SendChain(message.Text("歌单不存在,是否创建?(是/否)"))
next := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(是|否)`), ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(120 * time.Second)
answer := ""
for {
select {
case <-wait.C:
wait.Stop()
ctx.SendChain(message.Text("等待超时,取消下载"))
return
case c := <-recv:
wait.Stop()
answer = c.Event.Message.String()
}
if answer == "否" {
ctx.SendChain(message.Text("下载已经取消"))
return
}
if answer != "" {
break
}
}
err = os.MkdirAll(cfg.MusicPath+listName, 0755)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
}
// 下载歌曲
ctx.SendChain(message.Text("在群文件中找到了歌曲,信息如下:\n", fileName, "\n确认正确后回复“是/否”进行上传"))
next := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`(是|否)`), ctx.CheckSession())
recv, cancel := next.Repeat()
defer cancel()
wait := time.NewTimer(120 * time.Second)
answer := ""
for {
select {
case <-wait.C:
wait.Stop()
ctx.SendChain(message.Text("等待超时,取消上传"))
return
case c := <-recv:
wait.Stop()
answer = c.Event.Message.String()
}
if answer == "否" {
ctx.SendChain(message.Text("上传已经取消"))
return
}
if answer != "" {
break
}
}
err = file.DownloadTo(fileURL, cfg.MusicPath+listName+"/"+fileSearchName)
if err == nil {
process.SleepAbout1sTo2s()
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
engine.OnFullMatch("歌单列表").SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
filelist, err := getlist(cfg.MusicPath)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
/***********设置图片的大小和底色***********/
number := len(filelist)
fontSize := 20.0
if number < 10 {
number = 10
}
canvas := gg.NewContext(480, int(80+fontSize*float64(number)))
canvas.SetRGB(1, 1, 1) // 白色
canvas.Clear()
/***********下载字体,可以注销掉***********/
_, err = file.GetLazyData(text.BoldFontFile, control.Md5File, true)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
}
_, err = file.GetLazyData(text.FontFile, control.Md5File, true)
if err != nil {
ctx.SendChain(message.Text(serviceErr, err))
}
/***********设置字体颜色为黑色***********/
canvas.SetRGB(0, 0, 0)
/***********设置字体大小,并获取字体高度用来定位***********/
if err = canvas.LoadFontFace(text.BoldFontFile, fontSize); err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
_, h := canvas.MeasureString("序号\t\t歌单名\t\t\t歌曲数量\t\t网易云歌单ID")
/***********绘制标题***********/
canvas.DrawString("序号\t\t歌单名\t\t歌曲数量\t\t网易云歌单ID", 20, 50-h) // 放置在中间位置
canvas.DrawString("——————————————————————", 20, 70-h)
/***********设置字体大小,并获取字体高度用来定位***********/
if err = canvas.LoadFontFace(text.FontFile, fontSize); err != nil {
ctx.SendChain(message.Text(serviceErr, err))
return
}
_, h = canvas.MeasureString("焯")
j := 0
for i, listinfo := range filelist {
canvas.DrawString(strconv.Itoa(i), 15, float64(85+20*i)-h)
canvas.DrawString(listinfo.Name, 85, float64(85+20*i)-h)
canvas.DrawString(strconv.Itoa(listinfo.Number), 220, float64(85+20*i)-h)
if listinfo.ID != 0 {
canvas.DrawString(strconv.FormatInt(listinfo.ID, 10), 320, float64(85+20*i)-h)
}
j = i + 2
}
for _, dlist := range cfg.Defaultlist {
if dlist.GroupID == ctx.Event.GroupID {
canvas.DrawString("当前设置的默认歌单为: "+dlist.Name, 80, float64(85+20*j)-h)
}
}
data, cl := writer.ToBytes(canvas.Image())
if id := ctx.SendChain(message.ImageBytes(data)); id.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
cl()
})
engine.OnPrefix("设置猜歌默认歌单", zero.AdminPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
option := ctx.State["args"].(string)
gid := ctx.Event.GroupID
if file.IsNotExist(cfg.MusicPath + option) {
ctx.SendChain(message.Text("歌单名称错误,可以发送“歌单列表”获取歌单名称"))
return
}
cfg.Defaultlist = append(cfg.Defaultlist, dlist{
GroupID: gid,
Name: option,
})
err = saveConfig(cfgFile)
if err == nil {
ctx.SendChain(message.Text("成功!"))
} else {
ctx.SendChain(message.Text(serviceErr, err))
}
})
}
// 保存用户配置
func saveConfig(cfgFile string) error {
if reader, err := os.Create(cfgFile); err == nil {
err = json.NewEncoder(reader).Encode(&cfg)
if err != nil {
return err
}
} else {
return err
}
return nil
}
// 获取本地歌单列表
func getlist(pathOfMusic string) (list []listinfo, err error) {
wyyID := make(map[string]int64, 100)
for _, wyyinfo := range cfg.Playlist {
wyyID[wyyinfo.Name] = wyyinfo.ID
}
err = os.MkdirAll(pathOfMusic, 0755)
if err != nil {
return
}
files, err := os.ReadDir(pathOfMusic)
if err != nil {
return
}
if len(files) == 0 {
err = errors.New("所设置的歌库不存在任何歌单!")
return
}
for _, name := range files {
if !name.IsDir() {
continue
}
listName := name.Name()
listfiles, err := os.ReadDir(pathOfMusic + listName)
if err != nil {
continue
}
list = append(list, listinfo{
Name: listName,
Number: len(listfiles),
ID: wyyID[listName],
})
}
return
}
// 遍历群文件
func getFileURLbyFileName(ctx *zero.Ctx, fileName string) (fileSearchName, fileURL string) {
filesOfGroup := ctx.GetThisGroupRootFiles(ctx.Event.GroupID)
files := filesOfGroup.Get("files").Array()
folders := filesOfGroup.Get("folders").Array()
// 遍历当前目录的文件名
if len(files) != 0 {
for _, fileNameOflist := range files {
if strings.Contains(fileNameOflist.Get("file_name").String(), fileName) {
fileSearchName = fileNameOflist.Get("file_name").String()
fileURL = ctx.GetThisGroupFileUrl(fileNameOflist.Get("busid").Int(), fileNameOflist.Get("file_id").String())
return
}
}
}
// 遍历子文件夹
if len(folders) != 0 {
for _, folderNameOflist := range folders {
folderID := folderNameOflist.Get("folder_id").String()
fileSearchName, fileURL = getFileURLbyfolderID(ctx, fileName, folderID)
if fileSearchName != "" {
return
}
}
}
return
}
func getFileURLbyfolderID(ctx *zero.Ctx, fileName, folderid string) (fileSearchName, fileURL string) {
filesOfGroup := ctx.GetThisGroupFilesByFolder(folderid)
files := filesOfGroup.Get("files").Array()
folders := filesOfGroup.Get("folders").Array()
// 遍历当前目录的文件名
if len(files) != 0 {
for _, fileNameOflist := range files {
if strings.Contains(fileNameOflist.Get("file_name").String(), fileName) {
fileSearchName = fileNameOflist.Get("file_name").String()
fileURL = ctx.GetThisGroupFileUrl(fileNameOflist.Get("busid").Int(), fileNameOflist.Get("file_id").String())
return
}
}
}
// 遍历子文件夹
if len(folders) != 0 {
for _, folderNameOflist := range folders {
folderID := folderNameOflist.Get("folder_id").String()
fileSearchName, fileURL = getFileURLbyfolderID(ctx, fileName, folderID)
if fileSearchName != "" {
return
}
}
}
return
}

446
plugin/guessmusic/struct.go Normal file
View File

@@ -0,0 +1,446 @@
package guessmusic
// config内容
type config struct {
MusicPath string `json:"musicPath"`
APIURL string `json:"apiURL"`
Playlist []listRaw `json:"playlist"`
Defaultlist []dlist `json:"defaultlist"`
Local bool `json:"local"`
API bool `json:"api"`
Cookie string `json:"cookie"`
}
// 记录歌单绑定的网易云歌单ID
type listRaw struct {
Name string `json:"name"` // 歌单名称
ID int64 `json:"id"` // 歌单绑定的网易云ID
}
// 记录群默认猜歌
type dlist struct {
GroupID int64 `json:"gid"` // 群号
Name string `json:"name"` // 歌单名称
}
// 本地歌单列表信息
type listinfo struct {
Name string `json:"name"` // 歌单名称
Number int // 歌曲数量
ID int64 // 歌单绑定的歌曲ID
}
/*****************************************************************/
/***************NeteaseCloudMusicApi框架API************************/
/*****************************************************************/
// 获取登陆信息
type keyInfo struct {
Data struct {
Code int `json:"code"`
Unikey string `json:"unikey"`
} `json:"data"`
Code int `json:"code"`
}
type cookyInfo struct {
Code int `json:"code"`
Message string `json:"message"`
Cookie string `json:"cookie"`
}
type qrInfo struct {
Code int `json:"code"`
Data struct {
Qrurl string `json:"qrurl"`
Qrimg string `json:"qrimg"`
} `json:"data"`
}
// 获取歌单信息
type listInfoOfAPI struct {
Code int `json:"code"`
RelatedVideos interface{} `json:"relatedVideos"`
Playlist struct {
ID int64 `json:"id"`
Name string `json:"name"`
CoverImgID int64 `json:"coverImgId"`
CoverImgURL string `json:"coverImgUrl"`
CoverImgIDStr string `json:"coverImgId_str"`
AdType int `json:"adType"`
UserID int `json:"userId"`
CreateTime int64 `json:"createTime"`
Status int `json:"status"`
OpRecommend bool `json:"opRecommend"`
HighQuality bool `json:"highQuality"`
NewImported bool `json:"newImported"`
UpdateTime int64 `json:"updateTime"`
TrackCount int `json:"trackCount"`
SpecialType int `json:"specialType"`
Privacy int `json:"privacy"`
TrackUpdateTime int64 `json:"trackUpdateTime"`
CommentThreadID string `json:"commentThreadId"`
PlayCount int `json:"playCount"`
TrackNumberUpdateTime int64 `json:"trackNumberUpdateTime"`
SubscribedCount int `json:"subscribedCount"`
CloudTrackCount int `json:"cloudTrackCount"`
Ordered bool `json:"ordered"`
Description string `json:"description"`
Tags []string `json:"tags"`
UpdateFrequency interface{} `json:"updateFrequency"`
BackgroundCoverID int `json:"backgroundCoverId"`
BackgroundCoverURL interface{} `json:"backgroundCoverUrl"`
TitleImage int `json:"titleImage"`
TitleImageURL interface{} `json:"titleImageUrl"`
EnglishTitle interface{} `json:"englishTitle"`
OfficialPlaylistType interface{} `json:"officialPlaylistType"`
Subscribers []struct {
DefaultAvatar bool `json:"defaultAvatar"`
Province int `json:"province"`
AuthStatus int `json:"authStatus"`
Followed bool `json:"followed"`
AvatarURL string `json:"avatarUrl"`
AccountStatus int `json:"accountStatus"`
Gender int `json:"gender"`
City int `json:"city"`
Birthday int `json:"birthday"`
UserID int `json:"userId"`
UserType int `json:"userType"`
Nickname string `json:"nickname"`
Signature string `json:"signature"`
Description string `json:"description"`
DetailDescription string `json:"detailDescription"`
AvatarImgID int64 `json:"avatarImgId"`
BackgroundImgID int64 `json:"backgroundImgId"`
BackgroundURL string `json:"backgroundUrl"`
Authority int `json:"authority"`
Mutual bool `json:"mutual"`
ExpertTags interface{} `json:"expertTags"`
Experts interface{} `json:"experts"`
DjStatus int `json:"djStatus"`
VipType int `json:"vipType"`
RemarkName interface{} `json:"remarkName"`
AuthenticationTypes int `json:"authenticationTypes"`
AvatarDetail interface{} `json:"avatarDetail"`
Anchor bool `json:"anchor"`
BackgroundImgIDStr string `json:"backgroundImgIdStr"`
AvatarImgIDStr string `json:"avatarImgIdStr"`
AvatarImgIDString string `json:"AvatarImgIDString"`
} `json:"subscribers"`
Subscribed interface{} `json:"subscribed"`
Creator struct {
DefaultAvatar bool `json:"defaultAvatar"`
Province int `json:"province"`
AuthStatus int `json:"authStatus"`
Followed bool `json:"followed"`
AvatarURL string `json:"avatarUrl"`
AccountStatus int `json:"accountStatus"`
Gender int `json:"gender"`
City int `json:"city"`
Birthday int `json:"birthday"`
UserID int `json:"userId"`
UserType int `json:"userType"`
Nickname string `json:"nickname"`
Signature string `json:"signature"`
Description string `json:"description"`
DetailDescription string `json:"detailDescription"`
AvatarImgID int64 `json:"avatarImgId"`
BackgroundImgID int64 `json:"backgroundImgId"`
BackgroundURL string `json:"backgroundUrl"`
Authority int `json:"authority"`
Mutual bool `json:"mutual"`
ExpertTags interface{} `json:"expertTags"`
Experts interface{} `json:"experts"`
DjStatus int `json:"djStatus"`
VipType int `json:"vipType"`
RemarkName interface{} `json:"remarkName"`
AuthenticationTypes int `json:"authenticationTypes"`
AvatarDetail struct {
UserType int `json:"userType"`
IdentityLevel int `json:"identityLevel"`
IdentityIconURL string `json:"identityIconUrl"`
} `json:"avatarDetail"`
Anchor bool `json:"anchor"`
BackgroundImgIDStr string `json:"backgroundImgIdStr"`
AvatarImgIDStr string `json:"avatarImgIdStr"`
AvatarImgIDString string `json:"AvatarImgIDString"`
} `json:"creator"`
Tracks []struct {
Name string `json:"name"`
ID int `json:"id"`
Pst int `json:"pst"`
T int `json:"t"`
Ar []struct {
ID int `json:"id"`
Name string `json:"name"`
Tns []interface{} `json:"tns"`
Alias []interface{} `json:"alias"`
} `json:"ar"`
Alia []string `json:"alia"`
Pop int `json:"pop"`
St int `json:"st"`
Rt string `json:"rt"`
Fee int `json:"fee"`
V int `json:"v"`
Crbt interface{} `json:"crbt"`
Cf string `json:"cf"`
Al struct {
ID int `json:"id"`
Name string `json:"name"`
PicURL string `json:"picUrl"`
Tns []interface{} `json:"tns"`
PicStr string `json:"pic_str"`
Pic int64 `json:"pic"`
} `json:"al"`
Dt int `json:"dt"`
H struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float64 `json:"vd"`
Sr int `json:"sr"`
} `json:"h"`
M struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float64 `json:"vd"`
Sr int `json:"sr"`
} `json:"m"`
L struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float64 `json:"vd"`
Sr int `json:"sr"`
} `json:"l"`
Sq interface{} `json:"sq"`
Hr interface{} `json:"hr"`
A interface{} `json:"a"`
Cd string `json:"cd"`
No int `json:"no"`
RtURL interface{} `json:"rtUrl"`
Ftype int `json:"ftype"`
RtUrls []interface{} `json:"rtUrls"`
DjID int `json:"djId"`
Copyright int `json:"copyright"`
SID int `json:"s_id"`
Mark int `json:"mark"`
OriginCoverType int `json:"originCoverType"`
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
TagPicList interface{} `json:"tagPicList"`
ResourceState bool `json:"resourceState"`
Version int `json:"version"`
SongJumpInfo interface{} `json:"songJumpInfo"`
EntertainmentTags interface{} `json:"entertainmentTags"`
Single int `json:"single"`
NoCopyrightRcmd interface{} `json:"noCopyrightRcmd"`
Alg interface{} `json:"alg"`
Rtype int `json:"rtype"`
Rurl interface{} `json:"rurl"`
Mst int `json:"mst"`
Cp int `json:"cp"`
Mv int `json:"mv"`
PublishTime int64 `json:"publishTime"`
Tns []string `json:"tns,omitempty"`
} `json:"tracks"`
VideoIds interface{} `json:"videoIds"`
Videos interface{} `json:"videos"`
TrackIds []struct {
ID int `json:"id"`
V int `json:"v"`
T int `json:"t"`
At int64 `json:"at"`
Alg interface{} `json:"alg"`
UID int `json:"uid"`
RcmdReason string `json:"rcmdReason"`
Sc interface{} `json:"sc"`
Lr int `json:"lr,omitempty"`
} `json:"trackIds"`
ShareCount int `json:"shareCount"`
CommentCount int `json:"commentCount"`
RemixVideo interface{} `json:"remixVideo"`
SharedUsers interface{} `json:"sharedUsers"`
HistorySharedUsers interface{} `json:"historySharedUsers"`
GradeStatus string `json:"gradeStatus"`
Score interface{} `json:"score"`
AlgTags interface{} `json:"algTags"`
} `json:"playlist"`
Urls interface{} `json:"urls"`
Privileges []struct {
ID int `json:"id"`
Fee int `json:"fee"`
Payed int `json:"payed"`
RealPayed int `json:"realPayed"`
St int `json:"st"`
Pl int `json:"pl"`
Dl int `json:"dl"`
Sp int `json:"sp"`
Cp int `json:"cp"`
Subp int `json:"subp"`
Cs bool `json:"cs"`
Maxbr int `json:"maxbr"`
Fl int `json:"fl"`
Pc interface{} `json:"pc"`
Toast bool `json:"toast"`
Flag int `json:"flag"`
PaidBigBang bool `json:"paidBigBang"`
PreSell bool `json:"preSell"`
PlayMaxbr int `json:"playMaxbr"`
DownloadMaxbr int `json:"downloadMaxbr"`
MaxBrLevel string `json:"maxBrLevel"`
PlayMaxBrLevel string `json:"playMaxBrLevel"`
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
PlLevel string `json:"plLevel"`
DlLevel string `json:"dlLevel"`
FlLevel string `json:"flLevel"`
Rscl int `json:"rscl"`
FreeTrialPrivilege struct {
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
ListenType interface{} `json:"listenType"`
} `json:"freeTrialPrivilege"`
ChargeInfoList []struct {
Rate int `json:"rate"`
ChargeURL interface{} `json:"chargeUrl"`
ChargeMessage interface{} `json:"chargeMessage"`
ChargeType int `json:"chargeType"`
} `json:"chargeInfoList"`
} `json:"privileges"`
SharedPrivilege interface{} `json:"sharedPrivilege"`
ResEntrance interface{} `json:"resEntrance"`
}
// 获取歌单列表
type musicListOfApI struct {
Songs []struct {
Name string `json:"name"`
ID int `json:"id"`
Pst int `json:"pst"`
T int `json:"t"`
Ar []struct {
ID int `json:"id"`
Name string `json:"name"`
Tns []interface{} `json:"tns"`
Alias []interface{} `json:"alias"`
} `json:"ar"`
Alia []string `json:"alia"`
Pop int `json:"pop"`
St int `json:"st"`
Rt string `json:"rt"`
Fee int `json:"fee"`
V int `json:"v"`
Crbt interface{} `json:"crbt"`
Cf string `json:"cf"`
Al struct {
ID int `json:"id"`
Name string `json:"name"`
PicURL string `json:"picUrl"`
Tns []interface{} `json:"tns"`
PicStr string `json:"pic_str"`
Pic int64 `json:"pic"`
} `json:"al"`
Dt int `json:"dt"`
H struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float32 `json:"vd"`
Sr int `json:"sr"`
} `json:"h"`
M struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float32 `json:"vd"`
Sr int `json:"sr"`
} `json:"m"`
L struct {
Br int `json:"br"`
Fid int `json:"fid"`
Size int `json:"size"`
Vd float32 `json:"vd"`
Sr int `json:"sr"`
} `json:"l"`
Sq interface{} `json:"sq"`
Hr interface{} `json:"hr"`
A interface{} `json:"a"`
Cd string `json:"cd"`
No int `json:"no"`
RtURL interface{} `json:"rtUrl"`
Ftype int `json:"ftype"`
RtUrls []interface{} `json:"rtUrls"`
DjID int `json:"djId"`
Copyright int `json:"copyright"`
SID int `json:"s_id"`
Mark int `json:"mark"`
OriginCoverType int `json:"originCoverType"`
OriginSongSimpleData interface{} `json:"originSongSimpleData"`
TagPicList interface{} `json:"tagPicList"`
ResourceState bool `json:"resourceState"`
Version int `json:"version"`
SongJumpInfo interface{} `json:"songJumpInfo"`
EntertainmentTags interface{} `json:"entertainmentTags"`
AwardTags interface{} `json:"awardTags"`
Single int `json:"single"`
NoCopyrightRcmd interface{} `json:"noCopyrightRcmd"`
Rtype int `json:"rtype"`
Rurl interface{} `json:"rurl"`
Mst int `json:"mst"`
Cp int `json:"cp"`
Mv int `json:"mv"`
PublishTime int64 `json:"publishTime"`
Tns []string `json:"tns,omitempty"`
} `json:"songs"`
Privileges []struct {
ID int `json:"id"`
Fee int `json:"fee"`
Payed int `json:"payed"`
St int `json:"st"`
Pl int `json:"pl"`
Dl int `json:"dl"`
Sp int `json:"sp"`
Cp int `json:"cp"`
Subp int `json:"subp"`
Cs bool `json:"cs"`
Maxbr int `json:"maxbr"`
Fl int `json:"fl"`
Toast bool `json:"toast"`
Flag int `json:"flag"`
PreSell bool `json:"preSell"`
PlayMaxbr int `json:"playMaxbr"`
DownloadMaxbr int `json:"downloadMaxbr"`
MaxBrLevel string `json:"maxBrLevel"`
PlayMaxBrLevel string `json:"playMaxBrLevel"`
DownloadMaxBrLevel string `json:"downloadMaxBrLevel"`
PlLevel string `json:"plLevel"`
DlLevel string `json:"dlLevel"`
FlLevel string `json:"flLevel"`
Rscl int `json:"rscl"`
FreeTrialPrivilege struct {
ResConsumable bool `json:"resConsumable"`
UserConsumable bool `json:"userConsumable"`
ListenType interface{} `json:"listenType"`
} `json:"freeTrialPrivilege"`
ChargeInfoList []struct {
Rate int `json:"rate"`
ChargeURL interface{} `json:"chargeUrl"`
ChargeMessage interface{} `json:"chargeMessage"`
ChargeType int `json:"chargeType"`
} `json:"chargeInfoList"`
} `json:"privileges"`
Code int `json:"code"`
}
/*****************************************************************/
/*********************独角兽API随机抽歌信息**************************/
/*****************************************************************/
// 独角兽API随机抽歌信息
type ovooaData struct {
Code int `json:"code"`
Text string `json:"text"`
Data struct {
Song string `json:"song"`
Singer string `json:"singer"`
Cover string `json:"cover"`
Music string `json:"Music"`
ID int `json:"id"`
} `json:"data"`
}

119
plugin/heisi/heisi.go Normal file
View File

@@ -0,0 +1,119 @@
// Package heisi 黑丝
package heisi
import (
"errors"
"math/rand"
"os"
"strconv"
"time"
"unsafe"
"github.com/FloatTech/AnimeAPI/setu"
fbctxext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
var (
heisiPic []item
baisiPic []item
jkPic []item
jurPic []item
zukPic []item
mcnPic []item
fileList = [...]string{"heisi.bin", "baisi.bin", "jk.bin", "jur.bin", "zuk.bin", "mcn.bin"}
)
func init() { // 插件主体
p, err := setu.NewPool(setu.DefaultPoolDir,
func(s string) (string, error) {
if s != "黑丝" && s != "白丝" && s != "jk" && s != "巨乳" && s != "足控" && s != "网红" {
return "", errors.New("invalid call")
}
typ := setu.DefaultPoolDir + "/" + s
if file.IsNotExist(typ) {
err := os.MkdirAll(typ, 0755)
if err != nil {
return "", err
}
}
var pic item
switch s {
case "黑丝":
pic = heisiPic[rand.Intn(len(heisiPic))]
case "白丝":
pic = baisiPic[rand.Intn(len(baisiPic))]
case "jk":
pic = jkPic[rand.Intn(len(jkPic))]
case "巨乳":
pic = jurPic[rand.Intn(len(jurPic))]
case "足控":
pic = zukPic[rand.Intn(len(zukPic))]
case "网红":
pic = mcnPic[rand.Intn(len(mcnPic))]
}
return pic.String(), nil
}, func(s string) ([]byte, error) {
return web.RequestDataWith(web.NewTLS12Client(), s, "GET", "http://hs.heisiwu.com/", web.RandUA(), nil)
}, time.Minute)
if err != nil {
panic(err)
}
engine := control.Register("heisi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "黑丝",
Help: "- 来点黑丝\n- 来点白丝\n- 来点jk\n- 来点巨乳\n- 来点足控\n- 来点网红",
PublicDataFolder: "Heisi",
})
engine.OnFullMatchGroup([]string{"来点黑丝", "来点白丝", "来点jk", "来点巨乳", "来点足控", "来点网红"}, zero.OnlyGroup, fbctxext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
for i, filePath := range fileList {
data, err := engine.GetLazyData(filePath, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
if len(data)%10 != 0 {
ctx.SendChain(message.Text("ERROR: invalid data " + strconv.Itoa(i)))
return false
}
s := (*slice)(unsafe.Pointer(&data))
s.len /= 10
s.cap /= 10
switch i {
case 0:
heisiPic = *(*[]item)(unsafe.Pointer(s))
case 1:
baisiPic = *(*[]item)(unsafe.Pointer(s))
case 2:
jkPic = *(*[]item)(unsafe.Pointer(s))
case 3:
jurPic = *(*[]item)(unsafe.Pointer(s))
case 4:
zukPic = *(*[]item)(unsafe.Pointer(s))
case 5:
mcnPic = *(*[]item)(unsafe.Pointer(s))
}
}
return true
})).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
matched := ctx.State["matched"].(string)
pic, err := p.Roll(matched[3*2:])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("file:///"+file.BOTPATH+"/"+pic))}
if id := ctx.Send(m).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
})
}

48
plugin/heisi/packer.go Normal file
View File

@@ -0,0 +1,48 @@
package heisi
import (
"encoding/binary"
"encoding/hex"
"fmt"
"math/bits"
)
const (
template2021 = "http://hs.heisiwu.com/wp-content/uploads/%4d/%02d/%4d%02d16%06d-611a3%8s.jpg"
templategeneral = "http://hs.heisiwu.com/wp-content/uploads/%4d/%02d/%015x"
)
type item [10]byte
// String item to url
func (it item) String() string {
year, month := int((it[0]>>4)&0x0f), int(it[0]&0x0f)
year += 2021
if year == 2021 {
num := binary.BigEndian.Uint32(it[1:5])
dstr := hex.EncodeToString(it[5:9])
return fmt.Sprintf(template2021, year, month, year, month, num, dstr)
}
d := binary.BigEndian.Uint64(it[1:9])
isscaled := it[9]&0x80 > 0
num := int(it[9] & 0x7f)
trestore := fmt.Sprintf(templategeneral, year, month, d&0x0fffffff_ffffffff)
if num > 0 {
trestore += fmt.Sprintf("-%d", num)
}
if isscaled {
trestore += "-scaled"
}
d = bits.RotateLeft64(d, 4) & 0x0f
switch d {
case 0:
trestore += ".jpg"
case 1:
trestore += ".png"
case 2:
trestore += ".webp"
default:
return "invalid ext"
}
return trestore
}

15
plugin/heisi/slice.go Normal file
View File

@@ -0,0 +1,15 @@
package heisi
import "unsafe"
// slice is the runtime representation of a slice.
// It cannot be used safely or portably and its representation may
// change in a later release.
//
// Unlike reflect.SliceHeader, its Data field is sufficient to guarantee the
// data it references will not be garbage collected.
type slice struct {
data unsafe.Pointer
len int
cap int
}

119
plugin/hs/run.go Normal file
View File

@@ -0,0 +1,119 @@
// Package hs 炉石
package hs
import (
"os"
"strconv"
"strings"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
)
var reqconf = [...]string{"GET", "https://hs.fbigame.com",
"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"}
const (
hs = `https://hs.fbigame.com/ajax.php?`
para = "mod=get_cards_list&" +
"mode=-1&" +
"extend=-1&" +
"mutil_extend=&" +
"hero=-1&" +
"rarity=-1&" +
"cost=-1&" +
"mutil_cost=&" +
"techlevel=-1&" +
"type=-1&" +
"collectible=-1&" +
"isbacon=-1&" +
"page=1&" +
"search_type=1&" +
"deckmode=normal"
)
func init() {
engine := control.Register("hs", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "炉石搜卡",
Help: "- 搜卡[xxxx]\n" +
"- [卡组代码xxx]\n" +
"- 更多搜卡指令参数https://hs.fbigame.com/misc/searchhelp",
PrivateDataFolder: "hs",
}).ApplySingle(ctxext.DefaultSingle)
cachedir := file.BOTPATH + "/" + engine.DataFolder()
engine.OnRegex(`^搜卡(.+)$`).
SetBlock(true).Handle(func(ctx *zero.Ctx) {
List := ctx.State["regex_matched"].([]string)[1]
g := sh(List)
t := int(gjson.Get(g, `list.#`).Int())
if t == 0 {
ctx.SendChain(message.Text("查询为空!"))
return
}
var sk message.Message
for i := 0; i < t && i < 5; i++ {
cid := gjson.Get(g, `list.`+strconv.Itoa(i)+`.CardID`).String()
cachefile := cachedir + cid
if file.IsNotExist(cachefile) {
data, err := web.RequestDataWith(web.NewDefaultClient(),
`https://res.fbigame.com/hs/v13/`+cid+`.png?auth_key=`+
gjson.Get(g, `list.`+strconv.Itoa(i)+`.auth_key`).String(),
reqconf[0], reqconf[1], reqconf[2], nil)
if err == nil {
err = os.WriteFile(cachefile, data, 0644)
}
if err != nil {
continue
}
}
sk = append(sk, ctxext.FakeSenderForwardNode(ctx, message.Image("file:///"+cachefile)))
}
if id := ctx.SendGroupForwardMessage(
ctx.Event.GroupID,
sk,
).Get("message_id").Int(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
})
// 卡组
engine.OnRegex(`^[\s\S]*?(AAE[a-zA-Z0-9/\+=]{70,})[\s\S]*$`).
SetBlock(true).Handle(func(ctx *zero.Ctx) {
List := ctx.State["regex_matched"].([]string)[1]
ctx.SendChain(
message.Image(kz(List)),
)
})
}
func sh(s string) string {
data, err := web.RequestDataWith(web.NewDefaultClient(), "https://hs.fbigame.com", reqconf[0], reqconf[1], reqconf[2], nil)
if err == nil {
url := hs + para + "&hash=" + strings.SplitN(strings.SplitN(helper.BytesToString(data), `var hash = "`, 2)[1], `"`, 2)[0] + "&search=" + s
r, err := web.RequestDataWith(web.NewDefaultClient(), url, reqconf[0], reqconf[1], reqconf[2], nil)
if err == nil {
return helper.BytesToString(r)
}
}
return ""
}
func kz(s string) string {
data, err := web.RequestDataWith(web.NewDefaultClient(), "https://hs.fbigame.com", reqconf[0], reqconf[1], reqconf[2], nil)
if err == nil {
url := hs + para + "mod=general_deck_image&deck_code=" + s + "&deck_text=&hash=" + strings.SplitN(strings.SplitN(helper.BytesToString(data), `var hash = "`, 2)[1], `"`, 2)[0] + "&search=" + s
r, err := web.RequestDataWith(web.NewDefaultClient(), url, reqconf[0], reqconf[1], reqconf[2], nil)
if err == nil {
return "base64://" + gjson.Get(helper.BytesToString(r), "img").String()
}
}
return ""
}

135
plugin/hyaku/main.go Normal file
View File

@@ -0,0 +1,135 @@
// Package hyaku 百人一首
package hyaku
import (
"bytes"
"encoding/csv"
"fmt"
"math/rand"
"os"
"reflect"
"strconv"
"unsafe"
"github.com/FloatTech/floatbox/binary"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const bed = "https://gitcode.net/u011570312/OguraHyakuninIsshu/-/raw/master/"
type line struct {
番号, 歌人, 上の句, 下の句, 上の句ひらがな, 下の句ひらがな string
}
func (l *line) String() string {
b := binary.NewWriterF(func(w *binary.Writer) {
r := reflect.ValueOf(l).Elem().Type()
for i := 0; i < r.NumField(); i++ {
switch i {
case 0:
w.WriteString("●")
case 1:
w.WriteString("◉")
case 2, 3:
w.WriteString("○")
case 4, 5:
w.WriteString("◎")
}
w.WriteString(r.Field(i).Name)
w.WriteString("")
w.WriteString((*[6]string)(unsafe.Pointer(l))[i])
w.WriteString("\n")
}
})
return binary.BytesToString(b)
}
var lines [100]*line
func init() {
engine := control.Register("hyaku", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "百人一首",
Help: "- 百人一首(随机发一首)\n" +
"- 百人一首之n",
PrivateDataFolder: "hyaku",
})
err := os.MkdirAll(engine.DataFolder()+"img", 0755)
if err != nil {
panic(err)
}
data, err := engine.GetCustomLazyData(bed, "小倉百人一首.csv")
if err != nil {
panic(err)
}
records, err := csv.NewReader(bytes.NewReader(data)).ReadAll()
if err != nil {
panic(err)
}
records = records[1:] // skip title
if len(records) != 100 {
panic("invalid csvfile")
}
for j, r := range records {
if len(r) != 6 {
panic("invalid csvfile")
}
i, err := strconv.Atoi(r[0])
if err != nil {
panic(err)
}
i--
if j != i {
panic("invalid csvfile")
}
lines[i] = (*line)(*(*unsafe.Pointer)(unsafe.Pointer(&r)))
}
engine.OnFullMatch("百人一首").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
i := rand.Intn(100)
img0, err := engine.GetCustomLazyData(bed, fmt.Sprintf("img/%03d.jpg", i+1))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
img1, err := engine.GetCustomLazyData(bed, fmt.Sprintf("img/%03d.png", i+1))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(
message.ImageBytes(img0),
message.Text("\n", lines[i]),
message.ImageBytes(img1),
)
})
engine.OnRegex(`^百人一首之\s?(\d+)$`).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
i, err := strconv.Atoi(ctx.State["regex_matched"].([]string)[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if i > 100 || i < 1 {
ctx.SendChain(message.Text("ERROR: 超出范围"))
return
}
img0, err := engine.GetCustomLazyData(bed, fmt.Sprintf("img/%03d.jpg", i))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
img1, err := engine.GetCustomLazyData(bed, fmt.Sprintf("img/%03d.png", i))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(
message.ImageBytes(img0),
message.Text("\n", lines[i-1]),
message.ImageBytes(img1),
)
})
}

View File

@@ -0,0 +1,150 @@
// Package imagefinder 关键字搜图
package imagefinder
import (
"encoding/json"
"errors"
"math/rand"
"net/http"
"net/url"
"reflect"
"regexp"
"strings"
"github.com/lucas-clemente/quic-go/http3"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/FloatTech/AnimeAPI/pixiv"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img/pool"
)
type resultjson struct {
Error bool `json:"error"`
Message string `json:"message"`
Data struct {
Illusts []struct {
ID int64 `json:"id"`
Title string `json:"title"`
AltTitle string `json:"altTitle"`
Description string `json:"description"`
Type int64 `json:"type"`
CreateDate string `json:"createDate"`
UploadDate string `json:"uploadDate"`
Sanity int64 `json:"sanity"`
Width int64 `json:"width"`
Height int64 `json:"height"`
PageCount int64 `json:"pageCount"`
Tags []struct {
Name string `json:"name"`
Translation string `json:"translation"`
} `json:"tags"`
Statistic struct {
Bookmarks int64 `json:"bookmarks"`
Likes int64 `json:"likes"`
Comments int64 `json:"comments"`
Views int64 `json:"views"`
} `json:"statistic"`
Image string `json:"image"`
} `json:"illusts"`
Scores []float64 `json:"scores"`
HasNext bool `json:"has_next"`
} `json:"data"`
}
var hrefre = regexp.MustCompile(`<a href=".*">`)
func init() {
control.Register("imgfinder", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "关键字搜图",
Help: "- 来张 [xxx]",
}).OnRegex(`^来张\s?(.*)$`, zero.AdminPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
keyword := ctx.State["regex_matched"].([]string)[1]
soutujson, err := soutuapi(keyword)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
rannum := rand.Intn(len(soutujson.Data.Illusts))
il := soutujson.Data.Illusts[rannum]
illust, err := pixiv.Works(il.ID)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if len(illust.ImageUrls) == 0 {
ctx.SendChain(message.Text("ERROR: nil image url"))
return
}
u := illust.ImageUrls[0]
n := u[strings.LastIndex(u, "/")+1 : len(u)-4]
f := illust.Path(0)
err = pool.SendImageFromPool(n, f, func() error {
// 下载图片
return illust.DownloadToCache(0)
}, ctxext.SendFakeForwardToGroup(ctx,
message.Text(
il.Width, "x", il.Height, "\n",
"标题: ", il.Title, "\n",
"副标题: ", il.AltTitle, "\n",
"ID: ", il.ID, "\n",
"画师: ", illust.UserName, " (", illust.UserID, ")", "\n",
"分级:", il.Sanity, "\n",
hrefre.ReplaceAllString(strings.ReplaceAll(strings.ReplaceAll(il.Description, "<br />", "\n"), "</a>", ""), ""),
printtags(reflect.ValueOf(&il.Tags)),
),
), ctxext.GetFirstMessageInForward(ctx))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
})
}
// soutuapi 请求api
func soutuapi(keyword string) (r resultjson, err error) {
var data []byte
data, err = web.RequestDataWith(&http.Client{Transport: &http3.RoundTripper{}},
"https://api.pixivel.moe/v2/pixiv/illust/search/"+url.QueryEscape(keyword)+"?page=0",
"GET",
"https://pixivel.moe/",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",
nil,
)
if err != nil {
return
}
err = json.Unmarshal(data, &r)
if err == nil && r.Error {
err = errors.New(r.Message)
}
return
}
func printtags(r reflect.Value) string {
tags := r.Elem()
s := binary.BytesToString(binary.NewWriterF(func(w *binary.Writer) {
for i := 0; i < tags.Len(); i++ {
_ = w.WriteByte('\n')
tag := tags.Index(i)
_ = w.WriteByte('#')
w.WriteString(tag.Field(0).String())
if !tag.Field(1).IsZero() {
w.WriteString(" (")
w.WriteString(tag.Field(1).String())
w.WriteString(")")
}
}
}))
return s
}

23
plugin/inject/main.go Normal file
View File

@@ -0,0 +1,23 @@
// Package inject 注入指令
package inject
import (
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
func init() {
en := control.Register("inject", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "注入指令",
Help: "- run[CQ码]",
})
// 运行 CQ 码
en.OnPrefix("run", zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 可注入,权限为主人
ctx.Send(message.UnescapeCQCodeText(ctx.State["args"].(string)))
})
}

Some files were not shown because too many files have changed in this diff Show More