mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2026-02-06 15:20:22 +00:00
Compare commits
1196 Commits
p1.1.5
...
v1.6.1-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c8e9198ee | ||
|
|
40da2481cc | ||
|
|
a7ae56481b | ||
|
|
f550d58ad7 | ||
|
|
f488b75ac6 | ||
|
|
4308e386b4 | ||
|
|
df1c207d77 | ||
|
|
8ca71967b6 | ||
|
|
c99d09ea63 | ||
|
|
9ce65de698 | ||
|
|
cc7953c486 | ||
|
|
d50f330ccf | ||
|
|
36f2a23aa1 | ||
|
|
14b98d4006 | ||
|
|
d401136966 | ||
|
|
d0610b152f | ||
|
|
fa8428ae8b | ||
|
|
7d1a4b4005 | ||
|
|
19e3688499 | ||
|
|
b8da6f8cfd | ||
|
|
58631c5b19 | ||
|
|
e994768318 | ||
|
|
c304d72d77 | ||
|
|
a1f1016fb9 | ||
|
|
913f01d69f | ||
|
|
f56929c852 | ||
|
|
e9e0498b34 | ||
|
|
b6026ee76a | ||
|
|
8fdc358cc5 | ||
|
|
fef0ac6049 | ||
|
|
e144db9205 | ||
|
|
825a5a0d43 | ||
|
|
6dccfc862c | ||
|
|
771f93f9af | ||
|
|
7893fc9ebe | ||
|
|
9b4363dda8 | ||
|
|
257263bfa2 | ||
|
|
8f009bb4ee | ||
|
|
34a3cf82e7 | ||
|
|
cd927ec2c4 | ||
|
|
1266b2378a | ||
|
|
575d158d5a | ||
|
|
a008faf805 | ||
|
|
9a2081de0a | ||
|
|
9550b817c5 | ||
|
|
ee895e7dc4 | ||
|
|
7aa2996540 | ||
|
|
725aa5b180 | ||
|
|
f96f14052e | ||
|
|
adfa9f9e0f | ||
|
|
d8bc336006 | ||
|
|
b69bd3d640 | ||
|
|
5d9ac50106 | ||
|
|
df83ffc8b0 | ||
|
|
e49b568d6d | ||
|
|
8399e49072 | ||
|
|
d76a65ec07 | ||
|
|
ed7cef7566 | ||
|
|
3349ec7694 | ||
|
|
11f358bcbf | ||
|
|
82608d01bb | ||
|
|
a93f4f68b4 | ||
|
|
6f8c576a44 | ||
|
|
e75fc83412 | ||
|
|
2e538e3905 | ||
|
|
a69399fa58 | ||
|
|
3e94d27e6a | ||
|
|
20293b35f8 | ||
|
|
b768e48a74 | ||
|
|
6a64c1ffd6 | ||
|
|
3b1ad2250f | ||
|
|
83778afd51 | ||
|
|
cbbae11fcd | ||
|
|
11c01af9da | ||
|
|
7547b33f65 | ||
|
|
4305f589df | ||
|
|
c8684f74a8 | ||
|
|
7cdc92c142 | ||
|
|
a7ccf302f2 | ||
|
|
f4b41efc75 | ||
|
|
ac18d3df96 | ||
|
|
daff47d912 | ||
|
|
27d04cbae2 | ||
|
|
8eef7718ee | ||
|
|
fb4259b696 | ||
|
|
eb378ea45a | ||
|
|
02992271a1 | ||
|
|
72b11c2717 | ||
|
|
a55f28c006 | ||
|
|
9f37962d22 | ||
|
|
8d001122e2 | ||
|
|
960aa2231c | ||
|
|
e55a133f00 | ||
|
|
4075c92e53 | ||
|
|
743e5509a2 | ||
|
|
1c93611a16 | ||
|
|
df8a320fbe | ||
|
|
8e8464d727 | ||
|
|
356d1dfe4d | ||
|
|
d185de0f3d | ||
|
|
644a6cdcc2 | ||
|
|
85f5fb2d87 | ||
|
|
8674c14754 | ||
|
|
6c2fc1b4c2 | ||
|
|
5d94980e7c | ||
|
|
9bed71a99f | ||
|
|
6faa2b65e2 | ||
|
|
98812b103e | ||
|
|
deb655de36 | ||
|
|
8d1c18cb4a | ||
|
|
88824126f7 | ||
|
|
68a9ecf995 | ||
|
|
57404b2dcd | ||
|
|
29705c63c9 | ||
|
|
5a854d9715 | ||
|
|
eb1cbeae3f | ||
|
|
b6246cfee6 | ||
|
|
0619000f9a | ||
|
|
01361781c8 | ||
|
|
3c03a308b3 | ||
|
|
7895e48420 | ||
|
|
ba15713b99 | ||
|
|
bd98fa3aed | ||
|
|
fce75a9475 | ||
|
|
7616d5759f | ||
|
|
ea2c81a9c7 | ||
|
|
37cff9ff31 | ||
|
|
b8d3d6af9b | ||
|
|
fdf90a72cc | ||
|
|
ba0c05a774 | ||
|
|
3250ec14ac | ||
|
|
ce2f390361 | ||
|
|
71434232fe | ||
|
|
852629fa2e | ||
|
|
f10676d16d | ||
|
|
d43ea7df1d | ||
|
|
21712c6299 | ||
|
|
2fc47a38fa | ||
|
|
cbb4408668 | ||
|
|
a0df41b859 | ||
|
|
494c1b33b4 | ||
|
|
2034d91912 | ||
|
|
235ced0b78 | ||
|
|
3339b6a16f | ||
|
|
c08e3dfe4a | ||
|
|
894cf41d37 | ||
|
|
55aa869b1a | ||
|
|
42b18619c3 | ||
|
|
b0c57dfec5 | ||
|
|
bdbcf2a5f8 | ||
|
|
7807e68519 | ||
|
|
4cd81cb2e9 | ||
|
|
dc34a33346 | ||
|
|
2922854f96 | ||
|
|
29c85442ff | ||
|
|
048cbf51ca | ||
|
|
467dd2ea65 | ||
|
|
aef678be5c | ||
|
|
77f7567b29 | ||
|
|
c3c0685d3a | ||
|
|
c4c3f79c8c | ||
|
|
9cb54a34da | ||
|
|
519ae62760 | ||
|
|
6971da1abc | ||
|
|
5f3054d344 | ||
|
|
5b586a7402 | ||
|
|
f2ff66ec1d | ||
|
|
92b9bab76a | ||
|
|
4609985b79 | ||
|
|
6cf14fc7dd | ||
|
|
053363f781 | ||
|
|
e319bd61f1 | ||
|
|
baad83172f | ||
|
|
4b288a59b9 | ||
|
|
a2ada0b67e | ||
|
|
97fea6a93a | ||
|
|
145a9fb0b1 | ||
|
|
202d5e41a1 | ||
|
|
a64bead5e6 | ||
|
|
f9b84f8cb1 | ||
|
|
76e0c13f89 | ||
|
|
f9319c2a27 | ||
|
|
295c50a0ae | ||
|
|
942f5abbe4 | ||
|
|
965df40476 | ||
|
|
11f7f07009 | ||
|
|
76cd2afbd3 | ||
|
|
00d07cb7af | ||
|
|
3234c18718 | ||
|
|
d48285c450 | ||
|
|
98ea387254 | ||
|
|
fb80ff3b74 | ||
|
|
41e0cf8424 | ||
|
|
1bcd321477 | ||
|
|
b0482ee84b | ||
|
|
404f4041a9 | ||
|
|
f6d6375667 | ||
|
|
04acf4af49 | ||
|
|
df6957cfb6 | ||
|
|
d3ab1e1560 | ||
|
|
598a255e34 | ||
|
|
b4418fda55 | ||
|
|
3f26dde791 | ||
|
|
14d81411b1 | ||
|
|
4b667835f9 | ||
|
|
002f971882 | ||
|
|
99a8fcd73a | ||
|
|
3705da38b7 | ||
|
|
32afee62c5 | ||
|
|
a5ecb4bf7d | ||
|
|
1a424ebcd0 | ||
|
|
6a44331edd | ||
|
|
4e78f43649 | ||
|
|
ca7ac08808 | ||
|
|
3351450d88 | ||
|
|
fa82bdec79 | ||
|
|
0860a105ed | ||
|
|
b834307178 | ||
|
|
fafe24f1e4 | ||
|
|
6f1ec04ac8 | ||
|
|
263278d71d | ||
|
|
9ee5b044b4 | ||
|
|
21bfa14b55 | ||
|
|
0e2d717aa6 | ||
|
|
f5d2bd78b9 | ||
|
|
ef9f764fa0 | ||
|
|
3cfe1a6960 | ||
|
|
9387a48b5b | ||
|
|
3812150669 | ||
|
|
4ca100b0bf | ||
|
|
43dee54678 | ||
|
|
14786a94bf | ||
|
|
98a652f440 | ||
|
|
a004ed8064 | ||
|
|
37b0edde38 | ||
|
|
fd9f19562f | ||
|
|
acb7b42ded | ||
|
|
f1e4a523ce | ||
|
|
676ea312a3 | ||
|
|
6acd930455 | ||
|
|
340db0c644 | ||
|
|
f3d66b6abb | ||
|
|
6b8ae2e864 | ||
|
|
664cb2f2f9 | ||
|
|
486292434e | ||
|
|
e5f186ace1 | ||
|
|
0c637d4c8e | ||
|
|
0943023a19 | ||
|
|
941d6d2884 | ||
|
|
169af4ccce | ||
|
|
6f1d0f8c02 | ||
|
|
dd970b9a91 | ||
|
|
b997cb650e | ||
|
|
dd3ccf1d2f | ||
|
|
52a7977461 | ||
|
|
70713c0719 | ||
|
|
b4d6e1ef04 | ||
|
|
5295701541 | ||
|
|
43b9cea801 | ||
|
|
926d48af81 | ||
|
|
962c48ca36 | ||
|
|
03fc569f87 | ||
|
|
e5b712ff39 | ||
|
|
c7f7d0409e | ||
|
|
e4ec7ea5bb | ||
|
|
4bf734778b | ||
|
|
461325c8ca | ||
|
|
efa2ec6aac | ||
|
|
eb8be40f77 | ||
|
|
ae7e3c9c89 | ||
|
|
4d68cc9fce | ||
|
|
0226e2739a | ||
|
|
caa163a879 | ||
|
|
0e29010897 | ||
|
|
e9a8b99f4f | ||
|
|
27c637ba66 | ||
|
|
305db3395c | ||
|
|
3da37f0a3e | ||
|
|
c30c9192f4 | ||
|
|
ceb3df513d | ||
|
|
83372c4209 | ||
|
|
20d5e014b7 | ||
|
|
1c9a7eb158 | ||
|
|
31555cbf2f | ||
|
|
4a1d4644ed | ||
|
|
9182d214af | ||
|
|
45e3383031 | ||
|
|
fc91b69b55 | ||
|
|
13b6614dc2 | ||
|
|
fec5e4d73f | ||
|
|
585add29fc | ||
|
|
1e48e59cb7 | ||
|
|
41911af09a | ||
|
|
37b95e9559 | ||
|
|
a7901745e8 | ||
|
|
da9f085a50 | ||
|
|
192c2a8bd6 | ||
|
|
e6c00e9b68 | ||
|
|
1faa5aa5d8 | ||
|
|
7e7191536a | ||
|
|
16ff1975ff | ||
|
|
b32c86863e | ||
|
|
d9b361f765 | ||
|
|
5b2810e6c5 | ||
|
|
15a5b347e8 | ||
|
|
477ffa825b | ||
|
|
84363b1513 | ||
|
|
01bf6f049b | ||
|
|
a8d93de000 | ||
|
|
2da5de3743 | ||
|
|
bf6bac7be6 | ||
|
|
394d2e4a08 | ||
|
|
0dd447e270 | ||
|
|
92c913e3eb | ||
|
|
5dea461963 | ||
|
|
f768081849 | ||
|
|
668418c48a | ||
|
|
2bf387a57c | ||
|
|
42a4726985 | ||
|
|
5c4b5359e0 | ||
|
|
8e3f56a3a2 | ||
|
|
91a837477a | ||
|
|
a2dfc54068 | ||
|
|
7ded2fe13a | ||
|
|
b6f1b27a81 | ||
|
|
621fd614ea | ||
|
|
be3e7c892c | ||
|
|
1f640b7644 | ||
|
|
987b505d32 | ||
|
|
4b2f23f093 | ||
|
|
1d52d0bafc | ||
|
|
e73db14976 | ||
|
|
fe8a677541 | ||
|
|
926cba8197 | ||
|
|
ee6e5db0a6 | ||
|
|
0c62d8dd07 | ||
|
|
d6e352b3b4 | ||
|
|
59e46be262 | ||
|
|
746c048550 | ||
|
|
a92c584997 | ||
|
|
7f4c6eb4ac | ||
|
|
fbeb048c44 | ||
|
|
9f748a8119 | ||
|
|
b9fd590095 | ||
|
|
430e210b3c | ||
|
|
706d54db76 | ||
|
|
9ac276767d | ||
|
|
29144348b3 | ||
|
|
2f91b11672 | ||
|
|
caf0ef88ac | ||
|
|
c8154db108 | ||
|
|
7ce6b5592a | ||
|
|
e1bc4fdf36 | ||
|
|
fd7f5f719f | ||
|
|
6678ca6c93 | ||
|
|
180e03e249 | ||
|
|
357f15eb01 | ||
|
|
a08704b60f | ||
|
|
03ba81a9c5 | ||
|
|
2933962df8 | ||
|
|
4f248c4dc7 | ||
|
|
14096f24ba | ||
|
|
c0b75accf4 | ||
|
|
cb1b7d5da7 | ||
|
|
c8072171f0 | ||
|
|
485f6d4cef | ||
|
|
2b85097e30 | ||
|
|
0904789291 | ||
|
|
fda69793a5 | ||
|
|
3c22aaf99d | ||
|
|
151a5d480f | ||
|
|
88d136626d | ||
|
|
170f5bba79 | ||
|
|
c4cbb0cd59 | ||
|
|
0fa04070f1 | ||
|
|
f8bea241a2 | ||
|
|
bb6b2e4b29 | ||
|
|
557251a679 | ||
|
|
696783b0fe | ||
|
|
6eb29d2cc9 | ||
|
|
4b4cafcda8 | ||
|
|
ed2ed8d968 | ||
|
|
fbb387bd9f | ||
|
|
0db2db482f | ||
|
|
af2fe727fc | ||
|
|
a7387dcf22 | ||
|
|
5ce44fb161 | ||
|
|
9086b9c3ca | ||
|
|
4837c5387a | ||
|
|
5d73216238 | ||
|
|
5053091e44 | ||
|
|
6319ed0473 | ||
|
|
c67c109af6 | ||
|
|
b3cdb1464b | ||
|
|
3c01c3f0ba | ||
|
|
07d541be20 | ||
|
|
4a0dc59585 | ||
|
|
b1dd8f52e8 | ||
|
|
6907fe230f | ||
|
|
f2e4071b90 | ||
|
|
452f5e5f83 | ||
|
|
c94b9f54ce | ||
|
|
e993f93cf4 | ||
|
|
e9fac38c1b | ||
|
|
31a49b8ff9 | ||
|
|
7831cdf10c | ||
|
|
c0f176f0af | ||
|
|
dc96a557eb | ||
|
|
7a8c915e62 | ||
|
|
dec42cc72b | ||
|
|
92c9d1d2ce | ||
|
|
de017fcd27 | ||
|
|
1229f62abd | ||
|
|
512852b817 | ||
|
|
5a087000a9 | ||
|
|
6b56d6649e | ||
|
|
5081aab497 | ||
|
|
bbb4afde53 | ||
|
|
d28495c3eb | ||
|
|
1785e0c4a3 | ||
|
|
1e93e75aac | ||
|
|
a3ed7eeee2 | ||
|
|
c3582637df | ||
|
|
3b277b0eb0 | ||
|
|
5e0991681f | ||
|
|
354fbb7cdd | ||
|
|
a166d06096 | ||
|
|
b8a6e07095 | ||
|
|
a8fba6e7b5 | ||
|
|
17a8c10f8c | ||
|
|
7ccd29faac | ||
|
|
d432e48cce | ||
|
|
19091319cc | ||
|
|
d29e12a92c | ||
|
|
5db03b0441 | ||
|
|
f8c7e2bf6d | ||
|
|
a7fdc6a88f | ||
|
|
4aaf5b0779 | ||
|
|
6150e4c736 | ||
|
|
9a3b4b3ecb | ||
|
|
cbaeb4d5f2 | ||
|
|
592c306aa0 | ||
|
|
136e6bddf4 | ||
|
|
0e8bef0541 | ||
|
|
9d8c52303e | ||
|
|
e6ae7df546 | ||
|
|
5b57a759be | ||
|
|
cc96eeae32 | ||
|
|
484fef1228 | ||
|
|
ba4ca11c83 | ||
|
|
9372902348 | ||
|
|
0cc9420570 | ||
|
|
18fa48d283 | ||
|
|
9034fedbd0 | ||
|
|
ec3b6ec5fa | ||
|
|
8cc2a4174e | ||
|
|
8a0014928d | ||
|
|
228ca7f9c0 | ||
|
|
c0fa7efb27 | ||
|
|
3553683bb1 | ||
|
|
ccb58e0a6c | ||
|
|
93253e2188 | ||
|
|
e34bcc9bbd | ||
|
|
72169e3a4d | ||
|
|
41c499840f | ||
|
|
f5cef170f0 | ||
|
|
d7922a7c9b | ||
|
|
23fc77e8e1 | ||
|
|
51f3eda09a | ||
|
|
6ec08a5227 | ||
|
|
4855f694cb | ||
|
|
eaef37a831 | ||
|
|
b182ff36bb | ||
|
|
c4e543449c | ||
|
|
c76d9d4461 | ||
|
|
dfd184724b | ||
|
|
fef254031e | ||
|
|
89c4e59bf1 | ||
|
|
2e9acd3276 | ||
|
|
5cab59c93f | ||
|
|
ebfb5878a1 | ||
|
|
de6b11aa22 | ||
|
|
9e7e7159e8 | ||
|
|
00c909271b | ||
|
|
7401a0cbec | ||
|
|
a9327d1774 | ||
|
|
9e99ef1348 | ||
|
|
5b4b9fdb01 | ||
|
|
d2998c4908 | ||
|
|
4ab968d563 | ||
|
|
9b26eea754 | ||
|
|
a6bd717971 | ||
|
|
f2914adb65 | ||
|
|
aa5a426aac | ||
|
|
fef8144187 | ||
|
|
d8a429d3b3 | ||
|
|
56e53b75a5 | ||
|
|
f89b6f5feb | ||
|
|
ec513e8893 | ||
|
|
35d6792d2e | ||
|
|
74387aae2d | ||
|
|
959043962d | ||
|
|
4efb71bafb | ||
|
|
6fd0bc0445 | ||
|
|
176a2eb392 | ||
|
|
1a85deb36e | ||
|
|
5b409ff3de | ||
|
|
a9e13d3a92 | ||
|
|
0698d8e3b1 | ||
|
|
8e4c496b54 | ||
|
|
27054b9722 | ||
|
|
bcad2c4998 | ||
|
|
aae2bd4884 | ||
|
|
006ef6f672 | ||
|
|
7be1a61347 | ||
|
|
1ef48f6cd6 | ||
|
|
a9a061a4bb | ||
|
|
14ed8b7af7 | ||
|
|
d17b8fa720 | ||
|
|
68980a69b5 | ||
|
|
636f14c450 | ||
|
|
b066bc37b3 | ||
|
|
9ac43fecf8 | ||
|
|
d6ff14167d | ||
|
|
5837a765f1 | ||
|
|
1bfb76a4b3 | ||
|
|
2a78a602e2 | ||
|
|
884b0e4226 | ||
|
|
4e819eb5d9 | ||
|
|
e3a50cc014 | ||
|
|
25ab8c9234 | ||
|
|
901e680fa4 | ||
|
|
82768fff59 | ||
|
|
87e3297904 | ||
|
|
81a4297eb1 | ||
|
|
17f5b52931 | ||
|
|
2250adf854 | ||
|
|
5cd46b3926 | ||
|
|
6e2b10b788 | ||
|
|
5e301ccaaf | ||
|
|
206a38efab | ||
|
|
cdf844be52 | ||
|
|
70cc28c191 | ||
|
|
35282fba6c | ||
|
|
e43f8e594d | ||
|
|
21988fab76 | ||
|
|
2f3823abe2 | ||
|
|
2c545e7b7f | ||
|
|
22f2200778 | ||
|
|
2f63253ec0 | ||
|
|
be7e8134f9 | ||
|
|
b85408e3e5 | ||
|
|
4828451f9e | ||
|
|
b3b50e1353 | ||
|
|
95e8bf2f55 | ||
|
|
cde7669c0b | ||
|
|
ff4a33c51c | ||
|
|
06cf6f84aa | ||
|
|
556f6f134f | ||
|
|
b1ab7ef118 | ||
|
|
e5fd108a9c | ||
|
|
5a67bf2417 | ||
|
|
cb020c1bbd | ||
|
|
bf75b29e33 | ||
|
|
d730fd9cab | ||
|
|
a862e5be7c | ||
|
|
ebca124c86 | ||
|
|
3b7803a81b | ||
|
|
b7b9d92148 | ||
|
|
44575fb19e | ||
|
|
f181a4b9cd | ||
|
|
77e5d8b0c2 | ||
|
|
edd9feb8f8 | ||
|
|
81d6a06dbe | ||
|
|
8afbc67bf7 | ||
|
|
a27132f907 | ||
|
|
183be05d82 | ||
|
|
bccf789714 | ||
|
|
55944dddb3 | ||
|
|
f67932cc56 | ||
|
|
6d633fac6a | ||
|
|
86fc5c51c8 | ||
|
|
156e9f07ad | ||
|
|
1ba4722fc7 | ||
|
|
54c9857219 | ||
|
|
ea56c7d0d2 | ||
|
|
0cbe43df97 | ||
|
|
1f941d883a | ||
|
|
f5b3e423fb | ||
|
|
6c7f81ca55 | ||
|
|
3911b5ed82 | ||
|
|
f38f3ab69c | ||
|
|
846db6f063 | ||
|
|
ff068a05b0 | ||
|
|
051b7dd182 | ||
|
|
11870aeed6 | ||
|
|
9bcff82d9c | ||
|
|
309efe8cd8 | ||
|
|
bf54789f0f | ||
|
|
01e527abdb | ||
|
|
db6b558c75 | ||
|
|
9a792eb144 | ||
|
|
44e99664a3 | ||
|
|
9f3dd37bf0 | ||
|
|
f5936d9cb7 | ||
|
|
27e69ef022 | ||
|
|
6262aab6bd | ||
|
|
4781bc8eb7 | ||
|
|
b233c4b638 | ||
|
|
0a0cc807dc | ||
|
|
feeeb63e52 | ||
|
|
5c620d6268 | ||
|
|
a469000d7a | ||
|
|
0e15ac78b2 | ||
|
|
d9e195ccd0 | ||
|
|
cf52997279 | ||
|
|
88318a7151 | ||
|
|
91f522b666 | ||
|
|
1895f8815e | ||
|
|
7be5f52be4 | ||
|
|
0cfb2e4e06 | ||
|
|
5ccf753af3 | ||
|
|
bfcf3cac91 | ||
|
|
bc3d7bc278 | ||
|
|
7cf767f344 | ||
|
|
7aed9a2c89 | ||
|
|
454196a462 | ||
|
|
1597ba7128 | ||
|
|
480523ff27 | ||
|
|
7ec7ab8682 | ||
|
|
ba2d011d48 | ||
|
|
504e6cd1cc | ||
|
|
b8f3700fe4 | ||
|
|
b2cff862bb | ||
|
|
dc348f8500 | ||
|
|
8c40293fed | ||
|
|
48deaf3aca | ||
|
|
6932643788 | ||
|
|
7f972e3d68 | ||
|
|
edb0880999 | ||
|
|
45f0f5cd6c | ||
|
|
e468ac1933 | ||
|
|
55b6b40acf | ||
|
|
5f1190f72e | ||
|
|
b0fbd6507d | ||
|
|
598a664d30 | ||
|
|
211f0a667d | ||
|
|
28fb788778 | ||
|
|
628830fbf5 | ||
|
|
7d235d0077 | ||
|
|
861b0b6cef | ||
|
|
9986c57727 | ||
|
|
f1c9e2331c | ||
|
|
7c1ddc6ab1 | ||
|
|
44ad78761b | ||
|
|
bd6925f2f1 | ||
|
|
3838d74cb8 | ||
|
|
eaad8beb7b | ||
|
|
14acdfdbc3 | ||
|
|
a5fe7a5b40 | ||
|
|
61df3c55b5 | ||
|
|
eb0059c1a3 | ||
|
|
4ca5038ae9 | ||
|
|
121403231a | ||
|
|
b945338a8d | ||
|
|
ae5ea542a0 | ||
|
|
fe95dc8201 | ||
|
|
1eefb4e610 | ||
|
|
8660d8d990 | ||
|
|
37033fe48d | ||
|
|
30665ad8c6 | ||
|
|
f9e4b8db76 | ||
|
|
c486a210e4 | ||
|
|
0cd01959a0 | ||
|
|
d5ac9f7920 | ||
|
|
6b2dd112a6 | ||
|
|
01abfab133 | ||
|
|
e2a56872dc | ||
|
|
6f22a9c4bc | ||
|
|
a2426de70c | ||
|
|
ed7bbf54a7 | ||
|
|
69394377d0 | ||
|
|
8f20487a15 | ||
|
|
fae24db2df | ||
|
|
f8fb791d8f | ||
|
|
f320d9e1e5 | ||
|
|
18bd34fad2 | ||
|
|
cf72d0b36a | ||
|
|
c3722b0a6c | ||
|
|
3af701e803 | ||
|
|
bc4b2e89db | ||
|
|
3cbb589d2c | ||
|
|
63ef93a9f9 | ||
|
|
8c943d2c01 | ||
|
|
806b77acce | ||
|
|
3df0414621 | ||
|
|
04f70b0499 | ||
|
|
0b20087e61 | ||
|
|
5c82600972 | ||
|
|
45edd86cb8 | ||
|
|
8f6b3fa00d | ||
|
|
a16bcda7da | ||
|
|
259b29f6e3 | ||
|
|
477868c601 | ||
|
|
92de963c0c | ||
|
|
a7c56d9e77 | ||
|
|
4fe64eeb44 | ||
|
|
fc0d020a04 | ||
|
|
617e2c9885 | ||
|
|
bb1130490b | ||
|
|
ca18a323e3 | ||
|
|
0770c6e4a1 | ||
|
|
e1dbfe8f6a | ||
|
|
a2854069ac | ||
|
|
9f0efc2bda | ||
|
|
ec5798f264 | ||
|
|
ded20441fa | ||
|
|
47064dbcec | ||
|
|
2cda7ecb04 | ||
|
|
b372892a20 | ||
|
|
fabf62059e | ||
|
|
c524c68809 | ||
|
|
876fd425e4 | ||
|
|
72ed1293f6 | ||
|
|
fa973a9231 | ||
|
|
e245a8f124 | ||
|
|
aa71fa7cb8 | ||
|
|
da5aab3ee6 | ||
|
|
e0317d1fe1 | ||
|
|
3557a0ebc1 | ||
|
|
ddd0cc4538 | ||
|
|
0212ec51cc | ||
|
|
7109e30d93 | ||
|
|
6990819d5c | ||
|
|
b4ff754934 | ||
|
|
6ece644a7b | ||
|
|
f826b4d0bc | ||
|
|
aa1f82d46f | ||
|
|
f7c6d67428 | ||
|
|
cd30d6df31 | ||
|
|
7463792de7 | ||
|
|
80f49c47c6 | ||
|
|
4baead3490 | ||
|
|
2d0c69344a | ||
|
|
a94ea2b332 | ||
|
|
4ee50a6582 | ||
|
|
b21021bd6b | ||
|
|
7238fe0b6b | ||
|
|
e1b5c176c3 | ||
|
|
3aabc089d8 | ||
|
|
db5177027f | ||
|
|
0e2da1b983 | ||
|
|
1583006018 | ||
|
|
6b49c2842c | ||
|
|
9c4a5dc818 | ||
|
|
8256658ac2 | ||
|
|
4b11ff495d | ||
|
|
461dc925af | ||
|
|
1233b1d11c | ||
|
|
6dbc0b3891 | ||
|
|
db3cef9bb6 | ||
|
|
3de009727e | ||
|
|
8d35515497 | ||
|
|
4519dd5eb8 | ||
|
|
925e6847f3 | ||
|
|
9462cbc7e0 | ||
|
|
8ec4271419 | ||
|
|
173fd250cb | ||
|
|
89bdc1e496 | ||
|
|
48736d3f4a | ||
|
|
f8df60f06b | ||
|
|
9bd0ed03a5 | ||
|
|
cb1e4bcdb7 | ||
|
|
af8e6a63b9 | ||
|
|
8c8cd709b5 | ||
|
|
18ae566d34 | ||
|
|
9cfa44d434 | ||
|
|
23393d9157 | ||
|
|
b676e00f0b | ||
|
|
790200e519 | ||
|
|
ccde99e695 | ||
|
|
a80f8082cc | ||
|
|
4b194627bb | ||
|
|
d983c66597 | ||
|
|
30f6b57941 | ||
|
|
107979c459 | ||
|
|
f05f09d741 | ||
|
|
bc989f2fb0 | ||
|
|
9b4494a24f | ||
|
|
d3fafa7b9a | ||
|
|
ce1e85e0a3 | ||
|
|
560df5cade | ||
|
|
9f6e361e6e | ||
|
|
00be4a856f | ||
|
|
606aec4ec1 | ||
|
|
7f0f211333 | ||
|
|
42f761d44d | ||
|
|
577b5b108f | ||
|
|
4d39b32cf6 | ||
|
|
8279ed31d1 | ||
|
|
0185d0c730 | ||
|
|
4ac1674cc0 | ||
|
|
1c222a36ee | ||
|
|
16e05e0320 | ||
|
|
8ea64e7aba | ||
|
|
c22140103f | ||
|
|
8bd6e40ac8 | ||
|
|
2ed25c6991 | ||
|
|
d8991ec016 | ||
|
|
dc9ca1e63f | ||
|
|
7bb3203dfb | ||
|
|
8ebe9548f7 | ||
|
|
f90f20d3a8 | ||
|
|
1437e3b323 | ||
|
|
d44171de61 | ||
|
|
62a9e413fb | ||
|
|
c12c48dea6 | ||
|
|
7dd81525e4 | ||
|
|
ca36038bbd | ||
|
|
ca2f674696 | ||
|
|
8acf9b817f | ||
|
|
2dc1fbde96 | ||
|
|
919651a2b3 | ||
|
|
19b55a574f | ||
|
|
a6ab7de475 | ||
|
|
2ff229e9d9 | ||
|
|
18def7c624 | ||
|
|
59a731df88 | ||
|
|
6186356496 | ||
|
|
045ee091a7 | ||
|
|
a69d985139 | ||
|
|
c13641dd1d | ||
|
|
f0fc5d6598 | ||
|
|
2348039c16 | ||
|
|
7f8d34e8a0 | ||
|
|
205036b658 | ||
|
|
9519896d04 | ||
|
|
aa83b63617 | ||
|
|
3e89a372b3 | ||
|
|
d464695b66 | ||
|
|
657532f7e5 | ||
|
|
3f69308603 | ||
|
|
486160fc57 | ||
|
|
3939e0760f | ||
|
|
16624a9596 | ||
|
|
58e075e6ff | ||
|
|
ef081714d7 | ||
|
|
96802efa45 | ||
|
|
0a95f3198b | ||
|
|
cb44758036 | ||
|
|
1682c321d3 | ||
|
|
eeba8a5de7 | ||
|
|
2ea0f58e03 | ||
|
|
05235473c1 | ||
|
|
f0c083f4e6 | ||
|
|
6997c9a5c0 | ||
|
|
eebfa23509 | ||
|
|
59fe8a021f | ||
|
|
16672d9b89 | ||
|
|
1d39fd8685 | ||
|
|
ae41bdb7f8 | ||
|
|
4147f1056a | ||
|
|
7c5d08b723 | ||
|
|
a3b5a226ac | ||
|
|
f56cee9ec1 | ||
|
|
3b977535f1 | ||
|
|
ce8d98b77d | ||
|
|
2858d0b0a4 | ||
|
|
1f982566e0 | ||
|
|
779ec5b2fe | ||
|
|
8499921d67 | ||
|
|
1e49bad1a6 | ||
|
|
1d3a61386d | ||
|
|
25ef2ca220 | ||
|
|
b953385bc5 | ||
|
|
4fdedd0a7b | ||
|
|
f4bc43e7a5 | ||
|
|
596c75eeca | ||
|
|
67a493ee84 | ||
|
|
f9c7d9419e | ||
|
|
1a1a006283 | ||
|
|
fd85ce0923 | ||
|
|
5ff9069ff2 | ||
|
|
4ad7ff7971 | ||
|
|
a9f98763c4 | ||
|
|
3b637fad78 | ||
|
|
f202797964 | ||
|
|
242d780048 | ||
|
|
bf23364097 | ||
|
|
7eaac7a20b | ||
|
|
45448e6f53 | ||
|
|
08ee458a27 | ||
|
|
3f97541956 | ||
|
|
e2c603338e | ||
|
|
a363623df9 | ||
|
|
b871573dc3 | ||
|
|
ad33c1ca3c | ||
|
|
810cb284b6 | ||
|
|
d0ffb25594 | ||
|
|
2b6796d1d1 | ||
|
|
52093f3dd3 | ||
|
|
2a5c1ac92c | ||
|
|
6e0222f5e2 | ||
|
|
4bebf79266 | ||
|
|
b6dadc142b | ||
|
|
1cbc49251b | ||
|
|
d2d5b5863b | ||
|
|
65f9203597 | ||
|
|
4c1926e395 | ||
|
|
516d937149 | ||
|
|
7af17c3c65 | ||
|
|
33b85207f5 | ||
|
|
218119e10e | ||
|
|
4485d3d5a9 | ||
|
|
fcf62a31e1 | ||
|
|
ebdc83809c | ||
|
|
61a3c30a45 | ||
|
|
0e4cab7221 | ||
|
|
865c90a85a | ||
|
|
c9b06a4fa8 | ||
|
|
0e75143a42 | ||
|
|
ce333c5793 | ||
|
|
6b4045db45 | ||
|
|
3fba704c77 | ||
|
|
0712a80ea0 | ||
|
|
8969c44b3f | ||
|
|
f7a3c0e6c6 | ||
|
|
b1852a1de6 | ||
|
|
5645fa0168 | ||
|
|
c824b2e0b4 | ||
|
|
1c0d2b2f95 | ||
|
|
10b8ab297a | ||
|
|
e8b0e475d7 | ||
|
|
7fc4a6425b | ||
|
|
a8a3c48e6c | ||
|
|
9fca69302b | ||
|
|
ba6811224e | ||
|
|
ca4a682794 | ||
|
|
b9ddcfc3d7 | ||
|
|
b20cb1c0a0 | ||
|
|
1d9813691c | ||
|
|
08f8954e03 | ||
|
|
610f04ab87 | ||
|
|
793cac09cb | ||
|
|
d0d07604e5 | ||
|
|
fcf6d087a7 | ||
|
|
35587ccb85 | ||
|
|
9df5b6cc33 | ||
|
|
ffeedf576d | ||
|
|
151ce216ab | ||
|
|
20835f9858 | ||
|
|
63a61f2fb5 | ||
|
|
c553248cf4 | ||
|
|
cdd1dc68da | ||
|
|
37af3c1498 | ||
|
|
1bc3847345 | ||
|
|
f14d8ab5f6 | ||
|
|
bb63b98f39 | ||
|
|
f3f7e2d3c1 | ||
|
|
89121cfc57 | ||
|
|
d8a41a5ee1 | ||
|
|
f8ca9355d2 | ||
|
|
d4bceb1922 | ||
|
|
876d85ac4e | ||
|
|
ab34930beb | ||
|
|
35f7450ab2 | ||
|
|
2917ff6701 | ||
|
|
d1656b25c9 | ||
|
|
e6a20866b6 | ||
|
|
9de065d31a | ||
|
|
37d27e07e9 | ||
|
|
01853768db | ||
|
|
9d3787dfc2 | ||
|
|
e9f145056d | ||
|
|
ea17943bff | ||
|
|
180c32ef50 | ||
|
|
17bb844360 | ||
|
|
3d0a161176 | ||
|
|
1148867d3c | ||
|
|
c83d01e977 | ||
|
|
7c42d6f857 | ||
|
|
ac1c6bc74b | ||
|
|
12f96bb95c | ||
|
|
fa063a05f7 | ||
|
|
51d10d3234 | ||
|
|
2d2db15813 | ||
|
|
006c782819 | ||
|
|
37e36fb886 | ||
|
|
0e026a8b3b | ||
|
|
f37daa5ca6 | ||
|
|
dafcf7049b | ||
|
|
207da3fcd9 | ||
|
|
a3fbe5d747 | ||
|
|
c1717c71bd | ||
|
|
bcd111f585 | ||
|
|
d6f1113201 | ||
|
|
e812d2a074 | ||
|
|
a537306307 | ||
|
|
206889bdc5 | ||
|
|
58c7b5c818 | ||
|
|
eace561f73 | ||
|
|
e2032cdc74 | ||
|
|
34bc8e3a3c | ||
|
|
1304611ab7 | ||
|
|
7a0ce4b5d6 | ||
|
|
835df33e11 | ||
|
|
fb80c3606b | ||
|
|
f0c80693bb | ||
|
|
6997c2f2b9 | ||
|
|
cb1057cd5e | ||
|
|
eb1e2de917 | ||
|
|
4b9b66e7d0 | ||
|
|
c1e87ace78 | ||
|
|
ba9eb9c023 | ||
|
|
3084d4ad54 | ||
|
|
fcb13c19a1 | ||
|
|
d6b81d0363 | ||
|
|
fdd1135a66 | ||
|
|
f9ce439e56 | ||
|
|
9608d1e736 | ||
|
|
776d7fbbd9 | ||
|
|
7c69c24362 | ||
|
|
d205d48166 | ||
|
|
dd32aec462 | ||
|
|
c0327fe733 | ||
|
|
6f4c40f450 | ||
|
|
022ee6cd95 | ||
|
|
085e04c9ba | ||
|
|
19f58acb79 | ||
|
|
90dd60b942 | ||
|
|
755bfeaa5b | ||
|
|
82ee2f6b0a | ||
|
|
500d03f293 | ||
|
|
ee99abe6ff | ||
|
|
0563006c55 | ||
|
|
31db6fa4fb | ||
|
|
043b543cfa | ||
|
|
7b52599da7 | ||
|
|
4dc8e5619c | ||
|
|
21ff752322 | ||
|
|
0f687d6e95 | ||
|
|
22e23efbdc | ||
|
|
38935937ae | ||
|
|
a3685e2e83 | ||
|
|
3a5e391191 | ||
|
|
09a9dd53fd | ||
|
|
5e064249be | ||
|
|
67555512e7 | ||
|
|
591df6439c | ||
|
|
7dfb7dfe24 | ||
|
|
8e56f137b6 | ||
|
|
3b61c73c17 | ||
|
|
44dac98b37 | ||
|
|
1a7f98379a | ||
|
|
4109ef0612 | ||
|
|
93a9bf6c5b | ||
|
|
0b7b35cdcc | ||
|
|
350ef86dd6 | ||
|
|
2d69ae2e42 | ||
|
|
e95367f4b2 | ||
|
|
3101911aa2 | ||
|
|
ac73087f93 | ||
|
|
d375a3bbbb | ||
|
|
c46ca1d4c2 | ||
|
|
2a1cca8ebb | ||
|
|
d1fdc989b6 | ||
|
|
672215f753 | ||
|
|
4160175fcf | ||
|
|
8f8ba55fc9 | ||
|
|
1dbb4aa837 | ||
|
|
c183c4f17d | ||
|
|
fa6d14d89a | ||
|
|
65b92b9da3 | ||
|
|
a7056c4601 | ||
|
|
1dce0f7859 | ||
|
|
bdffbfab67 | ||
|
|
98b21d0fdf | ||
|
|
cccea70db1 | ||
|
|
d2bcd0bc9f | ||
|
|
08653fd3b6 | ||
|
|
75d0671d9b | ||
|
|
51ec3c32a9 | ||
|
|
ec0032c5ab | ||
|
|
2723f3662c | ||
|
|
539b050b97 | ||
|
|
a0b9623a9f | ||
|
|
6b263418a0 | ||
|
|
92989ce9fd | ||
|
|
173925b57a | ||
|
|
43735722bf | ||
|
|
d89e7aebec | ||
|
|
4677d789f2 | ||
|
|
2fb445746e | ||
|
|
505dfef48c | ||
|
|
19a9a8ef83 | ||
|
|
119730bada | ||
|
|
c46748524a | ||
|
|
29f833db41 | ||
|
|
1232856b21 | ||
|
|
770ae6ebd0 | ||
|
|
8c9ced0bda | ||
|
|
3b3dd3df99 | ||
|
|
0817e6233d | ||
|
|
aa4f428194 | ||
|
|
73717dec73 | ||
|
|
57e2ef3bab | ||
|
|
a5d0b8db8e | ||
|
|
3faec79371 | ||
|
|
c3e0520aec | ||
|
|
76db0b6fb4 | ||
|
|
40a8473ce0 | ||
|
|
21c1d104b8 | ||
|
|
0dda861863 | ||
|
|
b21f2f7166 | ||
|
|
e533170160 | ||
|
|
8236874779 | ||
|
|
4cc1dc2d1b | ||
|
|
18424bea7c | ||
|
|
0cc6251c0d | ||
|
|
63d87be789 | ||
|
|
7e3b898383 | ||
|
|
217fa62004 | ||
|
|
e667fb8708 | ||
|
|
2fef6f51b5 | ||
|
|
81bba8595a | ||
|
|
96aefc3938 | ||
|
|
5bb0493f02 | ||
|
|
e8fa6b8b07 | ||
|
|
ec15178ba7 | ||
|
|
1d469a40d5 | ||
|
|
4df30a56a3 | ||
|
|
6bc1e407d5 | ||
|
|
48442330c1 | ||
|
|
3623a88b16 | ||
|
|
ffca19edab | ||
|
|
52a8a9de6f | ||
|
|
b9e303196f | ||
|
|
da3a7e12bd | ||
|
|
21013bde98 | ||
|
|
ae6d83c675 | ||
|
|
f932e24573 | ||
|
|
a588ec9d18 | ||
|
|
bc23211f23 | ||
|
|
78ebf39624 | ||
|
|
bbc2ab5f17 | ||
|
|
2ffe1e9112 | ||
|
|
1036733fcb | ||
|
|
ebd5555955 | ||
|
|
83199cf3aa | ||
|
|
c724be743d | ||
|
|
42ba65e21b | ||
|
|
3405c1c45a | ||
|
|
5cb6608e17 | ||
|
|
aa891ad3fa | ||
|
|
158bda52a8 | ||
|
|
57e5ea87d8 | ||
|
|
74486f65cf | ||
|
|
27fcb63601 | ||
|
|
8d83d6be2f | ||
|
|
d31e67e598 | ||
|
|
629d3c1fa8 | ||
|
|
193d6efa67 | ||
|
|
c70dbd219c | ||
|
|
da289073e2 | ||
|
|
5aad22f254 | ||
|
|
815c8f97d0 | ||
|
|
7123fc7e37 | ||
|
|
fee3d9c145 | ||
|
|
6808e6e1b4 | ||
|
|
12f25a308a | ||
|
|
7fe401faa8 | ||
|
|
182fb7c783 | ||
|
|
c06b53afef | ||
|
|
65a5b53b88 | ||
|
|
e8503e97e3 | ||
|
|
f9a914926e | ||
|
|
8d4d6c7e5e | ||
|
|
dbb681e8a6 | ||
|
|
f0d7b38a73 | ||
|
|
70da534bfb | ||
|
|
308ec05405 | ||
|
|
5fe5e8a304 | ||
|
|
b02789b560 | ||
|
|
7e98064e09 | ||
|
|
eaada5667e | ||
|
|
b83ca94d98 | ||
|
|
bd88c68208 | ||
|
|
6e0b754a66 | ||
|
|
94abf34466 | ||
|
|
91396c8885 | ||
|
|
cb3cfa054b | ||
|
|
ebf58d4b73 | ||
|
|
f704cddae8 | ||
|
|
f03d2f3940 | ||
|
|
087c6c0298 | ||
|
|
be49ba83b3 |
BIN
.github/hua_nobg_512.gif
vendored
Normal file
BIN
.github/hua_nobg_512.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 187 KiB |
55
.github/workflows/nightly.yml
vendored
Normal file
55
.github/workflows/nightly.yml
vendored
Normal 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/
|
||||
55
.github/workflows/prerelease.yml
vendored
55
.github/workflows/prerelease.yml
vendored
@@ -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.17
|
||||
|
||||
- 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
|
||||
9
.github/workflows/pull.yml
vendored
9
.github/workflows/pull.yml
vendored
@@ -6,12 +6,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@master
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.19
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@master
|
||||
@@ -28,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
|
||||
|
||||
|
||||
16
.github/workflows/push.yml
vendored
16
.github/workflows/push.yml
vendored
@@ -6,24 +6,28 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v2
|
||||
uses: actions/setup-go@master
|
||||
with:
|
||||
go-version: 1.17
|
||||
go-version: 1.19
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@master
|
||||
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@master
|
||||
with:
|
||||
version: latest
|
||||
args: --issues-exit-code=0
|
||||
skip-go-installation: true
|
||||
|
||||
- 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
|
||||
|
||||
58
.github/workflows/release.yml
vendored
58
.github/workflows/release.yml
vendored
@@ -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
|
||||
uses: actions/setup-go@master
|
||||
with:
|
||||
go-version: 1.17
|
||||
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
|
||||
- name: Run GoReleaser
|
||||
uses: goreleaser/goreleaser-action@master
|
||||
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
|
||||
version: latest
|
||||
args: release --rm-dist
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
BIN
.github/yaya.jpg
vendored
BIN
.github/yaya.jpg
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,10 +1,9 @@
|
||||
data/SetuTime/cache
|
||||
data/SetuTime/search
|
||||
data/manager
|
||||
data/acgimage
|
||||
data/hs
|
||||
plugins/*.so
|
||||
plugins/*.dll
|
||||
.idea/
|
||||
.DS_Store
|
||||
.vscode
|
||||
go-zero*
|
||||
nohup.out
|
||||
zerobot
|
||||
ZeroBot-Plugin*
|
||||
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "data"]
|
||||
path = data
|
||||
url = https://github.com/FloatTech/zbpdata
|
||||
@@ -1,19 +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
|
||||
|
||||
gofumpt:
|
||||
# Select the Go version to target. The default is `1.15`.
|
||||
lang-version: "1.17"
|
||||
|
||||
forbidigo:
|
||||
# Forbid the following identifiers
|
||||
forbid:
|
||||
@@ -22,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
|
||||
@@ -43,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.
|
||||
@@ -82,6 +57,9 @@ run:
|
||||
deadline: 5m
|
||||
issues-exit-code: 1
|
||||
tests: false
|
||||
skip-dirs:
|
||||
- order
|
||||
go: '1.19'
|
||||
|
||||
# output configuration options
|
||||
output:
|
||||
@@ -95,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
73
.goreleaser.yml
Normal 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
145
LICENSE
@@ -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/>.
|
||||
1
data
Submodule
1
data
Submodule
Submodule data added at 00088d0e74
@@ -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縺輔s縺ォ閨槭>縺ヲ縺ソ縺滂シ咼iana縺輔s縺ョ迥ャ縺ォ縺ェ縺」縺ヲ繧り憶縺<EFBFBD>〒縺吶°縺ィ.蜒輔↓縺ッ荳逕溽堪縺ォ縺ェ繧後↑縺<EFBFBD>%縺ィ縺ッ蛻<EFBFBD>°縺」縺ヲ縺<EFBFBD>k.縺ァ繧ゅ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>k.蠖シ螂ウ縺ョ螂ス縺阪↑迪ォ縺檎樟繧後◆繧峨蜒輔<EFBFBD>遨エ縺ォ謌サ繧九@縺九↑縺<EFBFBD>↑..縺ァ繧ゅd縺」縺ア繧雁スシ螂ウ縺悟・ス縺阪〒縺<EFBFBD>i繧後↑縺<EFBFBD>蜒輔′縺セ縺<EFBFBD>蛯阪↓縺<EFBFBD>k縺ィ縺阪$繧峨>縲繧ゅ≧縺。繧<EFBFBD>→縺ソ縺ヲ縺上l繧九<EFBFBD>縺九↑.Diana縺輔s縺後%繧後°繧画ッ主屓縺ョ繧ッ繝ェ繧ケ繝槭せ縺ソ繧薙↑縺ィ荳邱偵↓驕弱#縺吶〒險縺」縺溘縺ソ繧薙↑縺後←縺ョ貂。繧翫<EFBFBD>縺ソ繧薙↑縺九↑.蜒輔↓繧ゆクュ縺ォ蜈・繧後◆繧後>縺<EFBFBD>↑..迪ォ縺ッ縺セ縺<EFBFBD>縺セ縺<EFBFBD>Diana縺輔s繧呈悶′縺」縺ヲ縺<EFBFBD>k.蜒輔′蠖シ螂ウ縺ョ諢帙☆繧狗賢繧貞シ輔″莉倥¢繧九h.蟆代@縺ョ繝溘せ縺ァ迪ォ縺ョ蜿」縺ォ豁サ縺ャ縺薙→縺ッ繧上′縺」縺ヲ縺<EFBFBD>k.縺昴<EFBFBD>譎ゅ↓縺ェ繧九→縺溘<EFBFBD>繧泥iana縺輔s縺ッ蜒輔<EFBFBD>菴薙r縺。繧<EFBFBD>s縺ィ蛹<EFBFBD>∩霎シ繧薙〒縲邇<EFBFBD>未螟悶↓謐ィ縺ヲ繧九〒縺励g.縺昴l縺ァ蜒輔<EFBFBD>繝輔Λ繧、繝磯シ<EFBFBD>縺ォ縺ェ縺」縺溘縺上☆.蠖シ螂ウ縺ォ蟆代@霑代¥謐ィ縺ヲ縺ヲ縺サ縺励>縺ェ縲縺<EFBFBD>縺」縺ヲ繧<EFBFBD>▲縺ア繧雁・ス縺阪□縺九i縲縺昴l縺壹▲縺ィ螂ス縺阪〒縺<EFBFBD>k..蜒輔<EFBFBD>縺溘∪縺励<EFBFBD>遯薙r雜翫@縺ヲ荳ュ繧定ヲ九k縲蜷翫▲縺ヲ縺<EFBFBD>k驤エ縺悟ー代@髻ソ縺」縺ヲ.Diana縺輔s縺ッ縺<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>級遒鈴・ュ窶晉噪蜀イ蜉ィ縲Tolo萓晉┯諡芽キィ<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
102
go.mod
@@ -1,19 +1,93 @@
|
||||
module github.com/FloatTech/ZeroBot-Plugin
|
||||
|
||||
go 1.16
|
||||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/FloatTech/AnimeAPI v1.1.9
|
||||
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/imroc/req v0.3.0
|
||||
github.com/robfig/cron v1.2.0
|
||||
github.com/shirou/gopsutil v3.21.8+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.9.0
|
||||
github.com/tklauser/go-sysconf v0.3.9 // indirect
|
||||
github.com/wdvxdr1123/ZeroBot v1.2.3
|
||||
modernc.org/sqlite v1.13.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.20230111055153-4d8aebd3eab9
|
||||
github.com/FloatTech/floatbox v0.0.0-20230111053652-a03d6334fadf
|
||||
github.com/FloatTech/sqlite v1.5.7
|
||||
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
|
||||
github.com/FloatTech/zbpctrl v1.5.3-0.20230109124217-41203036b80a
|
||||
github.com/FloatTech/zbputils v1.6.1
|
||||
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.7
|
||||
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.3 // 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
|
||||
|
||||
429
go.sum
429
go.sum
@@ -1,193 +1,294 @@
|
||||
github.com/FloatTech/AnimeAPI v1.1.9 h1:H1hZmgwZPNHdx39K9JvY3awT8TTsCl9kKA1uVMyCjRg=
|
||||
github.com/FloatTech/AnimeAPI v1.1.9/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.20230111055153-4d8aebd3eab9 h1:TOd10BBqoHPwbOmULK4a6imdaljkOxKIZFyFKbQqTEA=
|
||||
github.com/FloatTech/AnimeAPI v1.6.1-0.20230111055153-4d8aebd3eab9/go.mod h1:aOU5EVMvflX5Btv0jGLgB6gcSYeR/FNiR2cJG07vd4U=
|
||||
github.com/FloatTech/floatbox v0.0.0-20230111053652-a03d6334fadf h1:aVmgzw9hJA39/2iR800qq1dU682LpW9/czIkoshDzKw=
|
||||
github.com/FloatTech/floatbox v0.0.0-20230111053652-a03d6334fadf/go.mod h1:0+3iDgifrdiEoEsmYe+yiAlUQcmnudhTiiBdSkam2XY=
|
||||
github.com/FloatTech/rendercard v0.0.3 h1:eKOKlmotlDq/YbAcJKe0GMzBjGTsT5eSsyEfjT+hy10=
|
||||
github.com/FloatTech/rendercard v0.0.3/go.mod h1:FwwKoWpv1fW7AZ1mwBVWF8GCH9mEqYYIE9LzdmozCZQ=
|
||||
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.20230109124217-41203036b80a h1:O+GS8J1pEM4E8q05EcopHBK6kfIr0BJJ/cHuPa8yWLM=
|
||||
github.com/FloatTech/zbpctrl v1.5.3-0.20230109124217-41203036b80a/go.mod h1:UT3bZNKMF/+r2XzSvIVXWudnTgmWsQrRPOJ3bmBfjFI=
|
||||
github.com/FloatTech/zbputils v1.6.1 h1:VcufWTkZl8ny4aB6leJ+CE4TS6OdA4i4zeKgYQdx97c=
|
||||
github.com/FloatTech/zbputils v1.6.1/go.mod h1:IrPicT+CKYW2ZwPlG//DSNG7bHAQAII2mNyETnRQDG4=
|
||||
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/imroc/req v0.3.0 h1:3EioagmlSG+z+KySToa+Ylo3pTFZs+jh3Brl7ngU12U=
|
||||
github.com/imroc/req v0.3.0/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw=
|
||||
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/shirou/gopsutil v3.21.8+incompatible h1:sh0foI8tMRlCidUJR+KzqWYWxrkuuPIGiO6Vp+KXdCU=
|
||||
github.com/shirou/gopsutil v3.21.8+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/gjson v1.9.0 h1:+Od7AE26jAaMgVC31cQV/Ope5iKXulNMflrlB7k+F9E=
|
||||
github.com/tidwall/gjson v1.9.0/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 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8=
|
||||
github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo=
|
||||
github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=
|
||||
github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ=
|
||||
github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=
|
||||
github.com/wdvxdr1123/ZeroBot v1.2.2 h1:BKEy3l80BMrQWpFWaII0AfFMyf9bqrB0TxfWhTdoV58=
|
||||
github.com/wdvxdr1123/ZeroBot v1.2.2/go.mod h1:83nHtG8V5TAxPwH/LCDxLpZk4khIgs29dkr5TBWf7fc=
|
||||
github.com/wdvxdr1123/ZeroBot v1.2.3 h1:Fu6aHr+91NRN48G9szJwyR0MhnTjG5lNMS0Wy0QX1Uo=
|
||||
github.com/wdvxdr1123/ZeroBot v1.2.3/go.mod h1:83nHtG8V5TAxPwH/LCDxLpZk4khIgs29dkr5TBWf7fc=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
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.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.7 h1:JK29W0j9k82X4FdGcbgqP5IFikUYMaUysUOIALGfQrw=
|
||||
github.com/wdvxdr1123/ZeroBot v1.6.7/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-20210816074244-15123e1e1f71 h1:ikCpsnYR+Ew0vu99XlDp55lGgDJdIMx3f4a18jfse/s=
|
||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b h1:S7hKs0Flbq0bbc9xgYt4stIEG1zNDFqyrPwAX2Wj/sE=
|
||||
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/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/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g=
|
||||
modernc.org/cc/v3 v3.34.0 h1:dFhZc/HKR3qp92sYQxKRRaDMz+sr1bwcFD+m7LSCrAs=
|
||||
modernc.org/cc/v3 v3.34.0/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/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw=
|
||||
modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI=
|
||||
modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag=
|
||||
modernc.org/ccgo/v3 v3.11.2 h1:gqa8PQ2v7SjrhHCgxUO5dzoAJWSLAveJqZTNkPCN0kc=
|
||||
modernc.org/ccgo/v3 v3.11.2/go.mod h1:6kii3AptTDI+nUrM9RFBoIEUEisSWCbdczD9ZwQH2FE=
|
||||
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/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg=
|
||||
modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M=
|
||||
modernc.org/libc v1.11.3 h1:q//spBhqp23lC/if8/o8hlyET57P8mCZqrqftzT2WmY=
|
||||
modernc.org/libc v1.11.3/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU=
|
||||
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/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14=
|
||||
modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM=
|
||||
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/sqlite v1.13.0 h1:cwhUj0jTBgPjk/demWheV+T6xi6ifTfsGIFKFq0g3Ck=
|
||||
modernc.org/sqlite v1.13.0/go.mod h1:2qO/6jZJrcQaxFUHxOwa6Q6WfiGSsiVj6GXX0Ker+Jg=
|
||||
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/tcl v1.5.9/go.mod h1:bcwjvBJ2u0exY6K35eAmxXBBij5kXb1dHlAWmfhqThE=
|
||||
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=
|
||||
modernc.org/z v1.1.2/go.mod h1:sj9T1AGBG0dm6SCVzldPOHWrif6XBpooJtbttMn1+Js=
|
||||
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
10
kanban/banner.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package kanban
|
||||
|
||||
// Version ...
|
||||
var Version = "v1.6.1-beta5"
|
||||
|
||||
// Banner ...
|
||||
var Banner = "* OneBot + ZeroBot + Golang\n" +
|
||||
"* Version " + Version + " - 2023-01-11 14:46: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
46
kanban/gen/banner.go
Normal 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
45
kanban/init.go
Normal 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
|
||||
}
|
||||
350
main.go
350
main.go
@@ -1,95 +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/plugin_qingyunke" //青云客
|
||||
"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_hs" // 炉石
|
||||
_ "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_aiwife" // 随机老婆
|
||||
_ "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
70
main_win.go
Normal 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
97
plugin/ahsai/ahsai.go
Normal 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: "- 使[伊織弓鶴|紲星あかり|結月ゆかり|京町セイカ|東北きりたん|東北イタコ|ついなちゃん標準語|ついなちゃん関西弁|音街ウナ|琴葉茜|吉田くん|民安ともえ|桜乃そら|月読アイ|琴葉葵|東北ずん子|月読ショウタ|水奈瀬コウ]说(日语)\n",
|
||||
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
121
plugin/ai_false/ai_false.go
Normal 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
251
plugin/ai_reply/ai_tts.go
Normal 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
173
plugin/ai_reply/main.go
Normal 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("设置成功"))
|
||||
})
|
||||
}
|
||||
227
plugin/aipaint/aipaint.go
Normal file
227
plugin/aipaint/aipaint.go
Normal file
@@ -0,0 +1,227 @@
|
||||
// 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" +
|
||||
"例: 设置ai绘图配置 http://91.217.139.190:5010 abc\n" +
|
||||
"参考服务器 http://91.217.139.190:5010, http://91.216.169.75:5010, http://185.80.202.180:5010\n" +
|
||||
"通过 http://91.217.139.190:5010/token 获取token\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.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
|
||||
}
|
||||
text := fmt.Sprintf("成功设置\nbase_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
|
||||
ctx.SendChain(message.Text(text))
|
||||
})
|
||||
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
|
||||
}
|
||||
text := fmt.Sprintf("成功设置\nbase_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
|
||||
ctx.SendChain(message.Text(text))
|
||||
})
|
||||
engine.OnFullMatch(`查看ai绘图配置`, zero.SuperUserPermission).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
err := cfg.load()
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
text := fmt.Sprintf("base_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
|
||||
ctx.SendChain(message.Text(text))
|
||||
})
|
||||
}
|
||||
|
||||
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
56
plugin/aipaint/config.go
Normal 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
41
plugin/aipaint/context.go
Normal 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
88
plugin/aipaint/img2img.go
Normal 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)
|
||||
})
|
||||
}
|
||||
@@ -4,8 +4,10 @@ package aiwife
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
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"
|
||||
)
|
||||
@@ -15,10 +17,11 @@ const (
|
||||
)
|
||||
|
||||
func init() { // 插件主体
|
||||
// TODO: 1.17 特性暂不增加
|
||||
// rand.Seed(time.Now().UnixMicro())
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
zero.OnFullMatchGroup([]string{"waifu", "随机waifu"}).SetPriority(10).
|
||||
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)))
|
||||
32
plugin/alipayvoice/alipayvoice.go
Normal file
32
plugin/alipayvoice/alipayvoice.go
Normal 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
124
plugin/antiabuse/anti.go
Normal 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
102
plugin/antiabuse/db.go
Normal 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()
|
||||
}
|
||||
@@ -6,59 +6,93 @@ 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"
|
||||
|
||||
"github.com/FloatTech/floatbox/process"
|
||||
ctrl "github.com/FloatTech/zbpctrl"
|
||||
"github.com/FloatTech/zbputils/control"
|
||||
)
|
||||
|
||||
var (
|
||||
// ATRI 所有命令的优先级
|
||||
prio = 2
|
||||
// ATRI 表情的 codechina 镜像
|
||||
res = "https://codechina.csdn.net/u011570312/ZeroBot-Plugin/-/raw/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).
|
||||
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- 答应我",
|
||||
OnEnable: func(ctx *zero.Ctx) {
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.SendChain(message.Text("嗯呜呜……夏生先生……?"))
|
||||
},
|
||||
OnDisable: func(ctx *zero.Ctx) {
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.SendChain(message.Text("Zzz……Zzz……"))
|
||||
},
|
||||
})
|
||||
engine.UsePreHandler(isAtriSleeping)
|
||||
var dgtr datagetter = engine.GetLazyData
|
||||
engine.OnFullMatch("萝卜子").SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
enable = true
|
||||
time.Sleep(time.Second * 1)
|
||||
ctx.SendChain(randText("嗯呜呜……夏生先生……?"))
|
||||
})
|
||||
zero.OnFullMatch("ATRI睡吧", zero.AdminPermission).SetBlock(true).SetPriority(prio).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
enable = false
|
||||
time.Sleep(time.Second * 1)
|
||||
ctx.SendChain(randText("Zzz……Zzz……"))
|
||||
})
|
||||
zero.OnFullMatch("萝卜子", atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
switch rand.Intn(2) {
|
||||
case 0:
|
||||
ctx.SendChain(randText("萝卜子是对机器人的蔑称!", "是亚托莉......萝卜子可是对机器人的蔑称"))
|
||||
case 1:
|
||||
ctx.SendChain(randRecord("RocketPunch.amr"))
|
||||
ctx.SendChain(dgtr.randRecord("RocketPunch.amr"))
|
||||
}
|
||||
})
|
||||
zero.OnFullMatchGroup([]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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
ctx.SendChain(randImage("SUKI.jpg", "SUKI1.jpg", "SUKI2.png"))
|
||||
process.SleepAbout1sTo2s()
|
||||
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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
ctx.SendChain(randImage("FN.jpg", "WQ.jpg", "WQ1.jpg"))
|
||||
process.SleepAbout1sTo2s()
|
||||
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()
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
switch {
|
||||
case now < 6: // 凌晨
|
||||
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
|
||||
@@ -95,11 +129,11 @@ func init() { // 插件主体
|
||||
))
|
||||
}
|
||||
})
|
||||
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 { // 中午
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
|
||||
"午安w",
|
||||
"午觉要好好睡哦,ATRI会陪伴在你身旁的w",
|
||||
@@ -108,10 +142,10 @@ 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()
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
switch {
|
||||
case now < 6: // 凌晨
|
||||
ctx.SendChain(message.Reply(ctx.Event.MessageID), randText(
|
||||
@@ -151,9 +185,9 @@ 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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.SendChain(randText(
|
||||
"当然,我是高性能的嘛~!",
|
||||
"小事一桩,我是高性能的嘛",
|
||||
@@ -172,9 +206,9 @@ 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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
ctx.SendChain(randText(
|
||||
"当然,我是高性能的嘛~!",
|
||||
"没事没事,因为我是高性能的嘛!嗯哼!",
|
||||
@@ -187,79 +221,47 @@ func init() { // 插件主体
|
||||
))
|
||||
})
|
||||
|
||||
zero.OnKeywordGroup([]string{"好吗", "是吗", "行不行", "能不能", "可不可以"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
|
||||
engine.OnKeywordGroup([]string{"好吗", "是吗", "行不行", "能不能", "可不可以"}).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
if rand.Intn(2) == 0 {
|
||||
ctx.SendChain(randImage("YES.png", "NO.jpg"))
|
||||
ctx.SendChain(dgtr.randImage("YES.png", "NO.jpg"))
|
||||
}
|
||||
})
|
||||
zero.OnKeywordGroup([]string{"啊这"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
|
||||
engine.OnKeywordGroup([]string{"啊这"}).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
if rand.Intn(2) == 0 {
|
||||
ctx.SendChain(randImage("AZ.jpg", "AZ1.jpg"))
|
||||
ctx.SendChain(dgtr.randImage("AZ.jpg", "AZ1.jpg"))
|
||||
}
|
||||
})
|
||||
zero.OnKeywordGroup([]string{"我好了"}, atriSwitch(), atriSleep()).SetBlock(true).SetPriority(prio).
|
||||
engine.OnKeywordGroup([]string{"我好了"}).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
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) {
|
||||
time.Sleep(time.Second * 1)
|
||||
process.SleepAbout1sTo2s()
|
||||
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
|
||||
}
|
||||
}
|
||||
29
plugin/autowithdraw/main.go
Normal file
29
plugin/autowithdraw/main.go
Normal 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
62
plugin/b14/main.go
Normal 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
27
plugin/baidu/search.go
Normal 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
500
plugin/baiduaudit/audit.go
Normal 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
62
plugin/base64gua/main.go
Normal 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("解密失败!"))
|
||||
}
|
||||
})
|
||||
}
|
||||
62
plugin/baseamasiro/main.go
Normal file
62
plugin/baseamasiro/main.go
Normal 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
627
plugin/bilibili/bilibili.go
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
107
plugin/bilibili/bilibili_parse.go
Normal file
107
plugin/bilibili/bilibili_parse.go
Normal 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)...)
|
||||
}
|
||||
90
plugin/bilibili/bilibilimodel.go
Normal file
90
plugin/bilibili/bilibilimodel.go
Normal 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
|
||||
}
|
||||
364
plugin/bilibili/bilibilipush.go
Normal file
364
plugin/bilibili/bilibilipush.go
Normal 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
|
||||
}
|
||||
149
plugin/bilibili/bilibilipushmodel.go
Normal file
149
plugin/bilibili/bilibilipushmodel.go
Normal 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
326
plugin/bilibili/card2msg.go
Normal 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
|
||||
}
|
||||
84
plugin/bilibili/card2msg_test.go
Normal file
84
plugin/bilibili/card2msg_test.go
Normal 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))
|
||||
}
|
||||
75
plugin/book_review/book_review.go
Normal file
75
plugin/book_review/book_review.go
Normal 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: 可能被风控了"))
|
||||
}
|
||||
})
|
||||
}
|
||||
21
plugin/book_review/model.go
Normal file
21
plugin/book_review/model.go
Normal 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
|
||||
}
|
||||
50
plugin/breakrepeat/breakrepeat.go
Normal file
50
plugin/breakrepeat/breakrepeat.go
Normal 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)
|
||||
})
|
||||
}
|
||||
139
plugin/cangtoushi/cangtoushi.go
Normal file
139
plugin/cangtoushi/cangtoushi.go
Normal 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
|
||||
}
|
||||
@@ -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
37
plugin/choose/choose.go
Normal 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,
|
||||
))
|
||||
}
|
||||
73
plugin/chouxianghua/chouxianghua.go
Normal file
73
plugin/chouxianghua/chouxianghua.go
Normal 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
|
||||
}
|
||||
30
plugin/chouxianghua/model.go
Normal file
30
plugin/chouxianghua/model.go
Normal 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
33
plugin/chrev/init.go
Normal 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
59
plugin/chrev/map.go
Normal 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
68
plugin/coser/coser.go
Normal 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
74
plugin/cpstory/cpstory.go
Normal 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, gong)
|
||||
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
17
plugin/cpstory/model.go
Normal 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
74
plugin/curse/curse.go
Normal 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
16
plugin/curse/model.go
Normal 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
51
plugin/danbooru/main.go
Normal 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
119
plugin/danbooru/tag.go
Normal 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
56
plugin/diana/bing.go
Normal 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
71
plugin/diana/data/text.go
Normal 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
39
plugin/dress/api.go
Normal 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
113
plugin/dress/dress.go
Normal 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
109
plugin/drift_bottle/main.go
Normal 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
249
plugin/emojimix/emoji.go
Normal 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
101
plugin/emojimix/mix.go
Normal 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
45
plugin/event/data.go
Normal 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
144
plugin/event/event.go
Normal 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
45
plugin/font/main.go
Normal 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
249
plugin/fortune/fortune.go
Normal 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
69
plugin/funny/laugh.go
Normal 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
16
plugin/genshin/data.go
Normal 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
377
plugin/genshin/ys.go
Normal 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
103
plugin/gif/README.md
Normal 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
109
plugin/gif/context.go
Normal 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
1449
plugin/gif/gif.go
Normal file
File diff suppressed because it is too large
Load Diff
43
plugin/gif/logo.go
Normal file
43
plugin/gif/logo.go
Normal 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
1508
plugin/gif/png.go
Normal file
File diff suppressed because it is too large
Load Diff
169
plugin/gif/run.go
Normal file
169
plugin/gif/run.go
Normal file
@@ -0,0 +1,169 @@
|
||||
// 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" +
|
||||
"- 结婚申请|结婚登记|- 阿尼亚喜欢XXX|- 像只|- 我永远喜欢XXX\n" +
|
||||
"- 像样的亲亲|- 国旗|- 不要靠近|- 万能表情|-空白表情|- 采访\n" +
|
||||
"- 需要|-你可能需要|- 这像画吗|- 小画家|- 完美|- 玩游戏|- 出警\n" +
|
||||
"- 警察|- 舔|舔屏|prpr|- 安全感|- 精神支柱|- 想什么|- 墙纸\n" +
|
||||
"- 为什么at我|- 交个朋友|- 打工人|-继续干活|- 兑换券|- 炖\n" +
|
||||
"- 垃圾桶|- 垃圾|- 捶|- 啾啾|- 2敲|- 听音乐|- 永远爱你|- 2拍\n" +
|
||||
"- 顶|- 捣|- 打拳|- 滚|- 吸|- 嗦|- 扔|- 锤|- 紧贴|紧紧贴着|- 转\n" +
|
||||
"- 抬棺|- 远离|- 我老婆|- 小天使XXX|- 你的XXX|- 不要看\n" +
|
||||
"- 玩一下XXX|- 给我变|- 揍|- 吞|- 膜拜|- 诶嘿|- 2蹭|- 你犯法了\n" +
|
||||
"- 砰|- 注意力涣散|- 蒙蔽|- 踩|- 好玩|- 2转|- 踢球|- 2舔|\n" +
|
||||
"- 可莉吃|- 胡桃啃|- 怀|- 一直(支持动图)\n" +
|
||||
"例: 制图命令XXX[@用户|QQ号|图片]" +
|
||||
"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))
|
||||
})
|
||||
}
|
||||
131
plugin/github/repo_searcher.go
Normal file
131
plugin/github/repo_searcher.go
Normal 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
|
||||
}
|
||||
473
plugin/guessmusic/apiservice.go
Normal file
473
plugin/guessmusic/apiservice.go
Normal 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
|
||||
}
|
||||
316
plugin/guessmusic/guessmusic.go
Normal file
316
plugin/guessmusic/guessmusic.go
Normal 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
577
plugin/guessmusic/main.go
Normal 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
446
plugin/guessmusic/struct.go
Normal 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
119
plugin/heisi/heisi.go
Normal 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
48
plugin/heisi/packer.go
Normal 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
15
plugin/heisi/slice.go
Normal 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
119
plugin/hs/run.go
Normal 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
135
plugin/hyaku/main.go
Normal 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),
|
||||
)
|
||||
})
|
||||
}
|
||||
150
plugin/image_finder/keyword.go
Normal file
150
plugin/image_finder/keyword.go
Normal 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
23
plugin/inject/main.go
Normal 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)))
|
||||
})
|
||||
}
|
||||
24
plugin/jandan/data.go
Normal file
24
plugin/jandan/data.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package jandan
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
sql "github.com/FloatTech/sqlite"
|
||||
)
|
||||
|
||||
var db = &sql.Sqlite{}
|
||||
var mu sync.RWMutex
|
||||
|
||||
type picture struct {
|
||||
ID uint64 `db:"id"`
|
||||
URL string `db:"url"`
|
||||
}
|
||||
|
||||
func getRandomPicture() (u string, err error) {
|
||||
var p picture
|
||||
mu.RLock()
|
||||
err = db.Pick("picture", &p)
|
||||
mu.RUnlock()
|
||||
u = p.URL
|
||||
return
|
||||
}
|
||||
116
plugin/jandan/jandan.go
Normal file
116
plugin/jandan/jandan.go
Normal file
@@ -0,0 +1,116 @@
|
||||
// Package jandan 煎蛋网无聊图
|
||||
package jandan
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"hash/crc64"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/FloatTech/floatbox/binary"
|
||||
fcext "github.com/FloatTech/floatbox/ctxext"
|
||||
ctrl "github.com/FloatTech/zbpctrl"
|
||||
"github.com/FloatTech/zbputils/control"
|
||||
"github.com/antchfx/htmlquery"
|
||||
"github.com/sirupsen/logrus"
|
||||
zero "github.com/wdvxdr1123/ZeroBot"
|
||||
"github.com/wdvxdr1123/ZeroBot/message"
|
||||
)
|
||||
|
||||
const (
|
||||
api = "http://jandan.net/pic"
|
||||
)
|
||||
|
||||
func init() {
|
||||
engine := control.Register("jandan", &ctrl.Options[*zero.Ctx]{
|
||||
DisableOnDefault: false,
|
||||
Brief: "煎蛋网无聊图",
|
||||
Help: "- 来份[屌|弔|吊]图\n- 更新[屌|弔|吊]图\n",
|
||||
PublicDataFolder: "Jandan",
|
||||
})
|
||||
|
||||
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
|
||||
db.DBPath = engine.DataFolder() + "pics.db"
|
||||
_, _ = engine.GetLazyData("pics.db", false)
|
||||
err := db.Open(time.Hour * 24)
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return false
|
||||
}
|
||||
err = db.Create("picture", &picture{})
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return false
|
||||
}
|
||||
n, err := db.Count("picture")
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return false
|
||||
}
|
||||
logrus.Printf("[jandan]读取%d张图片", n)
|
||||
return true
|
||||
})
|
||||
|
||||
engine.OnRegex(`来份[屌|弔|吊]图`, getdb).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
u, err := getRandomPicture()
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
ctx.SendChain(message.Image(u))
|
||||
})
|
||||
|
||||
engine.OnRegex(`更新[屌|弔|吊]图`, zero.SuperUserPermission, getdb).SetBlock(true).
|
||||
Handle(func(ctx *zero.Ctx) {
|
||||
ctx.Send("少女更新中...")
|
||||
webpageURL := api
|
||||
doc, err := htmlquery.LoadURL(webpageURL)
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
re := regexp.MustCompile(`\d+`)
|
||||
pageTotal, err := strconv.Atoi(re.FindString(htmlquery.FindOne(doc, "//*[@id='comments']/div[2]/div/span[@class='current-comment-page']/text()").Data))
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
LOOP:
|
||||
for i := 0; i < pageTotal; i++ {
|
||||
logrus.Debugln("[jandan]", fmt.Sprintf("处理第%d/%d页...", i, pageTotal))
|
||||
doc, err = htmlquery.LoadURL(webpageURL)
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
picList, err := htmlquery.QueryAll(doc, "//*[@class='view_img_link']")
|
||||
if err != nil {
|
||||
ctx.SendChain(message.Text("ERROR: ", err))
|
||||
return
|
||||
}
|
||||
if len(picList) != 0 {
|
||||
for _, v := range picList {
|
||||
u := "https:" + v.Attr[0].Val
|
||||
i := crc64.Checksum(binary.StringToBytes(u), crc64.MakeTable(crc64.ISO))
|
||||
mu.RLock()
|
||||
ok := db.CanFind("picture", "where id="+strconv.FormatUint(i, 10))
|
||||
mu.RUnlock()
|
||||
if !ok {
|
||||
mu.Lock()
|
||||
_ = db.Insert("picture", &picture{ID: i, URL: u})
|
||||
mu.Unlock()
|
||||
} else {
|
||||
// 开始重复,说明之后都是重复
|
||||
break LOOP
|
||||
}
|
||||
}
|
||||
}
|
||||
if i != pageTotal-1 {
|
||||
webpageURL = "https:" + htmlquery.FindOne(doc, "//*[@id='comments']/div[@class='comments']/div[@class='cp-pagenavi']/a[@class='previous-comment-page']").Attr[1].Val
|
||||
}
|
||||
}
|
||||
ctx.Send("更新完成!")
|
||||
})
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user