Compare commits
784 Commits
Author | SHA1 | Date | |
---|---|---|---|
f014a79f8d | |||
1a6d47a633 | |||
12eed8f859 | |||
549092d9aa | |||
b245393bc4 | |||
dcd43a17ba | |||
b8088dc01a | |||
8e1b90ab43 | |||
614a1d74dd | |||
9ea1ed8559 | |||
3e1e234799 | |||
62f5ecd278 | |||
27733e2119 | |||
6be127e18b | |||
608b8bb741 | |||
ef01eec36e | |||
5dbdd0e685 | |||
5273050ab3 | |||
fae3b02e5a | |||
3489e4af1e | |||
8e9bd0bbd5 | |||
3725b5bc34 | |||
998a59aa5e | |||
86c017674a | |||
cbae87cd11 | |||
5bc1f8d468 | |||
d3a355e164 | |||
45413c9d28 | |||
082ee8836f | |||
2f5bd5e6d7 | |||
639e0137cc | |||
2f898aa037 | |||
a43a225740 | |||
833c39969b | |||
e25dea27e7 | |||
dac962580b | |||
b12bf78c6d | |||
a44b005f7c | |||
4ea65dbe41 | |||
90ba51ee9c | |||
ecf44084dc | |||
9f49c663f8 | |||
c8c9a67485 | |||
837358df66 | |||
498bc7cebe | |||
9c3a4eb947 | |||
de1ecbaef4 | |||
4eb05efa7c | |||
ffa40227ec | |||
b44e1820a2 | |||
eb461481ed | |||
92f47cc9cb | |||
f82c6f7ab4 | |||
9f32e46921 | |||
eba96282d6 | |||
dd8423fbb5 | |||
76f992906d | |||
402d6de02d | |||
43e3ce1ed5 | |||
15050018f2 | |||
71d6394bc8 | |||
1d6791e4c2 | |||
7f0084a7ed | |||
1374a12f89 | |||
92937b8b3c | |||
d0ed5a8b59 | |||
2b318a1021 | |||
903e93ae01 | |||
06c7fe669c | |||
e2c0ee66e4 | |||
c6c62f956b | |||
8fa27fea6c | |||
03c56f388c | |||
4090922e7e | |||
8061dedba1 | |||
da2112b659 | |||
ed5386771a | |||
d248828523 | |||
fc0b86fe19 | |||
346036ec88 | |||
a5e1ce0e0b | |||
67b39b1a98 | |||
6fb7721798 | |||
0018fd469e | |||
019f7480e8 | |||
8e0b088deb | |||
452005381f | |||
9722ed99a3 | |||
ee6311e83d | |||
1471e52307 | |||
f1fc12d9cc | |||
ebbc42bebc | |||
4785ee8c32 | |||
ab40756c1a | |||
c88e737a84 | |||
def5ea7978 | |||
e69ab45044 | |||
25d0b4bbf1 | |||
f86f5ac6cc | |||
07ce365bfd | |||
f31c94e2ea | |||
933638d035 | |||
b0151afa9a | |||
5bbd4ae703 | |||
f2f7f532a0 | |||
80eedf7449 | |||
1b48e0d6e0 | |||
0420c548da | |||
6e98b75d13 | |||
e772cb00d1 | |||
b5d5275e9b | |||
a2d3d22b6e | |||
1ad8603cc2 | |||
aeaf535ea2 | |||
917726fecc | |||
49a5b4eb14 | |||
8946f3ea18 | |||
1947835c51 | |||
c7c537c8b8 | |||
4e2f954683 | |||
abb0184329 | |||
ee483ecfd3 | |||
99384b4c22 | |||
65503bc68d | |||
ec6aadb5ce | |||
5f642886d9 | |||
4c26e3c54d | |||
3ca3712bae | |||
a471e4b783 | |||
20ac7e62e9 | |||
3e61aa0835 | |||
c18f6fde80 | |||
8b9397a0ce | |||
678ff17d0f | |||
ea2016c208 | |||
b5bdf266d3 | |||
2309680c38 | |||
e99bf569c5 | |||
d3fd0f810a | |||
484dc9b08a | |||
3bd827d7da | |||
d425c72134 | |||
969cd16638 | |||
569be15705 | |||
03f54c5b02 | |||
06ddc8ec50 | |||
1528935008 | |||
7121bdef6b | |||
f6c376f20d | |||
241769d6fc | |||
7727651871 | |||
ce331826ac | |||
ae92c52d61 | |||
54aef5fe6f | |||
d22148b418 | |||
5dc75c9cea | |||
200e82decb | |||
50359dbaf4 | |||
7165f21a62 | |||
8aab828c65 | |||
c9f8c12f5b | |||
a347f8fa49 | |||
2d76bdd0f8 | |||
c5cdd56edb | |||
6901ab39ed | |||
b851b7f431 | |||
ccaa99115c | |||
813de15e85 | |||
fa33181fa9 | |||
d4324dc0cb | |||
ccc27bcc14 | |||
014c1673c6 | |||
3a3319ff52 | |||
5b54ec8fb5 | |||
e690556286 | |||
660956917f | |||
3a5201747b | |||
b338e8a83f | |||
5584d56b6a | |||
c925498120 | |||
75615cf503 | |||
39f708b0fc | |||
ac32077221 | |||
a5902acacd | |||
c7c08b7511 | |||
7de915d47b | |||
9107547501 | |||
95dc76ca19 | |||
49c2a9b372 | |||
b378cabfc7 | |||
4263dbef31 | |||
32fc6ae2eb | |||
238cb0077f | |||
f5a06b6494 | |||
2c01329085 | |||
502de89ab1 | |||
128de6750c | |||
e59e2d9f0b | |||
2504b8391b | |||
330ea7d210 | |||
1edd173a29 | |||
98d873a7f9 | |||
09175b84df | |||
177e19632a | |||
8e6207f3e9 | |||
ff3a97f6cf | |||
b8e155ab40 | |||
b8e7df198d | |||
34311e3181 | |||
46115d3f04 | |||
c1d25d2394 | |||
880cea5a56 | |||
e7205d9cc2 | |||
f456feb3ff | |||
3f83beedb7 | |||
e6c9b1d9bd | |||
b46114f4fa | |||
8d77e2ba22 | |||
cb3900921f | |||
ae2021583d | |||
36cd88e6b7 | |||
517b0908da | |||
b23b3e4d21 | |||
883fc5dde0 | |||
9d044329f6 | |||
d1e9e74cb8 | |||
98a87ee75f | |||
331491077d | |||
913c3a6636 | |||
fbaf5fe355 | |||
804c932f60 | |||
cef6d1d1b6 | |||
e4e7ab1135 | |||
6ca30df8c4 | |||
a340d4ed8e | |||
ca7cb94358 | |||
54779b25f5 | |||
44d7652171 | |||
c9ed15b682 | |||
8faad646ae | |||
1d50bc3382 | |||
da4af041af | |||
e2ff408f2f | |||
50d1500dfc | |||
94441f93a5 | |||
5f712fbf3c | |||
1c757f10e0 | |||
0508d5f643 | |||
d9986b7a2f | |||
3d79e7a136 | |||
52fb1237ec | |||
8a7197726e | |||
b7f5458684 | |||
52710f3810 | |||
a54de07260 | |||
aa2c8d101e | |||
1441fd93b9 | |||
4a585e8920 | |||
8c4245a09d | |||
e4af16989a | |||
5dc0944fe8 | |||
b4d24f4377 | |||
67be47b8db | |||
e382982d32 | |||
b09b74b5da | |||
c628bdb7a6 | |||
2fcf6fb0fd | |||
4f3fc9ffd0 | |||
15839a7399 | |||
26b3a14a63 | |||
f2f0799df1 | |||
6c99c32100 | |||
93d25a2a34 | |||
88f5ec59d7 | |||
586d3c4db7 | |||
f45fb56e15 | |||
8fe153c7c1 | |||
36a8720fbb | |||
9cbfdc94d9 | |||
091923764d | |||
dc39caed1e | |||
bcd7d1f007 | |||
40d4dc0474 | |||
02ac30c0d0 | |||
518bc92673 | |||
a5b92e316c | |||
828c7b66a0 | |||
93474eaa06 | |||
237f366aa2 | |||
714bcf28d5 | |||
420eeb4d68 | |||
bc6daf4a2e | |||
6f7832c09b | |||
bef67fa275 | |||
05d7198667 | |||
df0bfc14e5 | |||
3f28f7451f | |||
dbb9199d6f | |||
72cb3b03af | |||
d0085f00ed | |||
43734f027b | |||
f799375635 | |||
65704bbf01 | |||
9cb3882efa | |||
a0833ca691 | |||
a4f197f608 | |||
bb903cab40 | |||
92f765bc47 | |||
742889a035 | |||
24453ebcc3 | |||
8b8ab1bf5c | |||
e9bc9b8675 | |||
eeaa27c7ca | |||
ccea1755fc | |||
c32a5d602b | |||
2a04f2ca4d | |||
37c80e8ef5 | |||
1dce62e42a | |||
ec222378c4 | |||
ac930a1c6a | |||
5ccd5ad56e | |||
67da90530b | |||
b7f3753615 | |||
d21d38509c | |||
a59e1c0345 | |||
7ab613b394 | |||
c00ab0fbe2 | |||
87451b1223 | |||
d2b61229a3 | |||
980584020a | |||
a43d0dafa5 | |||
d5c1e7e579 | |||
55bdf0d618 | |||
44f7c13ad4 | |||
7bd1a3c8ac | |||
4f1981df03 | |||
8689a998aa | |||
079bb8d722 | |||
65c0b6c7da | |||
84958af4ce | |||
c53b59914b | |||
8ffd9ab2d9 | |||
0305caf504 | |||
3012e4ffe0 | |||
585f3c3d3e | |||
f1d07dfbed | |||
cddfc55110 | |||
a2ce072ae7 | |||
439563c5d6 | |||
962617b4f4 | |||
4a202f0f7e | |||
6e6b12519a | |||
f5f7654f4b | |||
5ac4c48ad1 | |||
7e18fd18b0 | |||
fb30c479ea | |||
f40dcbfe13 | |||
8755b5f353 | |||
691482bb28 | |||
4248bb8ce0 | |||
a5653e33d3 | |||
072dc1c7e6 | |||
d76fceae85 | |||
86107b2710 | |||
a473768bef | |||
f7fe13a177 | |||
acd29d22eb | |||
c228155514 | |||
b601b98d5c | |||
1cd3419688 | |||
6f5f233bb5 | |||
d33492cd49 | |||
83ad9f369f | |||
3a78b62520 | |||
2479f75d8a | |||
f0d187f71e | |||
056942391a | |||
2feef81516 | |||
037d4b581b | |||
da4cf6fdb4 | |||
848bcd5a63 | |||
7b60b6c6dc | |||
fbc801d1da | |||
2f18f82e3d | |||
c2d5a96bb6 | |||
46575d4f04 | |||
5e7be93980 | |||
3f749c6540 | |||
2a7d4ee866 | |||
083095ded6 | |||
7207663f37 | |||
66b49c909a | |||
ab469aa243 | |||
afa4563e1e | |||
320b3d8617 | |||
7493429b4d | |||
d70f7a717b | |||
4ab38b7894 | |||
2068407be0 | |||
10a7369fec | |||
9fb5579701 | |||
b3cf883a44 | |||
f65e27c07c | |||
b587fefe44 | |||
2511114c28 | |||
9cd267fee5 | |||
aeac96a4f7 | |||
88a75e2a99 | |||
e14760775b | |||
9e7e464ba5 | |||
060d4fd27f | |||
940578d062 | |||
9cf42d8b33 | |||
1d62d2924e | |||
e23bac47ba | |||
b5d38adfcc | |||
f30513b20b | |||
ade1e40395 | |||
c93b8677e4 | |||
62683d8878 | |||
3d1239c1b4 | |||
5268bade66 | |||
514eb39a14 | |||
18628b821e | |||
344fbe6bcd | |||
afb8cd2dc1 | |||
1a5f385eb5 | |||
8df7864064 | |||
9ca60bad7f | |||
bd828bb072 | |||
892cb44d84 | |||
517ea6a119 | |||
ba8ffda32a | |||
90a9cf376e | |||
16d6c55407 | |||
f3508d15a3 | |||
0add490097 | |||
2d2d1bd58d | |||
7813c8a942 | |||
ac5453232f | |||
e78e5274d3 | |||
982520bcef | |||
7abd91f031 | |||
b93bfb7e5c | |||
2b20c34c1e | |||
0f63acea5b | |||
e600fb7096 | |||
b63fc71865 | |||
23e7650983 | |||
01b5ccfdc6 | |||
cc72f91465 | |||
45cb5ff4ef | |||
390279a4a8 | |||
851dececab | |||
482afa93a2 | |||
25bdbd7ae0 | |||
527a639242 | |||
0d5e000ad3 | |||
f4cb467e7a | |||
2f6b0b142a | |||
78c2535c3c | |||
26260392a8 | |||
aa573c0063 | |||
b2859bcd2a | |||
b58dd8c704 | |||
09c96286f9 | |||
f2d2089c21 | |||
79c366d1f2 | |||
c97ce5255f | |||
1fb66254a4 | |||
2d74f0507b | |||
9c06544c46 | |||
641dad586f | |||
016144b960 | |||
4d6c8efe44 | |||
860a7d1eeb | |||
2389857be8 | |||
18458f418f | |||
e812d054bc | |||
44d2c0195a | |||
42b4949b7f | |||
d915ae0807 | |||
8eec8ea35f | |||
023e0ba7aa | |||
d0d3b70c73 | |||
a509045b25 | |||
7be6501571 | |||
bb4c35d481 | |||
47ea84957d | |||
fc76f7874e | |||
77a778acf1 | |||
ff059d1268 | |||
53bb5012b9 | |||
09a3a977d7 | |||
04db5944d1 | |||
9c97bb431c | |||
38215f2cf9 | |||
01e7a01daf | |||
c2a8e29ef9 | |||
15a41e31b0 | |||
294c9840de | |||
568ecd9477 | |||
169f3ed541 | |||
ff7ae427fd | |||
1597415340 | |||
47f3261b9f | |||
9e68eefbb7 | |||
630c531d99 | |||
c7da2a4b5f | |||
692078f490 | |||
0e29e864c8 | |||
1b7a601d27 | |||
a96076ee5b | |||
d580622d1b | |||
6edccad4dd | |||
8fa47dbcb1 | |||
157f4bbc21 | |||
3b0d0df068 | |||
69802a9f00 | |||
b940da45af | |||
bd6de0e204 | |||
958074e347 | |||
988ac80087 | |||
1c7c72181e | |||
6857153367 | |||
0a3a0f3beb | |||
e92e83746d | |||
3b34b3e9ea | |||
9506f53691 | |||
92dc6db134 | |||
1b88a7bc03 | |||
781cebf194 | |||
b0c21aa233 | |||
b58afb0414 | |||
16b275a6b9 | |||
ac9612eb49 | |||
416accbe78 | |||
ee0531b048 | |||
e80da3c865 | |||
712a90d502 | |||
ab995930ff | |||
5dc27b6d4b | |||
391a0a1e0d | |||
8d1db30129 | |||
a0f35e240f | |||
570f4e921b | |||
ddd7b04646 | |||
3c4bae763f | |||
75e360ae7a | |||
90225f9d33 | |||
bb555ab8ff | |||
868f6a1f0c | |||
a3c1a29fbf | |||
f0c218200c | |||
9200b1cac2 | |||
28c2063043 | |||
8818648740 | |||
ce589fee8c | |||
f86cfdb1ce | |||
55cbf2c66e | |||
00515d35b9 | |||
5ce2bdf117 | |||
e65275da95 | |||
399903a462 | |||
9a30314e17 | |||
2170a9fedb | |||
0c291d1d8d | |||
d765a43166 | |||
45d42d1063 | |||
c5103672c9 | |||
8e21458e16 | |||
aade954dd7 | |||
3ae73555a9 | |||
c110f0860e | |||
b7a4f286b0 | |||
f640da911b | |||
9e0347d3f9 | |||
67496de411 | |||
2a5a055d1c | |||
7075b66aa5 | |||
93457eacf7 | |||
2d1a72b218 | |||
2db861991a | |||
391500bdac | |||
5b63c23ae1 | |||
34a7e2888d | |||
700c343f7c | |||
c30960d6bf | |||
ccceaabb52 | |||
721531c5b5 | |||
4f8a8f86bf | |||
d773c220c7 | |||
b9a0d25601 | |||
6e776650be | |||
cfe9452e92 | |||
03b4f19a4c | |||
a74c790ccb | |||
05f9135e30 | |||
6f115c6d81 | |||
f04002188d | |||
d00e4433ee | |||
2c1b26a988 | |||
ace59fa717 | |||
1d1fc87920 | |||
f976f32ea9 | |||
cb3dd91a8c | |||
e2610c52f3 | |||
de239b6d67 | |||
149de5b17b | |||
d47d6bb12b | |||
c30c71c338 | |||
a941c05d75 | |||
50fd020509 | |||
4ec264755f | |||
53f018aae6 | |||
38dded5061 | |||
59070cd626 | |||
5875409841 | |||
251bf4bd61 | |||
958c59b065 | |||
46b0c5f354 | |||
7ed3448e13 | |||
d355f3f77c | |||
08b72eb8c7 | |||
3f2f4fa32e | |||
7fe6b1f84f | |||
2cca14a625 | |||
856925f2ca | |||
a774767676 | |||
299ec075e2 | |||
17a04e2676 | |||
dd3df080d3 | |||
960b3c0aeb | |||
84bf879b7d | |||
a5cf189caa | |||
73e7c1bf67 | |||
acd64f58e3 | |||
259254aca8 | |||
783fa161a1 | |||
963c7761f2 | |||
1d6947d321 | |||
27ffb192f0 | |||
7c64d677cb | |||
f1f8e6dfd3 | |||
635afdf53f | |||
99b5d94b11 | |||
db24dddeff | |||
1f8334dcb7 | |||
0252e9b4b7 | |||
13abd6596e | |||
d8ab7f158c | |||
5a97b67785 | |||
711aa564c1 | |||
f6987c72ac | |||
9107895754 | |||
3dbc175091 | |||
6dee3678fe | |||
f55550cdeb | |||
1446a20c70 | |||
eafaebb0f9 | |||
de0d7701f9 | |||
8e94c47362 | |||
48e9898db1 | |||
64dcd9d697 | |||
a7f337e8e4 | |||
24c047b662 | |||
e97bfe5696 | |||
fb9fed545e | |||
964bfb36d8 | |||
8b32157cf1 | |||
f5d5d26b0e | |||
9f4da44b59 | |||
ee0cbab4e4 | |||
c44e8e6bf1 | |||
5ceffb2c17 | |||
96648b651e | |||
31abd2f59b | |||
f6154dc0af | |||
a5955c1123 | |||
23f262c2e4 | |||
39640b264d | |||
4845770880 | |||
c2b6b7b179 | |||
777c5a8704 | |||
467304b470 | |||
c8ba5add8c | |||
bbcc09d426 | |||
01c07d120f | |||
0c1076c917 | |||
cff91a7674 | |||
fa8f9c286d | |||
ad22491cc0 | |||
1fc936965c | |||
9c062643e1 | |||
f9ad250112 | |||
990ad0e01d | |||
683974fa58 | |||
a3eee05cea | |||
93dae4ec1c | |||
84178ba38a | |||
46aaf8fa9a | |||
5a950cf991 | |||
75cb7f8b36 | |||
79cbf0888c | |||
10f237be95 | |||
85971d3d88 | |||
26b193d39d | |||
ab1b0cc840 | |||
9703ba5340 | |||
d09d06e4cb | |||
3ed76718a8 | |||
45aae00ad5 | |||
c62a16ae64 | |||
e6b93c1dbb | |||
350310c4c2 | |||
1811725b9d | |||
c0938fe372 | |||
0f25c74415 | |||
3ecb0ab161 | |||
16fb7c4557 | |||
8aafafe416 | |||
90cfd87f46 | |||
5ff89e1538 | |||
8b6968c665 | |||
6ef1b1b1a2 | |||
fc0e1955d7 | |||
c3b8123e32 | |||
b6ec3f655a | |||
e37840d870 | |||
85b7eb1fb8 | |||
541f5f1314 | |||
a3c7901f87 | |||
78ef0a9929 | |||
b0bb5d8dfc | |||
307fc18138 | |||
330f2dedf7 | |||
c5c074f201 | |||
b16e5bd136 | |||
e13f778b33 | |||
953142115c | |||
1eb5578063 | |||
9bc07c1a1c | |||
cbbdc98744 | |||
4229065a69 | |||
932436096f | |||
d95242cab0 | |||
4214a0618e | |||
c012f4f880 | |||
3e85aad80a | |||
648be3005f | |||
66165b1935 | |||
e9360ac892 | |||
1d234e10bd | |||
2a9de356db | |||
43f3f8a058 | |||
4998ba8866 | |||
d18291cf0c | |||
fe9371f06c | |||
05a15afadb | |||
93417912bb | |||
07a565a61a | |||
332b13dfd0 | |||
81477ea7ee | |||
39e84539cd | |||
6496fbf923 | |||
de57dd7c97 | |||
9985c010bc | |||
f7a328d66e | |||
50598bcefb | |||
9c38e9722a | |||
b241967fb9 | |||
1f86a6d329 | |||
7a6b5b0bfc | |||
e406791b7b | |||
4ce2f596ee | |||
567f71fe61 | |||
70bb5879f9 | |||
cfd2d84b14 | |||
44ab428803 | |||
b34b728fbb | |||
8ada1725bf | |||
873444c3c6 | |||
8bdd4fd061 | |||
f3b518fb62 |
@ -1,76 +1,12 @@
|
||||
version: 2.1
|
||||
|
||||
executors:
|
||||
default:
|
||||
working_directory: /tmp/workspace
|
||||
docker:
|
||||
- image: misskey/ci:v11-node11
|
||||
- image: circleci/redis:latest
|
||||
- image: circleci/postgres:latest
|
||||
docker:
|
||||
working_directory: /tmp/workspace
|
||||
docker:
|
||||
- image: docker:latest
|
||||
|
||||
jobs:
|
||||
build:
|
||||
executor: default
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Ensure yarn.lock
|
||||
command: |
|
||||
touch yarn.lock
|
||||
- restore_cache:
|
||||
name: Restore npm package caches
|
||||
keys:
|
||||
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-
|
||||
- yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-
|
||||
- yarn-v1-arch-{{ arch }}-
|
||||
- yarn-v1-
|
||||
- run:
|
||||
name: Install Dependencies
|
||||
command: |
|
||||
yarn install
|
||||
- run:
|
||||
name: Configure
|
||||
command: |
|
||||
cp .circleci/misskey/default.yml .config
|
||||
cp .circleci/misskey/test.yml .config
|
||||
- run:
|
||||
name: Build
|
||||
command: |
|
||||
yarn build
|
||||
touch yarn.lock
|
||||
- save_cache:
|
||||
name: Cache npm packages
|
||||
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||
paths:
|
||||
- node_modules
|
||||
- persist_to_workspace:
|
||||
root: .
|
||||
paths:
|
||||
- .
|
||||
test:
|
||||
parameters:
|
||||
executor:
|
||||
type: string
|
||||
default: "default"
|
||||
executor: <<parameters.executor>>
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: /tmp/workspace
|
||||
- run:
|
||||
name: Test
|
||||
command: |
|
||||
yarn test
|
||||
touch yarn.lock
|
||||
- save_cache:
|
||||
name: Cache npm packages
|
||||
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||
paths:
|
||||
- node_modules
|
||||
docker:
|
||||
parameters:
|
||||
with_deploy:
|
||||
@ -102,55 +38,8 @@ jobs:
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
nodejs:
|
||||
jobs:
|
||||
- hold:
|
||||
name: manual-build-trigger
|
||||
type: approval
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- build:
|
||||
name: manual-build
|
||||
requires:
|
||||
- manual-build-trigger
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- build:
|
||||
name: auto-build
|
||||
filters:
|
||||
branches:
|
||||
only: master
|
||||
- test:
|
||||
name: manual-test
|
||||
requires:
|
||||
- manual-build
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- test:
|
||||
name: auto-test
|
||||
requires:
|
||||
- auto-build
|
||||
filters:
|
||||
branches:
|
||||
only: master
|
||||
docker:
|
||||
jobs:
|
||||
- hold:
|
||||
name: manual-build-trigger
|
||||
type: approval
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- docker:
|
||||
name: manual-build
|
||||
requires:
|
||||
- manual-build-trigger
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- docker:
|
||||
name: auto-build
|
||||
with_deploy: true
|
||||
|
@ -1,12 +1,12 @@
|
||||
url: 'http://misskey.local'
|
||||
port: 80
|
||||
mongodb:
|
||||
port: 8080
|
||||
db:
|
||||
host: localhost
|
||||
port: 27017
|
||||
db: misskey
|
||||
user: syuilo
|
||||
port: 5432
|
||||
db: test-misskey
|
||||
user: postgres
|
||||
pass: ''
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
pass: ''
|
||||
id: aid
|
||||
|
@ -1,13 +1,12 @@
|
||||
url: 'http://misskey.local'
|
||||
port: 80
|
||||
mongodb:
|
||||
port: 8080
|
||||
db:
|
||||
host: localhost
|
||||
port: 27017
|
||||
port: 5432
|
||||
db: test-misskey
|
||||
user: admin
|
||||
user: postgres
|
||||
pass: ''
|
||||
# __REDIS__
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
pass: ''
|
||||
id: aid
|
||||
|
@ -88,7 +88,9 @@ redis:
|
||||
#elasticsearch:
|
||||
# host: localhost
|
||||
# port: 9200
|
||||
# pass: null
|
||||
# ssl: false
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
@ -111,10 +113,6 @@ id: 'aid'
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# If enabled:
|
||||
# The first account created is automatically marked as Admin.
|
||||
autoAdmin: true
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
@ -125,6 +123,14 @@ autoAdmin: true
|
||||
# deliverJobConcurrency: 128
|
||||
# inboxJobConcurrency: 16
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
# inboxJobMaxAttempts: 8
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
@ -140,3 +146,6 @@ autoAdmin: true
|
||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
1
.github/CODEOWNERS
vendored
@ -6,7 +6,6 @@
|
||||
/.github/ @syuilo @AyaMorisawa @acid-chicken
|
||||
/.vscode/ @acid-chicken
|
||||
/assets/ @syuilo # @tamaina
|
||||
/cli/ @syuilo
|
||||
/docs/ @syuilo
|
||||
/docs/*.en.md @AyaMorisawa # @skid9000
|
||||
# /docs/*.fr.md @BoFFire
|
||||
|
18
.github/workflows/docker.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
name: Docker build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Pull previous build result (for cache)
|
||||
run: docker pull misskey/misskey:latest
|
||||
- name: Build docker container
|
||||
run: docker build --cache-from misskey/misskey:latest -t misskey/misskey .
|
53
.github/workflows/nodejs.yml
vendored
Normal file
@ -0,0 +1,53 @@
|
||||
name: Node.js CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build_and_test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [11.10.x, 12.x]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:10-alpine
|
||||
ports:
|
||||
- 5432:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:alpine
|
||||
ports:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install dependencies
|
||||
run: yarn install
|
||||
- name: Copy Configure
|
||||
run: cp .circleci/misskey/*.yml .config
|
||||
- name: Build
|
||||
run: yarn build
|
||||
- name: Test
|
||||
run: yarn test
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
- run: yarn install
|
||||
- run: yarn lint
|
1
.gitignore
vendored
@ -7,6 +7,7 @@
|
||||
|
||||
# Node.js
|
||||
/node_modules
|
||||
report.*.json
|
||||
|
||||
# config
|
||||
/.config/*
|
||||
|
5
.imgbotconfig
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"ignoredFiles": [
|
||||
"test/resources/*"
|
||||
]
|
||||
}
|
4
.mocharc.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"timeout": 30000,
|
||||
"slow": 1000
|
||||
}
|
511
CHANGELOG.md
@ -1,6 +1,517 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
12.25.0 (2020/03/24)
|
||||
-------------------
|
||||
|
||||
### ✨Improvements
|
||||
* テーマインポート機能を実装
|
||||
|
||||
### 🐛Fixes
|
||||
* 誰もフォローしていないときにタイムラインの読み込みが遅い問題を修正
|
||||
|
||||
|
||||
12.24.2 (2020/03/22)
|
||||
-------------------
|
||||
|
||||
### 🐛Fixes
|
||||
* ダークモードの同期を修正
|
||||
|
||||
12.24.1 (2020/03/22)
|
||||
-------------------
|
||||
|
||||
### ✨Improvements
|
||||
* SVG形式のアイコンファイルを追加
|
||||
|
||||
### 🐛Fixes
|
||||
* iOSで起動できない問題を修正
|
||||
* 画面が小さいとメニューがすべて見えない問題を修正
|
||||
* Pages画面にタイトルがない問題を修正
|
||||
|
||||
12.24.0 (2020/03/22)
|
||||
-------------------
|
||||
|
||||
### ✨Improvements
|
||||
* クライアント設定にアカウント設定へのリンクを追加
|
||||
* ダークモードの同期を強化
|
||||
|
||||
### 🐛Fixes
|
||||
* 画面が小さいとメニューがすべて見えない問題を修正
|
||||
|
||||
12.23.0 (2020/03/22)
|
||||
-------------------
|
||||
|
||||
### ✨Improvements
|
||||
* 削除して編集できるように
|
||||
* 基底テーマ分離
|
||||
* 端末がダークモードか否かでテーマを切り替えられるように
|
||||
|
||||
### 🐛Fixes
|
||||
* ユーザー名のサジェストをアクティブであるユーザー順に表示するのがうまくいっていないのを修正
|
||||
* 招待コードが発行できない問題を修正
|
||||
* CIが通らない問題を修正
|
||||
|
||||
12.22.0 (2020/03/21)
|
||||
-------------------
|
||||
|
||||
### ✨Improvements
|
||||
* Web UI のデザインを大幅に変更
|
||||
* 通知のポップアップ表示を廃止
|
||||
* リモートユーザーであっても投稿数、フォロー・フォロワー数を表示
|
||||
* リモートユーザーであるという警告を投稿ページでも表示
|
||||
* ユーザー名のサジェストをアクティブであるユーザー順に表示
|
||||
* 通知音の音量スライダーなど、スライダーへのデザイン適用
|
||||
* リアクション設定機能を刷新
|
||||
* 同じホットキーが連続で発動しないように
|
||||
* 同じノートを何回リノートしても一回として数えるように
|
||||
* ElasticSearch で認証ができるように
|
||||
|
||||
### 🐛Fixes
|
||||
|
||||
* ユーザー名を設定していないユーザーのノートページのタイトルが「のノート」になる問題を修正
|
||||
* ソーシャルアカウントでの連携ログインができない問題を修正
|
||||
* アプリ認証画面でログインしたときに正常に遷移できない問題を修正
|
||||
* オブジェクトストレージでS3のvirtual-host形式のサポートなど
|
||||
* GIF 画像のバッジの色合いを修正
|
||||
* ノートのテキストがMFMの使い方によってははみ出る問題を修正
|
||||
* ダークテーマ利用時にセレクトが使いにくくなる問題を修正
|
||||
* ボリュームを0にしてもサウンドが鳴動している問題を修正
|
||||
* 検索窓のスタイルが適用されていなかった問題を修正
|
||||
|
||||
12.21.0 (2020/02/23)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* タイムラインに挿入されるおすすめノートに自分がリアクションしたものは含めないように
|
||||
* ノートのメニューに詳細ページへのリンクを追加
|
||||
* UIの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* チャットで自分の送信したURLが視認しにくい問題を修正
|
||||
* ノートの内のインラインコードが横に突き抜ける問題を修正
|
||||
* (新しいノートがあります)表示中にタイムラインを切り替えると、表示が消えなくなってしまう問題を修正
|
||||
* 引用RNフォームを開いた時だけ、textareaにフォーカスが当たっていない問題を修正
|
||||
|
||||
12.20.0 (2020/02/22)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* UIの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* 複数タブで開いてるときに動作がおかしい問題を修正
|
||||
* メディア付きノートの詳細表示をした後TLに戻るとノートがバグる問題を修正
|
||||
|
||||
12.19.0 (2020/02/21)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* アンテナで除外キーワードを設定できるように
|
||||
|
||||
### 🐛Fixes
|
||||
* ハッシュタグをもっと見るできないのを修正
|
||||
* 無効になっているタイムラインでも使用できるかのように表示される問題を修正
|
||||
* バックグラウンドで受信したノートの画像が表示されない問題を修正
|
||||
* サインインフォームが表示されない場所がある問題を修正
|
||||
* ボリュームが0のときサウンドを鳴らさないように
|
||||
|
||||
12.18.1 (2020/02/20)
|
||||
-------------------
|
||||
### 🐛Fixes
|
||||
* タイムラインのハイライトに自分のノートは含めないように
|
||||
* ハッシュタグの集計に関する問題を修正
|
||||
|
||||
12.18.0 (2020/02/20)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* 効果音設定を強化
|
||||
* UIの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* ユーザープレビューが稀に画面上から消えなくなってしまう問題を修正
|
||||
* ハッシュタグ検索が遅い問題を修正
|
||||
|
||||
12.17.0 (2020/02/20)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* 効果音を実装
|
||||
* 切断時ダイアログを控えめに
|
||||
|
||||
### 🐛Fixes
|
||||
* 新しいノートの通知が崩れる問題を修正
|
||||
* LegacyReaction変換にstarを追加
|
||||
* ユーザープレビューが稀に画面上から消えなくなってしまう問題を修正
|
||||
* media-listのgridの高さがsub-note-detailsのdetailsの中だと287pxになってしまっていたのを修正
|
||||
|
||||
12.16.0 (2020/02/19)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* 通知一覧をポップアップではなくページで表示できるように
|
||||
* 返信、引用、メンションの通知を直接ノートとして表示するように
|
||||
|
||||
### 🐛Fixes
|
||||
* v12以前のリアクションが表示されない問題を修正
|
||||
|
||||
12.15.0 (2020/02/19)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* 固定投稿フォームを実装
|
||||
* ページ遷移のトランジションを無しに
|
||||
* スクロールしてるときに新しいノートが来たときにわかるように表示するように
|
||||
|
||||
### 🐛Fixes
|
||||
* ページのいいねボタンを修正
|
||||
|
||||
12.14.0 (2020/02/18)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* オブジェクトストレージの設定を実装
|
||||
* サーバーログビューア実装
|
||||
|
||||
12.13.0 (2020/02/18)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* プロモーションノート機能を実装
|
||||
* インスタンス管理者が、重要なお知らせやユーザーにやってもらいたいアンケートなどをタイムラインの途中に挿入する機能
|
||||
* プロモーションされる期限を設定できる
|
||||
* 複数のプロモーションがある場合はランダムに選択されて表示される
|
||||
* ユーザーがプロモーションを個別に非表示にすることもできる
|
||||
* ハイライトインジェクション機能を実装
|
||||
* タイムラインの途中におすすめのノートを表示できる機能
|
||||
* 設定で有効/無効を切り替えられる
|
||||
* アクティビティウィジェットを実装
|
||||
* フォトウィジェットを実装
|
||||
* タイムラインの一番上までスクロールできるように
|
||||
* 管理者はモデレーターに変更できないように
|
||||
|
||||
### 🐛Fixes
|
||||
* admin/show-users APIがadminかつmoderator設定されているとき使えない問題を修正
|
||||
|
||||
12.12.0 (2020/02/17)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* インスタンス情報ページを強化
|
||||
* インスタンス設定ページを強化
|
||||
* 設定ページをアカウント設定ページとクライアント設定ページに分離
|
||||
* UIの調整
|
||||
|
||||
12.11.0 (2020/02/16)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* 投稿詳細ページで前後の投稿を見れるように
|
||||
* 自分のfollowersノートはRenoteできるように
|
||||
* 画像ダイアログを実装
|
||||
* フォロー申請ページの調整
|
||||
* 壁紙設定の強化
|
||||
* 画面が狭い状態でMisskeyを起動した場合でも、画面幅が広がったときにウィジェットを表示するように
|
||||
* 「もっと読み込む」したときの読み込み量を増量
|
||||
|
||||
### 🐛Fixes
|
||||
* 認証なしでグローバルTLにアクセスすると妙なエラーが返る問題を修正
|
||||
* API docが見れない問題を修正
|
||||
* 画面右上に当たり判定があるのを修正
|
||||
|
||||
12.10.0 (2020/02/15)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* アンテナの受信ソースにグループを指定できるように
|
||||
* 時計ウィジェットを追加
|
||||
* ログアウトせずに新しいアカウントを追加できるように
|
||||
* フォントサイズを設定できるように
|
||||
* APIキー設定を実装
|
||||
|
||||
### 🐛Fixes
|
||||
* v12アップデート後にトップページアクセスでOops!になっちゃうのを修正
|
||||
* drive/files APIのパフォーマンスを改善
|
||||
|
||||
12.9.0 (2020/02/14)
|
||||
-------------------
|
||||
### ✨Improvements
|
||||
* カスタム絵文字の管理を強化
|
||||
* 動きのあるMFMを無効にするオプションを追加
|
||||
|
||||
### 🐛Fixes
|
||||
* タイムラインに自分の返信と自分への返信と投稿者自身への返信以外の返信が含まれている問題を修正
|
||||
* グループがない状態でグループチャットを開始しようとするとフリーズする問題を修正
|
||||
* 通知インジケーターがずれる問題を修正
|
||||
* AP: 投稿を削除したときに関係する投稿の削除アクティビティが連合されない問題を修正
|
||||
|
||||
12.8.0 (2020/02/13)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* タイムラインなどを遡っているときは新しいアイテムが来てもスクロールしないように
|
||||
* 表示言語を切り替えられるように
|
||||
* グループに招待されたときの通知を追加
|
||||
* フランス語と関西弁を有効に
|
||||
* OSネイティブの絵文字を使用オプションを追加
|
||||
|
||||
### 🐛Fixes
|
||||
* リストを追加するとエラーが出る問題を修正
|
||||
* タイムラインを放置すると先頭の投稿が見えなくなるのを修正
|
||||
|
||||
12.7.1 (2020/02/11)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* 非ログイン時にページが表示されない問題を修正
|
||||
|
||||
12.7.0 (2020/02/10)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* ノートの文字数制限の設定を復活
|
||||
* デザインの調整
|
||||
|
||||
### 🐛Fixes
|
||||
* 中国語で表示できない問題を修正
|
||||
|
||||
12.6.0 (2020/02/10)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* リンクにホバーするとURLプレビューを表示するように
|
||||
* ユーザーページからグループに招待できるように
|
||||
* ウィジェットはブラウザごとに記憶するように
|
||||
|
||||
### 🐛Fixes
|
||||
* 要素の幅を判定する処理が上手くいかないことがある問題を修正
|
||||
|
||||
12.5.0 (2020/02/09)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* チュートリアルを実装
|
||||
* 検索のキーボードショートカットを追加
|
||||
* タイムラインを遡っている状況でないときに、誰かをフォローまたはフォロー解除したときにタイムラインをリロードするように
|
||||
|
||||
### 🐛Fixes
|
||||
* グループチャットが開始できない問題を修正
|
||||
* Renoteメニューが開けない問題を修正
|
||||
* 誕生日設定が崩れていたのを修正
|
||||
* キャッシュが削除できない問題を修正
|
||||
|
||||
12.4.1 (2020/02/09)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* グループの招待をacceptもrejectも出来ない問題を修正
|
||||
* 非ログイン時に検索欄がズレていたのを修正
|
||||
* バックグラウンドで受信したタイムラインの投稿のリアクションが受信されていない問題を修正
|
||||
|
||||
12.4.0 (2020/02/09)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* ローカルのみをデフォルトで操作できるように
|
||||
* キーボード操作を改善
|
||||
* AP: Create ActivityでattributedToの補完とaudienceのコピーを行うように
|
||||
|
||||
### 🐛Fixes
|
||||
* ページ遷移してもナビゲーションが閉じない問題を修正
|
||||
* デフォルトの公開範囲のリストにホームがなかったので復活
|
||||
|
||||
12.3.0 (2020/02/08)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* グループ実装
|
||||
* /share実装
|
||||
* 指定したURLのページが見つからなかった時のページを実装
|
||||
* ドキュメント実装
|
||||
* AP: EmojiReaction => EmojiReact
|
||||
|
||||
### 🐛Fixes
|
||||
* 画面の縦の幅が狭いとメニューが一部隠れる問題を修正
|
||||
* リストの設定ページが開けなかった問題を修正
|
||||
* drive-file-thumbnailのicon-subがおかしい問題を修正
|
||||
* ドライブのフォルダー名の変更と削除ができない問題を修正
|
||||
|
||||
12.2.0 (2020/02/06)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* UIのアニメーションを無効にできるように
|
||||
* トークで絵文字ピッカーを表示できるように
|
||||
* 戻るボタンだけでなく、ホームボタンを押してホームに戻ったときもスクロール位置を復元するように
|
||||
* タブを見ていないときのタイムライン通知を削除
|
||||
|
||||
### 🐛Fixes
|
||||
* PWAとしてインストールできなかったのを修正
|
||||
* トークでドライブからファイルを添付出来ない問題を修正
|
||||
|
||||
12.1.0 (2020/02/06)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* サーバー切断時に自動でリロードできるように
|
||||
|
||||
### 🐛Fixes
|
||||
* もっと読み込むを続けていくと表示が遅くなっていく問題を修正
|
||||
* Renote メニューが自分の投稿のRenoteでない限り表示されない問題を修正
|
||||
* MFM jump, spin, title が効かない問題を修正
|
||||
* AP: Likeで正しいActivity IDを提示するように修正
|
||||
* AP: Misskey以外からのトークの返信が受け取れないのを修正
|
||||
|
||||
12.0.0 indigo (2020/02/06)
|
||||
--------------------
|
||||
Misskey v12では、クライアントが設計し直され、全く新しいUIに生まれ変わりました。
|
||||
レスポンシブになり、ひとつのコードで様々なデバイスに対応できるようにしました。
|
||||
各部で使用されるアニメーションは、ブラウザネイティブのトランジションを使用することでよりスムーズになりました。
|
||||
目に見える変更だけではなく、内部的にも軽量化などの改善があります。
|
||||
また、指定した条件にマッチする投稿を抽出できるタイムラインの追加や、インタラクティブな通知など、新機能もいくつかあります。
|
||||
|
||||
まだ未実装の機能(ウィジェット、テーマエディタ、リバーシ、フグパンチボタンなど)がありますが、今後のアップデートで復活します。
|
||||
|
||||
内部的には、コンポーネントの重複が解消され、ローカリゼーションも整理されたので、今後メンテナンスしやすくなっています。
|
||||
さらに技術的なことを言うと、スタイルの記述に従来のStylusに代わってSCSSを採用し、開発の際にブラウザで編集したスタイルを持ってきやすくなるなどの改善が行なわれています。また、FontAwesomeコンポーネントに文字列形式でアイコンを指定するのをやめ、使用する都度アイコンをインポートするようにしました。これによりTree ShakingやCode Splittingとの相性が良くなります。
|
||||
|
||||
v12ではいくつかインスタンスにとって破壊的な変更がありますので、アップデートする前に以下の変更をお読みになりデータ(お知らせ)のバックアップなどお願いします。
|
||||
|
||||
アップデートが上手くいかない場合は、クリーンビルド(builtディレクトリを消した後、再度build)をお試しください。
|
||||
|
||||
### ⚠Breaking Changes
|
||||
* お知らせがリセットされます。
|
||||
* 通知がリセットされます。
|
||||
* アカウントの外部サービス連携情報がリセットされます。
|
||||
* インスタンスの閉鎖情報がリセットされます。
|
||||
* プロキシアカウント設定情報がリセットされます。
|
||||
* モデレーターがインスタンス設定を閲覧したり変更したりできなくなります(それらができるのはAdminのみになります)。
|
||||
* モデレーターが出来るのは、ユーザーのサイレンス/凍結などに限られます。
|
||||
* 従来と同じ権限を与えたい場合、モデレーターをAdminに設定することを検討してください(Adminは複数人設定可能です)。
|
||||
* notes/search APIのページングがoffsetではなくuntilId方式に
|
||||
* クライアントのテーマのフォーマットが調整されました。
|
||||
* 旧テーマを変換してインポートする機能が予定されています
|
||||
* ノートに位置情報を添付できる機能を廃止
|
||||
* ノートに何のアプリから投稿したかという情報を含めるのを廃止
|
||||
* Meta APIでサーバー内部の情報(マシン名、CPU情報など)を含めるのを廃止
|
||||
|
||||
### ✨Improvements
|
||||
* Webクライアントを一新
|
||||
* Syuilo Design System (仮称)を採用し、各コンポーネントが統一され一貫したデザインに
|
||||
* レスポンシブデザインになり、デスクトップ/タブレット/スマートフォンで同じ機能が使えるように
|
||||
* 複数アカウントに対応し、簡単に別のアカウントに切り替えられるように
|
||||
* フォロー通知から直接フォローバックすることができるように
|
||||
* 通知から直接フォローリクエストを許可/拒否できるように
|
||||
* ユーザーの登録日を表示するように
|
||||
* タイムラインウィジェットを追加
|
||||
* 投稿フォームでメンションを追加するのが簡単に
|
||||
* Renoteを解除できるように
|
||||
* スマホ/タブレットでも絵文字ピッカーを使えるように
|
||||
* ユーザーを選択する操作が便利に
|
||||
* ユーザーページからユーザーにメッセージを送れるように
|
||||
* ユーザーページからユーザーとトークを開始できるように
|
||||
* ユーザーページからユーザー名をコピーできるように
|
||||
* 非ログイン時のトップページにLTLではなくハイライトを表示するように
|
||||
* 「戻る」ボタンを追加し、PWAフレンドリーに
|
||||
* ストリーミングが切断された時にリロードできるようになり、PWAフレンドリーに
|
||||
* タイムラインからユーザーページ等に遷移して戻ったときにタイムラインが初期化されないように
|
||||
* 管理画面のカスタム絵文字一覧でページネーションを実装
|
||||
* 二段階認証のトークンの有効期限を長く
|
||||
* ESCキーでダイアログを閉じられるように
|
||||
* 軽量化
|
||||
* お知らせ機能の強化
|
||||
* お知らせが未読か既読か管理されるようになり、未読のお知らせがあると分かりやすく表示されるように
|
||||
* 何人がお知らせを読んだか分かるように
|
||||
* アンテナ機能
|
||||
* 指定した条件(キーワード、ファイル添付の有無など)にマッチする投稿のタイムラインを見れる機能
|
||||
* 新しい投稿があったとき通知するようにもできる
|
||||
* ウィジェットとしても表示可能
|
||||
* Elasticsearchをインストールしなくても全文検索できるように
|
||||
* リモートのカスタム絵文字をコピーしてくる機能を追加
|
||||
* 自分の送ったフォローリクエストが承認されたときの通知を追加
|
||||
* 絵文字判定正規表現と絵文字テーブルにUnicode 12.1分を追加
|
||||
* TwemojiではサポートしているけどピッカーにないShibuya 109の絵文字を追加
|
||||
* 韓国語のnyaizeを強化
|
||||
* 外部サービス連携情報をプロフィールに表示しないように
|
||||
* 今後個別に表示するかどうか設定できるようになる予定
|
||||
* ハイライト投稿の並びを人気順ではなく投稿日時順に
|
||||
* AIDのノイズがあまりよくないのを改善
|
||||
* WebAuthNで internal というタイプもあるようなのでそれも使えるように
|
||||
* Allow CORS requests in /.well-known/* routes
|
||||
* AP: リモート投稿にリモートでされたリアクションが表示されるように
|
||||
* AP: Eventタイプのアクティビティをサポート
|
||||
* AP: GroupとOrganizationを正規のActorとして受け付けるように
|
||||
* AP: deliver/inbox 処理にインスタンス全体で流量制限をかけられるように
|
||||
* AP: deliverのリトライ期間を長めにして、回数を変更できるように
|
||||
* AP: Actorの鍵とkeyIdのフォーマットの変更
|
||||
* 投稿する度にMastodonから3つずつリクエストが飛んできてしまう問題が解決し、双方の負荷が減って MastodonへのAP 配信所要時間が1/4~1/5に
|
||||
* PixelFedへの配信ができるように
|
||||
* AP: PixelFedのハッシュタグをハッシュタグ扱いできるように
|
||||
* 他多数
|
||||
|
||||
### 🐛Fixes
|
||||
* ミュートしている人からのリアクション通知があると、通知があると表示される問題を修正
|
||||
* 投稿メニューを開いて操作した後にもう一度メニューを開こうとしてもできない問題を修正
|
||||
* リモートのノートのURLが書かれていた場合、動作がおかしい問題を修正
|
||||
* リストTLだとTでのTLフォーカスが効かない問題を修正
|
||||
* OAuth認証画面の配色がおかしい問題を修正
|
||||
* 設定画面で、アバターを更新してもアバターの画像がその場で更新されない問題を修正
|
||||
* 投稿詳細/ユーザー詳細 画面でadminや公式アカウントマークが表示されない問題を修正
|
||||
* ハッシュタグ検索が遅い問題を修正
|
||||
* APIのリクエスト方法(websocket/HTTP)によって返ってくるエラーの内容に違いがある問題を修正
|
||||
* ストリーミングのuserListチャンネルで存在しないリストでもsubscribeできて、リストのIDがわかれば他人のリストでもsubscribeできる問題を修正
|
||||
* Redis subscriberで認証ができないのを修正
|
||||
* ファイルと画像認識処理の改善
|
||||
* カスタム絵文字リアクションでないものは絵文字クエリをしないように
|
||||
* トレンドで非公開な投稿のハッシュタグを集計しないように
|
||||
* nyaizeの適用範囲の修正
|
||||
* URLまでnyaizeされている問題を修正
|
||||
* ハッシュタグまでnyaizeされている問題を修正
|
||||
* 他
|
||||
* 投稿フォームでCWが下書きに保存されない問題を修正
|
||||
* 投稿フォームで公開範囲が下書きに保存されない問題を修正
|
||||
* messaging/messages/read APIが正しく動作していなかった問題を修正
|
||||
* TypeError: Cannot read property 'stack' of undefined が出ることがある問題を修正
|
||||
* AP: カスタム絵文字を連続して書くと他のサービスでカスタム絵文字と認識されない問題を修正
|
||||
* AP: audience (visibility) パースの修正
|
||||
* AP: inboxの最小リトライ間隔 1秒→1分
|
||||
* Pages: VERSION 変数が常に null な問題を修正
|
||||
* Pages: DRPWPMが最初のしか出てこない問題を修正
|
||||
* Pages: MY_NOTES_COUNT 変数が機能していなかったので削除
|
||||
* Pages: MY_FOLLOWERS_COUNT 変数が機能していなかったので削除
|
||||
* Pages: MY_FOLLOWING_COUNT 変数が機能していなかったので削除
|
||||
|
||||
11.37.1 (2020/01/07)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
* ファイルがアップロードできない問題を修正
|
||||
|
||||
11.37.0 (2020/01/07)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* AP引用でquoteUrlに対応
|
||||
* トークの既読を連合
|
||||
* 期限切れ/未保存リモートファイルのローカルプロキシ機能
|
||||
* ミュート/ブロックでページングと解除ができるように
|
||||
* Redis prefixにホスト名を使用するように
|
||||
* AP Resolverの長いエラーメッセージをトリムするように
|
||||
* 管理画面でstatsを継続リクエストしないように
|
||||
* 凍結ユーザーのプロファイルなどを表示しないように
|
||||
* クライアントで、thumbanilUrlが提供されていない画像はプレビューしないように
|
||||
* svgでも画像の平均色を計算するように
|
||||
* 画像の平均色を計算するとき、透過部分のある画像では一律で背景を#fff(白)に
|
||||
* Pages: 小数点を丸める関数を追加
|
||||
|
||||
### 🐛Fixes
|
||||
* カスタム絵文字リアクションの絵文字がNoteに添付されないのを修正
|
||||
* リモートプロキシ時にサムネイルのContent-Typeがおかしい問題を修正
|
||||
* /files/ 下のヘッダ設定タイミングを修正
|
||||
* イベントが同じRedisを使用する他のMisskeyインスタンスに飛んでしまう問題を修正
|
||||
* AP inbox Announce の処理の修正
|
||||
* followers, direct投稿の存在がユーザーの投稿一覧に表示されている問題を修正
|
||||
* Stacked bar chart がおかしいのを修正
|
||||
* リストのインポートがエラーが出るとそこで終わってしまう問題を修正
|
||||
* サムネイル/webpublicのファイル形式がjpeg/pngに固定されていたのをファイルを基に送出するように
|
||||
* syslogが使えない問題を修正
|
||||
|
||||
11.36.0 (2019/11/24)
|
||||
--------------------
|
||||
### ✨Improvements
|
||||
* ジョブキューで試行回数等を表示するように
|
||||
* deliverエラー等の同じようなログが複数出てこないように、上でまとめて出すように
|
||||
* deliverエラーのログではキューの詳細情報を格納しないように
|
||||
* inbox/deliverのログに試行回数とキューが作られてからの時間を表示するように
|
||||
* 無駄なAP deliverをしないように
|
||||
* boot: remove setAttribute() calls and translate reload msg
|
||||
|
||||
### 🐛Fixes
|
||||
* メンションの通知が届かない可能性がある問題を修正
|
||||
* ブロックや閉鎖済みインスタンスのステータスが更新されてしまう問題を修正
|
||||
* 「フォロワーを解除」アクティビティを正しく受け取らない問題を修正
|
||||
* inboxのジョブキューが表示されない問題を修正
|
||||
* ローカルにフォロワー限定投稿が流れてくる問題を修正
|
||||
* リモートユーザーのアイコンがサムネイルで表示されない問題を修正
|
||||
* DBとオブジェクトストレージのジョブキューが表示されない問題を修正
|
||||
* エラーが発生したときにサーバーがクラッシュすることがある問題を修正
|
||||
|
||||
11.35.1 (2019/11/05)
|
||||
--------------------
|
||||
### 🐛Fixes
|
||||
|
15
COPYING
Normal file
@ -0,0 +1,15 @@
|
||||
Unless otherwise stated this repository is
|
||||
Copyright © 2014-2020 syuilo and contributers
|
||||
|
||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||
|
||||
|
||||
Misskey includes several third-party Open-Source softwares.
|
||||
|
||||
Unicode emoji regular expressions by Twitter, Inc.
|
||||
License: MIT
|
||||
https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md
|
||||
|
||||
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
||||
License: MIT
|
||||
https://github.com/muan/emojilib/blob/master/LICENSE
|
96
README.md
@ -1,6 +1,6 @@
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
|
||||
|
||||
[](https://misskey.io/)
|
||||
[](https://join.misskey.page/)
|
||||
================================================================
|
||||
|
||||
[](https://circleci.com/gh/syuilo/misskey)
|
||||
@ -10,7 +10,7 @@
|
||||
**A forever evolving, sophisticated microblogging platform.**
|
||||
|
||||
<p align="justify">
|
||||
<a href="https://misskey.io">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||
<a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth.
|
||||
Since it exists within the Fediverse (a universe where various social media platforms are organized),
|
||||
it is mutually linked with other social media platforms.
|
||||
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://join.misskey.page/">Find an instance!</a>
|
||||
@ -89,6 +89,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
|
||||
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
|
||||
<td><img src="https://avatars2.githubusercontent.com/u/6533808?s=460&v=4" alt="rinsuki" width="100"></td>
|
||||
<td><img src="https://avatars0.githubusercontent.com/u/7973572?s=460&v=4" alt="tamaina" width="100"></td>
|
||||
<td><img src="https://avatars1.githubusercontent.com/u/7106976?s=460&v=4" alt="Xeltica" width="100"></td>
|
||||
<td><img src="https://avatars1.githubusercontent.com/u/17376330?s=460&v=4" alt="u1-liquid" width="100"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
|
||||
@ -96,6 +99,9 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
|
||||
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
|
||||
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
|
||||
<td align="center"><a href="https://github.com/tamaina">@tamaina</a></td>
|
||||
<td align="center"><a href="https://github.com/Xeltica">@Xeltica</a></td>
|
||||
<td align="center"><a href="https://github.com/u1-liquid">@u1-liquid</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@ -103,84 +109,102 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
----------------------------------------------------------------
|
||||
<!-- PATREON_START -->
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20010324/b8af4bd31ae34fbf8806cc0e6228e400/1.png?token-time=2145916800&token-hash=iyiocfousNIUwASmatsIDq8EOsmLUdrQNkWyktHlmJg%3D" alt="Nemo" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/20832595" alt="Roujo" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/27956229" alt="Oliver Maximilian Seidel" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/605366/c9dc408fdcbf412fb183ca5b06235f8d/1.jpeg?token-time=2145916800&token-hash=oaqsjLqOFjWN5I9hm2epOaTXaEtKwQUy5OW-EpAz6-g%3D" alt="Jon Leibowitz" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24430516/b1964ac5b9f746d2a12ff53dbc9aa40a/1.jpg?token-time=2145916800&token-hash=bmEiMGYpp3bS7hCCbymjGGsHBZM3AXuBOFO3Kro37PU%3D" alt="Eduardo Quiros" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/14215107/1cbe1912c26143919fa0faca16f12ce1/3.png?token-time=2145916800&token-hash=Zq1TCK2tdY7xudEm_aV70bc_wxmol6pNj3ZWbpFUNbI%3D" alt="Nesakko" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=20010324">Nemo</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=20832595">Roujo</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=27956229">Oliver Maximilian Seidel</a></td>
|
||||
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
|
||||
<td><a href="https://www.patreon.com/jonleibowitz">Jon Leibowitz</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=24430516">Eduardo Quiros</a></td>
|
||||
<td><a href="https://www.patreon.com/Nesakko">Nesakko</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/3075183/c2ae575c604e420297f000ccc396e395/1.jpeg?token-time=2145916800&token-hash=O9qmPtpo6wWb0OuvnkEekhk_1WO2MTdytLr7ZgsAr80%3D" alt="Liaizon Wakest" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/23915207/25428766ecd745478e600b3d7f871eb2/1.png?token-time=2145916800&token-hash=urCLLA4KjJZX92Y1CxcBP4d8bVTHGkiaPnQZp-Tqz68%3D" alt="kabo2468y" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8249688/4aacf36b6b244ab1bc6653591b6640df/2.png?token-time=2145916800&token-hash=1ZEf2w6L34253cZXS_HlVevLEENWS9QqrnxGUAYblPo%3D" alt="AureoleArk" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5788159/af42076ab3354bb49803cfba65f94bee/1.jpg?token-time=2145916800&token-hash=iSaxp_Yr2-ZiU2YVi9rcpZZj9mj3UvNSMrZr4CU4qtA%3D" alt="mewl hayabusa" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
|
||||
<td><a href="https://www.patreon.com/wakest">Liaizon Wakest</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=23915207">kabo2468y</a></td>
|
||||
<td><a href="https://www.patreon.com/AureoleArk">AureoleArk</a></td>
|
||||
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
|
||||
<td><a href="https://www.patreon.com/hs_sh_net">mewl hayabusa</a></td>
|
||||
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28779508/3cd4cb7f017f4ee0864341e3464d42f9/1.png?token-time=2145916800&token-hash=eGQtR15be44kgvh8fw2Jx8Db4Bv15YBp2ldxh0EKRxA%3D" alt="S Y" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/26340354/08834cf767b3449e93098ef73a434e2f/2.png?token-time=2145916800&token-hash=nyM8DnKRL8hR47HQ619mUzsqVRpkWZjgtgBU9RY15Uc%3D" alt="totokoro" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/20494440/540beaf2445f408ea6597bc61e077bb3/1.png?token-time=2145916800&token-hash=UJ0JQge64Bx9XmN_qYA1inMQhrWf4U91fqz7VAKJeSg%3D" alt="axtuki1" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpg?token-time=2145916800&token-hash=nVAntpybQrznE0rg05keLrSE6ogPKJXB13rmrJng42c%3D" alt="takimura" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=28779508">S Y</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16542964">Takumi Sugita</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
|
||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=26340354">totokoro</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=5827393">motcha</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=20494440">axtuki1</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5827393/59893c191dda408f9cabd0f20a3a5627/1.jpeg?token-time=2145916800&token-hash=i9N05vOph-eP1LTLb9_npATjYOpntL0ZsHNaZFSsPmE%3D" alt="motcha" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13100201/fc5be4fa90444f09a9c8a06f72385272/1.png?token-time=2145916800&token-hash=i8PjlgfOB2LPEdbtWyx8ZPsBKhGcNZqcw_FQmH71UGU%3D" alt="aqz tamaina" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/28295158/cd2451bfb94a449dbf705ef4718cd355/2.jpeg?token-time=2145916800&token-hash=MRv3BxufHPuCyiBSxU5UYmLGvD6YZlhtSFRfMWg2k4U%3D" alt="012" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9109588/e3cffc48d20a4e43afe04123e696781d/3.png?token-time=2145916800&token-hash=T_VIUA0IFIbleZv4pIjiszZGnQonwn34sLCYFIhakBo%3D" alt="nafuchoco" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/619ab87cc08448439222631ebb26802f/1.gif?token-time=2145916800&token-hash=o27K7M02s1z-LkDUEO5Oa7cu-GviRXeOXxryi4o_6VU%3D" alt="Atsuko Tominaga" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpg?token-time=2145916800&token-hash=7bkMqTwHPRsJPGAq42PYdDXDZBVGLqdgr1ZmBxX8GFQ%3D" alt="Hekovic" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/24641572/b4fd175424814f15b0ca9178d2d2d2e4/1.png?token-time=2145916800&token-hash=e2fyqdbuJbpCckHcwux7rbuW6OPkKdERcus0u2wIEWU%3D" alt="uroco @99" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=5827393">motcha</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
|
||||
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
|
||||
<td><a href="https://www.patreon.com/aqz">aqz tamaina</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=28295158">012</a></td>
|
||||
<td><a href="https://www.patreon.com/nijimiss">nafuchoco</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
|
||||
<td><a href="https://www.patreon.com/Corset">CG</a></td>
|
||||
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=24641572">uroco @99</a></td>
|
||||
</tr></table>
|
||||
<table><tr>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/23932002" alt="nenohi" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/9481273/7fa89168e72943859c3d3c96e424ed31/4.jpeg?token-time=2145916800&token-hash=5w1QV1qXe-NdWbdFmp1H7O_-QBsSiV0haumk3XTHIEg%3D" alt="Efertone" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
|
||||
</tr><tr>
|
||||
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
|
||||
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=23932002">nenohi</a></td>
|
||||
<td><a href="https://www.patreon.com/efertone">Efertone</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||
</tr></table>
|
||||
|
||||
**Last updated:** Sat, 02 Nov 2019 18:09:05 UTC
|
||||
**Last updated:** Tue, 17 Mar 2020 18:57:08 UTC
|
||||
<!-- PATREON_END -->
|
||||
|
||||
:four_leaf_clover: Copyright
|
||||
----------------------------------------------------------------
|
||||
> Copyright (c) 2014-2019 syuilo
|
||||
|
||||
Misskey is open-source software licensed under the [GNU AGPLv3](LICENSE).
|
||||
|
||||
[![][agpl-3.0-badge]][AGPL-3.0]
|
||||
|
||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=for-the-badge
|
||||
|
||||
[backer-url]: #backers
|
||||
[backer-badge]: https://opencollective.com/misskey/backers/badge.svg
|
||||
[backers-image]: https://opencollective.com/misskey/backers.svg
|
||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 6.8 KiB |
BIN
assets/favicon.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.9 KiB |
@ -1,53 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 135.46667 135.46667"
|
||||
height="512"
|
||||
width="512">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
style="fill:#2fa3bc;fill-opacity:1"
|
||||
transform="translate(-30.809093,-111.78601)"
|
||||
id="layer1">
|
||||
<g
|
||||
style="fill:#2fa3bc;fill-opacity:1"
|
||||
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
|
||||
id="g4502">
|
||||
<g
|
||||
id="g5125"
|
||||
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||
style="fill:#2fa3bc;fill-opacity:1">
|
||||
<g
|
||||
aria-label="Mi"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#2fa3bc;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="text4489"
|
||||
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
|
||||
<path
|
||||
id="path5210"
|
||||
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
|
||||
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#2fa3bc;fill-opacity:1;stroke-width:1.09609616px" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.1 KiB |
27
assets/icon.svg
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.413372,0,0,0.469741,64.564,40.5821)">
|
||||
<rect x="-156.189" y="-86.393" width="619.297" height="544.981" style="fill:rgb(27,30,31);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.898356,0,0,0.898356,-130.722,-120.968)">
|
||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,288,-166.277)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-96,166.277)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:rgb(150,208,74);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-96,498.831)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,-95.9902,55.4086)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,-0.866025,0.866025,0.5,-2.64322e-11,554.256)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.5,0.866025,-0.866025,0.5,192,-110.851)">
|
||||
<path d="M390.877,136.653C389.457,134.193 386.831,132.677 383.99,132.677C381.149,132.677 378.524,134.193 377.103,136.653C373.093,143.599 368.146,152.168 364.604,158.303C361.749,163.248 361.749,169.34 364.604,174.285C368.142,180.414 373.084,188.972 377.092,195.915C378.515,198.379 381.144,199.898 383.99,199.898C386.836,199.898 389.466,198.379 390.889,195.915C394.897,188.972 399.838,180.414 403.377,174.284C406.232,169.34 406.232,163.248 403.377,158.303C399.835,152.168 394.888,143.599 390.877,136.653ZM385.681,139.653C385.332,139.049 384.688,138.677 383.99,138.677C383.293,138.677 382.648,139.049 382.299,139.653C378.289,146.599 373.342,155.168 369.8,161.303C368.017,164.391 368.017,168.196 369.8,171.285C373.339,177.414 378.28,185.972 382.288,192.915C382.639,193.523 383.288,193.898 383.99,193.898C384.692,193.898 385.341,193.523 385.692,192.915C389.701,185.972 394.642,177.414 398.181,171.284C399.964,168.196 399.964,164.391 398.181,161.303L385.681,139.653Z" style="fill:white;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 430 B |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 671 B |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 1015 B |
@ -1,91 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 135.46667 135.46667"
|
||||
height="512"
|
||||
width="512"
|
||||
sodipodi:docname="icon.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
inkscape:export-filename="H:\misskey\assets\icons\512.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="965"
|
||||
id="namedview10"
|
||||
showgrid="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:zoom="0.921875"
|
||||
inkscape:cx="219.9952"
|
||||
inkscape:cy="361.00053"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg8" />
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<rect
|
||||
style="opacity:1;fill:#2ba3bc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.32291675;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
|
||||
id="rect828"
|
||||
width="135.46667"
|
||||
height="135.46667"
|
||||
x="1.896631e-16"
|
||||
y="0" />
|
||||
<g
|
||||
transform="matrix(0.57430748,0,0,0.57430748,11.070705,-35.453717)"
|
||||
id="layer1"
|
||||
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
|
||||
<g
|
||||
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
|
||||
id="g4502"
|
||||
style="stroke-width:1.74122751;fill:#ffffff;fill-opacity:1">
|
||||
<g
|
||||
id="g5125"
|
||||
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:1.74122751">
|
||||
<g
|
||||
aria-label="Mi"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.50409585px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="text4489"
|
||||
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
|
||||
<path
|
||||
id="path5210"
|
||||
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
|
||||
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#ffffff;fill-opacity:1;stroke-width:1.90855289px"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.6 KiB |
@ -1,51 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 135.46667 135.46667"
|
||||
height="512"
|
||||
width="512">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(-30.809093,-111.78601)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)"
|
||||
id="g4502">
|
||||
<g
|
||||
id="g5125"
|
||||
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||
style="fill:#000000;fill-opacity:1">
|
||||
<g
|
||||
aria-label="Mi"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="text4489"
|
||||
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)">
|
||||
<path
|
||||
id="path5210"
|
||||
transform="matrix(0.26412464,0,0,0.26412464,24.988264,136.28626)"
|
||||
d="m 62.474609,76.585938 c -7.47555,0 -14.595784,1.246427 -21.359375,3.738281 C 29.011968,84.595952 19.044417,92.249798 11.212891,103.28516 3.7373405,113.96451 0,125.88934 0,139.06055 v 233.8789 c 0,17.08697 6.0510264,31.85913 18.154297,44.31836 12.459246,12.10327 27.233346,18.15625 44.320312,18.15625 17.442947,0 32.215089,-6.05298 44.318361,-18.15625 12.45925,-12.45923 18.68945,-27.23139 18.68945,-44.31836 V 330.4082 c 0.13441,-9.21122 9.6225,-6.79429 14.41797,0 8.98111,15.55395 28.02226,28.91242 50.19141,28.83594 22.16915,-0.0764 40.58194,-11.03699 50.19336,-28.83594 3.63981,-4.29263 13.89902,-11.60675 14.95117,0 v 42.53125 c 0,17.08697 6.05102,31.85913 18.15429,44.31836 12.45923,12.10327 27.23335,18.15625 44.32032,18.15625 17.44294,0 32.21509,-6.05298 44.31836,-18.15625 12.45923,-12.45923 18.68945,-27.23139 18.68945,-44.31836 v -233.8789 c 0,-13.17121 -3.9146,-25.09604 -11.74609,-35.77539 -7.47557,-11.035362 -17.26588,-18.689208 -29.36914,-22.960941 -7.11956,-2.491854 -14.23982,-3.738281 -21.35938,-3.738281 -19.22286,0 -35.41865,7.476649 -48.58984,22.427734 l -63.40235,74.199218 c -1.42391,1.06791 -6.14093,9.23242 -16.16015,9.23242 -10.01923,0 -14.20109,-8.16451 -15.625,-9.23242 L 110.53125,99.013672 C 97.716024,84.062587 81.697447,76.585938 62.474609,76.585938 Z m 395.060551,0 c -14.9511,-10e-7 -27.76596,5.340179 -38.44532,16.019531 -10.32338,10.323381 -15.48437,22.961011 -15.48437,37.912111 0,14.9511 5.16099,27.76596 15.48437,38.44531 10.67936,10.32338 23.49422,15.48633 38.44532,15.48633 14.95109,0 27.76596,-5.16295 38.44531,-15.48633 C 506.65982,158.28354 512,145.46868 512,130.51758 512,115.56648 506.65982,102.92885 495.98047,92.605469 485.30112,81.926117 472.48625,76.585938 457.53516,76.585938 Z m 0.5332,118.541012 c -14.9511,0 -27.76596,5.34018 -38.44531,16.01953 -10.67936,10.67936 -16.01758,23.49422 -16.01758,38.44532 v 131.89062 c 0,14.9511 5.33822,27.76596 16.01758,38.44531 10.67935,10.32339 23.49421,15.48633 38.44531,15.48633 14.9511,0 27.58873,-5.16294 37.91211,-15.48633 C 506.65982,409.24838 512,396.43352 512,381.48242 V 249.5918 c 0,-14.9511 -5.34018,-27.76596 -16.01953,-38.44532 -10.32338,-10.67935 -22.96101,-16.01953 -37.91211,-16.01953 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill:#000000;fill-opacity:1;stroke-width:1.09609616px" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.1 KiB |
@ -88,7 +88,7 @@ Just `docker-compose up -d`. GLHF!
|
||||
7. `docker-compose stop && docker-compose up -d`
|
||||
|
||||
### How to execute [cli commands](manage.en.md):
|
||||
`docker-compose run --rm web node cli/mark-admin @example`
|
||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
|
@ -55,7 +55,7 @@ Utilisez la commande `docker-compose up -d`. GLHF!
|
||||
7. `docker-compose stop && docker-compose up -d`
|
||||
|
||||
### Comment exécuter des [commandes](manage.fr.md)
|
||||
`docker-compose run --rm web node cli/mark-admin @example`
|
||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||
|
||||
### Configuration d'ElasticSearch (pour la fonction de recherche)
|
||||
*1.* Préparation de l'environnement
|
||||
|
@ -89,7 +89,7 @@ docker-compose run --rm web yarn run init
|
||||
|
||||
### cliコマンドを実行する方法:
|
||||
|
||||
`docker-compose run --rm web node cli/mark-admin @example`
|
||||
`docker-compose run --rm web node built/tools/mark-admin @example`
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
|
@ -5,14 +5,10 @@ coming soon
|
||||
|
||||
## Mark as 'admin' user
|
||||
``` shell
|
||||
node cli/mark-admin (User-ID or Username)
|
||||
node built/tools/mark-admin (Username)
|
||||
```
|
||||
|
||||
e.g.
|
||||
``` shell
|
||||
# By id
|
||||
node cli/mark-admin 57d01a501fdf2d07be417afe
|
||||
|
||||
# By username
|
||||
node cli/suspend @syuilo
|
||||
node built/tools/mark-admin @syuilo
|
||||
```
|
||||
|
@ -5,14 +5,10 @@ coming soon
|
||||
|
||||
## Marquer un utilisateur en tant que 'admin'
|
||||
``` shell
|
||||
node cli/mark-admin (ID utilisateur ou nom d'utilisateur)
|
||||
node built/tools/mark-admin (nom d'utilisateur)
|
||||
```
|
||||
|
||||
Exemple :
|
||||
``` shell
|
||||
# Par id
|
||||
node cli/mark-admin 57d01a501fdf2d07be417afe
|
||||
|
||||
# Par nom d'utilisateur
|
||||
node cli/suspend @syuilo
|
||||
node built/tools/mark-admin @syuilo
|
||||
```
|
||||
|
@ -5,14 +5,10 @@ coming soon
|
||||
|
||||
## 管理者ユーザーを設定する
|
||||
``` shell
|
||||
node cli/mark-admin (ユーザーID または ユーザー名)
|
||||
node built/tools/mark-admin (ユーザー名)
|
||||
```
|
||||
|
||||
例:
|
||||
``` shell
|
||||
# ユーザーID
|
||||
node cli/mark-admin 57d01a501fdf2d07be417afe
|
||||
|
||||
# ユーザー名
|
||||
node cli/mark-admin @syuilo
|
||||
node built/tools/mark-admin @syuilo
|
||||
```
|
||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
||||
Please install and setup these softwares:
|
||||
|
||||
#### Dependencies :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.10.1
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
||||
Installez les paquets suivants :
|
||||
|
||||
#### Dépendences :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.7.0
|
||||
* **[Node.js](https://nodejs.org/en/)** >= 11.10.1
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** >= 10
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
||||
これらのソフトウェアをインストール・設定してください:
|
||||
|
||||
#### 依存関係 :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** (11.7.0以上)
|
||||
* **[Node.js](https://nodejs.org/en/)** (11.10.1以上)
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** (10以上)
|
||||
* **[Redis](https://redis.io/)**
|
||||
|
||||
|
162
gulpfile.ts
@ -2,43 +2,26 @@
|
||||
* Gulp tasks
|
||||
*/
|
||||
|
||||
import * as fs from 'fs';
|
||||
import * as gulp from 'gulp';
|
||||
import * as gutil from 'gulp-util';
|
||||
import * as ts from 'gulp-typescript';
|
||||
const sourcemaps = require('gulp-sourcemaps');
|
||||
import tslint from 'gulp-tslint';
|
||||
const cssnano = require('gulp-cssnano');
|
||||
const stylus = require('gulp-stylus');
|
||||
import * as uglifyComposer from 'gulp-uglify/composer';
|
||||
import * as rimraf from 'rimraf';
|
||||
import chalk from 'chalk';
|
||||
import * as rename from 'gulp-rename';
|
||||
import * as mocha from 'gulp-mocha';
|
||||
import * as replace from 'gulp-replace';
|
||||
const uglifyes = require('uglify-es');
|
||||
import * as rimraf from 'rimraf';
|
||||
import * as rename from 'gulp-rename';
|
||||
const cleanCSS = require('gulp-clean-css');
|
||||
const sass = require('gulp-dart-sass');
|
||||
const fiber = require('fibers');
|
||||
|
||||
const locales = require('./locales');
|
||||
|
||||
const uglify = uglifyComposer(uglifyes, console);
|
||||
|
||||
const env = process.env.NODE_ENV || 'development';
|
||||
const isProduction = env === 'production';
|
||||
const isDebug = !isProduction;
|
||||
|
||||
if (isDebug) {
|
||||
console.warn(chalk.yellow.bold('WARNING! NODE_ENV is not "production".'));
|
||||
console.warn(chalk.yellow.bold(' built script will not be compressed.'));
|
||||
}
|
||||
const meta = require('./package.json');
|
||||
|
||||
gulp.task('build:ts', () => {
|
||||
const tsProject = ts.createProject('./tsconfig.json');
|
||||
|
||||
return tsProject
|
||||
.src()
|
||||
.pipe(sourcemaps.init())
|
||||
.pipe(tsProject())
|
||||
.on('error', () => {})
|
||||
.pipe(sourcemaps.write('.', { includeContent: false, sourceRoot: '../built' }))
|
||||
.pipe(gulp.dest('./built/'));
|
||||
});
|
||||
|
||||
@ -46,37 +29,70 @@ gulp.task('build:copy:views', () =>
|
||||
gulp.src('./src/server/web/views/**/*').pipe(gulp.dest('./built/server/web/views'))
|
||||
);
|
||||
|
||||
gulp.task('build:copy:fonts', () =>
|
||||
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/client/assets/fonts/'))
|
||||
);
|
||||
gulp.task('build:copy:locales', cb => {
|
||||
fs.mkdirSync('./built/client/assets/locales', { recursive: true });
|
||||
|
||||
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:fonts', () =>
|
||||
for (const [lang, locale] of Object.entries(locales)) {
|
||||
fs.writeFileSync(`./built/client/assets/locales/${lang}.${meta.version}.json`, JSON.stringify(locale), 'utf-8');
|
||||
}
|
||||
|
||||
cb();
|
||||
});
|
||||
|
||||
gulp.task('build:copy', gulp.parallel('build:copy:views', 'build:copy:locales', () =>
|
||||
gulp.src([
|
||||
'./src/const.json',
|
||||
'./src/emojilist.json',
|
||||
'./src/server/web/views/**/*',
|
||||
'./src/**/assets/**/*',
|
||||
'!./src/client/app/**/assets/**/*'
|
||||
'!./src/client/assets/**/*'
|
||||
]).pipe(gulp.dest('./built/'))
|
||||
));
|
||||
|
||||
gulp.task('lint', () =>
|
||||
gulp.src('./src/**/*.ts')
|
||||
.pipe(tslint({
|
||||
formatter: 'verbose'
|
||||
}))
|
||||
.pipe(tslint.report())
|
||||
gulp.task('clean', cb =>
|
||||
rimraf('./built', cb)
|
||||
);
|
||||
|
||||
gulp.task('format', () =>
|
||||
gulp.src('./src/**/*.ts')
|
||||
.pipe(tslint({
|
||||
formatter: 'verbose',
|
||||
fix: true
|
||||
}))
|
||||
.pipe(tslint.report())
|
||||
gulp.task('cleanall', gulp.parallel('clean', cb =>
|
||||
rimraf('./node_modules', cb)
|
||||
));
|
||||
|
||||
gulp.task('build:client:styles', () =>
|
||||
gulp.src('./src/client/style.scss')
|
||||
.pipe(sass({ fiber }))
|
||||
.pipe(cleanCSS())
|
||||
.pipe(gulp.dest('./built/client/assets/'))
|
||||
);
|
||||
|
||||
gulp.task('copy:client', () =>
|
||||
gulp.src([
|
||||
'./assets/**/*',
|
||||
'./src/client/assets/**/*',
|
||||
])
|
||||
.pipe(rename(path => {
|
||||
path.dirname = path.dirname!.replace('assets', '.');
|
||||
}))
|
||||
.pipe(gulp.dest('./built/client/assets/'))
|
||||
);
|
||||
|
||||
gulp.task('copy:docs', () =>
|
||||
gulp.src([
|
||||
'./src/docs/**/*',
|
||||
])
|
||||
.pipe(gulp.dest('./built/client/assets/docs/'))
|
||||
);
|
||||
|
||||
gulp.task('build:client', gulp.parallel(
|
||||
'build:client:styles',
|
||||
'copy:client',
|
||||
'copy:docs'
|
||||
));
|
||||
|
||||
gulp.task('build', gulp.parallel(
|
||||
'build:ts',
|
||||
'build:copy',
|
||||
'build:client',
|
||||
));
|
||||
|
||||
gulp.task('mocha', () =>
|
||||
gulp.src('./test/**/*.ts')
|
||||
.pipe(mocha({
|
||||
@ -87,64 +103,4 @@ gulp.task('mocha', () =>
|
||||
|
||||
gulp.task('test', gulp.task('mocha'));
|
||||
|
||||
gulp.task('clean', cb =>
|
||||
rimraf('./built', cb)
|
||||
);
|
||||
|
||||
gulp.task('cleanall', gulp.parallel('clean', cb =>
|
||||
rimraf('./node_modules', cb)
|
||||
));
|
||||
|
||||
gulp.task('build:client:script', () => {
|
||||
const client = require('./built/meta.json');
|
||||
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
|
||||
.pipe(replace('VERSION', JSON.stringify(client.version)))
|
||||
.pipe(replace('ENV', JSON.stringify(env)))
|
||||
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||
.pipe(isProduction ? uglify({
|
||||
toplevel: true
|
||||
} as any) : gutil.noop())
|
||||
.pipe(gulp.dest('./built/client/assets/'));
|
||||
});
|
||||
|
||||
gulp.task('build:client:styles', () =>
|
||||
gulp.src('./src/client/app/init.css')
|
||||
.pipe(isProduction
|
||||
? (cssnano as any)()
|
||||
: gutil.noop())
|
||||
.pipe(gulp.dest('./built/client/assets/'))
|
||||
);
|
||||
|
||||
gulp.task('copy:client', () =>
|
||||
gulp.src([
|
||||
'./assets/**/*',
|
||||
'./src/client/assets/**/*',
|
||||
'./src/client/app/*/assets/**/*'
|
||||
])
|
||||
.pipe(rename(path => {
|
||||
path.dirname = path.dirname!.replace('assets', '.');
|
||||
}))
|
||||
.pipe(gulp.dest('./built/client/assets/'))
|
||||
);
|
||||
|
||||
gulp.task('doc', () =>
|
||||
gulp.src('./src/docs/**/*.styl')
|
||||
.pipe(stylus())
|
||||
.pipe((cssnano as any)())
|
||||
.pipe(gulp.dest('./built/docs/assets/'))
|
||||
);
|
||||
|
||||
gulp.task('build:client', gulp.parallel(
|
||||
'build:client:script',
|
||||
'build:client:styles',
|
||||
'copy:client'
|
||||
));
|
||||
|
||||
gulp.task('build', gulp.parallel(
|
||||
'build:ts',
|
||||
'build:copy',
|
||||
'build:client',
|
||||
'doc'
|
||||
));
|
||||
|
||||
gulp.task('default', gulp.task('build'));
|
||||
|
@ -1 +0,0 @@
|
||||
---
|
1479
locales/cs-CZ.yml
1917
locales/da-DK.yml
1571
locales/de-DE.yml
2737
locales/en-US.yml
2022
locales/es-ES.yml
2613
locales/fr-FR.yml
@ -14,19 +14,19 @@ const merge = (...args) => args.reduce((a, c) => ({
|
||||
}), {});
|
||||
|
||||
const languages = [
|
||||
'cs-CZ',
|
||||
'da-DK',
|
||||
'de-DE',
|
||||
//'cs-CZ',
|
||||
//'da-DK',
|
||||
//'de-DE',
|
||||
'en-US',
|
||||
'es-ES',
|
||||
'fr-FR',
|
||||
'ja-JP',
|
||||
'ja-KS',
|
||||
'ko-KR',
|
||||
'nl-NL',
|
||||
'pl-PL',
|
||||
//'nl-NL',
|
||||
//'pl-PL',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
//'zh-TW',
|
||||
];
|
||||
|
||||
const primaries = {
|
||||
|
@ -1,6 +0,0 @@
|
||||
---
|
||||
meta:
|
||||
lang: "Italiano"
|
||||
common:
|
||||
misskey: "A ⭐ of the fediverse"
|
||||
about-title: "A ⭐ of the fediverse."
|
2812
locales/ja-JP.yml
1419
locales/ja-KS.yml
65
locales/kn-IN.yml
Normal file
@ -0,0 +1,65 @@
|
||||
---
|
||||
_lang_: "ಕನ್ನಡ"
|
||||
introMisskey: "ಸ್ವಾಗತ! Misskey ಓಪನ್ ಸೋರ್ಸ್ ಒಕ್ಕೂಟ ಮೈಕ್ರೋಬ್ಲಾಗಿಂಗ್ ಸೇವೆಯಾಗಿದೆ.\n ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ನಿಮ್ಮ ಬಗ್ಗೆ ಎಲ್ಲರಿಗೂ ಹೇಳಲು \"ಟಿಪ್ಪಣಿ\"ಗಳನ್ನು ರಚಿಸಿ📡\n \"ಸ್ಪಂದನೆ\" ಕ್ರಿಯೆಯೊಂದಿಗೆ, ನೀವು ಎಲ್ಲರ ಟಿಪ್ಪಣಿಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸ್ಪಂದನೆಗಳನ್ನು ಕೂಡ ಸೇರಿಸಬಹುದು.👍\n ಹೊಸ ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿ🚀"
|
||||
monthAndDay: "{month}ನೇ ತಿಂಗಳ {day}ನೇ ದಿನ"
|
||||
search: "ಹುಡುಕು"
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
||||
password: "ಗುಪ್ತಪದ"
|
||||
fetchingAsApObject: "ಒಕ್ಕೂಟದಿಂದ ಪಡೆಯಲಾಗುತ್ತಿದೆ..."
|
||||
ok: "ಸರಿ"
|
||||
gotIt: "ಅರ್ಥವಾಯಿತು!"
|
||||
cancel: "ರದ್ದು"
|
||||
enterUsername: "ಬಳಕೆಹೆಸರನ್ನು ಭರ್ತಿ ಮಾಡಿ"
|
||||
renotedBy: "{user} ಪುನರಾವರ್ತಿಸಿದರು"
|
||||
noNotes: "ಟಿಪ್ಪಣಿಗಳಿಲ್ಲ"
|
||||
noNotifications: "ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"
|
||||
instance: "ನಿದರ್ಶನ"
|
||||
settings: "ಸಿದ್ಧತೆಗಳು"
|
||||
profile: "ಪ್ರೊಫೈಲು"
|
||||
timeline: "ಸಮಯಸಾಲು"
|
||||
noAccountDescription: "ಇವರು ಸ್ವಯಂ ಪರಿಚಯ ರಚಿಸಿಲ್ಲ"
|
||||
login: "ಪ್ರವೇಶ"
|
||||
loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..."
|
||||
logout: "ಆಚೆಗೆ"
|
||||
signup: "ನೋಂದಣಿ"
|
||||
uploading: "ಅಪ್ಲೋಡಾಗುತ್ತಿದೆ"
|
||||
save: "ಉಳಿಸಿ"
|
||||
users: "ಬಳಕೆದಾರ"
|
||||
addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"
|
||||
favorite: "ಮೆಚ್ಚಿನ"
|
||||
favorites: "ಮೆಚ್ಚಿನವುಗಳು"
|
||||
unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು"
|
||||
pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ"
|
||||
copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು"
|
||||
copyLink: "ಲಿಂಕನ್ನು ನಕಲಿಸು"
|
||||
delete: "ಅಳಿಸು"
|
||||
addToList: "ಪಟ್ಟಿಗೆ ಸೇರಿಸು"
|
||||
sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು"
|
||||
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||
importAndExport: "ಆಮದು/ರಫ್ತು"
|
||||
import: "ಆಮದು"
|
||||
export: "ರಫ್ತು"
|
||||
files: "ಕಡತಗಳು"
|
||||
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||
instances: "ನಿದರ್ಶನ"
|
||||
remove: "ಅಳಿಸು"
|
||||
_sfx:
|
||||
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
_widgets:
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
timeline: "ಸಮಯಸಾಲು"
|
||||
_cw:
|
||||
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
_profile:
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
2665
locales/ko-KR.yml
@ -1,701 +1,2 @@
|
||||
---
|
||||
meta:
|
||||
lang: "Nederlands"
|
||||
common:
|
||||
misskey: "Deel alles met anderen die ook Misskey gebruiken."
|
||||
about-title: "Een ster van het fediverse"
|
||||
about: "Bedankt voor het ontdekken van Misskey. Misskey is een <b>gedecentraliseerd microblogging platform</b> geboren op aarde. Omdat het bestaat binnen het Fediverse (een georganiseerd universum van verschillende sociale mediaplatformen), staat het verbonden met andere sociale medieplatformen. Neem een pauze van de stedelijke drukte, en duik in het nieuwe intenet?"
|
||||
intro:
|
||||
title: "Wat is Misskey?"
|
||||
about: "Misskey is een open source <b>gedecentraliseerd blogplatform</b>. Het heeft een gesofisticeerde, volledig aanpasbare gebruikersinterface, uitgebreide reactiemogelijkheden voor posts, gratis geïntegreerd bestandsoplagbeheer en andere geavanceerde mogelijkheden. Daarnaast staat Misskey verbonden aan een netwerksysteem genaam het \"Fediverse\", hiermee kunnen we communiceren met andere gebruikers op andere SNSs. Dit betekent dat wanneer je iets post het niet enkel verstuurd wordt naar andere Misskey gebruikers, maar ook naar gebruikers op Mastodon en Pleroma. Stel je voor dat een planeet een radiosignaal verzendt naar een andere planeet als manier van communiceren."
|
||||
features: "Kenmerken"
|
||||
rich-contents: "Bericht"
|
||||
rich-contents-desc: "Post jouw idee, hot topic, wat je ook maar wil delen. Maak jouw teksten aantrekkelijk met je favoriete foto's, verzend bestanden, zelfs video's, of maak een poll. Dit zijn enkele van de mogelijkheden die Misskey aanbiedt!"
|
||||
reaction: "Reactie"
|
||||
reaction-desc: "Dé makkelijkste manier om jouw gevoelens uit te drukken. Met Misskey kan je verschillende reacties toevoegen aan jouw posts. Andere SNSs hebben enkel maar een \"vind ik leuk\" reactie."
|
||||
ui: "Interface"
|
||||
ui-desc: "Niet één UI past nij iedereen. Daarom heeft Misskey een uitgebreide keuze om de UI naar jouw hand te zetten. Je kan jouw nieuwe thuis zo origineel maken als je zelf wil door jouw tijdslijn aan te passen door widgets te verplaatsen en hun look te veranderen. Zo maak je van Misskey jouw eigen stek."
|
||||
drive: "Drive"
|
||||
drive-desc: "Wil je een foto posten die je reeds het geüpload? Wens je georganiseerde map met zelfgekozen naam maken voor al jouw bestanden? De beste oplossing voor jou is Misskey Drive. Dit maakt het supermakkelijk om jouw bestanden online te delen."
|
||||
application-authorization: "Geauthoriseerde applicaties"
|
||||
close: "Sluiten"
|
||||
do-not-copy-paste: "Gelieve de code hier niet in te geven of te plakken. De account kan gecompromiseerd zijn."
|
||||
load-more: "Laad meer resultaten"
|
||||
enter-password: "Voer het wachtwoord in"
|
||||
2fa: "Tweestapsverificatie"
|
||||
customize-home: "Layout aanpassen"
|
||||
featured-notes: "Uitgelicht"
|
||||
dark-mode: "Donker thema"
|
||||
signin: "Aanmelden"
|
||||
signup: "Registreren"
|
||||
signout: "Afmelden"
|
||||
reload-to-apply-the-setting: "Herlaad de pagina om je aanpassingen te bekijken. Wil je de pagina nu herladen?"
|
||||
fetching-as-ap-object: "Verzenden naar Fediverse"
|
||||
unfollow-confirm: "Wil stoppen met {name} te volgen?"
|
||||
delete-confirm: "Ben je zeker dat je dit bericht wil verwijderen?"
|
||||
signin-required: "Gelieve in te loggen"
|
||||
notification-type: "Notificatietype"
|
||||
notification-types:
|
||||
all: "Alle"
|
||||
pollVote: "Stemmen"
|
||||
follow: "Volgend"
|
||||
receiveFollowRequest: "Volgverzoeken"
|
||||
reply: "Beantwoorden"
|
||||
quote: "Bron"
|
||||
mention: "Vermeldingen"
|
||||
reaction: "Reactie"
|
||||
got-it: "Ik snap het!"
|
||||
customization-tips:
|
||||
title: "Aanpassingstips"
|
||||
gotit: "Ik snap het!"
|
||||
notification:
|
||||
file-uploaded: "Je bestand is geüpload"
|
||||
message-from: "Bericht van {}:"
|
||||
reversi-invited: "Uitgenodigd voor spel"
|
||||
notified-by: "Bemerkt door: {}"
|
||||
reply-from: "Antwoord van: {}"
|
||||
quoted-by: "Geciteerd door: {}"
|
||||
time:
|
||||
unknown: "onbekend"
|
||||
future: "toekomstig"
|
||||
just_now: "zojuist"
|
||||
seconds_ago: "{}s geleden"
|
||||
minutes_ago: "{}m geleden"
|
||||
hours_ago: "{}u geleden"
|
||||
days_ago: "{}d geleden"
|
||||
weeks_ago: "{}week/weken geleden"
|
||||
months_ago: "{}maand(en) geleden"
|
||||
years_ago: "{}jaar geleden"
|
||||
month-and-day: "{day} {month}"
|
||||
trash: "Prullenbak"
|
||||
drive: "Drive"
|
||||
pages: "Pagina's"
|
||||
messaging: "Gesprekken"
|
||||
home: "Startpagina"
|
||||
deck: "Deck"
|
||||
timeline: "Tijdlijn"
|
||||
followers: "Volgers"
|
||||
favorites: "Deze notitie toevoegen aan favorieten"
|
||||
permissions:
|
||||
"write:votes": "Stemmen"
|
||||
post-form:
|
||||
submit: "Bericht"
|
||||
reply: "Beantwoorden"
|
||||
add-visible-user: "Gebruiker toevoegen"
|
||||
weekday-short:
|
||||
sunday: "Z"
|
||||
monday: "M"
|
||||
tuesday: "D"
|
||||
wednesday: "W"
|
||||
thursday: "D"
|
||||
friday: "V"
|
||||
saturday: "Z"
|
||||
reactions:
|
||||
like: "Leuk"
|
||||
love: "Geweldig"
|
||||
laugh: "Grappig"
|
||||
hmm: "Eh...?"
|
||||
surprise: "Wauw"
|
||||
congrats: "Gefeliciteerd!"
|
||||
angry: "Boos"
|
||||
confused: "Verward"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
home: "Startpagina"
|
||||
followers: "Volgers"
|
||||
_settings:
|
||||
profile: "Je profiel"
|
||||
notification: "Meldingen"
|
||||
password: "Wachtwoord"
|
||||
reactions: "Reactie"
|
||||
deck-column-align-center: "Centreren"
|
||||
deck-column-align-left: "Links"
|
||||
timeline: "Tijdlijn"
|
||||
navbar-position-left: "Links"
|
||||
search: "Zoeken"
|
||||
delete: "Verwijderen"
|
||||
loading: "Bezig met laden"
|
||||
update-available: "Er is een nieuwe versie van Misskey beschikbaar: {newer} (de huidige versie is {current}). Herlaad de pagina om de update toe te passen."
|
||||
my-token-regenerated: "Je sleutel is gegenereerd; je wordt nu uitgelogd."
|
||||
widgets:
|
||||
profile: "Je profiel"
|
||||
activity: "Activiteit"
|
||||
trends: "Populair"
|
||||
photo-stream: "Fotostream"
|
||||
notifications: "Meldingen"
|
||||
users: "Aanbevolen gebruikers"
|
||||
server: "Serverinformatie"
|
||||
you: "Jij"
|
||||
auth/views/form.vue:
|
||||
cancel: "Annuleren"
|
||||
auth/views/index.vue:
|
||||
loading: "Bezig met laden"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
cancel: "Annuleren"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
cancel: "Annuleren"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Verbinden met server mislukt"
|
||||
description: "Er is een probleem met je internetverbinding, de server ligt plat of er wordt aan gewerkt. {Probeer} het later opnieuw."
|
||||
thanks: "Bedankt voor het gebruiken van Misskey."
|
||||
troubleshoot: "Probleemoplossing"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
title: "Probleemoplossing"
|
||||
network: "Netwerkverbinding"
|
||||
checking-network: "Bezig met controleren van netwerkverbinding"
|
||||
internet: "Internetverbinding"
|
||||
checking-internet: "Bezig met controleren van internetverbinding"
|
||||
server: "Serververbinding"
|
||||
checking-server: "Bezig met controleren van serververbinding"
|
||||
finding: "Bezig met vaststellen van probleem"
|
||||
no-network: "Er is geen internetverbinding"
|
||||
no-network-desc: "Zorg ervoor dat je verbonden bent met een netwerk."
|
||||
no-internet: "Er is geen internetverbinding"
|
||||
no-internet-desc: "Zorg ervoor dat je verbonden bent met het internet."
|
||||
no-server: "Verbinden met Misskey-server mislukt"
|
||||
no-server-desc: "De netwerkverbinding van je computer is goed, maar er kan geen verbinding worden gemaakt met de Misskey-server. Het kan dat de server plat ligt of dat eraan wordt gewerkt. Probeer het later opnieuw."
|
||||
success: "Verbonden met de Misskey-server"
|
||||
success-desc: "Het verbinden lijkt te lukken. Herlaad de pagina."
|
||||
flush: "Cache leegmaken"
|
||||
set-version: "Versie opgeven"
|
||||
common/views/components/theme.vue:
|
||||
desc: "Omschrijving"
|
||||
common/views/components/messaging.vue:
|
||||
search-user: "Gebruiker zoeken"
|
||||
you: "Jij"
|
||||
no-history: "Geen geschiedenis"
|
||||
user: "Gebruiker"
|
||||
common/views/components/messaging-room.vue:
|
||||
no-history: "Er is geen verdere geschiedenis"
|
||||
new-message: "Nieuw bericht"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "Voer hier je bericht in"
|
||||
send: "Versturen"
|
||||
attach-from-local: "Bestanden bijvoegen van je computer"
|
||||
attach-from-drive: "Bestanden bijvoegen van je Drive"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Gelezen"
|
||||
deleted: "Dit bericht is verwijderd"
|
||||
common/views/components/nav.vue:
|
||||
about: "Over"
|
||||
stats: "Statistieken"
|
||||
status: "Status"
|
||||
donors: "Donateurs"
|
||||
repository: "Broncode"
|
||||
develop: "Ontwikkelaars"
|
||||
feedback: "Feedback"
|
||||
common/views/components/note-menu.vue:
|
||||
favorite: "Deze notitie toevoegen aan favorieten"
|
||||
pin: "Vastmaken aan profielpagina"
|
||||
delete: "Verwijderen"
|
||||
remote: "Origineel tonen"
|
||||
common/views/components/poll.vue:
|
||||
vote-to: "Stemmen op '{}'"
|
||||
vote-count: "{} stemmen"
|
||||
vote: "Stemmen"
|
||||
show-result: "Resultaten tonen"
|
||||
voted: "Gestemd"
|
||||
common/views/components/poll-editor.vue:
|
||||
no-only-one-choice: "Je moet twee of meer keuzes invoeren."
|
||||
choice-n: "Keuze {}"
|
||||
remove: "Deze keuze verwijderen"
|
||||
add: "+ Keuze toevoegen"
|
||||
destroy: "Deze peiling vernietigen"
|
||||
day: "Z"
|
||||
common/views/components/reaction-picker.vue:
|
||||
choose-reaction: "Kies een reactie"
|
||||
common/views/components/emoji-picker.vue:
|
||||
activity: "Activiteit"
|
||||
common/views/components/signin.vue:
|
||||
username: "Gebruikersnaam"
|
||||
password: "Wachtwoord"
|
||||
token: "Sleutel"
|
||||
signing-in: "Bezig met inloggen..."
|
||||
common/views/components/signup.vue:
|
||||
username: "Gebruikersnaam"
|
||||
checking: "Bezig met controleren..."
|
||||
available: "Beschikbaar"
|
||||
unavailable: "Niet beschikbaar"
|
||||
error: "Netwerkfout"
|
||||
invalid-format: "Gebruik alleen letters, cijfers en -."
|
||||
too-short: "Voer minimaal 1 teken in!"
|
||||
too-long: "Voer maximaal 20 tekens in."
|
||||
password: "Wachtwoord"
|
||||
password-placeholder: "Wij raden aan meer dan 8 tekens te gebruiken."
|
||||
weak-password: "Zwak"
|
||||
normal-password: "'t Ken net"
|
||||
strong-password: "Sterk"
|
||||
retype: "Opnieuw invoeren"
|
||||
retype-placeholder: "Wachtwoord bevestigen"
|
||||
password-matched: "Oké"
|
||||
password-not-matched: "Komt niet overeen"
|
||||
recaptcha: "Verifiëren"
|
||||
create: "Account creëren"
|
||||
some-error: "Het creëren van een account is mislukt. Probeer het opnieuw."
|
||||
common/views/components/special-message.vue:
|
||||
new-year: "Gelukkig nieuwjaar!"
|
||||
christmas: "Fijne kerstdagen!"
|
||||
common/views/components/stream-indicator.vue:
|
||||
connecting: "Bezig met verbinden"
|
||||
reconnecting: "Bezig met herverbinden"
|
||||
connected: "Verbonden"
|
||||
common/views/components/notification-settings.vue:
|
||||
title: "Meldingen"
|
||||
common/views/components/github-setting.vue:
|
||||
detail: "Details bekijken..."
|
||||
common/views/components/discord-setting.vue:
|
||||
detail: "Details bekijken..."
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Bezig met wachten"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
home: "Startpagina"
|
||||
followers: "Volgers"
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "Je profiel"
|
||||
name: "Naam"
|
||||
avatar: "Gebruikersafbeelding"
|
||||
banner: "Omslagfoto"
|
||||
unable-to-process: "De operatie kan niet worden voltooid."
|
||||
export-targets:
|
||||
following-list: "Volgend"
|
||||
user-lists: "Lijsten"
|
||||
enter-password: "Voer het wachtwoord in"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Gebruiker"
|
||||
add-user: "Gebruiker toevoegen"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Lijsten"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Bezig met ophalen"
|
||||
no-broadcasts: "Geen uitzendingen"
|
||||
have-a-nice-day: "Fijne dag!"
|
||||
next: "Volgende"
|
||||
common/views/widgets/photo-stream.vue:
|
||||
title: "Fotostream"
|
||||
no-photos: "Geen foto's"
|
||||
common/views/widgets/posts-monitor.vue:
|
||||
toggle: "Schakelen tussen weergaven"
|
||||
common/views/widgets/server.vue:
|
||||
title: "Serverinformatie"
|
||||
toggle: "Schakelen tussen weergaven"
|
||||
common/views/pages/follow.vue:
|
||||
signed-in-as: "Ingelogd als {}"
|
||||
follow: "Volgend"
|
||||
desktop:
|
||||
banner: "Omslagfoto"
|
||||
avatar: "Gebruikersafbeelding"
|
||||
unable-to-process: "De operatie kan niet worden voltooid."
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Zwart ... totaal"
|
||||
notes: "Blauw ... notities"
|
||||
replies: "Rood ... antwoorden"
|
||||
renotes: "Groen ... gedeelde notities"
|
||||
desktop/views/components/activity.vue:
|
||||
title: "Activiteit"
|
||||
toggle: "Schakelen tussen weergaven"
|
||||
desktop/views/components/calendar.vue:
|
||||
prev: "Vorige maand"
|
||||
next: "Volgende maand"
|
||||
go: "Klik om te navigeren"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
upload: "Bestanden uploaden van je computer"
|
||||
cancel: "Annuleren"
|
||||
ok: "Oké"
|
||||
choose-prompt: "Kies een bestand"
|
||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||
cancel: "Annuleren"
|
||||
ok: "Oké"
|
||||
choose-prompt: "Kies een map"
|
||||
desktop/views/components/crop-window.vue:
|
||||
skip: "Bijsnijden overslaan"
|
||||
cancel: "Annuleren"
|
||||
ok: "Oké"
|
||||
desktop/views/components/drive-window.vue:
|
||||
used: "gebruikt"
|
||||
desktop/views/components/drive.file.vue:
|
||||
avatar: "Gebruikersafbeelding"
|
||||
banner: "Omslagfoto"
|
||||
contextmenu:
|
||||
rename: "Naam wijzigen"
|
||||
copy-url: "URL kopiëren"
|
||||
download: "Downloaden"
|
||||
set-as-avatar: "Instellen als gebruikersafbeelding"
|
||||
set-as-banner: "Instellen als omslagfoto"
|
||||
open-in-app: "Openen in app"
|
||||
add-app: "App toevoegen"
|
||||
rename-file: "Bestandsnaam wijzigen"
|
||||
input-new-file-name: "Voer een nieuwe naam in"
|
||||
copied: "Gekopieerd"
|
||||
copied-url-to-clipboard: "URL gekopieerd naar klembord"
|
||||
desktop/views/components/drive.folder.vue:
|
||||
unable-to-process: "De operatie kan niet worden voltooid."
|
||||
circular-reference-detected: "De bestemmingsmap is een submap van de map die je wilt verplaatsen."
|
||||
unhandled-error: "Onbekende fout"
|
||||
contextmenu:
|
||||
move-to-this-folder: "Verplaatsen naar deze map"
|
||||
show-in-new-window: "Openen in nieuw venster"
|
||||
rename: "Naam wijzigen"
|
||||
rename-folder: "Mapnaam wijzigen"
|
||||
input-new-folder-name: "Voer een nieuwe naam in"
|
||||
desktop/views/components/drive.vue:
|
||||
search: "Zoeken"
|
||||
empty-draghover: "Welkom!"
|
||||
empty-drive: "Je schijf is leeg"
|
||||
empty-drive-description: "Je kunt ook uploaden door te klikken met de rechtermuisknop en te kiezen voor \"Bestand uploaden\" of door een bestand naar dit venster te slepen."
|
||||
empty-folder: "Deze map is leeg"
|
||||
unable-to-process: "De operatie kan niet worden voltooid."
|
||||
circular-reference-detected: "De bestemmingsmap is een submap van de te verplaatsen map."
|
||||
unhandled-error: "Onbekende fout"
|
||||
url-upload: "Uploaden via URL"
|
||||
url-of-file: "URL van het te uploaden bestand"
|
||||
url-upload-requested: "Uploadverzoek"
|
||||
may-take-time: "Het kan even duren voordat het uploaden voltooid is."
|
||||
create-folder: "Map creëren"
|
||||
folder-name: "Mapnaam"
|
||||
contextmenu:
|
||||
create-folder: "Map creëren"
|
||||
upload: "Bestand uploaden"
|
||||
url-upload: "Uploaden via URL"
|
||||
desktop/views/components/followers-window.vue:
|
||||
followers: "Volgers van {}"
|
||||
desktop/views/components/followers.vue:
|
||||
empty: "Het lijkt erop dat je geen volgers hebt."
|
||||
desktop/views/components/following-window.vue:
|
||||
following: "Volgend {}"
|
||||
desktop/views/components/following.vue:
|
||||
empty: "Je volgt niemand."
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Othello"
|
||||
desktop/views/components/home.vue:
|
||||
done: "Versturen"
|
||||
add-widget: "Widget toevoegen:"
|
||||
add: "Toevoegen"
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Annuleren"
|
||||
ok: "Oké"
|
||||
desktop/views/components/note-detail.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
location: "Locatie"
|
||||
add-reaction: "Reactie"
|
||||
desktop/views/components/note.vue:
|
||||
reply: "Beantwoorden"
|
||||
add-reaction: "Reactie"
|
||||
private: "(dit bericht is privé)"
|
||||
desktop/views/components/notes.vue:
|
||||
error: "Laden mislukt."
|
||||
retry: "Opnieuw proberen"
|
||||
desktop/views/components/notifications.vue:
|
||||
empty: "Geen meldingen"
|
||||
desktop/views/components/post-form.vue:
|
||||
posted: "Geplaatst!"
|
||||
replied: "Beantwoord!"
|
||||
reposted: "Hergeplaatst!"
|
||||
note-failed: "Noteren mislukt"
|
||||
reply-failed: "Beantwoorden mislukt"
|
||||
renote-failed: "Renote mislukt"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nieuwe notitie"
|
||||
reply: "Beantwoorden"
|
||||
attaches: "{} media bijgevoegd"
|
||||
uploading-media: "Bezig met uploaden van media {}"
|
||||
desktop/views/components/progress-dialog.vue:
|
||||
waiting: "Bezig met wachten"
|
||||
desktop/views/components/renote-form.vue:
|
||||
quote: "Citeren..."
|
||||
cancel: "Annuleren"
|
||||
reposting: "Bezig met herplaatsen..."
|
||||
success: "Hergeplaatst!"
|
||||
failure: "Renote mislukt"
|
||||
desktop/views/components/renote-form-window.vue:
|
||||
title: "Weet je zeker dat je deze notitie wilt renoten?"
|
||||
desktop/views/components/settings.2fa.vue:
|
||||
intro: "Als je verificatie in twee stappen instelt, dan heb je niet alleen een wachtwoord nodig bij het inloggen, maar ook een geregistreerd fysiek apparaat (zoals je smartphone). Dit verhoogt de veiligheid. "
|
||||
detail: "Details bekijken..."
|
||||
url: "https://www.google.com/landing/2step/"
|
||||
caution: "Als je geen toegang meer hebt tot je apparaat, dan kun je niet meer verbinden met Misskey!"
|
||||
register: "Apparaat registreren"
|
||||
already-registered: "Er is al een apparaat geregistreerd"
|
||||
unregister: "Uitschakelen"
|
||||
unregistered: "Authenticatie in twee stappen is uitgeschakeld."
|
||||
enter-password: "Voer het wachtwoord in"
|
||||
authenticator: "Installeer eerst Google Authenticator op je apparaat:"
|
||||
howtoinstall: "Hoe installeer ik dit?"
|
||||
token: "Sleutel"
|
||||
scan: "Scan daarna de QR-code:"
|
||||
done: "Voer de op je apparaat getoonde sleutel in:"
|
||||
submit: "Versturen"
|
||||
success: "Instellen voltooid!"
|
||||
failed: "Instellen mislukt. Zorg ervoor dat de sleutel juist is."
|
||||
info: "Vanaf nu moet je ook de op je apparaat getoonde sleutel tonen bij het inloggen op Misskey."
|
||||
common/views/components/api-settings.vue:
|
||||
enter-password: "Voer het wachtwoord in"
|
||||
console:
|
||||
parameter: "Parameters"
|
||||
send: "Versturen"
|
||||
common/views/components/drive-settings.vue:
|
||||
in-use: "gebruikt"
|
||||
stats: "Statistieken"
|
||||
default-upload-folder-name: "Map(pen)"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
poll: "Peilingen"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
add: "Toevoegen"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Startpagina"
|
||||
local: "Lokaal"
|
||||
global: "Algemeen"
|
||||
list: "Lijsten"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Je profiel"
|
||||
lists: "Lijsten"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
game: "Othello spelen"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Meldingen"
|
||||
desktop/views/components/ui.header.post.vue:
|
||||
post: "Nieuw bericht opstellen"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Zoeken"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Berichten"
|
||||
following: "Volgend"
|
||||
followers: "Volgers"
|
||||
desktop/views/components/users-list.vue:
|
||||
all: "Alle"
|
||||
iknow: "die ik ken"
|
||||
fetching: "Bezig met laden…"
|
||||
desktop/views/components/users-list-item.vue:
|
||||
followed: "Volgt jou"
|
||||
desktop/views/components/window.vue:
|
||||
popout: "Uitvouwen"
|
||||
close: "Sluiten"
|
||||
admin/views/index.vue:
|
||||
users: "Gebruiker"
|
||||
admin/views/dashboard.vue:
|
||||
notes: "Bericht"
|
||||
drive: "Drive"
|
||||
admin/views/abuse.vue:
|
||||
remove-report: "Verwijderen"
|
||||
admin/views/charts.vue:
|
||||
notes: "Bericht"
|
||||
users: "Gebruiker"
|
||||
drive: "Drive"
|
||||
admin/views/drive.vue:
|
||||
origin:
|
||||
local: "Lokaal"
|
||||
delete: "Verwijderen"
|
||||
admin/views/users.vue:
|
||||
username: "Gebruikersnaam"
|
||||
users:
|
||||
title: "Gebruiker"
|
||||
state:
|
||||
all: "Alle"
|
||||
origin:
|
||||
local: "Lokaal"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
add: "Toevoegen"
|
||||
emojis:
|
||||
remove: "Verwijderen"
|
||||
admin/views/announcements.vue:
|
||||
remove: "Verwijderen"
|
||||
add: "Toevoegen"
|
||||
admin/views/federation.vue:
|
||||
notes: "Bericht"
|
||||
users: "Gebruiker"
|
||||
followers: "Volgers"
|
||||
status: "Status"
|
||||
states:
|
||||
all: "Alle"
|
||||
desktop/views/pages/welcome.vue:
|
||||
timeline: "Tijdlijn"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Vorige notitie"
|
||||
next: "Volgende notitie"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
title: "Bestand(en) kiezen"
|
||||
ok: "Oké"
|
||||
cancel: "Annuleren"
|
||||
upload: "Bestanden uploaden van je PC"
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
users: "Gebruiker"
|
||||
add-user: "Gebruiker toevoegen"
|
||||
username: "Gebruikersnaam"
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
title: "Volgers die je kent"
|
||||
loading: "Bezig met laden"
|
||||
no-users: "Geen gebruikers"
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
title: "Frequent beantwoord"
|
||||
loading: "Bezig met laden"
|
||||
no-users: "Geen gebruikers"
|
||||
desktop/views/pages/user/user.photos.vue:
|
||||
title: "Foto's"
|
||||
loading: "Bezig met laden"
|
||||
no-photos: "Geen foto's"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Bericht"
|
||||
following: "Volgend"
|
||||
followers: "Volgers"
|
||||
month: "M"
|
||||
day: "Z"
|
||||
follows-you: "Volgt jou"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Berichten"
|
||||
with-replies: "Berichten en antwoorden"
|
||||
with-media: "Media"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Meldingen"
|
||||
desktop/views/widgets/polls.vue:
|
||||
title: "Peilingen"
|
||||
refresh: "Anderen tonen"
|
||||
nothing: "Niks"
|
||||
desktop/views/widgets/post-form.vue:
|
||||
title: "Bericht"
|
||||
note: "Bericht"
|
||||
desktop/views/widgets/profile.vue:
|
||||
update-banner: "Klik om je omslagfoto te wijzigen"
|
||||
update-avatar: "Klik om je gebruikersafbeelding te wijzigen"
|
||||
desktop/views/widgets/trends.vue:
|
||||
title: "Populair"
|
||||
refresh: "Anderen tonen"
|
||||
nothing: "Niks"
|
||||
desktop/views/widgets/users.vue:
|
||||
title: "Aanbevolen gebruikers"
|
||||
refresh: "Anderen tonen"
|
||||
no-one: "Niemand"
|
||||
mobile/views/components/drive.vue:
|
||||
used: "gebruikt"
|
||||
folder-count: "Map(pen)"
|
||||
count-separator: ", "
|
||||
file-count: "Bestand(en)"
|
||||
nothing-in-drive: "Niks"
|
||||
folder-is-empty: "Deze map is leeg"
|
||||
folder-name: "Mapnaam"
|
||||
url-prompt: "URL van het te uploaden bestand"
|
||||
mobile/views/components/drive-file-chooser.vue:
|
||||
select-file: "Kies een bestand"
|
||||
mobile/views/components/drive-folder-chooser.vue:
|
||||
select-folder: "Kies een map"
|
||||
mobile/views/components/drive.file-detail.vue:
|
||||
download: "Downloaden"
|
||||
rename: "Naam wijzigen"
|
||||
move: "Verplaatsen"
|
||||
hash: "Hash (md5)"
|
||||
common/views/components/follow-button.vue:
|
||||
follow: "Volgend"
|
||||
mobile/views/components/note.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
location: "Locatie"
|
||||
mobile/views/components/note-detail.vue:
|
||||
reply: "Beantwoorden"
|
||||
reaction: "Reactie"
|
||||
private: "(dit bericht is privé)"
|
||||
location: "Locatie"
|
||||
mobile/views/components/notifications.vue:
|
||||
empty: "Geen meldingen"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
private: "(dit bericht is privé)"
|
||||
media-count: "{} media"
|
||||
poll: "Peiling"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Tijdlijn"
|
||||
notifications: "Meldingen"
|
||||
search: "Zoeken"
|
||||
user-lists: "Lijsten"
|
||||
game: "Othello spelen"
|
||||
about: "Over Misskey"
|
||||
mobile/views/pages/drive.vue:
|
||||
contextmenu:
|
||||
upload: "Bestand uploaden"
|
||||
create-folder: "Map creëren"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Startpagina"
|
||||
local: "Lokaal"
|
||||
global: "Algemeen"
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Toevoegen"
|
||||
customization-tips: "Aanpassingstips"
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Activiteit"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Bericht"
|
||||
prev: "Vorige notitie"
|
||||
next: "Volgende notitie"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Othello"
|
||||
mobile/views/pages/search.vue:
|
||||
search: "Zoeken"
|
||||
mobile/views/pages/selectdrive.vue:
|
||||
select-file: "Kies een bestand"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Meldingen"
|
||||
mobile/views/pages/settings.vue:
|
||||
signed-in-as: "Ingelogd als {}"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "Volgt jou"
|
||||
following: "Volgend"
|
||||
followers: "Volgers"
|
||||
notes: "Berichten"
|
||||
overview: "Overzicht"
|
||||
timeline: "Tijdlijn"
|
||||
media: "Media"
|
||||
mobile/views/pages/user/home.vue:
|
||||
recent-notes: "Recente notities"
|
||||
images: "Afbeeldingen"
|
||||
activity: "Activiteit"
|
||||
keywords: "Sleutelwoorden"
|
||||
domains: "Domeinnamen"
|
||||
frequently-replied-users: "Frequent beantwoord"
|
||||
followers-you-know: "Volgers die je kent"
|
||||
last-used-at: "Laatst actief"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Geen foto's"
|
||||
deck:
|
||||
home: "Startpagina"
|
||||
local: "Lokaal"
|
||||
global: "Algemeen"
|
||||
notifications: "Meldingen"
|
||||
list: "Lijsten"
|
||||
rename: "Naam wijzigen"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "Volgt jou"
|
||||
posts: "Bericht"
|
||||
following: "Volgend"
|
||||
followers: "Volgers"
|
||||
images: "Afbeeldingen"
|
||||
activity: "Activiteit"
|
||||
timeline: "Tijdlijn"
|
||||
docs:
|
||||
edit-this-page-on-github: "Heb je een fout ontdekt of wil je bijdragen aan de documentatie? "
|
||||
edit-this-page-on-github-link: "Bewerk deze pagina op GitHub!"
|
||||
pages:
|
||||
pin-this-page: "Vastmaken aan profielpagina"
|
||||
like: "Leuk"
|
||||
blocks:
|
||||
image: "Afbeeldingen"
|
||||
script:
|
||||
categories:
|
||||
list: "Lijsten"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lijsten"
|
||||
_randomPick:
|
||||
arg1: "Lijsten"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lijsten"
|
||||
_seedRandomPick:
|
||||
arg2: "Lijsten"
|
||||
_pick:
|
||||
arg1: "Lijsten"
|
||||
_listLen:
|
||||
arg1: "Lijsten"
|
||||
types:
|
||||
array: "Lijsten"
|
||||
room:
|
||||
translate: "Verplaatsen"
|
||||
furnitures:
|
||||
moon: "Maan"
|
||||
bin: "Prullenbak"
|
||||
_lang_: "Nederlands"
|
||||
|
@ -1,528 +1,2 @@
|
||||
---
|
||||
meta:
|
||||
lang: "Norsk Bokmål"
|
||||
common:
|
||||
misskey: "En ⭐ av fediverse"
|
||||
about-title: "En ⭐ av fediverse"
|
||||
about: "Takk for at du fant Misskey. Misskey er en <b>desentralisert mikroblogging platform</b> født på jorden. Siden den eksisterer sammen med Fediverset (Et univers hvor forskjellige sosiale media-plattformer blir organisert), så blir den gjensidig tilknyttet med andre sosiale media-plattformer. Hvorfor ikke ta en pause fra kjas og mas fra storbyen og hoppe inn i en ny type internett?"
|
||||
intro:
|
||||
title: "Hva er Misskey?"
|
||||
features: "Funksjoner"
|
||||
rich-contents: "Innlegg"
|
||||
drive: "Disk"
|
||||
close: "Lukk"
|
||||
notification-types:
|
||||
all: "Alle"
|
||||
follow: "Følger"
|
||||
reply: "Svar"
|
||||
got-it: "Skjønner!"
|
||||
notification:
|
||||
file-uploaded: "Filen ble lastet opp!"
|
||||
message-from: "Melding fra {}:"
|
||||
reversi-invited: "Invitert til et spill"
|
||||
reversi-invited-by: "Invitert av {}:"
|
||||
notified-by: "Invitert av {}:"
|
||||
reply-from: "Svar fra {}:"
|
||||
quoted-by: "Sitert av {}:"
|
||||
time:
|
||||
unknown: "ukjent"
|
||||
future: "fremtidig"
|
||||
just_now: "akkurat nå"
|
||||
seconds_ago: "{} sekunder siden"
|
||||
minutes_ago: "{} minutter siden"
|
||||
hours_ago: "{} t siden"
|
||||
days_ago: "{} d siden"
|
||||
weeks_ago: "{} uke(r) siden"
|
||||
months_ago: "{} måned(er) siden"
|
||||
years_ago: "{} år siden"
|
||||
month-and-day: "{day}/{month}"
|
||||
trash: "Papirkurv"
|
||||
drive: "Disk"
|
||||
home: "Hjem"
|
||||
followers: "Følgere"
|
||||
favorites: "Merket som favoritt"
|
||||
permissions:
|
||||
"write:votes": "Stem"
|
||||
post-form:
|
||||
submit: "Innlegg"
|
||||
reply: "Svar"
|
||||
error: "Feil"
|
||||
weekday-short:
|
||||
sunday: "S"
|
||||
monday: "M"
|
||||
tuesday: "T"
|
||||
wednesday: "O"
|
||||
thursday: "T"
|
||||
friday: "F"
|
||||
saturday: "L"
|
||||
weekday:
|
||||
sunday: "Søndag"
|
||||
monday: "Mandag"
|
||||
tuesday: "Tirsdag"
|
||||
wednesday: "Onsdag"
|
||||
thursday: "Torsdag"
|
||||
friday: "Fredag"
|
||||
saturday: "Lørdag"
|
||||
reactions:
|
||||
like: "Lik"
|
||||
love: "Elsk"
|
||||
laugh: "Le"
|
||||
hmm: "Hmm…?"
|
||||
surprise: "Wow"
|
||||
congrats: "Gratulerer!"
|
||||
angry: "Sint"
|
||||
confused: "Forvirret"
|
||||
rip: "RIP"
|
||||
pudding: "Pudding"
|
||||
note-visibility:
|
||||
public: "Offentlig"
|
||||
home: "Hjem"
|
||||
followers: "Følgere"
|
||||
specified: "Direkte"
|
||||
_settings:
|
||||
notification: "Notifikasjon"
|
||||
password: "Passord"
|
||||
save: "Lagre"
|
||||
search: "Søk"
|
||||
delete: "Slett"
|
||||
loading: "Laster inn..."
|
||||
update-available: "En ny versjon av Misskey er nå tilgjengelig ({newer}, nåværende versjon er {current}). Last inn siden igjen for at oppdateringen skal tre i kraft."
|
||||
my-token-regenerated: "Ditt synbol har blitt generert. Du vil nå bli utlogget."
|
||||
reversi:
|
||||
black: "Sort"
|
||||
white: "Hvit"
|
||||
total: "Totalt"
|
||||
widgets:
|
||||
calendar: "Kalender"
|
||||
memo: "Notis"
|
||||
trends: "Populært nå"
|
||||
version: "Versjon"
|
||||
notifications: "Notifikasjon"
|
||||
tips: "Tips"
|
||||
you: "Du"
|
||||
auth/views/form.vue:
|
||||
cancel: "Avbryt"
|
||||
auth/views/index.vue:
|
||||
loading: "Laster inn..."
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
cancel: "Avbryt"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Gi opp"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
invite: "Inviter"
|
||||
rule: "Slik spiller du"
|
||||
mode-invite: "Inviter"
|
||||
game-state:
|
||||
ended: "Ferdig"
|
||||
playing: "Pågår"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
random: "Tilfeldig"
|
||||
black-is: "Sort er {}"
|
||||
rules: "Regler"
|
||||
waiting-for-both: "Venter på deg"
|
||||
cancel: "Avbryt"
|
||||
ready: "Klar"
|
||||
cancel-ready: "Avbryt \"Klar\""
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Kunne ikke koble til tjeneren."
|
||||
description: "Det er enten et problem med internettilknytningen din, eller så har tjeneren blitt tatt ned for vedlikehold. {Prøv igjen} senere."
|
||||
common/views/components/media-banner.vue:
|
||||
sensitive: "Sensitivt innhold"
|
||||
common/views/components/theme.vue:
|
||||
text-color: "Tekstfarge"
|
||||
base-theme-dark: "Mørk"
|
||||
theme-name: "Tema navn"
|
||||
author: "Forfatter"
|
||||
desc: "Beskrivelse"
|
||||
common/views/components/cw-button.vue:
|
||||
hide: "Skjul"
|
||||
common/views/components/messaging.vue:
|
||||
you: "Du"
|
||||
user: "Bruker"
|
||||
common/views/components/messaging-room.form.vue:
|
||||
send: "Send"
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "Lest"
|
||||
common/views/components/nav.vue:
|
||||
stats: "Statistikk"
|
||||
status: "Status"
|
||||
wiki: "Wiki"
|
||||
donors: "Donatorer"
|
||||
repository: "Kodelager"
|
||||
develop: "Utviklere"
|
||||
common/views/components/note-menu.vue:
|
||||
detail: "Detaljer"
|
||||
favorite: "Merket som favoritt"
|
||||
pin: "Fest til profilen din"
|
||||
delete: "Slett"
|
||||
common/views/components/poll.vue:
|
||||
vote-count: "{} stemmer"
|
||||
vote: "Stem"
|
||||
show-result: "Vis resultater"
|
||||
voted: "Stemt"
|
||||
common/views/components/poll-editor.vue:
|
||||
choice-n: "Valg {}"
|
||||
day: "S"
|
||||
common/views/components/signin.vue:
|
||||
username: "Brukernavn"
|
||||
password: "Passord"
|
||||
token: "Token"
|
||||
or: "Eller"
|
||||
common/views/components/signup.vue:
|
||||
username: "Brukernavn"
|
||||
error: "Nettverksfeil"
|
||||
password: "Passord"
|
||||
retype: "Gjenta"
|
||||
recaptcha: "Captcha"
|
||||
common/views/components/stream-indicator.vue:
|
||||
connecting: "Tilkobler"
|
||||
reconnecting: "Kobler til på nytt"
|
||||
connected: "Tilkoblet"
|
||||
common/views/components/notification-settings.vue:
|
||||
title: "Notifikasjon"
|
||||
common/views/components/github-setting.vue:
|
||||
detail: "Detaljer..."
|
||||
common/views/components/discord-setting.vue:
|
||||
detail: "Detaljer..."
|
||||
common/views/components/uploader.vue:
|
||||
waiting: "Venter"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
public: "Offentlig"
|
||||
home: "Hjem"
|
||||
followers: "Følgere"
|
||||
specified: "Direkte"
|
||||
common/views/components/profile-editor.vue:
|
||||
name: "Navn"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
save: "Lagre"
|
||||
export-targets:
|
||||
following-list: "Følger"
|
||||
user-lists: "Lister"
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Bruker"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Inviter"
|
||||
common/views/components/user-lists.vue:
|
||||
user-lists: "Lister"
|
||||
list-name: "Liste navn"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Inviter"
|
||||
common/views/widgets/broadcast.vue:
|
||||
fetching: "Henter"
|
||||
next: "Neste"
|
||||
common/views/widgets/calendar.vue:
|
||||
year: "År {}"
|
||||
month: "Måned {}"
|
||||
day: "Dag {}"
|
||||
today: "I dag:"
|
||||
this-month: "Denne måneden:"
|
||||
this-year: "Dette året:"
|
||||
common/views/widgets/memo.vue:
|
||||
title: "Notis"
|
||||
save: "Lagre"
|
||||
common/views/pages/follow.vue:
|
||||
follow: "Følg"
|
||||
desktop:
|
||||
banner: "Banner"
|
||||
avatar: "Avatar"
|
||||
desktop/views/components/calendar.vue:
|
||||
prev: "Forrige måned"
|
||||
next: "Neste måned"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
cancel: "Avbryt"
|
||||
ok: "Ok"
|
||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||
cancel: "Avbryt"
|
||||
ok: "Ok"
|
||||
desktop/views/components/crop-window.vue:
|
||||
cancel: "Avbryt"
|
||||
ok: "Ok"
|
||||
desktop/views/components/drive-window.vue:
|
||||
used: "brukt"
|
||||
desktop/views/components/drive.file.vue:
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
nsfw: "NSFW"
|
||||
contextmenu:
|
||||
rename: "Endre navn"
|
||||
copied: "Kopiert"
|
||||
desktop/views/components/drive.folder.vue:
|
||||
contextmenu:
|
||||
rename: "Endre navn"
|
||||
desktop/views/components/drive.vue:
|
||||
search: "Søk"
|
||||
desktop/views/components/media-video.vue:
|
||||
sensitive: "Innholdet er NSFW"
|
||||
desktop/views/components/game-window.vue:
|
||||
game: "Reversi"
|
||||
desktop/views/components/home.vue:
|
||||
done: "Fullført"
|
||||
add: "Legg til"
|
||||
desktop/views/input-dialog.vue:
|
||||
cancel: "Avbryt"
|
||||
ok: "Ok"
|
||||
desktop/views/components/note-detail.vue:
|
||||
location: "Lokasjon"
|
||||
desktop/views/components/note.vue:
|
||||
reply: "Svar"
|
||||
detail: "Detaljer"
|
||||
desktop/views/components/notes.vue:
|
||||
retry: "Prøv på nytt"
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "Nytt innlegg"
|
||||
reply: "Svar"
|
||||
desktop/views/components/progress-dialog.vue:
|
||||
waiting: "Venter"
|
||||
desktop/views/components/renote-form.vue:
|
||||
cancel: "Avbryt"
|
||||
desktop/views/components/settings.2fa.vue:
|
||||
detail: "Detaljer..."
|
||||
unregister: "Avregistrer"
|
||||
token: "Token"
|
||||
submit: "Send"
|
||||
common/views/components/media-image.vue:
|
||||
sensitive: "Innholdet er NSFW"
|
||||
common/views/components/api-settings.vue:
|
||||
console:
|
||||
parameter: "Parametere"
|
||||
send: "Send"
|
||||
common/views/components/drive-settings.vue:
|
||||
in-use: "brukt"
|
||||
stats: "Statistikk"
|
||||
default-upload-folder-name: "Mappe(r)"
|
||||
common/views/components/mute-and-block.vue:
|
||||
save: "Lagre"
|
||||
desktop/views/components/settings.tags.vue:
|
||||
add: "Legg til"
|
||||
save: "Lagre"
|
||||
desktop/views/components/timeline.vue:
|
||||
home: "Hjem"
|
||||
local: "Lokalt"
|
||||
global: "Globalt"
|
||||
list: "Lister"
|
||||
list-name: "Liste navn"
|
||||
desktop/views/components/ui.header.vue:
|
||||
adjective: "-san"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
lists: "Lister"
|
||||
admin: "Admin"
|
||||
desktop/views/components/ui.header.nav.vue:
|
||||
game: "Spill"
|
||||
desktop/views/components/ui.header.notifications.vue:
|
||||
title: "Notifikasjon"
|
||||
desktop/views/components/ui.header.post.vue:
|
||||
post: "Skriv nytt innlegg"
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Søk"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Innlegg"
|
||||
following: "Følger"
|
||||
followers: "Følgere"
|
||||
desktop/views/components/users-list.vue:
|
||||
all: "Alle"
|
||||
iknow: "Du kjenner"
|
||||
desktop/views/components/window.vue:
|
||||
close: "Lukk"
|
||||
admin/views/index.vue:
|
||||
users: "Bruker"
|
||||
announcements: "Kunngjøringer"
|
||||
admin/views/dashboard.vue:
|
||||
notes: "Innlegg"
|
||||
drive: "Disk"
|
||||
admin/views/logs.vue:
|
||||
levels:
|
||||
info: "Informasjon"
|
||||
error: "Feil"
|
||||
admin/views/abuse.vue:
|
||||
details: "Detaljer"
|
||||
remove-report: "Slett"
|
||||
admin/views/instance.vue:
|
||||
invite: "Inviter"
|
||||
save: "Lagre"
|
||||
admin/views/charts.vue:
|
||||
notes: "Innlegg"
|
||||
users: "Bruker"
|
||||
drive: "Disk"
|
||||
admin/views/drive.vue:
|
||||
origin:
|
||||
local: "Lokalt"
|
||||
delete: "Slett"
|
||||
admin/views/users.vue:
|
||||
username: "Brukernavn"
|
||||
users:
|
||||
title: "Bruker"
|
||||
state:
|
||||
all: "Alle"
|
||||
origin:
|
||||
local: "Lokalt"
|
||||
admin/views/moderators.vue:
|
||||
logs:
|
||||
info: "Informasjon"
|
||||
admin/views/emoji.vue:
|
||||
add-emoji:
|
||||
add: "Legg til"
|
||||
emojis:
|
||||
remove: "Slett"
|
||||
admin/views/announcements.vue:
|
||||
announcements: "Kunngjøringer"
|
||||
save: "Lagre"
|
||||
remove: "Slett"
|
||||
add: "Legg til"
|
||||
admin/views/federation.vue:
|
||||
notes: "Innlegg"
|
||||
users: "Bruker"
|
||||
followers: "Følgere"
|
||||
status: "Status"
|
||||
states:
|
||||
all: "Alle"
|
||||
save: "Lagre"
|
||||
desktop/views/pages/welcome.vue:
|
||||
announcements: "Kunngjøringer"
|
||||
info: "Informasjon"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Forrige innlegg"
|
||||
next: "Neste innlegg"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
ok: "Ok"
|
||||
cancel: "Avbryt"
|
||||
desktop/views/pages/user-list.users.vue:
|
||||
users: "Bruker"
|
||||
username: "Brukernavn"
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
loading: "Laster inn"
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
loading: "Laster inn"
|
||||
desktop/views/pages/user/user.photos.vue:
|
||||
title: "Bilder"
|
||||
loading: "Laster inn"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Innlegg"
|
||||
following: "Følger"
|
||||
followers: "Følgere"
|
||||
month: "M"
|
||||
day: "S"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
default: "Innlegg"
|
||||
with-replies: "Innlegg og svar"
|
||||
with-media: "Media"
|
||||
desktop/views/widgets/notifications.vue:
|
||||
title: "Notifikasjon"
|
||||
desktop/views/widgets/polls.vue:
|
||||
refresh: "Oppdater"
|
||||
desktop/views/widgets/post-form.vue:
|
||||
title: "Innlegg"
|
||||
note: "Innlegg"
|
||||
desktop/views/widgets/trends.vue:
|
||||
title: "Populært nå"
|
||||
refresh: "Oppdater"
|
||||
desktop/views/widgets/users.vue:
|
||||
refresh: "Oppdater"
|
||||
no-one: "Ingen"
|
||||
mobile/views/components/drive.vue:
|
||||
used: "brukt"
|
||||
folder-count: "Mappe(r)"
|
||||
count-separator: ","
|
||||
file-count: "Fil(er)"
|
||||
mobile/views/components/drive.file.vue:
|
||||
nsfw: "NSFW"
|
||||
mobile/views/components/drive.file-detail.vue:
|
||||
rename: "Endre navn"
|
||||
move: "Flytt"
|
||||
exif: "EXIF"
|
||||
nsfw: "NSFW"
|
||||
mobile/views/components/media-video.vue:
|
||||
sensitive: "Innholdet er NSFW"
|
||||
common/views/components/follow-button.vue:
|
||||
follow: "Følger"
|
||||
mobile/views/components/note.vue:
|
||||
location: "Lokasjon"
|
||||
mobile/views/components/note-detail.vue:
|
||||
reply: "Svar"
|
||||
location: "Lokasjon"
|
||||
mobile/views/components/note-preview.vue:
|
||||
admin: "admin"
|
||||
bot: "bot"
|
||||
cat: "katt"
|
||||
mobile/views/components/note-sub.vue:
|
||||
admin: "admin"
|
||||
bot: "bot"
|
||||
cat: "katt"
|
||||
mobile/views/components/ui.header.vue:
|
||||
adjective: "Mr."
|
||||
mobile/views/components/ui.nav.vue:
|
||||
notifications: "Notifikasjon"
|
||||
search: "Søk"
|
||||
user-lists: "Lister"
|
||||
game: "Spill"
|
||||
admin: "Admin"
|
||||
mobile/views/pages/home.vue:
|
||||
home: "Hjem"
|
||||
local: "Lokalt"
|
||||
global: "Globalt"
|
||||
mobile/views/pages/widgets.vue:
|
||||
add-widget: "Legg til"
|
||||
mobile/views/pages/note.vue:
|
||||
title: "Innlegg"
|
||||
prev: "Forrige innlegg"
|
||||
next: "Neste innlegg"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
search: "Søk"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Notifikasjon"
|
||||
mobile/views/pages/user.vue:
|
||||
following: "Følger"
|
||||
followers: "Følgere"
|
||||
notes: "Innlegg"
|
||||
overview: "Oversikt"
|
||||
media: "Media"
|
||||
mobile/views/pages/user/home.vue:
|
||||
recent-notes: "Nylige innlegg"
|
||||
images: "Bilder"
|
||||
keywords: "Nøkkelord"
|
||||
deck:
|
||||
home: "Hjem"
|
||||
local: "Lokalt"
|
||||
global: "Globalt"
|
||||
notifications: "Notifikasjon"
|
||||
list: "Lister"
|
||||
rename: "Endre navn"
|
||||
deck/deck.user-column.vue:
|
||||
posts: "Innlegg"
|
||||
following: "Følger"
|
||||
followers: "Følgere"
|
||||
images: "Bilder"
|
||||
pages:
|
||||
pin-this-page: "Fest til profilen din"
|
||||
like: "Lik"
|
||||
blocks:
|
||||
image: "Bilder"
|
||||
script:
|
||||
categories:
|
||||
random: "Tilfeldig"
|
||||
list: "Lister"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lister"
|
||||
random: "Tilfeldig"
|
||||
_randomPick:
|
||||
arg1: "Lister"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lister"
|
||||
_seedRandomPick:
|
||||
arg2: "Lister"
|
||||
_pick:
|
||||
arg1: "Lister"
|
||||
_listLen:
|
||||
arg1: "Lister"
|
||||
types:
|
||||
array: "Lister"
|
||||
room:
|
||||
translate: "Flytt"
|
||||
save: "Lagre"
|
||||
furnitures:
|
||||
moon: "Måne"
|
||||
bin: "Papirkurv"
|
||||
_lang_: "Norsk Bokmål"
|
||||
|
1266
locales/pl-PL.yml
@ -1,288 +1,2 @@
|
||||
---
|
||||
meta:
|
||||
lang: "Português"
|
||||
common:
|
||||
misskey: "Uma ⭐ do fediverso"
|
||||
about-title: "Uma ⭐ do fediverso."
|
||||
about: "Obrigado por encontrar Misskey. Uma <b>plataforma descentralizada de microblog</b> nascida na Terra. Já que ela existe no Fediverso (um universo onde várias plataformas de mídia social são organizadas), ela é ligada com outras plataformas.Por que você não tira uma folga do agito e confusão da cidade, e mergulha em uma nova internet?"
|
||||
intro:
|
||||
title: "O que é Misskey?"
|
||||
about: "Misskey é um <b>serviço de microblog descentralizado</b>. Personalização sofisticada da interface, variedade de reações a posts, armazenamento de arquivos grátis com gerenciamento integrado e outras funções avançadas estão disponíveis. Um sistema em rede chamado \"Fediverso\" permite que nos comuniquemos com usuários em outras redes sociais. Se você postar algo, por exemplo, seu post não será mandado apenas para o Misskey, mas também para o Mastodon. Apenas imagine que o planeta está enviando ondas de rádio para outros planetas para se comunicar."
|
||||
features: "Recursos"
|
||||
rich-contents: "Post"
|
||||
rich-contents-desc: "Apenas poste suas ideias, temas do momento e qualquer coisa que você queira compartilhar. Você pode querer decorar suas palavras, anexar suas imagens favoritas, enviar arquivos, inclusive vídeos ou criar uma enquete. Essas são as coisas que você pode fazer em Misskey."
|
||||
reaction: "Reações"
|
||||
reaction-desc: "あなたの気持ちを伝える最も簡単な方法です。Misskeyは、他のユーザーの投稿に様々なリアクションを付けることができます。いちどMisskeyのリアクション機能を体験してしまうと、もう「いいね」の概念しか存在しないSNSには戻れなくなるかもしれません"
|
||||
application-authorization: "Aplicativos autorizados"
|
||||
close: "Fechar"
|
||||
do-not-copy-paste: "Por favor, não digite ou copie o código aqui. A conta pode ser comprometida."
|
||||
notification-types:
|
||||
follow: "Seguindo"
|
||||
got-it: "Entendi!"
|
||||
customization-tips:
|
||||
title: "Dicas de personalização"
|
||||
gotit: "Entendi!"
|
||||
notification:
|
||||
file-uploaded: "Arquivo enviado!"
|
||||
message-from: "Mensagem de {}:"
|
||||
reversi-invited: "Convidado a jogar"
|
||||
reversi-invited-by: "Convidado por {}:"
|
||||
notified-by: "Notificado por {}:"
|
||||
reply-from: "Resposta de {}:"
|
||||
quoted-by: "Citado por {}:"
|
||||
time:
|
||||
unknown: "Desconhecido"
|
||||
future: "futuro"
|
||||
just_now: "agora"
|
||||
seconds_ago: "{} sec atrás"
|
||||
minutes_ago: "{} min atrás"
|
||||
hours_ago: "{} h atrás"
|
||||
days_ago: "{} d atrás"
|
||||
weeks_ago: "{} sem atrás"
|
||||
months_ago: "{} m atrás"
|
||||
years_ago: "{} ano(s) atrás"
|
||||
month-and-day: "{day}/{month}"
|
||||
trash: "Lixo"
|
||||
timeline: "Linha do tempo"
|
||||
followers: "Seguidores"
|
||||
post-form:
|
||||
enter-username: "Digite o nome de usuário."
|
||||
username-prompt: "Digite o nome de usuário."
|
||||
weekday-short:
|
||||
sunday: "Dom"
|
||||
monday: "Seg"
|
||||
tuesday: "Ter"
|
||||
wednesday: "Qua"
|
||||
thursday: "Qui"
|
||||
friday: "Sex"
|
||||
saturday: "Seb"
|
||||
weekday:
|
||||
sunday: "domingo"
|
||||
monday: "segunda"
|
||||
tuesday: "terça"
|
||||
wednesday: "quarta"
|
||||
thursday: "quinta"
|
||||
friday: "sexta"
|
||||
saturday: "sábado"
|
||||
reactions:
|
||||
like: "Curtir"
|
||||
love: "Amei"
|
||||
laugh: "Riso"
|
||||
hmm: "Hmm...?"
|
||||
surprise: "Uau"
|
||||
congrats: "Parabéns!"
|
||||
angry: "Raiva"
|
||||
confused: "Confuso"
|
||||
rip: "RIP"
|
||||
pudding: "Pudim"
|
||||
note-visibility:
|
||||
followers: "Seguidores"
|
||||
note-placeholders:
|
||||
a: "O que está fazendo?"
|
||||
b: "O que está acontecendo?"
|
||||
c: "No que está pensando?"
|
||||
d: "Quer postar algo?"
|
||||
e: "Escreva aqui"
|
||||
f: "Esperando você escrever."
|
||||
_settings:
|
||||
timeline: "Linha do tempo"
|
||||
search: "Buscar"
|
||||
delete: "Apagar"
|
||||
loading: "Carregando"
|
||||
update-available-title: "Atualização disponível"
|
||||
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
||||
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
||||
enter-username: "Digite o nome de usuário."
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Seu turno"
|
||||
opponent-turn: "Turno do oponente"
|
||||
black: "Pretas"
|
||||
white: "Brancas"
|
||||
total: "Total"
|
||||
widgets:
|
||||
analog-clock: "Relógio analógico"
|
||||
profile: "Perfil"
|
||||
calendar: "Calendário"
|
||||
timemachine: "Calendário (máquina do tempo)"
|
||||
activity: "Atividade"
|
||||
rss: "Leitor de RSS"
|
||||
memo: "Nota adesiva"
|
||||
trends: "Tendências"
|
||||
posts-monitor: "Gráfico de publicações"
|
||||
version: "Versão"
|
||||
notifications: "Notificações"
|
||||
users: "Usuário sugeridos"
|
||||
polls: "Enquetes"
|
||||
post-form: "Formulário de publicação"
|
||||
server: "Informações do servidor"
|
||||
nav: "Navegação"
|
||||
tips: "Dicas"
|
||||
hashtags: "Hashtags"
|
||||
you: "Você"
|
||||
auth/views/form.vue:
|
||||
permission-ask: "Este aplicativo precisa das seguintes permissões:"
|
||||
cancel: "Cancelar"
|
||||
accept: "Permitir acesso"
|
||||
auth/views/index.vue:
|
||||
loading: "Carregando"
|
||||
already-authorized: "Este aplicativo já foi autorizado"
|
||||
allowed: "Aplicativos com acesso autorizado"
|
||||
callback-url: "Voltando ao aplicativo"
|
||||
please-go-back: "Por favor, volte ao aplicativo."
|
||||
error: "A sessão não existe."
|
||||
sign-in: "Por favor, entre."
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
invite: "Convidar"
|
||||
rule: "Como jogar"
|
||||
mode-invite: "Convidar"
|
||||
mode-invite-desc: "Convidar um usuário para jogar"
|
||||
invitations: "Você foi convidado!"
|
||||
my-games: "Meu jogo"
|
||||
all-games: "Todos os jogos"
|
||||
enter-username: "Digite o nome de usuário."
|
||||
game-state:
|
||||
ended: "Terminado"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
rules: "Regras"
|
||||
cancel: "Cancelar"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
flush: "Limpar o cache"
|
||||
common/views/components/theme.vue:
|
||||
desc: "Descrição"
|
||||
common/views/components/cw-button.vue:
|
||||
poll: "Enquetes"
|
||||
common/views/components/messaging.vue:
|
||||
you: "Você"
|
||||
common/views/components/note-menu.vue:
|
||||
delete: "Apagar"
|
||||
common/views/components/poll-editor.vue:
|
||||
day: "Dom"
|
||||
common/views/components/visibility-chooser.vue:
|
||||
followers: "Seguidores"
|
||||
common/views/components/profile-editor.vue:
|
||||
name: "Nome"
|
||||
export-targets:
|
||||
following-list: "Seguindo"
|
||||
common/views/components/user-group-editor.vue:
|
||||
invite: "Convidar"
|
||||
common/views/components/user-groups.vue:
|
||||
invites: "Convidar"
|
||||
common/views/widgets/posts-monitor.vue:
|
||||
title: "Gráfico de publicações"
|
||||
common/views/widgets/memo.vue:
|
||||
title: "Nota adesiva"
|
||||
common/views/pages/follow.vue:
|
||||
follow: "Seguindo"
|
||||
desktop/views/components/choose-file-from-drive-window.vue:
|
||||
upload: "Envie arquivos do seu dispositivo"
|
||||
ok: "OK"
|
||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||
ok: "OK"
|
||||
desktop/views/components/crop-window.vue:
|
||||
ok: "OK"
|
||||
desktop/views/input-dialog.vue:
|
||||
ok: "OK"
|
||||
common/views/components/api-settings.vue:
|
||||
console:
|
||||
parameter: "Parâmetros"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
poll: "Enquetes"
|
||||
desktop/views/components/user-preview.vue:
|
||||
following: "Seguindo"
|
||||
followers: "Seguidores"
|
||||
desktop/views/components/users-list-item.vue:
|
||||
followed: "Te segue"
|
||||
admin/views/abuse.vue:
|
||||
remove-report: "Apagar"
|
||||
admin/views/instance.vue:
|
||||
invite: "Convidar"
|
||||
admin/views/drive.vue:
|
||||
delete: "Apagar"
|
||||
admin/views/emoji.vue:
|
||||
emojis:
|
||||
remove: "Apagar"
|
||||
admin/views/announcements.vue:
|
||||
remove: "Apagar"
|
||||
admin/views/federation.vue:
|
||||
followers: "Seguidores"
|
||||
desktop/views/pages/welcome.vue:
|
||||
timeline: "Timeline"
|
||||
powered-by-misskey: "Desenvolvido por <b>Misskey</b>."
|
||||
desktop/views/pages/drive.vue:
|
||||
title: "Drive Misskey"
|
||||
desktop/views/pages/note.vue:
|
||||
prev: "Nota anterior"
|
||||
next: "Próxima nota"
|
||||
desktop/views/pages/selectdrive.vue:
|
||||
title: "Selecione um arquivo"
|
||||
ok: "OK"
|
||||
cancel: "Cancelar"
|
||||
upload: "Envie arquivos do seu dispositivo"
|
||||
desktop/views/pages/search.vue:
|
||||
not-available: "A pesquisa está desligada nas configurações desta instância."
|
||||
desktop/views/pages/user/user.followers-you-know.vue:
|
||||
loading: "Carregando"
|
||||
desktop/views/pages/user/user.friends.vue:
|
||||
loading: "Carregando"
|
||||
desktop/views/pages/user/user.photos.vue:
|
||||
loading: "Carregando"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
following: "Seguindo"
|
||||
followers: "Seguidores"
|
||||
month: "Seg"
|
||||
day: "Dom"
|
||||
follows-you: "Te segue"
|
||||
desktop/views/pages/user/user.timeline.vue:
|
||||
with-media: "Mídia"
|
||||
desktop/views/widgets/polls.vue:
|
||||
title: "Enquetes"
|
||||
common/views/components/follow-button.vue:
|
||||
follow: "Seguindo"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
poll: "Enquetes"
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "Linha do tempo"
|
||||
mobile/views/pages/widgets.vue:
|
||||
customization-tips: "Dicas de personalização"
|
||||
mobile/views/pages/note.vue:
|
||||
prev: "Nota anterior"
|
||||
next: "Próxima nota"
|
||||
mobile/views/pages/search.vue:
|
||||
search: "Pesquisar"
|
||||
mobile/views/pages/user.vue:
|
||||
follows-you: "Te segue"
|
||||
following: "Seguindo"
|
||||
followers: "Seguidores"
|
||||
notes: "Posts"
|
||||
timeline: "Linha do tempo"
|
||||
media: "Mídia"
|
||||
mobile/views/pages/user/home.vue:
|
||||
recent-notes: "Notas recentes"
|
||||
images: "Imagens"
|
||||
activity: "Atividade"
|
||||
keywords: "Palavras chave"
|
||||
domains: "Domínios"
|
||||
followers-you-know: "Seguidores que você conhece"
|
||||
last-used-at: "Ativo pela última vez"
|
||||
mobile/views/pages/user/home.photos.vue:
|
||||
no-photos: "Sem fotos"
|
||||
deck/deck.user-column.vue:
|
||||
follows-you: "Te segue"
|
||||
following: "Seguindo"
|
||||
followers: "Seguidores"
|
||||
images: "Imagens"
|
||||
timeline: "Linha do tempo"
|
||||
docs:
|
||||
edit-this-page-on-github-link: "Edite esta página no GitHub!"
|
||||
dev/views/index.vue:
|
||||
manage-apps: "Gerenciar aplicativos"
|
||||
pages:
|
||||
like: "Curtir"
|
||||
blocks:
|
||||
image: "Imagens"
|
||||
post: "Formulário de publicação"
|
||||
room:
|
||||
furnitures:
|
||||
moon: "Lua"
|
||||
bin: "Lixo"
|
||||
_lang_: "Português"
|
||||
|
@ -1,171 +1,36 @@
|
||||
---
|
||||
meta:
|
||||
lang: "Русский язык"
|
||||
common:
|
||||
misskey: "Мы — ⭐ fediverse"
|
||||
about-title: "Мы — ⭐ fediverse"
|
||||
about: "Спасибо, что нашли Misskey. Misskey — это <b>децентрализованная платформа для микроблоггинга</b> родом с планеты Земля. Поскольку она существует внутри Fediverse (вселенной различных социальных платформ), она связана с другими платформами. Отдохните от шума большого города — и познакомьтесь с новым интернетом."
|
||||
intro:
|
||||
title: "Что такое Misskey?"
|
||||
about: "Misskey - это <b>децентрализованный сервис микроблогинга</b> с открытым исходным кодом. Он имеет такие функции, как: навороченный, полностью настраиваемый пользовательский интерфейс, множество реакций на посты, бесплатное хранилище файлов с интегрированной системой управления и ещё куча передовых фишек. А ещё сетевая система под названием “Fediverse” позволяет нам общаться с пользователями других социальных сетей. Например, если ты что-нибудь запостишь, то твой пост будет отослан не только в Misskey, но ещё и mastodon. Просто представь, что планета посылает микроволны на другую планету для коммуникации."
|
||||
features: "Особенности"
|
||||
rich-contents: "Посты"
|
||||
rich-contents-desc: "Просто выложи свою идею, актуальные темы и всё, что тебе хочется показать миру. Ты можешь декорировать свои слова, прикреплять свои любимые картинки, отправлять файлы с фильмами и создать голосование - это те вещи, которые ты можешь сделать с помощью Misskey!"
|
||||
reaction: "Реакции"
|
||||
reaction-desc: "Самый лёгкий способ выразить свои эмоции. Misskey позволяет добавлять различные виды реакций к постам других людей. Эмоциональный опыт из Misskey никогда не появится в других социальных сетях, позволяющих только жать “лайки”."
|
||||
ui: "Интерфейс"
|
||||
ui-desc: "Нет такого интерфейса, понравившегося всем. Поэтому у Misskey имеется пользовательский интерфейс, широко настраиваемый под ваши вкусы. Создай себе уникальную домашнюю страницу редактируя, подстраивая оформление ленты и размещая виджеты, которые тоже можно кастомизировать."
|
||||
drive: "Хранилище файлов"
|
||||
drive-desc: "Хотите запостить картинку, которую уже отправляли ранее? Хочется сортировать, переименовать и создать папку для ваших выложенных файлов? Тогда Misskey Drive - это лучшее решение для вас. Очень лёгкий способ делиться своими файлами онлайн."
|
||||
outro: "Попробуйте будущие, уникальные для Misskey функции своими глазами! Если чувствуете, что это не в вашем вкусе, то попробуйте другие инстанции, ведь Misskey - это децентрализованная социальная сеть, так что ты можешь с лёгкостью найти себе товарищей. И наконец, GLHF!"
|
||||
application-authorization: "Авторизация приложений"
|
||||
close: "Закрыть"
|
||||
do-not-copy-paste: "Пожалуйста, не вводите и не вставляйте сюда код. Аккаунту может угрожать опасность."
|
||||
load-more: "Загрузить больше"
|
||||
enter-password: "Пожалуйста, введите ваш пароль"
|
||||
2fa: "Двухфакторная аутентификация"
|
||||
customize-home: "Настройка домашней страницы"
|
||||
featured-notes: "Рекомендуемые"
|
||||
dark-mode: "Тёмная тема"
|
||||
signin: "Войти"
|
||||
signup: "Регистрация"
|
||||
signout: "Выйти"
|
||||
reload-to-apply-the-setting: "Вам необходимо перезагрузить страницу, чтобы применить настройки. Вы хотите перезагрузить сейчас?"
|
||||
customization-tips:
|
||||
title: "Советы по настройке"
|
||||
gotit: "Понятно!"
|
||||
notification:
|
||||
file-uploaded: "Файл отправлен!"
|
||||
message-from: "Сообщение от {}:"
|
||||
reversi-invited: "Приглашён в игру"
|
||||
reversi-invited-by: "Был приглашён {}:"
|
||||
notified-by: "Был приглашён {}:"
|
||||
reply-from: "Ответ от {}:"
|
||||
quoted-by: "Цитировано {}:"
|
||||
time:
|
||||
unknown: "неизвестно"
|
||||
future: "сейчас"
|
||||
just_now: "сейчас"
|
||||
seconds_ago: "{} секунд назад"
|
||||
minutes_ago: "{} минут назад"
|
||||
hours_ago: "{} часов назад"
|
||||
days_ago: "{} дней назад"
|
||||
weeks_ago: "{} недель назад"
|
||||
months_ago: "{} месяцев назад"
|
||||
years_ago: "{} лет назад"
|
||||
month-and-day: "{day}.{month}"
|
||||
trash: "Мусорное ведро"
|
||||
drive: "Drive"
|
||||
pages: "Страницы"
|
||||
messaging: "Чат"
|
||||
_lang_: "Русский язык"
|
||||
search: "Поиск"
|
||||
notifications: "Уведомления"
|
||||
password: "Пароль"
|
||||
ok: "Окей"
|
||||
cancel: "Отмена"
|
||||
instance: "Экземпляр"
|
||||
settings: "Настройки"
|
||||
profile: "Профиль"
|
||||
timeline: "Лента"
|
||||
login: "Войти"
|
||||
logout: "Выйти"
|
||||
signup: "Регистрация"
|
||||
save: "Сохранить"
|
||||
favorite: "Избранное"
|
||||
favorites: "Избранное"
|
||||
unfavorite: "Удалить из избранных"
|
||||
pin: "Закрепить"
|
||||
unpin: "Открепить"
|
||||
copyLink: "Скопировать ссылку"
|
||||
delete: "Удалить"
|
||||
addToList: "Добавить в список"
|
||||
reply: "Ответить"
|
||||
loadMore: "Показать еще"
|
||||
importAndExport: "Импорт / Экспорт"
|
||||
files: "Файл"
|
||||
instances: "Экземпляр"
|
||||
remove: "Удалить"
|
||||
_sfx:
|
||||
notification: "Уведомления"
|
||||
_widgets:
|
||||
notifications: "Уведомления"
|
||||
timeline: "Лента"
|
||||
followers: "Подписчики"
|
||||
favorites: "Избранное"
|
||||
post-form:
|
||||
reply: "Ответить"
|
||||
create-poll: "Создать опрос"
|
||||
weekday-short:
|
||||
sunday: "Вс"
|
||||
monday: "Пн"
|
||||
tuesday: "Вт"
|
||||
wednesday: "Ср"
|
||||
thursday: "Чт"
|
||||
friday: "Пт"
|
||||
saturday: "Сб"
|
||||
weekday:
|
||||
sunday: "Воскресенье"
|
||||
monday: "Понедельник"
|
||||
tuesday: "Вторник"
|
||||
wednesday: "Среда"
|
||||
thursday: "Четверг"
|
||||
friday: "Пятница"
|
||||
saturday: "Суббота"
|
||||
reactions:
|
||||
like: "Нравится"
|
||||
laugh: "Ха-Ха"
|
||||
rip: "RIP"
|
||||
do-not-use-in-production: "Эта сборка для разработчиков. Не используйте в продакшне."
|
||||
error:
|
||||
title: "Что-то пошло не так :("
|
||||
retry: "Повторить"
|
||||
reversi:
|
||||
drawn: "Ничья"
|
||||
my-turn: "Ваш ход"
|
||||
opponent-turn: "Ход оппонента"
|
||||
turn-of: "Ход {name}"
|
||||
past-turn-of: "Ход {name}"
|
||||
won: "{name} победил"
|
||||
black: "Чёрный"
|
||||
white: "Белый"
|
||||
total: "Всего"
|
||||
this-turn: "Ход {count}"
|
||||
widgets:
|
||||
analog-clock: "Аналоговые часы"
|
||||
profile: "Профиль"
|
||||
calendar: "Календарь"
|
||||
timemachine: "Календарь (машина времени)"
|
||||
activity: "Активность"
|
||||
rss: "Ридер RSS"
|
||||
memo: "Заметка"
|
||||
trends: "Популярное"
|
||||
photo-stream: "Фотопоток"
|
||||
slideshow: "Слайдшоу"
|
||||
version: "Версия"
|
||||
notifications: "Уведомления"
|
||||
users: "Рекомендованные пользователи"
|
||||
polls: "Голосования"
|
||||
server: "Информация о сервере"
|
||||
hashtags: "Хэштеги"
|
||||
dev: "Не удалось создать приложение. Пожалуйста, попробуйте ещё раз."
|
||||
ai-chan-kawaii: "Ai-chan kawaii!"
|
||||
auth/views/form.vue:
|
||||
share-access: "Вы разрешаете <i>{name}</i> получить доступ к вашему аккаунту?"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
game-state:
|
||||
ended: "Завершено"
|
||||
playing: "В процессе"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "Настройки игры"
|
||||
random: "Случайно"
|
||||
black-or-white: "Чёрные/Белые"
|
||||
black-is: "{} ходит чёрными"
|
||||
rules: "Правила"
|
||||
settings-of-the-bot: "Настройки бота"
|
||||
this-game-is-started-soon: "Игра вот-вот начнётся"
|
||||
waiting-for-other: "Ожидание оппонента"
|
||||
cancel: "Отмена"
|
||||
ready: "Готов"
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Невозможно подключиться к серверу"
|
||||
common/views/components/cw-button.vue:
|
||||
poll: "Голосования"
|
||||
common/views/components/poll-editor.vue:
|
||||
day: "Вс"
|
||||
common/views/widgets/memo.vue:
|
||||
title: "Заметка"
|
||||
desktop/views/components/sub-note-content.vue:
|
||||
poll: "Голосования"
|
||||
admin/views/dashboard.vue:
|
||||
drive: "Хранилище файлов"
|
||||
admin/views/charts.vue:
|
||||
drive: "Хранилище файлов"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
month: "Пн"
|
||||
day: "Вс"
|
||||
desktop/views/widgets/polls.vue:
|
||||
title: "Голосования"
|
||||
mobile/views/components/sub-note-content.vue:
|
||||
poll: "Голосования"
|
||||
mobile/views/pages/widgets.vue:
|
||||
customization-tips: "Советы по настройке"
|
||||
pages:
|
||||
like: "Нравится"
|
||||
script:
|
||||
categories:
|
||||
random: "Случайно"
|
||||
blocks:
|
||||
random: "Случайно"
|
||||
room:
|
||||
furnitures:
|
||||
moon: "Луна"
|
||||
bin: "Мусорное ведро"
|
||||
_cw:
|
||||
show: "Показать еще"
|
||||
|
2659
locales/zh-CN.yml
@ -1,91 +1,390 @@
|
||||
---
|
||||
meta:
|
||||
lang: "中文(繁体)"
|
||||
common:
|
||||
intro:
|
||||
title: "什麽是 Misskey 呢?"
|
||||
rich-contents: "發佈"
|
||||
reaction: "回應"
|
||||
drive: "雲端硬碟"
|
||||
close: "關閉"
|
||||
enter-password: "請輸入密碼"
|
||||
2fa: "雙重身份驗證"
|
||||
dark-mode: "夜間模式"
|
||||
signup: "註冊"
|
||||
signout: "登出"
|
||||
notification:
|
||||
reversi-invited: "您已被邀請加入壹場遊戲"
|
||||
reversi-invited-by: "來自{}的邀請"
|
||||
notified-by: "來自{}的邀請"
|
||||
time:
|
||||
future: "未來"
|
||||
just_now: "剛剛"
|
||||
drive: "雲端硬碟"
|
||||
weekday:
|
||||
sunday: "週日"
|
||||
monday: "週一"
|
||||
tuesday: "週二"
|
||||
wednesday: "週三"
|
||||
thursday: "週四"
|
||||
friday: "週五"
|
||||
saturday: "週六"
|
||||
reactions:
|
||||
like: "贊"
|
||||
love: "喜歡"
|
||||
congrats: "恭喜"
|
||||
_settings:
|
||||
password: "密碼"
|
||||
font-size: "字體大小"
|
||||
font-size-x-small: "小"
|
||||
font-size-small: "較小"
|
||||
deck-column-width-wide: "寬"
|
||||
timeline: "時間軸"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
flush: "清除快取"
|
||||
common/views/components/theme.vue:
|
||||
light-themes: "淺色主題"
|
||||
dark-themes: "深色主題"
|
||||
install-a-theme: "安裝主題"
|
||||
save-created-theme: "保存主題"
|
||||
common/views/components/signin.vue:
|
||||
signin-with-twitter: "用 Twitter 帳號登入"
|
||||
signin-with-github: "用 GitHub 帳號登入"
|
||||
signin-with-discord: "用 Discord 帳號登入"
|
||||
login-failed: "登錄失敗。 請檢查用戶名和密碼。"
|
||||
common/views/components/signup.vue:
|
||||
invitation-code: "邀請碼"
|
||||
username: "用戶名"
|
||||
available: "可用"
|
||||
too-long: "請不要超過20個字元"
|
||||
password: "密碼"
|
||||
password-placeholder: "建議至少8個字元"
|
||||
common/views/components/stream-indicator.vue:
|
||||
connecting: "正在連線"
|
||||
reconnecting: "正在重新連線"
|
||||
connected: "已建立連線"
|
||||
common/views/components/integration-settings.vue:
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/github-setting.vue:
|
||||
reconnect: "重新連線"
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/discord-setting.vue:
|
||||
reconnect: "重新連線"
|
||||
disconnect: "中斷連線"
|
||||
common/views/components/language-settings.vue:
|
||||
recommended: "推薦"
|
||||
auto: "自動"
|
||||
specify-language: "指定語言"
|
||||
common/views/components/profile-editor.vue:
|
||||
title: "個人資料"
|
||||
_lang_: "中文(繁体)"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "搜尋"
|
||||
notifications: "通知"
|
||||
username: "用戶名"
|
||||
password: "密碼"
|
||||
fetchingAsApObject: "從Fediverse尋找中..."
|
||||
ok: "OK"
|
||||
gotIt: "知道了"
|
||||
cancel: "取消"
|
||||
enterUsername: "輸入用戶名"
|
||||
renotedBy: "由{user}轉發"
|
||||
noNotes: "沒有筆記"
|
||||
noNotifications: "沒有通知"
|
||||
settings: "設定"
|
||||
profile: "個人檔案"
|
||||
timeline: "時間軸"
|
||||
noAccountDescription: "此用戶還沒有自我介紹"
|
||||
login: "登入"
|
||||
loggingIn: "登入中"
|
||||
logout: "登出"
|
||||
signup: "註冊"
|
||||
uploading: "上傳中"
|
||||
save: "保存"
|
||||
users: "用戶"
|
||||
addUser: "新增用戶"
|
||||
favorite: "收藏"
|
||||
favorites: "收藏"
|
||||
unfavorite: "取消收藏"
|
||||
pin: "置頂"
|
||||
unpin: "取消置頂"
|
||||
copyContent: "複製內容"
|
||||
copyLink: "複製連結"
|
||||
delete: "刪除"
|
||||
addToList: "添加至清單"
|
||||
sendMessage: "發送訊息"
|
||||
copyUsername: "複製用戶名"
|
||||
reply: "回覆"
|
||||
loadMore: "載入更多"
|
||||
youGotNewFollower: "您有新的追隨者"
|
||||
receiveFollowRequest: "收到追隨請求"
|
||||
followRequestAccepted: "追隨請求已接受"
|
||||
mentions: "提及"
|
||||
importAndExport: "匯入 / 匯出"
|
||||
import: "匯入"
|
||||
export: "匯出"
|
||||
files: "檔案"
|
||||
download: "下載"
|
||||
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?附加此檔案的筆記也會跟著不見。"
|
||||
unfollowConfirm: "確定要取消對{name}的追隨嗎?"
|
||||
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
|
||||
importRequested: "已請求匯入。這可能會花一點時間"
|
||||
lists: "清單"
|
||||
noLists: "沒有清單"
|
||||
note: "筆記"
|
||||
notes: "筆記"
|
||||
following: "關注中"
|
||||
followers: "追隨者"
|
||||
followsYou: "追隨你的人"
|
||||
createList: "建立清單"
|
||||
manageLists: "管理清單"
|
||||
error: "發生錯誤"
|
||||
retry: "重試"
|
||||
enterListName: "輸入清單名稱"
|
||||
privacy: "隱私"
|
||||
makeFollowManuallyApprove: "手動審核追隨請求"
|
||||
defaultNoteVisibility: "預設的筆記隱私權"
|
||||
follow: "追隨"
|
||||
followRequest: "追隨請求"
|
||||
followRequests: "追隨請求"
|
||||
unfollow: "取消追隨"
|
||||
followRequestPending: "追隨許可批准中"
|
||||
enterEmoji: "輸入表情符號"
|
||||
renote: "轉發筆記"
|
||||
unrenote: "取消轉發筆記"
|
||||
quote: "引用"
|
||||
pinnedNote: "已置頂筆記"
|
||||
you: "您"
|
||||
clickToShow: "點擊查看"
|
||||
sensitive: "敏感內容"
|
||||
add: "新增"
|
||||
reaction: "反應"
|
||||
rememberNoteVisibility: "記住筆記隱私設定"
|
||||
attachCancel: "移除附件"
|
||||
markAsSensitive: "標記為敏感內容"
|
||||
unmarkAsSensitive: "取消標記為敏感內容"
|
||||
enterFileName: "請輸入檔案名稱"
|
||||
mute: "禁言"
|
||||
unmute: "解除禁言"
|
||||
block: "封鎖"
|
||||
unblock: "解除封鎖"
|
||||
suspend: "凍結"
|
||||
unsuspend: "解凍"
|
||||
blockConfirm: "確定要封鎖此用戶?"
|
||||
unblockConfirm: "確定解除封鎖此用戶?"
|
||||
suspendConfirm: "確定凍結此帳號?"
|
||||
unsuspendConfirm: "確定解凍此帳號?"
|
||||
selectList: "選擇清單"
|
||||
customEmojis: "自訂表情符號"
|
||||
emojiName: "表情符號名稱"
|
||||
emojiUrl: "表情符號URL"
|
||||
addEmoji: "新增表情符號"
|
||||
flagAsBot: "此帳戶是Bot"
|
||||
flagAsCat: "此帳戶是Cat"
|
||||
autoAcceptFollowed: "自動許可關注"
|
||||
addAcount: "新增帳戶"
|
||||
loginFailed: "登入失敗"
|
||||
general: "一般"
|
||||
wallpaper: "壁紙"
|
||||
removeWallpaper: "移除壁紙"
|
||||
searchWith: "搜尋: {q}"
|
||||
youHaveNoLists: "你沒有任何清單"
|
||||
followConfirm: "你真的要關注{name}嗎?"
|
||||
host: "主機"
|
||||
selectUser: "選擇用戶"
|
||||
recipient: "收件人"
|
||||
annotation: "註解"
|
||||
federation: "整合"
|
||||
latestStatus: "最後狀態"
|
||||
storageUsage: "已使用容量"
|
||||
charts: "圖表"
|
||||
perHour: "每小時"
|
||||
perDay: "每日"
|
||||
operations: "操作"
|
||||
software: "軟體"
|
||||
version: "版本"
|
||||
withNFiles: "{n}個檔案"
|
||||
monitor: "監視器"
|
||||
network: "網路"
|
||||
statistics: "統計"
|
||||
clearQueue: "清除佇列"
|
||||
clearQueueConfirmTitle: "確定要清除佇列嗎?"
|
||||
clearCachedFiles: "清除快取資料"
|
||||
muteAndBlock: "禁言 / 封鎖"
|
||||
mutedUsers: "已禁言用戶"
|
||||
blockedUsers: "已封鎖用戶"
|
||||
noUsers: "無用戶"
|
||||
editProfile: "編輯個人檔案"
|
||||
noteDeleteConfirm: "確定刪除此筆記嗎?"
|
||||
pinLimitExceeded: "不能再置頂更多筆記了"
|
||||
intro: "Misskey安裝作業完成!請創立管理員用戶"
|
||||
done: "完成"
|
||||
processing: "處理中"
|
||||
preview: "預覽"
|
||||
noCustomEmojis: "沒有表情符號"
|
||||
federating: "整合檢索中"
|
||||
blocked: "已封鎖"
|
||||
suspended: "已凍結"
|
||||
all: "全部"
|
||||
subscribing: "訂閱中"
|
||||
notResponding: "沒有回應"
|
||||
changePassword: "修改密碼"
|
||||
security: "安全性"
|
||||
retypedNotMatch: "不相符的輸入內容"
|
||||
currentPassword: "現在的密碼"
|
||||
newPassword: "新的密碼"
|
||||
newPasswordRetype: "新的密碼(再輸入一次)"
|
||||
attachFile: "添加附件"
|
||||
more: "更多!"
|
||||
featured: "精選"
|
||||
usernameOrUserId: "用戶名或用戶ID"
|
||||
noSuchUser: "用戶不存在"
|
||||
announcements: "公告"
|
||||
imageUrl: "圖片URL"
|
||||
remove: "刪除"
|
||||
removed: "成功移除"
|
||||
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||
saved: "已保存"
|
||||
messaging: "傳送訊息"
|
||||
upload: "上傳"
|
||||
fromDrive: "從雲端"
|
||||
fromUrl: "從URL"
|
||||
explore: "探索"
|
||||
games: "Misskey 遊戲"
|
||||
messageRead: "已讀"
|
||||
noMoreHistory: "沒有更多歷史紀錄"
|
||||
startMessaging: "開始傳送訊息"
|
||||
nUsersRead: "{n}人已讀"
|
||||
tos: "使用條款"
|
||||
start: "開始"
|
||||
home: "首頁"
|
||||
activity: "動態"
|
||||
birthday: "生日"
|
||||
yearsOld: "{age}歲"
|
||||
registeredDate: "註冊日期"
|
||||
location: "位置"
|
||||
theme: "外觀主題"
|
||||
lightThemes: "明亮主題"
|
||||
darkThemes: "灰暗主題"
|
||||
drive: "雲端硬碟"
|
||||
selectFile: "選擇檔案"
|
||||
selectFiles: "選擇檔案"
|
||||
renameFile: "重新命名檔案"
|
||||
createFolder: "新增資料夾"
|
||||
renameFolder: "重新命名資料夾"
|
||||
deleteFolder: "刪除資料夾"
|
||||
addFile: "添加檔案"
|
||||
emptyDrive: "雲端硬碟為空"
|
||||
emptyFolder: "空的資料夾"
|
||||
copyUrl: "複製URL"
|
||||
rename: "重新命名"
|
||||
avatar: "頭像"
|
||||
banner: "橫幅"
|
||||
nsfw: "敏感內容"
|
||||
disconnectedFromServer: "與伺服器中斷連線"
|
||||
reload: "重新載入"
|
||||
doNothing: "無視"
|
||||
reloadConfirm: "確定要重新嘗試嗎?"
|
||||
watch: "關注"
|
||||
unwatch: "取消關注"
|
||||
accept: "接受"
|
||||
reject: "拒絕"
|
||||
maintainerName: "管理員名稱"
|
||||
maintainerEmail: "管理員信箱"
|
||||
tosUrl: "服務條款URL"
|
||||
thisYear: "今年"
|
||||
thisMonth: "本月"
|
||||
today: "本日"
|
||||
dayX: "{day}天"
|
||||
monthX: "{month}月"
|
||||
yearX: "{year}年"
|
||||
pages: "頁面"
|
||||
connectSerice: "連線"
|
||||
disconnectSerice: "中斷連線"
|
||||
enableLocalTimeline: "開啟本地時間軸"
|
||||
enableGlobalTimeline: "開啟全球時間軸"
|
||||
registration: "註冊"
|
||||
enableRegistration: "開啟新用戶註冊"
|
||||
invite: "邀請"
|
||||
proxyRemoteFiles: "代理遠程檔案"
|
||||
driveCapacityPerLocalAccount: "每個本地用戶的雲端容量"
|
||||
inMb: "以Mbps為單位"
|
||||
iconUrl: "圖像URL"
|
||||
bannerUrl: "橫幅圖片URL"
|
||||
basicInfo: "基本資訊"
|
||||
pinnedUsers: "置頂用戶"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "啟用 reCAPTCHA"
|
||||
recaptchaSiteKey: "網站金鑰"
|
||||
recaptchaSecretKey: "金鑰"
|
||||
name: "名稱"
|
||||
serviceworker: "ServiceWorker"
|
||||
enableServiceworker: "開啟 ServiceWorker"
|
||||
caseSensitive: "區分大小寫"
|
||||
notesAndReplies: "貼文與回覆"
|
||||
withFiles: "附件"
|
||||
silence: "禁言"
|
||||
silenceConfirm: "確定要禁言此用戶嗎?"
|
||||
unsilenceConfirm: "確定要解除禁言嗎?"
|
||||
popularUsers: "熱門用戶"
|
||||
recentlyUpdatedUsers: "最近發文的用戶"
|
||||
recentlyRegisteredUsers: "新加入用戶"
|
||||
recentlyDiscoveredUsers: "最近發現的用戶"
|
||||
userList: "清單"
|
||||
passwordLessLogin: "設置無密碼登入"
|
||||
resetPassword: "重置密碼"
|
||||
newPasswordIs: "新密碼為「{password}」"
|
||||
post: "投稿"
|
||||
posted: "投稿完成"
|
||||
autoReloadWhenDisconnected: "和伺服器斷線時自動重新載入"
|
||||
autoNoteWatch: "自動關注筆記"
|
||||
autoNoteWatchDescription: "收到反應或回覆過的筆記的通知"
|
||||
reduceUiAnimation: "減少介面的動態視覺"
|
||||
share: "分享"
|
||||
notFound: "找不到"
|
||||
notFoundDescription: "找不到與指定URL回應的頁面"
|
||||
uploadFolder: "預設上傳資料夾"
|
||||
cacheClear: "清除暫存"
|
||||
markAsReadAllNotifications: "標記所有通知為已讀"
|
||||
markAsReadAllUnreadNotes: "標記所有筆記為已讀"
|
||||
markAsReadAllTalkMessages: "標記所有訊息為已讀"
|
||||
help: "幫助"
|
||||
inputMessageHere: "在此輸入訊息"
|
||||
close: "關閉"
|
||||
group: "群組"
|
||||
groups: "群組"
|
||||
createGroup: "創建群組"
|
||||
joinedGroups: "群組成員"
|
||||
invites: "邀請"
|
||||
groupName: "群組名稱"
|
||||
members: "成員"
|
||||
transfer: "轉讓"
|
||||
messagingWithUser: "傳送訊息給其他用戶"
|
||||
messagingWithGroup: "發送訊息至群組"
|
||||
title: "標題"
|
||||
text: "文字"
|
||||
enable: "啟用"
|
||||
next: "下一步"
|
||||
retype: "重新輸入"
|
||||
noteOf: "{user}的筆記"
|
||||
inviteToGroup: "邀請至群組"
|
||||
maxNoteTextLength: "筆記的字數限制"
|
||||
quoteAttached: "引用"
|
||||
quoteQuestion: "是否要引用?"
|
||||
noMessagesYet: "沒有訊息"
|
||||
newMessageExists: "有新的訊息"
|
||||
onlyOneFileCanBeAttached: "只能添加一個附件"
|
||||
signinRequired: "請先登入"
|
||||
invitationCode: "邀請碼"
|
||||
checking: "確認中"
|
||||
available: "可用的"
|
||||
unavailable: "不可用的"
|
||||
usernameInvalidFormat: "可使用大小寫英文字母、數字和底線"
|
||||
tooShort: "過短"
|
||||
none: "無"
|
||||
volume: "音量"
|
||||
details: "詳細資訊"
|
||||
_sfx:
|
||||
note: "筆記"
|
||||
noteMy: "我的筆記"
|
||||
notification: "通知"
|
||||
chat: "傳送訊息"
|
||||
_ago:
|
||||
unknown: "未知"
|
||||
future: "未來"
|
||||
justNow: "剛剛"
|
||||
secondsAgo: "{n}秒前"
|
||||
minutesAgo: "{n}分鐘前"
|
||||
hoursAgo: "{n}小時前"
|
||||
daysAgo: "{n}天前"
|
||||
weeksAgo: "{n}周前"
|
||||
monthsAgo: "{n}個月前"
|
||||
yearsAgo: "{n}年前"
|
||||
_time:
|
||||
second: "秒"
|
||||
minute: "分鐘"
|
||||
hour: "小時"
|
||||
day: "天"
|
||||
_tutorial:
|
||||
title: "Misskey使用方法"
|
||||
step1_1: "歡迎!"
|
||||
step1_2: "此為「時間軸」頁面,它會按照時間順序顯示你「追隨」的人的「筆記」"
|
||||
step1_3: "由於你沒有發布任何筆記,也沒有追隨任何人,所以你的時間軸目前是空的。"
|
||||
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
|
||||
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
|
||||
step3_1: "個人資料都打理好了嗎?"
|
||||
step3_2: "下一步讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
|
||||
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
|
||||
step3_4: "不知道該寫什麼內容嗎?試試看「開始使用Misskey了」如何。"
|
||||
step4_1: "筆記發出去了嗎?"
|
||||
step4_2: "如果你的筆記有顯示在時間軸上,就代表已經發文成功。"
|
||||
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
|
||||
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。"
|
||||
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
|
||||
step6_1: "現在你可以在時間軸上看到其他用戶的貼文"
|
||||
step6_2: "你也可以在其他人的貼文上進行「反應」來表達簡單的回覆。"
|
||||
step6_3: "在他人的貼文按下「+」的圖示即可選擇想要的表情符號來進行「反應」。"
|
||||
step7_1: "以上為Misskey的基本操作說明,教學在此告一段落。辛苦了。"
|
||||
step7_2: "歡迎到{help}來瞭解更多Misskey相關介紹。"
|
||||
_widgets:
|
||||
notifications: "通知"
|
||||
timeline: "時間軸"
|
||||
activity: "動態"
|
||||
_cw:
|
||||
show: "載入更多"
|
||||
_poll:
|
||||
deadlineTime: "小時"
|
||||
_visibility:
|
||||
home: "首頁"
|
||||
followers: "追隨者"
|
||||
_profile:
|
||||
name: "名稱"
|
||||
birthday: "生日:"
|
||||
privacy: "隱私"
|
||||
admin/views/dashboard.vue:
|
||||
drive: "雲端硬碟"
|
||||
admin/views/charts.vue:
|
||||
drive: "雲端硬碟"
|
||||
pages:
|
||||
like: "贊"
|
||||
room:
|
||||
furnitures:
|
||||
moon: "月"
|
||||
username: "用戶名"
|
||||
_exportOrImport:
|
||||
followingList: "關注中"
|
||||
muteList: "禁言"
|
||||
blockingList: "封鎖"
|
||||
userLists: "清單"
|
||||
_timelines:
|
||||
home: "首頁"
|
||||
_pages:
|
||||
script:
|
||||
categories:
|
||||
list: "清單"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "清單"
|
||||
_randomPick:
|
||||
arg1: "清單"
|
||||
_dailyRandomPick:
|
||||
arg1: "清單"
|
||||
_seedRandomPick:
|
||||
arg2: "清單"
|
||||
_pick:
|
||||
arg1: "清單"
|
||||
_listLen:
|
||||
arg1: "清單"
|
||||
types:
|
||||
array: "清單"
|
||||
|
14
migration/1576269851876-TalkFederationId.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class TalkFederationId1576269851876 implements MigrationInterface {
|
||||
name = 'TalkFederationId1576269851876'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" ADD "uri" character varying(512)`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "uri"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1576869585998-ProxyRemoteFiles.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class ProxyRemoteFiles1576869585998 implements MigrationInterface {
|
||||
name = 'ProxyRemoteFiles1576869585998'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT false`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyRemoteFiles"`, undefined);
|
||||
}
|
||||
|
||||
}
|
34
migration/1579267006611-v12.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v121579267006611 implements MigrationInterface {
|
||||
name = 'v121579267006611'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "announcement" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "text" character varying(8192) NOT NULL, "title" character varying(256) NOT NULL, "imageUrl" character varying(1024), CONSTRAINT "PK_e0ef0550174fd1099a308fd18a0" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_118ec703e596086fc4515acb39" ON "announcement" ("createdAt") `, undefined);
|
||||
await queryRunner.query(`CREATE TABLE "announcement_read" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "announcementId" character varying(32) NOT NULL, CONSTRAINT "PK_4b90ad1f42681d97b2683890c5e" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_8288151386172b8109f7239ab2" ON "announcement_read" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_603a7b1e7aa0533c6c88e9bfaf" ON "announcement_read" ("announcementId") `, undefined);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_924fa71815cfa3941d003702a0" ON "announcement_read" ("userId", "announcementId") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isVerified"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "announcements"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableEmojiReaction"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" ADD CONSTRAINT "FK_8288151386172b8109f7239ab28" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" ADD CONSTRAINT "FK_603a7b1e7aa0533c6c88e9bfafe" FOREIGN KEY ("announcementId") REFERENCES "announcement"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" DROP CONSTRAINT "FK_603a7b1e7aa0533c6c88e9bfafe"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" DROP CONSTRAINT "FK_8288151386172b8109f7239ab28"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "enableEmojiReaction" boolean NOT NULL DEFAULT true`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "announcements" jsonb NOT NULL DEFAULT '[]'`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "isVerified" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_924fa71815cfa3941d003702a0"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_603a7b1e7aa0533c6c88e9bfaf"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_8288151386172b8109f7239ab2"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "announcement_read"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_118ec703e596086fc4515acb39"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "announcement"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1579270193251-v12-2.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1221579270193251 implements MigrationInterface {
|
||||
name = 'v1221579270193251'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" ADD "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "announcement_read" DROP COLUMN "createdAt"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1579282808087-v12-3.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1231579282808087 implements MigrationInterface {
|
||||
name = 'v1231579282808087'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "announcement" ADD "updatedAt" TIMESTAMP WITH TIME ZONE`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "announcement" DROP COLUMN "updatedAt"`, undefined);
|
||||
}
|
||||
|
||||
}
|
16
migration/1579544426412-v12-4.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1241579544426412 implements MigrationInterface {
|
||||
name = 'v1241579544426412'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "followRequestId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_bd7fab507621e635b32cd31892c" FOREIGN KEY ("followRequestId") REFERENCES "follow_request"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_bd7fab507621e635b32cd31892c"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "followRequestId"`, undefined);
|
||||
}
|
||||
|
||||
}
|
54
migration/1579977526288-v12-5.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1251579977526288 implements MigrationInterface {
|
||||
name = 'v1251579977526288'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "clip" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "isPublic" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_f0685dac8d4dd056d7255670b75" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_2b5ec6c574d6802c94c80313fb" ON "clip" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE TABLE "clip_note" ("id" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "clipId" character varying(32) NOT NULL, CONSTRAINT "PK_e94cda2f40a99b57e032a1a738b" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_a012eaf5c87c65da1deb5fdbfa" ON "clip_note" ("noteId") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_ebe99317bbbe9968a0c6f579ad" ON "clip_note" ("clipId") `, undefined);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_6fc0ec357d55a18646262fdfff" ON "clip_note" ("noteId", "clipId") `, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "antenna_src_enum" AS ENUM('home', 'all', 'list')`, undefined);
|
||||
await queryRunner.query(`CREATE TABLE "antenna" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "name" character varying(128) NOT NULL, "src" "antenna_src_enum" NOT NULL, "userListId" character varying(32), "keywords" jsonb NOT NULL DEFAULT '[]', "withFile" boolean NOT NULL, "expression" character varying(2048), "notify" boolean NOT NULL, "hasNewNote" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_c170b99775e1dccca947c9f2d5f" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_6446c571a0e8d0f05f01c78909" ON "antenna" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE TABLE "antenna_note" ("id" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "antennaId" character varying(32) NOT NULL, CONSTRAINT "PK_fb28d94d0989a3872df19fd6ef8" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_bd0397be22147e17210940e125" ON "antenna_note" ("noteId") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_0d775946662d2575dfd2068a5f" ON "antenna_note" ("antennaId") `, undefined);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_335a0bf3f904406f9ef3dd51c2" ON "antenna_note" ("noteId", "antennaId") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "geo"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip" ADD CONSTRAINT "FK_2b5ec6c574d6802c94c80313fb2" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip_note" ADD CONSTRAINT "FK_a012eaf5c87c65da1deb5fdbfa3" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip_note" ADD CONSTRAINT "FK_ebe99317bbbe9968a0c6f579adf" FOREIGN KEY ("clipId") REFERENCES "clip"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD CONSTRAINT "FK_6446c571a0e8d0f05f01c789096" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD CONSTRAINT "FK_709d7d32053d0dd7620f678eeb9" FOREIGN KEY ("userListId") REFERENCES "user_list"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" ADD CONSTRAINT "FK_bd0397be22147e17210940e125b" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" ADD CONSTRAINT "FK_0d775946662d2575dfd2068a5f5" FOREIGN KEY ("antennaId") REFERENCES "antenna"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" DROP CONSTRAINT "FK_0d775946662d2575dfd2068a5f5"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" DROP CONSTRAINT "FK_bd0397be22147e17210940e125b"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP CONSTRAINT "FK_709d7d32053d0dd7620f678eeb9"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP CONSTRAINT "FK_6446c571a0e8d0f05f01c789096"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip_note" DROP CONSTRAINT "FK_ebe99317bbbe9968a0c6f579adf"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip_note" DROP CONSTRAINT "FK_a012eaf5c87c65da1deb5fdbfa3"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "clip" DROP CONSTRAINT "FK_2b5ec6c574d6802c94c80313fb2"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD "geo" jsonb`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_335a0bf3f904406f9ef3dd51c2"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_0d775946662d2575dfd2068a5f"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_bd0397be22147e17210940e125"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "antenna_note"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_6446c571a0e8d0f05f01c78909"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "antenna"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_6fc0ec357d55a18646262fdfff"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_ebe99317bbbe9968a0c6f579ad"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_a012eaf5c87c65da1deb5fdbfa"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "clip_note"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_2b5ec6c574d6802c94c80313fb"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "clip"`, undefined);
|
||||
}
|
||||
|
||||
}
|
18
migration/1579993013959-v12-6.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1261579993013959 implements MigrationInterface {
|
||||
name = 'v1261579993013959'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "hasNewNote"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" ADD "read" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_9937ea48d7ae97ffb4f3f063a4" ON "antenna_note" ("read") `, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_9937ea48d7ae97ffb4f3f063a4"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna_note" DROP COLUMN "read"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "hasNewNote" boolean NOT NULL DEFAULT false`, undefined);
|
||||
}
|
||||
|
||||
}
|
24
migration/1580069531114-v12-7.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1271580069531114 implements MigrationInterface {
|
||||
name = 'v1271580069531114'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "users" character varying(1024) array NOT NULL DEFAULT '{}'::varchar[]`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "caseSensitive" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "public"."antenna_src_enum" RENAME TO "antenna_src_enum_old"`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "antenna_src_enum" AS ENUM('home', 'all', 'users', 'list')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum" USING "src"::"text"::"antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "antenna_src_enum_old"`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TYPE "antenna_src_enum_old" AS ENUM('home', 'all', 'list')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum_old" USING "src"::"text"::"antenna_src_enum_old"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "antenna_src_enum_old" RENAME TO "antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "caseSensitive"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined);
|
||||
}
|
||||
|
||||
}
|
16
migration/1580148575182-v12-8.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1281580148575182 implements MigrationInterface {
|
||||
name = 'v1281580148575182'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP CONSTRAINT "FK_ec5c201576192ba8904c345c5cc"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "appId"`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD "appId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_ec5c201576192ba8904c345c5cc" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE SET NULL ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1580154400017-v12-9.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v1291580154400017 implements MigrationInterface {
|
||||
name = 'v1291580154400017'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "withReplies" boolean NOT NULL DEFAULT false`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "withReplies"`, undefined);
|
||||
}
|
||||
|
||||
}
|
19
migration/1580276619901-v12-10.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v12101580276619901 implements MigrationInterface {
|
||||
name = 'v12101580276619901'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`TRUNCATE TABLE "notification"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "type"`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "type" "notification_type_enum" NOT NULL`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "type"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "type" character varying(32) NOT NULL`, undefined);
|
||||
}
|
||||
|
||||
}
|
18
migration/1580331224276-v12-11.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v12111580331224276 implements MigrationInterface {
|
||||
name = 'v12111580331224276'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "isMarkedAsClosed"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "instance" ADD "isSuspended" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_34500da2e38ac393f7bb6b299c" ON "instance" ("isSuspended") `, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_34500da2e38ac393f7bb6b299c"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "isSuspended"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "instance" ADD "isMarkedAsClosed" boolean NOT NULL DEFAULT false`, undefined);
|
||||
}
|
||||
|
||||
}
|
46
migration/1580508795118-v12-12.ts
Normal file
@ -0,0 +1,46 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v12121580508795118 implements MigrationInterface {
|
||||
name = 'v12121580508795118'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "twitter"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "twitterAccessToken"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "twitterAccessTokenSecret"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "twitterUserId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "twitterScreenName"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "github"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "githubAccessToken"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "githubId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "githubLogin"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discord"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordAccessToken"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordRefreshToken"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordExpiresDate"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordUsername"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "discordDiscriminator"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "integrations" jsonb NOT NULL DEFAULT '{}'`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "integrations"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordDiscriminator" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordUsername" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordId" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordExpiresDate" character varying(64)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordRefreshToken" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discordAccessToken" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "discord" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "githubLogin" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "githubId" character varying(64)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "githubAccessToken" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "github" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitterScreenName" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitterUserId" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitterAccessTokenSecret" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitterAccessToken" character varying(64) DEFAULT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitter" boolean NOT NULL DEFAULT false`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1580543501339-v12-13.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v12131580543501339 implements MigrationInterface {
|
||||
name = 'v12131580543501339'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE INDEX "IDX_NOTE_TAGS" ON "note" USING gin ("tags")`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_NOTE_TAGS"`, undefined);
|
||||
}
|
||||
|
||||
}
|
20
migration/1580864313253-v12-14.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class v12141580864313253 implements MigrationInterface {
|
||||
name = 'v12141580864313253'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" RENAME COLUMN "proxyAccount" TO "proxyAccountId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyAccountId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyAccountId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD CONSTRAINT "FK_ab1bc0c1e209daa77b8e8d212ad" FOREIGN KEY ("proxyAccountId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP CONSTRAINT "FK_ab1bc0c1e209daa77b8e8d212ad"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyAccountId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "proxyAccountId" character varying(128)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "meta" RENAME COLUMN "proxyAccountId" TO "proxyAccount"`, undefined);
|
||||
}
|
||||
|
||||
}
|
38
migration/1581526429287-user-group-invitation.ts
Normal file
@ -0,0 +1,38 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class userGroupInvitation1581526429287 implements MigrationInterface {
|
||||
name = 'userGroupInvitation1581526429287'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "user_group_invitation" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_160c63ec02bf23f6a5c5e8140d6" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_bfbc6305547539369fe73eb144" ON "user_group_invitation" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_5cc8c468090e129857e9fecce5" ON "user_group_invitation" ("userGroupId") `, undefined);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e9793f65f504e5a31fbaedbf2f" ON "user_group_invitation" ("userId", "userGroupId") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "userGroupInvitationId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum" USING "type"::"text"::"notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS 'The type of the Notification.'`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invitation" ADD CONSTRAINT "FK_bfbc6305547539369fe73eb144a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invitation" ADD CONSTRAINT "FK_5cc8c468090e129857e9fecce5a" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_8fe87814e978053a53b1beb7e98" FOREIGN KEY ("userGroupInvitationId") REFERENCES "user_group_invitation"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_8fe87814e978053a53b1beb7e98"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invitation" DROP CONSTRAINT "FK_5cc8c468090e129857e9fecce5a"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "user_group_invitation" DROP CONSTRAINT "FK_bfbc6305547539369fe73eb144a"`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS ''`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum_old" USING "type"::"text"::"notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "notification_type_enum_old" RENAME TO "notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "userGroupInvitationId"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_e9793f65f504e5a31fbaedbf2f"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_5cc8c468090e129857e9fecce5"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_bfbc6305547539369fe73eb144"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "user_group_invitation"`, undefined);
|
||||
}
|
||||
|
||||
}
|
28
migration/1581695816408-user-group-antenna.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class userGroupAntenna1581695816408 implements MigrationInterface {
|
||||
name = 'userGroupAntenna1581695816408'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "userGroupJoiningId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "public"."antenna_src_enum" RENAME TO "antenna_src_enum_old"`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "antenna_src_enum" AS ENUM('home', 'all', 'users', 'list', 'group')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum" USING "src"::"text"::"antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "antenna_src_enum_old"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "users" character varying(1024) array NOT NULL DEFAULT '{}'::varchar[]`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD CONSTRAINT "FK_ccbf5a8c0be4511133dcc50ddeb" FOREIGN KEY ("userGroupJoiningId") REFERENCES "user_group_joining"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP CONSTRAINT "FK_ccbf5a8c0be4511133dcc50ddeb"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "users" character varying array NOT NULL DEFAULT '{}'`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "antenna_src_enum_old" AS ENUM('home', 'all', 'users', 'list')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum_old" USING "src"::"text"::"antenna_src_enum_old"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "antenna_src_enum_old" RENAME TO "antenna_src_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "userGroupJoiningId"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1581708415836-drive-user-folder-id-index.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class driveUserFolderIdIndex1581708415836 implements MigrationInterface {
|
||||
name = 'driveUserFolderIdIndex1581708415836'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE INDEX "IDX_55720b33a61a7c806a8215b825" ON "drive_file" ("userId", "folderId", "id") `, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`DROP INDEX "IDX_55720b33a61a7c806a8215b825"`, undefined);
|
||||
}
|
||||
|
||||
}
|
28
migration/1581979837262-promo.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class promo1581979837262 implements MigrationInterface {
|
||||
name = 'promo1581979837262'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`CREATE TABLE "promo_note" ("noteId" character varying(32) NOT NULL, "expiresAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, CONSTRAINT "REL_e263909ca4fe5d57f8d4230dd5" UNIQUE ("noteId"), CONSTRAINT "PK_e263909ca4fe5d57f8d4230dd5c" PRIMARY KEY ("noteId"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_83f0862e9bae44af52ced7099e" ON "promo_note" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE TABLE "promo_read" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_61917c1541002422b703318b7c9" PRIMARY KEY ("id"))`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_9657d55550c3d37bfafaf7d4b0" ON "promo_read" ("userId") `, undefined);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_2882b8a1a07c7d281a98b6db16" ON "promo_read" ("userId", "noteId") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "promo_note" ADD CONSTRAINT "FK_e263909ca4fe5d57f8d4230dd5c" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "promo_read" ADD CONSTRAINT "FK_9657d55550c3d37bfafaf7d4b05" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "promo_read" ADD CONSTRAINT "FK_a46a1a603ecee695d7db26da5f4" FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "promo_read" DROP CONSTRAINT "FK_a46a1a603ecee695d7db26da5f4"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "promo_read" DROP CONSTRAINT "FK_9657d55550c3d37bfafaf7d4b05"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "promo_note" DROP CONSTRAINT "FK_e263909ca4fe5d57f8d4230dd5c"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_2882b8a1a07c7d281a98b6db16"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_9657d55550c3d37bfafaf7d4b0"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "promo_read"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_83f0862e9bae44af52ced7099e"`, undefined);
|
||||
await queryRunner.query(`DROP TABLE "promo_note"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1582019042083-featured-injecttion.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class featuredInjecttion1582019042083 implements MigrationInterface {
|
||||
name = 'featuredInjecttion1582019042083'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" ADD "injectFeaturedNote" boolean NOT NULL DEFAULT true`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "injectFeaturedNote"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1582210532752-antenna-exclude.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class antennaExclude1582210532752 implements MigrationInterface {
|
||||
name = 'antennaExclude1582210532752'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" ADD "excludeKeywords" jsonb NOT NULL DEFAULT '[]'`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "excludeKeywords"`, undefined);
|
||||
}
|
||||
|
||||
}
|
14
migration/1582875306439-note-reaction-length.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class noteReactionLength1582875306439 implements MigrationInterface {
|
||||
name = 'noteReactionLength1582875306439'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(130)`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(128)`, undefined);
|
||||
}
|
||||
|
||||
}
|
36
migration/1585361548360-miauth.ts
Normal file
@ -0,0 +1,36 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class miauth1585361548360 implements MigrationInterface {
|
||||
name = 'miauth1585361548360'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "lastUsedAt" TIMESTAMP WITH TIME ZONE DEFAULT null`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "session" character varying(128) DEFAULT null`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "name" character varying(128) DEFAULT null`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "description" character varying(512) DEFAULT null`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "iconUrl" character varying(512) DEFAULT null`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "permission" character varying(64) array NOT NULL DEFAULT '{}'::varchar[]`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD "fetched" boolean NOT NULL DEFAULT false`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" DROP NOT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" SET DEFAULT null`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_bf3a053c07d9fb5d87317c56ee" ON "access_token" ("session") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_bf3a053c07d9fb5d87317c56ee"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" DROP DEFAULT`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ALTER COLUMN "appId" SET NOT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" ADD CONSTRAINT "FK_a3ff16c90cc87a82a0b5959e560" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "fetched"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "permission"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "iconUrl"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "description"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "name"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "session"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "lastUsedAt"`, undefined);
|
||||
}
|
||||
|
||||
}
|
48
migration/1585385921215-custom-notification.ts
Normal file
@ -0,0 +1,48 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class customNotification1585385921215 implements MigrationInterface {
|
||||
name = 'customNotification1585385921215'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "customBody" character varying(2048)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "customHeader" character varying(256)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "customIcon" character varying(1024)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD "appAccessTokenId" character varying(32)`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "notifierId" DROP NOT NULL`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifierId" IS 'The ID of sender user of the Notification.'`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum" USING "type"::"text"::"notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS 'The type of the Notification.'`, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON "notification" ("notifierId") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON "notification" ("type") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON "notification" ("isRead") `, undefined);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON "notification" ("appAccessTokenId") `, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES "access_token"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<any> {
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_080ab397c379af09b9d2169e5b"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_33f33cc8ef29d805a97ff4628b"`, undefined);
|
||||
await queryRunner.query(`DROP INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71"`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."type" IS ''`, undefined);
|
||||
await queryRunner.query(`CREATE TYPE "notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited')`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "notification_type_enum_old" USING "type"::"text"::"notification_type_enum_old"`, undefined);
|
||||
await queryRunner.query(`DROP TYPE "notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`ALTER TYPE "notification_type_enum_old" RENAME TO "notification_type_enum"`, undefined);
|
||||
await queryRunner.query(`COMMENT ON COLUMN "notification"."notifierId" IS ''`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "notifierId" SET NOT NULL`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "appAccessTokenId"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customIcon"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customHeader"`, undefined);
|
||||
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customBody"`, undefined);
|
||||
}
|
||||
|
||||
}
|
234
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "11.35.1",
|
||||
"codename": "daybreak",
|
||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||
"version": "12.27.0",
|
||||
"codename": "indigo",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/syuilo/misskey.git"
|
||||
@ -21,142 +21,140 @@
|
||||
"gulp": "gulp build",
|
||||
"clean": "gulp clean",
|
||||
"cleanall": "gulp cleanall",
|
||||
"lint": "gulp lint",
|
||||
"test": "gulp test",
|
||||
"lint": "tslint 'src/**/*.ts'",
|
||||
"test": "cross-env TS_NODE_FILES=true gulp test",
|
||||
"format": "gulp format"
|
||||
},
|
||||
"resolutions": {
|
||||
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
|
||||
"https-proxy-agent": "^3.0.0",
|
||||
"lodash": "^4.17.13"
|
||||
},
|
||||
"dependencies": {
|
||||
"@elastic/elasticsearch": "7.4.0",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.25",
|
||||
"@fortawesome/free-brands-svg-icons": "5.11.2",
|
||||
"@fortawesome/free-regular-svg-icons": "5.11.2",
|
||||
"@fortawesome/free-solid-svg-icons": "5.11.2",
|
||||
"@fortawesome/vue-fontawesome": "0.1.7",
|
||||
"@elastic/elasticsearch": "7.6.0",
|
||||
"@fortawesome/fontawesome-svg-core": "1.2.27",
|
||||
"@fortawesome/free-brands-svg-icons": "5.12.1",
|
||||
"@fortawesome/free-regular-svg-icons": "5.12.1",
|
||||
"@fortawesome/free-solid-svg-icons": "5.12.1",
|
||||
"@fortawesome/vue-fontawesome": "0.1.9",
|
||||
"@juggle/resize-observer": "3.0.2",
|
||||
"@koa/cors": "3.0.0",
|
||||
"@koa/multer": "2.0.0",
|
||||
"@koa/router": "8.0.2",
|
||||
"@koa/multer": "2.0.2",
|
||||
"@koa/router": "8.0.8",
|
||||
"@types/bcryptjs": "2.4.2",
|
||||
"@types/bull": "3.10.3",
|
||||
"@types/cbor": "2.0.0",
|
||||
"@types/bull": "3.12.0",
|
||||
"@types/cbor": "5.0.0",
|
||||
"@types/dateformat": "3.0.1",
|
||||
"@types/deep-equal": "1.0.1",
|
||||
"@types/double-ended-queue": "2.1.1",
|
||||
"@types/glob": "7.1.1",
|
||||
"@types/gulp": "4.0.6",
|
||||
"@types/gulp-mocha": "0.0.32",
|
||||
"@types/gulp-rename": "0.0.33",
|
||||
"@types/gulp-replace": "0.0.31",
|
||||
"@types/gulp-uglify": "3.0.6",
|
||||
"@types/gulp-util": "3.0.34",
|
||||
"@types/is-url": "1.2.28",
|
||||
"@types/js-yaml": "3.12.1",
|
||||
"@types/js-yaml": "3.12.2",
|
||||
"@types/jsdom": "12.2.4",
|
||||
"@types/katex": "0.10.2",
|
||||
"@types/koa": "2.0.50",
|
||||
"@types/koa-bodyparser": "5.0.2",
|
||||
"@types/katex": "0.11.0",
|
||||
"@types/koa": "2.11.1",
|
||||
"@types/koa-bodyparser": "4.3.0",
|
||||
"@types/koa-compress": "2.0.9",
|
||||
"@types/koa-cors": "0.0.0",
|
||||
"@types/koa-favicon": "2.0.19",
|
||||
"@types/koa-logger": "3.1.1",
|
||||
"@types/koa-mount": "4.0.0",
|
||||
"@types/koa-send": "4.1.2",
|
||||
"@types/koa-views": "2.0.3",
|
||||
"@types/koa__cors": "2.2.3",
|
||||
"@types/koa__multer": "2.0.0",
|
||||
"@types/koa__router": "8.0.0",
|
||||
"@types/lolex": "3.1.1",
|
||||
"@types/mocha": "5.2.7",
|
||||
"@types/node": "12.7.12",
|
||||
"@types/nodemailer": "6.2.1",
|
||||
"@types/koa-views": "2.0.4",
|
||||
"@types/koa__cors": "3.0.1",
|
||||
"@types/koa__multer": "2.0.1",
|
||||
"@types/koa__router": "8.0.2",
|
||||
"@types/lolex": "5.1.0",
|
||||
"@types/markdown-it": "0.0.9",
|
||||
"@types/mocha": "7.0.1",
|
||||
"@types/node": "13.7.1",
|
||||
"@types/nodemailer": "6.4.0",
|
||||
"@types/nprogress": "0.2.0",
|
||||
"@types/oauth": "0.9.1",
|
||||
"@types/parse5": "5.0.2",
|
||||
"@types/parsimmon": "1.10.0",
|
||||
"@types/parsimmon": "1.10.1",
|
||||
"@types/portscanner": "2.1.0",
|
||||
"@types/pug": "2.0.4",
|
||||
"@types/qrcode": "1.3.4",
|
||||
"@types/random-seed": "0.3.3",
|
||||
"@types/ratelimiter": "2.1.28",
|
||||
"@types/redis": "2.8.14",
|
||||
"@types/redis": "2.8.15",
|
||||
"@types/rename": "1.0.1",
|
||||
"@types/request": "2.48.3",
|
||||
"@types/request": "2.48.4",
|
||||
"@types/request-promise-native": "1.0.17",
|
||||
"@types/request-stats": "3.0.0",
|
||||
"@types/rimraf": "2.0.2",
|
||||
"@types/rimraf": "2.0.3",
|
||||
"@types/seedrandom": "2.4.28",
|
||||
"@types/sharp": "0.22.3",
|
||||
"@types/sharp": "0.24.0",
|
||||
"@types/showdown": "1.9.3",
|
||||
"@types/speakeasy": "2.0.5",
|
||||
"@types/systeminformation": "3.23.1",
|
||||
"@types/systeminformation": "3.54.1",
|
||||
"@types/tinycolor2": "1.4.2",
|
||||
"@types/tmp": "0.1.0",
|
||||
"@types/uuid": "3.4.5",
|
||||
"@types/uuid": "3.4.7",
|
||||
"@types/web-push": "3.3.0",
|
||||
"@types/webpack": "4.39.3",
|
||||
"@types/webpack": "4.41.6",
|
||||
"@types/webpack-stream": "3.2.10",
|
||||
"@types/websocket": "0.0.40",
|
||||
"@types/ws": "6.0.3",
|
||||
"@typescript-eslint/parser": "2.3.3",
|
||||
"@types/websocket": "1.0.0",
|
||||
"@types/ws": "7.2.1",
|
||||
"@typescript-eslint/parser": "2.19.2",
|
||||
"agentkeepalive": "4.1.0",
|
||||
"animejs": "3.1.0",
|
||||
"apexcharts": "3.10.1",
|
||||
"apexcharts": "3.15.6",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
"aws-sdk": "2.548.0",
|
||||
"aws-sdk": "2.617.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"bootstrap": "4.3.1",
|
||||
"bootstrap-vue": "2.0.4",
|
||||
"bull": "3.11.0",
|
||||
"cafy": "15.1.1",
|
||||
"bull": "3.12.1",
|
||||
"cafy": "15.2.1",
|
||||
"cbor": "5.0.1",
|
||||
"chai": "4.2.0",
|
||||
"chalk": "2.4.2",
|
||||
"cli-highlight": "2.1.1",
|
||||
"commander": "3.0.2",
|
||||
"chalk": "3.0.0",
|
||||
"chart.js": "2.9.3",
|
||||
"cli-highlight": "2.1.4",
|
||||
"commander": "4.1.1",
|
||||
"content-disposition": "0.5.3",
|
||||
"crc-32": "1.2.0",
|
||||
"css-loader": "3.2.0",
|
||||
"css-loader": "3.4.2",
|
||||
"cssnano": "4.1.10",
|
||||
"dateformat": "3.0.3",
|
||||
"deep-equal": "1.1.0",
|
||||
"diskusage": "1.1.3",
|
||||
"double-ended-queue": "2.1.0-0",
|
||||
"eslint": "6.5.1",
|
||||
"eslint-plugin-vue": "5.2.3",
|
||||
"eslint": "6.8.0",
|
||||
"eslint-plugin-vue": "6.1.2",
|
||||
"eventemitter3": "4.0.0",
|
||||
"feed": "4.0.0",
|
||||
"file-type": "12.3.0",
|
||||
"feed": "4.1.0",
|
||||
"fibers": "4.0.2",
|
||||
"file-type": "14.1.2",
|
||||
"fluent-ffmpeg": "2.1.2",
|
||||
"glob": "7.1.6",
|
||||
"gulp": "4.0.2",
|
||||
"gulp-cssnano": "2.1.3",
|
||||
"gulp-clean-css": "4.2.0",
|
||||
"gulp-dart-sass": "0.9.1",
|
||||
"gulp-mocha": "7.0.2",
|
||||
"gulp-rename": "1.4.0",
|
||||
"gulp-rename": "2.0.0",
|
||||
"gulp-replace": "1.0.0",
|
||||
"gulp-sourcemaps": "2.6.5",
|
||||
"gulp-stylus": "2.7.0",
|
||||
"gulp-terser": "1.2.0",
|
||||
"gulp-tslint": "8.1.4",
|
||||
"gulp-typescript": "5.0.1",
|
||||
"gulp-uglify": "3.0.2",
|
||||
"gulp-util": "3.0.8",
|
||||
"hard-source-webpack-plugin": "0.13.1",
|
||||
"html-minifier": "4.0.0",
|
||||
"http-signature": "1.2.0",
|
||||
"https-proxy-agent": "3.0.0",
|
||||
"http-signature": "1.3.1",
|
||||
"https-proxy-agent": "5.0.0",
|
||||
"insert-text-at-cursor": "0.3.0",
|
||||
"is-root": "2.1.0",
|
||||
"is-svg": "4.2.0",
|
||||
"is-svg": "4.2.1",
|
||||
"js-yaml": "3.13.1",
|
||||
"jsdom": "15.1.1",
|
||||
"jsdom": "16.1.0",
|
||||
"json5": "2.1.1",
|
||||
"json5-loader": "3.0.0",
|
||||
"jsrsasign": "8.0.12",
|
||||
"katex": "0.11.1",
|
||||
"koa": "2.10.0",
|
||||
"koa": "2.11.0",
|
||||
"koa-bodyparser": "4.2.1",
|
||||
"koa-compress": "3.0.0",
|
||||
"koa-favicon": "2.0.1",
|
||||
@ -168,104 +166,106 @@
|
||||
"koa-views": "6.2.1",
|
||||
"langmap": "0.0.16",
|
||||
"loader-utils": "1.2.3",
|
||||
"lolex": "4.2.0",
|
||||
"lolex": "5.1.2",
|
||||
"lookup-dns-cache": "2.1.0",
|
||||
"mocha": "6.2.1",
|
||||
"markdown-it": "10.0.0",
|
||||
"markdown-it-anchor": "5.2.5",
|
||||
"mocha": "7.0.1",
|
||||
"moji": "0.5.1",
|
||||
"ms": "2.1.2",
|
||||
"multer": "1.4.2",
|
||||
"nested-property": "1.0.1",
|
||||
"nested-property": "1.0.4",
|
||||
"node-fetch": "2.6.0",
|
||||
"nodemailer": "6.3.1",
|
||||
"nodemailer": "6.4.2",
|
||||
"nprogress": "0.2.0",
|
||||
"object-assign-deep": "0.4.0",
|
||||
"os-utils": "0.0.14",
|
||||
"parse5": "5.1.0",
|
||||
"parse5": "5.1.1",
|
||||
"parsimmon": "1.13.0",
|
||||
"pg": "7.12.1",
|
||||
"pg": "7.18.1",
|
||||
"portal-vue": "2.1.7",
|
||||
"portscanner": "2.2.0",
|
||||
"postcss-loader": "3.0.0",
|
||||
"prismjs": "1.17.1",
|
||||
"progress-bar-webpack-plugin": "1.12.1",
|
||||
"prismjs": "1.19.0",
|
||||
"probe-image-size": "5.0.0",
|
||||
"progress-bar-webpack-plugin": "2.1.0",
|
||||
"promise-limit": "2.7.0",
|
||||
"promise-sequential": "1.1.1",
|
||||
"pug": "2.0.4",
|
||||
"punycode": "2.1.1",
|
||||
"pureimage": "0.1.6",
|
||||
"qrcode": "1.4.2",
|
||||
"qrcode": "1.4.4",
|
||||
"random-seed": "0.3.0",
|
||||
"randomcolor": "0.5.4",
|
||||
"ratelimiter": "3.3.1",
|
||||
"ratelimiter": "3.4.0",
|
||||
"recaptcha-promise": "0.1.3",
|
||||
"reconnecting-websocket": "4.2.0",
|
||||
"redis": "2.8.0",
|
||||
"reconnecting-websocket": "4.4.0",
|
||||
"redis": "3.0.2",
|
||||
"redis-lock": "0.1.4",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rename": "1.0.4",
|
||||
"request": "2.88.0",
|
||||
"request-promise-native": "1.0.7",
|
||||
"request": "2.88.2",
|
||||
"request-promise-native": "1.0.8",
|
||||
"request-stats": "3.0.0",
|
||||
"require-all": "3.0.0",
|
||||
"rimraf": "3.0.0",
|
||||
"rimraf": "3.0.2",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
"sass": "1.25.0",
|
||||
"sass-loader": "8.0.2",
|
||||
"seedrandom": "3.0.5",
|
||||
"sharp": "0.23.1",
|
||||
"showdown": "1.9.0",
|
||||
"sharp": "0.24.0",
|
||||
"showdown": "1.9.1",
|
||||
"showdown-highlightjs-extension": "0.1.2",
|
||||
"speakeasy": "2.0.0",
|
||||
"stringz": "2.0.0",
|
||||
"style-loader": "1.0.0",
|
||||
"stylus": "0.54.7",
|
||||
"stylus-loader": "3.0.2",
|
||||
"style-loader": "1.1.3",
|
||||
"summaly": "2.3.1",
|
||||
"syslog-pro": "1.0.0",
|
||||
"systeminformation": "4.14.11",
|
||||
"systeminformation": "4.21.2",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"terser-webpack-plugin": "2.1.3",
|
||||
"terser-webpack-plugin": "2.3.4",
|
||||
"textarea-caret": "3.1.0",
|
||||
"three": "0.109.0",
|
||||
"three": "0.113.2",
|
||||
"tinycolor2": "1.4.1",
|
||||
"tmp": "0.1.0",
|
||||
"ts-loader": "6.2.0",
|
||||
"ts-node": "8.4.1",
|
||||
"tslint": "5.20.0",
|
||||
"ts-loader": "6.2.1",
|
||||
"ts-node": "8.6.2",
|
||||
"tslint": "6.0.0",
|
||||
"tslint-sonarts": "1.9.0",
|
||||
"typeorm": "0.2.19",
|
||||
"typescript": "3.6.4",
|
||||
"uglify-es": "3.3.9",
|
||||
"typeorm": "0.2.22",
|
||||
"typescript": "3.7.5",
|
||||
"ulid": "2.3.0",
|
||||
"url-loader": "2.2.0",
|
||||
"uuid": "3.3.3",
|
||||
"url-loader": "3.0.0",
|
||||
"uuid": "3.4.0",
|
||||
"v-animate-css": "0.0.3",
|
||||
"v-debounce": "0.1.2",
|
||||
"vue": "2.6.10",
|
||||
"vue": "2.6.11",
|
||||
"vue-color": "2.7.0",
|
||||
"vue-content-loading": "1.6.0",
|
||||
"vue-cropperjs": "4.0.0",
|
||||
"vue-i18n": "8.14.1",
|
||||
"vue-js-modal": "1.3.31",
|
||||
"vue-json-pretty": "1.6.2",
|
||||
"vue-loader": "15.7.1",
|
||||
"vue-cropperjs": "4.0.1",
|
||||
"vue-i18n": "8.15.3",
|
||||
"vue-json-pretty": "1.6.3",
|
||||
"vue-loader": "15.9.0",
|
||||
"vue-marquee-text-component": "1.1.1",
|
||||
"vue-meta": "2.3.2",
|
||||
"vue-prism-component": "1.1.1",
|
||||
"vue-router": "3.1.3",
|
||||
"vue-sequential-entrance": "1.1.3",
|
||||
"vue-router": "3.1.5",
|
||||
"vue-style-loader": "4.1.2",
|
||||
"vue-svg-inline-loader": "1.3.3",
|
||||
"vue-template-compiler": "2.6.10",
|
||||
"vue-svg-inline-loader": "1.4.5",
|
||||
"vue-template-compiler": "2.6.11",
|
||||
"vuedraggable": "2.23.2",
|
||||
"vuewordcloud": "18.7.11",
|
||||
"vuex": "3.1.1",
|
||||
"vuex-persistedstate": "2.5.4",
|
||||
"web-push": "3.4.0",
|
||||
"webpack": "4.41.1",
|
||||
"webpack-cli": "3.3.9",
|
||||
"websocket": "1.0.30",
|
||||
"ws": "7.1.2",
|
||||
"vuex": "3.1.2",
|
||||
"vuex-persistedstate": "2.7.1",
|
||||
"web-push": "3.4.3",
|
||||
"webpack": "4.41.6",
|
||||
"webpack-cli": "3.3.11",
|
||||
"websocket": "1.0.31",
|
||||
"ws": "7.2.1",
|
||||
"xev": "2.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fluent-ffmpeg": "2.1.10"
|
||||
"@types/fluent-ffmpeg": "2.1.12",
|
||||
"cross-env": "6.0.3"
|
||||
}
|
||||
}
|
||||
|
3
src/@types/const.json.d.ts
vendored
@ -1,3 +0,0 @@
|
||||
declare module '*/const.json' {
|
||||
const copyright: string;
|
||||
}
|
9
src/@types/jsrsasign.d.ts
vendored
@ -171,6 +171,7 @@ declare module 'jsrsasign' {
|
||||
|
||||
public static getTLVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string): ASN1TLV;
|
||||
|
||||
// tslint:disable-next-line:bool-param-default
|
||||
public static getVbyList(h: ASN1S, currentIndex: Idx<ASN1ObjectString>, nthList: Mutable<Nth[]>, checkingTag?: string, removeUnusedbits?: boolean): ASN1V;
|
||||
|
||||
public static hextooidstr(hex: ASN1OIDV): OID;
|
||||
@ -620,9 +621,7 @@ declare module 'jsrsasign' {
|
||||
|
||||
public encrypt(text: string): HexString | null;
|
||||
|
||||
public encryptOAEP(text: string, hash?: string, hashLen?: number): HexString | null;
|
||||
|
||||
public encryptOAEP(text: string, hash?: (s: string) => string, hashLen?: number): HexString | null;
|
||||
public encryptOAEP(text: string, hash?: string | ((s: string) => string), hashLen?: number): HexString | null;
|
||||
|
||||
//// RSA PRIVATE
|
||||
|
||||
@ -638,9 +637,7 @@ declare module 'jsrsasign' {
|
||||
|
||||
public decrypt(ctext: HexString): string;
|
||||
|
||||
public decryptOAEP(ctext: HexString, hash?: string, hashLen?: number): string | null;
|
||||
|
||||
public encryptOAEP(ctext: HexString, hash?: (s: string) => string, hashLen?: number): string | null;
|
||||
public decryptOAEP(ctext: HexString, hash?: string | ((s: string) => string), hashLen?: number): string | null;
|
||||
|
||||
//// RSA PEM
|
||||
|
||||
|
27
src/@types/probe-image-size.d.ts
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
declare module 'probe-image-size' {
|
||||
import { ReadStream } from 'fs';
|
||||
|
||||
type ProbeOptions = {
|
||||
retries: 1;
|
||||
timeout: 30000;
|
||||
};
|
||||
|
||||
type ProbeResult = {
|
||||
width: number;
|
||||
height: number;
|
||||
length?: number;
|
||||
type: string;
|
||||
mime: string;
|
||||
wUnits: 'in' | 'mm' | 'cm' | 'pt' | 'pc' | 'px' | 'em' | 'ex';
|
||||
hUnits: 'in' | 'mm' | 'cm' | 'pt' | 'pc' | 'px' | 'em' | 'ex';
|
||||
url?: string;
|
||||
};
|
||||
|
||||
function probeImageSize(src: string | ReadStream, options?: ProbeOptions): Promise<ProbeResult>;
|
||||
function probeImageSize(src: string | ReadStream, callback: (err: Error | null, result?: ProbeResult) => void): void;
|
||||
function probeImageSize(src: string | ReadStream, options: ProbeOptions, callback: (err: Error | null, result?: ProbeResult) => void): void;
|
||||
|
||||
namespace probeImageSize {} // Hack
|
||||
|
||||
export = probeImageSize;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
import * as cluster from 'cluster';
|
||||
import chalk from 'chalk';
|
||||
import * as chalk from 'chalk';
|
||||
import Xev from 'xev';
|
||||
|
||||
import Logger from '../services/logger';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import * as os from 'os';
|
||||
import * as cluster from 'cluster';
|
||||
import chalk from 'chalk';
|
||||
import * as chalk from 'chalk';
|
||||
import * as portscanner from 'portscanner';
|
||||
import * as isRoot from 'is-root';
|
||||
|
||||
@ -11,14 +11,15 @@ import { lessThan } from '../prelude/array';
|
||||
import { program } from '../argv';
|
||||
import { showMachineInfo } from '../misc/show-machine-info';
|
||||
import { initDb } from '../db/postgre';
|
||||
import * as meta from '../meta.json';
|
||||
|
||||
const logger = new Logger('core', 'cyan');
|
||||
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
|
||||
|
||||
function greet(config: Config) {
|
||||
function greet() {
|
||||
if (!program.quiet) {
|
||||
//#region Misskey logo
|
||||
const v = `v${config.version}`;
|
||||
const v = `v${meta.version}`;
|
||||
console.log(' _____ _ _ ');
|
||||
console.log(' | |_|___ ___| |_ ___ _ _ ');
|
||||
console.log(' | | | | |_ -|_ -| \'_| -_| | |');
|
||||
@ -26,7 +27,7 @@ function greet(config: Config) {
|
||||
console.log(' ' + chalk.gray(v) + (' |___|\n'.substr(v.length)));
|
||||
//#endregion
|
||||
|
||||
console.log(' Misskey is maintained by @syuilo, @AyaMorisawa, @mei23, @acid-chicken, and @rinsuki.');
|
||||
console.log(' Misskey is an open-source decentralized microblogging platform.');
|
||||
console.log(chalk.keyword('orange')(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
|
||||
|
||||
console.log('');
|
||||
@ -34,7 +35,7 @@ function greet(config: Config) {
|
||||
}
|
||||
|
||||
bootLogger.info('Welcome to Misskey!');
|
||||
bootLogger.info(`Misskey v${config.version}`, null, true);
|
||||
bootLogger.info(`Misskey v${meta.version}`, null, true);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -44,11 +45,11 @@ export async function masterMain() {
|
||||
let config!: Config;
|
||||
|
||||
try {
|
||||
greet();
|
||||
|
||||
// initialize app
|
||||
config = await init();
|
||||
|
||||
greet(config);
|
||||
|
||||
if (config.port == null || Number.isNaN(config.port)) {
|
||||
bootLogger.error('The port is not configured. Please configure port.', null, true);
|
||||
process.exit(1);
|
||||
@ -76,7 +77,6 @@ export async function masterMain() {
|
||||
|
||||
if (!program.noDaemons) {
|
||||
require('../daemons/server-stats').default();
|
||||
require('../daemons/notes-stats').default();
|
||||
require('../daemons/queue-stats').default();
|
||||
require('../daemons/janitor').default();
|
||||
}
|
||||
|
1169
src/client/app.vue
Normal file
@ -1,150 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 135.46667 135.46667"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.1 r15371"
|
||||
sodipodi:docname="header-icon.dark.svg"
|
||||
inkscape:export-filename="C:\Users\syuilo\projects\misskey\assets\favicon\32.png"
|
||||
inkscape:export-xdpi="6"
|
||||
inkscape:export-ydpi="6">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="simplify"
|
||||
id="path-effect5115"
|
||||
is_visible="true"
|
||||
steps="1"
|
||||
threshold="0.000408163"
|
||||
smooth_angles="360"
|
||||
helper_size="0"
|
||||
simplify_individual_paths="false"
|
||||
simplify_just_coalesce="false"
|
||||
simplifyindividualpaths="false"
|
||||
simplifyJustCoalesce="false" />
|
||||
<inkscape:path-effect
|
||||
effect="simplify"
|
||||
id="path-effect5111"
|
||||
is_visible="true"
|
||||
steps="1"
|
||||
threshold="0.000408163"
|
||||
smooth_angles="360"
|
||||
helper_size="0"
|
||||
simplify_individual_paths="false"
|
||||
simplify_just_coalesce="false"
|
||||
simplifyindividualpaths="false"
|
||||
simplifyJustCoalesce="false" />
|
||||
<inkscape:path-effect
|
||||
effect="simplify"
|
||||
id="path-effect5104"
|
||||
is_visible="true"
|
||||
steps="1"
|
||||
threshold="0.000408163"
|
||||
smooth_angles="360"
|
||||
helper_size="0"
|
||||
simplify_individual_paths="false"
|
||||
simplify_just_coalesce="false"
|
||||
simplifyindividualpaths="false"
|
||||
simplifyJustCoalesce="false" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="114.309"
|
||||
inkscape:cy="251.50613"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g4502"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-bbox-edge-midpoints="false"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:snap-center="true"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="1072"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-object-midpoints="true"
|
||||
inkscape:snap-midpoints="true"
|
||||
inkscape:object-paths="true"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
objecttolerance="1"
|
||||
guidetolerance="1"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-others="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4504"
|
||||
spacingx="4.2333334"
|
||||
spacingy="4.2333334"
|
||||
empcolor="#ff3fff"
|
||||
empopacity="0.25098039"
|
||||
empspacing="4" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="レイヤー 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-30.809093,-111.78601)">
|
||||
<g
|
||||
id="g4502"
|
||||
transform="matrix(1.096096,0,0,1.096096,-2.960633,-44.023579)">
|
||||
<g
|
||||
style="fill-opacity:1"
|
||||
transform="translate(-1.3333333e-6,-1.3439941e-6)"
|
||||
id="g5125">
|
||||
<g
|
||||
transform="matrix(0.91391326,0,0,0.91391326,7.9719907,17.595761)"
|
||||
id="text4489"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:141.03404236px;line-height:476.69509888px;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.28950602px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
aria-label="Mi">
|
||||
<path
|
||||
sodipodi:nodetypes="zccssscssccscczzzccsccsscscsccz"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5210"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||
d="m 75.196381,231.17126 c -5.855419,0.0202 -10.885068,-3.50766 -13.2572,-7.61584 -1.266603,-1.79454 -3.772419,-2.43291 -3.807919,0 v 11.2332 c 0,4.51309 -1.645397,8.41504 -4.936191,11.70583 -3.196772,3.19677 -7.098714,4.79516 -11.705826,4.79516 -4.513089,0 -8.415031,-1.59839 -11.705825,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -61.7729 c 0,-3.47884 0.987238,-6.6286 2.961715,-9.44928 2.068499,-2.91471 4.701135,-4.9362 7.897906,-6.06447 1.786431,-0.65816 3.666885,-0.98724 5.641362,-0.98724 5.077225,0 9.308247,1.97448 12.693064,5.92343 1.786431,1.97448 2.820681,3.00873 3.102749,3.10275 0,0 13.408119,16.21319 13.78421,16.49526 0.376091,0.28206 1.480789,2.43848 4.127113,2.43848 2.646324,0 3.89218,-2.15642 4.26827,-2.43848 0.376091,-0.28207 13.784088,-16.49526 13.784088,-16.49526 0.09402,0.094 1.081261,-0.94022 2.961715,-3.10275 3.478837,-3.94895 7.756866,-5.92343 12.834096,-5.92343 1.88045,0 3.76091,0.32908 5.64136,0.98724 3.19677,1.12827 5.7824,3.14976 7.75688,6.06447 2.06849,2.82068 3.10274,5.97044 3.10274,9.44928 v 61.7729 c 0,4.51309 -1.6454,8.41504 -4.93619,11.70583 -3.19677,3.19677 -7.09871,4.79516 -11.70582,4.79516 -4.51309,0 -8.41504,-1.59839 -11.705828,-4.79516 -3.196772,-3.29079 -4.795158,-7.19274 -4.795158,-11.70583 v -11.2332 c -0.277898,-3.06563 -2.987588,-1.13379 -3.948953,0 -2.538613,4.70114 -7.401781,7.59567 -13.2572,7.61584 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5212"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'OTADESIGN Rounded';-inkscape-font-specification:'OTADESIGN Rounded';fill-opacity:1;stroke-width:0.28950602px"
|
||||
d="m 145.83461,185.00361 q -5.92343,0 -10.15445,-4.08999 -4.08999,-4.23102 -4.08999,-10.15445 0,-5.92343 4.08999,-10.01342 4.23102,-4.23102 10.15445,-4.23102 5.92343,0 10.15445,4.23102 4.23102,4.08999 4.23102,10.01342 0,5.92343 -4.23102,10.15445 -4.23102,4.08999 -10.15445,4.08999 z m 0.14103,2.82068 q 5.92343,0 10.01342,4.23102 4.23102,4.23102 4.23102,10.15445 v 34.83541 q 0,5.92343 -4.23102,10.15445 -4.08999,4.08999 -10.01342,4.08999 -5.92343,0 -10.15445,-4.08999 -4.23102,-4.23102 -4.23102,-10.15445 v -34.83541 q 0,-5.92343 4.23102,-10.15445 4.23102,-4.23102 10.15445,-4.23102 z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 7.0 KiB |
@ -1,30 +0,0 @@
|
||||
/**
|
||||
* Admin
|
||||
*/
|
||||
|
||||
import VueRouter from 'vue-router';
|
||||
|
||||
// Style
|
||||
import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
import Index from './views/index.vue';
|
||||
import NotFound from '../common/views/pages/not-found.vue';
|
||||
|
||||
init(launch => {
|
||||
document.title = 'Admin';
|
||||
|
||||
// Init router
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
base: '/admin/',
|
||||
routes: [
|
||||
{ path: '/:page', component: Index },
|
||||
{ path: '/', redirect: '/dashboard' },
|
||||
{ path: '*', component: NotFound }
|
||||
]
|
||||
});
|
||||
|
||||
// Launch the app
|
||||
launch(router);
|
||||
});
|
@ -1,6 +0,0 @@
|
||||
@import "../app"
|
||||
@import "../reset"
|
||||
|
||||
html
|
||||
height 100%
|
||||
background var(--bg)
|
@ -1,83 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faExclamationCircle"/> {{ $t('title') }}</template>
|
||||
<section class="fit-top">
|
||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
|
||||
<ui-horizon-group inputs>
|
||||
<ui-input :value="report.user | acct" type="text" readonly>
|
||||
<span>{{ $t('target') }}</span>
|
||||
</ui-input>
|
||||
<ui-input :value="report.reporter | acct" type="text" readonly>
|
||||
<span>{{ $t('reporter') }}</span>
|
||||
</ui-input>
|
||||
</ui-horizon-group>
|
||||
<ui-textarea :value="report.comment" readonly>
|
||||
<span>{{ $t('details') }}</span>
|
||||
</ui-textarea>
|
||||
<ui-button @click="removeReport(report)">{{ $t('remove-report') }}</ui-button>
|
||||
</div>
|
||||
</sequential-entrance>
|
||||
<ui-button v-if="existMore" @click="fetchUserReports">{{ $t('@.load-more') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/abuse.vue'),
|
||||
|
||||
data() {
|
||||
return {
|
||||
limit: 10,
|
||||
untilId: undefined,
|
||||
userReports: [],
|
||||
existMore: false,
|
||||
faExclamationCircle
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.fetchUserReports();
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetchUserReports() {
|
||||
this.$root.api('admin/abuse-user-reports', {
|
||||
untilId: this.untilId,
|
||||
limit: this.limit + 1
|
||||
}).then(reports => {
|
||||
if (reports.length == this.limit + 1) {
|
||||
reports.pop();
|
||||
this.existMore = true;
|
||||
} else {
|
||||
this.existMore = false;
|
||||
}
|
||||
this.userReports = this.userReports.concat(reports);
|
||||
this.untilId = this.userReports[this.userReports.length - 1].id;
|
||||
});
|
||||
},
|
||||
|
||||
removeReport(report) {
|
||||
this.$root.api('admin/remove-abuse-user-report', {
|
||||
reportId: report.id
|
||||
}).then(() => {
|
||||
this.userReports = this.userReports.filter(r => r.id != report.id);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.haexwsjc
|
||||
padding-bottom 16px
|
||||
border-bottom solid 1px var(--faceDivider)
|
||||
|
||||
</style>
|
@ -1,91 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<ui-card>
|
||||
<template #title><fa :icon="faBroadcastTower"/> {{ $t('announcements') }}</template>
|
||||
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||
<ui-input v-model="announcement.title" @change="save">
|
||||
<span>{{ $t('title') }}</span>
|
||||
</ui-input>
|
||||
<ui-textarea v-model="announcement.text">
|
||||
<span>{{ $t('text') }}</span>
|
||||
</ui-textarea>
|
||||
<ui-input v-model="announcement.image">
|
||||
<span>{{ $t('image-url') }}</span>
|
||||
</ui-input>
|
||||
<ui-horizon-group class="fit-bottom">
|
||||
<ui-button @click="save()"><fa :icon="['far', 'save']"/> {{ $t('save') }}</ui-button>
|
||||
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> {{ $t('remove') }}</ui-button>
|
||||
</ui-horizon-group>
|
||||
</section>
|
||||
<section>
|
||||
<ui-button @click="add"><fa :icon="faPlus"/> {{ $t('add') }}</ui-button>
|
||||
</section>
|
||||
</ui-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import { faBroadcastTower, faPlus } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/announcements.vue'),
|
||||
data() {
|
||||
return {
|
||||
announcements: [],
|
||||
faBroadcastTower, faPlus
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.announcements = meta.announcements;
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
add() {
|
||||
this.announcements.unshift({
|
||||
title: '',
|
||||
text: '',
|
||||
image: null
|
||||
});
|
||||
},
|
||||
|
||||
remove(i) {
|
||||
this.$root.dialog({
|
||||
type: 'warning',
|
||||
text: this.$t('_remove.are-you-sure').replace('$1', this.announcements.find((_, j) => j == i).title),
|
||||
showCancelButton: true
|
||||
}).then(({ canceled }) => {
|
||||
if (canceled) return;
|
||||
this.announcements = this.announcements.filter((_, j) => j !== i);
|
||||
this.save(true);
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('_remove.removed')
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
save(silent) {
|
||||
this.$root.api('admin/update-meta', {
|
||||
announcements: this.announcements
|
||||
}).then(() => {
|
||||
if (!silent) {
|
||||
this.$root.dialog({
|
||||
type: 'success',
|
||||
text: this.$t('saved')
|
||||
});
|
||||
}
|
||||
}).catch(e => {
|
||||
this.$root.dialog({
|
||||
type: 'error',
|
||||
text: e
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
@ -1,109 +0,0 @@
|
||||
<template>
|
||||
<div class="hyhctythnmwihguaaapnbrbszsjqxpio">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><fa :icon="faExchangeAlt"/> In/Out</th>
|
||||
<th><fa :icon="faBolt"/> Activity</th>
|
||||
<th><fa icon="server"/> Host</th>
|
||||
<th><fa icon="user"/> Actor</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="log in logs" :key="log.id">
|
||||
<td :class="log.direction">{{ log.direction == 'in' ? '<' : '>' }} {{ log.direction }}</td>
|
||||
<td>{{ log.activity }}</td>
|
||||
<td>{{ log.host }}</td>
|
||||
<td>@{{ log.actor }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faBolt, faExchangeAlt } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
logs: [],
|
||||
connection: null,
|
||||
faBolt, faExchangeAlt
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.connection = this.$root.stream.useSharedConnection('apLog');
|
||||
this.connection.on('log', this.onLog);
|
||||
this.connection.on('logs', this.onLogs);
|
||||
this.connection.send('requestLog', {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: 50
|
||||
});
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
},
|
||||
|
||||
methods: {
|
||||
onLog(log) {
|
||||
log.id = Math.random();
|
||||
this.logs.unshift(log);
|
||||
if (this.logs.length > 50) this.logs.pop();
|
||||
},
|
||||
|
||||
onLogs(logs) {
|
||||
for (const log of logs.reverse()) {
|
||||
this.onLog(log)
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.hyhctythnmwihguaaapnbrbszsjqxpio
|
||||
display block
|
||||
padding 12px 16px 16px 16px
|
||||
height 250px
|
||||
overflow auto
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--adminDashboardCardBg)
|
||||
border-radius 8px
|
||||
|
||||
> table
|
||||
width 100%
|
||||
max-width 100%
|
||||
overflow auto
|
||||
border-spacing 0
|
||||
border-collapse collapse
|
||||
color var(--adminDashboardCardFg)
|
||||
font-size 14px
|
||||
|
||||
thead
|
||||
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||
|
||||
tr
|
||||
th
|
||||
font-weight normal
|
||||
text-align left
|
||||
|
||||
tbody
|
||||
tr
|
||||
&:nth-child(odd)
|
||||
background rgba(0, 0, 0, 0.025)
|
||||
|
||||
th, td
|
||||
padding 8px 16px
|
||||
min-width 128px
|
||||
|
||||
td.in
|
||||
color #d26755
|
||||
|
||||
td.out
|
||||
color #55bb83
|
||||
|
||||
</style>
|
@ -1,527 +0,0 @@
|
||||
<template>
|
||||
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
|
||||
<header>
|
||||
<b><fa :icon="['far', 'chart-bar']"/> {{ $t('title') }}:</b>
|
||||
<select v-model="src">
|
||||
<optgroup :label="$t('federation')">
|
||||
<option value="federation-instances">{{ $t('charts.federation-instances') }}</option>
|
||||
<option value="federation-instances-total">{{ $t('charts.federation-instances-total') }}</option>
|
||||
</optgroup>
|
||||
<optgroup :label="$t('users')">
|
||||
<option value="users">{{ $t('charts.users') }}</option>
|
||||
<option value="users-total">{{ $t('charts.users-total') }}</option>
|
||||
<option value="active-users">{{ $t('charts.active-users') }}</option>
|
||||
</optgroup>
|
||||
<optgroup :label="$t('notes')">
|
||||
<option value="notes">{{ $t('charts.notes') }}</option>
|
||||
<option value="local-notes">{{ $t('charts.local-notes') }}</option>
|
||||
<option value="remote-notes">{{ $t('charts.remote-notes') }}</option>
|
||||
<option value="notes-total">{{ $t('charts.notes-total') }}</option>
|
||||
</optgroup>
|
||||
<optgroup :label="$t('drive')">
|
||||
<option value="drive-files">{{ $t('charts.drive-files') }}</option>
|
||||
<option value="drive-files-total">{{ $t('charts.drive-files-total') }}</option>
|
||||
<option value="drive">{{ $t('charts.drive') }}</option>
|
||||
<option value="drive-total">{{ $t('charts.drive-total') }}</option>
|
||||
</optgroup>
|
||||
<optgroup :label="$t('network')">
|
||||
<option value="network-requests">{{ $t('charts.network-requests') }}</option>
|
||||
<option value="network-time">{{ $t('charts.network-time') }}</option>
|
||||
<option value="network-usage">{{ $t('charts.network-usage') }}</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<div>
|
||||
<span @click="span = 'day'" :class="{ active: span == 'day' }">{{ $t('per-day') }}</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">{{ $t('per-hour') }}</span>
|
||||
</div>
|
||||
</header>
|
||||
<div ref="chart"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import * as tinycolor from 'tinycolor2';
|
||||
import ApexCharts from 'apexcharts';
|
||||
|
||||
const limit = 90;
|
||||
|
||||
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
|
||||
const negate = arr => arr.map(x => -x);
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/charts.vue'),
|
||||
data() {
|
||||
return {
|
||||
chart: null,
|
||||
src: 'notes',
|
||||
span: 'hour',
|
||||
chartInstance: null
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
data(): any {
|
||||
if (this.chart == null) return null;
|
||||
switch (this.src) {
|
||||
case 'federation-instances': return this.federationInstancesChart(false);
|
||||
case 'federation-instances-total': return this.federationInstancesChart(true);
|
||||
case 'users': return this.usersChart(false);
|
||||
case 'users-total': return this.usersChart(true);
|
||||
case 'active-users': return this.activeUsersChart();
|
||||
case 'notes': return this.notesChart('combined');
|
||||
case 'local-notes': return this.notesChart('local');
|
||||
case 'remote-notes': return this.notesChart('remote');
|
||||
case 'notes-total': return this.notesTotalChart();
|
||||
case 'drive': return this.driveChart();
|
||||
case 'drive-total': return this.driveTotalChart();
|
||||
case 'drive-files': return this.driveFilesChart();
|
||||
case 'drive-files-total': return this.driveFilesTotalChart();
|
||||
case 'network-requests': return this.networkRequestsChart();
|
||||
case 'network-time': return this.networkTimeChart();
|
||||
case 'network-usage': return this.networkUsageChart();
|
||||
}
|
||||
},
|
||||
|
||||
stats(): any[] {
|
||||
const stats =
|
||||
this.span == 'day' ? this.chart.perDay :
|
||||
this.span == 'hour' ? this.chart.perHour :
|
||||
null;
|
||||
|
||||
return stats;
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
src() {
|
||||
this.render();
|
||||
},
|
||||
|
||||
span() {
|
||||
this.render();
|
||||
}
|
||||
},
|
||||
|
||||
async mounted() {
|
||||
this.now = new Date();
|
||||
|
||||
const [perHour, perDay] = await Promise.all([Promise.all([
|
||||
this.$root.api('charts/federation', { limit: limit, span: 'hour' }),
|
||||
this.$root.api('charts/users', { limit: limit, span: 'hour' }),
|
||||
this.$root.api('charts/active-users', { limit: limit, span: 'hour' }),
|
||||
this.$root.api('charts/notes', { limit: limit, span: 'hour' }),
|
||||
this.$root.api('charts/drive', { limit: limit, span: 'hour' }),
|
||||
this.$root.api('charts/network', { limit: limit, span: 'hour' })
|
||||
]), Promise.all([
|
||||
this.$root.api('charts/federation', { limit: limit, span: 'day' }),
|
||||
this.$root.api('charts/users', { limit: limit, span: 'day' }),
|
||||
this.$root.api('charts/active-users', { limit: limit, span: 'day' }),
|
||||
this.$root.api('charts/notes', { limit: limit, span: 'day' }),
|
||||
this.$root.api('charts/drive', { limit: limit, span: 'day' }),
|
||||
this.$root.api('charts/network', { limit: limit, span: 'day' })
|
||||
])]);
|
||||
|
||||
const chart = {
|
||||
perHour: {
|
||||
federation: perHour[0],
|
||||
users: perHour[1],
|
||||
activeUsers: perHour[2],
|
||||
notes: perHour[3],
|
||||
drive: perHour[4],
|
||||
network: perHour[5]
|
||||
},
|
||||
perDay: {
|
||||
federation: perDay[0],
|
||||
users: perDay[1],
|
||||
activeUsers: perDay[2],
|
||||
notes: perDay[3],
|
||||
drive: perDay[4],
|
||||
network: perDay[5]
|
||||
}
|
||||
};
|
||||
|
||||
this.chart = chart;
|
||||
|
||||
this.render();
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.chartInstance.destroy();
|
||||
},
|
||||
|
||||
methods: {
|
||||
setSrc(src) {
|
||||
this.src = src;
|
||||
},
|
||||
|
||||
render() {
|
||||
if (this.chartInstance) {
|
||||
this.chartInstance.destroy();
|
||||
}
|
||||
|
||||
this.chartInstance = new ApexCharts(this.$refs.chart, {
|
||||
chart: {
|
||||
type: 'area',
|
||||
height: 300,
|
||||
animations: {
|
||||
dynamicAnimation: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)',
|
||||
xaxis: {
|
||||
lines: {
|
||||
show: true,
|
||||
}
|
||||
},
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
width: 2
|
||||
},
|
||||
legend: {
|
||||
labels: {
|
||||
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||
},
|
||||
},
|
||||
xaxis: {
|
||||
type: 'datetime',
|
||||
labels: {
|
||||
style: {
|
||||
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||
}
|
||||
},
|
||||
axisBorder: {
|
||||
color: 'rgba(0, 0, 0, 0.1)'
|
||||
},
|
||||
axisTicks: {
|
||||
color: 'rgba(0, 0, 0, 0.1)'
|
||||
},
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
formatter: this.data.bytes ? v => Vue.filter('bytes')(v, 0) : v => Vue.filter('number')(v),
|
||||
style: {
|
||||
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||
}
|
||||
}
|
||||
},
|
||||
series: this.data.series
|
||||
});
|
||||
|
||||
this.chartInstance.render();
|
||||
},
|
||||
|
||||
getDate(i: number) {
|
||||
const y = this.now.getFullYear();
|
||||
const m = this.now.getMonth();
|
||||
const d = this.now.getDate();
|
||||
const h = this.now.getHours();
|
||||
|
||||
return (
|
||||
this.span == 'day' ? new Date(y, m, d - i) :
|
||||
this.span == 'hour' ? new Date(y, m, d, h - i) :
|
||||
null
|
||||
);
|
||||
},
|
||||
|
||||
format(arr) {
|
||||
return arr.map((v, i) => ({ x: this.getDate(i).getTime(), y: v }));
|
||||
},
|
||||
|
||||
federationInstancesChart(total: boolean): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Instances',
|
||||
data: this.format(total
|
||||
? this.stats.federation.instance.total
|
||||
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))
|
||||
)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
notesChart(type: string): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'All',
|
||||
type: 'line',
|
||||
data: this.format(type == 'combined'
|
||||
? sum(this.stats.notes.local.inc, negate(this.stats.notes.local.dec), this.stats.notes.remote.inc, negate(this.stats.notes.remote.dec))
|
||||
: sum(this.stats.notes[type].inc, negate(this.stats.notes[type].dec))
|
||||
)
|
||||
}, {
|
||||
name: 'Renotes',
|
||||
type: 'area',
|
||||
data: this.format(type == 'combined'
|
||||
? sum(this.stats.notes.local.diffs.renote, this.stats.notes.remote.diffs.renote)
|
||||
: this.stats.notes[type].diffs.renote
|
||||
)
|
||||
}, {
|
||||
name: 'Replies',
|
||||
type: 'area',
|
||||
data: this.format(type == 'combined'
|
||||
? sum(this.stats.notes.local.diffs.reply, this.stats.notes.remote.diffs.reply)
|
||||
: this.stats.notes[type].diffs.reply
|
||||
)
|
||||
}, {
|
||||
name: 'Normal',
|
||||
type: 'area',
|
||||
data: this.format(type == 'combined'
|
||||
? sum(this.stats.notes.local.diffs.normal, this.stats.notes.remote.diffs.normal)
|
||||
: this.stats.notes[type].diffs.normal
|
||||
)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
notesTotalChart(): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Combined',
|
||||
type: 'line',
|
||||
data: this.format(sum(this.stats.notes.local.total, this.stats.notes.remote.total))
|
||||
}, {
|
||||
name: 'Local',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.notes.local.total)
|
||||
}, {
|
||||
name: 'Remote',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.notes.remote.total)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
usersChart(total: boolean): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Combined',
|
||||
type: 'line',
|
||||
data: this.format(total
|
||||
? sum(this.stats.users.local.total, this.stats.users.remote.total)
|
||||
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec), this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||
)
|
||||
}, {
|
||||
name: 'Local',
|
||||
type: 'area',
|
||||
data: this.format(total
|
||||
? this.stats.users.local.total
|
||||
: sum(this.stats.users.local.inc, negate(this.stats.users.local.dec))
|
||||
)
|
||||
}, {
|
||||
name: 'Remote',
|
||||
type: 'area',
|
||||
data: this.format(total
|
||||
? this.stats.users.remote.total
|
||||
: sum(this.stats.users.remote.inc, negate(this.stats.users.remote.dec))
|
||||
)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
activeUsersChart(): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Combined',
|
||||
type: 'line',
|
||||
data: this.format(sum(this.stats.activeUsers.local.count, this.stats.activeUsers.remote.count))
|
||||
}, {
|
||||
name: 'Local',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.activeUsers.local.count)
|
||||
}, {
|
||||
name: 'Remote',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.activeUsers.remote.count)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
driveChart(): any {
|
||||
return {
|
||||
bytes: true,
|
||||
series: [{
|
||||
name: 'All',
|
||||
type: 'line',
|
||||
data: this.format(
|
||||
sum(
|
||||
this.stats.drive.local.incSize,
|
||||
negate(this.stats.drive.local.decSize),
|
||||
this.stats.drive.remote.incSize,
|
||||
negate(this.stats.drive.remote.decSize)
|
||||
)
|
||||
)
|
||||
}, {
|
||||
name: 'Local +',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.local.incSize)
|
||||
}, {
|
||||
name: 'Local -',
|
||||
type: 'area',
|
||||
data: this.format(negate(this.stats.drive.local.decSize))
|
||||
}, {
|
||||
name: 'Remote +',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.remote.incSize)
|
||||
}, {
|
||||
name: 'Remote -',
|
||||
type: 'area',
|
||||
data: this.format(negate(this.stats.drive.remote.decSize))
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
driveTotalChart(): any {
|
||||
return {
|
||||
bytes: true,
|
||||
series: [{
|
||||
name: 'Combined',
|
||||
type: 'line',
|
||||
data: this.format(sum(this.stats.drive.local.totalSize, this.stats.drive.remote.totalSize))
|
||||
}, {
|
||||
name: 'Local',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.local.totalSize)
|
||||
}, {
|
||||
name: 'Remote',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.remote.totalSize)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
driveFilesChart(): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'All',
|
||||
type: 'line',
|
||||
data: this.format(
|
||||
sum(
|
||||
this.stats.drive.local.incCount,
|
||||
negate(this.stats.drive.local.decCount),
|
||||
this.stats.drive.remote.incCount,
|
||||
negate(this.stats.drive.remote.decCount)
|
||||
)
|
||||
)
|
||||
}, {
|
||||
name: 'Local +',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.local.incCount)
|
||||
}, {
|
||||
name: 'Local -',
|
||||
type: 'area',
|
||||
data: this.format(negate(this.stats.drive.local.decCount))
|
||||
}, {
|
||||
name: 'Remote +',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.remote.incCount)
|
||||
}, {
|
||||
name: 'Remote -',
|
||||
type: 'area',
|
||||
data: this.format(negate(this.stats.drive.remote.decCount))
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
driveFilesTotalChart(): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Combined',
|
||||
type: 'line',
|
||||
data: this.format(sum(this.stats.drive.local.totalCount, this.stats.drive.remote.totalCount))
|
||||
}, {
|
||||
name: 'Local',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.local.totalCount)
|
||||
}, {
|
||||
name: 'Remote',
|
||||
type: 'area',
|
||||
data: this.format(this.stats.drive.remote.totalCount)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
networkRequestsChart(): any {
|
||||
return {
|
||||
series: [{
|
||||
name: 'Incoming',
|
||||
data: this.format(this.stats.network.incomingRequests)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
networkTimeChart(): any {
|
||||
const data = [];
|
||||
|
||||
for (let i = 0; i < limit; i++) {
|
||||
data.push(this.stats.network.incomingRequests[i] != 0 ? (this.stats.network.totalTime[i] / this.stats.network.incomingRequests[i]) : 0);
|
||||
}
|
||||
|
||||
return {
|
||||
series: [{
|
||||
name: 'Avg time',
|
||||
data: this.format(data)
|
||||
}]
|
||||
};
|
||||
},
|
||||
|
||||
networkUsageChart(): any {
|
||||
return {
|
||||
bytes: true,
|
||||
series: [{
|
||||
name: 'Incoming',
|
||||
data: this.format(this.stats.network.incomingBytes)
|
||||
}, {
|
||||
name: 'Outgoing',
|
||||
data: this.format(this.stats.network.outgoingBytes)
|
||||
}]
|
||||
};
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.qvgidhudpqhjttdhxubzuyrhyzgslujw
|
||||
display block
|
||||
flex 1
|
||||
padding 32px 24px
|
||||
padding-bottom 0
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
|
||||
> header
|
||||
display flex
|
||||
margin 0 8px
|
||||
padding 0 0 8px 0
|
||||
font-size 1em
|
||||
color var(--adminDashboardCardFg)
|
||||
border-bottom solid 1px var(--adminDashboardCardDivider)
|
||||
|
||||
> b
|
||||
margin-right 8px
|
||||
|
||||
> *:last-child
|
||||
margin-left auto
|
||||
|
||||
*
|
||||
&:not(.active)
|
||||
color var(--primary)
|
||||
cursor pointer
|
||||
|
||||
</style>
|
@ -1,185 +0,0 @@
|
||||
<template>
|
||||
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||
<div>
|
||||
<header>
|
||||
<span><fa icon="microchip"/> CPU <span>{{ cpuP }}%</span></span>
|
||||
<span v-if="meta">{{ meta.cpu.model }}</span>
|
||||
</header>
|
||||
<div ref="cpu"></div>
|
||||
</div>
|
||||
<div>
|
||||
<header>
|
||||
<span><fa icon="memory"/> MEM <span>{{ memP }}%</span></span>
|
||||
<span v-if="meta"></span>
|
||||
</header>
|
||||
<div ref="mem"></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import ApexCharts from 'apexcharts';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['connection'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
stats: [],
|
||||
cpuChart: null,
|
||||
memChart: null,
|
||||
cpuP: '',
|
||||
memP: '',
|
||||
meta: null
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
stats(stats) {
|
||||
this.cpuChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: x.cpu_usage }))
|
||||
}]);
|
||||
this.memChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: (x.mem.used / x.mem.total) }))
|
||||
}]);
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
});
|
||||
|
||||
this.connection.on('stats', this.onStats);
|
||||
this.connection.on('statsLog', this.onStatsLog);
|
||||
this.connection.send('requestLog', {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: 200
|
||||
});
|
||||
|
||||
const chartOpts = {
|
||||
chart: {
|
||||
type: 'area',
|
||||
height: 200,
|
||||
animations: {
|
||||
dynamicAnimation: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
width: 2
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
series: [{
|
||||
data: []
|
||||
}],
|
||||
xaxis: {
|
||||
type: 'numeric',
|
||||
labels: {
|
||||
show: false
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
show: false,
|
||||
min: 0,
|
||||
max: 1
|
||||
}
|
||||
};
|
||||
|
||||
this.cpuChart = new ApexCharts(this.$refs.cpu, chartOpts);
|
||||
this.memChart = new ApexCharts(this.$refs.mem, chartOpts);
|
||||
|
||||
this.cpuChart.render();
|
||||
this.memChart.render();
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.off('stats', this.onStats);
|
||||
this.connection.off('statsLog', this.onStatsLog);
|
||||
|
||||
this.cpuChart.destroy();
|
||||
this.memChart.destroy();
|
||||
},
|
||||
|
||||
methods: {
|
||||
onStats(stats) {
|
||||
this.stats.push(stats);
|
||||
if (this.stats.length > 200) this.stats.shift();
|
||||
|
||||
this.cpuP = (stats.cpu_usage * 100).toFixed(0);
|
||||
this.memP = (stats.mem.used / stats.mem.total * 100).toFixed(0);
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
for (const stats of statsLog.reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.zyknedwtlthezamcjlolyusmipqmjgxz
|
||||
display flex
|
||||
|
||||
> div
|
||||
display block
|
||||
flex 1
|
||||
padding 20px 12px 0 12px
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
|
||||
&:first-child
|
||||
margin-right 16px
|
||||
|
||||
> header
|
||||
display flex
|
||||
padding 0 8px
|
||||
margin-bottom -16px
|
||||
color var(--adminDashboardCardFg)
|
||||
font-size 14px
|
||||
|
||||
> span
|
||||
&:last-child
|
||||
margin-left auto
|
||||
opacity 0.7
|
||||
|
||||
> span
|
||||
opacity 0.7
|
||||
|
||||
> div
|
||||
margin-bottom -10px
|
||||
|
||||
@media (max-width 1000px)
|
||||
display block
|
||||
margin-bottom 26px
|
||||
|
||||
> div
|
||||
&:first-child
|
||||
margin-right 0
|
||||
margin-bottom 26px
|
||||
|
||||
</style>
|
@ -1,196 +0,0 @@
|
||||
<template>
|
||||
<div class="mzxlfysy">
|
||||
<div>
|
||||
<header>
|
||||
<span><fa :icon="faInbox"/> In</span>
|
||||
<span v-if="latestStats">{{ latestStats.inbox.activeSincePrevTick | number }} / {{ latestStats.inbox.delayed | number }}</span>
|
||||
</header>
|
||||
<div ref="in"></div>
|
||||
</div>
|
||||
<div>
|
||||
<header>
|
||||
<span><fa :icon="faPaperPlane"/> Out</span>
|
||||
<span v-if="latestStats">{{ latestStats.deliver.activeSincePrevTick | number }} / {{ latestStats.deliver.delayed | number }}</span>
|
||||
</header>
|
||||
<div ref="out"></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faInbox } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faPaperPlane } from '@fortawesome/free-regular-svg-icons';
|
||||
import ApexCharts from 'apexcharts';
|
||||
|
||||
const limit = 150;
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
stats: [],
|
||||
inChart: null,
|
||||
outChart: null,
|
||||
faInbox, faPaperPlane
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
latestStats(): any {
|
||||
return this.stats[this.stats.length - 1];
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
stats(stats) {
|
||||
this.inChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.activeSincePrevTick }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.active }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.waiting }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.inbox.delayed }))
|
||||
}]);
|
||||
this.outChart.updateSeries([{
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.activeSincePrevTick }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.active }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.waiting }))
|
||||
}, {
|
||||
data: stats.map((x, i) => ({ x: i, y: x.deliver.delayed }))
|
||||
}]);
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
const chartOpts = {
|
||||
chart: {
|
||||
type: 'area',
|
||||
height: 200,
|
||||
animations: {
|
||||
dynamicAnimation: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
grid: {
|
||||
clipMarkers: false,
|
||||
borderColor: 'rgba(0, 0, 0, 0.1)'
|
||||
},
|
||||
stroke: {
|
||||
curve: 'straight',
|
||||
width: 2
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
legend: {
|
||||
show: false
|
||||
},
|
||||
colors: ['#00E396', '#00BCD4', '#FFB300', '#e53935'],
|
||||
series: [{ data: [] }, { data: [] }, { data: [] }, { data: [] }] as any,
|
||||
xaxis: {
|
||||
type: 'numeric',
|
||||
labels: {
|
||||
show: false
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
show: false,
|
||||
min: 0,
|
||||
}
|
||||
};
|
||||
|
||||
this.inChart = new ApexCharts(this.$refs.in, chartOpts);
|
||||
this.outChart = new ApexCharts(this.$refs.out, chartOpts);
|
||||
|
||||
this.inChart.render();
|
||||
this.outChart.render();
|
||||
|
||||
const connection = this.$root.stream.useSharedConnection('queueStats');
|
||||
connection.on('stats', this.onStats);
|
||||
connection.on('statsLog', this.onStatsLog);
|
||||
connection.send('requestLog', {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: limit
|
||||
});
|
||||
|
||||
this.$once('hook:beforeDestroy', () => {
|
||||
connection.dispose();
|
||||
this.inChart.destroy();
|
||||
this.outChart.destroy();
|
||||
});
|
||||
},
|
||||
|
||||
methods: {
|
||||
onStats(stats) {
|
||||
this.stats.push(stats);
|
||||
if (this.stats.length > limit) this.stats.shift();
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
for (const stats of statsLog.reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mzxlfysy
|
||||
display flex
|
||||
|
||||
> div
|
||||
display block
|
||||
flex 1
|
||||
padding 20px 12px 0 12px
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
|
||||
&:first-child
|
||||
margin-right 16px
|
||||
|
||||
> header
|
||||
display flex
|
||||
padding 0 8px
|
||||
margin-bottom -16px
|
||||
color var(--adminDashboardCardFg)
|
||||
font-size 14px
|
||||
|
||||
> span
|
||||
&:last-child
|
||||
margin-left auto
|
||||
opacity 0.7
|
||||
|
||||
> span
|
||||
opacity 0.7
|
||||
|
||||
> div
|
||||
margin-bottom -10px
|
||||
|
||||
@media (max-width 1000px)
|
||||
display block
|
||||
margin-bottom 26px
|
||||
|
||||
> div
|
||||
&:first-child
|
||||
margin-right 0
|
||||
margin-bottom 26px
|
||||
|
||||
</style>
|
@ -1,289 +0,0 @@
|
||||
<template>
|
||||
<div class="obdskegsannmntldydackcpzezagxqfy">
|
||||
<header v-if="meta">
|
||||
<p><b>Misskey</b><span>{{ meta.version }}</span></p>
|
||||
<p><b>Machine</b><span>{{ meta.machine }}</span></p>
|
||||
<p><b>OS</b><span>{{ meta.os }}</span></p>
|
||||
<p><b>Node</b><span>{{ meta.node }}</span></p>
|
||||
<p>{{ $t('@.ai-chan-kawaii') }}</p>
|
||||
</header>
|
||||
|
||||
<marquee-text v-if="instances.length > 0" class="instances" :repeat="10" :duration="60">
|
||||
<span v-for="instance in instances" class="instance">
|
||||
<b :style="{ background: instance.bg }">{{ instance.host }}</b>{{ instance.notesCount | number }} / {{ instance.usersCount | number }}
|
||||
</span>
|
||||
</marquee-text>
|
||||
|
||||
<div v-if="stats" class="stats">
|
||||
<div>
|
||||
<div>
|
||||
<div><fa icon="user"/></div>
|
||||
<div>
|
||||
<span>{{ $t('accounts') }}</span>
|
||||
<b>{{ stats.originalUsersCount | number }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
|
||||
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div><fa icon="pencil-alt"/></div>
|
||||
<div>
|
||||
<span>{{ $t('notes') }}</span>
|
||||
<b>{{ stats.originalNotesCount | number }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
|
||||
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div><fa :icon="faDatabase"/></div>
|
||||
<div>
|
||||
<span>{{ $t('drive') }}</span>
|
||||
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span><fa icon="home"/> {{ $t('this-instance') }}</span>
|
||||
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div><fa :icon="['far', 'hdd']"/></div>
|
||||
<div>
|
||||
<span>{{ $t('instances') }}</span>
|
||||
<b>{{ stats.instances | number }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span><fa icon="globe"/> {{ $t('federated') }}</span>
|
||||
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="charts">
|
||||
<x-charts ref="charts"/>
|
||||
</div>
|
||||
|
||||
<div class="queue">
|
||||
<x-queue/>
|
||||
</div>
|
||||
|
||||
<div class="cpu-memory">
|
||||
<x-cpu-memory :connection="connection"/>
|
||||
</div>
|
||||
|
||||
<div class="ap">
|
||||
<x-ap-log/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../i18n';
|
||||
import XCpuMemory from "./dashboard.cpu-memory.vue";
|
||||
import XQueue from "./dashboard.queue-charts.vue";
|
||||
import XCharts from "./dashboard.charts.vue";
|
||||
import XApLog from "./dashboard.ap-log.vue";
|
||||
import { faDatabase } from '@fortawesome/free-solid-svg-icons';
|
||||
import MarqueeText from 'vue-marquee-text-component';
|
||||
import randomColor from 'randomcolor';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('admin/views/dashboard.vue'),
|
||||
|
||||
components: {
|
||||
XCpuMemory,
|
||||
XQueue,
|
||||
XCharts,
|
||||
XApLog,
|
||||
MarqueeText
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
stats: null,
|
||||
connection: null,
|
||||
meta: null,
|
||||
instances: [],
|
||||
clock: null,
|
||||
faDatabase
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
this.connection = this.$root.stream.useSharedConnection('serverStats');
|
||||
|
||||
this.updateStats();
|
||||
this.clock = setInterval(this.updateStats, 3000);
|
||||
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.meta = meta;
|
||||
});
|
||||
|
||||
this.$root.api('federation/instances', {
|
||||
sort: '+notes'
|
||||
}).then(instances => {
|
||||
for (const i of instances) {
|
||||
i.bg = randomColor({
|
||||
seed: i.host,
|
||||
luminosity: 'dark'
|
||||
});
|
||||
}
|
||||
this.instances = instances;
|
||||
});
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.dispose();
|
||||
clearInterval(this.clock);
|
||||
},
|
||||
|
||||
methods: {
|
||||
setChartSrc(src) {
|
||||
this.$refs.charts.setSrc(src);
|
||||
},
|
||||
|
||||
updateStats() {
|
||||
this.$root.api('stats', {}, true).then(stats => {
|
||||
this.stats = stats;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.obdskegsannmntldydackcpzezagxqfy
|
||||
padding 16px
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 16px
|
||||
|
||||
> header
|
||||
display flex
|
||||
padding-bottom 16px
|
||||
border-bottom solid 1px var(--adminDashboardHeaderBorder)
|
||||
color var(--adminDashboardHeaderFg)
|
||||
font-size 14px
|
||||
white-space nowrap
|
||||
|
||||
@media (max-width 1000px)
|
||||
display none
|
||||
|
||||
> p
|
||||
display block
|
||||
margin 0 32px 0 0
|
||||
overflow hidden
|
||||
text-overflow ellipsis
|
||||
|
||||
> b
|
||||
&:after
|
||||
content ':'
|
||||
margin-right 8px
|
||||
|
||||
&:last-child
|
||||
margin-left auto
|
||||
margin-right 0
|
||||
|
||||
> .instances
|
||||
padding 16px
|
||||
color var(--adminDashboardHeaderFg)
|
||||
font-size 13px
|
||||
|
||||
>>> .instance
|
||||
margin 0 10px
|
||||
|
||||
> b
|
||||
padding 2px 6px
|
||||
margin-right 4px
|
||||
border-radius 4px
|
||||
color #fff
|
||||
|
||||
> .stats
|
||||
display flex
|
||||
justify-content space-between
|
||||
margin-bottom 16px
|
||||
|
||||
> div
|
||||
flex 1
|
||||
margin-right 16px
|
||||
color var(--adminDashboardCardFg)
|
||||
box-shadow 0 2px 4px rgba(0, 0, 0, 0.1)
|
||||
background var(--adminDashboardCardBg)
|
||||
border-radius 8px
|
||||
|
||||
&:last-child
|
||||
margin-right 0
|
||||
|
||||
> div:first-child
|
||||
display flex
|
||||
align-items center
|
||||
text-align center
|
||||
|
||||
&:last-child
|
||||
margin-right 0
|
||||
|
||||
> div:first-child
|
||||
padding 16px 24px
|
||||
font-size 28px
|
||||
|
||||
> div:last-child
|
||||
flex 1
|
||||
padding 16px 32px 16px 0
|
||||
text-align right
|
||||
|
||||
> span
|
||||
font-size 70%
|
||||
opacity 0.7
|
||||
|
||||
> b
|
||||
display block
|
||||
|
||||
> div:last-child
|
||||
display flex
|
||||
padding 6px 16px
|
||||
border-top solid 1px var(--adminDashboardCardDivider)
|
||||
|
||||
> span
|
||||
font-size 70%
|
||||
opacity 0.7
|
||||
|
||||
&:last-child
|
||||
margin-left auto
|
||||
cursor pointer
|
||||
|
||||
@media (max-width 900px)
|
||||
display grid
|
||||
grid-template-columns 1fr 1fr
|
||||
grid-template-rows 1fr 1fr
|
||||
gap 16px
|
||||
|
||||
> div
|
||||
margin-right 0
|
||||
|
||||
@media (max-width 500px)
|
||||
display block
|
||||
|
||||
> div:not(:last-child)
|
||||
margin-bottom 16px
|
||||
|
||||
> .charts
|
||||
margin-bottom 16px
|
||||
|
||||
> .queue
|
||||
margin-bottom 16px
|
||||
|
||||
> .cpu-memory
|
||||
margin-bottom 16px
|
||||
|
||||
</style>
|