Compare commits

...

1196 Commits

Author SHA1 Message Date
cutls
f50c2d3049 fix np on macos 2019-10-12 01:33:40 +09:00
cutls
9957bd9b8a fix np on macos 2019-10-12 01:31:15 +09:00
cutls
e6767dc3f9 fix np on macos 2019-10-12 01:29:16 +09:00
cutls
136935d4f9 fix macOS np 2019-10-12 01:11:29 +09:00
cutls
d654b63bca Fix: macOS NP 2019-10-12 01:08:33 +09:00
cutls
3ba4dee8a7 TheDesk Usamin (18.11.2) 2019-10-12 00:46:52 +09:00
cutls
48028a8e09 Add: description of images 2019-10-12 00:18:43 +09:00
cutls
1917531c54 cannot fav and bt 2019-10-11 23:50:25 +09:00
cutls
f74e2262dc Fix en not showing settings menu 2019-10-11 22:04:28 +09:00
cutls
2971144d7f Fix fav and bt errors 2019-10-11 22:04:14 +09:00
cutls
2e2723427b Fix travis error 2019-10-11 00:46:59 +09:00
cutls
ee6127ffcc Fix: travis error 2019-10-11 00:42:01 +09:00
cutls
dcd6fa6958 Add: release note 2019-10-11 00:22:41 +09:00
cutls
7442216962 TheDesk Usamin (18.11.1) 2019-10-11 00:04:31 +09:00
cutls
bb0c781daa Merge branch 'master' of github.com:cutls/TheDesk 2019-10-11 00:00:08 +09:00
cutls
56e5a5ac53 #135 package update 2019-10-10 23:59:57 +09:00
Cutls
419fa4906d Merge pull request #136 from cutls/dependabot/npm_and_yarn/app/electron-6.0.12
Bump electron from 6.0.11 to 6.0.12 in /app
2019-10-10 23:59:27 +09:00
Cutls
16e7617b1e Merge pull request #138 from cutls/dependabot/npm_and_yarn/app/sweetalert2-8.18.3
Bump sweetalert2 from 8.18.0 to 8.18.3 in /app
2019-10-10 23:59:05 +09:00
dependabot-preview[bot]
2ca5798f89 Bump sweetalert2 from 8.18.0 to 8.18.3 in /app
Bumps [sweetalert2](https://github.com/sweetalert2/sweetalert2) from 8.18.0 to 8.18.3.
- [Release notes](https://github.com/sweetalert2/sweetalert2/releases)
- [Changelog](https://github.com/sweetalert2/sweetalert2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sweetalert2/sweetalert2/compare/v8.18.0...v8.18.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-10 02:41:08 +00:00
cutls
a08ddc1b8c Merge branch 'master' of github.com:cutls/TheDesk 2019-10-09 23:05:32 +09:00
cutls
83153e2777 Merge branch 'l10n_master' of github.com:cutls/TheDesk 2019-10-09 23:02:40 +09:00
cutls
5b72b93248 Add: custom advanced theme 2019-10-09 23:00:46 +09:00
cutls
c7d911451c Fix error of non display_name acct 2019-10-09 23:00:25 +09:00
Cutls
c400cc317d Merge pull request #137 from kPherox/macos-quit-window-all-closed
Change to quit when window all closed in macOS
2019-10-09 15:22:21 +09:00
dependabot-preview[bot]
50784c9958 Bump electron from 6.0.11 to 6.0.12 in /app
Bumps [electron](https://github.com/electron/electron) from 6.0.11 to 6.0.12.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v6.0.11...v6.0.12)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-09 02:32:39 +00:00
cutls
c4a5d406c7 Add Custom Themes scheme 2019-10-09 01:14:27 +09:00
kPherox
d933eef8cc Change to quit when window all closed in macOS 2019-10-08 23:51:50 +09:00
cutls
ce84069429 WIP Fix #131 2019-10-08 23:46:59 +09:00
cutls
8140e56cbc Notification on Windows(can use render-process-based notification) 2019-10-08 23:26:21 +09:00
cutls
de40e0e22a Fix #132 2019-10-08 23:25:44 +09:00
cutls
44ccd111b2 Fix error on Linux 2019-10-08 22:04:51 +09:00
Cutls
7ac0889b78 Add some version 2019-10-05 22:48:21 +09:00
Cutls
c4a5996b21 New translations main.json (Spanish, Argentina) 2019-10-05 14:13:03 +09:00
Cutls
9eaca7bcb2 New translations index.json (Spanish, Argentina) 2019-10-05 14:13:01 +09:00
Cutls
90629aecb4 Add: always sensitive on 2019-10-05 03:51:05 +09:00
Cutls
cb6a75de3b Fix: lang selector 2019-10-05 03:50:49 +09:00
Cutls
9bb066596c fix version sys 2019-10-05 02:51:58 +09:00
Cutls
a0b6610b7d 18.11.0 2019-10-05 02:48:06 +09:00
Cutls
c4e06f90f8 Merge branch 'master' of https://github.com/cutls/TheDesk 2019-10-05 02:44:57 +09:00
Cutls
60a525f0b8 Merge pull request #124 from cutls/dependabot/npm_and_yarn/app/sweetalert2-8.18.0
Bump sweetalert2 from 8.17.6 to 8.18.0 in /app
2019-10-05 02:44:47 +09:00
Cutls
fe6067eeed Merge pull request #125 from cutls/dependabot/npm_and_yarn/app/electron-6.0.11
Bump electron from 6.0.10 to 6.0.11 in /app
2019-10-05 02:44:40 +09:00
Cutls
f72294e2b9 Merge pull request #126 from cutls/dependabot/npm_and_yarn/app/json5-2.1.1
Bump json5 from 2.1.0 to 2.1.1 in /app
2019-10-05 02:43:51 +09:00
Cutls
409b98dd39 Merge pull request #129 from cutls/l10n_master
New Crowdin translations
2019-10-05 02:43:00 +09:00
Cutls
0168b882a8 fix some categorized emojis 2019-10-05 02:40:25 +09:00
Cutls
9aa83354bd TheDesk Usamin (18.11.0) 2019-10-05 02:30:32 +09:00
Cutls
e311d82b0a New translations index.json (Bulgarian) 2019-10-05 02:25:40 +09:00
Cutls
531e526d33 New translations index.json (Catalan) 2019-10-05 02:25:38 +09:00
Cutls
a2a6c49ae0 New translations index.json (Chinese Simplified) 2019-10-05 02:25:37 +09:00
Cutls
15ae6d91d9 New translations index.json (Chinese Traditional) 2019-10-05 02:25:36 +09:00
Cutls
f3ba3706ba New translations index.json (Czech) 2019-10-05 02:25:34 +09:00
Cutls
0ab6ea2e26 New translations index.json (Danish) 2019-10-05 02:25:33 +09:00
Cutls
05d17f329f New translations index.json (Dutch) 2019-10-05 02:25:31 +09:00
Cutls
c7e9b67698 New translations index.json (Finnish) 2019-10-05 02:25:29 +09:00
Cutls
f654620816 New translations index.json (French) 2019-10-05 02:25:28 +09:00
Cutls
5bd4885241 New translations index.json (German) 2019-10-05 02:25:27 +09:00
Cutls
91643b06f2 New translations index.json (Greek) 2019-10-05 02:25:26 +09:00
Cutls
d35ec1b7c4 New translations index.json (Hebrew) 2019-10-05 02:25:24 +09:00
Cutls
d2609d11ab New translations index.json (Hungarian) 2019-10-05 02:25:23 +09:00
Cutls
014d3499f0 New translations index.json (Arabic) 2019-10-05 02:25:21 +09:00
Cutls
edd8a412b5 New translations index.json (Italian) 2019-10-05 02:25:20 +09:00
Cutls
7c57eef9f7 New translations index.json (Polish) 2019-10-05 02:25:19 +09:00
Cutls
8df4d5d808 New translations index.json (Portuguese) 2019-10-05 02:25:17 +09:00
Cutls
98b0fd4a4f New translations index.json (Portuguese, Brazilian) 2019-10-05 02:25:16 +09:00
Cutls
3e8c9acb02 New translations index.json (Romanian) 2019-10-05 02:25:15 +09:00
Cutls
d829dd01de New translations index.json (Russian) 2019-10-05 02:25:13 +09:00
Cutls
41803d21c9 New translations index.json (Serbian (Cyrillic)) 2019-10-05 02:25:12 +09:00
Cutls
b58b66178c New translations index.json (Spanish) 2019-10-05 02:25:10 +09:00
Cutls
7c40cf1fb7 New translations index.json (Spanish, Argentina) 2019-10-05 02:25:09 +09:00
Cutls
a923c62dac New translations index.json (Swedish) 2019-10-05 02:25:08 +09:00
Cutls
00d9c91a53 New translations index.json (Turkish) 2019-10-05 02:25:06 +09:00
Cutls
6fa101c699 New translations index.json (Ukrainian) 2019-10-05 02:25:05 +09:00
Cutls
1372833dd8 New translations index.json (Vietnamese) 2019-10-05 02:25:04 +09:00
Cutls
7d57750d73 New translations index.json (Norwegian) 2019-10-05 02:25:02 +09:00
Cutls
28c06706b4 New translations index.json (English) 2019-10-05 02:25:00 +09:00
Cutls
18146d2ef7 New translations index.json (Afrikaans) 2019-10-05 02:24:59 +09:00
Cutls
52c65afce6 Add: boost with visibility 2019-10-05 02:23:47 +09:00
Cutls
8f76c9b09d Fix: close tabs on acct/settings 2019-10-05 01:57:53 +09:00
Cutls
fffc94fbdd Fix transaltions 2019-10-05 01:57:34 +09:00
Cutls
1f398a8b4c Fix translations 2019-10-05 01:41:40 +09:00
Cutls
98f4010cb7 Merge pull request #128 from cutls/l10n_master
New Crowdin translations
2019-10-05 01:40:15 +09:00
Cutls
d34e8940a7 Merge branch 'master' into l10n_master 2019-10-05 01:39:57 +09:00
Cutls
bbf3c33a89 New translations update.json (English) 2019-10-05 01:37:45 +09:00
Cutls
f69fee98df New translations index.json (Spanish) 2019-10-05 01:37:43 +09:00
Cutls
f9b717965f New translations index.json (Serbian (Cyrillic)) 2019-10-05 01:37:42 +09:00
Cutls
01ad439d0a New translations index.json (Russian) 2019-10-05 01:37:41 +09:00
Cutls
29ad8d9dbc New translations index.json (Romanian) 2019-10-05 01:37:40 +09:00
Cutls
6ffad11cba New translations index.json (Portuguese, Brazilian) 2019-10-05 01:37:38 +09:00
Cutls
dc62840299 New translations index.json (Portuguese) 2019-10-05 01:37:37 +09:00
Cutls
ae9c669ca3 New translations index.json (Swedish) 2019-10-05 01:37:36 +09:00
Cutls
cd4b9b3be6 New translations index.json (Polish) 2019-10-05 01:37:35 +09:00
Cutls
e7fc5719e3 New translations index.json (Italian) 2019-10-05 01:37:34 +09:00
Cutls
29350e0782 New translations index.json (Hungarian) 2019-10-05 01:37:33 +09:00
Cutls
2c9821e670 New translations index.json (Hebrew) 2019-10-05 01:37:31 +09:00
Cutls
a61050f8fa New translations index.json (Greek) 2019-10-05 01:37:30 +09:00
Cutls
747d25b439 New translations index.json (German) 2019-10-05 01:37:29 +09:00
Cutls
cafd36b85d New translations index.json (French) 2019-10-05 01:37:27 +09:00
Cutls
d7450d9699 New translations index.json (Norwegian) 2019-10-05 01:37:26 +09:00
Cutls
4224a02d16 New translations index.json (Finnish) 2019-10-05 01:37:25 +09:00
Cutls
82bf21d54b New translations index.json (Turkish) 2019-10-05 01:37:24 +09:00
Cutls
e2672d5d94 New translations index.json (Vietnamese) 2019-10-05 01:37:23 +09:00
Cutls
8d30ccf6fe New translations main.json (Hebrew) 2019-10-05 01:37:21 +09:00
Cutls
be995930a0 New translations main.json (Greek) 2019-10-05 01:37:20 +09:00
Cutls
fbd52c5a85 New translations main.json (German) 2019-10-05 01:37:18 +09:00
Cutls
10e7a7fd27 New translations main.json (French) 2019-10-05 01:37:17 +09:00
Cutls
92a0ec03b1 New translations main.json (Finnish) 2019-10-05 01:37:16 +09:00
Cutls
83a07f7ee4 New translations main.json (Dutch) 2019-10-05 01:37:14 +09:00
Cutls
32628be87b New translations main.json (Danish) 2019-10-05 01:37:13 +09:00
Cutls
102e8964ee New translations index.json (Ukrainian) 2019-10-05 01:37:11 +09:00
Cutls
742ea9f245 New translations main.json (Czech) 2019-10-05 01:37:09 +09:00
Cutls
25f843331c New translations main.json (Chinese Simplified) 2019-10-05 01:37:08 +09:00
Cutls
c6680d1f03 New translations main.json (Catalan) 2019-10-05 01:37:06 +09:00
Cutls
f5279fc91e New translations main.json (Bulgarian) 2019-10-05 01:37:05 +09:00
Cutls
ba50376c85 New translations main.json (Arabic) 2019-10-05 01:37:03 +09:00
Cutls
dd1395f3f4 New translations main.json (Afrikaans) 2019-10-05 01:37:02 +09:00
Cutls
450df2ce6a New translations index.json (English) 2019-10-05 01:37:00 +09:00
Cutls
f9e384a87d New translations main.json (Chinese Traditional) 2019-10-05 01:36:59 +09:00
Cutls
81484b7ae3 New translations main.json (Hungarian) 2019-10-05 01:36:58 +09:00
Cutls
a14809a96a New translations index.json (Dutch) 2019-10-05 01:36:56 +09:00
Cutls
1753b01a1b New translations index.json (Czech) 2019-10-05 01:36:55 +09:00
Cutls
86e7924675 New translations acct.json (Norwegian) 2019-10-05 01:36:53 +09:00
Cutls
e0daa923c6 New translations acct.json (Italian) 2019-10-05 01:36:52 +09:00
Cutls
32c67d5f62 New translations acct.json (Hungarian) 2019-10-05 01:36:51 +09:00
Cutls
7580706bd0 New translations acct.json (Hebrew) 2019-10-05 01:36:50 +09:00
Cutls
68da5085ea New translations acct.json (Greek) 2019-10-05 01:36:49 +09:00
Cutls
55d0c0f66b New translations acct.json (German) 2019-10-05 01:36:48 +09:00
Cutls
5d35d56837 New translations acct.json (French) 2019-10-05 01:36:48 +09:00
Cutls
a9b150960e New translations acct.json (Polish) 2019-10-05 01:36:47 +09:00
Cutls
72a9e81ba1 New translations acct.json (Finnish) 2019-10-05 01:36:46 +09:00
Cutls
0032a51051 New translations acct.json (Danish) 2019-10-05 01:36:45 +09:00
Cutls
faa9102815 New translations acct.json (Czech) 2019-10-05 01:36:44 +09:00
Cutls
525ce59b8b New translations acct.json (Chinese Traditional) 2019-10-05 01:36:43 +09:00
Cutls
00055a9f32 New translations acct.json (Chinese Simplified) 2019-10-05 01:36:42 +09:00
Cutls
3da62e366f New translations acct.json (Catalan) 2019-10-05 01:36:41 +09:00
Cutls
66ba0fe18e New translations acct.json (Bulgarian) 2019-10-05 01:36:40 +09:00
Cutls
cc7a7386be New translations acct.json (Dutch) 2019-10-05 01:36:39 +09:00
Cutls
f1a89f1001 New translations index.json (Danish) 2019-10-05 01:36:38 +09:00
Cutls
83ad5538b0 New translations acct.json (Portuguese) 2019-10-05 01:36:37 +09:00
Cutls
8e1497cf71 New translations acct.json (Romanian) 2019-10-05 01:36:36 +09:00
Cutls
9b4da63b0d New translations index.json (Chinese Traditional) 2019-10-05 01:36:35 +09:00
Cutls
1fad5adbd2 New translations index.json (Chinese Simplified) 2019-10-05 01:36:34 +09:00
Cutls
72497154a7 New translations index.json (Catalan) 2019-10-05 01:36:32 +09:00
Cutls
5dcab4fe9e New translations index.json (Bulgarian) 2019-10-05 01:36:31 +09:00
Cutls
d592f5eb62 New translations index.json (Arabic) 2019-10-05 01:36:29 +09:00
Cutls
d85cbca8ea New translations index.json (Afrikaans) 2019-10-05 01:36:28 +09:00
Cutls
be92ae76d6 New translations acct.json (English) 2019-10-05 01:36:26 +09:00
Cutls
3cfedd4ae9 New translations acct.json (Portuguese, Brazilian) 2019-10-05 01:36:24 +09:00
Cutls
cd88acf337 New translations acct.json (Vietnamese) 2019-10-05 01:36:23 +09:00
Cutls
adf628b3b0 New translations acct.json (Turkish) 2019-10-05 01:36:22 +09:00
Cutls
bbb945283b New translations acct.json (Swedish) 2019-10-05 01:36:21 +09:00
Cutls
10b7691313 New translations acct.json (Spanish) 2019-10-05 01:36:20 +09:00
Cutls
1e93556f8e New translations acct.json (Serbian (Cyrillic)) 2019-10-05 01:36:18 +09:00
Cutls
77bfb852e0 New translations acct.json (Russian) 2019-10-05 01:36:17 +09:00
Cutls
abeb0ad82f New translations acct.json (Ukrainian) 2019-10-05 01:36:16 +09:00
Cutls
722304c4a1 New translations acct.json (Arabic) 2019-10-05 01:36:15 +09:00
Cutls
9e5ea8c052 New translations main.json (Italian) 2019-10-05 01:36:14 +09:00
Cutls
e6dc46a270 New translations main.json (Polish) 2019-10-05 01:36:13 +09:00
Cutls
cf0fffcc3b New translations update.json (Finnish) 2019-10-05 01:36:11 +09:00
Cutls
64835b0de9 New translations update.json (Dutch) 2019-10-05 01:36:10 +09:00
Cutls
ca3ae925d1 New translations update.json (Danish) 2019-10-05 01:36:09 +09:00
Cutls
245e17ed42 New translations update.json (Czech) 2019-10-05 01:36:09 +09:00
Cutls
22605323c1 New translations update.json (Chinese Traditional) 2019-10-05 01:36:08 +09:00
Cutls
ca0e8f93f9 New translations update.json (Chinese Simplified) 2019-10-05 01:36:07 +09:00
Cutls
8f763f9c5c New translations update.json (Catalan) 2019-10-05 01:36:06 +09:00
Cutls
1e8e619762 New translations update.json (French) 2019-10-05 01:36:05 +09:00
Cutls
5d3d5b4c72 New translations update.json (Bulgarian) 2019-10-05 01:36:04 +09:00
Cutls
81029b203e New translations update.json (Afrikaans) 2019-10-05 01:36:03 +09:00
Cutls
1fbfb3970d New translations setting.json (English) 2019-10-05 01:36:02 +09:00
Cutls
aa9e590574 New translations setting.json (Vietnamese) 2019-10-05 01:36:01 +09:00
Cutls
495ef70d41 New translations setting.json (Ukrainian) 2019-10-05 01:35:59 +09:00
Cutls
8d45bf6ee9 New translations setting.json (Turkish) 2019-10-05 01:35:58 +09:00
Cutls
5ea7e397c6 New translations setting.json (Swedish) 2019-10-05 01:35:56 +09:00
Cutls
70af77f06e New translations update.json (Arabic) 2019-10-05 01:35:55 +09:00
Cutls
21da8f0274 New translations update.json (German) 2019-10-05 01:35:53 +09:00
Cutls
9be2b578a2 New translations update.json (Hebrew) 2019-10-05 01:35:52 +09:00
Cutls
bcbc640840 New translations update.json (Vietnamese) 2019-10-05 01:35:51 +09:00
Cutls
a569240444 New translations update.json (Ukrainian) 2019-10-05 01:35:50 +09:00
Cutls
f071b9c4f2 New translations update.json (Turkish) 2019-10-05 01:35:49 +09:00
Cutls
681f116733 New translations update.json (Swedish) 2019-10-05 01:35:48 +09:00
Cutls
b1bfa713e2 New translations update.json (Spanish) 2019-10-05 01:35:47 +09:00
Cutls
8133bf1916 New translations update.json (Serbian (Cyrillic)) 2019-10-05 01:35:46 +09:00
Cutls
7fc61cdad3 New translations update.json (Greek) 2019-10-05 01:35:45 +09:00
Cutls
0f926c96c8 New translations update.json (Russian) 2019-10-05 01:35:44 +09:00
Cutls
557409ea72 New translations update.json (Portuguese, Brazilian) 2019-10-05 01:35:43 +09:00
Cutls
f0a847b135 New translations update.json (Portuguese) 2019-10-05 01:35:42 +09:00
Cutls
5181b271bc New translations update.json (Polish) 2019-10-05 01:35:41 +09:00
Cutls
38fe00fbe0 New translations update.json (Norwegian) 2019-10-05 01:35:40 +09:00
Cutls
be100b24d1 New translations update.json (Italian) 2019-10-05 01:35:39 +09:00
Cutls
0ef338b1e8 New translations update.json (Hungarian) 2019-10-05 01:35:38 +09:00
Cutls
12130f8601 New translations update.json (Romanian) 2019-10-05 01:35:38 +09:00
Cutls
dfe6c9e8e7 New translations main.json (Norwegian) 2019-10-05 01:35:37 +09:00
Cutls
cfd4d18c62 New translations setting.json (Spanish) 2019-10-05 01:35:35 +09:00
Cutls
7ee60c8986 New translations setting.json (Russian) 2019-10-05 01:35:34 +09:00
Cutls
0fee24734d New translations setting.json (Bulgarian) 2019-10-05 01:35:33 +09:00
Cutls
4b7895c3ab New translations setting.json (Arabic) 2019-10-05 01:35:31 +09:00
Cutls
63610a324c New translations setting.json (Afrikaans) 2019-10-05 01:35:30 +09:00
Cutls
7a72daf3ec New translations main.json (English) 2019-10-05 01:35:28 +09:00
Cutls
f33acd67ec New translations main.json (Vietnamese) 2019-10-05 01:35:27 +09:00
Cutls
9a5ac036d6 New translations main.json (Ukrainian) 2019-10-05 01:35:26 +09:00
Cutls
e0d8094268 New translations main.json (Turkish) 2019-10-05 01:35:24 +09:00
Cutls
1d5648f882 New translations setting.json (Catalan) 2019-10-05 01:35:22 +09:00
Cutls
d528093510 New translations main.json (Swedish) 2019-10-05 01:35:21 +09:00
Cutls
738a11d96f New translations main.json (Spanish) 2019-10-05 01:35:19 +09:00
Cutls
01744889fb New translations main.json (Serbian (Cyrillic)) 2019-10-05 01:35:18 +09:00
Cutls
f5c4362f0d New translations main.json (Russian) 2019-10-05 01:35:16 +09:00
Cutls
268dd4d469 New translations main.json (Romanian) 2019-10-05 01:35:15 +09:00
Cutls
41c207af14 New translations main.json (Portuguese, Brazilian) 2019-10-05 01:35:13 +09:00
Cutls
513b7ecd78 New translations main.json (Portuguese) 2019-10-05 01:35:11 +09:00
Cutls
83fb4663f6 New translations main.json (Spanish, Argentina) 2019-10-05 01:35:09 +09:00
Cutls
7e88993b5c New translations setting.json (Serbian (Cyrillic)) 2019-10-05 01:35:08 +09:00
Cutls
6e6b7f37b2 New translations setting.json (Chinese Simplified) 2019-10-05 01:35:06 +09:00
Cutls
a1152446d9 New translations setting.json (Czech) 2019-10-05 01:35:05 +09:00
Cutls
3eab9b30a1 New translations setting.json (Romanian) 2019-10-05 01:35:03 +09:00
Cutls
573587b894 New translations setting.json (Portuguese, Brazilian) 2019-10-05 01:35:02 +09:00
Cutls
adfb395492 New translations setting.json (Portuguese) 2019-10-05 01:35:00 +09:00
Cutls
b4b4f09287 New translations setting.json (Polish) 2019-10-05 01:34:59 +09:00
Cutls
31c80ff07b New translations setting.json (Norwegian) 2019-10-05 01:34:58 +09:00
Cutls
d20e94b422 New translations setting.json (Italian) 2019-10-05 01:34:56 +09:00
Cutls
1e7fefbde9 New translations setting.json (Chinese Traditional) 2019-10-05 01:34:52 +09:00
Cutls
42f68a1109 New translations setting.json (Hungarian) 2019-10-05 01:34:50 +09:00
Cutls
f47c704e29 New translations setting.json (Greek) 2019-10-05 01:34:49 +09:00
Cutls
be3cfd8d2d New translations setting.json (German) 2019-10-05 01:34:48 +09:00
Cutls
d6ded9e64b New translations setting.json (French) 2019-10-05 01:34:47 +09:00
Cutls
6b0704ec76 New translations setting.json (Finnish) 2019-10-05 01:34:45 +09:00
Cutls
a896ae69d0 New translations setting.json (Dutch) 2019-10-05 01:34:44 +09:00
Cutls
9ba4fe2d0f New translations setting.json (Danish) 2019-10-05 01:34:42 +09:00
Cutls
29b904998e New translations setting.json (Hebrew) 2019-10-05 01:34:40 +09:00
Cutls
bf422cb0b2 New translations acct.json (Afrikaans) 2019-10-05 01:34:39 +09:00
Cutls
bf87c3e3f1 Update Crowdin configuration file 2019-10-05 01:33:47 +09:00
Cutls
b96c6bd324 New translations index.json (Spanish, Argentina) 2019-10-05 01:33:47 +09:00
Cutls
0293318b59 New translations main.json (Spanish, Argentina) 2019-10-05 01:33:45 +09:00
Cutls
38588b8204 New translations setting.json (Spanish, Argentina) 2019-10-05 01:33:44 +09:00
Cutls
f2d22e6b7f New translations update.json (Spanish, Argentina) 2019-10-05 01:33:42 +09:00
Cutls
45848306bc New translations index.json (German) 2019-10-05 01:33:31 +09:00
Cutls
b160b25d7d New translations main.json (German) 2019-10-05 01:33:29 +09:00
Cutls
d1e6d533fc New translations setting.json (German) 2019-10-05 01:33:27 +09:00
Cutls
ee168ed5e2 New translations update.json (German) 2019-10-05 01:33:18 +09:00
Cutls
6c8e3d88bd New translations acct.json (German) 2019-10-05 01:32:42 +09:00
Cutls
77b2e416c1 New translations acct.json (Spanish, Argentina) 2019-10-05 01:32:41 +09:00
Cutls
e02eefdc8e New translations acct.json (French) 2019-10-05 01:32:38 +09:00
Cutls
fd4f5ec574 New translations update.json (Bulgarian) 2019-10-05 01:15:22 +09:00
Cutls
b327b38113 New translations setting.json (Bulgarian) 2019-10-05 01:15:21 +09:00
Cutls
76ad662f56 New translations main.json (Bulgarian) 2019-10-05 01:15:19 +09:00
Cutls
4ad3c397b6 New translations index.json (Bulgarian) 2019-10-05 01:15:18 +09:00
Cutls
75d2b46c7a New translations acct.json (Bulgarian) 2019-10-05 01:15:16 +09:00
Cutls
a7659a0c2e New translations update.json (Czech) 2019-10-05 00:44:24 +09:00
Cutls
e3a740f66a New translations main.json (French) 2019-10-05 00:44:23 +09:00
Cutls
af281481d5 New translations setting.json (French) 2019-10-05 00:44:22 +09:00
Cutls
5f6758554d New translations update.json (French) 2019-10-05 00:44:20 +09:00
Cutls
2b2a8c1d2e New translations acct.json (German) 2019-10-05 00:44:19 +09:00
Cutls
156f5aec91 New translations index.json (German) 2019-10-05 00:44:18 +09:00
Cutls
9045e5aa90 New translations main.json (German) 2019-10-05 00:44:17 +09:00
Cutls
5ca9d2f1b1 New translations setting.json (German) 2019-10-05 00:44:15 +09:00
Cutls
6cb5bcfb0c New translations update.json (German) 2019-10-05 00:44:14 +09:00
Cutls
ffaff7c356 New translations index.json (French) 2019-10-05 00:44:12 +09:00
Cutls
130fc4996f New translations acct.json (Chinese Simplified) 2019-10-05 00:44:11 +09:00
Cutls
a95141048d New translations main.json (Chinese Simplified) 2019-10-05 00:44:10 +09:00
Cutls
2d82382f34 New translations setting.json (Chinese Simplified) 2019-10-05 00:44:04 +09:00
Cutls
6afd975913 New translations update.json (Chinese Simplified) 2019-10-05 00:44:03 +09:00
Cutls
0df0eb104c New translations acct.json (Czech) 2019-10-05 00:44:02 +09:00
Cutls
f1c5d3605c New translations index.json (Czech) 2019-10-05 00:44:01 +09:00
Cutls
afed289647 New translations main.json (Czech) 2019-10-05 00:43:59 +09:00
Cutls
22fb1fb8c9 New translations setting.json (Czech) 2019-10-05 00:43:57 +09:00
Cutls
5809d4efca New translations index.json (Chinese Simplified) 2019-10-05 00:43:56 +09:00
Cutls
332e215c85 New translations acct.json (French) 2019-10-05 00:43:55 +09:00
Cutls
9eefbe9fb9 New translations main.json (Spanish) 2019-10-05 00:35:54 +09:00
Cutls
3fa86d3236 New translations setting.json (Chinese Simplified) 2019-10-05 00:35:13 +09:00
Cutls
f0e125df08 New translations main.json (Chinese Simplified) 2019-10-05 00:35:10 +09:00
Cutls
8bf7d0efd4 New translations index.json (Chinese Simplified) 2019-10-05 00:35:08 +09:00
Cutls
8a71dfa591 New translations acct.json (Chinese Simplified) 2019-10-05 00:35:07 +09:00
Cutls
928dee677f New translations update.json (Catalan) 2019-10-05 00:35:06 +09:00
Cutls
bf5500eb19 New translations setting.json (Catalan) 2019-10-05 00:35:05 +09:00
Cutls
a5efb1b4b6 New translations main.json (Catalan) 2019-10-05 00:35:03 +09:00
Cutls
5aa77a67a8 New translations update.json (Chinese Simplified) 2019-10-05 00:35:01 +09:00
Cutls
c5c22f8dc9 New translations index.json (Catalan) 2019-10-05 00:35:00 +09:00
Cutls
ad3ae5e6b1 New translations update.json (Bulgarian) 2019-10-05 00:34:57 +09:00
Cutls
ed029ecb01 New translations setting.json (Bulgarian) 2019-10-05 00:34:56 +09:00
Cutls
ff45c64a22 New translations main.json (Bulgarian) 2019-10-05 00:34:55 +09:00
Cutls
c953091e8d New translations index.json (Bulgarian) 2019-10-05 00:34:53 +09:00
Cutls
fd30ab7168 New translations acct.json (Bulgarian) 2019-10-05 00:34:52 +09:00
Cutls
dca3dddba0 New translations update.json (Arabic) 2019-10-05 00:34:51 +09:00
Cutls
41eb4c54a4 New translations acct.json (Catalan) 2019-10-05 00:34:50 +09:00
Cutls
15a2333010 New translations setting.json (Arabic) 2019-10-05 00:34:49 +09:00
Cutls
1061d2867f New translations acct.json (Chinese Traditional) 2019-10-05 00:34:48 +09:00
Cutls
64ba1f1ea1 New translations main.json (Chinese Traditional) 2019-10-05 00:34:46 +09:00
Cutls
196cc664c8 New translations acct.json (Spanish) 2019-10-05 00:34:45 +09:00
Cutls
1d871d4d68 New translations update.json (Serbian (Cyrillic)) 2019-10-05 00:34:44 +09:00
Cutls
89475a9838 New translations setting.json (Serbian (Cyrillic)) 2019-10-05 00:34:43 +09:00
Cutls
52d335cbfd New translations main.json (Serbian (Cyrillic)) 2019-10-05 00:34:41 +09:00
Cutls
333ca4f36a New translations index.json (Serbian (Cyrillic)) 2019-10-05 00:34:39 +09:00
Cutls
d2e18c5400 New translations main.json (Danish) 2019-10-05 00:34:38 +09:00
Cutls
f04cc92b44 New translations index.json (Danish) 2019-10-05 00:34:37 +09:00
Cutls
fa3a048a6c New translations index.json (Chinese Traditional) 2019-10-05 00:34:35 +09:00
Cutls
6200034dd0 New translations acct.json (Danish) 2019-10-05 00:34:33 +09:00
Cutls
9a25d82c48 New translations setting.json (Czech) 2019-10-05 00:34:32 +09:00
Cutls
95e0d3953e New translations main.json (Czech) 2019-10-05 00:34:31 +09:00
Cutls
fb91da4b69 New translations index.json (Czech) 2019-10-05 00:34:29 +09:00
Cutls
74fcd2df7b New translations acct.json (Czech) 2019-10-05 00:34:28 +09:00
Cutls
1a88a08454 New translations update.json (Chinese Traditional) 2019-10-05 00:34:27 +09:00
Cutls
688cf579d6 New translations setting.json (Chinese Traditional) 2019-10-05 00:34:26 +09:00
Cutls
ba9ba5f55b New translations update.json (Czech) 2019-10-05 00:34:24 +09:00
Cutls
8341733dc2 New translations main.json (Arabic) 2019-10-05 00:34:23 +09:00
Cutls
54f7a0f20e New translations acct.json (Arabic) 2019-10-05 00:34:22 +09:00
Cutls
b2382d91d6 New translations index.json (Arabic) 2019-10-05 00:34:12 +09:00
Cutls
b729780ac1 New translations update.json (Afrikaans) 2019-10-05 00:34:09 +09:00
Cutls
6f4c516d0c New translations setting.json (Afrikaans) 2019-10-05 00:34:08 +09:00
Cutls
b9bdcba4f9 New translations main.json (Afrikaans) 2019-10-05 00:34:07 +09:00
Cutls
bd69863799 New translations index.json (Afrikaans) 2019-10-05 00:34:05 +09:00
Cutls
375fdc444e New translations acct.json (Afrikaans) 2019-10-05 00:34:03 +09:00
Cutls
e832592b35 New translations update.json (English) 2019-10-05 00:26:57 +09:00
Cutls
a15d4e097e New translations main.json (Hebrew) 2019-10-05 00:26:57 +09:00
Cutls
2597d2455c New translations setting.json (Hebrew) 2019-10-05 00:26:55 +09:00
Cutls
16e817d42c New translations update.json (Hebrew) 2019-10-05 00:26:54 +09:00
Cutls
c6d39a9e60 New translations acct.json (Hungarian) 2019-10-05 00:26:53 +09:00
Cutls
b860f1a170 New translations index.json (Hungarian) 2019-10-05 00:26:52 +09:00
Cutls
0cebd0b7f3 New translations main.json (Hungarian) 2019-10-05 00:26:50 +09:00
Cutls
91742c1b80 New translations setting.json (Hungarian) 2019-10-05 00:26:48 +09:00
Cutls
64bc79de38 New translations update.json (Hungarian) 2019-10-05 00:26:46 +09:00
Cutls
55239be477 New translations acct.json (Italian) 2019-10-05 00:26:45 +09:00
Cutls
0feebb662f New translations index.json (Italian) 2019-10-05 00:26:44 +09:00
Cutls
1699f9d141 New translations main.json (Italian) 2019-10-05 00:26:42 +09:00
Cutls
7ac9df9496 New translations index.json (Hebrew) 2019-10-05 00:26:41 +09:00
Cutls
2074818cd0 New translations setting.json (Italian) 2019-10-05 00:26:39 +09:00
Cutls
ecb3eaf541 New translations acct.json (Norwegian) 2019-10-05 00:26:38 +09:00
Cutls
345455da4b New translations index.json (Norwegian) 2019-10-05 00:26:37 +09:00
Cutls
1937fddbfd New translations main.json (Norwegian) 2019-10-05 00:26:35 +09:00
Cutls
e7534bbcbd New translations setting.json (Norwegian) 2019-10-05 00:26:34 +09:00
Cutls
305192eae6 New translations update.json (Norwegian) 2019-10-05 00:26:32 +09:00
Cutls
0541aa3373 New translations acct.json (Polish) 2019-10-05 00:26:31 +09:00
Cutls
81fe8b7435 New translations index.json (Polish) 2019-10-05 00:26:30 +09:00
Cutls
4ca26b4e32 New translations main.json (Polish) 2019-10-05 00:26:29 +09:00
Cutls
d348a67ba8 New translations setting.json (Polish) 2019-10-05 00:26:28 +09:00
Cutls
e2f03ee8d6 New translations update.json (Polish) 2019-10-05 00:26:26 +09:00
Cutls
0e64c46064 New translations update.json (Italian) 2019-10-05 00:26:25 +09:00
Cutls
987a4125ae New translations acct.json (Portuguese) 2019-10-05 00:26:24 +09:00
Cutls
a7e4c1a5a5 New translations acct.json (Hebrew) 2019-10-05 00:26:24 +09:00
Cutls
6d66982d35 New translations setting.json (Greek) 2019-10-05 00:26:23 +09:00
Cutls
7c78e05649 New translations acct.json (Dutch) 2019-10-05 00:26:21 +09:00
Cutls
61383ef294 New translations index.json (Dutch) 2019-10-05 00:26:20 +09:00
Cutls
469d4ec566 New translations main.json (Dutch) 2019-10-05 00:26:18 +09:00
Cutls
418f1146b7 New translations setting.json (Dutch) 2019-10-05 00:26:17 +09:00
Cutls
170c8885d0 New translations update.json (Dutch) 2019-10-05 00:26:15 +09:00
Cutls
e3f04f4ab8 New translations acct.json (Finnish) 2019-10-05 00:26:14 +09:00
Cutls
791b8142bd New translations index.json (Finnish) 2019-10-05 00:26:13 +09:00
Cutls
ffff89ae96 New translations main.json (Finnish) 2019-10-05 00:26:11 +09:00
Cutls
3c8b0f6308 New translations setting.json (Finnish) 2019-10-05 00:26:10 +09:00
Cutls
a01aa8c335 New translations update.json (Finnish) 2019-10-05 00:26:08 +09:00
Cutls
1dc1e6f081 New translations acct.json (French) 2019-10-05 00:26:07 +09:00
Cutls
b86447cdbf New translations update.json (Greek) 2019-10-05 00:26:06 +09:00
Cutls
bf1e805269 New translations index.json (French) 2019-10-05 00:26:05 +09:00
Cutls
0b0d551730 New translations setting.json (French) 2019-10-05 00:26:03 +09:00
Cutls
22016d2856 New translations update.json (French) 2019-10-05 00:26:02 +09:00
Cutls
6ef5d66521 New translations acct.json (German) 2019-10-05 00:26:01 +09:00
Cutls
bbf80408d4 New translations index.json (German) 2019-10-05 00:26:00 +09:00
Cutls
f7c7614625 New translations main.json (German) 2019-10-05 00:25:58 +09:00
Cutls
c5e71230e3 New translations setting.json (German) 2019-10-05 00:25:56 +09:00
Cutls
d61e15a02c New translations update.json (German) 2019-10-05 00:25:55 +09:00
Cutls
981d286e13 New translations acct.json (Greek) 2019-10-05 00:25:54 +09:00
Cutls
f58c3e9a67 New translations index.json (Greek) 2019-10-05 00:25:53 +09:00
Cutls
c316c381f8 New translations main.json (Greek) 2019-10-05 00:25:52 +09:00
Cutls
066ae678f9 New translations main.json (French) 2019-10-05 00:25:50 +09:00
Cutls
c3a75a5525 New translations update.json (Danish) 2019-10-05 00:25:49 +09:00
Cutls
14257ba448 New translations index.json (Portuguese) 2019-10-05 00:25:48 +09:00
Cutls
2c7e86fa97 New translations setting.json (Portuguese) 2019-10-05 00:25:46 +09:00
Cutls
63d7b7a471 New translations index.json (Swedish) 2019-10-05 00:25:44 +09:00
Cutls
98a882f450 New translations main.json (Swedish) 2019-10-05 00:25:43 +09:00
Cutls
868fd1ddc5 New translations setting.json (Swedish) 2019-10-05 00:25:42 +09:00
Cutls
9c19819a08 New translations update.json (Swedish) 2019-10-05 00:25:41 +09:00
Cutls
62ef634bc0 New translations acct.json (Turkish) 2019-10-05 00:25:40 +09:00
Cutls
f4158deb0a New translations index.json (Turkish) 2019-10-05 00:25:39 +09:00
Cutls
e61a224fc6 New translations main.json (Turkish) 2019-10-05 00:25:37 +09:00
Cutls
c83fb868e4 New translations setting.json (Turkish) 2019-10-05 00:25:35 +09:00
Cutls
0a118f1740 New translations update.json (Turkish) 2019-10-05 00:25:34 +09:00
Cutls
d5d6edd2fb New translations acct.json (Ukrainian) 2019-10-05 00:25:33 +09:00
Cutls
e17382f441 New translations index.json (Ukrainian) 2019-10-05 00:25:32 +09:00
Cutls
6c6fe5378f New translations acct.json (Swedish) 2019-10-05 00:25:31 +09:00
Cutls
b68a31b2ee New translations main.json (Ukrainian) 2019-10-05 00:25:30 +09:00
Cutls
0be362e82c New translations update.json (Ukrainian) 2019-10-05 00:25:29 +09:00
Cutls
17a917ad00 New translations acct.json (Vietnamese) 2019-10-05 00:25:28 +09:00
Cutls
f975fbf221 New translations index.json (Vietnamese) 2019-10-05 00:25:27 +09:00
Cutls
1741813003 New translations main.json (Vietnamese) 2019-10-05 00:25:25 +09:00
Cutls
7e7e24021b New translations setting.json (Vietnamese) 2019-10-05 00:25:23 +09:00
Cutls
a662106228 New translations update.json (Vietnamese) 2019-10-05 00:25:22 +09:00
Cutls
be98a562d4 New translations acct.json (English) 2019-10-05 00:25:21 +09:00
Cutls
2af4692e1a New translations index.json (English) 2019-10-05 00:25:20 +09:00
Cutls
b525ac18bc New translations main.json (English) 2019-10-05 00:25:19 +09:00
Cutls
3fdca1ba64 New translations setting.json (English) 2019-10-05 00:25:18 +09:00
Cutls
9cc721bf80 New translations setting.json (Ukrainian) 2019-10-05 00:25:17 +09:00
Cutls
d9cbd5d173 New translations main.json (Portuguese) 2019-10-05 00:25:15 +09:00
Cutls
59f5cb9d35 New translations update.json (Spanish, Argentina) 2019-10-05 00:25:13 +09:00
Cutls
bd020c14fb New translations main.json (Spanish, Argentina) 2019-10-05 00:25:12 +09:00
Cutls
7b9f814d37 New translations update.json (Portuguese) 2019-10-05 00:25:11 +09:00
Cutls
7a6fe30ee5 New translations acct.json (Portuguese, Brazilian) 2019-10-05 00:25:10 +09:00
Cutls
9910adbb40 New translations index.json (Portuguese, Brazilian) 2019-10-05 00:25:09 +09:00
Cutls
ad6a578863 New translations main.json (Portuguese, Brazilian) 2019-10-05 00:25:08 +09:00
Cutls
365120ed9f New translations setting.json (Portuguese, Brazilian) 2019-10-05 00:25:06 +09:00
Cutls
dbd0541ad1 New translations update.json (Portuguese, Brazilian) 2019-10-05 00:25:05 +09:00
Cutls
7ce16856ec New translations acct.json (Romanian) 2019-10-05 00:25:04 +09:00
Cutls
8fff3e4ec0 New translations index.json (Romanian) 2019-10-05 00:25:03 +09:00
Cutls
53f559a750 New translations main.json (Romanian) 2019-10-05 00:25:01 +09:00
Cutls
924fc30697 New translations setting.json (Romanian) 2019-10-05 00:25:00 +09:00
Cutls
41955f8927 New translations setting.json (Spanish, Argentina) 2019-10-05 00:24:59 +09:00
Cutls
83689f420c New translations update.json (Romanian) 2019-10-05 00:24:57 +09:00
Cutls
1c68a0fd4b New translations index.json (Russian) 2019-10-05 00:24:56 +09:00
Cutls
9e25db7089 New translations main.json (Russian) 2019-10-05 00:24:55 +09:00
Cutls
7eacd54a9c New translations setting.json (Russian) 2019-10-05 00:24:53 +09:00
Cutls
be44519431 New translations update.json (Russian) 2019-10-05 00:24:52 +09:00
Cutls
66f35b2720 New translations acct.json (Serbian (Cyrillic)) 2019-10-05 00:24:51 +09:00
Cutls
23902d2465 New translations index.json (Spanish) 2019-10-05 00:24:50 +09:00
Cutls
1c3717edef New translations setting.json (Spanish) 2019-10-05 00:24:48 +09:00
Cutls
17fa0f3eb0 New translations update.json (Spanish) 2019-10-05 00:24:47 +09:00
Cutls
247e19f1e3 New translations acct.json (Spanish, Argentina) 2019-10-05 00:24:46 +09:00
Cutls
54fae816d2 New translations index.json (Spanish, Argentina) 2019-10-05 00:24:45 +09:00
Cutls
3b70a2cc2d New translations acct.json (Russian) 2019-10-05 00:24:43 +09:00
Cutls
acd4a16dcb New translations setting.json (Danish) 2019-10-05 00:24:42 +09:00
Cutls
550c84c367 Update Crowdin configuration file 2019-10-05 00:24:35 +09:00
Cutls
e35e0be251 New translations acct.json (Spanish) 2019-10-05 00:24:35 +09:00
Cutls
db5ada2cfb New translations main.json (Spanish) 2019-10-05 00:24:34 +09:00
Cutls
643f452064 New translations update.json (Serbian (Cyrillic)) 2019-10-05 00:24:33 +09:00
Cutls
bbda6c6785 New translations setting.json (Serbian (Cyrillic)) 2019-10-05 00:24:32 +09:00
Cutls
e6449cd818 New translations main.json (Serbian (Cyrillic)) 2019-10-05 00:24:30 +09:00
Cutls
708527db77 New translations index.json (Serbian (Cyrillic)) 2019-10-05 00:24:28 +09:00
Cutls
b1aa6c5699 New translations index.json (Bulgarian) 2019-10-05 00:24:26 +09:00
Cutls
eeaa1a7f07 New translations acct.json (Catalan) 2019-10-05 00:24:25 +09:00
Cutls
52b7183935 New translations update.json (Bulgarian) 2019-10-05 00:24:24 +09:00
Cutls
386833ae64 New translations setting.json (Bulgarian) 2019-10-05 00:24:23 +09:00
Cutls
d4a48ce585 New translations main.json (Catalan) 2019-10-05 00:24:22 +09:00
Cutls
4931cdd272 New translations main.json (Bulgarian) 2019-10-05 00:24:20 +09:00
Cutls
d7933dc73f New translations index.json (Catalan) 2019-10-05 00:24:19 +09:00
Cutls
9a1048cc17 New translations acct.json (Bulgarian) 2019-10-05 00:24:17 +09:00
Cutls
a8fd0736b3 New translations index.json (Arabic) 2019-10-05 00:24:16 +09:00
Cutls
10d884a837 New translations setting.json (Arabic) 2019-10-05 00:24:08 +09:00
Cutls
52b28c79c7 New translations main.json (Arabic) 2019-10-05 00:24:06 +09:00
Cutls
8a36e55813 New translations acct.json (Arabic) 2019-10-05 00:24:05 +09:00
Cutls
5103bb2697 New translations update.json (Afrikaans) 2019-10-05 00:24:04 +09:00
Cutls
c6a07714ba New translations setting.json (Afrikaans) 2019-10-05 00:24:03 +09:00
Cutls
48c3500033 New translations setting.json (Catalan) 2019-10-05 00:24:01 +09:00
Cutls
d155e75a5d New translations main.json (Afrikaans) 2019-10-05 00:23:59 +09:00
Cutls
fa481129a9 New translations update.json (Arabic) 2019-10-05 00:23:58 +09:00
Cutls
3c1402dab7 New translations update.json (Catalan) 2019-10-05 00:23:57 +09:00
Cutls
a7f4189bd3 New translations main.json (Czech) 2019-10-05 00:23:56 +09:00
Cutls
64ed13de7c New translations index.json (Chinese Simplified) 2019-10-05 00:23:55 +09:00
Cutls
21394eb29e New translations index.json (Afrikaans) 2019-10-05 00:23:54 +09:00
Cutls
fbb8c3613f New translations main.json (Danish) 2019-10-05 00:23:52 +09:00
Cutls
7778da80d5 New translations index.json (Danish) 2019-10-05 00:23:51 +09:00
Cutls
e791e102d5 New translations acct.json (Danish) 2019-10-05 00:23:50 +09:00
Cutls
deb73450c3 New translations update.json (Czech) 2019-10-05 00:23:49 +09:00
Cutls
cc9d1bf4f2 New translations setting.json (Czech) 2019-10-05 00:23:48 +09:00
Cutls
b025ef8b22 New translations index.json (Czech) 2019-10-05 00:23:46 +09:00
Cutls
7bda0f400a New translations acct.json (Chinese Simplified) 2019-10-05 00:23:45 +09:00
Cutls
3b7a113a11 New translations acct.json (Czech) 2019-10-05 00:23:44 +09:00
Cutls
ee636bf88c New translations setting.json (Chinese Traditional) 2019-10-05 00:23:43 +09:00
Cutls
52144d8e52 New translations main.json (Chinese Traditional) 2019-10-05 00:23:41 +09:00
Cutls
513c686dea New translations index.json (Chinese Traditional) 2019-10-05 00:23:39 +09:00
Cutls
29cc2429ae New translations acct.json (Chinese Traditional) 2019-10-05 00:23:38 +09:00
Cutls
31219e9ac1 New translations update.json (Chinese Simplified) 2019-10-05 00:23:37 +09:00
Cutls
3beab5a9e1 New translations setting.json (Chinese Simplified) 2019-10-05 00:23:36 +09:00
Cutls
7558311531 New translations main.json (Chinese Simplified) 2019-10-05 00:23:35 +09:00
Cutls
106d08a899 New translations update.json (Chinese Traditional) 2019-10-05 00:23:33 +09:00
Cutls
02f203475d New translations acct.json (Afrikaans) 2019-10-05 00:23:32 +09:00
Cutls
b4460eddf7 Update Crowdin configuration file 2019-10-05 00:23:16 +09:00
Cutls
90e06116d1 Merge branch 'master' of https://github.com/cutls/TheDesk 2019-10-05 00:22:02 +09:00
Cutls
1e4397ed7b Fix: mugen streaming reconnect 2019-10-05 00:21:52 +09:00
Cutls
e9cc2d0e52 Change: locales 2019-10-05 00:07:15 +09:00
Cutls
376847b489 Update Crowdin configuration file 2019-10-04 23:54:24 +09:00
Cutls
5d61b83c50 Update Crowdin configuration file 2019-10-04 23:43:03 +09:00
Cutls
561b3a594b Delete files 2019-10-04 23:39:59 +09:00
dependabot-preview[bot]
2d0acb68b1 Bump json5 from 2.1.0 to 2.1.1 in /app
Bumps [json5](https://github.com/json5/json5) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/v2.1.1/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v2.1.0...v2.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-03 04:16:36 +00:00
Cutls
919c6c40e2 Fix: when acct-sel, not showing current acct prof img 2019-10-03 02:14:22 +09:00
Cutls
120e9da1c9 Add: Argentine Spanish locale 2019-10-03 02:01:42 +09:00
Cutls
47c6454c00 Add: categorize of custom emojis 2019-10-03 01:38:55 +09:00
Cutls
02f49cd392 WIP: fix: write position of window 2019-10-03 01:38:21 +09:00
Cutls
8117ddb6ce Add: click custom emojis to zoom in 2019-10-03 01:37:33 +09:00
dependabot-preview[bot]
d372fa8e6e Bump electron from 6.0.10 to 6.0.11 in /app
Bumps [electron](https://github.com/electron/electron) from 6.0.10 to 6.0.11.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v6.0.10...v6.0.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-02 04:14:38 +00:00
dependabot-preview[bot]
c3ed865a3a Bump sweetalert2 from 8.17.6 to 8.18.0 in /app
Bumps [sweetalert2](https://github.com/sweetalert2/sweetalert2) from 8.17.6 to 8.18.0.
- [Release notes](https://github.com/sweetalert2/sweetalert2/releases)
- [Changelog](https://github.com/sweetalert2/sweetalert2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sweetalert2/sweetalert2/compare/v8.17.6...v8.18.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-01 03:10:07 +00:00
Cutls
96c137ec4b Merge branch 'master' of https://github.com/cutls/TheDesk 2019-09-30 02:29:37 +09:00
Cutls
c5cd683aa5 Add: warning on logining Pleroma, PixelFed or something compatible platform 2019-09-30 02:29:26 +09:00
Cutls
c5cdabaa3a Change: move and add poll parser 2019-09-30 02:23:25 +09:00
Cutls
d19be3f2cb Fix: resolving error 2019-09-30 02:23:10 +09:00
Cutls
a9f55aa64f Add: compatibility viewer 2019-09-30 02:22:44 +09:00
Cutls
dfb0f79c92 Fix: cannot resolve and open on browser about Misskey Live URL 2019-09-30 02:21:59 +09:00
Cutls
4a59438c0c Change: tag trending graph design 2019-09-30 02:21:18 +09:00
Cutls
f35710d652 DevTools is opened automaticaly when launching 2019-09-30 02:20:06 +09:00
Cutls
c19a532f3e Merge pull request #121 from cutls/dependabot/npm_and_yarn/app/jimp-0.8.4
Bump jimp from 0.8.3 to 0.8.4 in /app
2019-09-28 03:22:26 +09:00
Cutls
be6b278b3c Merge pull request #122 from cutls/dependabot/npm_and_yarn/app/fortawesome/fontawesome-free-5.11.2
Bump @fortawesome/fontawesome-free from 5.11.1 to 5.11.2 in /app
2019-09-28 03:22:11 +09:00
Cutls
78c16dc278 Merge pull request #123 from cutls/dependabot/npm_and_yarn/app/node-notifier-6.0.0
Bump node-notifier from 5.4.3 to 6.0.0 in /app
2019-09-28 03:21:53 +09:00
Cutls
09d2839a00 Add: BouyomiChan connection 2019-09-26 00:04:50 +09:00
dependabot-preview[bot]
d17d52436f Bump node-notifier from 5.4.3 to 6.0.0 in /app
Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 5.4.3 to 6.0.0.
- [Release notes](https://github.com/mikaelbr/node-notifier/releases)
- [Changelog](https://github.com/mikaelbr/node-notifier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mikaelbr/node-notifier/compare/v5.4.3...v6.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-23 23:00:07 +00:00
dependabot-preview[bot]
5c522a33d0 Bump @fortawesome/fontawesome-free from 5.11.1 to 5.11.2 in /app
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.11.1 to 5.11.2.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/5.11.1...5.11.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-23 22:59:38 +00:00
Cutls
c9cf89adeb TheDesk Usain (18.10.1) 2019-09-22 20:36:11 +09:00
Cutls
c5c996cb7a Merge branch 'master' of https://github.com/cutls/TheDesk 2019-09-22 19:56:13 +09:00
Cutls
f2ec258e7a Change: markers API trigger 2019-09-22 19:55:59 +09:00
Cutls
8c29f21970 Travis (comp) 2019-09-22 19:55:22 +09:00
dependabot-preview[bot]
5b730d2c38 Bump jimp from 0.8.3 to 0.8.4 in /app
Bumps [jimp](https://github.com/oliver-moran/jimp) from 0.8.3 to 0.8.4.
- [Release notes](https://github.com/oliver-moran/jimp/releases)
- [Changelog](https://github.com/oliver-moran/jimp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/oliver-moran/jimp/compare/v0.8.3...v0.8.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-20 20:19:52 +00:00
Cutls
609e84a8ae Merge pull request #118 from cutls/dependabot/npm_and_yarn/app/jimp-0.8.3
Bump jimp from 0.8.2 to 0.8.3 in /app
2019-09-20 22:53:55 +09:00
Cutls
7ca778f81b Merge pull request #119 from cutls/dependabot/npm_and_yarn/app/sweetalert2-8.17.6
Bump sweetalert2 from 8.17.4 to 8.17.6 in /app
2019-09-20 22:53:36 +09:00
Cutls
93b194af3b Merge pull request #120 from cutls/dependabot/npm_and_yarn/app/fortawesome/fontawesome-free-5.11.1
Bump @fortawesome/fontawesome-free from 5.11.0 to 5.11.1 in /app
2019-09-20 22:53:25 +09:00
Cutls
b3e1f32ffe Merge pull request #117 from cutls/dependabot/npm_and_yarn/app/electron-6.0.10
Bump electron from 6.0.9 to 6.0.10 in /app
2019-09-20 22:52:14 +09:00
dependabot-preview[bot]
d78b3bffeb Bump @fortawesome/fontawesome-free from 5.11.0 to 5.11.1 in /app
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.11.0 to 5.11.1.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/5.11.0...5.11.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 20:26:51 +00:00
dependabot-preview[bot]
bff5038a64 Bump sweetalert2 from 8.17.4 to 8.17.6 in /app
Bumps [sweetalert2](https://github.com/sweetalert2/sweetalert2) from 8.17.4 to 8.17.6.
- [Release notes](https://github.com/sweetalert2/sweetalert2/releases)
- [Changelog](https://github.com/sweetalert2/sweetalert2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sweetalert2/sweetalert2/compare/v8.17.4...v8.17.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 20:26:23 +00:00
dependabot-preview[bot]
0c7fcfbcc5 Bump jimp from 0.8.2 to 0.8.3 in /app
Bumps [jimp](https://github.com/oliver-moran/jimp) from 0.8.2 to 0.8.3.
- [Release notes](https://github.com/oliver-moran/jimp/releases)
- [Changelog](https://github.com/oliver-moran/jimp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/oliver-moran/jimp/compare/v0.8.2...v0.8.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 20:25:54 +00:00
dependabot-preview[bot]
9d6fc15959 Bump electron from 6.0.9 to 6.0.10 in /app
Bumps [electron](https://github.com/electron/electron) from 6.0.9 to 6.0.10.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v6.0.9...v6.0.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-19 20:25:35 +00:00
Cutls
5bad5e1031 Merge pull request #116 from cutls/dependabot/npm_and_yarn/app/fortawesome/fontawesome-free-5.11.0
Bump @fortawesome/fontawesome-free from 5.10.2 to 5.11.0 in /app
2019-09-19 20:07:26 +09:00
Cutls
f8d6ec3a8f Merge pull request #114 from cutls/dependabot/npm_and_yarn/app/sweetalert2-8.17.4
Bump sweetalert2 from 8.17.3 to 8.17.4 in /app
2019-09-19 20:07:14 +09:00
dependabot-preview[bot]
9a3dc81630 Bump @fortawesome/fontawesome-free from 5.10.2 to 5.11.0 in /app
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.10.2 to 5.11.0.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/5.10.2...5.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-18 20:30:43 +00:00
Cutls
3d9b97ccb5 WIP: Travis WIndows 1 2019-09-18 23:39:55 +09:00
Cutls
2c3dbba052 to Travis CI error for Windows 2019-09-18 23:32:31 +09:00
Cutls
907eecd030 fix 2019-09-18 23:25:22 +09:00
dependabot-preview[bot]
75026bf42d Bump sweetalert2 from 8.17.3 to 8.17.4 in /app
Bumps [sweetalert2](https://github.com/sweetalert2/sweetalert2) from 8.17.3 to 8.17.4.
- [Release notes](https://github.com/sweetalert2/sweetalert2/releases)
- [Changelog](https://github.com/sweetalert2/sweetalert2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sweetalert2/sweetalert2/compare/v8.17.3...v8.17.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-18 14:25:11 +00:00
Cutls
d217fb33a9 Like Typo 2019-09-18 23:24:34 +09:00
Cutls
8cea32d01b For developers 2019-09-18 23:23:40 +09:00
Cutls
c8d2da0c07 For Linux, macOS 2019-09-18 23:11:39 +09:00
Cutls
a458f51b9a travis 2019-09-17 01:43:01 +09:00
Cutls
bd8ac2935b to Travis 2019-09-17 01:37:18 +09:00
Cutls
dd59cc1468 Introduce yarn 2019-09-17 01:20:52 +09:00
Cutls
fd365c52cc Merge branch 'master' of https://github.com/cutls/TheDesk 2019-09-17 00:59:39 +09:00
Cutls
ad7e77a067 Add: notif-sound volume 2019-09-17 00:59:25 +09:00
Cutls
6b9135a205 remove v1 serach API 2019-09-17 00:24:16 +09:00
Cutls
fdca5b1c60 When complete vote, not refresh status 2019-09-17 00:24:00 +09:00
Cutls
f891b30f9f When unknown media, show after last"." 2019-09-17 00:23:41 +09:00
Cutls
8fbd8070f2 For Pleroma tags 2019-09-17 00:22:55 +09:00
Cutls
657dec1c10 When redraft, diabled acct-sel 2019-09-17 00:22:40 +09:00
Cutls
0d93dcdc45 Merge pull request #113 from cutls/dependabot/npm_and_yarn/app/jimp-tw-0.8.2
Update jimp requirement from ^0.7.0 to ^0.8.2 in /app
2019-09-14 12:13:26 +09:00
dependabot-preview[bot]
5a50c0e1e6 Update jimp requirement from ^0.7.0 to ^0.8.2 in /app
Updates the requirements on [jimp](https://github.com/oliver-moran/jimp) to permit the latest version.
- [Release notes](https://github.com/oliver-moran/jimp/releases)
- [Changelog](https://github.com/oliver-moran/jimp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/oliver-moran/jimp/compare/v0.7.0...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-13 20:26:10 +00:00
Cutls
ab8da89fbc Package and make.js 2019-09-14 02:24:06 +09:00
Cutls
c9edf47643 TheDesk Usamin (18.10.0) 2019-09-14 02:23:24 +09:00
Cutls
84328bf693 Fix: if toot content is blank 2019-09-14 02:18:33 +09:00
Cutls
6fdbf0b48e Add: resizable column 2019-09-14 02:10:02 +09:00
Cutls
8b1d5b3cb4 Change: make.js 2019-09-12 23:35:13 +09:00
Cutls
bf69d23379 Add: Welcome guide 2019-09-12 23:25:27 +09:00
Cutls
a4e3031796 Add: some CORS error 2019-09-12 21:30:48 +09:00
Cutls
286e7956f2 Add: featured tag 2019-09-09 23:26:57 +09:00
Cutls
e04b64a326 Unread misc 2019-09-08 09:39:26 +09:00
Cutls
c86a99df06 Add: markers and columnReload on notf 2019-09-08 01:44:28 +09:00
Cutls
3b69c4e7c1 Add: quote 2019-09-08 01:33:01 +09:00
Cutls
bc5be9449d Add: some supported instance and add 'quote' support or not info 2019-09-08 01:02:40 +09:00
Cutls
b968e59db1 Merge pull request #110 from cutls/dependabot/npm_and_yarn/app/jimp-tw-0.7.0
Update jimp requirement from ^0.6.4 to ^0.7.0 in /app
2019-09-07 05:28:47 +09:00
dependabot-preview[bot]
fa06c4a729 Update jimp requirement from ^0.6.4 to ^0.7.0 in /app
Updates the requirements on [jimp](https://github.com/oliver-moran/jimp) to permit the latest version.
- [Release notes](https://github.com/oliver-moran/jimp/releases)
- [Changelog](https://github.com/oliver-moran/jimp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/oliver-moran/jimp/compare/v0.6.4...v0.7.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-06 20:26:15 +00:00
Cutls
81b99515cd Add: POST markers 2019-09-07 01:46:50 +09:00
Cutls
5e6c713f9d Merge branch 'master' of https://github.com/cutls/TheDesk 2019-09-07 01:33:41 +09:00
Cutls
376425cc98 Add: demo: unread reader 2019-09-07 01:33:30 +09:00
Cutls
38cff550e1 Add: identity_proof 2019-09-05 23:55:34 +09:00
Cutls
64781c1cca Developer -> Main author 2019-09-03 09:57:56 +09:00
Cutls
e82e85b5ea Fix: replycount 2019-09-02 00:14:33 +09:00
Cutls
2b84a27cdc TheDesk Usain (18.9.2) 2019-09-01 21:27:18 +09:00
Cutls
6f7f5cbabc Fix: poll UI 2019-09-01 01:46:42 +09:00
Cutls
174a8696b0 fix 2019-09-01 01:32:05 +09:00
Cutls
d5a27ba814 TheDesk Usamin (18.9.1) 2019-09-01 01:31:19 +09:00
Cutls
6e2e488565 Fix: instance actor 2019-09-01 00:02:34 +09:00
Cutls
7d02ef2b3e TheDesk Usamin (18.9.0) 2019-08-31 23:35:18 +09:00
Cutls
f8f2719c5d Merge branch 'master' of https://github.com/cutls/TheDesk 2019-08-31 00:10:37 +09:00
Cutls
da6faaf1a5 Add: timeago on acct 2019-08-31 00:10:24 +09:00
Cutls
350068d6f1 Add: locale 2019-08-31 00:10:16 +09:00
Cutls
70bee4265b Add: custom CSS request 2019-08-31 00:10:01 +09:00
Cutls
18ce8cf2f4 Add: show note and last-status on acct 2019-08-31 00:09:37 +09:00
Cutls
b50a55cce7 Add: multi-lang relative time 2019-08-31 00:09:01 +09:00
Cutls
e6f0e18aed Update README.md 2019-08-30 09:59:21 +09:00
Cutls
fd7daa407a Update README_ja.md 2019-08-30 09:58:51 +09:00
Cutls
0dead93606 Add: resizable menu 2019-08-30 01:46:30 +09:00
Cutls
5d6e8cf9b3 Add: search offset 2019-08-30 01:46:19 +09:00
Cutls
a0544e21e3 Add: directory 2019-08-30 01:46:04 +09:00
Cutls
d54112d41c Fix: bottom buttons group padding(top) 2019-08-30 01:45:32 +09:00
Cutls
1a0ba40b43 Introduce: via npm 2019-08-30 01:45:07 +09:00
Cutls
5d8ca9566a Add and fix 2019-08-29 01:33:06 +09:00
Cutls
834fa719b2 Introduce: JSON5 and export v2.1 2019-08-29 01:20:47 +09:00
Cutls
89bde2739a Merge branch 'master' of https://github.com/cutls/TheDesk 2019-08-26 21:06:11 +09:00
Cutls
46dbc9ae62 Add: GIt hash 2019-08-26 21:06:07 +09:00
Cutls
71554fca59 Merge pull request #109 from yzrsng/master
Enforce single instance for linux and windows
2019-08-26 13:10:20 +09:00
yzrsng
1c76b5886f Enforce single instance for linux and windows 2019-08-26 12:58:04 +09:00
Cutls
5007b70683 Add: git hash 2019-08-26 00:09:01 +09:00
Cutls
5694cbd945 Delete: can make file 2019-08-26 00:08:51 +09:00
Cutls
eee3c34dd7 TheDesk Usamin (18.8.3) 2019-08-25 22:40:33 +09:00
Cutls
cac39ad539 Fix: cannot follow at Pawoo 2019-08-25 22:22:44 +09:00
Cutls
1b68cdf7db Change: move user matching to More dropdown 2019-08-24 21:19:52 +09:00
Cutls
845c9a0f2e Merge branch 'master' of https://github.com/cutls/TheDesk 2019-08-24 01:10:08 +09:00
Cutls
24c69af942 Fix and Improve: show user data 2019-08-24 01:09:56 +09:00
Cutls
c656bc4bb6 Fix: toggle actions of toots 2019-08-24 01:09:40 +09:00
Cutls
025b60e564 README 2019-08-24 01:09:20 +09:00
Cutls
1e86964d8f Update issue templates 2019-08-23 02:54:29 +09:00
Cutls
61d4d7005e Fix: #108 NowPlaying of iTunes on macOS 2019-08-23 02:00:22 +09:00
Cutls
d0ed9faf50 TheDesk Usamin (18.8.2) 2019-08-22 01:44:37 +09:00
Cutls
8ed12170de TheDesk Usamin (18.8.2) 2019-08-22 01:34:03 +09:00
Cutls
d2ba5cbe4d Fix: ugly layout when display-area is not wide 2019-08-22 01:30:05 +09:00
Cutls
6b6d3c7307 Fix: when hashtags is not lower case 2019-08-22 00:00:08 +09:00
Cutls
362b5b9c69 NSFW media->sensitive media 2019-08-21 23:07:18 +09:00
Cutls
3cde12e893 TheDesk Usain (18.8.1) 2019-08-21 21:51:36 +09:00
Cutls
d2214480f6 Fix: gray color 2019-08-21 00:36:47 +09:00
Cutls
b8bd1a8ae6 Fix CSS 2019-08-21 00:02:29 +09:00
Cutls
0bfef0c2ce Remove: log 2019-08-19 23:31:42 +09:00
Cutls
f2ce98fda5 Fix: some CSS 2019-08-19 23:27:53 +09:00
Cutls
5f08215571 Fix: muting list 2019-08-19 23:09:46 +09:00
Cutls
9567a6ddf9 Fix: emojis 2019-08-19 23:09:34 +09:00
Cutls
4416c56884 Add: show dialogs when muting and blocking 2019-08-19 22:55:50 +09:00
Cutls
68328a9449 Fix: Fontawesome 2019-08-14 02:49:51 +09:00
Cutls
141f2a3f39 Change: CDN 2019-08-14 02:36:01 +09:00
Cutls
7bbca06033 Add: FOSSA 2019-08-14 02:14:34 +09:00
Cutls
ebb72265b9 package.json update 2019-08-14 01:47:21 +09:00
Cutls
c98f433da6 Delete assets 2019-08-14 01:35:01 +09:00
Cutls
2346ef7089 Remove: NowPlaying on Windows 2019-08-14 01:23:25 +09:00
Cutls
8aac6474da TheDesk Usamin (18.8.0) 2019-08-14 00:53:36 +09:00
Cutls
ffcecf38c8 Add: Change: live column add and remove 2019-08-14 00:40:21 +09:00
Cutls
77342206b1 Add: reload this column 2019-08-14 00:25:58 +09:00
Cutls
b6a44e7a7c Fix: vote display refresh 2019-08-14 00:24:11 +09:00
Cutls
e138d357c7 Remove: /follows 2019-08-14 00:23:34 +09:00
Cutls
66645982e9 Fix: arrow key img selector(reversed) 2019-08-14 00:23:05 +09:00
Cutls
4347f55077 Speed up 2019-08-11 02:52:32 +09:00
Cutls
ab9d45c775 Update: CSS about #InstanceTicker 2019-08-11 00:12:11 +09:00
Cutls
9c0c662f25 Update: icons 2019-08-09 10:58:55 +09:00
Cutls
63abdb2d53 Add: Liberapay 2019-08-08 02:06:13 +09:00
Cutls
47e2693368 Fix: about blue theme 2019-08-08 01:55:47 +09:00
Cutls
b909cbe666 Introduce: TheDesk notice v2 2019-08-07 23:27:00 +09:00
Cutls
95f5ce13ba Add: detecting languages[de/cs/bg] 2019-08-07 23:14:20 +09:00
Cutls
fed1496e68 Update: de and Change: algo of locale 2019-08-07 12:14:07 +09:00
Cutls
da6993730c Add: bg/cs/de locales 2019-08-07 09:24:52 +09:00
Cutls
0a1d462ace Add: trending tags 2019-08-06 23:06:09 +09:00
Cutls
1387482db0 TheDesk Usamin (18.7.1) 2019-08-02 00:02:52 +09:00
Cutls
b7a86324dd Merge pull request #105 from cutls/dependabot/npm_and_yarn/app/readline-sync-1.4.10
Update readline-sync requirement from 1.4.9 to 1.4.10 in /app
2019-08-01 22:56:12 +09:00
Cutls
babc5a6424 Merge pull request #107 from cutls/dependabot/npm_and_yarn/app/electron-tw-6.0.0
Update electron requirement from ^5.0.4 to ^6.0.0 in /app
2019-08-01 22:55:31 +09:00
dependabot-preview[bot]
74a468383c Update electron requirement from ^5.0.4 to ^6.0.0 in /app
Updates the requirements on [electron](https://github.com/electron/electron) to permit the latest version.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v5.0.4...v6.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-31 20:26:05 +00:00
dependabot-preview[bot]
3a48f0ff0d Update readline-sync requirement from 1.4.9 to 1.4.10 in /app
Updates the requirements on [readline-sync](https://github.com/anseki/readline-sync) to permit the latest version.
- [Release notes](https://github.com/anseki/readline-sync/releases)
- [Commits](https://github.com/anseki/readline-sync/compare/1.4.9...1.4.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-29 20:25:25 +00:00
Cutls
e26363adf6 Fix: when open an image modal, disabled toot selector 2019-07-29 01:13:53 +09:00
Cutls
35d97d42c5 Fix: context func is pollted 2019-07-29 01:09:12 +09:00
Cutls
4fa7d07500 Improve: sorting 2019-07-29 00:52:12 +09:00
Cutls
15f428528b Add: video loop(on modal and Pleroma) and autoplay on modal 2019-07-29 00:42:52 +09:00
Cutls
7fa805fe3a Change: sort suggest 2019-07-29 00:42:17 +09:00
Cutls
fd9c97a126 Add: tag suggest with v2 2019-07-29 00:16:49 +09:00
Cutls
f081154804 init 2019-07-28 23:48:44 +09:00
Cutls
866affdf45 Add: mute by emoji(custom/default) 2019-07-28 23:47:50 +09:00
Cutls
30aee556f1 Fix: if account is null #102 2019-07-25 23:55:25 +09:00
Cutls
b12c18aa08 Add: NSFW warning when not blurhashed sensitive toots 2019-07-25 23:52:44 +09:00
Cutls
f17a47d088 Change: NSFW images on not blurhash supported instance 2019-07-25 23:20:38 +09:00
Cutls
d79f096749 Merge pull request #104 from cutls/dependabot/npm_and_yarn/app/electron-builder-tw-21.1.5
Update electron-builder requirement from ^20.44.4 to ^21.1.5 in /app
2019-07-25 23:16:23 +09:00
dependabot-preview[bot]
5b82b91c6a Update electron-builder requirement from ^20.44.4 to ^21.1.5 in /app
Updates the requirements on [electron-builder](https://github.com/electron-userland/electron-builder) to permit the latest version.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v20.44.4...v21.1.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-24 20:25:27 +00:00
Cutls
4a6b87ac1c Fix: emoji-including URL 2019-07-15 00:56:19 +09:00
Cutls
1bea06354e TheDesk Usamin (18.7.0) 2019-07-13 00:01:16 +09:00
Cutls
5fbd5aaf10 Fix: layout 2019-07-13 00:01:09 +09:00
Cutls
0290a6d918 shortcut key desc 2019-07-13 00:00:26 +09:00
Cutls
2576c48441 Pleroma URL 2019-07-12 23:16:27 +09:00
Cutls
eb02dd2986 Fix: when failed to upload 2019-07-12 01:01:24 +09:00
Cutls
d92570fa3b Add: keyboard-control 2019-07-12 00:53:55 +09:00
Cutls
38c988d2a2 Fix: desc hidden 2019-07-10 22:48:36 +09:00
Cutls
0927282d41 Change: overflow of column name 2019-07-09 22:48:57 +09:00
Cutls
5ffd59619c TheDesk Usamin (18.6.7) 2019-07-09 00:35:33 +09:00
Cutls
a739926ad4 sub-button color 2019-07-09 00:35:20 +09:00
Cutls
e41c38f41d Change: remove get card API 2019-07-09 00:27:31 +09:00
Cutls
2de05b84aa Misskey streaming leak 2019-07-09 00:27:18 +09:00
Cutls
0e9bdef9ca Add: set main account on showOnTL 2019-07-06 23:16:41 +09:00
Cutls
8e70e005c1 TheDesk Usamin (18.6.6) 2019-07-02 00:37:58 +09:00
Cutls
3817dbc925 Some bugs about Vue 2019-07-02 00:32:28 +09:00
Cutls
63ec669c52 boost-btn 2019-07-02 00:32:06 +09:00
Cutls
afc5702796 boost-btn 2019-07-02 00:31:54 +09:00
Cutls
41ec66b58a Add theme: [渚の花嫁] 新田美波 2019-07-02 00:31:44 +09:00
Cutls
936d3ca7fc Change: flexible color of toot-btn 2019-07-02 00:31:08 +09:00
Cutls
f8b4b7b74d Change: unboostable toot btn(hidden to unvisible) 2019-07-02 00:26:41 +09:00
Cutls
bd865977b0 Remove: best-friends.chat from TheDesk support instance 2019-07-01 23:19:47 +09:00
Cutls
d056db5617 Do not ... on translate results #96 2019-07-01 21:46:00 +09:00
Cutls
7685677ada Merge branch 'master' of https://github.com/cutls/TheDesk 2019-07-01 21:40:46 +09:00
Cutls
eb0aa81492 Remove knzk.me from support instances 2019-07-01 21:40:28 +09:00
Cutls
dc52531f28 Merge pull request #99 from kPherox/update-kpherox-links
Update kPherox's links
2019-06-29 16:22:34 +09:00
kPherox
5a20034b9f Update kPherox's links 2019-06-29 16:11:52 +09:00
Cutls
5cd0ef0d8a Update README 2019-06-27 23:17:07 +09:00
Cutls
4daf47bb5f TheDesk Usamin (18.6.5) 2019-06-27 21:57:16 +09:00
Cutls
3e0dbd8433 Remove: colummn-deleting dialog 2019-06-26 00:52:15 +09:00
Cutls
fc4d3b24f6 Fix: column-deleteing and url-analytics bug 2019-06-26 00:51:49 +09:00
Cutls
3a9eab55a4 Fix: misskey streaming 2019-06-26 00:33:44 +09:00
Cutls
546b34275d Fix: setting bugs on Vue 2019-06-26 00:33:32 +09:00
Cutls
3ee4cf27d5 Good-bye native dialogs 2019-06-26 00:33:20 +09:00
Cutls
87da95b9a4 Fix: TheDesk nano 2019-06-25 23:26:15 +09:00
Cutls
3368e30e15 Fix: streaming bug 2019-06-25 23:26:01 +09:00
Cutls
f1ea5ad8f1 Fix: Notf TL bugs about Misskey 2019-06-25 23:16:36 +09:00
Cutls
fa2d5f8492 OAuth and something 2019-06-25 23:16:12 +09:00
Cutls
0f2c5de161 Use sweetalert 2019-06-25 23:15:52 +09:00
Cutls
b69937d4fd Sweetalert CSS for custom themes 2019-06-25 23:15:25 +09:00
Cutls
e82faacbb2 Change: keyboard shortcut 2019-06-24 23:10:44 +09:00
Cutls
2ab5c67545 For MS Store 2019-06-24 23:10:29 +09:00
Cutls
358d01b12e Change: audio wrap 2019-06-24 00:28:42 +09:00
Cutls
95460fabbb TheDesk Usamin (18.6.4) 2019-06-23 18:38:22 +09:00
Cutls
0fb882b3ad Fix: streaming 2019-06-23 18:24:55 +09:00
Cutls
3d0382d279 TheDesk Usamin (18.6.3) 2019-06-23 10:57:56 +09:00
Cutls
59d5aa4515 Add: audio player(chrome default) 2019-06-23 01:20:17 +09:00
Cutls
2dff9f9b17 TheDesk Usamin (18.6.2) 2019-06-23 01:06:07 +09:00
Cutls
03fded672e Add gitignore 2019-06-23 00:51:21 +09:00
Cutls
a21c1f5329 Internal 2019-06-23 00:51:11 +09:00
Cutls
37815ced63 Merge pull request #91 from cutls/dependabot/npm_and_yarn/app/electron-builder-20.44.4
Bump electron-builder from 20.43.0 to 20.44.4 in /app
2019-06-22 10:08:07 +09:00
Cutls
b7f9b8d668 Merge pull request #92 from cutls/dependabot/npm_and_yarn/app/sweetalert2-8.13.0
Bump sweetalert2 from 8.12.2 to 8.13.0 in /app
2019-06-22 10:07:57 +09:00
Cutls
f68af78099 Merge pull request #93 from cutls/dependabot/npm_and_yarn/app/materialize-css-1.0.0
Bump materialize-css from 1.0.0-rc.2 to 1.0.0 in /app
2019-06-22 10:07:43 +09:00
dependabot-preview[bot]
027abffa01 Bump materialize-css from 1.0.0-rc.2 to 1.0.0 in /app
Bumps [materialize-css](https://github.com/Dogfalo/materialize) from 1.0.0-rc.2 to 1.0.0.
- [Release notes](https://github.com/Dogfalo/materialize/releases)
- [Changelog](https://github.com/Dogfalo/materialize/blob/v1-dev/CHANGELOG.md)
- [Commits](https://github.com/Dogfalo/materialize/compare/1.0.0-rc.2...1.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-21 20:18:44 +00:00
dependabot-preview[bot]
5dfba4dd5e Bump sweetalert2 from 8.12.2 to 8.13.0 in /app
Bumps [sweetalert2](https://github.com/sweetalert2/sweetalert2) from 8.12.2 to 8.13.0.
- [Release notes](https://github.com/sweetalert2/sweetalert2/releases)
- [Changelog](https://github.com/sweetalert2/sweetalert2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sweetalert2/sweetalert2/compare/v8.12.2...v8.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-21 20:18:16 +00:00
dependabot-preview[bot]
d0ae7e9cf9 Bump electron-builder from 20.43.0 to 20.44.4 in /app
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 20.43.0 to 20.44.4.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v20.43.0...v20.44.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-21 20:17:44 +00:00
Cutls
5a57e984de Introduce: SweetAlert 2019-06-22 01:06:32 +09:00
Cutls
473f4d7c24 Move: jQuery and Materialize 2019-06-22 00:22:45 +09:00
Cutls
35bfea2dbd Fix: update tool 2019-06-21 23:24:28 +09:00
Cutls
62cb30cb5b Merge branch 'master' of https://github.com/cutls/TheDesk 2019-06-21 23:18:08 +09:00
Cutls
9d2eb6f18b Fix: moreLoading 2019-06-21 23:17:56 +09:00
Cutls
d5cd57c26d Merge pull request #88 from cutls/dependabot/npm_and_yarn/app/electron-5.0.4
Bump electron from 5.0.1 to 5.0.4 in /app
2019-06-17 00:34:27 +09:00
Cutls
37695735e0 TheDesk Usamin (18.6.1) 2019-06-16 22:00:31 +09:00
Cutls
c15625c063 Fix: wordmute/emp 2019-06-16 21:52:41 +09:00
Cutls
cd65bd4c2a Fix: bugs about new(?) Materialize 2019-06-16 20:35:15 +09:00
Cutls
fc3fead235 Fix: font of textarea 2019-06-16 20:34:57 +09:00
Cutls
2e00282560 Update README 2019-06-16 20:34:41 +09:00
Cutls
54d740e861 Change: #86 open in browser on acct prof page 2019-06-16 02:05:27 +09:00
Cutls
478a849e8d Fix: error about RAM 2019-06-16 01:34:49 +09:00
Cutls
82c5b35d07 TweetDeck 2019-06-16 01:18:40 +09:00
dependabot-preview[bot]
6cdd4cba9e Bump electron from 5.0.1 to 5.0.4 in /app
Bumps [electron](https://github.com/electron/electron) from 5.0.1 to 5.0.4.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v5.0.1...v5.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-15 16:10:18 +00:00
Cutls
dda9469874 TheDesk Usamin (18.6.0) - fix 2019-06-16 01:08:10 +09:00
Cutls
334fbdab3f TheDesk Usamin (18.6.0) 2019-06-15 23:07:18 +09:00
Cutls
a5f8e34ee6 Fix: 'about' preload #86 2019-06-15 18:52:28 +09:00
Cutls
eba54d0906 Change: some node integration on rend-proc #86 2019-06-15 02:30:29 +09:00
Cutls
070c40a958 Remove: node on update.html #86 2019-06-15 02:23:41 +09:00
Cutls
8d308cae5e Remove: Adobe photo editor 2019-06-15 02:17:28 +09:00
Cutls
848e9fcf99 Change: language.js reload #86 2019-06-15 02:12:55 +09:00
Cutls
d146776b17 Remove: node on spotify/tips/showOnTL.js #86 2019-06-15 02:10:11 +09:00
Cutls
7da16a7428 Remove: node on setting/system.js #86 2019-06-15 02:01:38 +09:00
Cutls
7b46145114 Remove: node on ui/img/layout.js #86 2019-06-15 01:32:59 +09:00
Cutls
725f0f789a Remove: node on notification/parse.js #86 2019-06-15 01:25:51 +09:00
Cutls
772a5438aa Remove: node on details/misskeyparse.js #86 2019-06-15 01:20:12 +09:00
Cutls
3c276b329b Remove: node on post.js #86 2019-06-15 01:15:45 +09:00
Cutls
e2cde71831 Remove: node in firest/img(post).js #86 2019-06-15 01:10:32 +09:00
Cutls
861ee3250d Remove: node in manager.js #86 2019-06-15 01:05:53 +09:00
Cutls
5672ccfa37 Add: login auth open url #86 2019-06-15 01:01:07 +09:00
Cutls
65e691cda8 Add: install source dialog #86 2019-06-15 00:54:44 +09:00
Cutls
56cca8b529 Change: mainWindow to event.sender on IPC #86 2019-06-15 00:51:41 +09:00
Cutls
367f2f656e Add: getPlatform #86 2019-06-14 23:25:27 +09:00
Cutls
7f806bd155 Add: sendSinmpleIpc for 'about' #86 2019-06-14 23:21:08 +09:00
Cutls
a70444e3c7 Introduce: preload and postMessage #86 2019-06-14 23:17:16 +09:00
Cutls
1a72033571 return 2019-06-14 00:59:33 +09:00
Cutls
a475407c27 try 2019-06-14 00:54:22 +09:00
Cutls
b602cd92a9 try 2019-06-14 00:54:08 +09:00
Cutls
2878a4a524 Fix beta 2019-06-14 00:53:19 +09:00
Cutls
8b1ac63343 Introducing: Materialize 1.0.0 2019-06-07 01:11:04 +09:00
Cutls
8d1012c9fb Merge branch 'master' of https://github.com/cutls/TheDesk 2019-06-06 23:42:15 +09:00
Cutls
62f2654358 Fix: Notice "ended" when poll has been ended without your vote 2019-06-06 23:42:02 +09:00
Cutls
e7feb4b2c5 Merge pull request #84 from cutls/dependabot/npm_and_yarn/app/electron-builder-20.43.0
Bump electron-builder from 20.41.0 to 20.43.0 in /app
2019-06-05 23:55:30 +09:00
dependabot-preview[bot]
dcc62b32a2 Bump electron-builder from 20.41.0 to 20.43.0 in /app
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 20.41.0 to 20.43.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v20.41.0...v20.43.0)
2019-06-04 20:25:43 +00:00
Cutls
26eecd11b6 Fix package 2019-06-04 23:31:39 +09:00
Cutls
8d388bbd4b update and construct script 2019-06-04 23:01:04 +09:00
Cutls
409635b00c Fix: hide filter btns on coll notf pane 2019-06-04 22:41:04 +09:00
Cutls
17a71ddbf6 Fix: Exclude notification 2019-06-04 22:37:03 +09:00
Cutls
d2a86af0e2 Change month logic and English 2019-06-04 22:29:47 +09:00
Cutls
f23dc928b2 WIP: Now Usamin (18.5.1) 2019-06-04 01:26:00 +09:00
Cutls
68e11dc222 WIP support me 2019-06-04 01:01:14 +09:00
Cutls
075c3ef9ca Merge branch 'master' of https://github.com/cutls/TheDesk 2019-06-03 23:39:27 +09:00
Cutls
6b004a3992 Fix visibility on Misskey #83 2019-06-03 23:38:58 +09:00
Cutls
3cf198538a Merge pull request #82 from cutls/dependabot/npm_and_yarn/app/electron-builder-20.41.0
Bump electron-builder from 20.40.2 to 20.41.0 in /app
2019-06-03 01:42:00 +09:00
Cutls
612400944e Fix: Pleroma hashtags unshown 2019-05-29 23:24:50 +09:00
Cutls
5f22d2427e Fix: Pleroma image unshown 2019-05-29 23:13:38 +09:00
Cutls
2692967b7d Fix: emojis select buttons on white-themes 2019-05-29 00:42:06 +09:00
dependabot-preview[bot]
2ed85ab978 Bump electron-builder from 20.40.2 to 20.41.0 in /app
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 20.40.2 to 20.41.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v20.40.2...v20.41.0)
2019-05-27 23:31:23 +00:00
Cutls
f843872a14 travis final 2019-05-27 02:59:57 +09:00
Cutls
b365b9d15b travis 19 2019-05-27 02:40:48 +09:00
Cutls
938ff926c3 travis 18 2019-05-27 02:28:08 +09:00
Cutls
7a1a6354df travis 17 2019-05-27 02:21:40 +09:00
Cutls
37e9d8242b travis 16 2019-05-27 02:19:09 +09:00
Cutls
8bf03f2809 travis 2019-05-27 02:02:37 +09:00
Cutls
c684a5b0d0 travis 16 2019-05-27 01:40:07 +09:00
Cutls
3281461809 travis 15 2019-05-27 01:38:52 +09:00
Cutls
2cd5cf505d travis 14 2019-05-27 01:34:26 +09:00
Cutls
42334450bf travis 14 2019-05-27 01:24:00 +09:00
Cutls
410633c873 travis 14 2019-05-27 01:18:44 +09:00
Cutls
ee67baf0b4 travis 13 2019-05-27 01:17:15 +09:00
Cutls
7afa959e6c travis 12 2019-05-27 00:45:26 +09:00
Cutls
ca0db95910 travis 11 2019-05-27 00:41:34 +09:00
Cutls
9825a84880 travis 11 2019-05-27 00:33:30 +09:00
Cutls
68260f3d85 travis 10 2019-05-27 00:22:50 +09:00
Cutls
d25fcfadc1 travis 9 2019-05-27 00:10:12 +09:00
Cutls
7059c1bb31 travis 9 2019-05-26 23:59:38 +09:00
Cutls
a4ac0af6e1 travis 8 2019-05-26 23:56:16 +09:00
Cutls
205a3bea44 travis 7 2019-05-26 23:55:16 +09:00
Cutls
748a69b3bd travis 6 2019-05-26 23:42:35 +09:00
Cutls
be36c3dd0b travis run all test 2019-05-26 23:40:03 +09:00
Cutls
13384ed93f travis final 2019-05-26 22:56:37 +09:00
Cutls
92b8a36019 travis windows 2 2019-05-26 22:43:08 +09:00
Cutls
225786e07f travis win 2019-05-26 22:40:37 +09:00
Cutls
8c8cf44ed6 travis 6 2019-05-26 22:22:45 +09:00
Cutls
c3e6e657c9 travis 5 2019-05-26 22:16:16 +09:00
Cutls
04185ea07b travis 4 2019-05-26 22:09:00 +09:00
Cutls
49794e05d0 travis 3 2019-05-26 21:58:31 +09:00
Cutls
b2be1a7bcc travis 2 2019-05-26 21:53:33 +09:00
Cutls
2d167c9c2e travis 1 2019-05-26 21:46:26 +09:00
Cutls
5251ba9b3f update README 2019-05-26 20:57:42 +09:00
Cutls
df443003e4 travis 2019-05-26 20:49:49 +09:00
Cutls
3719b1ed40 travis 2019-05-26 20:47:07 +09:00
Cutls
d4a246ea59 Merge pull request #80 from cutls/WIP-(before-CI)
Wip (before ci)
2019-05-26 20:44:18 +09:00
Cutls
c77b0f5924 Merge branch 'master' into WIP-(before-CI) 2019-05-26 20:44:09 +09:00
Cutls
bb1165ecf9 Merge branch 'WIP-(before-CI)' of https://github.com/cutls/TheDesk into WIP-(before-CI) 2019-05-26 20:43:15 +09:00
Cutls
93d2e8e0d5 Update to Usamin (18.5.0) 2019-05-26 20:42:52 +09:00
Cutls
b0db765f25 Update FUNDING.yml 2019-05-25 16:43:13 +09:00
Cutls
68a3786fb8 Create FUNDING.yml 2019-05-25 14:53:51 +09:00
Cutls
9103ba6af1 Merge pull request #75 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/jimp-0.6.4
Bump jimp from 0.2.28 to 0.6.4 in /app
2019-05-25 13:22:24 +09:00
Cutls
dd8e89234c Fix TheDesk Oshirase 2019-05-22 23:39:55 +09:00
Cutls
bcb358cc8b Merge pull request #77 from kPherox/fix-hidden-timeline-scroll-bottom
Fix the hidden last of the timeline
2019-05-22 07:45:17 +09:00
kPherox
f42c59669f refs cutls#11 Fix the hidden last of the timeline
- 通知TLを一番下までスクロールしても最後の投稿の全文が見えない。(「アクションメニューを非表示」は「いいえ」にしてある)
2019-05-22 02:02:30 +09:00
dependabot[bot]
d656860b2e Bump jimp from 0.2.28 to 0.6.4 in /app
Bumps [jimp](https://github.com/oliver-moran/jimp) from 0.2.28 to 0.6.4.
- [Release notes](https://github.com/oliver-moran/jimp/releases)
- [Commits](https://github.com/oliver-moran/jimp/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-21 15:55:10 +00:00
Cutls
30744e402a Merge pull request #76 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/electron-builder-20.40.2
Bump electron-builder from 20.39.0 to 20.40.2 in /app
2019-05-22 00:53:36 +09:00
Cutls
43bac6f3e6 Add: notification filter by user (for head) 2019-05-22 00:00:54 +09:00
dependabot[bot]
dae4371a3f Bump electron-builder from 20.39.0 to 20.40.2 in /app
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 20.39.0 to 20.40.2.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v20.39.0...v20.40.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-20 20:21:58 +00:00
Cutls
990c2f796e Fix acct-select-box 2019-05-20 22:34:58 +09:00
Cutls
89c3a4f8b1 Delete some 2019-05-20 08:41:24 +09:00
Cutls
ca12884735 WIP: Introduce Electron 5.0.1 2019-05-19 19:24:27 +09:00
Cutls
07e907b599 Add: Astarte marquee BBCode 2019-05-19 18:31:47 +09:00
Cutls
e0bdd1e0b2 japanese README 2019-05-19 18:21:54 +09:00
Cutls
595b1a3c62 reverse 2019-05-19 17:57:07 +09:00
Cutls
236392299b add screenshot 2019-05-19 17:54:04 +09:00
Cutls
418b2e7668 check2 2019-05-19 17:38:46 +09:00
Cutls
052694dbde test readme 2019-05-19 17:30:15 +09:00
Cutls
d529a105c5 Merge branch 'WIP-(before-CI)' of https://github.com/cutls/TheDesk into WIP-(before-CI) 2019-05-19 17:01:18 +09:00
Cutls
40d877682b check dependa 2019-05-19 17:01:15 +09:00
Cutls
5e324f19ae Merge pull request #72 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/vue-2.6.10
Bump vue from 2.6.9 to 2.6.10 in /app
2019-05-19 17:00:45 +09:00
Cutls
9d8b9cbd04 Merge pull request #71 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/electron-dl-1.14.0
Bump electron-dl from 1.11.0 to 1.14.0 in /app
2019-05-19 17:00:35 +09:00
dependabot[bot]
54e5180732 Bump vue from 2.6.9 to 2.6.10 in /app
Bumps [vue](https://github.com/vuejs/vue) from 2.6.9 to 2.6.10.
- [Release notes](https://github.com/vuejs/vue/releases)
- [Commits](https://github.com/vuejs/vue/compare/v2.6.9...v2.6.10)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-19 08:00:07 +00:00
Cutls
dbf959782f Merge pull request #70 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/tar-4.4.8
[Security] Bump tar from 2.2.1 to 4.4.8 in /app
2019-05-19 16:58:43 +09:00
Cutls
33114ca3c8 Merge pull request #74 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/sumchecker-3.0.0
Bump sumchecker from 2.0.2 to 3.0.0 in /app
2019-05-19 16:56:54 +09:00
dependabot[bot]
4c2aebc7c1 Bump sumchecker from 2.0.2 to 3.0.0 in /app
Bumps [sumchecker](https://github.com/malept/sumchecker) from 2.0.2 to 3.0.0.
- [Release notes](https://github.com/malept/sumchecker/releases)
- [Changelog](https://github.com/malept/sumchecker/blob/master/NEWS.md)
- [Commits](https://github.com/malept/sumchecker/compare/v2.0.2...v3.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-19 07:56:12 +00:00
Cutls
b51470f999 Merge pull request #73 from cutls/dependabot/npm_and_yarn/app/WIP-(before-CI)/node-notifier-5.4.0
Bump node-notifier from 5.2.1 to 5.4.0 in /app
2019-05-19 16:54:43 +09:00
Cutls
b2be5f3706 become a patreon 2019-05-19 16:54:23 +09:00
Cutls
06eb347cf8 More prettier 2019-05-19 16:39:30 +09:00
dependabot[bot]
81c5c1d86a Bump node-notifier from 5.2.1 to 5.4.0 in /app
Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 5.2.1 to 5.4.0.
- [Release notes](https://github.com/mikaelbr/node-notifier/releases)
- [Changelog](https://github.com/mikaelbr/node-notifier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mikaelbr/node-notifier/compare/v5.2.1...v5.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-19 07:13:55 +00:00
dependabot[bot]
82858b7b92 Bump electron-dl from 1.11.0 to 1.14.0 in /app
Bumps [electron-dl](https://github.com/sindresorhus/electron-dl) from 1.11.0 to 1.14.0.
- [Release notes](https://github.com/sindresorhus/electron-dl/releases)
- [Commits](https://github.com/sindresorhus/electron-dl/compare/v1.11.0...v1.14.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-19 07:12:59 +00:00
dependabot[bot]
b3506aec3c [Security] Bump tar from 2.2.1 to 4.4.8 in /app
Bumps [tar](https://github.com/npm/node-tar) from 2.2.1 to 4.4.8. **This update includes security fixes.**
- [Release notes](https://github.com/npm/node-tar/releases)
- [Commits](https://github.com/npm/node-tar/compare/v2.2.1...v4.4.8)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-19 07:12:56 +00:00
Cutls
de6e9c6f11 Update SHA256 lib 2019-05-19 15:47:45 +09:00
Cutls
d3ff1aa17a Debug 2019-05-19 15:17:05 +09:00
Cutls
3cde6d0bff Improved: attached video on Pleroma 2019-05-16 00:17:47 +09:00
Cutls
bfade31849 Add link to unknown media 2019-05-16 00:11:09 +09:00
Cutls
3a06820f1e Fix: follow request 2019-05-16 00:01:54 +09:00
Cutls
c5f712359d Merge pull request #68 from cutls/WIP-(before-CI)
18.4.0
2019-05-11 01:36:07 +09:00
Cutls
c9cca85db3 Add features 2019-05-11 01:32:54 +09:00
Cutls
07b203b719 TheDesk Usamin (18.4.0) 2019-05-11 01:31:15 +09:00
Cutls
a636c745e4 Add: follow request auth/reject 2019-05-09 00:46:26 +09:00
Cutls
e9024312a7 Fix: some Misskey bugs about reaction 2019-05-09 00:31:05 +09:00
Cutls
edbe3c164f Add: Misskey v11 streaming method 2019-05-08 00:48:59 +09:00
Cutls
8991cb5a96 Add: NSFW notice 2019-05-07 22:43:30 +09:00
Cutls
b4aa5aead5 Merge pull request #67 from cutls/WIP-(before-CI)
TheDesk Usamin (18.3.3)
2019-05-07 00:45:08 +09:00
Cutls
873a8fd229 fix typo 2019-05-07 00:44:04 +09:00
Cutls
d0ddc58160 TheDesk Usamin (18.3.3) 2019-05-07 00:43:21 +09:00
Cutls
6eebfed609 get blurhash 2019-05-07 00:42:06 +09:00
Cutls
09b7b8633e Merge pull request #66 from cutls/WIP-(before-CI)
TheDesk Usaimin (18.3.2)
2019-05-06 19:36:08 +09:00
Cutls
c93326d218 Add notestock notice 2019-05-06 19:34:49 +09:00
Cutls
a03c5c0ecf TheDesk Usain (18.3.2) 2019-05-06 19:31:28 +09:00
Cutls
0380251294 Check vulnerability 2019-05-06 19:30:05 +09:00
Cutls
d8f857e05d TheDesk Usamin (18.3.2) 2019-05-06 19:15:54 +09:00
Cutls
7a06a2b192 Add: min_id TL 2019-05-06 19:10:03 +09:00
Cutls
771db8c3ad Notestock 2019-05-06 01:28:00 +09:00
Cutls
9a800639e6 Custom emojis' marign 2019-05-06 01:27:54 +09:00
Cutls
550c7b1805 change to cutls.com from kirishima.cloud 2019-05-03 01:08:46 +09:00
Cutls
ad7c7ffa66 Fix: flag emojis #64 2019-05-03 00:51:10 +09:00
Cutls
57978bd152 TheDesk Minami💛(announce) 2019-04-25 01:10:49 +09:00
Cutls
5cd72a538c add note 2019-04-22 23:19:34 +09:00
Cutls
d439169c63 Merge pull request #61 from kPherox/fix-integrated-tl-reconnect-streaming
Fix integrated tl reconnect streaming
2019-04-22 23:18:12 +09:00
Cutls
da39e0ded6 package 2019-04-22 23:17:46 +09:00
Cutls
823fae5eac TheDesk Usamin (18.3.1) 2019-04-22 23:16:57 +09:00
kPherox
4f3a7c47e3 Change console log level 2019-04-22 03:33:56 +09:00
kPherox
bd8d480e07 Check error count on integrated tl 2019-04-22 03:31:14 +09:00
kPherox
a09c031dbe Add type integrated to reconnector 2019-04-22 03:26:57 +09:00
kPherox
1fee94846d Fix typo 2019-04-22 02:02:23 +09:00
Cutls
4fb37525d5 Merge branch 'WIP-(before-CI)' of https://github.com/cutls/TheDesk into WIP-(before-CI) 2019-04-22 01:51:42 +09:00
Cutls
8f25557f20 wip 2019-04-22 01:51:32 +09:00
Cutls
cb47eabed9 Merge pull request #60 from kPherox/fix-poll-vote-button
Fix poll vote button
2019-04-22 01:50:29 +09:00
kPherox
f8823a4c5a Fix bug that deleting the vote button 2019-04-22 01:34:50 +09:00
kPherox
7fdd5964cc Fix lang_parse_vote for en 2019-04-22 01:00:20 +09:00
Cutls
3aadcaef0f add some notifications sound 2019-04-20 23:40:12 +09:00
Cutls
f58d4f349b TheDesk Usamin (18.3.0) 2019-04-20 00:59:31 +09:00
Cutls
9bb8ec0b66 some security update 2019-04-19 23:02:30 +09:00
Cutls
ec9a14d63b custom emojis when poll 2019-04-16 01:38:29 +09:00
Cutls
82a00f4d1e security 2019-04-16 01:29:44 +09:00
Cutls
af97f88d0a sound 2019-04-15 00:45:04 +09:00
Cutls
e27351481b Merge pull request #58 from cutls/WIP-(before-CI)
Wip (before ci)
2019-04-14 18:58:33 +09:00
Cutls
4c375e2d0a travis 2019-04-14 18:58:12 +09:00
Cutls
53cd49d4e8 travis 2019-04-14 18:55:30 +09:00
Cutls
e36942180e restart 2019-04-14 03:48:44 +09:00
Cutls
6b58c88118 travis 2019-04-14 03:46:15 +09:00
Cutls
d20777ed18 travis 2019-04-14 03:45:30 +09:00
Cutls
202e389c20 travis 2019-04-14 03:38:07 +09:00
Cutls
707a5b2033 change travis 2019-04-14 03:31:19 +09:00
Cutls
0967c93dde Merge pull request #57 from cutls/WIP-(before-CI)
Wip (before ci)
2019-04-14 03:26:44 +09:00
Cutls
b13849a427 readme 2019-04-14 03:26:19 +09:00
Cutls
d0322c7bda TheDesk Usamin (18.2.3) 2019-04-14 03:22:16 +09:00
Cutls
494a4e90d6 fix some undif 2019-04-14 03:06:59 +09:00
Cutls
d1968a2e69 Merge pull request #56 from cutls/mac
miss
2019-04-14 01:43:57 +09:00
Cutls
51e6909f77 #64 fix 2019-04-14 01:42:49 +09:00
Cutls
cec46faf19 keybase 2019-04-14 01:42:18 +09:00
Cutls
53f880ab97 Merge pull request #55 from kPherox/fix-nowplaying-for-asar-packed
Fix nowplaying for asar packed
2019-04-14 01:41:30 +09:00
kPherox
cc20b0a7c0 Replace promise to async/await 2019-04-14 01:33:00 +09:00
kPherox
efac88db4c Change to pass error on itunes-np 2019-04-14 01:32:16 +09:00
Cutls
2e1c076b5f Merge pull request #53 from kPherox/update-package
Update package
2019-04-14 00:36:19 +09:00
kPherox
5a03df6ee9 Change itunes-nowplaying-mac pull request number 2019-04-14 00:13:57 +09:00
kPherox
ade5893183 Unpack asar for itunes-nowplaying-mac 2019-04-14 00:12:35 +09:00
kPherox
8a17e737f9 Add npm scripts for build
Update README.md#buildビルド

初回のcloneするときの流れを修正してからnpm scriptsを利用するように書き換え
2019-04-14 00:09:35 +09:00
kPherox
94c1ff3731 Replace dev dependency electron-packager to electron-builder
Some package update
2019-04-13 23:34:10 +09:00
Cutls
4e5fe2fc91 proof lang 2019-04-13 12:51:54 +09:00
Cutls
f88ed31e38 Add keybase 2019-04-13 12:41:58 +09:00
Cutls
7df51c161b mac 18.2.2 2019-04-13 03:55:05 +09:00
Cutls
b5d1686c12 update package 2019-04-13 02:32:42 +09:00
Cutls
a1048b3243 to linux 2019-04-13 02:31:07 +09:00
Cutls
f9090e261d travis 2019-04-13 02:21:21 +09:00
Cutls
4029f168df readme 2019-04-13 01:55:01 +09:00
Cutls
7965e7c742 pavkage 2019-04-13 01:54:33 +09:00
Cutls
932e6731c9 readme package 2019-04-13 01:49:22 +09:00
Cutls
3c3eb5209b readme 2019-04-13 01:48:26 +09:00
Cutls
a07d6b3172 Merge pull request #52 from cutls/WIP-(before-CI)
travis
2019-04-12 23:39:54 +09:00
Cutls
253f742332 travis 2019-04-12 23:39:28 +09:00
Cutls
35e262293d Merge pull request #51 from cutls/WIP-(before-CI)
Wip (before ci)
2019-04-12 23:37:14 +09:00
Cutls
972ea9f5ed travjs 2019-04-12 23:36:16 +09:00
Cutls
0c1191e362 travis 2019-04-12 23:35:48 +09:00
Cutls
426e48325c osx 2019-04-12 23:35:22 +09:00
Cutls
6c86825732 update travis 2019-04-12 23:33:36 +09:00
Cutls
e0cae78827 Merge pull request #50 from cutls/WIP-(before-CI)
Wip (before ci)
2019-04-12 23:32:37 +09:00
Cutls
09d3643b19 travis 2019-04-12 23:32:14 +09:00
Cutls
ed93d5b4f2 ul 2019-04-12 23:30:59 +09:00
Cutls
f0d7d84f8e travis update 2019-04-12 23:29:30 +09:00
Cutls
05fab4c45c Change 2019-04-12 23:26:38 +09:00
Cutls
3059ec9941 Merge pull request #49 from cutls/WIP-(before-CI)
Wip (before ci)
2019-04-12 23:20:26 +09:00
Cutls
892872869b TheDesk Usamin (18.2.1) 2019-04-12 23:19:27 +09:00
Cutls
0db7ed4a33 TheDesk Usamin (18.2.1) 2019-04-12 23:14:38 +09:00
Cutls
54e12db08b Fix XSS 2019-04-12 23:12:57 +09:00
Cutls
6fb90f0c8e Merge pull request #48 from cutls/WIP-(before-CI)
TheDesk Usamin (18.2.0)
2019-04-11 17:13:20 +09:00
Cutls
5f3257a83b TheDesk Usamin (18.2.0) 2019-04-11 17:11:26 +09:00
Cutls
f333595817 WIP: done some ToDo 2019-04-11 12:52:38 +09:00
Cutls
cc1018c65d next ver 2019-04-11 03:11:03 +09:00
Cutls
1c16a5f4a0 WIP done some ToDO 2019-04-11 02:59:13 +09:00
Cutls
0ad7bf9036 WIP some ToDo 2019-04-11 01:52:01 +09:00
Cutls
1670c0bc08 ToDo: done: ts column/menu .active/ about 2019-04-09 23:12:11 +09:00
Cutls
f1c4276d06 Add list on misskey 2019-04-08 00:14:06 +09:00
Cutls
50bfbbd755 Merge pull request #47 from kPherox/fix-reopen-macos
Fix cannot reopen in macOS
2019-04-05 21:48:24 +09:00
kPherox
f5afafe26a Remove all listener when closed main window 2019-04-05 20:43:37 +09:00
kPherox
c524777505 Fix cannot repoen in macOS 2019-04-05 19:55:13 +09:00
Cutls
8155baa07d fix about window 2019-04-04 01:09:57 +09:00
Cutls
32c56dcf6a Fix link to quesdon 2019-04-04 01:07:07 +09:00
Cutls
9e982dca37 Merge pull request #46 from cutls/WIP-(before-CI)
TheDesk Usamin (18.1.2) Released
2019-04-03 13:14:40 +09:00
Cutls
6f25ece72d TheDesk Usamin (18.1.2) Released 2019-04-03 12:59:29 +09:00
Cutls
b28023bec2 Merge pull request #45 from cutls/WIP-(before-CI)
TheDesk Usamin (18.1.2)
2019-04-02 23:51:17 +09:00
Cutls
0df8baa7bf TheDesk Usamin (18.1.2) Plus 2019-04-02 23:42:25 +09:00
Cutls
14c647ca46 Merge pull request #43 from kPherox/patch-1
Fix TweetDeck height
2019-03-29 19:34:46 +09:00
kPherox
f2ff82c810 Fix TweetDeck height 2019-03-29 18:10:15 +09:00
Cutls
2ce9f55f28 edit margin 2019-03-29 02:37:20 +09:00
Cutls
4c3c1ac56e Merge branch 'WIP-(before-CI)' of https://github.com/cutls/TheDesk into WIP-(before-CI) 2019-03-29 02:12:37 +09:00
Cutls
4aa14a14a2 TheDesk Usain (18.1.2) 2019-03-29 02:12:25 +09:00
Cutls
a398fae023 Merge pull request #42 from kPherox/fix-paste-image
Change the method to chack clipboardData type
2019-03-23 17:32:23 +09:00
kPherox
100bd648a9 Fix paste image when image copied from web browser 2019-03-23 05:51:22 +09:00
Cutls
348c5c31c0 Merge pull request #41 from cutls/WIP-(before-CI)
TheDesk Usamin (18.1.1)
2019-03-22 23:11:18 +09:00
Cutls
7556e5560d TheDesk Usamin (18.1.1) 2019-03-22 23:10:23 +09:00
Cutls
931afc3dd2 Merge pull request #40 from kPherox/fix-duplicate-integrated-tl
Fix duplicate fetch in Integrated TL
2019-03-22 14:47:44 +09:00
kPherox
b25244aa9a Fix duplicate websocket connection 2019-03-22 02:59:04 +09:00
kPherox
abe3a2ccb6 Fix duplicate more loading 2019-03-22 02:58:26 +09:00
Cutls
f7a80da21b Uncrop setting 2019-03-21 23:38:15 +09:00
Cutls
e11f0293fe Merge pull request #39 from kPherox/ignore-update-for-brewcask
Homebrew Caskでインストールした時にアップデート通知を無視できるようにする
2019-03-21 22:14:07 +09:00
Cutls
5ec617a778 Merge pull request #38 from kPherox/dont-fire-itunes-event
'itunes-np' リスナが残っているときにnowplayingのイベントを無視する
2019-03-21 22:13:56 +09:00
kPherox
eb86966d33 Ignore update for homebrew cask 2019-03-21 17:01:55 +09:00
kPherox
e44014a1a9 Don't fire 'itunes' event when 'itunes-np' listener is present
Remove `uploadnow` variable as it is no longer needed
2019-03-21 16:01:36 +09:00
Cutls
c38cc6fd5a Merge pull request #37 from cutls/WIP-(before-CI)
package to travis
2019-03-21 14:59:54 +09:00
Cutls
cdc6840808 package to travis 2019-03-21 14:58:33 +09:00
Cutls
abba6fcaa9 Merge pull request #36 from cutls/WIP-(before-CI)
TheDesk Usamin (18.1.0)
2019-03-21 14:24:49 +09:00
Cutls
293a373632 electron some fix 2019-03-21 14:23:10 +09:00
Cutls
5b3dd86a5e Webview some fixed 2019-03-21 14:21:02 +09:00
cutls
d2719cec41 Toot when nowplaying without artworks 2019-03-20 21:45:34 -07:00
Cutls
153f1aacee check something 2019-03-21 13:39:30 +09:00
Cutls
5d0b5e9c94 Fix(lock when posting artwork) 2019-03-21 05:49:59 +09:00
Cutls
a6cb385375 THeDesk Usamin (18.1.0) 2019-03-21 04:43:01 +09:00
Cutls
ba074dd1b0 Column(Stack/Dock) 2019-03-21 04:42:47 +09:00
Cutls
22d54ab2ab Merge pull request #35 from kPherox/fix-itunes-np-template
Fix NowPlaying template for macOS
2019-03-21 02:36:07 +09:00
Cutls
0dfe864f12 Merge pull request #34 from kPherox/fix-duplicate-listener
Fix duplicate listener for iTunes NowPlaying
2019-03-21 02:35:52 +09:00
Cutls
32a16eb2a4 iTunes templete 2019-03-21 02:26:42 +09:00
kPherox
f35056a916 Fix duplicate "itunes-np" listener 2019-03-20 22:58:38 +09:00
kPherox
6e9b0b4d10 Fix template {hz} 2019-03-20 22:57:59 +09:00
Cutls
216191563e readme update 2019-03-20 20:11:03 +09:00
Cutls
cf827e7c25 some fix 2019-03-20 20:08:33 +09:00
cutls
e36379de44 Nowplaying on macOS with an album artwork 2019-03-20 04:02:59 -07:00
Cutls
25662e8736 prepare for itunes-nowplaying artworks 2019-03-20 15:29:13 +09:00
Cutls
e16c9fba43 compare for itunes-artworks 2019-03-20 13:50:00 +09:00
Cutls
7037f63b44 Merge pull request #33 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.3)
2019-03-19 00:26:46 +09:00
Cutls
f9e3b4129b vis bug/setting bug 2019-03-19 00:24:46 +09:00
Cutls
f0c89a291e Merge pull request #32 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.3)
2019-03-18 23:29:51 +09:00
Cutls
abee0bb901 TheDesk Usamin (18.0.3) 2019-03-18 23:14:30 +09:00
Cutls
ef5dbcf040 fix some bugs 2019-03-18 23:01:45 +09:00
Cutls
bacac4486b DM TL improved 2019-03-16 19:06:03 +09:00
Cutls
8d4670d8d9 PR 2019-03-16 14:08:38 +09:00
Cutls
b2e10feba8 Merge pull request #31 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.2)
2019-03-16 14:05:46 +09:00
Cutls
c245f2c5e6 TheDesk Usamin (18.0.2) 2019-03-16 14:05:04 +09:00
Cutls
63821f2c45 reverse some menu items 2019-03-16 03:13:42 +09:00
Cutls
a058659778 Fix reload 2019-03-16 03:10:46 +09:00
Cutls
8c27c43c13 Merge pull request #30 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.1)
2019-03-16 02:19:22 +09:00
Cutls
da5549d1f0 FIx 2019-03-16 02:17:30 +09:00
Cutls
487a8e7a1b Merge pull request #29 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.1)
2019-03-16 02:00:06 +09:00
Cutls
9e7788cd62 TheDesk Usamin (18.0.1) 2019-03-16 01:59:29 +09:00
Cutls
ccb652dcf0 Merge pull request #28 from cutls/WIP-(before-CI)
TheDesk Usamin (18.0.0)
2019-03-16 00:45:16 +09:00
Cutls
db673357f1 TheDesk Usamin (18.0.0) 2019-03-16 00:44:18 +09:00
Cutls
f84948b6c3 Add column btns 2019-03-16 00:40:20 +09:00
Cutls
fdc6ec906c 途中でプルリクを処理するためコミット 2019-03-16 00:29:54 +09:00
Cutls
fd83ceef92 Merge pull request #27 from Winding6636/patch-1
カスタムテーマバグ修正
2019-03-16 00:29:14 +09:00
Winding
deab6fd869 カスタムテーマバグ修正
カスタムテーマ適用時に、ユーザーページ(?)のスタイルが崩れているのを確認し修正しました。
2019-03-16 00:16:21 +09:00
Cutls
677f167c8e Vue dev-mode turn off 2019-03-15 20:13:51 +09:00
Cutls
21d8c52829 Vue introduces 2019-03-15 20:12:11 +09:00
Cutls
1c22572048 Merge pull request #26 from cutls/WIP-(before-CI)
TheDesk Miria (17.3.0)
2019-03-15 04:49:22 +09:00
Cutls
d6012ea128 Add "menu" and remove bottom-bar's 8 icons 2019-03-15 04:48:01 +09:00
Cutls
2856aec405 Titlebar(test) 2019-03-13 00:51:07 +09:00
Cutls
28e39cdd3d To fix hidden followers 2019-03-10 14:32:44 +09:00
Cutls
bc8958ac6a Filter languge construction 2019-03-10 13:37:27 +09:00
Cutls
083cb6e619 To fix position of toot box 2019-03-10 00:03:02 +09:00
Cutls
ba018b8568 To set disabled HardwareAcceleration #25 2019-03-09 21:17:54 +09:00
Cutls
1361958e8d Alt+Enter to secondary toot 2019-03-09 20:17:08 +09:00
Cutls
6c69954ec4 #23 Fix: Snap updator bug 2019-03-09 11:24:07 +09:00
Cutls
978d3964d2 Fix Snapcraft(snapd) update notice dialog bug #23 2019-03-09 11:21:21 +09:00
Cutls
dd55236e84 Merge pull request #24 from cutls/WIP-(before-CI)
TheDesk Miria (17.2.0)
2019-03-09 10:16:24 +09:00
Cutls
dd59de1172 Merge branch 'master' into WIP-(before-CI) 2019-03-09 10:16:04 +09:00
Cutls
9e21979839 package-lock.json rebuild 2019-03-09 09:51:26 +09:00
Cutls
8589577995 Improve Misskey login method 2019-03-08 17:14:47 +09:00
Cutls
2216777710 fix bug:themes 2019-03-08 05:18:49 +09:00
Cutls
7950042eb6 add theme and fix for macOS 2019-03-08 03:19:26 +09:00
Cutls
b4674c8b09 language 2019-03-07 12:21:27 +09:00
Cutls
91f9fa6591 final 2019-03-07 01:30:58 +09:00
Cutls
f0869f3086 Merge pull request #22 from cutls/WIP-(before-CI)
config, package to build
2019-03-07 01:15:09 +09:00
Cutls
ae2f30a342 fix: travis/package 2019-03-07 01:14:05 +09:00
Cutls
d8362add72 package.json WIP 2019-03-07 00:55:54 +09:00
Cutls
5b699c1775 TheDesk Miria (17.1.1) 2019-03-07 00:48:18 +09:00
Cutls
412791975c Merge pull request #21 from cutls/WIP-(before-CI)
THeDesk Miria (17.1.0) complete
2019-03-06 21:24:29 +09:00
Cutls
dd2a7b4228 to build 2019-03-06 21:01:36 +09:00
Cutls
30805a2263 Merge branch 'master' of https://github.com/cutls/TheDesk 2019-03-06 21:00:25 +09:00
Cutls
2dcf702d54 fix to master 2019-03-06 21:00:01 +09:00
Cutls
381e661484 THeDesk Miria (17.1.0) complete 2019-03-06 20:56:39 +09:00
Cutls
b6f2feb147 Merge pull request #20 from cutls/WIP-(before-CI)
travis CI and vote for 2.8
2019-03-06 17:18:55 +09:00
Cutls
f45fa97e95 travis CI 2019-03-06 17:17:25 +09:00
Cutls
86d99f40a5 vote(Mastodon 2.8) 2019-03-06 17:08:48 +09:00
Cutls
d5f3354e71 絵文字ボックスが閉じない不具合 #19 2019-03-04 14:49:25 +09:00
Cutls
5134dd274b TheDesk Miria (17.0.2) 2019-02-28 02:02:23 +09:00
Cutls
560494467b TheDesk Miria (17.0.1) 2019-02-27 10:58:29 +09:00
Cutls
75a397aafd TheDesk Miria (17.0.1) 2019-02-27 10:17:35 +09:00
Cutls
4d5916b595 TheDesk Miria (17.0.1) 2019-02-27 01:51:37 +09:00
cutls
3c00ff5695 TheDesk Miria (17.0.1) beta4 2019-02-05 11:33:32 +09:00
cutls
6513fc0e3e last mistake clear 2019-02-01 02:12:43 +09:00
cutls
b16ef4576f mistake clear 2019-02-01 01:53:40 +09:00
cutls
67a7b1e08e mistakes 2019-02-01 01:37:36 +09:00
cutls
092f3bd7d7 travis mac test 2019-02-01 01:33:46 +09:00
cutls
810a08c8e7 TheDesk Miria (17.0.1)-beta3 2019-02-01 01:30:25 +09:00
cutls
456500e954 TheDesk Miria (17.0.1)-beta2 2019-01-29 10:49:14 +09:00
Cutls
e3470ae0f2 electron-builder error
electron must be in devDependencies, not in dependencies.
2019-01-29 01:06:24 +09:00
Cutls
7da4cd53d2 Merge pull request #13 from kaias1jp/nowplaying-node-linux-disabled
Nowplaying node linux disabled
2019-01-29 00:56:05 +09:00
kaias1jp
1f1a429e35 Delete TheDeskBuild.sh 2019-01-28 21:45:49 +09:00
kaias1jp
1efa656529 modified: main.js
modified:   package.json
2019-01-28 21:37:59 +09:00
popn.ja
52cb240be3 modified: TheDeskBuild.sh 2019-01-28 20:32:21 +09:00
kaias1jp
6411fc9fb1 modified: TheDeskBuild.sh 2019-01-28 18:56:36 +09:00
kaias1jp
48da2cf287 new file: TheDeskBuild.sh 2019-01-28 18:44:50 +09:00
kaias1jp
8968c248df modified: main.js
modified:   package.json
2019-01-28 18:39:16 +09:00
cutls
27721fa481 check 2019-01-28 09:45:32 +09:00
Cutls
ee618155ac file cng 2019-01-28 09:22:17 +09:00
Cutls
f6e8f04b2a Update .travis.yml 2019-01-28 09:00:41 +09:00
cutls
c6e99b2b47 tetst release 2019-01-28 03:31:10 +09:00
cutls
c6701a4d59 finish to absolute 2019-01-28 03:28:25 +09:00
cutls
693993e899 typo 2019-01-28 02:59:27 +09:00
cutls
314ec5ab4d pray for last commit 2019-01-28 02:57:13 +09:00
cutls
d344a7fc47 git bash 2019-01-28 02:41:58 +09:00
cutls
28f2e9302a git bash 2019-01-28 02:40:15 +09:00
cutls
697d942180 rename to mobe 2019-01-28 01:54:20 +09:00
cutls
6412139ae4 back-escape deleted 2019-01-28 01:08:10 +09:00
cutls
add018263e abs path 2019-01-28 00:53:38 +09:00
cutls
baaa3e2527 last update I do 2019-01-28 00:33:28 +09:00
cutls
79276bf698 replacer 2019-01-28 00:20:33 +09:00
cutls
3953f560e4 some bugs for WBT 2019-01-28 00:11:53 +09:00
cutls
75d6a558ad for windows 2019-01-27 23:53:33 +09:00
cutls
230dd30294 wine required 2019-01-27 23:21:35 +09:00
cutls
e49c803f89 mistake 2 2019-01-27 23:09:24 +09:00
cutls
80577639d7 mistake 2019-01-27 22:58:53 +09:00
cutls
b85ac213da plus dependencies 2019-01-27 22:48:23 +09:00
cutls
a8f446a1bd delete np-node 2019-01-27 22:36:17 +09:00
cutls
b7ec01aa1f travis set up file 2019-01-27 22:19:31 +09:00
cutls
6cc765a6f1 travis master update 2019-01-27 22:07:51 +09:00
cutls
54a39151d1 travis update 2019-01-27 21:32:35 +09:00
cutls
37a1b7e52d travis update 2019-01-27 21:22:58 +09:00
cutls
54231cde73 traviss update 2019-01-27 21:17:40 +09:00
cutls
57f7a92063 travis update 2019-01-27 21:09:30 +09:00
cutls
61c67457ac travis 2019-01-27 21:07:11 +09:00
cutls
c05e13858b Merge branch 'master' of https://github.com/cutls/TheDesk 2019-01-27 19:49:33 +09:00
cutls
caa8d97a23 update versions 2019-01-27 19:49:17 +09:00
cutls
7921633efd Local NowPlaying for Windows 2019-01-26 23:27:35 +09:00
cutls
77ad2bd200 Some additional info & improve format 2019-01-26 23:26:56 +09:00
cutls
fa3b3e0800 New language style for worldwide 2019-01-26 12:24:26 +09:00
cutls
e1fb172f5b New electron-builder files 2019-01-26 12:24:08 +09:00
cutls
ccb0cb6db4 Excluded type of Notifications 2019-01-26 12:23:53 +09:00
Cutls
44e507dc90 Build command(npm) 2019-01-25 11:41:48 +09:00
Cutls
c59267bf6e Update package.json 2019-01-24 01:04:21 +09:00
Cutls
da0d9bbb51 Update README.md 2019-01-24 00:59:21 +09:00
Cutls
c6d9d7aa49 typo 2019-01-23 22:39:21 +09:00
Cutls
a08b7501ce macOS icons(electron-builder) 2019-01-23 22:20:14 +09:00
Cutls
5950fa5bbd Create README.md 2019-01-23 22:19:34 +09:00
Cutls
ed326cb264 Update package.json 2019-01-23 18:03:11 +09:00
Cutls
4a984af695 electron-builder 2019-01-23 17:58:31 +09:00
Cutls
d36a9215af Update README.md 2019-01-23 13:48:11 +09:00
Cutls
e145efb1a2 Update index.html 2019-01-23 13:31:21 +09:00
Cutls
c434ed903d Update index.html 2019-01-23 13:31:02 +09:00
Cutls
fa546df375 Update snapcraft.yaml 2019-01-23 13:24:44 +09:00
Cutls
cbe0cb171b Update snapcraft.yaml 2019-01-23 13:22:21 +09:00
Cutls
70f76d61f4 typo
from crowdin issue
2019-01-23 11:08:00 +09:00
cutls
0d0a9c43ad TheDesk Miria (17.0.1) 2019-01-22 01:26:22 +09:00
cutls
f762dd600c Alert when posting unlisted, private, direct toot with tags 2019-01-22 01:26:11 +09:00
cutls
f3186373bf Scheduled toot available 2019-01-22 01:25:40 +09:00
cutls
4f82cf00d6 fix some bugs(icon) 2019-01-22 01:24:37 +09:00
cutls
ec2fb97a68 Change from Instance to Server 2019-01-22 01:24:15 +09:00
cutls
2c85cee77a Update README.md 2019-01-13 11:05:41 +09:00
cutls
c6ad258c1c Merge branch 'master' of https://github.com/cutls/TheDesk 2019-01-13 11:03:10 +09:00
cutls
4c0735b2ed CSS Fixed 2019-01-13 11:02:52 +09:00
Cutls
cdaca5c9f7 Update 2018-12-16 23:04:00 +09:00
Cutls
0175038e77 How to install 2018-12-16 23:01:25 +09:00
Cutls
205e1d3332 TOS, priv, Build 2018-12-16 16:17:52 +09:00
Cutls
66d97388f5 Delete TOS 2018-12-16 16:12:33 +09:00
cutls
c60572b132 Merge branch 'master' of https://github.com/cutls/TheDesk 2018-12-09 03:46:22 +09:00
cutls
bc197db0d5 TheDesk Miria (17.0.0) 2018-12-09 03:46:01 +09:00
Cutls
a93c488aa5 Update README.md 2018-11-28 01:21:52 +09:00
Cutls
a2d0268d39 LICENSE Updated 2018-11-28 01:21:23 +09:00
cutls
8bb27aa8d5 Merge branch 'master' of https://github.com/cutls/TheDesk 2018-09-27 00:25:59 +09:00
cutls
0c7cf6f776 TheDesk Akane (16.1.6) 2018-09-27 00:25:35 +09:00
Cutls
abd2a39204 Create LICENSE.md 2018-09-21 15:54:12 +09:00
cutls
1c476fe9b1 TheDesk Akane (16.1.5) 2018-09-20 00:10:53 +09:00
cutls
eb57d7f58d TheDesk Akane (16.1.3) 2018-09-19 01:41:48 +09:00
Cutls
3be7b06010 Update TOS.md 2018-09-18 00:16:17 +09:00
cutls
c3133e5544 package.json 2018-09-18 00:03:48 +09:00
cutls
80c6af04cc ToS 2018-09-18 00:02:32 +09:00
Cutls
7794cb75e1 Merge pull request #7 from cutls/add-license-1
Create LICENSE.md
2018-09-17 23:38:36 +09:00
Cutls
f51f18d1ad Create LICENSE.md 2018-09-17 23:38:04 +09:00
Cutls
01232153cd Delte LICENSE.md 2018-09-17 23:36:21 +09:00
cutls
cc258230f8 TheDesk LICENSE modifying: phase:1 2018-09-17 23:35:42 +09:00
cutls
f87ece1535 TheDesk Akane (16.1.3) 2018-09-17 20:55:00 +09:00
cutls
1b96b42356 tag bag/link to acct on users data. 2018-09-14 01:40:51 +09:00
cutls
9e05a1443a Merge branch 'master' of https://github.com/cutls/TheDesk 2018-09-14 01:26:03 +09:00
cutls
5ef3305ef2 Emojis increasing 2018-09-14 01:25:43 +09:00
Cutls
9931225e9d Crowdin link added. 2018-09-12 03:08:25 +09:00
cutls
07ad76f125 TheDesk AKane (16.1.2) 2018-09-12 02:53:21 +09:00
cutls
0f860f1814 TheDesk Akane (16.1.2) 2018-09-12 02:40:29 +09:00
cutls
e57264ae7e about window 2018-09-12 02:39:02 +09:00
cutls
2f8b11b0b2 TheDesk Akane (16.1.1) 2018-09-12 01:49:41 +09:00
cutls
9ce718fbf0 remove 2018-09-11 04:46:26 +09:00
cutls
f2db5cab20 remove 2018-09-11 04:45:45 +09:00
cutls
f381d71239 TheDesk Akane (16.1.0) 2018-09-11 03:59:44 +09:00
cutls
75fb2e202a Webview for Twitter😵 2018-09-10 02:06:00 +09:00
cutls
0fa27bad73 Winstore common 2018-09-06 01:53:12 +09:00
cutls
c3b787cb39 Misskey breaking change 2018-09-06 01:47:27 +09:00
cutls
335440560a Profile page updated(Endorse/Design) 2018-09-05 00:04:56 +09:00
cutls
25b385b77c Prepare: use officail API instead of instances.social 2018-09-01 22:02:15 +09:00
cutls
0ef0c80ac8 Trend tag on Astarte was set disabled. 2018-09-01 21:39:33 +09:00
cutls
cf587c76e6 TheDesk Akane (16.0.11) 2018-08-29 19:17:34 +09:00
cutls
8439aa3e05 TheDesk Akane (16.0.10) 2018-08-24 00:15:57 +09:00
cutls
8ed7796556 TheDesk Akane (16.0.9) 2018-08-23 02:29:39 +09:00
cutls
406f65b17f To fix many bygs 2018-08-21 03:26:14 +09:00
cutls
5dbafe5dc7 README.md 2018-08-17 02:26:06 +09:00
cutls
c5151f6db0 TheDesk Akane (16.0.8) 2018-08-17 02:21:40 +09:00
cutls
621a1f3797 TheDesk Akane (16.0.6) macOS 2018-08-11 07:13:26 +09:00
cutls
2fc7b6b183 TheDesk Akane (16.0.6)macOS 2018-08-11 07:12:41 +09:00
cutls
c18af0042d TheDesk Akane (16.0.5) 2018-08-11 00:58:00 +09:00
cutls
d0061c5a95 TheDesk Akane (16.0.5) beta 2018-08-10 11:35:21 +09:00
cutls
edd712b6ba TheDesk Akane (16.0.4) 2018-08-10 00:18:35 +09:00
cutls
1ac79f21ae Fav ct had had bugs yet. and fix some bugs...(TheDesk Akane (16.0.3)) 2018-08-07 00:14:55 +09:00
cutls
b29da449f0 TheDesk Akane (16.0.3) 2018-08-06 10:15:57 +09:00
cutls
c21cacf180 TheDesk Akane (16.0.3) !unsolved!:av/BT countor bugs 2018-08-06 01:24:17 +09:00
cutls
131c4ae35e TheDesk Akane (16.0.2) 2018-08-05 14:16:12 +09:00
cutls
b71a8eab26 TheDesk Akane (16.0.2) - Mod1 2018-08-05 13:35:48 +09:00
cutls
7ab860c34c TheDesk Akane (16.0.2) 2018-08-05 12:36:23 +09:00
cutls
a2a937e220 TheDesk Akane (16.0.1) 2018-08-05 01:26:34 +09:00
cutls
b3ff01188c Delete some files 2018-07-30 21:39:05 +09:00
cutls
57e736b253 TheDesk LICENSE v5.1 2018-07-30 20:26:06 +09:00
cutls
7ab23339ef TheDesk Akane (16.0.0) -m1 2018-07-30 20:06:39 +09:00
cutls
dd81771ccf TheDesk Akane (16.0.0) 2018-07-30 20:03:49 +09:00
cutls
96995066ac TheDesk Akane (16.0.0) - phase:2[final] 2018-07-30 02:35:29 +09:00
cutls
7178c2d6c5 TheDesk Akane (16.0.0) - phase:2.1 2018-07-29 18:43:08 +09:00
cutls
f6f3525bc8 README.md ELectron ver 2018-07-29 16:46:43 +09:00
cutls
1020106382 TheDesk Akane (16.0.0) - phase2 2018-07-29 16:44:03 +09:00
cutls
5a920d63fd TheDesk Akane (16.0.0) -phase 2 2018-07-29 16:37:54 +09:00
cutls
7f64bd6d2a TheDesk Akane beta-phase:1 2018-07-28 06:25:12 +09:00
cutls
5473c22fe5 TheDesk LICENSE v5 2018-07-22 22:22:54 +09:00
cutls
62b52e4ffa TheDesk LICENSE v5 2018-07-22 22:21:53 +09:00
cutls
7ba4b3d442 TheDesk LICENSE v5 2018-07-22 22:20:46 +09:00
cutls
5844e81277 TheDesk Mio (15.10.1) - LATEST.md 2018-07-22 22:06:28 +09:00
cutls
48c184699a TheDesk Mio (15.10.0) 2018-07-22 22:03:46 +09:00
cutls
7dfbd6e2e4 TheDesk Mio (15.9.1) - 1 2018-07-19 01:24:16 +09:00
cutls
29f3d3af58 TheDesk Mio (15.9.1) 2018-07-19 01:05:53 +09:00
cutls
f1fd3f0197 TheDesk Mio (15.9.0) - index.html 2018-07-17 01:00:58 +09:00
cutls
faa8b70aff TheDesk Mio (15.9.0) 2018-07-17 00:39:06 +09:00
cutls
49a45f2ecf Unshown top of ssrc-box update(For 15.8.1) 2018-07-11 01:36:56 +09:00
cutls
d0af57b69d Modify some bugs...(for 15.8.1) 2018-07-08 10:47:11 +09:00
Cutls
1cfe24ba94 Merge pull request #5 from hakaba-hitoyo/patch-1
ユーザーマッチングを呼ぶとき、自分自身、フォロー済み、ブラックリスト、ボットを除く。
2018-07-07 21:22:16 +09:00
Hakaba Hitoyo
760522312d ユーザーマッチングを呼ぶとき、自分自身、フォロー済み、ブラックリスト、ボットを除く。 2018-07-07 20:14:15 +09:00
cutls
aad1ae656e README(15.8.0) 2018-07-07 04:22:26 +09:00
cutls
ea4e17920c TheDesk Mio (15.8.0) 2018-07-07 02:51:48 +09:00
cutls
5c39443d92 Update for big supprise! 2018-07-05 10:26:07 +09:00
Cutls P
ca3aff674d TheDesk Mio (15.7.0) macOS main.js 2018-06-18 00:07:16 +09:00
Cutls P
16649e6913 TheDesk Mio (15.7.0 macOS) 2018-06-17 23:48:33 +09:00
cutls
f42f6e2572 TheDesk Mio (15.7.0) 2018-06-17 23:26:45 +09:00
Cutls P
a8e0133edb TheDesk Mio (15.6.0) macOS 2018-06-12 01:41:11 +09:00
cutls
cc95b26cdb TheDesk Mio (15.6.0) 2018-06-12 00:44:28 +09:00
cutls
f4ec593e26 ver.json for v5 2018-05-26 22:03:35 +09:00
a a
e47a952f0e TheDesk Mio (ver.5) 2018-05-26 21:48:13 +09:00
a a
d5f7153464 TheDesk Mio (ver.4) mac modify 2018-05-26 04:00:04 +09:00
cutls
d4de0a6ca8 TheDesk Mio (ver.4) 2018-05-26 03:21:56 +09:00
cutls
97e4d16642 TheDesk Mio (ver.4) 2018-05-26 01:37:35 +09:00
cutls
03485425be pac.json 2018-05-20 16:15:35 +09:00
a a
103f0853bb TheDesk Mio (ver.3) - 1 2018-05-20 16:04:30 +09:00
cutls
de8f063aea TheDesk Mio (ver.3) 2018-05-20 15:17:10 +09:00
cutls
a379617427 TheDesk Mio (ver.2) 2018-05-12 03:12:25 +09:00
cutls
f19d95a2a6 TheDesk Mio (ver.1[fixed]) 2018-05-10 01:01:06 +09:00
cutls
3fa604533a TheDesk Mio (ver.1) 2018-05-10 00:41:32 +09:00
cutls
c20b14b708 TheDesk Mio (ver.1 beta2) 2018-05-10 00:33:08 +09:00
1472 changed files with 53155 additions and 209467 deletions

8
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: cutls
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: https://www.pixiv.net/fanbox/creator/28105985

View File

@@ -0,0 +1,27 @@
---
name: Bug report English
about: Create a report to help us improve
title: ''
labels: "\U0001F41Bbug"
assignees: ''
---
Describe the bug: a clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Click on '....'
2. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Environment**
- OS: [e.g. macOS High Sierra , Windows 10 Pro 1903, Ubuntu 19.04]
- Version: [e.g. Usamin (18.0.0)]
Check at 'Application,' 'About TheDesk' at top of the window.
- Your instance: [e.g. mastodon.social]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,27 @@
---
name: Bug report Japanese(日本語のバグ報告)
about: 迅速なバグ撲滅のために
title: ''
labels: "\U0001F41Bbug"
assignees: ''
---
バグの簡単な説明を最初に入れます。
**再現方法**
このようにするとバグが発生しました。
1. '....'をクリックすると
2. エラーが出ます
**本来の挙動**
本来どのように動くのが望ましいかを記入
**環境**
- OS: [例 macOS High Sierra , Windows 10 Pro 1903, Ubuntu 19.04]
- バージョン: [例 Usamin (18.0.0)]
TheDesk画面上部の「アプリケーション」から「TheDeskについて」で確認
- インスタンス: [例. mastodon.social]
**追記**
追記

22
.gitignore vendored
View File

@@ -1,4 +1,24 @@
*.bat
*.zip
*.7z
TheDesk-*
*.exe
TheDesk-*
build/*
app/.DS_Store
.DS_Store
.vs/*
.vscode/*
enq.md
app/.tkn
app/node_modules
app/js/login/tkn.js
app/view/en
app/view/ja
app/view/de
app/view/bg
app/view/cs
app/view/ps
app/view/es-AR
app/git
*.code-workspace
releasenote.md

53
.travis.yml Normal file
View File

@@ -0,0 +1,53 @@
os:
- windows
- linux
- osx
language: node_js
env:
- YARN_GPG=no
node_js:
- '10.15.2'
cache:
yarn: true
script: node -v
before_deploy:
- yarn global add electron-builder
- cd app
- VERSION=$(cat package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed 's/[version:,\",]//g' | tr -d '[[:space:]]')
- yarn install --no-lockfile --prod
- yarn construct
- if [ "$TRAVIS_OS_NAME" = "osx" ];then electron-builder --mac -p never;else :;fi
- if [ "$TRAVIS_OS_NAME" = "linux" ];then electron-builder --linux --x64 -p never;else :;fi
- if [ "$TRAVIS_OS_NAME" = "linux" ];then cd ../build;else :;fi
- if [ "$TRAVIS_OS_NAME" = "linux" ];then ls;else :;fi
- if [ "$TRAVIS_OS_NAME" = "linux" ];then mv thedesk-*.zip thedesk.zip;else :;fi
- if [ "$TRAVIS_OS_NAME" = "linux" ];then cd ../app;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then yarn add electron-builder;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then electron-builder --win --ia32 -p never;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then cd ../build;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then ls;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then mv TheDesk-setup.exe TheDesk-setup-ia32.exe;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then mv *$VERSION.exe TheDesk-ia32.exe;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then cd ../app;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then electron-builder --win --x64 -p never;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then cd ../build;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then ls;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then mv ../build/TheDesk-setup.exe ../build/TheDesk-setup.exe;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then mv ../build/*$VERSION.exe ../build/TheDesk.exe;else :;fi
- if [ "$TRAVIS_OS_NAME" = "windows" ];then cd ../app;else :;fi
- cd ../
- ls build
deploy:
provider: releases
# GitHub にリリースするための API KEY を暗号化した値
api_key:
secure: jndR02p5KRTtcJk18b3YsXL2cC+yzEf1AOqXdpWciF8f3lO5oY01jlxd17xdHIcK7VywSsLVZpLToSdqAoIEhJ5OxEQ/FmA3FlmbwwD6ou13gLa4VGIvsBHveCmKGjVu0Z++atIy76tZYU1SOWFWv4B0ZhnVz2ca2VZynvLgw3YNsPJH7rHO966GXgRkGYJAJ4UvLg3sj/iztVh2FSfbUj5IGO1e/JHJO63wAo1MSQtRjkutVgl/djnBLC6vbL4YHkM3Ynpkx/YQEcxwrmeY0Ra8D5yYDq4MNIDMmZahWC+k4u2eA2Cj2ifBFNxbZvTN75vLwRBp6DsTNHsiqkXrSPDBdNeet31RbwTQ6LtsK8jqmL4S/59dmLcj7uCU2WxyBLPbJdbdZWlqW2ZQvfQY8QVAYy7S3MiHQWQN0oP5wqXk89jcgR42ig/zsqFNPpXHM4mExR7l/gDLPg0j9c3XEF6sWtk3FmJN1i4+B+9kn09b6UKlV7EFPKp8XcFNrz4ZcE9/I8lKwsqLVG2jAXIk7Z9LwDRcAmK5eG348X5zwFtOY6raKIvRw2cn92bPnEI+55v8A4WANS2647GFTgxHj30D0d/sOZmJ5BS34zpdWTgE0AlKg7sOqkncjqoW5J5zCh5Ow7b3KXvEvlAts44mAag8tZTectxMP4iguXvTnv4=
# Releases ページにアップロードするファイル
file_glob: true
file:
- build/*
skip_cleanup: true
on:
repo: cutls/TheDesk
tags: true
all_branches: true

View File

@@ -1,2 +0,0 @@
{
}

View File

@@ -1,17 +1,22 @@
## For Astarte(kirishima.cloud), My Primary Instance
TheDesk :thedesk: Mizuki (ver.7)
【重要】
このアップデートは必ず適用して下さい。
理由:インスタンスにログインできない、トゥートができない等の問題を修正しています。
TheDesk :thedesk: Akane (16.1.0)
・不具合修正(マウスオーバー,クリックに関する)
・2.5.0に対する対応(リプ数やendorseなど)
・軽量化を図った
・一つのカラムをTwitter(TweetDeck)にできる機能
・画像の保存先を変えられるように
・インスタンス情報の拡充
・デザイン変更
・トゥートバーを左端に持ってこれるように
・Windowsのネイティブ通知が復活
ほか
https://thedesk.top
:github: https://github.com/cutls/TheDesk #Desk #DeskUpdate
## For Other Instances
PCクライアントTheDesk :thedesk: Mizuki (ver.7)
【重要】このトゥートは重要な事項を含むため他のインスタンスでもトゥートされます。
このアップデートは必ず適用して下さい。
理由:インスタンスにログインできない、トゥートができない等の問題を修正しています。
TheDeskはマルチカラムマルチアカウントはもちろんのことなにかとマストドンライフをシンプルに効率化するクライアントです。
TheDesk :thedesk: Akane (16.0.1)
https://thedesk.top

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@@ -1,78 +1,8 @@
# TheDesk LICENSE v3
# プライバシーポリシー
(C)TheDesk 2018 all rights reserved. Website:[https://thedesk.top](https://thedesk.top)
* TheDeskは「開発者からのお知らせ」配信のためにサーバー(thedesk.top)に常時アクセスしています。
* 上記の接続によるユーザーの情報提供はありません。(IPアドレス等を含む)
* thedesk.topのページにおいては、Googleアナリティクスによる解析を採用しています。
* 配信についてAmazon Web Service CloudFrontを使用しています。CloudFrontにはアクセス解析機能がありますが、これの使用につきましては同プライバシーポリシーに則ります。
* 接続するインスタンスのプライバシーポリシーはAPIを通じた全てのアクションに対して有効ですので、TheDeskについてもそれらに則ります。
以下のライセンスに基づき当ソフトウェアを公開します。
- 以下の条件の範囲内で個人ないし団体による再頒布を認めます。
- 必ず上記コピーライトと本ライセンス条項を改変無く含めること。(必ず年度が2018であること。他言語翻訳を付与する場合も原文を表記。)
- 変更を含め全てのコードを公開すること。商用利用やライセンスの変更は認めない。依存パッケージのライセンスにも従っているものとする。
- プラットフォームはElectronやCordova、またはそれに準ずるものであること。Webアプリケーションとしての配布は認めない。
- TheDeskとして他のプラットフォームに移植する場合、コードを一切変更してはならない。
- 改変する場合、必ずソフトウェアのタイトルの末尾が"Powered by TheDesk"であり、ユーザーの見えるところにTheDesk [使用バージョン名]を表示すること。
- 改変する場合、一切thedesk.topにアクセスしてはならない。TheDeskは標準でバージョン確認のためにthedesk.topにアクセスする。
- 改変する場合、サポートインスタンスを廃止すること。
- 改変する場合、アイコンを必ず変更するし、かつそれがTheDeskを想起させるものであること。
- このソフトウェアを改変して同時に複数インスタンスへ投稿させてはならない。
- このソフトウェアの使用、再頒布に伴う一切の責任をTheDeskは負いません。
- このソフトウェアを通じて投稿される内容やAPIを通じたアクションは全て投稿者が権利を主張でき、責務を負うことになります。
- APIを通じたアクションは、全てそのインスタンスの規約に従っていなければなりません。特記無き場合、法的責任はそのインスタンスのホストの所在国の法律に従って下さい。
- 利用しているインスタンスに関わらないTheDeskに起因する法的責任は日本国の法律に従います。
- [https://thedesk.top](https://thedesk.top)で公式に頒布されるソフトのみ[kirishima.cloud](https://kirishima.cloud)(アスタルテ)公認クライアントです。
このライセンス条項は2018年3月27日以降であり、TheDesk Airi (ver.9)以降をダウンロードした際に効力を持ちます。
以下バージョンとコードネームの比較です。
_斜字_ はTheDeskには採用していません。前作等に使用されています。
__太字__ は2018年3月27日現在のTheDeskで使用されたコードネームです。
[カッコ囲み]は飛ばされることが確定しています。バージョンの番号も飛ばされます。
52以降が必要になったときに使用します。
1. _Rin_oct
1. _Anzu_
1. _Kanako_
1. _Kaede_
1. _Rika_
1. _Ranko_
1. __Miku__
1. _Kirari_
1. __Mika__
1. __Uzuki__
1. __Miho__
1. __Riina__
1. __Airi__
1. __Mizuki__
1. Mio
1. Akane
1. Miria
1. Nana
1. [Minami]
1. Sachiko
1. Mayu
1. Koume
1. Chieri
1. Anastasia
1. Aiko
1. Shoko
1. Nao
1. Karen
1. Sae
1. Yuko
1. Fumika
1. Yuki
1. Frederica
1. Kanade
1. Nina
1. Arisu
1. Sanae
1. Shiki
1. Syuko
1. Momoka
1. Yui
1. Yuka
1. Asuka
1. Yumi
1. Kyoko
1. Yuuki
1. Ryo
1. Yoshino
1. Hiromi
1. Miyu
1. Tomoe

188
README.md
View File

@@ -1,47 +1,171 @@
<img src="https://thedesk.top/img/top.png" width="300" align="left">
<img src="https://thedesk.top/img/desk.png" width="150" align="right">
# TheDesk
Mastodon client for Windows/Linux(Linux ver. is not supported by developer.)
オープンソースSNSマストドンのWindows/Linuxクライアント
Download:[TheDesk](https://thedesk.top)
Latest Info(Markdown Toot)/最新情報(マークダウン形式のトゥート): [LATEST.md](https://github.com/cutls/TheDesk/blob/master/LATEST.md)
[![Build Status](https://travis-ci.org/cutls/TheDesk.svg?branch=master)](https://travis-ci.org/cutls/TheDesk)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/thedesk/localized.svg)](https://translate.thedesk.top/project/thedesk)
[![FOSSA Status](https://bit.ly/2N4cLd1)](https://bit.ly/31zqMmZ)
[![Version](https://flat.badgen.net/github/release/cutls/TheDesk)](https://github.com/cutls/TheDesk/releases)
![Contributors](https://flat.badgen.net/github/contributors/cutls/TheDesk)
Mastodon/Misskey client for PC(Windows/Linux/macOS)
オープンソースSNSマストドン/MisskeyのPC向けクライアント[日本語はこちら](README_ja.md)
Download:[TheDesk](https://thedesk.top) [![check](https://status.cutls.com/badge/?site=thedesk.top)](https://status.cutls.com)
## Developer/作った人
### Cutls P
<img src="https://thedesk.top/img/desk.png" width="100px">
I'm developing TheDesk on Mastodon in Nishinomiya and Kyoto, Japan.
My works:[Cutls Portal](https://the.cutls.com)
Contact me(bug report...):GitHub Issues, mention to [Cutls@kirishima.cloud](https://kirishima.cloud/@Cutls) or toot with #Desk
TheDeskを関西で開発しています。[Cutls Portal](https://the.cutls.com)で他のサービスをご覧いただけます。
バグレポートなど:GitHub Issuesや[Cutls@kirishima.cloud](https://kirishima.cloud/@Cutls)へのリプ、または#Deskでトゥートして下さい
<a href="https://www.patreon.com/cutls"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160"></a>
<a href="https://liberapay.com/cutls/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a>
![Screenshots1](https://thedesk.top/img/scr1.png)
## License
[TheDesk LICENSE v3](https://github.com/cutls/TheDesk/blob/master/LICENSE.md)
[GNU General Public License v3.0](https://github.com/cutls/TheDesk/blob/master/LICENSE)
## Component/構成
The icon is provided under [Creative Commons BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/)
[Press Kit](https://d2upiril6ywqp9.cloudfront.net/press/TheDesk+PressKit.zip)
app:Raw files(you can download to modify or check)
* [PNG 512x512](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.png)
* [SVG 4095x4096](https://d2upiril6ywqp9.cloudfront.net/press/thedesk-fullcolor.svg)
* [ico 256x256](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.ico)
* [icns old](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.icns)
* [Illustrator .ai](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.ai)
app:そのままのファイル。ダウンロード→テスト用
The default sounds of notifications is provided [Creative Commons BY](https://creativecommons.org/licenses/by/4.0/)
desk.icns: If you build yourself on macOS, you can use this .icns file as icon.
desk.icns: macOS向けアイコン。セルフビルドにどうぞ。
## Terms of Use
## Language/言語
* [利用規約(Terms of Use(ja))](https://thedesk.top/tos.html)
* [プライバシーポリシー(Privacy Policy(ja))](https://thedesk.top/priv.html)
Japanese
日本語
## Language
## Requirement/環境
* 日本語(Japanese)
* English
* de, cs, bg(from Crowdin)
- Windows (to launch TheDesk/実行に必要) / Linux (x64/ia32/armv7l)
- Electron beta.1.8.4
- electron-dl
- Jimp(Node.js)
- Ability to read unformated files!
### Translation
## See also/詳しく
Crowdin project is available! Visit: https://translate.thedesk.top
## Requirement and development
* Electron 4.2 or above(install yourself)
* electron-dl(in package.json)
* Jimp(in package.json)
* font-manager(in package.json)
* Python 2.x(install yourself)
* VisualC++(Windows)(install yourself)
* itunes-nowplaying-mac(for macOS)(in package.json)
* node-notifier(in package.json)
* sumchecker(in package.json)
* Ability to read unformated files!(install yourself)
### Run on developer mode
`npm run dev` on `app` folder.
## Contributors
Build for macOS
* [toneji](https://minohdon.jp/@toneji)
Build for Linux
* [popn_ja](https://popon.pptdn.jp/@popn_ja)
Fellow coder
* [kPherox](https://pl.kpherox.dev/kPherox)
## Build
You have to use either **npm** or **yarn**. Whichever you use, it works well.
### npm
```sh
git clone https://github.com/cutls/TheDesk
cd TheDesk/app
npm install
npm install --only=dev
npm run construct
```
### yarn
```sh
git clone https://github.com/cutls/TheDesk
cd TheDesk/app
# Linux or macOS
yarn install --no-lockfile
# Windows
yarn install
yarn construct
```
run `npm run dev` or `yarn dev` to launch developer version with console(click `view`)
### electron-builder(Recommended)
Use scripts(they can work well with npm, **yarn**).
#### npm
```sh
# Build for current platform
npm run build
# Select build target
## Windows
npm run build:win
## Windows and Linux (The macOS target should run on macOS. So, this option hasn't include the build for macOS)
npm run build:all
```
#### yarn
```sh
# Build for current platform
yarn build
# Select build target
## Windows
yarn build:win
## Windows and Linux (The macOS target should run on macOS. So, this option hasn't include the build for macOS)
yarn build:all
```
Config is all on package.json
### electron-packager
`npm install --save-dev electron-rebuild`
Linux/macOS
`./node_modules/.bin/electron-rebuild`
Windows
`.\node_modules\.bin\electron-rebuild.cmd`
To install Python 2.x and Visual C++ for Windows, before running `npm install --save-dev electron-rebuild`
`npm install --global windows-build-tools`
Windows
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --win32metadata.CompanyName="TheDesk&Cutls.com" --win32metadata.FileDescription="TheDesk" --win32metadata.OriginalFilename="TheDesk" --win32metadata.InternalName="TheDesk" --win32metadata.ProductName="TheDesk" --platform=win32 --arch=all --electron-version=4.0.5 --icon=.\app\thedesk.ico --overwrite`
Linux
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --platform=linux --arch=x64,ia32 --electron-version=4.0.5 --overwrite`
macOS
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --platform=darwin --arch=all --electron-version=4.0.5 --icon=./app/icon.icns --overwrite`
## Pleroma support
Did you find a bug with Pleroma accounts?
Pleroma **does not** follow Mastodon API rules completely although Pleroma developers say so.
Please write issues to improve TheDesk affinity with Pleroma.
## Vulnerabilities when `npm i`???
No, if your npm says materialize-css has vulnerabilities(CVE-2019-11002/3/4), look at [here](https://github.com/Dogfalo/materialize/issues/6286) under discussion.
[TheDesk - マストドン日本語ウィキ](https://ja.mstdn.wiki/TheDesk)

173
README_ja.md Normal file
View File

@@ -0,0 +1,173 @@
<img src="https://thedesk.top/img/top.png" width="300" align="left">
<img src="https://thedesk.top/img/desk.png" width="150" align="right">
# TheDesk
[![Build Status](https://travis-ci.org/cutls/TheDesk.svg?branch=master)](https://travis-ci.org/cutls/TheDesk)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/thedesk/localized.svg)](https://translate.thedesk.top/project/thedesk)
[![FOSSA Status](https://bit.ly/2N4cLd1)](https://bit.ly/31zqMmZ)
[![Version](https://flat.badgen.net/github/release/cutls/TheDesk)](https://github.com/cutls/TheDesk/releases)
![Contributors](https://flat.badgen.net/github/contributors/cutls/TheDesk)
Mastodon/Misskey client for PC(Windows/Linux/macOS)
オープンソースSNSマストドン/MisskeyのPC向けクライアント
Download:[TheDesk](https://thedesk.top) [![check](https://status.cutls.com/badge/?site=thedesk.top)](https://status.cutls.com)
[Pixiv FANBOX](https://www.pixiv.net/fanbox/creator/28105985)
![Screenshots1](https://thedesk.top/img/scr1.png)
## ライセンス
[GNU General Public License v3.0](https://github.com/cutls/TheDesk/blob/master/LICENSE)
アイコンは[クリエイティブ・コモンズ 表示-非営利-継承](https://creativecommons.org/licenses/by-nc-sa/4.0/)で提供されています。
[プレスキット](https://d2upiril6ywqp9.cloudfront.net/press/TheDesk+PressKit.zip)
* [PNG 512x512](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.png)
* [SVG 4095x4096](https://d2upiril6ywqp9.cloudfront.net/press/thedesk-fullcolor.svg)
* [ico 256x256](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.ico)
* [icns old](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.icns)
* [Illustrator .ai](https://d2upiril6ywqp9.cloudfront.net/press/thedesk.ai)
標準の通知音は [Creative Commons BY](https://creativecommons.org/licenses/by/4.0/) で提供されています。
## 利用規約
* [利用規約](https://thedesk.top/tos.html)
* [プライバシーポリシー](https://thedesk.top/priv.html)
## 言語
* 日本語
* English(英語)
* ドイツ語, チェコ語, ブルガリア語(from Crowdin)
### 翻訳
Crowdinから翻訳に参加してみませんか: https://translate.thedesk.top
## 環境
* Electron 4.2以上(自分で入れて)
* electron-dl(in package.json)
* Jimp(in package.json)
* font-manager(in package.json)
* Python 2.x(自分で入れて)
* VisualC++(Windows)(自分で入れて)
* itunes-nowplaying-mac(macOS向け)(in package.json)
* node-notifier(in package.json)
* sumchecker(in package.json)
* Ability to read unformated files!(自分で入れて)
### デベロッパーモード
`npm run dev``app`フォルダ内で実行
## 主なコントリビューター
macOSビルダー
* [とねぢ](https://minohdon.jp/@toneji)
Linuxビルダー
* [ぽぷんじゃ](https://popon.pptdn.jp/@popn_ja)
コーダー
* [kPherox](https://pl.kpherox.dev/kPherox)
## ビルド
npmでもyarnでも好きな方を選んでください。
### npm
```sh
git clone https://github.com/cutls/TheDesk
cd TheDesk/app
npm install
npm install --only=dev
npm run construct
```
### yarn
```sh
git clone https://github.com/cutls/TheDesk
cd TheDesk/app
# Linux or macOS
yarn install --no-lockfile
# Windows
yarn install
yarn construct
```
### electron-builder(推奨)
scriptsを利用します
#### npm
```sh
# 実行している環境向けにビルド
npm run build
# ターゲットを指定してビルド
## Windows
npm run build:win
## macOS向けのビルドにはmacOSで実行する必要があるためこのコマンドではビルドされません
npm run build:all
```
#### yarn
```sh
# 実行している環境向けにビルド
yarn build
# ターゲットを指定してビルド
## Windows
yarn build:win
## macOS向けのビルドにはmacOSで実行する必要があるためこのコマンドではビルドされません
yarn build:all
```
ビルド設定はすべてpackage.jsonに記載しています。
### electron-packager(非推奨)
`npm install --save-dev electron-rebuild`
Linux/macOS
`./node_modules/.bin/electron-rebuild`
Windows
`.\node_modules\.bin\electron-rebuild.cmd`
WindowsでPython 2.xやVisualC++を一発でインストールできるツールもあります(`npm install --save-dev electron-rebuild`の前に)
`npm install --global windows-build-tools`
日本語話者向けですが、macOSビルドにはXCodeが要るとの情報があります。([とねぢ](https://minohdon.jp/@toneji)氏談)
Windows
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --win32metadata.CompanyName="TheDesk&Cutls.com" --win32metadata.FileDescription="TheDesk" --win32metadata.OriginalFilename="TheDesk" --win32metadata.InternalName="TheDesk" --win32metadata.ProductName="TheDesk" --platform=win32 --arch=all --electron-version=4.0.5 --icon=.\app\thedesk.ico --overwrite`
Linux
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --platform=linux --arch=x64,ia32 --electron-version=4.0.5 --overwrite`
macOS
`electron-packager ./app TheDesk --executable-name="TheDesk" --app-copyright="Copyright (c) TheDesk 2018 Cutls.com 2015 All Right Reserved" --platform=darwin --arch=all --electron-version=4.0.5 --icon=./app/icon.icns --overwrite`
## Pleromaのサポート
Pleromaは、Mastodon APIとの互換性を謳っていますが、実際には様々な差異があり、TheDeskで不具合が発生することがあります。
Issuesに書いてある問題についてはなるべく対処しますので、ぜひお知らせください。
## 詳しく
[TheDesk - マストドン日本語ウィキ](https://ja.mstdn.wiki/TheDesk)
## `npm i`したら脆弱性あるって言われた
materialize-cssの脆弱性(CVE-2019-11002/3/4)については[こちら](https://github.com/Dogfalo/materialize/issues/6286)で本当に脆弱性かどうか議論しています。
実際には害が無いものと思われます。

View File

@@ -1,108 +1,135 @@
<!doctype html>
<html lang="ja">
<head>
<title>TheDesk</title>
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<link href="./css/materialize.css" type="text/css" rel="stylesheet">
<link href='./css/font-awesome.css' rel='stylesheet' type='text/css'>
<link href="./css/master.css" type="text/css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300|Baloo+Bhai" rel="stylesheet">
<meta charset="utf-8">
<style>
body{
font-family:'Open Sans';
-webkit-app-region: drag;
cursor: move;
}
a,button{
-webkit-app-region: no-drag;
}
.container {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
grid-template-areas: 'name1 data1' 'name2 data2' 'name3 data3' 'name4 data4' 'name5 data5';
text-align:left;
margin:5px;
}
<title>TheDesk</title>
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<link href="./node_modules/materialize-css/dist/css/materialize.css" type="text/css" rel="stylesheet">
<link href='./css/font-awesome.css' rel='stylesheet' type='text/css'>
<link href="./css/themes.css" type="text/css" rel="stylesheet">
<link href="./css/master.css" type="text/css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300|Baloo+Bhai" rel="stylesheet">
<meta charset="utf-8">
<style>
body {
font-family: 'Open Sans';
-webkit-app-region: drag;
cursor: move;
padding: 5px;
padding-top: 15px;
}
.area-name1 {
grid-area: name1;
}
a,
button {
-webkit-app-region: no-drag;
}
.area-data1 {
grid-area: data1;
}
.container {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
grid-template-areas: 'name1 data1''name2 data2''name3 data3''name4 data4''name5 data5''name6 data6';
text-align: left;
margin: 5px;
}
.area-name2 {
grid-area: name2;
}
.area-name1 {
grid-area: name1;
}
.area-data2 {
grid-area: data2;
}
.area-data1 {
grid-area: data1;
}
.area-name3 {
grid-area: name3;
}
.area-name2 {
grid-area: name2;
}
.area-data3 {
grid-area: data3;
}
.area-data2 {
grid-area: data2;
}
.area-name4 {
grid-area: name4;
}
.area-name3 {
grid-area: name3;
}
.area-data4 {
grid-area: data4;
}
.area-data3 {
grid-area: data3;
}
.area-name5 {
grid-area: name5;
}
.area-name4 {
grid-area: name4;
}
.area-data5 {
grid-area: data5;
}
</style>
.area-data4 {
grid-area: data4;
}
.area-name5 {
grid-area: name5;
}
.area-data5 {
grid-area: data5;
}
.area-name6 {
grid-area: name6;
}
.area-data6 {
grid-area: data6;
}
</style>
</head>
<body class="center " style="overflow:hidden">
<script type="text/javascript" src="./js/common/jquery.js"></script>
<script type="text/javascript" src="./js/platform/first.js"></script>
<script type="text/javascript" src="./js/common/materialize.js"></script>
<img src="./img/desk.png" style="max-width:70%;">
<h5>TheDesk</h5>
<div class='container'>
<div class='area-name1'>バージョン</div>
<div class='area-data1' id="now"></div>
<div class='area-name2'>Internal version</div>
<div class='area-data2' id="ver"></div>
<div class='area-name3'>Chromium</div>
<div class='area-data3' id="chrome"></div>
<div class='area-name4'>Electron</div>
<div class='area-data4' id="electron"></div>
<div class='area-name5'>Node.js</div>
<div class='area-data5' id="node"></div>
</div>
<div class="cp">Copyright &copy; TheDesk 2018 All rights reserved.<br><a href="https://thedesk.top" target="_blank">Web site</a></div>
<button onclick="window.close()" class="btn waves-effect indigo" style="width:calc(100% - 10px);"><i class="material-icons left">close</i>Close</button>
<script type="text/javascript" src="./js/ui/theme.js"></script>
<script>
$("#now").text(localStorage.getItem("ver"));
var electron = require("electron");
var remote=electron.remote;
//JSON.parse(fs.readFileSync(info_path, 'utf8'));
console.log(process.versions);
$("#node").text(process.version);
$("#chrome").text(process.versions.chrome);
$("#electron").text(process.versions.electron);
if(location.search){
var m = location.search.match(/\?ver=([a-zA-Z-0-9.]+)/);
var ver=m[1];
$("#ver").text(ver);
}
</script>
<script type="text/javascript" src="./js/platform/end.js"></script>
<script type="text/javascript" src="./node_modules/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="./js/platform/first-not-view.js"></script>
<script type="text/javascript" src="./node_modules/materialize-css/dist/js/materialize.js"></script>
<img src="./img/desk.svg" style="max-width:62%;">
<h5>TheDesk</h5>
<div class="container">
<div class="area-name1">Display version</div>
<div class="area-data1" id="now"></div>
<div class="area-name2">Internal version</div>
<div class="area-data2" id="ver"></div>
<div class="area-name3">Commit(7chars)</div>
<div class="area-data3" id="hash"></div>
<div class="area-name4">Chromium</div>
<div class="area-data4" id="chrome"></div>
<div class="area-name5">Electron</div>
<div class="area-data5" id="electron"></div>
<div class="area-name6">Node.js</div>
<div class="area-data6" id="node"></div>
</div>
<div class="cp">Copyright &copy; TheDesk 2018<br>
Main developer(author): <a href="https://cutls.com/@Cutls" target="_blank">Cutls P</a><br>
Thanks:<a href="https://minohdon.jp/@toneji" target="_blank">toneji</a>/<a
href="https://popon.pptdn.jp/@popn_ja" target="_blank">popn_ja</a>/<a href="https://pl.kpherox.dev/kPherox"
target="_blank">kPherox</a> and all users
<img draggable="false" style="width:0.8rem;top: 1px;margin-left: 1px;position: relative;" alt="❤️"
title=":heart:" src="https://twemoji.maxcdn.com/2/72x72/2764.png">
<br><a href="https://thedesk.top" target="_blank">Web site</a></div>
<button onclick="window.close()" class="btn waves-effect indigo" style="width:calc(100% - 10px);"><i
class="material-icons left">close</i>Close</button>
<script type="text/javascript" src="./js/ui/theme.js"></script>
<script>
var about = JSON.parse(localStorage.getItem("about"));
$("#now").text(localStorage.getItem("ver"));
$("#node").text(about[0]);
$("#chrome").text(about[1]);
$("#electron").text(about[2]);
if (location.search) {
var m = location.search.match(/\?ver=([a-zA-Z-0-9.]+)/);
var ver = m[1];
$("#ver").text(ver);
}
$("#hash").html('<a href="https://github.com/cutls/TheDesk/commits/' + about[3] + '" target="_blank">' + about[3].slice(0, 7) + '</a>');
$(document).on('click', 'a', e => {
var url = $(e.target).attr('href');
postMessage(["openUrl", url], "*")
return false;
});
</script>

View File

@@ -1,65 +0,0 @@
<!doctype html>
<html lang="ja">
<head>
<title>Account Manager - TheDesk</title>
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<link href="./css/materialize.css" type="text/css" rel="stylesheet">
<link href="./css/master.css" type="text/css" rel="stylesheet">
<link href="./css/auth.css" type="text/css" rel="stylesheet">
<link href='./css/font-awesome.css' rel='stylesheet' type='text/css'>
<link href='./css/tl.css' rel='stylesheet' type='text/css'>
<link href='./css/userdata.css' rel='stylesheet' type='text/css'>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300" rel="stylesheet">
<style>.acct{display:flex; justify-content:space-around;}
.text{overflow-x: scroll;}
body,html{overflow-y: scroll;}
</style>
<meta charset="utf-8">
</head>
<body id="mainView">
<script type="text/javascript" src="./js/common/jquery.js"></script>
<script type="text/javascript" src="./js/platform/first.js"></script>
<script type="text/javascript" src="./js/common/materialize.js"></script>
<script type="text/javascript" src="./js/ui/tips.js"></script>
<script type="text/javascript" src="./js/common/time.js"></script>
<script type="text/javascript" src="./js/common/modal.js"></script>
<a href="index.html" class="btn waves-effect orange nex" style="width:100%; max-width:200px;">戻る</a><br>
<div id="acct-list" class="row"></div>
<div class="divider"></div>
アカウントを追加<br>
<div id="add">
<div class="row">
<div class="col s6">
<input type="text" id="url" style="width:70%" placeholder="mstdn.jp">
<div id="ins-suggest"></div>
Windows以外でご使用の方やPleromaにログインされる方はチェックを入れて下さい。<br>
<input type="checkbox" class="filled-in" id="linux" />
<label for="linux">コードセットアップ</label><br>
<button class="btn waves-effect" onclick="instance()">Login</button><br>
</div>
<div class="col s6">
<span style="font-family:Open Sans;">Supports</span>
<div id="support" class="collection transparent"></div>
</div>
</div>
</div>
<div id="auth" style="display:none">
指定されたコードを貼り付けてください。ログインウィンドウは閉じていただいて構いません。<br>
<input type="text" id="code" placeholder="コードを入力">
<button class="btn waves-effect" onclick="code()">認証</button><br>
</div>
現在ログイン中のインスタンス情報 by <a href="https://instances.social" target="_blank">instances.social API</a><br>
<img src="./img/loading.svg" id="ins-prof" width="200"><br>
<span id="ins-upd"></span>現在<br>
ドメイン名:<span id="ins-name"></span><br>
接続済みインスタンス:<span id="ins-connect"></span><br>
トゥート数:<span id="ins-toot"></span><br>
ユーザー数:<span id="ins-user"></span><br>
コネクション:<span id="ins-per"></span>%<br>
マストドンバージョン:<span id="ins-ver"></span><br>
<script type="text/javascript" src="./js/ui/theme.js"></script>
<script type="text/javascript" src="./js/platform/end.js"></script>
<script type="text/javascript" src="./js/login/manager.js"></script>
<script type="text/javascript" src="./js/login/instance.js"></script>
<script type="text/javascript" src="./js/tl/date.js"></script>

112
app/build.js Normal file
View File

@@ -0,0 +1,112 @@
const builder = require("electron-builder");
const fs = require('fs');
const os = process.platform;
const Platform = builder.Platform
const Arch = builder.Arch
const targets = new Map();
const archToType = new Map();
const pref = {
productName: "TheDesk",
appId: "top.thedesk",
asarUnpack: [
"node_modules/itunes-nowplaying-mac"
],
directories: {
output: "../build/"
},
win: {
icon: "build/thedesk.ico",
target: [
"nsis",
"portable",
"appx"
]
},
appx: {
identityName: "53491Cutls.TheDesk",
applicationId: "Cutls.TheDesk",
publisherDisplayName: "Cutls",
publisher: "CN=629757F5-A5EE-474F-9562-B304A89A9FD1",
languages: [
"JA-JP",
"EN-US"
]
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true
},
linux: {
icon: "build/icons",
target: [
"zip",
"snap"
],
category: "Network"
},
mac: {
target: [
"dmg",
"zip"
]
},
electronDownload: {
version: "5.0.1"
},
electronVersion: "5.0.1"
}
const json = JSON.parse(fs.readFileSync("package.json", 'utf8'));
const version = json.version;
if (os == "win32") {
archToType.set(Arch.ia32, []);
targets.set(Platform.WINDOWS, archToType);
} else if (os == "linux") {
archToType.set(Arch.x64, []);
archToType.set(Arch.ia32, []);
targets.set(Platform.LINUX, archToType);
} else if (os == "darwin") {
archToType.set(Arch.x64, []);
targets.set(Platform.MAC, archToType);
} else {
return false
}
builder.build({
targets: targets,
config: pref
})
.then(() => {
console.log("Done on "+os)
if (os == "win32") {
console.log("Windows")
fs.renameSync('../build/TheDesk ' + version + '.exe', '../build/TheDesk-ia32.exe');
fs.renameSync('../build/TheDesk Setup ' + version + '.exe', '../build/TheDesk-setup-ia32.exe');
retry()
}else if (os == "linux") {
console.log("Linux")
fs.renameSync('../build/thedesk-' + version + '.zip', '../build/TheDesk.zip');
fs.renameSync('../build/TheDesk Setup ' + version + '.exe', '../build/TheDesk-setup-ia32.exe');
}
})
.catch((error) => {
// handle error
})
function retry(){
console.log("Windows x64")
const targetsAlt = new Map();
const archToTypeAlt = new Map();
targetsAlt.set(Platform.WINDOWS, archToTypeAlt);
archToTypeAlt.set(Arch.x64, []);
builder.build({
targets: targetsAlt,
config: pref
})
.then(() => {
fs.renameSync('../build/TheDesk Setup ' + version + '.exe', '../build/TheDesk-setup.exe');
fs.renameSync('../build/TheDesk ' + version + '.exe', '../build/TheDesk.exe');
})
.catch((error) => {
// handle error
})
}

1
app/build/README.md Normal file
View File

@@ -0,0 +1 @@

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
app/build/icon.icns Normal file

Binary file not shown.

BIN
app/build/thedesk.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -1,2 +1,4 @@
/*このソフトについてを押した時に読み込まれます*/
body{font-family:Open Sans;}
body {
font-family: Open Sans;
}

View File

@@ -5,9 +5,15 @@
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
font-family: "FontAwesome";
src: url("../fonts/fontawesome-webfont.eot?v=4.7.0");
src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0")
format("embedded-opentype"),
url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),
url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),
url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),
url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular")
format("svg");
font-weight: normal;
font-style: normal;
}
@@ -60,9 +66,9 @@
left: -1.85714286em;
}
.fa-border {
padding: .2em .25em .15em;
padding: 0.2em 0.25em 0.15em;
border: solid 0.08em #eeeeee;
border-radius: .1em;
border-radius: 0.1em;
}
.fa-pull-left {
float: left;
@@ -71,10 +77,10 @@
float: right;
}
.fa.fa-pull-left {
margin-right: .3em;
margin-right: 0.3em;
}
.fa.fa-pull-right {
margin-left: .3em;
margin-left: 0.3em;
}
/* Deprecated as of 4.4.0 */
.pull-right {
@@ -84,10 +90,10 @@
float: left;
}
.fa.pull-left {
margin-right: .3em;
margin-right: 0.3em;
}
.fa.pull-right {
margin-left: .3em;
margin-left: 0.3em;
}
.fa-spin {
-webkit-animation: fa-spin 2s infinite linear;

View File

@@ -1,5 +1,14 @@
/*共通CSS*/
html,body{overflow:hidden; user-select: none; cursor:default; font-size:13px;height: 100vh;}
html,
body {
/*transform: translate3d(0,0,0);*/
overflow: hidden;
user-select: none;
cursor: default;
font-size: 13px;
height: 100vh;
color: var(--color);
}
.btn {
margin: 5px;
text-transform: none;
@@ -18,6 +27,8 @@ option {
}
#mainView {
padding: 10px;
overflow: scroll;
height: auto;
}
#message {
display: none;
@@ -28,25 +39,28 @@ option {
color: white;
z-index: 9999;
}
#imagemodal, #videomodal {
#imagemodal,
#videomodal {
display: none;
max-width: 100vw;
max-height: 100vh;
top:0;
background-color: white;
position: fixed;
z-index: 9;
top: 0 !important;
}
#imagemodal, #videomodal, #tootmodal {
background-color: white;
#videomodal,
#tootmodal {
background-color: var(--modal);
}
#imagemodal .modal-content {
overflow: hidden;
padding: 0;
}
#imagemodal .modal-footer{
overflow-x:scroll;
overflow-y:hidden;
#imagemodal .modal-footer {
overflow-x: scroll;
overflow-y: hidden;
}
#imagewrap {
width: 100%;
height: 100%;
@@ -54,7 +68,16 @@ option {
.pointer {
cursor: pointer;
}
.bbcode-pulse-loadings, .bbcode-pulse-loading, .fa-pulse {
.badge {
min-width: 0 !important;
margin-left: 5px !important;
}
.unvisible {
opacity: 0;
}
.bbcode-pulse-loadings,
.bbcode-pulse-loading,
.fa-pulse {
display: inline-block;
animation-duration: 3s;
animation-fill-mode: both;
@@ -62,14 +85,50 @@ option {
animation-name: pulse;
}
@keyframes pulse {
from, 50%, to {
from,
50%,
to {
opacity: 1;
}
25%, 75% {
25%,
75% {
opacity: 0;
}
}
code:before, .pre:before {
@keyframes shake {
from,
to {
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
10%,
30%,
50%,
70%,
90% {
-webkit-transform: translate3d(-10px, 0, 0);
transform: translate3d(-10px, 0, 0);
}
20%,
40%,
60%,
80% {
-webkit-transform: translate3d(10px, 0, 0);
transform: translate3d(10px, 0, 0);
}
}
.shake {
display: inline-block;
animation-duration: 1s;
animation-fill-mode: both;
animation-iteration-count: infinite;
animation-name: shake;
}
code:before,
.pre:before {
content: "Code";
font-size: 1.8rem;
line-height: 1em;
@@ -79,7 +138,8 @@ code:before, .pre:before {
right: 0;
top: 0;
}
code, pre {
code,
pre {
color: white;
display: block;
border-left: 5px solid;
@@ -91,29 +151,26 @@ code, pre {
background-color: #000;
padding: 1em 1em 1em;
position: relative;
-webkit-border-top-left-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-topleft: 10px;
-moz-border-radius-bottomright: 10px;
-moz-border-radius-bottomleft: 10px;
border-top-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
}
blockquote, .quote p {
blockquote,
.quote p {
margin: 0;
}
blockquote, .quote {
blockquote,
.quote {
color: black;
background-color: #ddd;
padding: 1em 1em 1em;
position: relative;
-webkit-border-top-left-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-topleft: 10px;
-moz-border-radius-bottomright: 10px;
-moz-border-radius-bottomleft: 10px;
border-top-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
}
blockquote:before, .quote:before {
blockquote:before,
.quote:before {
content: "Quote";
font-size: 1.8rem;
line-height: 1em;
@@ -123,12 +180,64 @@ blockquote:before, .quote:before {
right: 0;
top: 0;
}
.twitter-tweet {
color: black;
background-color: #fff;
padding: 1em 1em 1em;
position: relative;
border-top-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
border-left: 5px solid #0c7abf;
}
.twitter-tweet :before {
content: "From Twitter";
font-size: 1.8rem;
line-height: 1em;
font-family: Open Sans;
color: #999;
position: absolute;
right: 0;
top: 0;
}
.pixiv-post {
color: black;
background-color: #fff;
padding: 1em 1em 1em;
position: relative;
border-top-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
border-left: 5px solid #0096fa;
}
.pixiv-post :before {
content: "From Pixiv";
font-size: 1.8rem;
line-height: 1em;
font-family: Open Sans;
color: #999;
position: absolute;
right: 0;
top: 0;
}
#start {
display: none;
position: fixed;
width: 100vw;
height: calc(100vh - 40px);
background-color: var(--bg);
color: var(--color);
z-index: 99999;
justify-content: center;
align-items: center;
}
#drag {
display: none;
position: fixed;
width: 100vw;
height: 100vh;
background-color: rgba(255, 255, 255, 0.8);
background-color: var(--bg);
color: var(--color);
z-index: 99999;
justify-content: center;
align-items: center;
@@ -136,120 +245,247 @@ blockquote:before, .quote:before {
#drag-content {
font-size: 2rem;
}
.radio{
font-family:'Baloo Bhai'
#pip {
z-index: 504;
width: 418px;
background-color: var(--subcolor);
position: absolute;
}
#pip{
z-index:504;
width:418px;
background-color: white;
position:absolute;
.pip-bottom {
bottom: 10px;
}
.pip-bottom{
bottom:10px;
.pip-left {
left: 10px;
}
.pip-left{
left:10px;
.pip-top {
top: 10px;
}
.pip-top{
top:10px;
.pip-right {
right: 10px;
}
.pip-right{
right:10px;
#pip-content .material-icons {
display: none;
}
#pip-content .material-icons{
display:none;
.big-text {
font-size: 1.2rem;
}
@media only screen and (min-width: 993px){
#toast-container {
top:auto;
right:auto;
#releasenote {
background-color: var(--modal);
}
#releasenote li {
list-style-type: disc;
}
@media only screen and (min-width: 993px) {
#toast-container {
top: auto;
right: auto;
bottom: 5%;
left: 4%;
max-width: 86%;
}
}
}
.show{
.show {
animation: show 0.2s linear 0s;
}
@keyframes show{
from{
opacity: 0;
@keyframes show {
from {
opacity: 0;
}
to{
opacity: 1;
to {
opacity: 1;
}
}
/*black theme*/
.blacktheme body {
color: white;
background-color: #212121;
.hide-anime {
animation: hide 0.2s linear 0s;
display: none;
}
.blacktheme #drag {
color: white;
background-color: rgba(0, 0, 0, 0.8);
@keyframes hide {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.collapsible-header,
.tabs {
background-color: var(--subcolor);
}
.collapsible-header:focus {
background-color: var(--subcolor) !important;
}
.modal-footer {
background-color: var(--modalfooter) !important;
}
.font {
font-size: 1.5rem;
margin-bottom: 5px;
}
.font:hover {
background-color: #999;
}
.release-do {
border: solid 2px;
border-color: var(--color);
padding: 5px;
}
#pickers {
display: flex;
flex-wrap: wrap;
}
#menu {
position: fixed;
width: 100vw;
height: 100vh;
z-index: 99999;
z-index: 9999;
background-color: var(--postbox);
width: 540px;
top: calc(50% - 150px);
left: calc(50% - 250px);
padding: 5px;
border: thin solid gray;
border-radius: 5px;
overflow: hidden;
}
#menu-wrapper {
margin-left: -5px;
display: flex;
height: calc(100% - 3.5rem);
overflow: hidden;
}
#left-menu {
width: 230px;
}
#left-menu div {
padding-left: 5px;
width: 100%;
height: 50px;
display: flex;
align-items: center;
cursor: pointer;
}
#left-menu div:hover {
background-color: var(--beforehover);
}
#left-menu span {
margin-left: 5px;
}
#left-menu div.active {
background-color: var(--emphasized);
}
#right-menu {
width: 100%;
overflow-y: scroll;
overflow-x: hidden;
padding: 5px;
}
#tltype {
display: flex;
flex-wrap: wrap;
}
#tltype .type {
display: flex;
flex-wrap: wrap;
align-items: center;
width: 170px;
height: 40px;
cursor: pointer;
}
#tltype .type span {
width: calc(100% - 30px);
}
#tltype .type:hover {
background-color: var(--beforehover);
}
#tltype .active {
background-color: var(--emphasized);
}
#tltype i {
font-size: 30px;
}
#tltype i.sub-icon {
font-size: 20px;
position: absolute;
color: var(--beforehover);
left: 10px;
bottom: 5px;
background-color: #fff;
}
.drag-bar {
cursor: move;
text-align: center;
width: calc(100% + 10px);
border-radius: 5px;
background-color: var(--box);
filter: brightness(80%);
margin-left: -5px;
margin-right: -5px;
margin-top: -5px;
font-size: 16px;
padding: 4px;
}
#something-wrong {
flex-direction: column;
width: 100%;
height: 100%;
position: absolute;
display: flex;
justify-content: center;
align-items: center;
}
.blacktheme #imagemodal,.blacktheme #videomodal,.blacktheme #tootmodal {
background-color: black;
}
.blacktheme .collapsible-header,.blacktheme .tabs,.blacktheme #pip {
background-color: #212121;
}
/*indigo theme*/
.indigotheme body {
color: white;
background-color: #031833;
}
.indigotheme #drag {
color: white;
background-color: rgba(0, 0, 0, 0.8);
#support-btm {
position: fixed;
bottom: -300px;
width: 100vw;
height: 100vh;
z-index: 99999;
justify-content: center;
align-items: center;
background-color: var(--box);
z-index: 9999;
padding: 10px;
display: grid;
grid-template-columns: 3fr 1fr 1fr;
grid-template-rows: 1fr 36px;
grid-template-areas: "note middle right" "note close close";
}
.indigotheme #imagemodal,.indigotheme #videomodal,.indigotheme #tootmodal {
background-color: #0d1351;
#support-btm-en,
#support-btm-ja {
grid-area: note;
}
.indigotheme .collapsible-header,.indigotheme .tabs,.indigotheme #pip {
background-color: #0d1351;
#support-btm-middle {
grid-area: middle;
}
/*brown theme*/
.browntheme body {
color: white;
background-color: #261411;
#support-btm-right {
grid-area: right;
}
.browntheme #drag {
color: white;
background-color: rgba(0, 0, 0, 0.8);
position: fixed;
width: 100vw;
height: 100vh;
z-index: 99999;
justify-content: center;
align-items: center;
#support-btm-close {
grid-area: close;
}
.browntheme #imagemodal,.browntheme #videomodal,.browntheme #tootmodal {
background-color: #261411;
.select-wrapper .dropdown-content {
width: 250px !important;
}
.browntheme .collapsible-header,.browntheme .tabs,.browntheme #pip {
background-color: #4e342e;
input,
textarea {
color: var(--color);
font-size: 1rem !important;
font-family: inherit;
}
.swal2-popup {
background-color: var(--notfbox) !important;
}
.swal2-title,
.swal2-content {
color: var(--color) !important;
}
#src-contents svg {
margin-right: 5px;
}
.contributor {
cursor: pointer;
}
.contributor img {
width: 1rem;
}
/*スクロールバー*/
::-webkit-scrollbar {
width: 5px;
height: 5px;
height: 10px;
background: rgba(0, 0, 0, 0.05);
}
::-webkit-scrollbar-track {
@@ -260,6 +496,40 @@ blockquote:before, .quote:before {
::-webkit-scrollbar-thumb {
-webkit-border-radius: 5px;
border-radius: 5px;
background: #9e9e9e;
background: #607d8b;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}
}
/* Web Fonts */
@font-face {
font-family: "Open Sans";
font-style: normal;
font-weight: 300;
src: local("Open Sans Light"), local("OpenSans-Light"),
url(https://fonts.gstatic.com/s/opensans/v17/mem5YaGs126MiZpBA-UN_r8OUuhp.woff2)
format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
U+FEFF, U+FFFD;
}
@font-face {
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2)
format("woff2");
}
.material-icons {
font-family: "Material Icons";
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-feature-settings: "liga";
-webkit-font-smoothing: antialiased;
}

9411
app/css/materialize.css vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

301
app/css/pickr.css Normal file
View File

@@ -0,0 +1,301 @@
.pickr {
position: relative;
overflow: visible;
z-index: 1;
}
.pickr * {
box-sizing: border-box;
}
.pickr button,
.pickr input {
outline: none;
border: none;
}
.pickr button:focus,
.pickr input:focus {
box-shadow: 0 0 0 1px #f1f3f4, 0 0 0 3px currentColor;
}
.pickr .pcr-button {
position: relative;
height: 2em;
width: 2em;
padding: 0.5em;
border-radius: 0.15em;
cursor: pointer;
background: currentColor;
transition: all 0.3s;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,
Helvetica Neue, Arial, sans-serif;
}
.pickr .pcr-button:before {
background: url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');
background-size: 0.5em;
border-radius: 0.15em;
z-index: -1;
}
.pickr .pcr-button:after,
.pickr .pcr-button:before {
position: absolute;
content: "";
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.pickr .pcr-button:after {
background: url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" stroke="%2342445A" stroke-width="5px" stroke-linecap="round"><path d="M45,45L5,5"></path><path d="M45,5L5,45"></path></svg>')
no-repeat 50%;
background-size: 70%;
opacity: 0;
}
.pickr .pcr-button.clear {
background: hsla(0, 0%, 100%, 0.25);
}
.pickr .pcr-button.clear:after {
opacity: 1;
}
.pickr .pcr-button.clear:focus {
box-shadow: 0 0 0 1px #f1f3f4, 0 0 0 3px #75797e;
}
.pickr .pcr-button.disabled {
cursor: not-allowed;
}
.pcr-app {
margin-top: 10px;
display: flex;
flex-direction: column;
z-index: 10000;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,
Helvetica Neue, Arial, sans-serif;
box-shadow: 0 0.15em 1.5em 0 rgba(0, 0, 0, 0.1), 0 0 1em 0 rgba(0, 0, 0, 0.03);
top: 5px;
height: 15em;
width: 28.5em;
max-width: 95vw;
padding: 0.8em;
border-radius: 0.1em;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s;
}
.pcr-app.visible {
visibility: visible;
opacity: 1;
}
.pcr-app .swatches {
display: flex;
flex-wrap: wrap;
margin-top: 0.75em;
}
@supports (display: grid) {
.pcr-app .swatches {
display: grid;
align-items: center;
justify-content: space-around;
grid-template-columns: repeat(auto-fit, 1.75em);
}
}
.pcr-app .swatches > button {
position: relative;
width: 1.75em;
height: 1.75em;
border-radius: 0.15em;
cursor: pointer;
margin: 2.5px;
flex-shrink: 0;
justify-self: center;
transition: all 0.15s;
overflow: hidden;
background: transparent;
z-index: 1;
}
.pcr-app .swatches > button:before {
position: absolute;
content: "";
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');
background-size: 6px;
border-radius: 0.15em;
z-index: -1;
}
.pcr-app .swatches > button:after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: currentColor;
border: 1px solid rgba(0, 0, 0, 0.05);
border-radius: 0.15em;
box-sizing: border-box;
}
.pcr-app .swatches > button:hover {
filter: brightness(1.05);
}
.pcr-app .pcr-interaction {
display: flex;
align-items: center;
margin: 0.75em -0.2em 0;
}
.pcr-app .pcr-interaction > * {
margin: 0 0.2em;
}
.pcr-app .pcr-interaction input {
letter-spacing: 0.07em;
font-size: 0.75em;
text-align: center;
cursor: pointer;
color: #75797e;
background: #f1f3f4;
border-radius: 0.15em;
transition: all 0.15s;
padding: 0.45em 0.5em;
}
.pcr-app .pcr-interaction input:hover {
filter: brightness(0.975);
}
.pcr-app .pcr-interaction input:focus {
box-shadow: 0 0 0 1px #f1f3f4, 0 0 0 3px rgba(66, 133, 244, 0.75);
}
.pcr-app .pcr-interaction .pcr-result {
color: #75797e;
text-align: left;
flex-grow: 1;
min-width: 1em;
transition: all 0.2s;
border-radius: 0.15em;
background: #f1f3f4;
cursor: text;
}
.pcr-app .pcr-interaction .pcr-result::selection {
background: #4285f4;
color: #fff;
}
.pcr-app .pcr-interaction .pcr-type.active {
color: #fff;
background: #4285f4;
}
.pcr-app .pcr-interaction .pcr-clear,
.pcr-app .pcr-interaction .pcr-save {
width: auto;
color: #fff;
}
.pcr-app .pcr-interaction .pcr-clear:hover,
.pcr-app .pcr-interaction .pcr-save:hover {
filter: brightness(0.925);
}
.pcr-app .pcr-interaction .pcr-save {
background: #4285f4;
}
.pcr-app .pcr-interaction .pcr-clear {
background: #f44250;
}
.pcr-app .pcr-interaction .pcr-clear:focus {
box-shadow: 0 0 0 1px #f1f3f4, 0 0 0 3px rgba(244, 66, 80, 0.75);
}
.pcr-app .pcr-selection {
display: flex;
justify-content: space-between;
flex-grow: 1;
}
.pcr-app .pcr-selection .pcr-picker {
position: absolute;
height: 18px;
width: 18px;
border: 2px solid #fff;
border-radius: 100%;
user-select: none;
cursor: -moz-grab;
cursor: -webkit-grabbing;
}
.pcr-app .pcr-selection .pcr-color-preview {
position: relative;
z-index: 1;
width: 2em;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-right: 0.75em;
}
.pcr-app .pcr-selection .pcr-color-preview:before {
position: absolute;
content: "";
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');
background-size: 0.5em;
border-radius: 0.15em;
z-index: -1;
}
.pcr-app .pcr-selection .pcr-color-preview .pcr-last-color {
cursor: pointer;
transition: background-color 0.3s, box-shadow 0.3s;
border-radius: 0.15em 0.15em 0 0;
z-index: 2;
}
.pcr-app .pcr-selection .pcr-color-preview .pcr-current-color {
border-radius: 0 0 0.15em 0.15em;
}
.pcr-app .pcr-selection .pcr-color-preview .pcr-current-color,
.pcr-app .pcr-selection .pcr-color-preview .pcr-last-color {
background: currentColor;
width: 100%;
height: 50%;
}
.pcr-app .pcr-selection .pcr-color-chooser,
.pcr-app .pcr-selection .pcr-color-opacity,
.pcr-app .pcr-selection .pcr-color-palette {
position: relative;
user-select: none;
display: flex;
flex-direction: column;
}
.pcr-app .pcr-selection .pcr-color-palette {
width: 100%;
z-index: 1;
}
.pcr-app .pcr-selection .pcr-color-palette .pcr-palette {
height: 100%;
border-radius: 0.15em;
}
.pcr-app .pcr-selection .pcr-color-palette .pcr-palette:before {
position: absolute;
content: "";
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');
background-size: 0.5em;
border-radius: 0.15em;
z-index: -1;
}
.pcr-app .pcr-selection .pcr-color-chooser,
.pcr-app .pcr-selection .pcr-color-opacity {
margin-left: 0.75em;
}
.pcr-app .pcr-selection .pcr-color-chooser .pcr-picker,
.pcr-app .pcr-selection .pcr-color-opacity .pcr-picker {
left: 50%;
transform: translateX(-50%);
}
.pcr-app .pcr-selection .pcr-color-chooser .pcr-slider,
.pcr-app .pcr-selection .pcr-color-opacity .pcr-slider {
width: 8px;
height: 100%;
border-radius: 50em;
}
.pcr-app .pcr-selection .pcr-color-chooser .pcr-slider {
background: linear-gradient(180deg, red, #ff0, #0f0, #0ff, #00f, #f0f, red);
}
.pcr-app .pcr-selection .pcr-color-opacity .pcr-slider {
background: linear-gradient(180deg, transparent, #000),
url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');
background-size: 100%, 50%;
}

View File

@@ -1,23 +1,32 @@
/*トゥートボックス向けCSS*/
#post-box {
display: none;
position: fixed;
right: 78px;
bottom: 3px;
background-color: white;
left: calc(50vw - 150px);
top: 50vh;
background-color: var(--postbox);
border: thin solid gray;
z-index: 500;
width: 300px;
min-width:300px;
max-width:100%;
z-index: 501;
max-width: 100%;
padding: 5px;
border-radius: 5px;
overflow: hidden;
}
textarea {
min-height: 100px !important;
font-family: inherit;
}
#post-box .ui-resizable-s, #post-box .ui-resizable-se{
display: none !important;
}
.cancel {
font-size: 0.5rem;
color: gray;
cursor: pointer;
position: absolute;
width: 60px;
right: 0px;
right: 2px;
top: 4px;
}
.more-show {
display: none;
@@ -25,8 +34,6 @@
#drag {
width: 100%;
height: 100px;
background-color: #e0e0e0;
color: black;
}
#post-btn {
display: none;
@@ -37,6 +44,17 @@
#cw-text {
display: none;
}
#sch-box {
display: none;
}
#sch-box input {
width: auto;
}
.picker__close,
.picker__today,
.picker__clear {
color: #26a69a !important;
}
.cw {
display: none;
}
@@ -44,69 +62,83 @@
filter: blur(50px);
}
#emoji {
position: fixed;
bottom: 120px;
right: 20px;
width: 300px;
height: 440px;
z-index: 502;
padding: 5px;
}
#suggest {
max-height: 300px;
overflow-y: scroll;
}
#emoji-list {
width: 100%;
height: calc(100% - 190px);
height: 200px;
overflow-y: scroll;
}
#preview-field {
display: none;
}
#default-emoji a{
color:white;
margin-right:2px;
.preview-img {
width: 50px;
max-height: 100px;
}
.character-counter{
.pi-wrap {
display: inline-block;
width: 50px;
max-height: 100px;
}
#default-emoji a {
color: var(--color);
margin-right: 2px;
}
.character-counter {
position: relative;
top: -25px;
}
/*black theme*/
.blacktheme #post-box {
background-color: #424242;
.trendtag {
overflow-y: scroll;
max-height: 100px;
}
/*indigo theme*/
.indigotheme #post-box {
background-color: #1a237e ;
#toot-btn-field {
display: flex;
}
/*brown theme*/
.browntheme #post-box {
background-color: #4e342e;
#toot-post-btn {
width: calc(100% - 10px);
padding: 0;
margin-top: 10px;
}
/*
.blacktheme #drag {
width: 100%;
height: 100px;
background-color: #004d40;
color: white;
padding: 3px;
#toot-sec-btn {
width: 30px;
padding: 0;
margin-top: 10px;
}
#left-side {
float: left;
overflow-x: hidden;
height: calc(100% - 32px);
}
#right-side {
display: none;
float: left;
width: 300px;
padding: 5px;
overflow-x: hidden;
height: calc(100% - 32px);
}
#posttgl,#toot-post-btn {
background-color: var(--accentbtn);
}
*/
/*mini*/
.mini-post .mize{
display:none !important;
.mini-post .mize {
display: none !important;
}
.mini-post #textarea{
padding:0;
.mini-post #textarea {
padding: 0;
}
.mini-post #post-box{
width:200px;
min-width:100px;
.mini-post #post-box {
width: 200px;
min-width: 100px;
}
.mini-post #toot-field{
padding:0;
.mini-post #toot-field {
padding: 0;
}
.mini-post #toot-btn-field {
padding: 0;
}
.mini-post #toot-btn-field{
padding:0;
}

View File

@@ -1,13 +1,31 @@
.drag-content{
width:300px;
max-width:100%;
height:30px;
text-overflow: ellipsis;
cursor:move;
user-select: none;
background-color:black;
margin:5px;
border-radius:5px;
color:white;
padding:3px;
}
.drag-content {
text-overflow: ellipsis;
cursor: move;
user-select: none;
background-color: var(--modalfooter);
margin: 5px;
border-radius: 5px;
color: var(--color);
padding: 3px;
display: grid;
grid-template-columns: 43px 1fr 60px;
grid-template-areas: "sorticon sorttitle sorttitle" "sorticon sortacct sortaction";
}
.sorticon {
grid-area: sorticon;
}
.sorticon i {
font-size: 43px;
}
.sorttitle {
margin-left: 5px;
grid-area: sorttitle;
}
.sortacct {
margin-left: 5px;
grid-area: sortacct;
}
.sortaction {
margin-left: 5px;
grid-area: sortaction;
}

144
app/css/themes.css Normal file
View File

@@ -0,0 +1,144 @@
:root {
--bg: white;
--drag: rgba(255, 255, 255, 0.8);
--color: black;
--beforehover: #757575;
--modal: white;
--subcolor: #e0e0e0;
--box: white;
--sidebar: #eeeeee;
--shared: #cfd8dc;
--notfbox: white;
--emphasized: #81c784;
--his-data: rgba(255, 255, 255, 0.9);
--active: #e6ee9c;
--postbox: white;
--modalfooter: #fafafa;
--accentbtn: #009688;
--selected: #c0c0c0;
--selectedWithShare: #b2babd;
--gray: #757575;
}
#imagemodal {
background: url("../img/pixel.white.svg");
}
.blacktheme {
--bg: #212121;
--drag: rgba(0, 0, 0, 0.8);
--color: white;
--beforehover: #9e9e9e;
--modal: black;
--subcolor: #212121;
--box: #424242;
--sidebar: #424242;
--shared: #004d40;
--notfbox: #333333;
--emphasized: #4e342e;
--his-data: rgba(0, 0, 0, 0.8);
--active: #757575;
--postbox: #424242;
--modalfooter: #212121;
--accentbtn: #3f51b5;
--selected: #3f3f3f;
--selectedWithShare: #003a30;
--gray: #cccccc;
}
.blacktheme #imagemodal {
background: url("../img/pixel.svg");
}
.indigotheme {
--bg: #031833;
--drag: rgba(0, 0, 0, 0.8);
--color: white;
--beforehover: #9e9e9e;
--modal: #0d1351;
--subcolor: #0d1351;
--shared: #004d40;
--box: #0d1351;
--sidebar: #0d1351;
--notfbox: #0d47a1;
--emphasized: #4e342e;
--his-data: rgba(13, 19, 81, 0.8);
--active: #757575;
--postbox: #1a237e;
--modalfooter: #031833;
--accentbtn: #00acc1;
--selected: #214f8a;
--selectedWithShare: #003a30;
--gray: #cccccc ;
}
.indigotheme #imagemodal {
background: url("../img/pixel.svg");
}
.browntheme {
--bg: #261411;
--drag: rgba(0, 0, 0, 0.8);
--color: white;
--beforehover: #9e9e9e;
--modal: #261411;
--subcolor: #4e342e;
--shared: #004d40;
--box: #4e342e;
--sidebar: #4e342e;
--notfbox: #4e342e;
--emphasized: #0d47a1;
--his-data: rgba(62, 39, 35, 0.8);
--active: #757575;
--postbox: #4e342e;
--modalfooter: #261411;
--accentbtn: #827717;
--selected: #6d352b;
--selectedWithShare: #003a30;
--gray: #cccccc;
}
.browntheme #imagemodal {
background: url("../img/pixel.svg");
}
.greentheme {
--bg: #c8e6c9;
--drag: rgba(255, 255, 255, 0.8);
--color: black;
--beforehover: #757575;
--modal: #81c784;
--subcolor: #a5d6a7;
--box: #81c784;
--sidebar: #c5e1a5;
--shared: #ffcc80;
--notfbox: #a5d6a7;
--emphasized: #9e9d24;
--his-data: rgba(255, 255, 255, 0.9);
--active: #e6ee9c;
--postbox: #a5d6a7;
--modalfooter: #81c784;
--accentbtn: #33691e;
--selected: #78c17a;
--selectedWithShare: #caa266;
--gray: #757575;
}
.greentheme #imagemodal {
background: url("../img/pixel.white.svg");
}
.bluetheme {
--bg: #c9e1ec;
--drag: rgba(255, 255, 255, 0.8);
--color: black;
--beforehover: #757575;
--modal: #b2ebf2;
--subcolor: #90caf9;
--box: #90caf9;
--sidebar: #b6e6f5;
--shared: #e0ffe4;
--notfbox: #90caf9;
--emphasized: #c5e1a5;
--his-data: rgba(255, 255, 255, 0.9);
--active: #b39ddb;
--postbox: #dff1ff;
--modalfooter: #2196f3;
--accentbtn: #2f7bb7;
--selected: #9dcade;
--selectedWithShare: #c1dac4;
--gray: #757575;
}
.bluetheme #imagemodal {
background: url("../img/pixel.white.svg");
}

View File

@@ -1,62 +1,113 @@
/*TL CSS(ただしBBCode pulse:master.css/spin:font-awesome*/
#main{
display:flex;
width:100vw;
#main {
width: 100vw;
height: calc(100vh - 40px);
}
#timeline-container {
overflow-x: scroll;
overflow-y: hidden;
display: flex;
height: 100vh;
flex-grow:4;
height: 100%;
}
#sidebar{
width:75px;
min-width:75px;
height:100vh;
background-color:#e0e0e0;
display:flex;
flex-wrap:wrap;
#bottom {
position: absolute;
bottom: 0;
width: 100vw;
height: 40px;
padding: 3px;
padding-right: 0;
padding-left: 40px;
background-color: var(--sidebar);
display: flex;
justify-content: space-between;
flex-wrap: wrap;
z-index: 500;
box-shadow: 10px 0 10px 10px rgba(0, 0, 0, 0.2);
}
#sidebar-top{
height:calc(100vh - 100px);
display:flex;
flex-wrap:wrap;
align-content:flex-start;
overflow-y:scroll;
#demobottom {
width: 500px;
display: flex;
}
#sidebar-btm{
height:9em;
display:flex;
flex-wrap:wrap;
align-content:flex-end;
#bottom.reverse {
padding-left: 0;
padding-right: 40px;
}
#sidebar div{
width:100%;
vertical-align:text-bottom;
.reverse {
flex-direction: row-reverse;
}
#sidebar a{
color:black;
#bottom #dambox {
width: 300px;
margin-right: 10px;
}
#sidebar .big-menu{
text-align:center;
#bottom.reverse #dambox {
margin-right: 0;
}
#sidebar .big-menu i.big-icon{
font-size:5em;
#bottom .trendtag {
height: 40px;
}
#sidebar .small-menu i{
font-size:2rem;
#bottom #group,
#demogroup {
margin-right: 40px;
}
#sidebar .small-menu .side-label{
font-size:12px;
vertical-align: 0.6rem;
#bottom .leftside {
display: flex;
}
#sidebar .side-dead{
height:30px;
#tips {
display: flex;
align-items: center;
}
iframe {
max-width:100%;
#bottom #tips img {
vertical-align: -3px;
}
#bottom a,
#demogroup a {
color: var(--color);
}
#bottom i {
font-size: 30px;
}
.exc-icons {
font-size: 20px;
}
.exc-chb {
padding-left: 24px !important;
}
.btnsgroup {
border: 1px solid;
padding-top: 1px;
padding-left: 5px;
padding-right: 5px;
margin-right: 15px;
border-radius: 5px;
}
#spot-box {
white-space: nowrap;
text-overflow: ellipsis;
}
#spot-img {
margin-right: 2px;
}
#spot-art {
margin-right: 2px;
margin-left: 2px;
}
.btnsgroup .grouptitle {
font-family: Open Sans;
font-size: 15px;
}
@media screen and (max-width: 890px) {
.btnsgroup .grouptitle {
display: none;
}
#tips,
#tips-menu {
display: none;
}
}
iframe,
.cvo video {
max-width: 100%;
max-height: 300px;
}
@media screen and (max-width: 600px) {
.mobile #timeline-container {
@@ -73,106 +124,262 @@ iframe {
.box {
overflow: hidden;
min-width: 300px;
height: 100vh;
flex: 1;
border-top: none;
display: flex;
flex-direction: column;
margin-bottom: -10px;
}
.img_FTL {
display: none;
}
.bbcode_FTL {
display: none;
}
.marquee {
width: 100%;
padding: 0.5em 0;
overflow: hidden;
margin-bottom: 0;
position: relative;
}
.marquee .bbcode-marq-lateral {
margin: 0;
padding-left: 100%;
display: inline-block;
white-space: nowrap;
animation-name: marquee;
animation-timing-function: linear;
animation-duration: 10s;
animation-iteration-count: infinite;
}
@keyframes marquee {
0% {
-webkit-transform: translate(0);
transform: translate(0);
}
99%,
100% {
-webkit-transform: translate(-100%);
transform: translate(-100%);
}
}
.boxIn {
display: flex;
flex-direction: column;
height: 100%;
border: thin solid gray;
overflow: hidden;
border-top: none;
}
.box .pin,#his-data .pin{
display:none;
.box .pin,
#his-data .pin {
display: none;
}
.user{
cursor:text;
font-size:1.2rem;
.user {
cursor: text;
font-size: 1.1rem;
}
.emojione,.emoji-img{
.emoji,
.emoji-img {
width: 15px;
}
.area-toot .emoji,
.area-toot .emoji-img {
width: 20px;
vertical-align: middle;
margin: -3px 0 0;
margin: -1px 0;
}
.faicon_FTL{
display:none;
.bigemoji {
width: 60px !important;
}
.faicon_FTL {
display: none;
}
.tl-box {
position: relative;
flex: 1;
overflow-y: scroll;
overflow-x: hidden;
}
.tl-box{ height:calc(100% - 40px); overflow-y:scroll; overflow-x:hidden }
.additional {
overflow-x: scroll;
width: 100%;
}
.media-filter .nomedia{
display:none;
.media-filter .nomedia {
display: none;
}
.bt-filter .shared {
display: none;
}
.except-bt-filter .unshared {
display: none;
}
.cvo {
user-select: text;
padding-left: 5px;
border-bottom: 0.5px solid;
padding-right: 2px;
word-break: break-all;
word-break: break-word;
width: 100%;
display: grid;
grid-template-columns: 43px 2fr 1fr;
grid-template-areas: 'notice notice notice' 'icon display_name acct' 'icon toot toot' 'vis additional additional' 'actions actions actions';
grid-template-rows: auto 1.6rem 1fr auto 2.5rem;
grid-template-areas: "notice notice notice" "icon display_name display_name" "space toot toot" "space additional additional" "vis actions side";
}
.cvo h1,
.cvo h2,
.cvo h3,
.cvo h4,
.cvo h5,
.cvo h6 {
margin: 0;
}
.area-notice {
margin:2px;
grid-area: notice;
margin: 2px;
grid-area: notice;
}
.area-icon {
width:40px;
margin:2px;
grid-area: icon;
width: 40px;
margin: 2px;
grid-area: icon;
}
.area-display_name {
user-select: auto;
height:1.5em;
margin:2px;
overflow:hidden;
grid-area: display_name;
white-space: nowrap;
text-overflow: ellipsis;
user-select: text;
height: 1.5em;
margin: 2px;
margin-left: 5px;
overflow: hidden;
grid-area: display_name;
white-space: nowrap;
text-overflow: ellipsis;
display: flex;
justify-content: space-between;
width: 100%;
flex-wrap: nowrap;
}
.area-acct {
margin:2px;
grid-area: acct;
overflow:hidden;
text-align:right;
white-space: nowrap;
text-overflow: ellipsis;
.flex-name {
max-width: calc(100% - 60px);
overflow: hidden;
text-overflow: ellipsis;
}
.area-toot {
cursor:text;
cursor: text;
user-select: auto;
margin:2px;
grid-area: toot;
margin-top: 5px;
margin-bottom: 5px;
margin-left: 5px;
grid-area: toot;
}
.area-date_via {
text-align:right;
text-align: right;
grid-area: date_via;
}
.area-additional {
cursor:text;
cursor: text;
user-select: auto;
grid-area: additional;
}
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.acct-note p {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.area-toot.acct-note p:not(:first-child) {
display: none;
}
.area-toot.acct-note p:first-child:after {
content: "...";
color: var(--gray);
}
.area-actions {
margin:2px;
grid-area: actions;
padding: 0;
margin: 0;
top: -5px;
position: relative;
display: flex;
justify-content: space-around;
max-width: 100%;
grid-area: actions;
}
.area-vis {
margin:2px;
font-size:0.5rem !important;
margin: 2px;
grid-area: vis;
}
.action i{
font-size:1rem;
text-align: center;
}
.area-side {
display: flex;
top: -5px;
position: relative;
justify-content: flex-end;
margin: 2px;
grid-area: side;
}
.quote-inline {
display: none;
}
.quote-renote {
display: grid;
grid-template-columns: 43px 2fr 25px;
grid-template-areas: "ricon ruser rdet" "ricon rtext rdet";
border: 1px solid;
margin-top: 3px;
padding: 1px;
border-radius: 3px;
}
.renote-icon {
grid-area: ricon;
padding: 5px;
}
.renote-details {
grid-area: rdet;
}
.renote-icon img {
width: 100%;
}
.renote-user {
grid-area: ruser;
}
.renote-text {
grid-area: rtext;
}
.btn-flat {
color: var(--color);
}
.area-side i {
margin-left: 10px;
}
.viabadge {
margin-top: 10px;
}
.action i {
font-size: 1.2rem;
margin-right: 2px;
}
.action .fa-quote-right {
margin-top: 2px;
}
.actct {
color: var(--beforehover);
}
.actct:hover {
color: var(--color);
transition: 0.5s;
}
.gray {
color: gray;
color: var(--gray);
}
.sml {
font-size: 0.8em;
@@ -191,7 +398,7 @@ font-size:1rem;
.cbadge {
display: inline-block;
min-width: 10px;
max-width:100px;
max-width: 100px;
padding: 3px 7px;
font-size: 0.8em;
margin-right: 5px;
@@ -205,39 +412,50 @@ font-size:1rem;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
height:calc(0.8em + 8px);
height: calc(0.8em + 8px);
user-select: none;
}
.cbadge-hover {
color: var(--color);
background-color: transparent;
}
.cbadge-hover:hover {
color: #fff;
background-color: #777;
}
p {
margin: 0;
margin-bottom: 0px;
line-height: 20px;
}
p:not(:last-child){
p:not(:last-child) {
margin-bottom: 10px;
}
.shared {
background-color: #cfd8dc;
background-color: var(--shared);
}
.emphasized {
background-color: #81c784;
background-color: var(--emphasized);
}
.udg {
cursor: pointer;
}
.notice-box {
top: 0;
background-color:white;
background-color: var(--notfbox);
filter: brightness(110%);
position: relative;
margin-right: 10px;
width:100%;
min-height:60px;
z-index:500;
padding:5px;
width: 100%;
min-height: 60px;
z-index: 500;
padding: 5px;
display: grid;
grid-template-columns: 40px 1fr 1fr 1fr;
grid-template-columns: 40px 1fr 1fr 24px;
grid-template-rows: 30px 30px;
grid-template-areas: 'notice notice_name notice_name notice_name' 'notice a1 a2 a3' 'notf-box notf-box notf-box notf-box';
grid-template-areas: "notice notice_name notice_name a2" "notice a1 sta a3" "notf-box notf-box notf-box notf-box";
}
.emp{
.emp {
font-weight: bold;
text-decoration: underline;
}
@@ -248,6 +466,9 @@ p:not(:last-child){
.area-notice_name {
grid-area: notice_name;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.area-notice_acct {
@@ -255,10 +476,12 @@ p:not(:last-child){
}
.area-a1 {
text-align: center;
grid-area: a1;
}
.area-sta {
text-align: center;
grid-area: sta;
}
.area-a2 {
text-align: center;
grid-area: a2;
@@ -288,7 +511,7 @@ p:not(:last-child){
.notf-box {
position: fixed;
right: 70px;
background-color: white;
background-color: var(--box);
border: thin solid gray;
z-index: 501;
width: 400px;
@@ -296,73 +519,213 @@ p:not(:last-child){
min-height: 100px;
max-height: 500px;
}
.column-hide {
display: none;
overflow: hidden;
height: 0;
}
.prof-img {
border-radius: 3px;
}
.notf-icon {
position: relative;
top: -20px;
width: 20px;
left: 20px;
}
.notf-indv-box {
width:100%;
min-height: 100px;
width: 100%;
max-height: 400px;
overflow-y: scroll;
overflow-x: hidden;
border: thin solid gray;
border-bottom: 2px solid white;
grid-area: notf-box;
box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),
0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3),
0px -10px 10px 0px rgba(0, 0, 0, 0.3) inset;
}
#src-contents {
min-height: 100px;
max-height: 190px;
.type-b {
display: none;
}
.modal-footer {
background-color: var(--box);
}
.ballons {
background-color: var(--box);
position: absolute;
bottom: 0px;
right: 0px;
}
.toot a span.ellipsis:after {
content: "...";
}
.toot a:not(.mention) span:last-of-type {
/*display: none;*/
}
.tl-box .via-hide {
display: none;
}
.vote {
width: 100%;
border: 1px solid;
margin-top: 3px;
padding: 1px;
border-radius: 3px;
}
.fa-2x > .emoji-img {
width: 36px !important;
height: 36px !important;
}
.fa-3x > .emoji-img {
width: 54px !important;
height: 54px !important;
}
.fa-4x > .emoji-img {
width: 72px !important;
height: 72px !important;
}
.fa-5x > .emoji-img {
width: 90px !important;
height: 90px !important;
}
#lists-user {
overflow-y: scroll;
overflow-x: hidden;
max-height: 200px;
}
.mention {
color: black;
cursor: text;
.votebtn {
border: 1px solid;
color: var(--bg);
background-color: var(--beforehover);
cursor: pointer;
width: 50px;
padding: 2px;
display: inline-block;
text-align: center;
margin-top: 5px;
border-radius: 10px;
transition-duration: 0.5s;
}
.type-b{
display:none;
.votebtn:hover {
background-color: var(--color);
}
.jump {
display: inline-block;
animation: jump 0.75s linear infinite;
}
.img-link {
position: relative;
display: block;
margin-right: 1px;
float: left;
overflow: hidden;
}
.nsfw-media {
position: absolute;
top: 0;
right: 0;
background-color: black;
color: white;
}
.img-link img {
display: block;
width: 100%;
height: 100%;
}
.shared.selectedToot {
background-color: var(--selectedWithShare);
}
.selectedToot {
background-color: var(--selected);
}
audio {
height: 2rem;
}
.translate {
white-space: normal;
}
.cw_btn {
margin: 3px;
background-color: var(--emphasized);
color: var(--color);
padding-left: 3px;
padding-right: 3px;
border-radius: 3px;
border: 1px solid var(--color);
}
.vis-data {
font-size: 1rem !important;
margin: 5px;
user-select: none;
}
@keyframes jump {
0% {
transform: translateY(0);
}
25% {
transform: translateY(-16px);
}
50% {
transform: translateY(0);
}
75% {
transform: translateY(-8px);
}
100% {
transform: translateY(0);
}
}
@keyframes fadeInDown {
from {
opacity: 0;
-webkit-transform: translate3d(0, -100%, 0);
transform: translate3d(0, -100%, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}
@keyframes fadeInLeft {
from {
opacity: 0;
-webkit-transform: translate3d(-100%, 0, 0);
transform: translate3d(-100%, 0, 0);
}
to {
opacity: 1;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}
.box-anime {
/*animation-duration: 1s;
animation-name: fadeInLeft;*/
}
/*black theme*/
.blacktheme .notf-box,.blacktheme .modal-footer,.blacktheme #sidebar {
background-color: #424242;
.cvo-anime {
animation-duration: 0.1s;
animation-name: fadeInDown;
}
.blacktheme .btn-flat,.blacktheme .mention ,.blacktheme #sidebar a {
color: white
.urbadge {
line-height: normal;
height: 2rem;
font-size: 1rem;
background-color: #009688;
}
.blacktheme .shared {
background-color: #004d40;
.box .ui-resizable-s {
display: none !important;
}
.blacktheme .notice-box {
background-color: #333333;
.boxIn .ui-resizable-e {
display: none !important;
}
.blacktheme .emphasized {
background-color: #4e342e;
.boxIn .ui-resizable-s {
display: block !important;
}
/*indigo theme*/
.indigotheme .notf-box,.indigotheme .modal-footer,.indigotheme #sidebar {
background-color: #0d1351;
.box .ui-resizable-se {
display: none !important;
}
.indigotheme .btn-flat,.indigotheme .mention ,.indigotheme #sidebar a {
color: white
}
.indigotheme .shared {
background-color: #004d40;
}
.indigotheme .notice-box {
background-color: #0d47a1;
}
.indigotheme .emphasized {
background-color: #4e342e;
}
/*brown theme*/
.browntheme .notf-box,.browntheme .modal-footer,.browntheme #sidebar {
background-color: #4e342e;
}
.browntheme .btn-flat,.browntheme .mention ,.browntheme #sidebar a {
color: white
}
.browntheme .shared {
background-color: #004d40;
}
.browntheme .notice-box {
background-color: #4e342e;
}
.browntheme .emphasized {
background-color: #0d47a1;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,58 +1,126 @@
/*アイコンをクリックした時とかにでてくるユーザーデータ*/
#his-data {
background-repeat: no-repeat;
background-image: url('/img/loading.svg');
background-image: url("../../loading.svg");
overflow-y: hidden;
}
#his-data-content {
display: flex;
justify-content: center;
}
#his-name {
font-size: 1.5rem;
}
#his-prof {
float: left;
width: 100px;
margin-right: 5px;
}
.his-float {
float: left;
width: calc(50% - 50px);
height: 122px;
overflow-y: scroll;
padding: 5px;
}
#his-float-data {
height: 100%;
}
#his-leftside {
width: 500px;
}
#his-float-timeline {
max-width: 775px;
height: 100%;
overflow-y: hidden;
}
#his-basic-prof {
min-height: 130px;
}
#his-matching-list {
overflow-y: scroll;
overflow-x: hidden;
}
#his-field {
vertical-align: baseline;
text-align: center;
padding: 0;
}
#his-field tr {
height: 1.5rem;
}
.his-field-title {
height: 1.5rem;
padding: 0;
background-color: #757575;
text-align: center;
padding: 5px;
margin-bottom: 1px;
width: 30%;
}
.his-field-content {
height: 1.5rem;
padding: 0;
padding-left: 5px;
}
#his-data a span.ellipsis:after {
content: "...";
}
#his-data a:not(.mention) span:last-of-type {
display: none;
}
#his-data a .rep_ct,
#his-data a .rt_ct,
#his-data a .fav_ct {
display: inline !important;
}
#his-data-show {
margin: 50px;
background-color:rgba(255, 255, 255, 0.9);
width: calc(100% - 50px);
height: calc(100% - 50px);
margin: 20px;
margin-left: 50px;
margin-right: 50px;
background-color: var(--his-data);
height: calc(100% - 20px);
margin-bottom: 0;
padding: 5px;
}
.tab-content {
#his-data-wrap {
display: flex;
}
.his-var-content {
overflow-y: scroll;
height: calc(100% - 240px)
overflow-x: hidden;
height: calc(100% - 45px);
}
.my-data-width {
width: 11.11%;
#my-data-nav .btn {
width: 140px;
}
.active-back{
background-color: #e6ee9c;
.active-back {
background-color: var(--active);
}
/*black theme*/
.blacktheme #his-data-show {
background-color: rgba(0, 0, 0, 0.8);
#his-name .emojione,
#his-name .emoji-img {
width: 20px;
}
.blacktheme .active-back{
background-color:#757575;
#his-plus-action .btn {
width: 170px;
}
/*indigo theme*/
.indigotheme #his-data-show {
background-color: rgba(13, 19, 81,0.8);
.tabs {
display: flex;
}
.indigotheme .active-back{
background-color:#757575;
.tabs .tab a {
padding: 8px 12px;
}
/*brown theme*/
.browntheme #his-data-show {
background-color: rgba(62, 39, 35,0.8);
#his-des .mention {
color: #039be5;
cursor: pointer;
}
.browntheme .active-back{
background-color:#757575;
#his-float-blocked {
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
height: 100%;
}
#hisdropdown{
background-color: var(--bg);
}
#hisdropdown li:hover{
background-color: var(--active);
}

Binary file not shown.

View File

@@ -0,0 +1,4 @@
directories:
output: dist
buildResources: build
electronVersion: 1.4.13

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
app/icon.icns Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 11 KiB

35
app/img/desk.svg Normal file
View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 4096 4096" style="enable-background:new 0 0 4096 4096;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{fill:#FFFFFF;}
.st2{fill:#545251;stroke:#040000;stroke-miterlimit:10;}
.st3{fill:#F0842E;}
.st4{fill:#364C9F;}
.st5{fill:#FFFFFF;stroke:#040000;stroke-miterlimit:10;}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:#040000;}
.st7{fill-rule:evenodd;clip-rule:evenodd;fill:none;}
</style>
<g id="レイヤー_1" class="st0">
</g>
<g id="レイヤー_2">
<polyline class="st1" points="1128.5,650.67 3378,1950 3378,2137 1128.5,3432.67 "/>
<rect x="678.5" y="128.48" class="st2" width="450" height="3821.5"/>
<rect x="1915.71" y="-583.55" transform="matrix(0.5 -0.866 0.866 0.5 225.753 2341.5386)" class="st3" width="450" height="3117.62"/>
<rect x="1915.5" y="1555.41" transform="matrix(0.5 0.866 -0.866 0.5 3762.031 -299.6245)" class="st4" width="450" height="3105.58"/>
<path class="st5" d="M714.5,2953.5"/>
<path id="path1891" class="st6" d="M1592.47,2584h456.47c0-64.89-4.63-77.76-112.1-77.76c17.17-51.5,86.95-176.11,125.73-176.11
c34.31,0,75.24,1.89,75.24,80.17c0,88.87,149.56,232.16,185.82,173.7c54.04-87.12-92.91-60.55-92.91-270.65
c0-287.43,167.74-246.51,167.74-407.99c0-80.79-22.32-91.7-22.32-149.46c0-76.34,67.25-71.91,54.17-135.2
c-9.04-43.72-16.11-78.78-21.38-131.65c-3.74-37.51-4.93-77.5-43.9-75.89c-45.78,1.89-63.15,82.47-134.31,88.25
c-71.02,5.77-131.57-60.46-159.06-51c-27.25,9.38-18.68,83.32-2.52,135.83c25.4,82.54,80.79,189.86-20.2,206.02
c-100.99,16.16-274.69,32.32-399.92,197.94s-120.6,359.99-169.66,420.11C1314.72,2612.08,1146,2529.23,1146,2697.11
c0,75.16,127.35,129.27,147.55,105.03c20.2-24.24-171.62-96.46,43.01-181.78C1519.91,2547.46,1536.28,2532.58,1592.47,2584z"/>
<rect class="st7" width="4096" height="4096"/>
<path class="st1" d="M-58,1122"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,122 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="7.11022in" height="7.11022in"
viewBox="0 0 512 512">
<path id="選択範囲 #1"
fill="white" stroke="white" stroke-width="1"
d="M 96.00,16.00
C 99.85,16.01 102.39,15.12 104.00,19.00
104.00,19.00 97.00,19.00 97.00,19.00
97.00,19.00 108.00,22.07 108.00,22.07
108.00,22.07 144.00,43.08 144.00,43.08
144.00,43.08 181.83,64.31 181.83,64.31
181.83,64.31 223.00,88.26 223.00,88.26
223.00,88.26 247.00,102.22 247.00,102.22
247.00,102.22 257.00,107.00 257.00,107.00
260.09,110.36 266.43,114.39 271.00,115.00
271.00,115.00 298.00,133.00 298.00,133.00
298.00,133.00 300.00,132.00 300.00,132.00
300.00,132.00 312.00,141.00 312.00,141.00
312.00,141.00 314.00,140.00 314.00,140.00
318.40,144.39 334.83,152.80 341.00,156.45
341.00,156.45 404.00,192.94 404.00,192.94
404.00,192.94 425.67,205.63 425.67,205.63
428.70,208.64 426.87,211.86 425.12,215.00
425.12,215.00 412.26,237.00 412.26,237.00
410.65,240.07 409.02,245.62 404.90,245.68
401.70,245.72 396.83,242.47 394.00,240.87
394.00,240.87 370.00,226.89 370.00,226.89
370.00,226.89 282.00,176.51 282.00,176.51
282.00,176.51 271.00,169.52 271.00,169.52
271.00,169.52 261.00,164.31 261.00,164.31
257.45,162.08 251.05,157.46 247.00,157.00
247.00,157.00 234.00,148.55 234.00,148.55
234.00,148.55 208.17,133.78 208.17,133.78
208.17,133.78 190.00,124.00 190.00,124.00
190.00,124.00 163.00,107.60 163.00,107.60
163.00,107.60 103.00,73.00 103.00,73.00
103.00,73.00 103.00,453.00 103.00,453.00
103.00,453.00 127.00,439.42 127.00,439.42
127.00,439.42 170.00,414.58 170.00,414.58
170.00,414.58 237.17,376.24 237.17,376.24
237.17,376.24 256.00,364.59 256.00,364.59
256.00,364.59 264.00,360.53 264.00,360.53
264.00,360.53 285.00,348.20 285.00,348.20
285.00,348.20 292.99,344.12 292.99,344.12
292.99,344.12 299.28,339.83 299.28,339.83
299.28,339.83 320.00,328.41 320.00,328.41
320.00,328.41 362.00,304.05 362.00,304.05
362.00,304.05 371.91,297.68 371.91,297.68
371.91,297.68 379.04,294.41 379.04,294.41
379.04,294.41 410.00,276.00 410.00,276.00
410.00,276.00 416.00,285.00 416.00,285.00
416.81,288.83 421.21,296.21 424.00,299.00
424.00,299.00 423.00,301.00 423.00,301.00
427.24,303.72 430.62,312.17 432.00,317.00
432.00,317.00 388.00,342.67 388.00,342.67
388.00,342.67 317.00,383.55 317.00,383.55
317.00,383.55 279.00,405.32 279.00,405.32
279.00,405.32 264.00,415.00 264.00,415.00
264.00,415.00 262.00,414.00 262.00,414.00
262.00,414.00 250.00,423.00 250.00,423.00
250.00,423.00 248.00,422.00 248.00,422.00
248.00,422.00 238.00,428.92 238.00,428.92
238.00,428.92 218.00,440.67 218.00,440.67
218.00,440.67 207.00,448.00 207.00,448.00
207.00,448.00 193.00,455.18 193.00,455.18
193.00,455.18 176.00,465.08 176.00,465.08
176.00,465.08 166.09,470.31 166.09,470.31
166.09,470.31 137.00,487.31 137.00,487.31
137.00,487.31 103.00,506.00 103.00,506.00
103.00,506.00 104.00,509.00 104.00,509.00
104.00,509.00 57.00,509.00 57.00,509.00
57.00,509.00 57.00,16.00 57.00,16.00
57.00,16.00 96.00,16.00 96.00,16.00 Z
M 102.00,72.00
C 102.00,72.00 103.00,73.00 103.00,73.00
103.00,73.00 103.00,72.00 103.00,72.00
103.00,72.00 102.00,72.00 102.00,72.00 Z
M 261.00,190.61
C 270.30,188.63 274.03,177.15 280.77,179.78
284.36,181.18 284.28,187.65 284.72,191.00
285.35,195.85 287.64,207.99 286.57,212.00
285.51,216.00 282.42,218.30 280.78,222.00
277.54,229.29 282.79,236.85 282.99,245.00
283.38,261.24 274.02,264.52 266.36,276.00
261.36,283.50 258.58,297.05 259.09,306.00
259.91,320.41 263.09,322.38 271.02,333.00
273.09,335.77 275.09,339.39 272.11,342.37
269.94,344.63 266.39,343.51 264.00,342.37
258.40,339.52 252.76,332.51 249.91,327.00
246.61,320.60 248.26,314.37 244.57,310.23
240.72,305.90 235.19,306.50 231.18,310.23
225.69,315.34 221.16,325.22 218.00,332.00
226.04,333.96 232.79,331.61 234.00,342.00
234.00,342.00 175.00,342.00 175.00,342.00
166.62,341.85 166.77,339.11 162.00,338.56
158.39,338.15 148.72,341.68 145.00,343.05
138.31,345.53 120.54,352.22 119.64,360.00
119.01,365.49 125.06,367.91 127.00,374.00
115.41,373.03 104.20,364.93 108.88,352.00
111.36,345.12 117.06,343.57 123.00,340.75
132.86,336.05 141.94,332.38 149.58,323.96
151.40,321.95 154.62,318.26 155.92,316.00
155.92,316.00 166.03,283.00 166.03,283.00
169.87,271.08 179.16,256.26 189.00,248.52
199.37,240.36 208.38,237.36 221.00,234.66
226.45,233.50 237.77,232.36 240.99,227.79
244.55,222.75 241.98,216.26 240.34,211.00
237.46,201.77 234.64,193.69 237.00,184.00
244.82,185.47 252.94,192.32 261.00,190.61 Z
M 102.00,453.00
C 102.00,453.00 103.00,454.00 103.00,454.00
103.00,454.00 103.00,453.00 103.00,453.00
103.00,453.00 102.00,453.00 102.00,453.00 Z
M 102.00,505.00
C 102.00,505.00 103.00,506.00 103.00,506.00
103.00,506.00 103.00,505.00 103.00,505.00
103.00,505.00 102.00,505.00 102.00,505.00 Z" />
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 4096 4096" style="enable-background:new 0 0 4096 4096;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{fill:none;}
.st2{fill:#FFFFFF;}
.st3{fill:#FFFFFF;}
.st4{fill:#FFFFFF;}
.st5{fill:#none;}
.st6{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st7{fill-rule:evenodd;clip-rule:evenodd;fill:none;}
</style>
<g id="レイヤー_1" class="st0">
</g>
<g id="レイヤー_2">
<polyline class="st1" points="1128.5,650.67 3378,1950 3378,2137 1128.5,3432.67 "/>
<rect x="678.5" y="128.48" class="st2" width="450" height="3821.5"/>
<rect x="1915.71" y="-583.55" transform="matrix(0.5 -0.866 0.866 0.5 225.753 2341.5386)" class="st3" width="450" height="3117.62"/>
<rect x="1915.5" y="1555.41" transform="matrix(0.5 0.866 -0.866 0.5 3762.031 -299.6245)" class="st4" width="450" height="3105.58"/>
<path class="st5" d="M714.5,2953.5"/>
<path id="path1891" class="st6" d="M1592.47,2584h456.47c0-64.89-4.63-77.76-112.1-77.76c17.17-51.5,86.95-176.11,125.73-176.11
c34.31,0,75.24,1.89,75.24,80.17c0,88.87,149.56,232.16,185.82,173.7c54.04-87.12-92.91-60.55-92.91-270.65
c0-287.43,167.74-246.51,167.74-407.99c0-80.79-22.32-91.7-22.32-149.46c0-76.34,67.25-71.91,54.17-135.2
c-9.04-43.72-16.11-78.78-21.38-131.65c-3.74-37.51-4.93-77.5-43.9-75.89c-45.78,1.89-63.15,82.47-134.31,88.25
c-71.02,5.77-131.57-60.46-159.06-51c-27.25,9.38-18.68,83.32-2.52,135.83c25.4,82.54,80.79,189.86-20.2,206.02
c-100.99,16.16-274.69,32.32-399.92,197.94s-120.6,359.99-169.66,420.11C1314.72,2612.08,1146,2529.23,1146,2697.11
c0,75.16,127.35,129.27,147.55,105.03c20.2-24.24-171.62-96.46,43.01-181.78C1519.91,2547.46,1536.28,2532.58,1592.47,2584z"/>
<rect class="st7" width="4096" height="4096"/>
<path class="st1" d="M-58,1122"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
app/img/kyash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 B

11
app/img/pixel.svg Normal file
View File

@@ -0,0 +1,11 @@
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<pattern id="pp" x="0" y="0" width="30" height="30" patternUnits="userSpaceOnUse">
<rect x="0" y="0" width="15" height="15" fill="#616161" />
<rect x="0" y="15" width="15" height="15" fill="#000000" />
<rect x="15" y="15" width="15" height="15" fill="#616161" />
<rect x="15" y="0" width="15" height="15" fill="#000000" />
</pattern>
</defs>
<rect width="300" height="300" fill="url(#pp)" />
</svg>

After

Width:  |  Height:  |  Size: 503 B

11
app/img/pixel.white.svg Normal file
View File

@@ -0,0 +1,11 @@
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<pattern id="pp" x="0" y="0" width="30" height="30" patternUnits="userSpaceOnUse">
<rect x="0" y="0" width="15" height="15" fill="#e0e0e0" />
<rect x="0" y="15" width="15" height="15" fill="#ffffff" />
<rect x="15" y="15" width="15" height="15" fill="#e0e0e0" />
<rect x="15" y="0" width="15" height="15" fill="#ffffff" />
</pattern>
</defs>
<rect width="300" height="300" fill="url(#pp)" />
</svg>

After

Width:  |  Height:  |  Size: 503 B

132
app/img/thinking.svg Normal file
View File

@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 4096 4096" style="enable-background:new 0 0 4096 4096;" xml:space="preserve">
<style type="text/css">
.st0{fill:#040000;}
.st1{fill:#040000;stroke:#040000;stroke-miterlimit:10;}
.st2{clip-path:url(#SVGID_2_);}
.st3{clip-path:url(#SVGID_4_);}
.st4{fill:none;}
.st5{fill:#FFFFFF;}
.st6{fill:#545251;stroke:#040000;stroke-miterlimit:10;}
.st7{fill:#F0842E;}
.st8{fill:#3D4FA0;}
.st9{fill:#63451F;stroke:#FFFFFF;stroke-width:20;stroke-miterlimit:10;}
.st10{fill:#63451F;}
</style>
<g id="DrawBlack">
<polyline id="BG_1_" class="st0" points="1128.5,650.67 3378,1950 3378,2137 1128.5,3432.67 "/>
<rect id="Left_1_" x="678.5" y="128.48" class="st1" width="450" height="3821.5"/>
<rect id="Top_1_" x="1915.71" y="-583.55" transform="matrix(0.5 -0.866 0.866 0.5 225.753 2341.5386)" class="st0" width="450" height="3117.62"/>
<g id="Finger_1_">
<g>
<defs>
<rect id="SVGID_1_" x="-626.54" y="666.18" transform="matrix(0.9063 -0.4226 0.4226 0.9063 -723.8983 1097.2598)" width="5478.6" height="3030.2"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="g14_3_" class="st2">
<g id="g44_1_" transform="translate(17.2764,0.8682)">
<path id="path46_1_" class="st0" d="M2605.11,3533.86c0,0,159.85-112.71,149-195.05c-10.68-85.2-127.58-48.89-127.58-48.89
s136.18-82.82,112.7-180.35c-22.17-91.83-167.38-48.54-167.38-48.54s119.56-92.9,85.39-182.75
c-28.87-75.6-188.03-44.94-188.03-44.94s651.47-417.09,718.51-459.5c66.86-42.42,160.29-131.95,87.28-198.12
c-72.76-66.37-205.83-7.85-269.88,32.69c-64.01,40.62-874.42,553.28-1153.93,730.24c-29.84,18.84-169.66,107.16-186.59,118.03
c-69.96,44.42-112.22,42.02-74.07-13.01c51.14-73.63,74.73-139.7,55.45-222.1c-20.44-86.69-114.31-161.6-159.65-186.44
c-84.35-46.21-197.27-61.16-306.71-33.34c-170.83,43.44-256.98,149.65-157.15,218.26c149.29,102.66,148.88,244.02,37.82,381.07
c-261.05,322.06-363.57,512.7-142.28,713.95c241.24,219.53,812.72,166.75,1276.35-126.35
C2218.92,3773.38,2605.11,3533.86,2605.11,3533.86"/>
</g>
</g>
</g>
</g>
<g id="Eyes_1_">
<g>
<defs>
<rect id="SVGID_3_" x="95.01" y="544.01" width="3526.99" height="3526.99"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<g id="g14_2_" class="st3">
<g id="g24_1_" transform="translate(15.4063,25.5)">
<path id="path26_1_" class="st0" d="M1588.99,1547.21c0,135.3-87.78,244.93-195.94,244.93
c-108.16,0-195.94-109.63-195.94-244.93c0-135.2,87.78-244.93,195.94-244.93C1501.21,1302.28,1588.99,1412.01,1588.99,1547.21"
/>
</g>
<g id="g32_1_" transform="translate(9.6709,29.667)">
<path id="path34_1_" class="st0" d="M1032.82,1134.8c-16.07-8.52-29.69-21.85-38.31-38.99c-21.16-42.03-3.92-90.82,38.5-109.04
c417.95-179.29,754.29-4.21,768.39,3.33c42.42,22.63,59.57,73.28,38.31,113.06c-21.16,39.68-72.5,53.49-114.92,31.16
c-12.05-6.27-277.46-140.3-615.07,4.6C1084.54,1149.59,1056.13,1147.24,1032.82,1134.8"/>
</g>
<g id="g36_1_" transform="translate(14.7427,16.4277)">
<path id="path38_1_" class="st0" d="M1524.64,2445.12c-13.32-12.44-23.12-28.71-27.04-47.61c-9.7-45.95,19.4-88.76,65.15-95.42
c449.89-66.43,730.09,188.99,741.94,199.86c35.27,32.72,38.7,85.92,8.03,119.04c-30.57,32.92-83.77,33.11-118.94,0.59
c-10.19-9.01-232.39-206.52-595.87-152.93C1570.78,2472.65,1543.94,2463.15,1524.64,2445.12"/>
</g>
<g id="g40_1_" transform="translate(20.4307,25.917)">
<path id="path42_1_" class="st0" d="M2076.21,1505.94c-15.28-9.6-28.02-23.81-35.47-41.54c-18.32-43.3,2.25-90.92,45.75-106.2
c429.22-150.48,752.91,47.03,766.53,55.55c40.66,25.47,54.28,77.1,30.47,115.41c-23.71,38.21-76.03,48.5-116.68,23.32
c-11.76-7.15-267.27-158.81-613.99-37.23C2126.96,1524.26,2098.75,1519.95,2076.21,1505.94"/>
</g>
<g id="g28_1_" transform="translate(26,24.5)">
<path id="path30_1_" class="st0" d="M2616.28,1646.19c0,135.3-87.69,244.93-195.94,244.93
c-108.16,0-195.94-109.63-195.94-244.93c0-135.2,87.78-244.93,195.94-244.93C2528.6,1401.26,2616.28,1510.99,2616.28,1646.19"
/>
</g>
</g>
</g>
</g>
</g>
<g id="Path">
<path id="CutLine" class="st4" d="M528,128C532-14,669,0,669,0h346l2629,1464c0,0,78,34,28,108s-217,359-217,359s-22,9,9,226
s-204,313-204,313l-545,356c0,0,421.37,492.67,29.68,732.33S1798,4056,1798,4056s28.13,15-290.94,15s-828.56,0-828.56,0
S531,4102,528,3904S528,128,528,128z"/>
</g>
<g id="Draw">
<polyline id="BG" class="st5" points="1128.5,650.67 3378,1950 3378,2137 1128.5,3432.67 "/>
<rect id="Left" x="678.5" y="128.48" class="st6" width="450" height="3821.5"/>
<rect id="Top" x="1915.71" y="-583.55" transform="matrix(0.5 -0.866 0.866 0.5 225.753 2341.5386)" class="st7" width="450" height="3117.62"/>
<g id="Finger">
<g id="g44" transform="translate(17.2764,0.8682)">
<path id="path46" class="st8" d="M2605.11,3533.86c0,0,159.85-112.71,149-195.05c-10.68-85.2-127.58-48.89-127.58-48.89
s136.18-82.82,112.7-180.35c-22.17-91.83-167.38-48.54-167.38-48.54s119.56-92.9,85.39-182.75
c-28.87-75.6-188.03-44.94-188.03-44.94s651.47-417.09,718.51-459.5c66.86-42.42,160.29-131.95,87.28-198.12
c-72.76-66.37-205.83-7.85-269.88,32.69c-64.01,40.62-874.42,553.28-1153.93,730.24c-29.84,18.84-169.66,107.16-186.59,118.03
c-69.96,44.42-112.22,42.02-74.07-13.01c51.14-73.63,74.73-139.7,55.45-222.1c-20.44-86.69-114.31-161.6-159.65-186.44
c-84.35-46.21-197.27-61.16-306.71-33.34c-170.83,43.44-256.98,149.65-157.15,218.26c149.29,102.66,148.88,244.02,37.82,381.07
c-261.05,322.06-363.57,512.7-142.28,713.95c241.24,219.53,812.72,166.75,1276.35-126.35
C2218.92,3773.38,2605.11,3533.86,2605.11,3533.86"/>
</g>
</g>
<g id="Eyes">
<g id="g24" transform="translate(15.4063,25.5)">
<path id="path26" class="st9" d="M1588.99,1547.21c0,135.3-87.78,244.93-195.94,244.93c-108.16,0-195.94-109.63-195.94-244.93
c0-135.2,87.78-244.93,195.94-244.93C1501.21,1302.28,1588.99,1412.01,1588.99,1547.21"/>
</g>
<g id="g32" transform="translate(9.6709,29.667)">
<path id="path34" class="st9" d="M1032.82,1134.8c-16.07-8.52-29.69-21.85-38.31-38.99c-21.16-42.03-3.92-90.82,38.5-109.04
c417.95-179.29,754.29-4.21,768.39,3.33c42.42,22.63,59.57,73.28,38.31,113.06c-21.16,39.68-72.5,53.49-114.92,31.16
c-12.05-6.27-277.46-140.3-615.07,4.6C1084.54,1149.59,1056.13,1147.24,1032.82,1134.8"/>
</g>
<g id="g36" transform="translate(14.7427,16.4277)">
<path id="path38" class="st9" d="M1524.64,2445.12c-13.32-12.44-23.12-28.71-27.04-47.61c-9.7-45.95,19.4-88.76,65.15-95.42
c449.89-66.43,730.09,188.99,741.94,199.86c35.27,32.72,38.7,85.92,8.03,119.04c-30.57,32.92-83.77,33.11-118.94,0.59
c-10.19-9.01-232.39-206.52-595.87-152.93C1570.78,2472.65,1543.94,2463.15,1524.64,2445.12"/>
</g>
<g id="g40" transform="translate(20.4307,25.917)">
<path id="path42" class="st9" d="M2076.21,1505.94c-15.28-9.6-28.02-23.81-35.47-41.54c-18.32-43.3,2.25-90.92,45.75-106.2
c429.22-150.48,752.91,47.03,766.53,55.55c40.66,25.47,54.28,77.1,30.47,115.41c-23.71,38.21-76.03,48.5-116.68,23.32
c-11.76-7.15-267.27-158.81-613.99-37.23C2126.96,1524.26,2098.75,1519.95,2076.21,1505.94"/>
</g>
<g id="g28" transform="translate(26,24.5)">
<path id="path30" class="st10" d="M2616.28,1646.19c0,135.3-87.69,244.93-195.94,244.93c-108.16,0-195.94-109.63-195.94-244.93
c0-135.2,87.78-244.93,195.94-244.93C2528.6,1401.26,2616.28,1510.99,2616.28,1646.19"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -1,751 +0,0 @@
<!doctype html>
<html lang="ja">
<head>
<title>TheDesk</title>
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<link href="./css/materialize.css" type="text/css" rel="stylesheet">
<link href='./css/font-awesome.css' rel='stylesheet' type='text/css'>
<link href='./css/tl.css' rel='stylesheet' type='text/css'>
<link href='./css/userdata.css' rel='stylesheet' type='text/css'>
<link href='./css/post.css' rel='stylesheet' type='text/css'>
<link href="./css/master.css" type="text/css" rel="stylesheet">
<link href='./css/sort.css' rel='stylesheet' type='text/css'>
<link href='./css/twemoji-awesome.css' rel='stylesheet' type='text/css'>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons|Open+Sans:300|Baloo+Bhai" rel="stylesheet">
<meta charset="utf-8">
</head>
<body>
<script type="text/javascript" src="./js/common/jquery.js"></script>
<script type="text/javascript" src="./js/platform/first.js"></script>
<script type="text/javascript" src="./js/common/materialize.js"></script>
<script type="text/javascript" src="./js/ui/tips.js"></script>
<script type="text/javascript" src="./js/common/time.js"></script>
<script type="text/javascript" src="./js/common/version.js"></script>
<script type="text/javascript" src="./js/common/keyshortcut.js"></script>
<script type="text/javascript" src="./js/common/modal.js"></script>
<script type="text/javascript" src="./js/ui/jquery-ui.min.js"></script>
<script>
//必ずアプデ時のremove instance消して
var ver="Mio (ver.1 beta)";
//betaを入れるとバージョンチェックしない
var ver="beta";
var acct_id=0;
var tlid=0;
verck(ver);
</script>
<textarea id="copy" style="top:-100px; position:fixed;"></textarea>
<div id="tl">
<!--TL-->
<!--ドラッグハンドラ-->
<div id="drag">
<div id="drag-content" data-trans="drag_here">ここにドラッグして添付(ドラッグと同時にアップロードされます)
<br>
<button class="btn waves-effect" onclick="closedrop()" data-trans="close">閉じる</button>
</div>
</div>
<!--カラム追加-->
<div id="add-box" class="hide z-depth-4 notf-box">
<div class="input-field"><span data-trans="your_acct">アカウント選択</span>
<br>
<select id="add-acct-sel" class="acct-sel" style="color:black" onchange="addselCk()"></select>
<label></label>
</div>
<div class="input-field">
<div id="auth">
<select id="type-sel" style="color:black">
<option value="local" data-trans="local">ローカル</option>
<option value="home" data-trans="home">ホーム</option>
<option value="pub" data-trans="public">連合</option>
<option value="mix" data-trans="integrated">統合(ローカルとホーム)</option>
<option value="plus" data-trans="plus">統合(ローカルとブースト・リプライ)</option>
<option value="notf" data-trans="notification">通知</option>
</select>
<label data-trans="show_tl">表示するタイムライン</label>
</div>
<div id="noauth" class="hide">表示するタイムライン
<input id="noauth-url" type="text" class="validate" style="width:calc( 70% - 40px);" placeholder="e.g:mstdn.jp">
</div>
</div>
<button class="btn waves-effect blue " style="width:calc( 100% - 10px);" onclick="addColumn()" data-trans-i="add">
<i class="material-icons left">add</i>追加
</button>
<br>
<br>
<button class="btn waves-effect orange " style="width:calc( 100% - 10px);" onclick="addToggle()" data-trans-i="close">
<i class="material-icons left">close</i>閉じる
</button>
</div>
<!--検索-->
<div id="src-box" class="hide notf-box z-depth-4">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="src" type="text" class="validate" style="width:calc( 70% - 40px);">
<br><span data-trans="src_tip">ハッシュタグを検索するときは#を抜いてください。</span>
<br><span data-trans="src_acct_sel">検索に使用するアカウントを選択</span>
<br>
<div class="input-field">
<select id="src-acct-sel" class="acct-sel"></select>
<label></label>
</div>
<label for="src" data-trans="src">検索</label>
<button class="btn waves-effect indigo" style="width:calc( 60% - 40px);" onclick="src()" data-trans-i="src">
<i class="material-icons left">search</i>検索
</button>
</div>
<div id="search">
<div id="src-contents">
</div>
<button class="btn waves-effect orange " style="width:calc( 100% - 10px);" onclick="srcToggle()">
<i class="material-icons left" data-trans-i="close">close</i>閉じる
</button>
</div>
</div>
<!--並べ替え-->
<div id="sort-box" class="hide notf-box z-depth-4">
<ul id="sort"></ul>
<button onclick="sort()" class="btn waves-effect light-blue nex" style="width:100%; max-width:200px;" data-trans-i="sort">
<i class="material-icons left">sort</i>並べ替え設定
</button>
<button class="btn waves-effect orange " style="width:calc( 100% - 10px);" onclick="sortToggle()" data-trans-i="close">
<i class="material-icons left">close</i>閉じる
</button>
</div>
<!--リスト-->
<div id="list-box" class="hide notf-box z-depth-4">
アカウント選択
<div class="input-field">
<select id="list-acct-sel" class="acct-sel"></select>
<label></label>
</div>
<button class="btn waves-effect indigo" style="width:calc( 60% - 40px);" onclick="list()" data-trans-i="lists">
リスト一覧
</button><br><br>
<div id="lists"></div>
<div id="lists-user"></div>
<input type="text" style="width:150px" id="list-add" placeholder="タイトル">
<button class="btn waves-effect" style="width:120px;" onclick="makeNewList()">新規作成</button>
</div>
<div id="main">
<!--TLのTL-->
<div id="timeline-container">
まずは右のアカウントボタンからアカウントを追加してください。<br>
右のカラム追加ボタンで認証せずにローカルタイムラインを見ることもできます。
</div>
<!--サイドバー-->
<div id="sidebar">
<div id="sidebar-top">
<div class="side-dead"></div>
<div class="big-menu" id="add-tgl">
<a onclick="addToggle()" class="nex waves-effect" data-trans-i="add">
<i class="material-icons nex big-icon" title="カラム追加" data-trans-title="column_add">add</i>
</a>
<br>
<span class="side-label" data-trans="column_add">カラム追加</span>
</div>
<div class="big-menu">
<a href="acct.html" class="nex waves-effect">
<i class="material-icons nex big-icon" title="アカウントマネージャー(Ctrl+Shift+M)" data-trans-title="manager">account_circle</i>
</a>
<br>
<span class="side-label" data-trans="manager_short">アカウント</span>
</div>
<div class="big-menu" id="sort-tgl">
<a onclick="sortToggle()" class="nex waves-effect">
<i class="material-icons nex big-icon" title="カラム一覧" data-trans-title="sort">sort</i>
</a>
<br>
<span class="side-label" data-trans="sort">カラム一覧</span>
</div>
<div class="side-dead">
</div>
<div class="small-menu" id="src-tgl">
<a onclick="srcToggle()" class="nex waves-effect">
<i class="material-icons" title="検索" data-trans-title="src">search</i>
<span class="side-label" data-trans="src">検索</span>
</a>
</div>
<div class="small-menu">
<a href="setting.html" class="nex waves-effect">
<i class="material-icons nex" title="設定(Ctrl+Shift+S)" data-trans-title="setting">settings</i>
<span class="side-label" data-trans="setting">設定</span>
</a>
</div>
<div class="small-menu" id="list-tgl">
<a onclick="listToggle()" class="nex waves-effect">
<i class="material-icons" title="リスト" data-trans-title="list">view_headline</i>
<span class="side-label" data-trans="list">リスト</span>
</a>
</div>
<div class="small-menu">
<a href="index.html" class="nex mize waves-effect">
<i class="material-icons nex" title="スーパーリロード" data-trans-title="reload">refresh</i>
<span class="side-label" data-trans="reload">再読込</span>
</a>
</div>
<div class="small-menu">
<a onclick="window.open('https://astarte.thedesk.top');" class="setting nex waves-effect" target="_blank" id="ranking-btn" style="display:none;">
<i class="material-icons nex" title="アスタルテランキング">timeline</i>
<span class="side-label">暇ラン</span>
</a>
</div>
<div class="small-menu">
<a onclick="nano()" class="nex waves-effect">
<i class="material-icons" title="最小のマストドン。TheDesk Nano" data-trans-title="nano_desp">remove_from_queue</i>
<span class="side-label" data-trans="nano">Nano</span>
</a>
</div>
<div id="side-dead">
</div>
<div class="small-menu">
<a onclick="xpand()" class="nex waves-effect">
<i class="material-icons" title="サイドバーの開閉" data-trans-title="sidebar_xpand" id="x-btn">keyboard_arrow_right</i>
<span class="side-label" data-trans="sidebar_xpand_short">たたむ</span>
</a>
</div>
</div>
<div id="sidebar-btm">
<!--最小化-->
<div id="menu-btn" class="big-menu" onclick="show()" style="display:none;">
<a class="waves-effect">
<i class="material-icons big-icon">mode_edit</i>
<br>
<span class="side-label" data-trans="post">投稿</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div id="post-box" class="z-depth-3">
<!--トゥートボックス-->
<div class="row" style="margin-bottom:0;">
</span>
<div class="" style="float:left;">
<a onclick="profShow()" style="vertical-align:-2.5rem;" class="pointer mize">
<img src="./img/missing.svg" id="acct-sel-prof" title="選択中のプロフィール表示(Ctrl+Shift+P)" data-trans-title="post_box_prof" width="24px">
</a>
</div>
<div class="input-field mize" style="float:left; width:calc(100% - 24px)">
<select id="post-acct-sel" class="acct-sel" onchange="mdCheck()"></select>
</div>
<span class="cancel">
<i class="material-icons waves-effect" onclick="hide()" title="このボックスを閉じる(X)" data-trans-title="post_box_close">cancel</i>
<i class="material-icons waves-effect mini-btn" onclick="mini()" title="このボックスを最小化" data-trans-title="post_box_mini">expand_more</i>
</span>
<!--Markdown-->
<div class="row" style="margin-bottom:0">
<div class="markdown mize">
<div class="col s12">
<i class="material-icons pointer setting waves-effect" onclick="tagsel('b')" title="太字(Ctrl+B)テキストボックス内を選択してから押すと囲みます。">format_bold</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('i')" title="斜字(Ctrl+I)テキストボックス内を選択してから押すと囲みます。">format_italic</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('u')" title="下線(Ctrl+U)テキストボックス内を選択してから押すと囲みます。">format_underlined</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('s')" title="取り消し(Ctrl+S)テキストボックス内を選択してから押すと囲みます。">strikethrough_s</i>
<i class="material-icons pointer setting waves-effect" onclick="markdown('>','no','yes')" title="引用">format_quote</i>
<i class="material-icons pointer setting waves-effect" onclick="markdown('#','no','yes')" title="見出し">short_text</i>
<i class="material-icons pointer setting waves-effect" onclick="markdown('`','yes','no')" title="コード挿入 テキストボックス内を選択してから押すと囲みます。">code</i>
<i class="material-icons pointer setting waves-effect" onclick="markdown('- ','yes','yes')" title="箇条書きリスト">format_list_bulleted</i>
<i class="material-icons pointer setting waves-effect" onclick="markdown('1. ','yes','yes')" title="番号付きリスト">format_list_numbered</i>
<i class="pointer setting fa fa-subscript waves-effect" onclick="markdown('__','yes','no','before')" title="下付き文字 テキストボックス内を選択してから押すと囲みます。" style="font-size:1.5rem"></i>
<i class="pointer setting fa fa-superscript waves-effect" onclick="markdown('_','yes','no','before')" title="上付き文字 テキストボックス内を選択してから押すと囲みます。" style="font-size:1.5rem"></i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('spin')" title="回転 テキストボックス内を選択してから押すと囲みます。">autorenew</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('pulse')" title="点滅 テキストボックス内を選択してから押すと囲みます。">flare</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('flip=vertical')" title="上下反転 テキストボックス内を選択してから押すと囲みます。">swap_vert</i>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('flip=horizontal')" title="左右反転 テキストボックス内を選択してから押すと囲みます。">swap_horiz</i>
<span class="sml gray pointer waves-effect">
<a onclick="mdToggle()">Markdownエディタを隠す</a>
</span>
<br>
<i class="material-icons pointer setting waves-effect" onclick="tagsel('size')" title="文字サイズ変更 テキストボックス内を選択してから押すと囲みます。">format_size</i>
<input id="size" style="width: calc(50% - 20px); margin: 0; height: 24px;" value="12">px
<i class="material-icons pointer setting waves-effect" onclick="tagsel('colorhex')" title="文字色変更 テキストボックス内を選択してから押すと囲みます。">color_lens</i>
<input id="colorhex" style="width: calc(50% - 50px); margin: 0; height: 24px;" type="color">
<br>
<i class="material-icons pointer setting waves-effect" onclick="markdownLink()" title="リンク挿入">link</i>
<input id="linkt" style="width: calc(50% - 20px); margin: 0; height: 24px;" placeholder="リンクテキスト">&nbsp;
<input id="link2" style="width: calc(50% - 20px); margin: 0; height: 24px;" placeholder="リンクアドレス">
<br>
<i class="material-icons pointer setting waves-effect" onclick="markdownImage()" title="インライン画像挿入">image</i>
<input id="image" style="width: calc(50% - 20px); margin: 0; height: 24px;" placeholder="代替テキスト">&nbsp;
<input id="image2" style="width: calc(50% - 20px); margin: 0; height: 24px;" placeholder="画像アドレス">
</div>
</div>
<div class="input-field col s12" id="preview-field" style="margin-top: 0;">
<div id="md-preview">
</div>
<span class="sml gray pointer">
<a onclick="previewEdit()">Edit</a>
</span>
</div>
<div class="input-field col s12" id="toot-field" style="margin-top: 0;">
<textarea id="textarea" class="materialize-textarea unmize" style="margin-bottom:0;" data-length="500"></textarea>
<label for="textarea" data-trans="toot">トゥート</label>
<br>
<span class="sml gray pointer more-show markdown mize" id="preview-btn">
<a onclick="preview()">Preview</a>
</span>
<span class="sml gray pointer more-show anti-markdown hide mize">
<a onclick="mdToggle()">Markdownエディタを表示</a>
</span>
<span id="suggest"></span>
</div>
<div class="col s12 mize" style="margin-top: 0; display:flex; justify-content: space-between">
<i class="waves-effect gray material-icons" id="nsfw" title="画像に制限を付与" onclick="nsfw()">visibility_off</i>
<i class="waves-effect gray material-icons purple-text dropdown-button" data-activates='dropdown1' id="vis-icon">public</i>
<a class="waves-effect gray" id="cw" onclick="cw()" title="コンテンツワーニング(トゥートを表示する前にメッセージで隠す)">CW</a>
<span><span id="imgup"></span><span id="imgsel"><i class="waves-effect material-icons gray" onclick="fileselect()" title="ファイルを選択">photo_library</i></span></span>
<i class="waves-effect gray material-icons" onclick="adobe()" title="Adobeフォトエディタ">format_shapes</i>
<i class="waves-effect gray material-icons" onclick="emoji()" title="絵文字を挿入">tag_faces</i>
<a onclick="nowplaying('spotify')" class="pointer waves-effect gray" title="Spotify Now Playing(アカウント連携が必要です)Ctrl+Shift+N"><i class="fa fa-spotify" style="font-size:24px;"></i></a>
<i class="material-icons nex gray waves-effect" title="トゥートボックスのクリア(Ctrl+Shit+C)" data-trans-title="post_box_clear" id="clear">clear</i>
</div>
<div class="col s11 mize" style="margin-bottom:5px; padding:0;">
<span id="preview" class="mize"></span>
<span class=" sml mize"><span data-trans="reply">返信モード</span>:
<span id="rec">いいえ</span>/<span data-trans="file">添付</span>:
<span id="mec">なし</span>/<span data-trans="vis">公開範囲</span>:
<span id="vis">public</span>
</span>
<br>
<input type="text" id="cw-text" placeholder="警告文" class="mize">
</div>
</div>
<!-- 公開範囲 Dropdown Structure -->
<ul id='dropdown1' class='dropdown-content'>
<li style="font-size: 16px; display: block; line-height: 22px; padding: 14px 16px;">公開範囲指定</li>
<li>
<a onclick="vis('public')">公開(Public)</a>
</li>
<li>
<a onclick="vis('unlisted')">未収載(Unlisted)</a>
</li>
<li>
<a onclick="vis('private')" id="private-button">非公開(Private)</a>
</li>
<li id="limited-button" class="hide">
<a onclick="vis('limited')">限定公開(Limited)</a>
</li>
<li>
<a onclick="vis('direct')" class="disabled direct">ダイレクト(Direct)</a>
</li>
</ul>
<!--hidden area-->
<input type="hidden" id="reply">
<input type="hidden" id="media">
<!--END hidden area-->
</div>
<div id="toot-btn-field">
<button class="btn waves-effect indigo unmize" style="width:calc(100% - 10px); padding:0; margin-top:10px;" onclick="post()" id="toot-post-btn">トゥート</button>
</div>
</div>
<!--絵文字ピッカー-->
<div id="emoji" class="hide shared z-depth-4">
<span class="gray sml">インスタンスによって実装が異なります。
<i>
<a onclick="emojiGet('true')" class="pointer">絵文字更新</a>
</i>
<br>
</span>
<input type="text" id="emoji-suggest" placeholder="カスタム絵文字検索">
<div id="emoji-list" class="" style="">
</div>
<div class="emoji-control center">
<button class="btn waves-effect blue" style="width:30%; padding:0;" onclick="emojiList('before')" id="emoji-before">
<i class="material-icons">navigate_before</i>
</button>
<span id="emoji-count"></span>/
<span id="emoji-sum"></span>
<button class="btn waves-effect blue" style="width:30%; padding:0;" onclick="emojiList('next')" id="emoji-next">
<i class="material-icons">navigate_next</i>
</button>
</div>
<div id="default-emoji">
<span id="now-emoji"></span>一覧を表示中<br><span class="gray sml">一部デフォルト絵文字は入力・描画できません。(国旗系など)</span>
<br>
<a onclick="customEmoji()" class="pointer waves-effect" title="カスタム絵文字">
<i class="material-icons">add</i>
</a>
<a onclick="defaultEmoji('people')" class="pointer waves-effect" title="ひと">
<i class="material-icons">people</i>
</a>
<a onclick="defaultEmoji('nature')" class="pointer waves-effect" title="自然">
<i class="material-icons">local_florist</i>
</a>
<a onclick="defaultEmoji('food')" class="pointer waves-effect" title="食べ物">
<i class="material-icons">restaurant</i>
</a>
<a onclick="defaultEmoji('activity')" class="pointer waves-effect" title="活動">
<i class="material-icons">directions_run</i>
</a>
<a onclick="defaultEmoji('place')" class="pointer waves-effect" title="場所">
<i class="material-icons">directions_car</i>
</a>
<a onclick="defaultEmoji('object')" class="pointer waves-effect" title="もの">
<i class="material-icons">attach_file</i>
</a>
<a onclick="defaultEmoji('symbol')" class="pointer waves-effect" title="記号">
<i class="material-icons">gesture</i>
</a>
<a onclick="defaultEmoji('flag')" class="pointer waves-effect" title="国旗">
<i class="material-icons">flag</i>
</a>
<a onclick="faicon()" class="pointer waves-effect" title="faicon" id="faicon-btn">
<i class="fa fa-fort-awesome"></i>
</a>
</div>
</div>
<!-- Modal Structure Tootdata-->
<div id="tootmodal" class="modal modal-fixed-footer">
<div class="modal-content">
<ul class="collapsible" data-collapsible="accordion" id="det-col">
<li>
<div class="collapsible-header">
<i class="material-icons">arrow_upward</i>これより前の会話
</div>
<div class="collapsible-body toot-reset" id="toot-reply">
</div>
</li>
<li>
<div class="collapsible-header" id="activator">
<i class="material-icons">more_horiz</i>対象のトゥート
</div>
<div class="collapsible-body toot-reset" id="toot-this">
</div>
</li>
<li>
<div class="collapsible-header">
<i class="material-icons">arrow_downward</i>これよりあとの会話
</div>
<div class="collapsible-body toot-reset" id="toot-after">
</div>
</li>
<li>
<div class="collapsible-header">
<i class="material-icons">people_outline</i>これより前のLocal TL(エアリプソース確認)
</div>
<div class="collapsible-body toot-reset" id="toot-before">
</div>
</li>
<li>
<div class="collapsible-header">
<i class="material-icons">person_outline</i>これより前のユーザーTL(BTソース確認)
</div>
<div class="collapsible-body toot-reset" id="user-before">
</div>
</li>
<li>
<div class="collapsible-header">
<i class="material-icons">star</i>このトゥートをお気に入りに登録した人
</div>
<div class="collapsible-body toot-reset" id="toot-fav">
</div>
</li>
<li>
<div class="collapsible-header">
<i class="text-darken-3 fa fa-retweet"></i>このトゥートをブーストした人
</div>
<div class="collapsible-body toot-reset" id="toot-rt">
</div>
</li>
</ul>
他のアカウントを使用(<i class="fa fa-retweet"></i>/<i class="fa fa-star"></i>の解除はできません)<br>
<div class="row">
<div class="col s4">
<select id="status-acct-sel" class="acct-sel"></select>
</div>
<div class="col s2">
<button class="dropdown-button btn waves-effect" style="width:100%;" onclick="staEx('reply')"><i class="fa fa-share left"></i>返信</button>
</div>
<div class="col s2">
<button class="dropdown-button btn waves-effect indigo" style="width:100%;" onclick="staEx('rt')"><i class="fa fa-retweet left"></i>ブースト</button>
</div>
<div class="col s3">
<button class="dropdown-button btn waves-effect orange" style="width:100%;" onclick="staEx('fav')"><i class="fa fa-star left"></i>お気に入り登録</button>
</div>
</div>
<div id="toot-tools">
</div>
<div id="toot-after">
</div>
</div>
<div class="modal-footer">
<a href="#!" class="waves-effect waves-green btn-flat" onclick="brws()">ブラウザで開く</a>
<a href="#!" class="waves-effect waves-green btn-flat" onclick="shot()">スクリーンショット</a>
<a href="#!" class="waves-effect waves-green btn-flat" onclick="cbCopy()">URLをコピー</a>
<a href="#!" class="waves-effect waves-green btn-flat" onclick="cbCopy('emb')">埋め込む</a>
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<!-- Modal Structure Userdata -->
<div id="his-data" class="modal bottom-sheet modal-fixed-footer" style="max-height:750px; height:90%;">
<div id="his-data-content" class="modal-content" style="padding-bottom: 0;overflow-y:hidden;">
<div id="his-data-show">
<img src="./img/loading.svg" id="his-prof" style="">
<div class="his-float">
<span id="his-name" style="font-size:1.5rem">Loading...</span>
<br>@
<span id="his-acct"></span>
<span class="gray" id="his-relation"></span>
<br>
<span class="cbadge">
<span id="his-sta"></span>トゥート
</span>
<span class="cbadge">フォロー:
<span id="his-follow"></span>
</span>
<span class="cbadge">フォロワー:
<span id="his-follower"></span>
</span>
<span class="cbadge" style="max-width:150px; width:150px; ">Since:
<span id="his-since"></span>
</div>
<div class="his-float">
<span id="his-des"></span>
<br>
</div>
<div class="row">
<div class="col s12" id="my-data-nav">
<ul class="custom-tabs transparent">
<li class="custom-tab col my-data-width active-back">
<a go="#his-tl">タイムライン</a>
</li>
<li class="custom-tab col my-data-width">
<a go="#his-follow-list">フォロー</a>
</li>
<li class="custom-tab col my-data-width">
<a go="#his-follower-list">フォロワー</a>
</li>
<li class="custom-tab col my-data-width only-his-data">
<a go="#his-action">他アカウントで操作</a>
</li>
<li class="custom-tab col my-data-width only-his-data">
<a go="#his-list">リスト</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-fav-list">お気に入り登録</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-blocking-list">ブロック</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-muting-list">ミュート</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-domain-list">ドメインブロック</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-prof-list">プロフィール編集</a>
</li>
<li class="custom-tab col my-data-width only-my-data">
<a go="#his-request-list">フォローリクエスト</a>
</li>
</ul>
</div>
<div id="his-tl" class="col s12 tab-content">
<div id="his-tl-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="utl('--now','more')">もっと</button>
</div>
<div id="his-follow-list" class="col s12 tab-content">
<div id="his-follow-list-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="flw('--now','more')">もっと</button>
</div>
<div id="his-follower-list" class="col s12 tab-content">
<div id="his-follower-list-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="fer('--now','more')">もっと</button>
</div>
<div id="his-action" class="col s12 tab-content">
他のアカウントを使用してフォロー(解除はできません)<br>
<div style="max-width:500px;"><select id="user-acct-sel" class="acct-sel"></select></div>
<a href="#!" class="waves-effect btn" onclick="follow('selector','true')">フォロー</a><br>
または<br>
<a href="#!" class="waves-effect btn" onclick="udgEx('selector', 'selector')">プロフを開く</a><br>
</div>
<div id="his-list" class="col s12 tab-content">
<div id="his-lists-a"></div>
<div id="his-lists-b"></div>
</div>
<div id="his-fav-list" class="col s12 tab-content">
<div id="his-fav-list-contents" class="cont-series">
</div>
<button class="btn waves-effect" style="width:100%; padding:0;" onclick="showFav('more')">もっと</button>
</div>
<div id="his-blocking-list" class="col s12 tab-content">
<div id="his-blocking-list-contents"class="cont-series" >
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="showBlo('more')">もっと</button>
</div>
<div id="his-muting-list" class="col s12 tab-content">
<div id="his-muting-list-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="showMut('more')">もっと</button>
</div>
<div id="his-domain-list" class="col s12 tab-content">
<div id="his-domain-list-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="showDom('more')">もっと</button>ブロックするドメイン
<br>
<input type="text" placeholder="example.com" id="domainblock">
<button class="btn waves-effect" onclick="addDomainblock()">ブロック</button>
<br>
</div>
<div id="his-prof-list" class="col s12 tab-content">名前
<br>
<input type="text" placeholder="名前" id="his-name-val" width="max-width:150px;">
<br>自己紹介
<br>
<div class="input-field col s12">
<textarea placeholder="自己紹介" id="his-des-val" class="materialize-textarea"></textarea>
<label for="his-des-val">自己紹介</label>
</div>
<button onclick="profedit()" class="btn waves-effect indigo">適用</button>
<br>
<br>プロフィール画像変更:
<span id="prof-change">
<input type="file" onchange="imgChange(this,'avatar')">
</span>
<br>ヘッダー画像変更:
<span id="header-change">
<input type="file" onchange="imgChange(this,'header')">
</span>
</div>
<div id="his-request-list" class="col s12 tab-content">
<div id="his-request-list-contents" class="cont-series">
</div>
<button class="btn waves-effect " style="width:100%; padding:0;" onclick="showReq('more')">もっと</button>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="modal-action waves-effect waves-green btn-flat" id="his-history-btn" onclick="historyShow()">一つ前のユーザーデータ</button>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-follow-btn" onclick="follow()">フォロー</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-mute-btn" onclick="mute()">ミュート</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-block-btn" onclick="block()">ブロック</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" id="his-emp-btn" onclick="empUser()">ユーザー強調</a>
<a href="#!" class="modal-action waves-effect waves-green btn-flat" onclick="hisclose()">Close</a>
</div>
</div>
<!-- Modal Structure Image-->
<div id="imagemodal" class="modal modal-fixed-footer" style="min-width:550px">
<div class="modal-content">
<div id="imagewrap">
<img src="" id="imgmodal">
</div>
<br>
</div>
<div class="modal-footer">
DL:<span id="imgprog"></span>%
<a class="waves-effect white-text" onclick="zoom(2)">
<i class="material-icons">zoom_in</i>
</a>
<a class="waves-effect white-text" onclick="zoom(0.5)">
<i class="material-icons">zoom_out</i>
</a>
<button class="btn waves-effect purple" onclick="dlImg()">
<i class="material-icons">file_download</i>
</button>
<button class="btn waves-effect brown" onclick="detFromImg()">当該トゥート</button>
<button class="btn waves-effect orange" onclick="imgCont('prev')" id="image-prev">
<i class="material-icons">keyboard_arrow_left</i>
</button>
<button class="btn waves-effect orange" onclick="imgCont('next')" id="image-next">
<i class="material-icons">keyboard_arrow_right</i>
</button>
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">
<i class="material-icons">close</i>
</a>
</div>
</div>
<!-- Modal Structure Video-->
<div id="videomodal" class="modal modal-fixed-footer">
<div class="modal-content">
<video src="" id="video" style="max-width:100%; max-height:100%;" controls >
</div>
<div class="modal-footer">
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
</div>
</div>
<!--PiP-->
<div id="pip" class="hide pip-bottom pip-left">
<i class="material-icons pip-horiz pointer" onclick="pipHoriz()">chevron_right</i> 
<i class="material-icons pip-vert pointer" onclick="pipVert()">expand_less</i> 
<i class="material-icons pointer" onclick="endPip()">close</i>
<div id="pip-content">
</div>
</div>
<!--左下メッセージ-->
<div id="message">
</div>
<!--Radio Happy(Yui) Taku Inoue-->
<audio src="" id="radio"></audio>
<!--JS-->
<script type="text/javascript" src="./js/common/about.js"></script>
<script type="text/javascript" src="./js/tl/parse.js"></script>
<script type="text/javascript" src="./js/ui/scroll.js"></script>
<script type="text/javascript" src="./js/tl/tl.js"></script>
<script type="text/javascript" src="./js/tl/card.js"></script>
<script type="text/javascript" src="./js/tl/date.js"></script>
<script type="text/javascript" src="./js/tl/notification.js"></script>
<script type="text/javascript" src="./js/tl/datails.js"></script>
<script type="text/javascript" src="./js/tl/mix.js"></script>
<script type="text/javascript" src="./js/tl/src.js"></script>
<script type="text/javascript" src="./js/tl/filter.js"></script>
<script type="text/javascript" src="./js/tl/tag.js"></script>
<script type="text/javascript" src="./js/tl/list.js"></script>
<script type="text/javascript" src="./js/ui/post-box.js"></script>
<script type="text/javascript" src="./js/ui/layout.js"></script>
<script type="text/javascript" src="./js/login/login.js"></script>
<script type="text/javascript" src="./js/ui/img.js"></script>
<script type="text/javascript" src="./js/ui/theme.js"></script>
<script type="text/javascript" src="./js/ui/pip.js"></script>
<script type="text/javascript" src="./js/ui/sort.js"></script>
<script type="text/javascript" src="./js/ui/spotify.js"></script>
<script type="text/javascript" src="./js/post/post.js"></script>
<script type="text/javascript" src="./js/post/use-txtbox.js"></script>
<script type="text/javascript" src="./js/post/secure.js"></script>
<script type="text/javascript" src="./js/post/img.js"></script>
<script type="text/javascript" src="./js/post/status.js"></script>
<script type="text/javascript" src="./js/post/emoji.js"></script>
<script type="text/javascript" src="./js/post/suggest.js"></script>
<script type="text/javascript" src="./js/post/bb-md.js"></script>
<script type="text/javascript" src="./js/userdata/showOnTL.js"></script>
<script type="text/javascript" src="./js/userdata/his-data.js"></script>
<script type="text/javascript" src="./js/userdata/prof-edit.js"></script>
<script type="text/javascript" src="./js/emoji/emojione.js"></script>
<script type="text/javascript" src="./js/emoji/emojipack.js"></script>
<script type="text/javascript" src="./js/emoji/default-emoji.js"></script>
<script type="text/javascript" src="./js/platform/end.js"></script>
<!--
<script type="text/javascript" src="https://dme0ih8comzn4.cloudfront.net/imaging/v2/editor.js"></script>
<script type="text/javascript">
//Adobeエディターのセットアップ関数
function set_adbe_image(){
//<body>内の画像要素を取得
var image = document.getElementById('imgmodal');
//画像編集エディタを利用するための準備
var Editor = new Aviary.Feather({
apiKey: 'ffee425017ab44b18ce95dab98a5cdc1',
language: 'ja',
onSave: function(imageID, newURL) {
console.log(newURL);
},
});
//画像要素をクリックしたら、「編集エディタ」を表示
image.addEventListener('click', function () {
Editor.launch({
//<img>内のidとsrcを取得
image: image.id,
url: image.src
});
});
}
//エディター動作割り当てる
set_adbe_image();
</script>-->

View File

@@ -1,6 +1,4 @@
//このソフトについて
function about() {
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('about', 'go');
postMessage(["sendSinmpleIpc", "about"], "*")
}

119
app/js/common/blurhash.js Normal file
View File

@@ -0,0 +1,119 @@
var digitCharacters = [
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d",
"e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
"y", "z", "#", "$", "%", "*", "+", ",", "-", ".",
":", ";", "=", "?", "@", "[", "]", "^", "_", "{",
"|", "}", "~",
];
function decode83(str) {
var value = 0;
for (var i = 0; i < str.length; i++) {
var c = str[i];
var digit = digitCharacters.indexOf(c);
value = value * 83 + digit;
}
return value;
}
function linearTosRGB(value) {
var v = Math.max(0, Math.min(1, value));
if (v <= 0.0031308) {
return Math.round(v * 12.92 * 255 + 0.5);
}
else {
return Math.round((1.055 * Math.pow(v, 1 / 2.4) - 0.055) * 255 + 0.5);
}
}
function sRGBToLinear(value) {
var v = value / 255;
if (v <= 0.04045) {
return v / 12.92;
}
else {
return Math.pow((v + 0.055) / 1.055, 2.4);
}
}
function decodeDC(value) {
var intR = value >> 16;
var intG = (value >> 8) & 255;
var intB = value & 255;
return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];
};
function sign(n) { return (n < 0 ? -1 : 1); }
function signPow(val, exp) { return sign(val) * Math.pow(Math.abs(val), exp); }
function decodeDC2(value, maximumValue) {
var quantR = Math.floor(value / (19 * 19));
var quantG = Math.floor(value / 19) % 19;
var quantB = value % 19;
var rgb = [
signPow((quantR - 9) / 9, 2.0) * maximumValue,
signPow((quantG - 9) / 9, 2.0) * maximumValue,
signPow((quantB - 9) / 9, 2.0) * maximumValue,
];
return rgb;
};
function decodeblur(blurhash, width, height, punch) {
punch = punch | 1;
if (blurhash.length < 6) {
console.error('too short blurhash');
return null;
}
var sizeFlag = decode83(blurhash[0]);
var numY = Math.floor(sizeFlag / 9) + 1;
var numX = (sizeFlag % 9) + 1;
var quantisedMaximumValue = decode83(blurhash[1]);
var maximumValue = (quantisedMaximumValue + 1) / 166;
if (blurhash.length !== 4 + 2 * numX * numY) {
console.error('blurhash length mismatch', blurhash.length, 4 + 2 * numX * numY);
return null;
}
var colors = new Array(numX * numY);
for (var i = 0; i < colors.length; i++) {
if (i === 0) {
var value = decode83(blurhash.substring(2, 6));
colors[i] = decodeDC(value);
}
else {
var value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));
colors[i] = decodeDC2(value, maximumValue * punch);
}
}
var bytesPerRow = width * 4;
var pixels = new Uint8ClampedArray(bytesPerRow * height);
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
var r = 0;
var g = 0;
var b = 0;
for (var j = 0; j < numY; j++) {
for (var i = 0; i < numX; i++) {
var basis = Math.cos(Math.PI * x * i / width) * Math.cos(Math.PI * y * j / height);
var color = colors[i + j * numX];
r += color[0] * basis;
g += color[1] * basis;
b += color[2] * basis;
}
}
var intR = linearTosRGB(r);
var intG = linearTosRGB(g);
var intB = linearTosRGB(b);
pixels[4 * x + 0 + y * bytesPerRow] = intR;
pixels[4 * x + 1 + y * bytesPerRow] = intG;
pixels[4 * x + 2 + y * bytesPerRow] = intB;
pixels[4 * x + 3 + y * bytesPerRow] = 255; // alpha
}
}
return pixels;
}
function parseBlur(blur) {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var pixels = decodeblur(blur, 32, 32)
const imageData = new ImageData(pixels, 32, 32);
ctx.putImageData(imageData, 0, 0);
return canvas.toDataURL()
}

File diff suppressed because one or more lines are too long

View File

@@ -1,66 +1,81 @@
$(function($) {
selectedColumn = 0
selectedToot = 0
$(function ($) {
//キーボードショートカット
$(window).keydown(function(e) {
$(window).keydown(function (e) {
var hasFocus = $('input').is(':focus');
var hasFocus2 = $('textarea').is(':focus');
if (document.getElementById("webview")) {
if ($("#webviewsel:checked").val()) {
var wv = false;
} else {
var wv = true;
}
} else {
var wv = true;
}
//Ctrl+Shift+Enter:Lgen
if (event.metaKey || event.ctrlKey && wv) {
if (event.shiftKey) {
if (e.keyCode === 13) {
post('local');
return false;
}
}
}
//Ctrl+Enter:投稿
if (event.ctrlKey) {
if (event.metaKey || event.ctrlKey && wv) {
if (e.keyCode === 13) {
post();
return false;
}
}
//Shift+Enter:Markdown
if (event.shiftKey) {
//Alt+Enter:セカンダリー
if (event.metaKey || event.altKey && wv) {
if (e.keyCode === 13) {
brInsert(" \n");
return false;
}
}
//Shift+Space:Markdownゼロ幅スペース
if (event.shiftKey) {
if (e.keyCode === 32) {
brInsert("");
sec();
return false;
}
}
//Esc:消す
if (e.keyCode === 27) {
if (e.keyCode === 27 && wv) {
hide();
return false;
}
//F5リロード
if (e.keyCode === 116) {
if (e.keyCode === 116 && wv) {
location.href = "index.html";
return false;
}
//Ctrl+R:ランキング
if (event.ctrlKey) {
if (e.keyCode === 82) {
if(localStorage.getItem("kirishima")){
window.open("https://astarte.thedesk.top");
}
}
}
//Ctrl+Sift+C:全消し
if (event.ctrlKey && event.shiftKey) {
if (((event.metaKey || event.ctrlKey) && event.shiftKey) && wv) {
if (e.keyCode === 67) {
clear();
return false;
}
}
//Ctrl+Sift+N:NowPlaying
if (event.ctrlKey && event.shiftKey) {
if (((event.metaKey || event.ctrlKey) && event.shiftKey) && wv) {
if (e.keyCode === 78) {
show();
nowplaying()
return false;
}
}
//input/textareaにフォーカスなし時
if (!hasFocus && !hasFocus2) {
if ((!hasFocus && !hasFocus2) && wv) {
if (!wv) {
return true;
}
//Ctrl+V:いつもの
if (event.metaKey || event.ctrlKey) {
if (e.keyCode === 86) {
show();
}
}
//X:開閉
if (e.keyCode === 88) {
if ($("#post-box").hasClass("hidenbox")) {
if (!$("#post-box").hasClass("appear")) {
show();
$('textarea').focus();
} else {
@@ -70,95 +85,163 @@ $(function($) {
}
//N:新トゥート
if (e.keyCode === 78) {
if ($("#post-box").hasClass("hidenbox")) {
if (!$("#post-box").hasClass("appear")) {
show();
}
$('textarea').focus();
return false;
}
//E:拡張On/Off
if (e.keyCode === 69) {
zoomBox();
return false;
//Ctrl+E:全ての通知未読を既読にする
if (event.metaKey || event.ctrlKey) {
if (e.keyCode === 69) {
allNotfRead();
return false;
}
}
//Ctrl+Space:読み込み
if (event.ctrlKey) {
if (event.metaKey || event.ctrlKey) {
if (e.keyCode === 32) {
parseColumn();
return false;
}
}
//Ctrl+Sift+S:設定
if (event.ctrlKey && event.shiftKey) {
if ((event.metaKey || event.ctrlKey) && event.shiftKey) {
if (e.keyCode === 83) {
location.href = "setting.html";
return false;
}
}
//Ctrl+Sift+M:アカマネ
if (event.ctrlKey && event.shiftKey) {
if ((event.metaKey || event.ctrlKey) && event.shiftKey) {
if (e.keyCode === 77) {
location.href = "acct.html";
return false;
}
}
//Ctrl+Sift+P:プロフ
if (event.ctrlKey && event.shiftKey) {
if ((event.metaKey || event.ctrlKey) && event.shiftKey) {
if (e.keyCode === 80) {
profShow()
return false;
}
}
//数字:TL
if (event.ctrlKey) {
if (e.keyCode >= 49 && e.keyCode <= 57) {
var kz=e.keyCode-49;
goColumn(kz);
if (event.metaKey || event.ctrlKey) {
if (e.keyCode >= 49 && e.keyCode <= 57) {
var kz = e.keyCode - 49;
goColumn(kz);
return false;
}
}
//矢印:選択
if (e.code == "ArrowLeft") {
//left
if ($("#imagemodal").hasClass("open")) {
imgCont('prev');
return false;
}
if (selectedColumn > 0) {
selectedColumn--
}
tootSelector(selectedColumn, selectedToot)
return false;
} else if (e.code == "ArrowUp") {
//up
if ($("#imagemodal").hasClass("open")) {
return false;
}
if (selectedToot > 0) {
selectedToot--
}
tootSelector(selectedColumn, selectedToot)
return false;
} else if (e.code == "ArrowRight") {
//right
if ($("#imagemodal").hasClass("open")) {
imgCont('next');
return false;
}
if (selectedColumn < $(".tl-box").length - 1) {
selectedColumn++
}
tootSelector(selectedColumn, selectedToot)
return false;
} else if (e.code == "ArrowDown") {
//down
if ($("#imagemodal").hasClass("open")) {
return false;
}
selectedToot++
tootSelector(selectedColumn, selectedToot)
return false;
}
//Ctrl+U:0,0選択
if (event.ctrlKey || event.metaKey) {
if (e.keyCode === 85) {
selectedToot = 0
selectedColumn = 0
tootSelector(0, 0)
return false;
}
}
//選択時
if (e.keyCode == 70) {
var id = $(".selectedToot").attr('unique-id')
var acct_id = $('#timeline_' + selectedColumn).attr("data-acct")
fav(id, acct_id, false)
return false;
}
if (e.keyCode == 66) {
var id = $(".selectedToot").attr('unique-id')
var acct_id = $('#timeline_' + selectedColumn).attr("data-acct")
rt(id, acct_id, false)
return false;
}
if (e.keyCode == 82) {
var id = $(".selectedToot").attr('unique-id')
var acct_id = $('#timeline_' + selectedColumn).attr("data-acct")
var ats_cm = $('.selectedToot .rep-btn').attr("data-men")
var mode = $('.selectedToot .rep-btn').attr("data-visen")
re(id, ats_cm, acct_id, mode)
return false;
}
}
//textareaフォーカス時
if (hasFocus2) {
if (event.ctrlKey) {
//Ctrl+B:太字
if (e.keyCode === 66) {
tagsel('b');
return false;
if (hasFocus2 && wv) {
if (event.metaKey || event.ctrlKey) {
//C+S+(No):ワンクリ
if ((event.metaKey || event.ctrlKey) && event.shiftKey) {
if (e.keyCode >= 49 && e.keyCode <= 51) {
var no = e.keyCode - 48;
if (localStorage.getItem("oks-" + no)) { $("#textarea").val($("#textarea").val() + localStorage.getItem("oks-" + no)) }
return false;
}
}
//Ctrl+I:斜字
if (e.keyCode === 73) {
tagsel('i');
return false;
}
//Ctrl+U:下線
if (e.keyCode === 85) {
tagsel('u');
return false;
}
//Ctrl+S:取り消し線
if (e.keyCode === 83) {
tagsel('s');
return false;
}
}
}
//イメージビューワー切り替え
if (e.keyCode === 37) {
if ($("#imagemodal").hasClass("open")) {
imgCont('prev');
return false;
}
}
if (e.keyCode === 39) {
if ($("#imagemodal").hasClass("open")) {
imgCont('next');
return false;
}
}
});
//クリアボタン
$("#clear").click(function() {
$("#clear").click(function () {
clear();
});
});
});
//選択する
function tootSelector(column, toot) {
$('.cvo').removeClass("selectedToot")
$('#timeline_' + column + ' .cvo').eq(toot).addClass("selectedToot")
var scr = $('.tl-box[tlid=' + column + ']').scrollTop()
var elem = $('.selectedToot').offset().top
var top = elem - $('.tl-box').height() + scr
if (top > 0) {
top = top + $('.selectedToot').height()
if (top > scr) {
$('.tl-box[tlid=' + column + ']').animate({ scrollTop: top })
}
} else if (elem < 0) {
var to = scr + elem - $('.selectedToot').height()
if (to < scr) {
$('.tl-box[tlid=' + column + ']').animate({ scrollTop: to })
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,17 +1,26 @@
//モーダル・ドロップダウンの各種設定
$(document).ready(function(){
// the "href" attribute of the modal trigger must specify the modal ID that wants to be triggered
$('.modal').modal();
$('.dropdown-button').dropdown({
inDuration: 300,
outDuration: 225,
constrainWidth: false, // Does not change width of dropdown to that of the activator
hover: false, // Activate on hover
gutter: 0, // Spacing from edge
belowOrigin: false, // Displays dropdown below the button
alignment: 'left', // Displays dropdown with edge aligned to the left of button
stopPropagation: false // Stops event propagation
}
$(document).ready(function () {
// the "href" attribute of the modal trigger must specify the modal ID that wants to be triggered
$('.modal').modal({
inDuration: 300,
outDuration: 225,
constrainWidth: false, // Does not change width of dropdown to that of the activator
hover: false, // Activate on hover
gutter: 0, // Spacing from edge
belowOrigin: false, // Displays dropdown below the button
alignment: 'left', // Displays dropdown with edge aligned to the left of button
stopPropagation: false
});
$('.dropdown-trigger').dropdown({
inDuration: 300,
outDuration: 225,
constrainWidth: false, // Does not change width of dropdown to that of the activator
hover: false, // Activate on hover
gutter: 0, // Spacing from edge
belowOrigin: false, // Displays dropdown below the button
alignment: 'left', // Displays dropdown with edge aligned to the left of button
stopPropagation: false // Stops event propagation
}
);
});
$('.collapsible').collapsible();
});

96
app/js/common/sha256.js Normal file
View File

@@ -0,0 +1,96 @@
var sha256 = function sha256(ascii) {
function rightRotate(value, amount) {
return (value >>> amount) | (value << (32 - amount));
};
var mathPow = Math.pow;
var maxWord = mathPow(2, 32);
var lengthProperty = 'length'
var i, j; // Used as a counter across the whole file
var result = ''
var words = [];
var asciiBitLength = ascii[lengthProperty] * 8;
//* caching results is optional - remove/add slash from front of this line to toggle
// Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes
// (we actually calculate the first 64, but extra values are just ignored)
var hash = sha256.h = sha256.h || [];
// Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes
var k = sha256.k = sha256.k || [];
var primeCounter = k[lengthProperty];
/*/
var hash = [], k = [];
var primeCounter = 0;
//*/
var isComposite = {};
for (var candidate = 2; primeCounter < 64; candidate++) {
if (!isComposite[candidate]) {
for (i = 0; i < 313; i += candidate) {
isComposite[i] = candidate;
}
hash[primeCounter] = (mathPow(candidate, .5) * maxWord) | 0;
k[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0;
}
}
ascii += '\x80' // Append Ƈ' bit (plus zero padding)
while (ascii[lengthProperty] % 64 - 56) ascii += '\x00' // More zero padding
for (i = 0; i < ascii[lengthProperty]; i++) {
j = ascii.charCodeAt(i);
if (j >> 8) return; // ASCII check: only accept characters in range 0-255
words[i >> 2] |= j << ((3 - i) % 4) * 8;
}
words[words[lengthProperty]] = ((asciiBitLength / maxWord) | 0);
words[words[lengthProperty]] = (asciiBitLength)
// process each chunk
for (j = 0; j < words[lengthProperty];) {
var w = words.slice(j, j += 16); // The message is expanded into 64 words as part of the iteration
var oldHash = hash;
// This is now the undefinedworking hash", often labelled as variables a...g
// (we have to truncate as well, otherwise extra entries at the end accumulate
hash = hash.slice(0, 8);
for (i = 0; i < 64; i++) {
var i2 = i + j;
// Expand the message into 64 words
// Used below if
var w15 = w[i - 15], w2 = w[i - 2];
// Iterate
var a = hash[0], e = hash[4];
var temp1 = hash[7]
+ (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) // S1
+ ((e & hash[5]) ^ ((~e) & hash[6])) // ch
+ k[i]
// Expand the message schedule if needed
+ (w[i] = (i < 16) ? w[i] : (
w[i - 16]
+ (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) // s0
+ w[i - 7]
+ (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10)) // s1
) | 0
);
// This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble
var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) // S0
+ ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj
hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()
hash[4] = (hash[4] + temp1) | 0;
}
for (i = 0; i < 8; i++) {
hash[i] = (hash[i] + oldHash[i]) | 0;
}
}
for (i = 0; i < 8; i++) {
for (j = 3; j + 1; j--) {
var b = (hash[i] >> (j * 8)) & 255;
result += ((b < 16) ? 0 : '') + b.toString(16);
}
}
return result;
};

View File

@@ -25,7 +25,7 @@
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
$.timeago = function (timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
@@ -37,7 +37,6 @@
}
};
var $t = $.timeago;
$.extend($.timeago, {
settings: {
refreshMillis: 60000,
@@ -47,30 +46,30 @@
cutoff: 0,
autoDispose: true,
strings: {
prefixAgo: null,
prefixFromNow: "今から",
suffixAgo: "",
suffixFromNow: "",
inPast: '',
seconds: "%d秒前",
minute: "1分前",
minutes: "%d分前",
hour: "1時間前",
hours: "%d時間前",
day: "昨日",
days: "%d日前",
month: "昨月",
months: "%dヶ月前",
year: "去年",
years: "%d年前",
prefixAgo: lang.lang_time_prefixAgo,
prefixFromNow: lang.lang_time_prefixFromNow,
suffixAgo: lang.lang_time_suffixAgo,
suffixFromNow: lang.lang_time_suffixFromNow,
inPast: lang.lang_time_inPast,
seconds: lang.lang_time_seconds,
minute: lang.lang_time_minute,
minutes: lang.lang_time_minutes,
hour: lang.lang_time_hour,
hours: lang.lang_time_hours,
day: lang.lang_time_day,
days: lang.lang_time_days,
month: lang.lang_time_month,
months: lang.lang_time_months,
year: lang.lang_time_year,
years: lang.lang_time_years,
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
if (!this.settings.allowPast && ! this.settings.allowFuture) {
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
inWords: function (distanceMillis) {
if (!this.settings.allowPast && !this.settings.allowFuture) {
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
}
var $l = this.settings.strings;
@@ -116,20 +115,20 @@
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
parse: function (iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
s = s.replace(/\.\d+/, ""); // remove milliseconds
s = s.replace(/-/, "/").replace(/-/, "/");
s = s.replace(/T/, " ").replace(/Z/, " UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/, " $1$2"); // -04:00 -> -0400
s = s.replace(/([\+\-]\d\d)$/, " $100"); // +09 -> +0900
return new Date(s);
},
datetime: function(elem) {
datetime: function (elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
isTime: function (elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
@@ -139,7 +138,7 @@
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function() {
init: function () {
functions.dispose.call(this);
var refresh_el = $.proxy(refresh, this);
refresh_el();
@@ -148,7 +147,7 @@
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(timestamp) {
update: function (timestamp) {
var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp);
$(this).data('timeago', { datetime: date });
if ($t.settings.localeTitle) {
@@ -156,8 +155,8 @@
}
refresh.apply(this);
},
updateFromDOM: function() {
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
updateFromDOM: function () {
$(this).data('timeago', { datetime: $t.parse($t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title")) });
refresh.apply(this);
},
dispose: function () {
@@ -168,13 +167,13 @@
}
};
$.fn.timeago = function(action, options) {
$.fn.timeago = function (action, options) {
var fn = action ? functions[action] : functions.init;
if (!fn) {
throw new Error("Unknown function name '"+ action +"' for timeago");
throw new Error("Unknown function name '" + action + "' for timeago");
}
// each over objects here and call the requested function
this.each(function() {
this.each(function () {
fn.call(this, options);
});
return this;
@@ -184,7 +183,7 @@
var $s = $t.settings;
//check if it's still visible
if ($s.autoDispose && !$.contains(document.documentElement,this)) {
if ($s.autoDispose && !$.contains(document.documentElement, this)) {
//stop if it has been removed
$(this).timeago("dispose");
return this;
@@ -193,11 +192,11 @@
var data = prepareData(this);
if (!isNaN(data.datetime)) {
if ( $s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
if ($s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
$(this).text(inWords(data.datetime));
} else {
if ($(this).attr('title').length > 0) {
$(this).text($(this).attr('title'));
$(this).text($(this).attr('title'));
}
}
}

View File

@@ -1,36 +1,320 @@
//バージョンチェッカー
function verck(ver) {
console.log("%c Welcome😊", "color: red;font-size:200%;")
var date = new Date();
var show = false
if (localStorage.getItem("ver") != ver && localStorage.getItem("winstore")) {
//ちょっと削除とリンク解析の都合上アレ(s)
//対象外のアプデ:storageが20の最初まで"Usamin (18.6.5)"
if (!localStorage.getItem("usamin_18_6_5_flag")) {
localStorage.setItem("usamin_18_6_5_flag", true)
var multi = localStorage.getItem("column");
var obj = JSON.parse(multi);
for (var i = 0; i < obj.length; i++) {
localStorage.removeItem("card_" + i);
}
}
//ちょっと削除とリンク解析の都合上アレ(e)
show = true
console.log("%c Thank you for your update🎉", "color: red;font-size:200%;");
$(document).ready(function () {
if (localStorage.getItem("winstore")) {
$('#releasenote').modal('open');
}
verp = ver.replace('(', '');
verp = verp.replace('.', '-');
verp = verp.replace('.', '-');
verp = verp.replace('[', '-');
verp = verp.replace(']', '');
verp = verp.replace(')', '');
verp = verp.replace(' ', '_');
console.log("%c " + verp, "color: red;font-size:200%;");
if (lang.language == "ja") {
$("#release-" + verp).show();
} else {
$("#release-en").show();
}
});
}
localStorage.setItem("ver", ver);
if (!show) {
console.log(show)
if (date.getMonth() + 1 >= localStorage.getItem("showSupportMe") || !localStorage.getItem("showSupportMe")) {
if (date.getMonth() == 11) {
var nextmonth = 1
} else {
var nextmonth = date.getMonth() + 2
}
if (lang.language != "ja") {
$("#support-btm-ja").addClass("hide");
$("#support-btm-en").removeClass("hide");
}
localStorage.setItem("showSupportMe", nextmonth)
$("#support-btm").removeClass("hide")
$("#support-btm").animate({
'bottom': '0'
}, {
'duration': 300
});
}
}
var platform = localStorage.getItem("platform");
console.log("Your platform:" + platform)
if (!localStorage.getItem("winstore")) {
$("#start").css('display', 'flex');
}
if (localStorage.getItem("winstore") == "brewcask" || localStorage.getItem("winstore") == "snapcraft" || localStorage.getItem("winstore") == "winstore") {
var winstore = true;
} else {
var winstore = false;
}
var l = 5;
// 生成する文字列に含める文字セット
var c = "abcdefghijklmnopqrstuvwxyz0123456789";
var cl = c.length;
var r = "";
for(var i=0; i<l; i++){
r += c[Math.floor(Math.random()*cl)];
for (var i = 0; i < l; i++) {
r += c[Math.floor(Math.random() * cl)];
}
var start = "https://thedesk.top/ver.json";
fetch(start, {
method: 'GET'
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(mess) {
console.log(mess);
}).then(function (mess) {
console.table(mess);
if (mess) {
if (mess.desk == ver) {
todo("お使いのバージョン" + mess.desk + "は最新です。");
//betaならアプデチェックしない
} else if (ver != "beta") {
var platform = localStorage.getItem("platform");
if (platform == "darwin") {
var newest = mess.desk_mac;
} else {
var newest = mess.desk;
}
if (newest == ver) {
todo(lang.lang_version_usever.replace("{{ver}}", mess.desk));
//betaかWinstoreならアプデチェックしない
} else if (ver.indexOf("beta") != -1 || winstore) {
} else {
localStorage.removeItem("instance")
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('update', "true");
if (localStorage.getItem("new-ver-skip")) {
if (localStorage.getItem("next-ver") != newest) {
postMessage(["sendSinmpleIpc", "update"], "*")
} else {
console.warn(lang.lang_version_skipver);
todo(lang.lang_version_skipver);
}
} else {
postMessage(["sendSinmpleIpc", "update"], "*")
}
}
}
});
if (!localStorage.getItem("last-notice-id")) {
localStorage.setItem("last-notice-id", 0)
}
var start = "https://thedesk.top/notice?since_id=" + localStorage.getItem("last-notice-id");
fetch(start, {
method: 'GET'
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (mess) {
if (mess.length < 1) {
return false;
} else {
var last = localStorage.getItem("last-notice-id")
localStorage.setItem("last-notice-id", mess[0].ID)
for (i = 0; i < mess.length; i++) {
var obj = mess[i];
if (obj.ID * 1 <= last) {
break;
} else {
if (obj.type == "textv2") {
if (~obj.languages.indexOf(lang.language)) {
var show = true;
if (obj.toot != "") {
var toot = '<button class="btn-flat toast-action" onclick="detEx(\'' + obj.toot + '\',\'main\')">Show</button>';
} else {
var toot = "";
}
if (obj.ver != "") {
if (obj.ver == ver) {
show = true;
} else {
show = false;
}
}
if (obj.domain != "") {
var multi = localStorage.getItem("multi");
if (multi) {
show = false;
var accts = JSON.parse(multi);
Object.keys(accts).forEach(function (key) {
var acct = accts[key];
if (acct.domain == obj.domain) {
show = true;
}
});
}
}
if (show) {
M.toast({ html: escapeHTML(obj.text) + toot + '<span class="sml grey-text">(スライドして消去)</span>', displayLength: 86400 })
}
}
}
}
}
}
});
}
var infostreaming = false;
function infowebsocket() {
infows = new WebSocket("wss://thedesk.top/ws/");
infows.onopen = function (mess) {
console.log([tlid, ":Connect Streaming Info:", mess]);
infostreaming = true;
}
infows.onmessage = function (mess) {
console.log([tlid, ":Receive Streaming:", JSON.parse(mess.data)]);
var obj = JSON.parse(mess.data);
if (obj.type != "counter") {
if (obj.type == "textv2") {
if (~obj.languages.indexOf(lang.language)) {
localStorage.setItem("last-notice-id", obj.id)
var show = true;
if (obj.toot != "") {
var toot = '<button class="btn-flat toast-action" onclick="detEx(\'' + obj.toot + '\',\'main\')">Show</button>';
} else {
var toot = "";
}
if (obj.ver != "") {
if (obj.ver == ver) {
show = true;
} else {
show = false;
}
}
if (obj.domain != "") {
var multi = localStorage.getItem("multi");
if (multi) {
show = false;
var accts = JSON.parse(multi);
Object.keys(accts).forEach(function (key) {
var acct = accts[key];
if (acct.domain == obj.domain) {
show = true;
}
});
}
}
if (show) {
console.log(obj.text)
console.log(escapeHTML(obj.text))
M.toast({ html: escapeHTML(obj.text) + toot + '<span class="sml grey-text">(スライドして消去)</span>', displayLength: 86400 })
}
}
}
} else {
$("#persons").text(obj.text);
}
}
infows.onerror = function (error) {
infostreaming = false;
console.error("Error closing:info");
console.error(error);
return false;
};
infows.onclose = function () {
infostreaming = false;
console.error("Closing:info");
};
}
setInterval(function () {
if (!infostreaming) {
console.log("try to connect to base-streaming")
infowebsocket();
}
}, 10000);
function openRN() {
$('#releasenote').modal('open');
if (lang.language == "ja") {
verp = ver.replace('(', '');
verp = verp.replace('.', '-');
verp = verp.replace('.', '-');
verp = verp.replace('[', '-');
verp = verp.replace(']', '');
verp = verp.replace(')', '');
verp = verp.replace(' ', '_');
$("#release-" + verp).show();
} else {
$("#release-en").show();
}
}
function closeSupport() {
$("#support-btm").animate({
'bottom': '-300px'
}, {
'duration': 300,
'complete': function () {
$("#support-btm").addClass("hide")
}
});
}
function storeDialog(platform, ver) {
if (platform == "win32") {
var mes = lang.lang_version_platform;
} else if (platform == "linux") {
var mes = lang.lang_version_platform_linux;
} else if (platform == "darwin") {
var mes = lang.lang_version_platform_mac;
}
Swal.fire({
title: "Select your platform",
text: mes,
type: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#3085d6',
confirmButtonText: lang.lang_no,
cancelButtonText: lang.lang_yesno
}).then((result) => {
//逆にしてる
if (!result.value) {
localStorage.setItem("winstore", "winstore")
} else {
localStorage.setItem("winstore", "localinstall")
}
localStorage.setItem("ver", ver);
show = true
console.log("%c Thank you for your update🎉", "color: red;font-size:200%;");
$(document).ready(function () {
$('#releasenote').modal('open');
verp = ver.replace('(', '');
verp = verp.replace('.', '-');
verp = verp.replace('.', '-');
verp = verp.replace('[', '-');
verp = verp.replace(']', '');
verp = verp.replace(')', '');
verp = verp.replace(' ', '_');
console.log("%c " + verp, "color: red;font-size:200%;");
if (lang.language == "ja") {
$("#release-" + verp).show();
} else {
$("#release-en").show();
}
});
})
}
function closeStart() {
$("#start").css('display', 'none');
var platform = localStorage.getItem("platform");
var ver = localStorage.getItem("ver");
storeDialog(platform, ver)
}

View File

@@ -1,67 +1,82 @@
var defaultemojiList=["activity","flag","food","nature","object","people","place","symbol"];
var defaultemoji={
activity:activity,
flag:flag,
food:food,
nature:nature,
object:object,
people:people,
place:place,
symbol:symbol
var defaultemojiList = ["activity", "flag", "food", "nature", "object", "people", "place", "symbol"];
var defaultemoji = {
activity: activity,
flag: flag,
food: food,
nature: nature,
object: object,
people: people,
place: place,
symbol: symbol
};
var defaultemojiname={
activity:"活動",
flag:"国旗",
food:"食べ物",
nature:"自然",
object:"もの",
people:"ひと",
place:"場所",
symbol:"記号"
};
function defaultEmoji(target){
var json=defaultemoji[target];
var emojis="";
Object.keys(json).forEach(function(key) {
if (lang == "ja") {
var defaultemojiname = {
activity: "活動",
flag: "国旗",
food: "食べ物",
nature: "自然",
object: "もの",
people: "ひと",
place: "場所",
symbol: "記号"
};
} else {
var defaultemojiname = {
activity: "Activities",
flag: "Flags",
food: "Foods",
nature: "Nature",
object: "Tools",
people: "People",
place: "Places",
symbol: "Symbols"
};
}
function defaultEmoji(target) {
var json = defaultemoji[target];
var emojis = "";
Object.keys(json).forEach(function (key) {
var emoji = json[key];
emojis = emojis + '<a onclick="defEmoji(\''+emoji["shortcode"]+'\')" class="pointer"><span style="width: 20px; height: 20px; display: inline-block; background-image: url(\'./img/sheet.png\'); background-size: 4900%; background-position: '+emoji["css"]+';"></span></a>';
emojis = emojis + '<a onclick="defEmoji(\'' + emoji["shortcode"] + '\')" class="pointer"><span style="width: 20px; height: 20px; display: inline-block; background-image: url(\'../../img/sheet.png\'); background-size: 4900%; background-position: ' + emoji["css"] + ';"></span></a>';
});
$("#emoji-list").html(emojis);
$("#now-emoji").text(defaultemojiname[target]+"の絵文字");
$("#now-emoji").text(lang.lang_defaultemojis_text.replace("{{cat}}", defaultemojiname[target]));
$(".emoji-control").addClass("hide");
}
function customEmoji(){
function customEmoji() {
$("#emoji-suggest").val("");
$(".emoji-control").removeClass("hide");
emojiList('home')
}
function defEmoji(target){
if(target=="thinking_face"){
target="thinking";
function defEmoji(target) {
var selin = $("#textarea").prop('selectionStart');
if (!selin) {
selin = 0;
}
var emojiraw = newpack.filter(function (item, index) {
if (item.short_name == target) return true;
});
var hex = emojiraw[0].unified.split("-");
if (hex.length === 2) {
emoji = twemoji.convert.fromCodePoint(hex[0]) + twemoji.convert.fromCodePoint(hex[1]);
} else {
emoji = twemoji.convert.fromCodePoint(hex[0]);
}
var emoji=emojione.shortnameToUnicode(":"+target+":");
var now = $("#textarea").val();
var selin = localStorage.getItem("cursor");
var now = $("#textarea").val();
if(selin>0){
var before = now.substr(0, selin);
var after = now.substr(selin, now.length);
newt = before+ emoji + after;
}else{
newt = emoji+now;
}
console.log(emoji);
$("#textarea").val(newt);
$("#textarea").focus();
var before = now.substr(0, selin);
var after = now.substr(selin, now.length);
newt = before + emoji + after;
$("#textarea").val(newt);
$("#textarea").focus();
}
function faicon(){
var json=faicons;
console.log(json);
var emojis="";
Object.keys(json).forEach(function(key) {
function faicon() {
var json = faicons;
var emojis = "";
Object.keys(json).forEach(function (key) {
var emoji = json[key];
var eje = emoji.replace( /fa-/g , "" ) ;
emojis = emojis + '<a onclick="emojiInsert(\'[faicon]'+eje+'[/faicon]\')" class="pointer white-text" style="font-size:24px"><i class="fa '+emoji+'"></i></a>';
var eje = emoji.replace(/fa-/g, "");
emojis = emojis + '<a onclick="emojiInsert(\'[faicon]' + eje + '[/faicon]\')" class="pointer white-text" style="font-size:24px"><i class="fa ' + emoji + '"></i></a>';
});
$("#emoji-list").html(emojis);
$("#now-emoji").text("faicon");

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,51 +1,88 @@
//入力時にハッシュタグと@をサジェスト
var timer = null;
//インスタンスリスト
var idata = {
"kirishima.cloud": "instance",
"kirishima.cloud_name": "アスタルテ",
"kirishima.cloud_letters": "6229",
"kirishima.cloud_bbcode": "enabled",
"kirishima.cloud_markdown": "enabled",
"kirishima.cloud_glitch": "enabled",
"kirishima.cloud_public": "パブリックタイムライン",
"minohdon.jp": "instance",
"minohdon.jp_name": "箕面どん",
"fedibird.com":"instance",
"fedibird.com_name":"Fedibird",
"fedibird.com_quote":"enabled",
"mastodos.com": "instance",
"mastodos.com_name": "マストどす",
"dev.kirishima.cloud": "hidden",
"dev.kirishima.cloud_name": "アスタルテ(Dev)",
"dev.kirishima.cloud_letters": "6229",
"dev.kirishima.cloud_bbcode": "enabled",
"dev.kirishima.cloud_markdown": "enabled",
"dev.kirishima.cloud_glitch": "enabled",
"mstdn.y-zu.org": "instance",
"mstdn.y-zu.org_name": "Yづドン(Y-zuDon)",
"imastodon.net": "instance",
"imastodon.net_name": "im@stodon",
"imastodon.net_home": "オフィス",
"imastodon.net_local": "楽屋",
"imastodon.net_notification": "ホワイトボード",
"imastodon.net_public": "ライブステージ",
"imastodon.net_post": "あふぅ",
"imastodon.net_fav": "の頭にティンときたようです",
"imastodon.net_bt": ":「わかるわ」",
"imastodon.net_follow": "名刺をいただきました",
"mstdn.osaka_home": "ウチ",
"mstdn.osaka_local": "近所",
"mstdn.osaka_notification": "あめちゃん",
"mstdn.osaka_public": "新世界",
"mstdn.osaka_post": "なんや!",
"mstdn.osaka_fav": "がええやん言いました",
"mstdn.osaka_bt": "がしばいた",
"mstdn.osaka_follow": "ツルまれました",
"mstdn.kemono-friends.info": "instance",
"mstdn.kemono-friends.info_name": "ますとどんちほー",
"mstdn.kemono-friends.info_letters": "1024",
"mstdn.kemono-friends.info_home": "なわばり",
"mstdn.kemono-friends.info_local": "ますとどんちほー",
"mstdn.kemono-friends.info_notification": "ねえねえ!",
"mstdn.kemono-friends.info_public": "ジャパリパーク",
"mstdn.kemono-friends.info_post": "がおー!",
"mstdn.kemono-friends.info_fav": ":「すごーい」",
"mstdn.kemono-friends.info_bt": ":「たーのしー」",
"itabashi.0j0.jp": "instance",
"itabashi.0j0.jp_name": "板橋丼",
"itabashi.0j0.jp_letters": "1024",
"itabashi.0j0.jp_quote":"enabled",
"dtp-mstdn.jp": "instance",
"dtp-mstdn.jp_name": "dtp-mstdn.jp",
"dtp-mstdn.jp_quote":"enabled",
"misskey.io": "misskey",
"misskey.io_name": "misskey.io",
"misskey.io_letters": "1000",
"misskey.io_bbcode": "disabled",
"misskey.io_markdown": "enabled",
"misskey.io_public": "Global",
"misskey.io_post": "Post",
"misskey.io_fav": " reacted your post.",
"misskey.io_bt": " reposted your post.",
"misskey.dev": "misskey",
"misskey.dev_name": "misskey.dev",
"misskey.dev_letters": "1024",
"misskey.dev_bbcode": "disabled",
"misskey.dev_markdown": "enabled",
"misskey.dev_public": "Global",
"misskey.dev_post": "Post",
"misskey.dev_fav": " reacted your post.",
"misskey.dev_bt": " reposted your post.",
"precure.ml": "instance",
"precure.ml_name": "キュアスタ!",
"precure.ml_letters": "1024",
"precure.ml_post": "キュア!",
"odakyu.app_quote":"enabled",
"nitiasa.com_quote":"enabled",
"biwakodon.com_quote":"enabled",
"comm.cx_quote":"enabled"
};
var input = document.getElementById("url");
var prev_val = input.value;
var oldSuggest;
var suggest;
input.addEventListener("focus", function() {
$("#ins-suggest").html("");
window.clearInterval(timer);
timer = window.setInterval(function() {
var new_val = input.value;
if (prev_val != new_val) {
if (new_val.length > 3) {
var start = "https://instances.social/api/1.0/instances/search?q=" +
new_val;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer tC8F6xWGWBUwGScyNevYlx62iO6fdQ4oIK0ad68Oo7ZKB8GQdGpjW9TKxBnIh8grAhvd5rw3iyP9JPamoDpeLQdz62EToPJUW99hDx8rfuJfGdjQuimZPTbIOx0woA5M'
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
if (!json.error) {
var urls = "もしかして:";
Object.keys(json.instances).forEach(function(key) {
var url = json.instances[key];
urls = urls + ' <a onclick="login(\'' + url.name +
'\')" class="pointer">' + url.name + '</a> ';
});
$("#ins-suggest").html(urls);
}
});
}
oldSuggest = suggest;
prev_value = new_val;
}
}, 1000);
}, false);
input.addEventListener("blur", function() {
window.clearInterval(timer);
}, false);
localStorage.setItem("instance", JSON.stringify(idata));

View File

@@ -3,105 +3,59 @@
//アスタルテ判定初期化
localStorage.removeItem("kirishima")
localStorage.removeItem("quoters")
localStorage.removeItem("imas")
localStorage.removeItem("image");
var idata={
"kirishima.cloud":"instance",
"kirishima.cloud_name":"アスタルテ",
"kirishima.cloud_letters":"6229",
"kirishima.cloud_bbcode":"disabled",
"kirishima.cloud_markdown":"disabled",
"minohdon.jp":"instance",
"minohdon.jp_name":"箕面丼",
"minohdon.jp_letters":"500",
"minohdon.jp_bbcode":"disabled",
"minohdon.jp_markdown":"disabled",
"knzk.me":"instance",
"knzk.me_name":"神崎丼",
"knzk.me_letters":"5000",
"knzk.me_bbcode":"disabled",
"knzk.me_markdown":"disabled",
"mastodos.com":"instance",
"mastodos.com_name":"マストどす",
"mastodos.com_letters":"500",
"mastodos.com_bbcode":"disabled",
"mastodos.com_markdown":"disabled",
"dev.kirishima.cloud":"hidden",
"dev.kirishima.cloud_name":"アスタルテ(Dev)",
"dev.kirishima.cloud_letters":"6229",
"dev.kirishima.cloud_bbcode":"enabled",
"dev.kirishima.cloud_markdown":"enabled",
"mstdn.y-zu.org":"instance",
"mstdn.y-zu.org_name":"Yづドン!(502 BadGateway)",
"mstdn.y-zu.org_letters":"500",
"mstdn.y-zu.org_bbcode":"disabled",
"mstdn.y-zu.org_markdown":"disabled",
"imastodon.net":"instance",
"imastodon.net_name":"im@stodon",
"imastodon.net_letters":"500",
"imastodon.net_bbcode":"disabled",
"imastodon.net_markdown":"disabled",
"imastodon.net_home":"オフィス",
"imastodon.net_local":"楽屋",
"imastodon.net_notification":"ホワイトボード",
"imastodon.net_public":"ライブステージ",
"mstdn.osaka":"instance",
"mstdn.osaka_name":"大阪丼",
"mstdn.osaka_letters":"500",
"mstdn.osaka_bbcode":"disabled",
"mstdn.osaka_markdown":"disabled",
"mstdn.osaka_home":"ウチ",
"mstdn.osaka_local":"近所",
"mstdn.osaka_notification":"あめちゃん",
"mstdn.osaka_public":"新世界",
"mstdn.kemono-friends.info":"instance",
"mstdn.kemono-friends.info_name":"ますとどんちほー",
"mstdn.kemono-friends.info_letters":"1024",
"mstdn.kemono-friends.info_bbcode":"disabled",
"mstdn.kemono-friends.info_markdown":"disabled",
"mstdn.kemono-friends.info_home":"なわばり",
"mstdn.kemono-friends.info_local":"ますとどんちほー",
"mstdn.kemono-friends.info_notification":"ねえねえ!",
"mstdn.kemono-friends.info_public":"ジャパリパーク",
"itabashi.0j0.jp":"instance",
"itabashi.0j0.jp_name":"板橋丼",
"itabashi.0j0.jp_letters":"1024",
"itabashi.0j0.jp_bbcode":"disabled",
"itabashi.0j0.jp_markdown":"disabled",
};
localStorage.setItem("instance", JSON.stringify(idata));
localStorage.removeItem("stable")
localStorage.setItem("mode_misskey.xyz", "misskey")
function ck() {
var domain = localStorage.getItem("domain_0");
var at = localStorage.getItem(domain + "_at");
//コード受信
if(location.search){
var m = location.search.match(/\?mode=([a-zA-Z-0-9]+)\&code=(.+)/);
var mode=m[1];
var codex=m[2];
if(mode=="manager" || mode=="login"){
code(codex,mode);
}else{
}
var main = localStorage.getItem("main");
if (!main) {
localStorage.setItem("main", 0)
}
if (at) {
$("#tl").show();
parseColumn();
multi();
var domainz = localStorage.getItem("domain_0");
var at = localStorage.getItem("acct_0_at");
//コード受信
if (location.search) {
var m = location.search.match(/\?mode=([a-zA-Z-0-9]+)\&code=(.+)/);
var mode = m[1];
var codex = m[2];
if (mode == "manager" || mode == "login") {
code(codex, mode);
} else {
}
}
var multi = localStorage.getItem("multi");
if (!multi || multi == "[]") {
var date = new Date();
localStorage.setItem("showSupportMe", date.getMonth() + 2)
location.href = "acct.html?mode=first&code=true"
} else {
$("#tl").show();
multi();
var obj = JSON.parse(multi);
Object.keys(obj).forEach(function (key) {
var acct = obj[key];
if (acct.domain) {
refresh(key, true)
}
});
if (obj[0].domain) {
$("#tl").show();
ticker();
multiSelector(false);
verck(ver);
$(".stw").show()
$("#something-wrong img").attr("src", "../../img/thinking.svg")
}
}
}
ck();
//ログインポップアップ
function login(url) {
if($('#linux:checked').val()=="on"){
if ($('#linux:checked').val() == "on") {
var red = "urn:ietf:wg:oauth:2.0:oob"
}else{
} else {
var red = 'thedesk://login';
}
localStorage.setItem("redirect", red);
@@ -109,37 +63,30 @@ function login(url) {
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = 'json';
httpreq.responseType = "json";
httpreq.send(JSON.stringify({
scopes: 'read write follow',
client_name: "TheDesk(PC)",
redirect_uris: red,
website: "https://thedesk.top"
}));
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(json);
var auth = "https://" + url + "/oauth/authorize?client_id=" + json[
"client_id"] + "&client_secret=" + json["client_secret"] +
"&response_type=code&redirect_uri="+red+"&scope=read+write+follow";
localStorage.setItem("domain_" + acct_id, url);
localStorage.setItem("client_id", json["client_id"]);
localStorage.setItem("client_secret", json["client_secret"]);
$("#auth").show();
$("#masara").hide();
const {
shell
} = require('electron');
"&response_type=code&redirect_uri=" + red + "&scope=read+write+follow";
localStorage.setItem("domain_" + acct_id, url);
localStorage.setItem("client_id", json["client_id"]);
localStorage.setItem("client_secret", json["client_secret"]);
$("#auth").show();
$("#masara").hide();
postMessage(["openUrl", auth], "*")
shell.openExternal(auth);
if($('#linux:checked').val()=="on"){
}else{
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('quit', 'go');
}
if ($('#linux:checked').val() == "on") {
} else {
postMessage(["sendSinmpleIpc", "quit"], "*")
}
}
}
}
@@ -152,15 +99,15 @@ function instance() {
//コードを入れた後認証
function code(code,mode) {
function code(code, mode) {
var red = localStorage.getItem("redirect");
localStorage.removeItem("redirect")
if(!code){
if (!code) {
var code = $("#code").val();
}
if(localStorage.getItem("domain_tmp")){
if (localStorage.getItem("domain_tmp")) {
var url = localStorage.getItem("domain_tmp");
}else{
} else {
var url = localStorage.getItem("domain_" + acct_id);
}
var start = "https://" + url + "/oauth/token";
@@ -178,21 +125,21 @@ function code(code,mode) {
client_secret: secret,
code: code
})
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
}).then(function (json) {
todo(json);
if (json["access_token"]) {
localStorage.setItem(url + "_at", json["access_token"]);
if(mode=="manager"){
if (mode == "manager") {
getdataAdv(url, json["access_token"]);
}else{
} else {
getdata();
}
}
});
}
@@ -201,7 +148,7 @@ function code(code,mode) {
function getdata() {
var acct_id = 0;
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/accounts/verify_credentials";
fetch(start, {
method: 'GET',
@@ -209,33 +156,32 @@ function getdata() {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
}).then(function (json) {
if (json.error) {
console.error("Error:" + json.error);
Materialize.toast("エラーが発生しました。しばらく待ってから再起動してください。Error:" + json.error,
5000);
M.toast({ html: lang.lang_fatalerroroccured + "Error:" + json.error, displayLength: 5000 })
return;
}
var avatar=json["avatar"];
var avatar = json["avatar"];
//missingがmissingなやつ
if(avatar=="/avatars/original/missing.png"){
avatar="./img/missing.svg";
if (avatar == "/avatars/original/missing.png") {
avatar = "./img/missing.svg";
}
var obj = [{
at: at,
name: json["display_name"],
domain: domain,
user: json["acct"],
prof: avatar
prof: avatar,
id: json["id"],
vis: json["source"]["privacy"]
}];
var json = JSON.stringify(obj);
console.log(obj);
localStorage.setItem("multi", json);
localStorage.setItem("name_" + acct_id, json["display_name"]);
localStorage.setItem("user_" + acct_id, json["acct"]);
@@ -257,23 +203,26 @@ function getdataAdv(domain, at) {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
}).then(function (json) {
if (json.error) {
console.error("Error:" + json.error);
Materialize.toast("エラーが発生しました。しばらく待ってから再起動してください。Error:" + json.error,
5000);
M.toast({ html: lang.lang_fatalerroroccured + "Error:" + json.error, displayLength: 5000 })
return;
}
var avatar=json["avatar"];
var avatar = json["avatar"];
//missingがmissingなやつ
if(avatar=="/avatars/original/missing.png"){
avatar="./img/missing.svg";
if (avatar == "/avatars/original/missing.png") {
avatar = "../../img/missing.svg";
}
if (json["source"]["privacy"]) {
var priv = json["source"]["privacy"];
} else {
var priv = "public";
}
var add = {
at: at,
@@ -281,7 +230,8 @@ function getdataAdv(domain, at) {
domain: domain,
user: json["acct"],
prof: avatar,
id: json["id"]
id: json["id"],
vis: priv
};
var multi = localStorage.getItem("multi");
var obj = JSON.parse(multi);
@@ -291,81 +241,182 @@ function getdataAdv(domain, at) {
localStorage.setItem("user_" + target, json["acct"]);
localStorage.setItem("user-id_" + target, json["id"]);
localStorage.setItem("prof_" + target, avatar);
console.log(obj);
var json = JSON.stringify(obj);
localStorage.setItem("multi", json);
location.href="index.html";
location.href = "index.html";
});
}
//ユーザーデータ更新
function refresh(target, loadskip) {
var multi = localStorage.getItem("multi");
var obj = JSON.parse(multi);
if (obj[target].mode == "misskey") {
return
}
var start = "https://" + obj[target].domain +
"/api/v1/accounts/verify_credentials";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + obj[target].at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json.error) {
console.error("Error:" + json.error);
M.toast({ html: lang.lang_fatalerroroccured + "Error:" + json.error, displayLength: 5000 })
return;
}
var avatar = json["avatar"];
//missingがmissingなやつ
if (avatar == "/avatars/original/missing.png" || !avatar) {
avatar = "./img/missing.svg";
}
var ref = {
at: obj[target].at,
name: json["display_name"],
domain: obj[target].domain,
user: json["acct"],
prof: avatar,
id: json["id"],
vis: json["source"]["privacy"]
};
localStorage.setItem("name_" + target, json["display_name"]);
localStorage.setItem("user_" + target, json["acct"]);
localStorage.setItem("user-id_" + target, json["id"]);
localStorage.setItem("prof_" + target, avatar);
localStorage.setItem("follow_" + target, json["following_count"]);
if(json["source"]["sensitive"]){
localStorage.setItem("nsfw_" + target, "true");
}else{
localStorage.removeItem("nsfw_" + target);
}
obj[target] = ref;
var json = JSON.stringify(obj);
localStorage.setItem("multi", json);
if (!loadskip) {
load();
}
});
}
//MarkdownやBBCodeの対応、文字数制限をチェック
//絶対ストリーミングを閉じさせないマン
function ckdb(acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
if(domain=="kirishima.cloud"){
localStorage.removeItem("home_" + acct_id);
localStorage.removeItem("bb_" + acct_id);
localStorage.removeItem("md_" + acct_id);
localStorage.removeItem("local_" + acct_id);
localStorage.removeItem("public_" + acct_id);
localStorage.removeItem("notification_" + acct_id);
localStorage.removeItem("post_" + acct_id);
localStorage.removeItem("fav_" + acct_id);
localStorage.removeItem("bt_" + acct_id);
localStorage.removeItem("followlocale_" + acct_id);
if (domain == "kirishima.cloud") {
localStorage.setItem("kirishima", "true");
$("#ranking-btn").show();
}else if(domain=="imastodon.nat"){
} else if (domain == "imastodon.net") {
localStorage.setItem("imas", "true");
$(".imasonly").show();
}
var at = localStorage.getItem(domain + "_at");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var bbcode = domain + "_bbcode";
var letters = domain + "_letters";
if(localStorage.getItem("instance")){
var json=JSON.parse(localStorage.getItem("instance"));
if (json[bbcode]) {
if (json[bbcode] == "enabled") {
localStorage.setItem("bb_" + acct_id, "true");
} else {
localStorage.removeItem("bb_" + acct_id);
$("[data-activates='bbcode']").addClass("disabled");
$("[data-activates='bbcode']").prop("disabled", true);
}
var quoteMarker = domain + "_quote";
if (localStorage.getItem("instance")) {
var json = JSON.parse(localStorage.getItem("instance"));
if (json[quoteMarker] == "enabled") {
localStorage.setItem("quoters", "true");
localStorage.setItem("quote_" + acct_id, "true");
}
if (json[bbcode]) {
if (json[bbcode] == "enabled") {
localStorage.setItem("bb_" + acct_id, "true");
} else {
localStorage.removeItem("bb_" + acct_id);
$("[data-activates='bbcode']").addClass("disabled");
$("[data-activates='bbcode']").addClass("disabled", true);
$("[data-activates='bbcode']").prop("disabled", true);
}
if (json[domain + "_markdown"] == "enabled") {
localStorage.setItem("md_" + acct_id, "true");
$(".markdown").show();
}else{
localStorage.removeItem("bb_" + acct_id);
}
if(json[domain + "_home"]){
console.log("unique name:"+json[domain + "_home"]);
localStorage.setItem("home_" + acct_id, json[domain + "_home"]);
}
if(json[domain + "_local"]){
localStorage.setItem("local_" + acct_id, json[domain + "_local"]);
}
if(json[domain + "_public"]){
localStorage.setItem("public_" + acct_id, json[domain + "_public"]);
}
if(json[domain + "_notification"]){
localStorage.setItem("notification_" + acct_id, json[domain + "_notification"]);
}
}
}
} else {
localStorage.removeItem("bb_" + acct_id);
$("[data-activates='bbcode']").addClass("disabled");
$("[data-activates='bbcode']").addClass("disabled", true);
}
//サポートインスタンス取得
function support() {
var json=JSON.parse(localStorage.getItem("instance"));
console.log(json);
Object.keys(json).forEach(function(key) {
var instance = json[key];
if (instance == "instance") {
templete = '<button class="btn waves-effect" onclick="login(\'' + key +
'\')">' + json[key + "_name"] + '(' + key + ')</button>';
$("#support").append(templete);
if (json[domain + "_markdown"] == "enabled") {
localStorage.setItem("md_" + acct_id, "true");
$(".markdown").show();
} else {
$(".anti-markdown").hide();
$(".markdown").hide();
localStorage.removeItem("bb_" + acct_id);
}
if (json[domain + "_home"]) {
localStorage.setItem("home_" + acct_id, json[domain + "_home"]);
}
if (json[domain + "_local"]) {
localStorage.setItem("local_" + acct_id, json[domain + "_local"]);
}
if (json[domain + "_public"]) {
localStorage.setItem("public_" + acct_id, json[domain + "_public"]);
}
if (json[domain + "_notification"]) {
localStorage.setItem("notification_" + acct_id, json[domain + "_notification"]);
}
if (json[domain + "_post"]) {
localStorage.setItem("post_" + acct_id, json[domain + "_post"]);
}
if (json[domain + "_fav"]) {
localStorage.setItem("fav_" + acct_id, json[domain + "_fav"]);
}
if (json[domain + "_bt"]) {
localStorage.setItem("bt_" + acct_id, json[domain + "_bt"]);
}
if (json[domain + "_follow"]) {
localStorage.setItem("followlocale_" + acct_id, json[domain + "_follow"]);
}
}
if (localStorage.getItem("mode_" + domain) != "misskey") {
var start = "https://" + domain + "/api/v1/instance";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
console.error(error);
}).then(function (json) {
if (json.error) {
console.error(json.error);
return;
}
if (json) {
if (json["max_toot_chars"]) {
localStorage.setItem("letters_" + acct_id, json["max_toot_chars"]);
}
if (json["urls"]["streaming_api"]) {
localStorage.setItem("streaming_" + acct_id, json["urls"]["streaming_api"]);
}else{
localStorage.removeItem("streaming_" + acct_id);
}
}
});
} else {
}
}
//アカウントを選択…を実装
function multi() {
function multiSelector(parseC) {
var multi = localStorage.getItem("multi");
if (!multi) {
var obj = [];
@@ -375,62 +426,114 @@ function multi() {
var obj = JSON.parse(multi);
}
var templete;
var last = localStorage.getItem("last-use");
var sel;
console.log(obj.length)
if(obj.length<1){
$("#src-acct-sel").html('<option value="tootsearch">Tootsearch</option>');
$("#add-acct-sel").html('<option value="noauth">認証せずに見る</option>');
}else{
Object.keys(obj).forEach(function(key) {
var acct = obj[key];
var list = key * 1 + 1;
if (key == last) {
sel = "selected";
var domain = localStorage.getItem("domain_" + key);
if(idata[domain+"_letters"]){
$("#textarea").attr("data-length", idata[domain+"_letters"])
}else{
$("#textarea").attr("data-length", 500)
}
if(domain=="knzk.me" || domain=="mstdn.y-zu.org"){
$("#type-sel").append('<option value="dm" data-trans="dm" id="direct-add">ダイレクトメッセージ</option>');
}else{
$("#direct-add").remove();
}
var profimg=localStorage.getItem("prof_"+key);
var domain=localStorage.getItem("domain_"+key);
if(!profimg){
profimg="./img/missing.svg";
}
$("#acct-sel-prof").attr("src",profimg);
$("#toot-post-btn").text("トゥート("+domain+")");
if(domain=="kirishima.cloud"){
$("#faicon-btn").show();
}else{
$("#faicon-btn").hide();
}
} else {
sel = "";
if (localStorage.getItem("mainuse") == "main") {
var last = localStorage.getItem("main");
} else if (localStorage.getItem("last-use")) {
var last = localStorage.getItem("last-use");
if (last == "webview" || last == "noauth") {
last = "0";
}
templete = '<option value="' + key + '" data-icon="' + acct.prof +
'" class="left circle" ' + sel + '>' + acct.user + '@' + acct.domain +
'</option>';
$(".acct-sel").append(templete);
});
$("#src-acct-sel").append('<option value="tootsearch">Tootsearch</option>');
$("#add-acct-sel").append('<option value="noauth">認証せずに見る</option>');
} else {
var last = "0";
}
last = last + "";
var sel;
if (obj.length < 1) {
$("#src-acct-sel").html('<option value="tootsearch">Tootsearch</option>');
$("#add-acct-sel").html('<option value="noauth">' + lang.lang_login_noauth + '</option>');
} else {
Object.keys(obj).forEach(function (key) {
var acct = obj[key];
var list = key * 1 + 1;
if (key+"" === last) {
sel = "selected";
var domain = acct.domain;
localStorage.setItem("domain_" + key, domain);
if (idata[domain + "_letters"]) {
$("#textarea").attr("data-length", idata[domain + "_letters"])
} else {
var maxletters = localStorage.getItem("letters_" + key);
if (maxletters > 0) {
$("#textarea").attr("data-length", maxletters)
} else {
$("#textarea").attr("data-length", 500)
}
}
if (idata[domain + "_glitch"]) {
$("#local-button").removeClass("hide")
}
var profimg = acct.prof;
//localStorage.setItem("prof_" + key, profimg);
if (!profimg) {
profimg = "../../img/missing.svg";
}
$("#acct-sel-prof").attr("src", profimg);
if (domain) {
var cc = "(" + domain + ")";
} else {
var cc = "";
}
$("#toot-post-btn").text(lang.lang_toot + cc);
if (acct.background && acct.background != "def" && acct.text && acct.text != "def") {
$("#toot-post-btn").removeClass("indigo");
$("#toot-post-btn").css("background-color", "#" + acct.background);
$("#toot-post-btn").css("color", acct.text);
} else {
}
if (domain == "kirishima.cloud") {
$("#faicon-btn").show();
} else {
$("#faicon-btn").hide();
}
if (domain == "imastodon.net") {
trendTag();
} else {
$("#trendtag").html("");
}
} else {
sel = "";
}
templete = '<option value="' + key + '" data-icon="' + acct.prof +
'" class="left circle" ' + sel + '>' + acct.user + '@' + acct.domain +
'</option>';
$(".acct-sel").append(templete);
});
$("#src-acct-sel").append('<option value="tootsearch">Tootsearch</option>');
$("#add-acct-sel").append('<option value="noauth">' + lang.lang_login_noauth + '</option><option value="webview">Twitter</option>');
$("#dir-acct-sel").append('<option value="noauth">' + lang.lang_login_noauth + '</option>');
}
$('select').formSelect();
if(!parseC){
parseColumn(null, true);
}
$('select').material_select('update');
}
//バージョンエンコ
function enc(ver){
var ver = ver.replace( /\s/g , "" );
var ver = ver.replace( /\(/g , "-" );
var ver = ver.replace( /\)/g , "" );
var ver = ver.replace( /\[/g , "_" );
var ver = ver.replace( /\]/g , "" );
return ver;
function enc(ver) {
var ver = ver.replace(/\s/g, "");
var ver = ver.replace(/\(/g, "-");
var ver = ver.replace(/\)/g, "");
var ver = ver.replace(/\[/g, "_");
var ver = ver.replace(/\]/g, "");
return ver;
}
//インスタンスティッカー
function ticker() {
var start = "https://toot.app/toot/";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
console.error(error);
}).then(function (json) {
if (json) {
localStorage.setItem("ticker", JSON.stringify(json));
}
});
}

View File

@@ -1,7 +1,7 @@
//ログアウトします
function logout(){
localStorage.removeItem(localStorage.getItem("domain_"+acct_id)+"_at");
localStorage.removeItem("domain_"+acct_id);
location.href="index.html";
function logout() {
localStorage.removeItem("acct_" + acct_id + "_at");
localStorage.removeItem("domain_" + acct_id);
location.href = "index.html";
todc();
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +1,196 @@
//プラットフォーム別 最後に読むやつ
//リンクを外部で開くか内部で出すか
$(document).on('click', 'a', e => {
var $a = $(e.target);
var url = $a.attr('href');
if (!url) {
var url = $a.parent().attr('href');
}
var urls=[];
if(url){
urls = url.match(/https?:\/\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/);
$(document).on('click', 'a', e => {
var $a = $(e.target);
var url = $a.attr('href');
if (!url) {
var url = $a.parent().attr('href');
}
var urls = [];
if (url) {
urls = url.match(/https?:\/\/(.+)/);
//トゥートのURLぽかったら
toot = url.match(/https:\/\/([a-zA-Z0-9.-]+)\/@([a-zA-Z0-9_]+)\/([0-9]+)/);
if(toot){
if(toot[1]){
var acct_id=$a.parent().attr("data-acct");
if(!acct_id){
acct_id=0;
toot = url.match(/https:\/\/([^+_]+)\/@([a-zA-Z0-9_]+)\/([0-9]+)/);
if(!toot){
//Pleroma対策
toot = url.match(/https:\/\/([^+_]+)\/users\/([a-zA-Z0-9_]+)\/statuses\/([0-9]+)/);
}
//タグのURLぽかったら
var tags = [];
tags = url.match(
/https:\/\/([^+_]+)\/tags\/([-_.!~*\'()a-zA-Z0-9;\/?:\&=+\$,%#]+)/
);
//メンションっぽかったら
var ats = [];
ats = url.match(
/https:\/\/([^+_]+)\/@([-_.!~*\'()a-zA-Z0-9;\/?:\&=+\$,%#@]+)/
);
if (toot) {
if (toot[1]) {
var acct_id = $a.parent().attr("data-acct");
if (!acct_id) {
acct_id = 0;
}
$a.parent().addClass("loadp")
$a.parent().text("Loading...")
detEx(url,acct_id);
detEx(url, acct_id);
}
} else if (tags) {
if (tags[2]) {
var acct_id = $a.parent().attr("data-acct");
if (!acct_id) {
acct_id = 0;
}
tl('tag', decodeURI(tags[2]), acct_id, 'add')
}
} else if (ats) {
if (ats[2]) {
//Quesdon判定
if (!~ats[2].indexOf("@")) {
udgEx(url, "main");
return false
} else {
postMessage(["openUrl", url], "*")
}
}
}else{
//hrefがhttp/httpsならブラウザで
if(urls){
if (urls[0]) {
const {
shell
} = require('electron');
shell.openExternal(url);
} else {
location.href = url;
//hrefがhttp/httpsならブラウザで
if (urls) {
if (urls[0]) {
if (~url.indexOf("thedeks.top")) {
//alert("If you recieve this alert, let the developer(Cutls@kirishima.cloud) know it with a screenshot.");
url = "https://thedesk.top";
}
postMessage(["openUrl", url], "*")
} else {
location.href = url;
}
} else {
location.href = url;
}
}
}else{
location.href = url;
}
}
}
return false;
});
//よく使うライブラリ
/*マルチバイト用切り出し*/
$.isSurrogatePear = function(upper, lower) {
return 0xD800 <= upper && upper <= 0xDBFF && 0xDC00 <= lower && lower <=
0xDFFF;
};
$.mb_strlen = function(str) {
var ret = 0;
for (var i = 0; i < str.length; i++, ret++) {
var upper = str.charCodeAt(i);
var lower = str.length > (i + 1) ? str.charCodeAt(i + 1) : 0;
if ($.isSurrogatePear(upper, lower)) {
i++;
}
}
return ret;
};
$.mb_substr = function(str, begin, end) {
var ret = '';
for (var i = 0, len = 0; i < str.length; i++, len++) {
var upper = str.charCodeAt(i);
var lower = str.length > (i + 1) ? str.charCodeAt(i + 1) : 0;
var s = '';
if ($.isSurrogatePear(upper, lower)) {
i++;
s = String.fromCharCode(upper, lower);
} else {
s = String.fromCharCode(upper);
}
if (begin <= len && len < end) {
ret += s;
}
}
return ret;
};
$.strip_tags = function(str, allowed) {
allowed = (((allowed || '') + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || [])
.join('');
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>?/gi,
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
return str.replace(commentsAndPhpTags, '').replace(tags, function($0, $1) {
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
});
};
function escapeHTML(str) {
return str.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');
}
//コピー
function execCopy(string){
return false;
});
//よく使うライブラリ
//コピー
function execCopy(string) {
var temp = $("#copy");
temp.val(string);
temp.select();
var result = document.execCommand('copy');
return result;
}
//Nano
function nano(){
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('nano', "");
}
function progshow(e) {
if (e.lengthComputable) {
var percent = e.loaded / e.total;
console.log(percent * 100);
$("#imgsel").hide();
if(percent<1){
$("#imgup").text(Math.floor(percent*100)+"%");
}else{
$("#imgup").text("処理中");
}
var percent = e.loaded / e.total;
console.log("Progress: " + percent * 100);
$("#imgsel").hide();
if (percent < 1) {
$("#imgup").text(Math.floor(percent * 100) + "%");
} else {
$("#imgup").text(lang.lang_progress);
}
}
}
}
function opendev() {
var webview = document.getElementById("webview");
webview.openDevTools();
/*webview.sendInputEvent({
type: "keyDown",
keyCode: '2'
});
*/
}
var soundFile
function playSound() {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
if(soundFile){
soundFile.stop()
}
context = new AudioContext();
context.createBufferSource().start(0);
context.decodeAudioData(request.response, function (buf) {
//console.log("Playing:" , source)
source.buffer = buf;
source.loop = false;
});
source = context.createBufferSource();
volumeControl = context.createGain();
source.connect(volumeControl);
volumeControl.connect(context.destination);
var cvol = localStorage.getItem("customVol")
if (cvol) {
vol = cvol
}else{
vol = 0.8
}
volumeControl.gain.value = vol
source.start(0);
soundFile = source;
function newFunction() {
var source;
return source;
}
}
function nano() {
postMessage(["nano", null], "*")
}
onmessage = function (e) {
if (e.data[0] == "details") {
details(e.data[1][0], e.data[1][1])
} else if (e.data[0] == "udg") {
udg(e.data[1][0], e.data[1][1])
} else if (e.data[0] == "media") {
media(e.data[1][0], e.data[1][1], e.data[1][2])
} else if (e.data[0] == "post") {
post("pass")
} else if (e.data[0] == "toastSaved") {
M.toast({ html: lang.lang_img_DLDone + e.data[1][0] + '<button class="btn-flat toast-action" onclick="openFinder(\'' + e.data[1][1] + '\')">Show</button>', displayLength: 5000 })
} else if (e.data[0] == "parseColumn") {
parseColumn(e.data[1])
} else if (e.data[0] == "exportSettingsCore") {
var exp = exportSettingsCore()
postMessage(["exportSettingsCoreComplete", [e.data[1], exp]], "*")
} else if (e.data[0] == "importSettingsCore") {
importSettingsCore(e.data[1])
}else if (e.data[0] == "fontList") {
fontList(e.data[1])
} else if (e.data[0] == "customSoundSave") {
customSoundSave(e.data[1][0], e.data[1][1])
} else if (e.data[0] == "ctLoadCore") {
ctLoadCore(e.data[1])
} else if (e.data[0] == "ctLoad") {
ctLoad()
} else if (e.data[0] == "customConnect") {
customConnect(e.data[1])
} else if (e.data[0] == "clearCustomImport") {
clearCustomImport()
} else if (e.data[0] == "npCore") {
npCore(e.data[1]);
} else if (e.data[0] == "renderMem") {
renderMem(e.data[1][0], e.data[1][1], e.data[1][2])
} else if (e.data[0] == "updateProg") {
updateProg(e.data[1]);
} else if (e.data[0] == "updateMess") {
updateMess(e.data[1]);
} else if (e.data[0] == "renderAbout") {
renderAbout(e.data[1]);
} else if (e.data[0] == "asRead") {
asRead()
} else if (e.data[0] == "asReadEnd") {
asReadEnd()
} else if (e.data[0] == "alert") {
Swal.fire({
type: 'info',
title: e.data[1]
})
}
}

View File

@@ -0,0 +1 @@
//jQuery読む

View File

@@ -1,3 +1,199 @@
//jQuery読む
window.jQuery = window.$ = require('./js/common/jquery.js');
var Hammer = require('./js/common/hammer.min.js');
document.title="TheDesk"
$.strip_tags = function (str, allowed) {
if (!str) {
return "";
}
allowed = (((allowed || '') + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || [])
.join('');
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>?/gi,
commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
return str.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
});
};
function escapeHTML(str) {
if (!str) {
return "";
}
return str.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');
}
//PHPのnl2brと同様
function nl2br(str) {
if (!str) {
return "";
}
str = str.replace(/\r\n/g, "<br />");
str = str.replace(/(\n|\r)/g, "<br />");
return str;
}
function br2nl(str) {
if (!str) {
return "";
}
str = str.replace(/<br \/>/g, "\r\n");
return str;
}
function formattime(date) {
var str = date.getFullYear() + "-";
if (date.getMonth() + 1 < 10) {
str = str + "0" + (date.getMonth() + 1) + "-";
} else {
str = str + (date.getMonth() + 1) + "-";
}
if (date.getDate() < 10) {
str = str + "0" + date.getDate()
} else {
str = str + date.getDate()
}
str = str + "T";
if (date.getHours() < 10) {
str = str + "0" + date.getHours() + ":"
} else {
str = str + date.getHours() + ":"
}
if (date.getMinutes() < 10) {
str = str + "0" + date.getMinutes()
} else {
str = str + date.getMinutes()
}
return escapeHTML(str);
}
function formattimeutc(date) {
var str = date.getUTCFullYear() + "-";
if (date.getUTCMonth() + 1 < 10) {
str = str + "0" + (date.getUTCMonth() + 1) + "-";
} else {
str = str + (date.getUTCMonth() + 1) + "-";
}
if (date.getUTCDate() < 10) {
str = str + "0" + date.getUTCDate()
} else {
str = str + date.getUTCDate()
}
str = str + "T";
if (date.getUTCHours() < 10) {
str = str + "0" + date.getUTCHours() + ":"
} else {
str = str + date.getUTCHours() + ":"
}
if (date.getUTCMinutes() < 10) {
str = str + "0" + date.getUTCMinutes()
} else {
str = str + date.getUTCMinutes()
}
return escapeHTML(str);
}
postMessage(["sendSinmpleIpc", "custom-css-request"], "*")
function makeCID() {
return randomStr(8) + "-" + randomStr(4) + "-" + randomStr(4) + "-" + randomStr(4) + "-" + randomStr(12);
}
function randomStr(l) {
// 生成する文字列に含める文字セット
var c = "abcdefghijklmnopqrstuvwxyz0123456789";
var cl = c.length;
var r = "";
for (var i = 0; i < l; i++) {
r += c[Math.floor(Math.random() * cl)];
}
return r;
}
function rgbToHex(color) {
// HEXに変換したものを代入する変数
var hex = '';
// 第1引数がHEXのとき変換処理は必要ないのでそのままreturn
// IE8の場合はjQueryのcss()関数でHEXを返すので除外
if (color.match(/^#[a-f\d]{3}$|^#[a-f\d]{6}$/i)) {
return color;
}
// 正規表現
var regex = color.match(/^rgb\(([0-9.]+),\s*([0-9.]+),\s*([0-9.]+)\)$/);
// 正規表現でマッチしたとき
if (regex) {
var rgb =
[
// RGBからHEXへ変換
parseInt(regex[1]).toString(16),
parseInt(regex[2]).toString(16),
parseInt(regex[3]).toString(16)
];
for (var i = 0; i < rgb.length; ++i) {
// rgb(1,1,1)のようなときHEXに変換すると1桁になる
// 1桁のときは前に0を足す
if (rgb[i].length == 1) {
rgb[i] = '0' + rgb[i];
}
hex += rgb[i];
}
return hex;
}
console.error(color + ':第1引数はRGB形式で入力');
}
/*マルチバイト用切り出し*/
$.isSurrogatePear = function (upper, lower) {
return 0xD800 <= upper && upper <= 0xDBFF && 0xDC00 <= lower && lower <= 0xDFFF;
};
$.mb_strlen = function (str) {
var ret = 0;
for (var i = 0; i < str.length; i++ , ret++) {
var upper = str.charCodeAt(i);
var lower = str.length > (i + 1) ? str.charCodeAt(i + 1) : 0;
if ($.isSurrogatePear(upper, lower)) {
i++;
}
}
return ret;
};
$.mb_substr = function (str, begin, end) {
var ret = '';
for (var i = 0, len = 0; i < str.length; i++ , len++) {
var upper = str.charCodeAt(i);
var lower = str.length > (i + 1) ? str.charCodeAt(i + 1) : 0;
var s = '';
if ($.isSurrogatePear(upper, lower)) {
i++;
s = String.fromCharCode(upper, lower);
} else {
s = String.fromCharCode(upper);
}
if (begin <= len && len < end) {
ret += s;
}
}
return ret;
};
//ソートするやつ
function object_array_sort(data, key, order, fn) {
var num_a = -1;
var num_b = 1;
if (order === 'asc') {
num_a = 1;
num_b = -1;
}
data = data.sort(function (a, b) {
var x = a[key];
var y = b[key];
if (x > y) return num_a;
if (x < y) return num_b;
return 0;
});
var arrObj = {};
for (var i = 0; i < data.length; i++) {
arrObj[data[i]['family']] = data[i];
}
data = [];
for (var key in arrObj) {
data.push(arrObj[key]);
}
fn(data);
}
localStorage.removeItem("errors");

View File

@@ -1,44 +1,37 @@
//TL取得
function tl(data) {
var tlid=0;
var acct_id = $("#post-acct-sel").val();
var type = $("#type-sel").val();
var tlid = 0;
var acct_id = $("#post-acct-sel").val();
var type = $("#type-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
//タグの場合はカラム追加して描画
if (!type) {
//デフォルト
var type = "local";
}
var at = localStorage.getItem(domain + "_at");
if (!type) {
//デフォルト
var type = "local";
}
var at = localStorage.getItem("acct_" + acct_id + "_at");
$("#notice_nano").text(cap(type, data) + " TL(" + localStorage.getItem(
"user_" + acct_id) + "@" + domain + ")");
var start = "https://" + domain + "/api/v1/timelines/" + com(type, data);
console.log(start);
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
console.error(error);
}).then(function(json) {
}).then(function (json) {
var templete = parse([json[0]], '', acct_id, tlid);
$("#timeline_nano").html(templete);
jQuery("time.timeago").timeago();
reload(type, '', acct_id, data);
});
}
//Streaming接続
var websocket=[];
function reload(type, cc, acct_id, data) {
var tlid=0;
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
//Streaming接続
var websocket = [];
var tlid = 0;
if (type == "home") {
var start = "wss://" + domain +
"/api/v1/streaming/?stream=user&access_token=" + at;
@@ -50,19 +43,14 @@ function reload(type, cc, acct_id, data) {
"/api/v1/streaming/?stream=public:local&access_token=" + at;
} else if (type == "tag") {
var start = "wss://" + domain +
"/api/v1/streaming/?stream=hashtag&tag=" + data +"&access_token=" + at;
}
console.log(start);
"/api/v1/streaming/?stream=hashtag&tag=" + data + "&access_token=" + at;
}
var wsid = websocket.length;
websocket[wsid] = new WebSocket(start);
websocket[wsid].onopen = function(mess) {
console.log(tlid + ":Connect Streaming API:" + type);
console.log(mess);
websocket[wsid].onopen = function (mess) {
$("#notice_icon_" + tlid).removeClass("red-text");
}
websocket[wsid].onmessage = function(mess) {
console.log(tlid + ":Receive Streaming API:");
console.log(websocket[wsid]);
websocket[wsid].onmessage = function (mess) {
var typeA = JSON.parse(mess.data).event;
if (typeA == "delete") {
var obj = JSON.parse(mess.data).payload;
@@ -70,15 +58,14 @@ function reload(type, cc, acct_id, data) {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
} else if (typeA == "update") {
var obj = JSON.parse(JSON.parse(mess.data).payload);
console.log(obj);
var templete = parse([obj], '', acct_id, tlid);
$("#timeline_nano").html(templete);
var templete = parse([obj], '', acct_id, tlid);
$("#timeline_nano").html(templete);
}
websocket[wsid].onclose = function(mess) {
console.log("Close Streaming API:" + type);
websocket[wsid].onclose = function (mess) {
console.error("Close Streaming API:" + type);
}
}
websocket[wsid].onerror = function(error) {
websocket[wsid].onerror = function (error) {
console.error('WebSocket Error ' + error);
};
}
@@ -130,11 +117,12 @@ function icon(type) {
return "subject"
}
}
function todo(){}
function todc(){}
$(function($) {
function todo() { }
function todc() { }
function hide() { }
$(function ($) {
//キーボードショートカット
$(window).keydown(function(e) {
$(window).keydown(function (e) {
var hasFocus = $('input').is(':focus');
var hasFocus2 = $('textarea').is(':focus');
//Ctrl+Enter:投稿

2
app/js/platform/pickr.js Normal file

File diff suppressed because one or more lines are too long

180
app/js/platform/preload.js Normal file
View File

@@ -0,0 +1,180 @@
var electron = require("electron");
const shell = electron.shell;
var ipc = electron.ipcRenderer;
onmessage = function (e) {
if (e.data[0] == "openUrl") {
urls = e.data[1].match(/https?:\/\/(.+)/);
if (urls) {
shell.openExternal(e.data[1]);
}
} else if (e.data[0] == "sendSinmpleIpc") {
ipc.send(e.data[1], "")
} else if (e.data[0] == "dialogStore") {
ipc.send("dialogStore", e.data[1])
} else if (e.data[0] == "bmpImage") {
ipc.send('bmp-image', e.data[1]);
} else if (e.data[0] == "dialogCW") {
ipc.send("dialogCW", e.data[1])
} else if (e.data[0] == "nativeNotf") {
console.log(e.data[1])
ipc.send('native-notf', e.data[1]);
} else if (e.data[0] == "dialogClient") {
ipc.send("dialogClient", e.data[1])
} else if (e.data[0] == "generalDL") {
ipc.send('general-dl', e.data[1]);
} else if (e.data[0] == "openFinder") {
ipc.send('open-finder', e.data[1]);
} else if (e.data[0] == "columnDel") {
ipc.send('column-del', e.data[1]);
} else if (e.data[0] == "lang") {
ipc.send('lang', e.data[1]);
} else if (e.data[0] == "exportSettings") {
ipc.send('exportSettings', e.data[1]);
} else if (e.data[0] == "exportSettingsCoreComplete") {
ipc.send('export', e.data[1]);
} else if (e.data[0] == "importSettings") {
ipc.send('importSettings', e.data[1]);
} else if (e.data[0] == "customSound") {
ipc.send('customSound', e.data[1]);
} else if (e.data[0] == "themeJsonDelete") {
ipc.send('theme-json-delete', e.data[1]);
} else if (e.data[0] == "themeJsonCreate") {
ipc.send('theme-json-create', e.data[1]);
} else if (e.data[0] == "themeJsonRequest") {
ipc.send('theme-json-request', e.data[1]);
} else if (e.data[0] == "ha") {
ipc.send('ha', e.data[1]);
} else if (e.data[0] == "aboutData") {
ipc.send('aboutData', "");
} else if (e.data[0] == "itunes") {
console.log("NowPlaying")
ipc.send("itunes", e.data[1])
} else if (e.data[0] == "themeCSSRequest") {
ipc.send('theme-css-request', e.data[1]);
} else if (e.data[0] == "customCSSRequest") {
ipc.send('custom-css-request', e.data[1]);
} else if (e.data[0] == "downloadButton") {
ipc.send('download-btn', e.data[1]);
} else if (e.data[0] == "nano") {
ipc.send('nano', null);
} else if (e.data[0] == "asReadComp") {
ipc.send('sendMarkersComplete', null);
}
}
//version.js
ipc.send("getPlatform", "")
ipc.on('platform', function (event, args) {
localStorage.setItem("platform", args[0])
localStorage.setItem("bit", args[1])
localStorage.setItem("about", JSON.stringify([args[2], args[3], args[4], args[5]]))
})
ipc.on('reload', function (event, arg) {
location.reload();
})
//Native Notf
ipc.on('shownotf', function (event, args) {
if (args["type"] == "toot") {
postMessage(["details", [id, acct_id]], "*")
} else if (args["type"] == "userdata") {
postMessage(["udg", [user, acct_id]], "*")
}
})
//first.js
ipc.on('custom-css-response', function (event, arg) {
if (arg == "") { return false; }
var styleNode = document.createElement("style");
styleNode.setAttribute("type", "text/css")
var content = document.createTextNode(arg)
styleNode.append(content)
document.getElementsByTagName("head")[0].append(styleNode)
})
ipc.on('theme-css-response', function (event, arg) {
if (arg == "") { return false; }
var styleNode = document.createElement("style");
styleNode.setAttribute("type", "text/css")
var content = document.createTextNode(arg)
styleNode.append(content)
document.getElementsByTagName("head")[0].append(styleNode)
})
//img.js
ipc.on('bmp-img-comp', function (event, b64) {
postMessage(["media", [b64[0], "image/png", b64[1]]], "*")
});
//ui,img.js
ipc.on('general-dl-prog', function (event, arg) {
console.log("Progress: " + arg);
})
ipc.on('general-dl-message', function (event, arg) {
var argC = arg.replace(/\\/g, "\\\\") + "\\\\.";
console.log("saved")
postMessage(["toastSaved", [arg, argC]], "*")
})
//setting.js
ipc.on('langres', function (event, arg) {
location.href = "../" + arg + "/setting.html"
});
ipc.on('exportSettingsFile', function (event, arg) {
postMessage(["exportSettingsCore", arg], "*")
});
ipc.on('exportAllComplete', function (event, arg) {
postMessage(["alert", "Complete"], "*")
});
ipc.on('config', function (event, arg) {
postMessage(["importSettingsCore", arg], "*")
});
ipc.on('savefolder', function (event, arg) {
localStorage.setItem("savefolder", arg);
});
ipc.on('font-list', function (event, arg) {
postMessage(["fontList", arg], "*")
});
ipc.on('customSoundRender', function (event, args) {
postMessage(["customSoundSave", [args[0], args[1]]], "*")
});
ipc.on('theme-json-list-response', function (event, args) {
postMessage(["ctLoadCore", args], "*")
});
ipc.on('theme-json-delete-complete', function (event, args) {
postMessage(["ctLoad", ""], "*")
});
ipc.on('theme-json-response', function (event, args) {
postMessage(["customConnect", args], "*")
});
ipc.on('theme-json-create-complete', function (event, args) {
postMessage(["clearCustomImport", ""], "*")
postMessage(["ctLoad", ""], "*")
});
//spotify.js
ipc.on('itunes-np', function (event, arg) {
postMessage(["npCore", arg], "*")
})
//tips.js
ipc.on('memory', function (event, arg) {
var use = arg[0];
var cpu = arg[1];
var total = arg[2]
postMessage(["renderMem", [use, cpu, total]], "*")
})
//update.html
ipc.on('prog', function (event, arg) {
postMessage(["updateProg", arg], "*")
})
ipc.on('mess', function (event, arg) {
postMessage(["updateMess", arg], "*")
})
ipc.on('asRead', function (event, arg) {
postMessage(["asRead", ""], "*")
})
ipc.on('asReadEnd', function (event, arg) {
postMessage(["asReadEnd", ""], "*")
})
var webviewDom = document.getElementById('webview');
if (webviewDom) {
webviewDom.addEventListener('new-window', function (e) {
shell.openExternal(e.url);
});
}

View File

@@ -1,56 +0,0 @@
var electron = require("electron");
const fs = require("fs");
const os = require('os')
const shell = electron.shell;
const path = require('path')
function shot(){
//screenshotMsg.textContent = 'Gathering screens...'
$(window).height
let options = {
types: ['screen'],
thumbnailSize: {
width: window.parent.screen.width,
height: window.parent.screen.height
}
}
const desktopCapturer = electron.desktopCapturer;
desktopCapturer.getSources(options, function(error, sources) {
if (error) return console.log(error)
sources.forEach(function(source) {
if(location.search){
var m = location.search.match(/\?id=([a-zA-Z-0-9]+)/);
var title=m[1];
}else{
var title="screenshot";
}
if (source.name === 'Screen 1' || source.name === 'TheDesk') {
var durl=source.thumbnail.toDataURL();
var b64 = durl.match(
/data:image\/png;base64,(.+)/
);
const screenshotPath = path.join(os.tmpdir(), 'screenshot.png');
const savePath = path.join(os.tmpdir(), 'screenshot.png');
var ipc = electron.ipcRenderer;
var h = $(window).height()-150;
var w = $(window).width();
ipc.send('shot', ['file://' + screenshotPath,w,h,b64[1],title]);
if($(".img-parsed").length>0){
for(i=0;i<$(".img-parsed").length;i++){
var url=$(".img-parsed").eq(i).attr("data-url");
ipc.send('shot-img-dl', [url,title+"_img"+i+".png"]);
}
}
window.close();
return;
const message = `Saved screenshot to: ${screenshotPath}`
//screenshotMsg.textContent = message
}
})
})
}
$(window).load(function(){
setTimeout(function(){
shot();
},2000);
});

File diff suppressed because one or more lines are too long

319
app/js/platform/twitter.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,288 +1,316 @@
//BBCodeとMarkdownの入力・パーサー
//アカウント変えた時にBBとかMDとか
function mdCheck(){
function mdCheck() {
var acct_id = $("#post-acct-sel").val();
var profimg=localStorage.getItem("prof_"+acct_id);
$("#acct-sel-prof").attr("src",profimg);
$("#toot-post-btn").text("トゥート("+localStorage.getItem("domain_"+acct_id)+")");
if(!localStorage.getItem("bb_"+acct_id) && !localStorage.getItem("md_"+acct_id)){
$(".markdown").addClass("hide");
var profimg = localStorage.getItem("prof_" + acct_id);
if (!profimg) {
profimg = "../../img/missing.svg";
}
$("#acct-sel-prof").attr("src", profimg);
if (localStorage.getItem("post_" + acct_id)) {
$("#toot-post-btn").text(localStorage.getItem("post_" + acct_id) + "(" + localStorage.getItem("domain_" + acct_id) + ")");
} else {
$("#toot-post-btn").text(lang.lang_toot + "(" + localStorage.getItem("domain_" + acct_id) + ")");
}
if (!localStorage.getItem("bb_" + acct_id) && !localStorage.getItem("md_" + acct_id)) {
$(".markdown").addClass("hide");
$(".anti-markdown").addClass("hide");
}else{
$(".markdown").removeClass("hide");
$(".anti-markdown").addClass("hide");
}
if($(".markdown").hasClass("hide")){
localStorage.setItem("md","hide");
}else{
} else {
$(".anti-markdown").removeClass("hide");
}
if ($(".markdown").hasClass("hide")) {
localStorage.setItem("md", "hide");
} else {
localStorage.removeItem("md");
}
var domain = localStorage.getItem("domain_" + acct_id);
if(domain=="itabashi.0j0.jp"){
if (domain == "itabashi.0j0.jp") {
$("#limited-button").removeClass("hide");
}else{
} else {
$("#limited-button").addClass("hide");
}
if(domain=="kirishima.cloud"){
if (domain == "kirishima.cloud") {
$("#faicon-btn").show();
}else{
} else {
$("#faicon-btn").hide();
}
if(idata[domain+"_letters"]){
$("#textarea").attr("data-length", idata[domain+"_letters"])
}else{
if (domain == "imastodon.net") {
trendTag();
} else {
$("#trendtag").html("");
}
if (localStorage.getItem("mode_" + domain) == "misskey") {
M.toast({ html: lang.lang_bbmd_misskey, displayLength: 5000 })
}
if (idata[domain + "_letters"]) {
$("#textarea").attr("data-length", idata[domain + "_letters"])
} else {
$("#textarea").attr("data-length", 500)
}
if (idata[domain + "_glitch"] === "true") {
$("#local-button").removeClass("hide");
} else {
$("#local-button").addClass("hide");
}
var multi = localStorage.getItem("multi");
if (multi) {
var obj = JSON.parse(multi);
if (obj[acct_id].background && obj[acct_id].background != "def" && obj[acct_id].text && obj[acct_id].text != "def") {
$("#toot-post-btn").removeClass("indigo");
$("#toot-post-btn").css("background-color", "#" + obj[acct_id].background);
$("#toot-post-btn").css("color", obj[acct_id].text);
} else {
$("#toot-post-btn").css("background-color", "");
$("#toot-post-btn").css("color", "");
$("#toot-post-btn").addClass("indigo");
}
}
loadVis();
}
//BOXのトグルボタン
function mdToggle(){
function mdToggle() {
$(".markdown").toggleClass("hide");
$(".anti-markdown").toggleClass("hide");
if($(".markdown").hasClass("hide")){
localStorage.setItem("md","hide");
}else{
if ($(".markdown").hasClass("hide")) {
localStorage.setItem("md", "hide");
} else {
localStorage.removeItem("md");
}
}
//最初に読み込みます(MD対応インスタンスかチェック)
if(localStorage.getItem("md")=="hide"){
if (localStorage.getItem("md") == "hide") {
$(".markdown").addClass("hide");
$(".anti-markdown").removeClass("hide");
}
//タグを選んだ時に(BB版)
function tagsel(tag){
var acct_id = $("#post-acct-sel").val();
if(!localStorage.getItem("bb_"+acct_id)){
return false;
}
if(tag=="large" || tag=="size" || tag=="color" || tag=="colorhex"){
var sub=$("#"+tag).val();
var sub = sub.replace( /#/g , "" ) ;
surroundHTML(tag+"="+sub,tag);
}else if(tag=="flip=vertical" || tag=="flip=horizontal"){
surroundHTML(tag,"flip");
}else{
surroundHTML(tag,tag);
}
$("#textarea").focus();
}
//HTMLをエスケープしてXSSを防ぐ
function escape_html (string) {
if(typeof string !== 'string') {
return string;
}
return string.replace(/[&'`"<>]/g, function(match) {
return {
'&': '&amp;',
"'": '&#x27;',
'`': '&#x60;',
'"': '&quot;',
'<': '&lt;',
'>': '&gt;',
}[match]
});
function tagsel(tag) {
var acct_id = $("#post-acct-sel").val();
if (!localStorage.getItem("bb_" + acct_id)) {
return false;
}
if (tag == "large" || tag == "size" || tag == "color" || tag == "colorhex") {
var sub = $("#" + tag).val();
var sub = sub.replace(/#/g, "");
surroundHTML(tag + "=" + sub, tag);
} else if (tag == "flip=vertical" || tag == "flip=horizontal") {
surroundHTML(tag, "flip");
} else {
surroundHTML(tag, tag);
}
$("#textarea").focus();
}
//PHPのnl2brと同様
function nl2br(str) {
str = str.replace(/\r\n/g, "<br />");
str = str.replace(/(\n|\r)/g, "<br />");
return str;
//HTMLをエスケープしてXSSを防ぐ
function escape_html(string) {
if (typeof string !== 'string') {
return string;
}
return string.replace(/[&'`"<>]/g, function (match) {
return {
'&': '&amp;',
"'": '&#x27;',
'`': '&#x60;',
'"': '&quot;',
'<': '&lt;',
'>': '&gt;',
}[match]
});
}
//テキストボックスで選択したやつをタグで囲む(BB版)
function surroundHTML(tagS,tagE) {
function surroundHTML(tagS, tagE) {
var acct_id = $("#post-acct-sel").val();
if(!localStorage.getItem("bb_"+acct_id)){
return false;
}
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if (range || pos.start != pos.end) {
insertNode = '[' + tagS + ']' + range + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
else if (pos.start == pos.end) {
insertNode = '[' + tagS + ']' + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
}
function markdown(tag,ck,br,space){
if(space=="before"){
tagE=tag;
tag=" "+tag;
}else{
tagE=tag;
}
surroundMD(tag,tagE,ck,br);
$("#textarea").focus();
}
function surroundMD(tagS,tagE,ck,br) {
var acct_id = $("#post-acct-sel").val();
if(!localStorage.getItem("md_"+acct_id)){
return false;
}
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if(br=="yes"){
var br="\n";
}else{
var br="";
if (!localStorage.getItem("bb_" + acct_id)) {
return false;
}
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if (range || pos.start != pos.end) {
insertNode = '[' + tagS + ']' + range + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
else if (pos.start == pos.end) {
insertNode = '[' + tagS + ']' + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
}
function markdown(tag, ck, br, space) {
if (space == "before") {
tagE = tag;
tag = " " + tag;
} else {
tagE = tag;
}
surroundMD(tag, tagE, ck, br);
$("#textarea").focus();
}
function surroundMD(tagS, tagE, ck, br) {
var acct_id = $("#post-acct-sel").val();
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if (br == "yes") {
var br = "\n";
} else {
var br = "";
}
if ((range || pos.start != pos.end) && ck == "yes") {
insertNode = tagS + range + tagE;
target.value = beforeNode + insertNode + br + afterNode;
}
else if (pos.start == pos.end || ck == "no") {
insertNode = tagS + range;
target.value = beforeNode + insertNode + br + afterNode;
}
if ((range || pos.start != pos.end )&& ck=="yes") {
insertNode = tagS + range + tagE ;
target.value = beforeNode + insertNode + br + afterNode;
}
else if (pos.start == pos.end || ck=="no") {
insertNode = tagS + range;
target.value = beforeNode + insertNode + br + afterNode;
}
}
//テキストボックスの前後チェック
function getAreaRange(obj) {
var pos = new Object();
if(window.getSelection()) {
if (window.getSelection()) {
pos.start = obj.selectionStart;
pos.end = obj.selectionEnd;
pos.end = obj.selectionEnd;
}
return pos;
}
//Markdownのリンク挿入
function markdownLink(){
function markdownLink() {
var acct_id = $("#post-acct-sel").val();
if(!localStorage.getItem("md_"+acct_id)){
return false;
}
var linkIns="["+$("#linkt").val()+"]"+"("+$("#link2").val()+")";
if(linkIns!="[]()"){
$("#textarea").val($("#textarea").val()+linkIns);
$("#linkt").val("");
$("#link2").val("");
$("#textarea").focus();
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
var linkIns = "[" + $("#linkt").val() + "]" + "(" + $("#link2").val() + ")";
if (linkIns != "[]()") {
$("#textarea").val($("#textarea").val() + linkIns);
$("#linkt").val("");
$("#link2").val("");
$("#textarea").focus();
}
}
//Markdownのimg挿入
function markdownImage(){
function markdownImage() {
var acct_id = $("#post-acct-sel").val();
if(!localStorage.getItem("md_"+acct_id)){
return false;
}
var imgIns="!["+$("#image").val()+"]"+"("+$("#image2").val()+")";
if(imgIns!="![]()"){
$("#textarea").val($("#textarea").val()+imgIns);
$("#image").val("");
$("#image2").val("");
$("#textarea").focus();
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
var imgIns = "![" + $("#image").val() + "]" + "(" + $("#image2").val() + ")";
if (imgIns != "![]()") {
$("#textarea").val($("#textarea").val() + imgIns);
$("#image").val("");
$("#image2").val("");
$("#textarea").focus();
}
}
//文字数をチェック(hタグ用)
function str_count(all, part) {
return (all.match(new RegExp(part, "g")) || []).length;
return (all.match(new RegExp(part, "g")) || []).length;
}
//プレビュー
function preview(){
$("#preview-field").show();
$("#toot-field").hide();
$("#preview-btn").hide();
var bb=escape_html($("#textarea").val());
function preview() {
$("#preview-field").show();
$("#toot-field").hide();
$("#preview-btn").hide();
var bb = escape_html($("#textarea").val());
//quote
var bb=bb.replace(/>(.+)$/g,'<blockquote>$1<\/blockquote>');
var bb = bb.replace(/>(.+)$/g, '<blockquote>$1<\/blockquote>');
//spin
var bb=bb.replace(/\[spin\](.+)\[\/spin\]/g,'<span class="fa fa-spin">$1<\/span>');
var bb = bb.replace(/\[spin\](.+)\[\/spin\]/g, '<span class="fa fa-spin">$1<\/span>');
//pulse
var bb=bb.replace(/\[pulse\](.+)\[\/pulse\]/g,'<span class="bbcode-pulse-loading">$1<\/span>');
var bb = bb.replace(/\[pulse\](.+)\[\/pulse\]/g, '<span class="bbcode-pulse-loading">$1<\/span>');
//large
var bb=bb.replace(/\[large=([0-9]{1,2})x\](.+)\[\/large\]/g,'<span class="fa fa-$1x">$2<\/span>');
var bb = bb.replace(/\[large=([0-9]{1,2})x\](.+)\[\/large\]/g, '<span class="fa fa-$1x">$2<\/span>');
//vertical
var bb=bb.replace(/\[flip=vertical\](.+)\[\/flip\]/g,'<span class="fa fa-flip-vertical">$1<\/span>');
var bb = bb.replace(/\[flip=vertical\](.+)\[\/flip\]/g, '<span class="fa fa-flip-vertical">$1<\/span>');
//horizontal
var bb=bb.replace(/\[flip=horizontal\](.+)\[\/flip\]/g,'<span class="fa fa-flip-horizontal">$1<\/span>');
var bb = bb.replace(/\[flip=horizontal\](.+)\[\/flip\]/g, '<span class="fa fa-flip-horizontal">$1<\/span>');
//b
var bb=bb.replace(/\[b\](.+)\[\/b\]/g,'<b>$1<\/b>');
var bb = bb.replace(/\[b\](.+)\[\/b\]/g, '<b>$1<\/b>');
//i
var bb=bb.replace(/\[i\](.+)\[\/i\]/g,'<i>$1<\/i>');
var bb = bb.replace(/\[i\](.+)\[\/i\]/g, '<i>$1<\/i>');
//u
var bb=bb.replace(/\[u\](.+)\[\/u\]/g,'<u>$1<\/u>');
var bb = bb.replace(/\[u\](.+)\[\/u\]/g, '<u>$1<\/u>');
//s
var bb=bb.replace(/\[s\](.+)\[\/s\]/g,'<s>$1<\/s>');
var bb = bb.replace(/\[s\](.+)\[\/s\]/g, '<s>$1<\/s>');
//size
var bb=bb.replace(/\[size=([0-9]{1,2})\](.+)\[\/size\]/g,'<span style="font-size:$1px">$2<\/span>');
var bb = bb.replace(/\[size=([0-9]{1,2})\](.+)\[\/size\]/g, '<span style="font-size:$1px">$2<\/span>');
//colorhex
var bb=bb.replace(/\[colorhex=([A-Fa-f0-9]+)\](.+)\[\/colorhex\]/g,'<span style="color:#$1">$2<\/span>');
var bb = bb.replace(/\[colorhex=([A-Fa-f0-9]+)\](.+)\[\/colorhex\]/g, '<span style="color:#$1">$2<\/span>');
//code
var bb=bb.replace(/`(.+)`/g,'<code>$1<\/code>');
var bb = bb.replace(/`(.+)`/g, '<code>$1<\/code>');
//head
var m;
m=bb.match(/^#{1,6}(.+)$/gm);
if(m){
for(let i = 0; i < m.length; i++) {
var t=m[i].match(/^#{1,6}(.+)$/);
var indexct='<h'+str_count(m[i],"#")+'>'+t[1]+'</h'+str_count(m[i],"#")+'>';
var bb=bb.replace(new RegExp(m[i], ""),indexct);
}
m = bb.match(/^#{1,6}(.+)$/gm);
if (m) {
for (let i = 0; i < m.length; i++) {
var t = m[i].match(/^#{1,6}(.+)$/);
var indexct = '<h' + str_count(m[i], "#") + '>' + t[1] + '</h' + str_count(m[i], "#") + '>';
var bb = bb.replace(new RegExp(m[i], ""), indexct);
}
}
//list(ul)
var li;
li=bb.match(/^\- (.+)$/gm);
if(li){
for(let l = 0; l < li.length; l++) {
var u=li[l].match(/^\- (.+)$/);
var listUl='<li>'+u[1]+'</li>';
if(l == 0){
listUl='<ul>'+listUl;
li = bb.match(/^\- (.+)$/gm);
if (li) {
for (let l = 0; l < li.length; l++) {
var u = li[l].match(/^\- (.+)$/);
var listUl = '<li>' + u[1] + '</li>';
if (l == 0) {
listUl = '<ul>' + listUl;
}
if (l == li.length - 1) {
listUl = listUl + '</ul>';
}
var bb = bb.replace(new RegExp(li[l], ""), listUl);
}
if(l==li.length-1){
listUl=listUl+'</ul>';
}
var bb=bb.replace(new RegExp(li[l], ""),listUl);
}
}
//list(ol)
var li;
li=bb.match(/^1\. (.+)$/gm);
if(li){
for(let l = 0; l < li.length; l++) {
var u=li[l].match(/^1\. (.+)$/);
var listUl='<li>'+u[1]+'</li>';
if(l == 0){
listUl='<ol>'+listUl;
li = bb.match(/^1\. (.+)$/gm);
if (li) {
for (let l = 0; l < li.length; l++) {
var u = li[l].match(/^1\. (.+)$/);
var listUl = '<li>' + u[1] + '</li>';
if (l === 0) {
listUl = '<ol>' + listUl;
}
if (l === li.length - 1) {
listUl = listUl + '</ol>';
}
var bb = bb.replace(new RegExp(li[l], ""), listUl);
}
if(l==li.length-1){
listUl=listUl+'</ol>';
}
var bb=bb.replace(new RegExp(li[l], ""),listUl);
}
}
//img
var bb=bb.replace(/!\[(.+)\]\((https:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g,'<img src="$2" text="$1" style="width:100%">');
var bb = bb.replace(/!\[(.+)\]\((https:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g, '<img src="$2" text="$1" style="width:100%">');
//link
var bb=bb.replace(/\[(.+)\]\((https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g,'<a href="$2" target="_blank">$1<\/a>');
bb=nl2br(bb);
bb=bb.replace(new RegExp("</li><br />", "g"),"");
var bb = bb.replace(/\[(.+)\]\((https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g, '<a href="$2" target="_blank">$1<\/a>');
bb = nl2br(bb);
bb = bb.replace(new RegExp("</li><br />", "g"), "");
$("#md-preview").html(bb);
}
//Editで戻る
function previewEdit(){
$("#preview-field").hide();
$("#toot-field").show();
$("#preview-btn").show();
$("#md-preview").html("");
}
}
//Editで戻る
function previewEdit() {
$("#preview-field").hide();
$("#toot-field").show();
$("#preview-btn").show();
$("#md-preview").html("");
}

View File

@@ -4,67 +4,186 @@ $("#emoji-before").addClass("disabled");
$("#emoji-next").addClass("disabled");
//絵文字ボタンのトグル
function emoji() {
function emojiToggle(reaction) {
var acct_id = $("#post-acct-sel").val();
var selin = $("#textarea").prop('selectionStart');
if(!selin){
selin=0;
if (!selin) {
selin = 0;
}
localStorage.setItem("cursor", selin);
if ($("#emoji").hasClass("hide")) {
$("#emoji").removeClass("hide")
if (!localStorage.getItem("emoji_" + acct_id)) {
$("#right-side").show()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "calc(100% - 300px)")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1 + 300
} else {
width = 600
}
$("#post-box").css("width", width + "px")
$("#suggest").html("");
if (!localStorage.getItem("emojis_" + acct_id)) {
var html =
'<button class="btn waves-effect green" style="width:100%; padding:0; margin-top:0;" onclick="emojiGet(\'true\');">絵文字リスト取得</button>';
'<button class="btn waves-effect green" style="width:100%; padding:0; margin-top:0;" onclick="emojiGet(\'true\');">' + lang.lang_emoji_get + '</button>';
$("#emoji-list").html(html);
} else {
emojiList('home');
emojiList('home', reaction);
}
} else {
$("#poll").addClass("hide")
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#emoji").addClass("hide")
$("#suggest").html("");
$("#left-side").css("width", "100%")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1
} else {
width = 300
}
$("#post-box").css("width", width + "px")
}
}
//絵文字リスト挿入
function emojiGet(parse) {
$('#emoji-list').html('Loading...');
function emojiGet(parse, started) {
$('#emoji-list').text('Loading...');
var acct_id = $("#post-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var start = "https://" + domain + "/api/v1/custom_emojis";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
if (parse == "true") {
$('#emoji-list').html('Parsing...');
//絵文字をマストドン公式と同順にソート
json.sort(function(a, b) {
if (a.shortcode < b.shortcode) return -1;
if (a.shortcode > b.shortcode) return 1;
return 0;
if (localStorage.getItem("mode_" + domain) != "misskey") {
var start = "https://" + domain + "/api/v1/custom_emojis";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (parse == "true") {
$('#emoji-list').text('Parsing...');
var md = {
"categorized": {},
"uncategorized": []
};
var if_categorized = false
Object.keys(json).forEach(function (key) {
var emoji = json[key];
if (emoji.visible_in_picker) {
var listed = true
} else {
var listed = false
}
if (emoji.category) {
var cat = emoji.category
if (!md["categorized"][cat]) {
md["categorized"][cat] = []
}
md["categorized"][cat].push({
"shortcode": emoji.shortcode,
"url": emoji.url,
"listed": listed
})
if_categorized = true
} else {
md["uncategorized"].push({
"shortcode": emoji.shortcode,
"url": emoji.url,
"listed": listed
})
}
});
console.log(md)
//絵文字をマストドン公式と同順にソート
md["uncategorized"].sort(function (a, b) {
if (a.shortcode < b.shortcode) return -1;
if (a.shortcode > b.shortcode) return 1;
return 0;
});
Object.keys(md["categorized"]).forEach(function (key) {
md["categorized"][key].sort(function (a, b) {
if (a.shortcode < b.shortcode) return -1;
if (a.shortcode > b.shortcode) return 1;
return 0;
});
});
md["if_categorized"] = if_categorized
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
} else {
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
}
localStorage.setItem("emojiseek", 0);
if (!started) {
emojiList('home')
}
});
} else {
var start = "https://" + domain + "/api/meta";
fetch(start, {
method: 'POST',
headers: {
'content-type': 'application/json'
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json.enableEmojiReaction) {
localStorage.setItem("emojiReaction_" + acct_id, "true");
} else {
localStorage.setItem("emojiReaction_" + acct_id, "disabled");
}
var emojis = json.emojis;
var md = {"uncategorized": []}
Object.keys(emojis).forEach(function (key) {
var emoji = emojis[key];
md["uncategorized"].push({
"shortcode": emoji.name,
"url": emoji.url,
"listed": true
})
});
localStorage.setItem("emoji_" + acct_id, JSON.stringify(json));
} else {
localStorage.setItem("emoji_" + acct_id, JSON.stringify(json));
}
localStorage.setItem("emojiseek", 0);
emojiList('home')
});
md["if_categorized"] = false
if (parse == "true") {
$('#emoji-list').text('Parsing...');
//絵文字をマストドン公式と同順にソート
md["uncategorized"].sort(function (a, b) {
if (a.shortcode < b.shortcode) return -1;
if (a.shortcode > b.shortcode) return 1;
return 0;
});
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
} else {
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
}
localStorage.setItem("emojiseek", 0);
if (!started) {
emojiList('home')
}
});
}
}
//リストの描画
function emojiList(target) {
$("#now-emoji").text("カスタム絵文字");
function emojiList(target, reaction) {
$("#now-emoji").text(lang.lang_emoji_custom);
var acct_id = $("#post-acct-sel").val();
if (reaction && localStorage.getItem("emojiReaction_" + acct_id) != "true") {
console.error("Disabled")
clear()
hide();
return false;
}
var start = localStorage.getItem("emojiseek");
if (target == "next") {
var start = start * 1 + 127;
@@ -77,7 +196,28 @@ function emojiList(target) {
localStorage.getItem("emojiseek", 0)
}
var html = '';
var obj = JSON.parse(localStorage.getItem("emoji_" + acct_id));
var raw = JSON.parse(localStorage.getItem("emojis_" + acct_id));
console.log(raw)
if (raw.if_categorized) {
var obj = [{
"divider": true,
"cat": lang.lang_emoji_uncat
}]
var cats = raw["uncategorized"]
obj = obj.concat(cats);
Object.keys(raw["categorized"]).forEach(function (key) {
var cats = raw["categorized"][key];
obj = obj.concat([{
"divider": true,
"cat": key
}]);
obj = obj.concat(cats);
});
} else {
var obj = raw["uncategorized"]
}
console.log(obj)
var num = obj.length;
if (num < start) {
var start = 0;
@@ -86,19 +226,37 @@ function emojiList(target) {
var page = Math.ceil(num / 126);
$("#emoji-sum").text(page);
var ct = Math.ceil(start / 126);
if (ct == 0) {
var ct = 1;
if (ct === 0) {
if(num > 0){
var ct = 1;
}
$("#emoji-before").addClass("disabled");
} else {
$("#emoji-before").removeClass("disabled");
}
$("#emoji-next").removeClass("disabled");
if (page != 1) {
$("#emoji-next").removeClass("disabled");
} else {
$("#emoji-next").addClass("disabled");
}
$("#emoji-count").text(ct);
for (i = start; i < start + 126; i++) {
var emoji = obj[i];
if (emoji) {
html = html + '<a onclick="emojiInsert(\':' + emoji.shortcode +
': \')" class="pointer"><img src="' + emoji.url + '" width="20"></a>';
if (reaction) {
html = html + '<a onclick="emojiReaction(\':' + emoji.shortcode +
':\')" class="pointer"><img src="' + emoji.url + '" width="20" title="' + emoji.shortcode + '"></a>';
} else {
if(emoji.divider){
html = html + '<p style="margin-bottom:0">'+ emoji.cat +'</p>'
}else{
if (emoji.listed) {
html = html + '<a onclick="emojiInsert(\':' + emoji.shortcode +
':\')" class="pointer"><img src="' + emoji.url + '" width="20" title="' + emoji.shortcode + '"></a>';
}
}
}
}
}
$("#emoji-list").html(html);
@@ -107,68 +265,39 @@ function emojiList(target) {
//絵文字など様々なものをテキストボックスに挿入
function emojiInsert(code, del) {
var now = $("#textarea").val();
var selin = localStorage.getItem("cursor");
console.log(selin);
var now = $("#textarea").val();
if(selin>0){
var before = now.substr(0, selin);
var after = now.substr(selin, now.length);
newt = before + " "+ code+" " + after;
}else{
newt = code+" ";
var selin = $("#textarea").prop('selectionStart');
if (localStorage.getItem("emoji-zero-width") == "yes") {
var blank = "";
} else {
var blank = " ";
}
var before = now.substr(0, selin);
if (before.slice(-1) != " ") {
before = before + blank
}
var after = now.substr(selin, now.length);
if (after.slice(-1) != " ") {
after = blank + after
}
newt = before + code + after;
if (!del) {
$("#textarea").val(newt);
//emoji();
} else {
var regExp = new RegExp(del, "g");
var regExp = new RegExp(del.replace(/[.*+?^=!:${}()|[\]\/\\]/g, "\\$&"), "g");
var now = now.replace(regExp, "");
$("#textarea").val(now + " " + code);
$("#textarea").val(now + blank + code);
}
$("#textarea").focus();
}
//改行挿入
function brInsert(code) {
if (!$('#post-box').hasClass("appear")) {
localStorage.setItem("nohide", true);
show();
}
var now = $("#textarea").val();
$("#textarea").val(now + code);
$("#textarea").focus();
}
//入力時に絵文字をサジェスト
var etimer = null;
var einput = document.getElementById("emoji-suggest");
var prev_val = einput.value;
var oldSuggest;
var suggest;
einput.addEventListener("focus", function() {
$(".emoji-control").addClass("hide");
$("#suggest").html("");
window.clearInterval(etimer);
etimer = window.setInterval(function() {
var new_val = einput.value;
var html="";
if (prev_val != new_val && new_val.length > 3) {
var obj = JSON.parse(localStorage.getItem("emoji_" + acct_id));
var num = obj.length;
for (i = 0; i < num; i++) {
var emoji = obj[i];
if ( ~emoji.shortcode.indexOf(new_val)) {
//strにhogeを含む場合の処理
if (emoji) {
html = html + '<a onclick="emojiInsert(\':' + emoji.shortcode +
': \')" class="pointer"><img src="' + emoji.url + '" width="20"></a>';
}
}
}
$("#emoji-list").html(html+'<br><a onclick="customEmoji()" class="pointer waves-effect">リセット</a>');
};
oldSuggest = suggest;
prev_value = new_val;
}, 1000);
}, false);
einput.addEventListener("blur", function() {
window.clearInterval(etimer);
}, false);

View File

@@ -2,66 +2,57 @@
var obj = $("body");
var system;
//ドラッグスタート
obj.on('dragstart', function(e) {
system = "locked"
obj.on("dragstart", function(e) {
system = "locked";
});
//何もなくファイルが通過
obj.on('dragend', function(e) {
obj.on("dragend", function(e) {
system = "";
});
//ドラッグファイルが画面上に
obj.on('dragenter', function(e) {
obj.on("dragenter", function(e) {
if (system != "locked") {
$("#drag").css('display', 'flex');
$("#drag").css("display", "flex");
}
});
$("body").on('dragover', function(e) {
$("body").on("dragover", function(e) {
e.stopPropagation();
e.preventDefault();
});
//ドロップした
$("body").on('drop', function(e) {
$("body").on("drop", function(e) {
if (system != "locked") {
$("#drag").css('display', 'none');
$("#drag").css("display", "none");
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
pimg(files);
}
});
//何もなくファイルが通過
$("#drag").on('dragleave', function(e) {
$("#drag").css('display', 'none');
$("#drag").on("dragleave", function(e) {
$("#drag").css("display", "none");
});
//複数アップ
function pimg(files) {
console.log(files);
console.table(files);
for (i = 0; i < files.length; i++) {
var dot=files[i].path.match(/\.(.+)$/)[1];
if(dot=="bmp" || dot=="BMP"){
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('bmp-image', [files[i].path,i]);
todo("変換中...");
}else{
handleFileUpload(files[i], obj,i);
var dot = files[i].path.match(/\.(.+)$/)[1];
if (dot == "bmp" || dot == "BMP") {
postMessage(["bmpImage", [files[i].path, i]], "*");
todo(lang.lang_progress);
} else {
handleFileUpload(files[i], obj, i);
}
}
}
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.on('bmp-img-comp', function (event, b64) {
media(b64[0],"image/png",b64[1]);
});
//ドラッグ・アンド・ドロップを終了
function closedrop() {
$("#drag").css('display', 'none');
$("#drag").css("display", "none");
}
//ファイル選択
function fileselect() {
ipc.send('file-select', "");
postMessage(["sendSinmpleIpc", "file-select"], "*");
}
//ファイル読み込み
@@ -69,9 +60,9 @@ function handleFileUpload(files, obj, no) {
var fr = new FileReader();
fr.onload = function(evt) {
var b64 = evt.target.result;
$('#b64-box').val(b64);
var ret = media(b64, files["type"], no)
}
$("#b64-box").val(b64);
var ret = media(b64, files["type"], no);
};
fr.readAsDataURL(files);
$("#mec").append(files["name"] + "/");
}
@@ -82,71 +73,100 @@ function media(b64, type, no) {
var c = "abcdefghijklmnopqrstuvwxyz0123456789";
var cl = c.length;
var r = "";
for(var i=0; i<l; i++){
r += c[Math.floor(Math.random()*cl)];
for (var i = 0; i < l; i++) {
r += c[Math.floor(Math.random() * cl)];
}
if ($("#media").val()) {
$("#media").val($("#media").val() + ',' + "tmp_"+r);
$("#media").val($("#media").val() + "," + "tmp_" + r);
} else {
$("#media").val("tmp_"+r);
$("#media").val("tmp_" + r);
}
$("#toot-post-btn").prop("disabled", true);
localStorage.setItem("image","busy");
$(".toot-btn-group").prop("disabled", true);
$("#post-acct-sel").prop("disabled", true);
localStorage.setItem("image", "busy");
todo("Image Upload...");
var media = toBlob(b64, type);
console.log(media);
var fd = new FormData();
fd.append('file', media);
fd.append("file", media);
var acct_id = $("#post-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/media";
var at = localStorage.getItem("acct_" + acct_id + "_at");
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.upload.addEventListener("progress", progshow, false);
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send(fd);
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/drive/files/create";
httpreq.open("POST", start, true);
httpreq.upload.addEventListener("progress", progshow, false);
httpreq.responseType = "json";
if ($("#nsfw").hasClass("nsfw-avail")) {
var nsfw = true;
} else {
var nsfw = false;
}
var previewer = "url";
fd.append("i", at);
//fd.append('isSensitive', nsfw);
httpreq.send(fd);
} else {
var previewer = "preview_url";
var start = "https://" + domain + "/api/v1/media";
httpreq.open("POST", start, true);
httpreq.upload.addEventListener("progress", progshow, false);
httpreq.responseType = "json";
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.send(fd);
}
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(json);
if (!json.id) {
todc();
$("#imgup").text("");
$(".toot-btn-group").prop("disabled", false);
$("#post-acct-sel").prop("disabled", false);
$("select").formSelect();
$("#imgsel").show();
M.toast({ html: lang.lang_postimg_failupload, displayLength: 5000 });
return false;
}
var img = localStorage.getItem("img");
if (json.type=="image") {
var html = '<img src="' + json.preview_url + '" style="width:50px; max-height:100px;">';
$('#preview').append(html);
if (json.type.indexOf("image") != -1) {
var html = '<img src="' + json[previewer] + '" class="preview-img pointer" data-media="' + json["id"] + '" oncontextmenu="deleteImage(\'' + json["id"] + "')\" onclick=\"altImage('" + acct_id + "','" + json["id"] + '\')" title="' + lang.lang_postimg_delete + '">';
$("#preview").append(html);
} else {
$('#preview').append("プレビューできません");
$("#preview").append(lang.lang_postimg_previewdis);
}
if (!img) {
var img = "no-act";
}
if (img != "inline") {
var mediav=$("#media").val();
var regExp = new RegExp("tmp_"+r, "g");
var mediav = $("#media").val();
var regExp = new RegExp("tmp_" + r, "g");
mediav = mediav.replace(regExp, json["id"]);
$("#media").val(mediav);
}
if (img == "url") {
$("#textarea").val($("#textarea").val() + " " + json["text_url"])
$("#textarea").val($("#textarea").val() + " " + json["text_url"]);
}
todc();
$("#toot-post-btn").prop("disabled", false);
$("#post-acct-sel").prop("disabled", true);
$('select').material_select();
$("#mec").text("あり");
Materialize.toast("ファイルアップロード後はアカウントを切り替えられません。", 1000);
if (localStorage.getItem("nsfw_" + acct_id)) {
$("#nsfw").addClass("yellow-text");
$("#nsfw").html("visibility");
$("#nsfw").addClass("nsfw-avail");
}
$(".toot-btn-group").prop("disabled", false);
$("select").formSelect();
$("#mec").text(lang.lang_there);
M.toast({ html: lang.lang_postimg_aftupload, displayLength: 1000 });
$("#imgup").text("");
$("#imgsel").show();
localStorage.removeItem("image");
}
}
};
}
//Base64からBlobへ
function toBlob(base64, type) {
var bin = atob(base64.replace(/^.*,/, ''));
var bin = atob(base64.replace(/^.*,/, ""));
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
@@ -163,44 +183,107 @@ function toBlob(base64, type) {
return blob;
}
//画像を貼り付けたら…
var element = document.querySelector("#textarea");
element.addEventListener("paste", function(e){
// 画像の場合
// e.clipboardData.types.length == 0
// かつ
// e.clipboardData.types[0] == "Files"
// となっているので、それ以外を弾く
if (!e.clipboardData
|| !e.clipboardData.types
|| (e.clipboardData.types.length != 1)
|| (e.clipboardData.types[0] != "Files")) {
return true;
}
var element = document.querySelector("#textarea");
element.addEventListener("paste", function(e) {
if (!e.clipboardData || !e.clipboardData.items) {
return true;
}
// DataTransferItemList に画像が含まれいない場合は終了する
var imageItems = [...e.clipboardData.items].filter(i => i.type.startsWith("image"));
if (imageItems.length == 0) {
console.warn("it is not image");
return true;
}
// ファイルとして得る
// (なぜかgetAsStringでは上手くいかなかった)
var imageFile = e.clipboardData.items[0].getAsFile();
// ファイルとして得る
// DataTransferItem の kind は file なので getAsString ではなく getAsFile を呼ぶ
var imageFile = imageItems[0].getAsFile();
var imageType = imageItems[0].type;
// FileReaderで読み込む
var fr = new FileReader();
fr.onload = function(e) {
// onload内ではe.target.resultにbase64が入っているのであとは煮るなり焼くなり
// FileReaderで読み込む
var fr = new FileReader();
fr.onload = function(e) {
// onload内ではe.target.resultにbase64が入っているのであとは煮るなり焼くなり
var base64 = e.target.result;
var mediav = $("#media").val();
if(mediav){
var i=media.split(",").length;
if (mediav) {
var i = mediav.split(",").length;
}
media(base64, "image/png", i)
};
fr.readAsDataURL(imageFile);
// DataTransferItem の type に mime tipes があるのでそれを使う
media(base64, imageType, i);
};
fr.readAsDataURL(imageFile);
// 画像以外がペーストされたときのために、元に戻しておく
// 画像以外がペーストされたときのために、元に戻しておく
});
//Adobeフォトエディタ
function adobe(){
var agree = localStorage.getItem("adobeagree");
ipc.send('adobe', agree);
function deleteImage(key) {
Swal.fire({
title: lang.lang_postimg_delete,
type: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
var media = $("#media").val();
var arr = media.split(",");
for (var i = 0; i < media.length; i++) {
if (arr[i] == key) {
arr.splice(i, 1);
break;
}
}
$("#media").val(arr.join(","));
$("#preview [data-media=" + key + "]").remove();
}
});
}
function altImage(acct_id, id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/media/" + id;
Swal.fire({
title: lang.lang_postimg_desc,
text: lang.lang_postimg_leadContext,
input: "text",
inputAttributes: {
autocapitalize: "off"
},
showCancelButton: true,
confirmButtonText: "Post",
showLoaderOnConfirm: true,
preConfirm: data => {
return fetch(start, {
method: "PUT",
headers: {
"content-type": "application/json",
Authorization: "Bearer " + at
},
body: JSON.stringify({
description: data
})
})
.then(function(response) {
return response.json();
})
.catch(function(error) {
todo(error);
console.error(error);
})
.then(function(json) {
console.log(json)
$("[data-media=" + id + "]").attr("title", data);
});
},
allowOutsideClick: () => !Swal.isLoading()
}).then(result => {
if (result.value) {
Swal.fire({
title: "Complete",
});
}
});
}
ipc.on('adobeagree', function (event, arg) {
localStorage.setItem("adobeagree",arg);
});

View File

@@ -0,0 +1,241 @@
//Renpost
function renote(id, acct_id, remote) {
if ($("#pub_" + id).hasClass("rted")) {
return false;
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/create";
if (localStorage.getItem("mode_" + domain) != "misskey") {
return false;
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify({ i: at, renoteId: id }));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: renote", json]);
$("[toot-id=" + id + "]").addClass("rted");
$(".rt_" + id).toggleClass("teal-text");
}
}
}
//Renote
function renoteqt(id, acct_id) {
localStorage.setItem("nohide", true);
show();
$("#reply").val("renote_" + id);
$("#rec").text("Renote");
$("#post-acct-sel").val(acct_id);
$("#post-acct-sel").prop("disabled", true);
$('select').formSelect();
$("#textarea").attr("placeholder", lang.lang_misskeyparse_qt);
$("#textarea").focus();
}
//Reply
function misskeyreply(id, acct_id) {
localStorage.setItem("nohide", true);
show();
$("#reply").val(id);
$("#rec").text("Renote");
$("#post-acct-sel").val(acct_id);
$("#post-acct-sel").prop("disabled", true);
$('select').formSelect();
$("#textarea").attr("placeholder", lang.lang_misskeyparse_qt);
$("#textarea").focus();
}
//Reaction
function reactiontoggle(id, acct_id, tlid) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/show";
if (localStorage.getItem("mode_" + domain) != "misskey") {
return false;
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify({ i: at, noteId: id }));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: reaction", json]);
if (json.reactions) {
var reactions = ["like", "love", "laugh", "hmm", "surprise", "congrats", "angry", "confused", "pudding", "rip"];
for (var i = 0; i < reactions.length; i++) {
if (json.reactions[reactions[i]]) {
$("#pub_" + id + " .re-" + reactions[i] + "ct").text(json.reactions[reactions[i]])
$("#pub_" + id + " .re-" + reactions[i]).removeClass("hide")
} else {
$("#pub_" + id + " .re-" + reactions[i] + "ct").text(0)
if ($("#pub_" + id + " .reactions").hasClass("fullreact")) {
$("#pub_" + id + " .re-" + reactions[i]).addClass("hide")
} else {
$("#pub_" + id + " .re-" + reactions[i]).removeClass("hide")
}
$("#pub_" + id + " .re-" + reactions[i] + "ct").text(json.reactions[reactions[i]])
}
}
$("#pub_" + id + " .reactions").removeClass("hide");
$("#pub_" + id + " .reactions").toggleClass("fullreact")
} else {
if ($("#pub_" + id + " .reactions").hasClass("fullreact")) {
$("#pub_" + id + " .reactions").addClass("hide")
$("#pub_" + id + " .reactions").removeClass("fullreact")
} else {
$("#pub_" + id + " .reactions").removeClass("hide");
$("#pub_" + id + " .reaction").removeClass("hide");
$("#pub_" + id + " .reactions").addClass("fullreact");
}
}
}
}
$("#pub_" + id + " .freeReact").toggleClass("hide");
}
//reactioncustom
function reactioncustom(acct_id, id) {
$("#reply").val(id);
$("#unreact").hide();
$("#addreact").removeClass("hide");
$("#post-acct-sel").val(acct_id);
$('select').formSelect();
localStorage.setItem("nohide", true);
show()
emojiToggle(true)
$("#left-side").hide();
$("#default-emoji").hide();
}
function reactRefresh(acct_id, id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/show";
var req = {};
req.i = at;
req.noteId = id;
var i = {
method: "POST",
body: JSON.stringify(req),
}
fetch(start, i,
).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (!json) {
return false;
}
var poll = "";
if (json.error) {
$("[toot-id=" + id + "]").hide();
$("[toot-id=" + id + "]").remove();
} else {
reactRefreshCore(json)
}
});
}
function reactRefreshCore(json) {
var id = json.id;
if (json.reactions) {
$("#pub_" + id + " .reactions").removeClass("hide")
var regExp = new RegExp(":", "g");
Object.keys(json.reactions).forEach(function (keye) {
keyeClass = keye.replace(regExp, '');
if (json.reactions[keye]) {
$("#pub_" + id + " .re-" + keyeClass + "ct").text(json.reactions[keye])
$("#pub_" + id + " .re-" + keyeClass).removeClass("hide")
} else {
$("#pub_" + id + " .re-" + keyeClass + "ct").text(0)
if ($("#pub_" + id + " .reactions").hasClass("fullreact")) {
$("#pub_" + id + " .re-" + keyeClass).addClass("hide")
}
$("#pub_" + id + " .re-" + keyeClass + "ct").text(json.reactions[keye])
}
});
}
}
function emojiReaction(emoji) {
var acct_id = $("#post-acct-sel").val();
var id = $("#reply").val();
reaction(emoji, id, acct_id, null)
clear();
hide();
}
function reaction(mode, id, acct_id, tlid) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if ($(".fav_" + id).hasClass("yellow-text")) {
var flag = "delete";
} else {
var flag = "create";
}
var start = "https://" + domain + "/api/notes/reactions/" + flag;
if (localStorage.getItem("mode_" + domain) != "misskey") {
return false;
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify({ i: at, noteId: id, reaction: mode }));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
$(".fav_" + id).toggleClass("yellow-text");
}
}
}
//Vote
function vote(acct_id, id, to) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/polls/vote";
if (localStorage.getItem("mode_" + domain) != "misskey") {
return false;
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify({ i: at, noteId: id, choice: to }));
httpreq.onreadystatechange = function () {
voterefresh(acct_id, id)
}
}
function voterefresh(acct_id, id) {
var httpreqd = new XMLHttpRequest();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/show";
httpreqd.open('POST', start, true);
httpreqd.setRequestHeader('Content-Type', 'application/json');
httpreqd.responseType = 'json';
httpreqd.send(JSON.stringify({ i: at, noteId: id }));
httpreqd.onreadystatechange = function () {
if (httpreqd.readyState == 4) {
var json = httpreqd.response;
if (!json) {
return false;
}
var poll = "";
if (json.poll) {
var choices = json.poll.choices;
Object.keys(choices).forEach(function (keyc) {
var choice = choices[keyc];
if (choice.isVoted) {
var myvote = twemoji.parse("✅");
} else {
var myvote = "";
}
poll = poll + '<div class="pointer vote" onclick="vote(\'' + acct_id + '\',\'' + json.id + '\',' + choice.id + ')">' + escapeHTML(choice.text) + '(' + choice.votes + '' + myvote + ')</div>';
});
$(".vote_" + json.id).html(poll)
}
}
}
}

View File

@@ -1,58 +1,238 @@
/*投稿系*/
//投稿
function post() {
function sec() {
var mode = localStorage.getItem("sec");
var acct_id = $("#post-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
if (~domain.indexOf("kirishima.cloud") >= 0 && mode == "local") {
mode = "unlisted";
}
post(null, mode);
}
function post(mode, postvis) {
if ($("#toot-post-btn").prop("disabled")) {
return false;
}
var str = $("#textarea").val();
var acct_id = $("#post-acct-sel").val();
localStorage.setItem("last-use", acct_id);
todo("Posting");
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
if (!localStorage.getItem("cw_sentence")) {
var cw_sent = 500;
} else {
var cw_sent = localStorage.getItem("cw_sentence");
}
if (!localStorage.getItem("cw_letters")) {
var cw_ltres = 7000;
} else {
var cw_ltres = localStorage.getItem("cw_letters");
}
if (domain != "kirishima.cloud") {
if (mode != "pass" && !$("#cw").hasClass("cw-avail") && (str.length > cw_sent || (str.split("\n").length - 1) > cw_ltres)) {
var plus = str.replace(/\n/g, "").slice(0, 10) + "...";
Swal.fire({
title: lang.lang_post_cwtitle,
text: lang.lang_post_cwtxt + plus,
type: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#3085d6',
confirmButtonText: lang.lang_post_btn2,
cancelButtonText: lang.lang_post_btn3,
showCloseButton: true,
focusConfirm: false,
}).then((result) => {
if (result.dismiss == "cancel") {
//btn3:sonomama
post("pass")
} else if (result.value) {
//btn2:auto-CW
$("#cw-text").show();
$("#cw").addClass("yellow-text");
$("#cw").addClass("cw-avail");
$("#cw-text").val(plus);
post("pass")
}
})
return false;
}
}
if (localStorage.getItem("mode_" + domain) == "misskey") {
misskeyPost();
return;
}
$(".toot-btn-group").prop("disabled", true);
todo("Posting");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses";
var reply = $("#reply").val();
var toot={
if (str.indexOf(localStorage.getItem("stable")) == -1) {
str + " #" + localStorage.getItem("stable");
}
var toot = {
status: str
}
if(reply){
toot.in_reply_to_id=reply
if (reply) {
toot.in_reply_to_id = reply
}
var media = $("#media").val();
if(media){
toot.media_ids=media.split(",");
if (media) {
toot.media_ids = media.split(",");
}
var quote = $("#quote").val();
if (quote) {
toot.quote_id = quote;
}
if ($("#nsfw").hasClass("nsfw-avail")) {
var nsfw = "true";
toot.sensitive=nsfw;
toot.sensitive = nsfw;
} else {
var nsfw = "false";
}
var vis = $("#vis").text();
if(vis!="inherit"){
toot.visibility=vis;
if (postvis) {
var vis = postvis;
} else {
var vis = $("#vis").text();
}
if (vis != "inherit" && vis != "local") {
toot.visibility = vis;
} else if (vis == "local") {
toot.status = str + "👁️";
}
if ($("#cw").hasClass("cw-avail")) {
var spo = $("#cw-text").val();
cw();
toot.spoiler_text=spo;
toot.spoiler_text = spo;
} else {
var spo = "";
}
if ($("#sch-box").hasClass("sch-avail")) {
var scheduled = formattimeutc(new Date(Date.parse($("#sch-date").val())))
console.log("This toot will be posted at:" + scheduled)
schedule();
toot.scheduled_at = scheduled;
} else {
var scheduled = "";
}
if (!$("#poll").hasClass("hide")) {
var options = [];
$(".mastodon-choice").map(function () {
var choice = $(this).val();
if (choice != "") {
options.push(choice);
}
});
if ($("#poll-multiple:checked").val() == "1") {
var mul = true;
} else {
var mul = false;
}
if ($("#poll-until:checked").val() == "1") {
var htt = true;
} else {
var htt = false;
}
var exin = pollCalc();
if (!exin) {
todc("Error: Poll expires_in param")
}
toot.poll = {
options: options,
expires_in: exin,
multiple: mul,
hide_totals: htt
}
}
console.table(toot);
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.responseType = "json";
httpreq.send(JSON.stringify(toot));
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(json);
var box = localStorage.getItem("box");
if (box == "yes" || !box) {
$("#textarea").blur();
hide();
}
$(".toot-btn-group").prop("disabled", false);
todc();
clear();
}
}
}
function misskeyPost() {
var str = $("#textarea").val();
var acct_id = $("#post-acct-sel").val();
localStorage.setItem("last-use", acct_id);
var domain = localStorage.getItem("domain_" + acct_id);
$(".toot-btn-group").prop("disabled", true);
todo("Posting");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/notes/create";
var reply = $("#reply").val();
var toot = {
text: str
}
if (reply) {
if (reply.indexOf("renote") !== -1) {
toot.renoteId = reply.replace("renote_", "")
} else {
toot.replyId = reply
}
}
var media = $("#media").val();
if (media) {
toot.mediaIds = media.split(",");
}
if ($("#nsfw").hasClass("nsfw-avail")) {
var nsfw = "true";
toot.sensitive = nsfw;
} else {
var nsfw = "false";
}
var vis = $("#vis").text();
if (vis == "unlisted") {
vis = "home"
} else if (vis == "direct") {
vis = "specified";
toot.visibleUserIds = str.match(/@([a-zA-Z0-9_@.-]+)(\s|$)/g).join('').split("@");
}
if (vis != "inherit") {
toot.visibility = vis;
}
if ($("#cw").hasClass("cw-avail")) {
var spo = $("#cw-text").val();
cw();
toot.cw = spo;
} else {
var spo = "";
}
toot.i = at;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify(toot));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
if (str.indexOf(localStorage.getItem("stable")) == -1) {
localStorage.removeItem("stable")
}
var json = httpreq.response;
console.log(["Success: toot", json]);
var box = localStorage.getItem("box");
if (box == "yes") {
hide();
}else if (box == "hide"){
} else if (box == "hide") {
$("body").addClass("mini-post");
$(".mini-btn").text("expand_less");
}
$(".toot-btn-group").prop("disabled", false);
todc();
clear();
}
@@ -62,8 +242,12 @@ function post() {
//クリア(Shift+C)
function clear() {
$("#textarea").val("");
$("#textarea").attr("placeholder", "");
if (localStorage.getItem("stable")) {
$("#textarea").val("#" + localStorage.getItem("stable") + " ")
}
$("#textarea").attr("placeholder", lang.lang_toot);
$("#reply").val("");
$("#quote").val("");
$("#media").val("");
var cwt = localStorage.getItem("cw-text");
if (cwt) {
@@ -71,28 +255,43 @@ function clear() {
} else {
$("#cw-text").val("");
}
$("#cw").removeClass("yellow-text");
$("#cw").removeClass("cw-avail");
$("#rec").text("いいえ");
$("#mec").text("なし");
var vist = localStorage.getItem("vis");
if (!vist) {
vis("public");
var acw = localStorage.getItem("always-cw");
if (acw != "yes") {
$("#cw").removeClass("yellow-text");
$("#cw").removeClass("cw-avail");
$("#cw-text").hide();
} else {
if (vist == "memory") {
localStorage.setItem("vis-memory", $("#vis").text());
} else {
vis(vist);
}
$("#cw").addClass("yellow-text");
$("#cw").addClass("cw-avail");
$("#cw-text").show();
}
$("#rec").text(lang.lang_no);
$("#mec").text(lang.lang_nothing);
loadVis();
$("#nsfw").removeClass("yellow-text");
$("#nsfw").html("visibility_off");
$("#nsfw").removeClass("nsfw-avail");
$("#nsc").text("なし");
$("#nsc").text(lang.lang_nothing);
$("#drag").css("background-color", "#e0e0e0");
$("#preview").html("");
$("#toot-post-btn").prop("disabled", false);
$(".toot-btn-group").prop("disabled", false);
$("#post-acct-sel").prop("disabled", false);
$('select').material_select();
$("#days_poll").val(0);
$("#hours_poll").val(0);
$("#mins_poll").val(6);
$("#poll").addClass("hide")
$("#pollsta").text(lang.lang_no)
$(".mastodon-choice").map(function () {
$(this).val("");
});
localStorage.removeItem("image");
if (localStorage.getItem("mainuse") == "main") {
$("#post-acct-sel").val(localStorage.getItem("main"));
}
$('select').formSelect();
mdCheck()
$("#left-side").show();
$("#default-emoji").show();
$("#unreact").show();
$("#addreact").addClass("hide");
}

View File

@@ -1,11 +1,11 @@
/*保護系*/
//画像保護
function nsfw(){
if($("#nsfw").hasClass("nsfw-avail")){
function nsfw() {
if ($("#nsfw").hasClass("nsfw-avail")) {
$("#nsfw").removeClass("yellow-text");
$("#nsfw").html("visibility_off");
$("#nsfw").removeClass("nsfw-avail");
}else{
} else {
$("#nsfw").addClass("yellow-text");
$("#nsfw").html("visibility");
$("#nsfw").addClass("nsfw-avail");
@@ -13,70 +13,118 @@ function nsfw(){
}
//投稿公開範囲
function vis(set){
function vis(set) {
$("#vis").text(set);
$("#vis-icon").removeClass("red-text");
$("#vis-icon").removeClass("orange-text");
$("#vis-icon").removeClass("blue-text");
$("#vis-icon").removeClass("purple-text");
if(set=="public"){
$("#vis-icon").removeClass("light-blue-text");
$("#vis-icon").removeClass("teal-text");
if (set == "public") {
$("#vis-icon").text("public");
$("#vis-icon").addClass("purple-text");
}else if(set=="unlisted"){
} else if (set == "unlisted") {
$("#vis-icon").text("lock_open");
$("#vis-icon").addClass("blue-text");
}else if(set=="private"){
} else if (set == "private") {
$("#vis-icon").text("lock");
$("#vis-icon").addClass("orange-text");
}else if(set=="direct"){
} else if (set == "direct") {
$("#vis-icon").text("mail");
$("#vis-icon").addClass("red-text");
}else if(set=="limited"){
} else if (set == "limited") {
$("#vis-icon").text("group");
$("#vis-icon").addClass("teal-text");
} else if (set == "local") {
$("#vis-icon").text("visibility");
$("#vis-icon").addClass("light-blue-text");
}
var vis = localStorage.getItem("vis");
if (vis == "memory") {
var acct_id = $("#post-acct-sel").val();
localStorage.setItem("vis-memory-" + acct_id, set);
}
var ins = M.Dropdown.getInstance($('#dropdown1'))
if(ins){
ins.close();
}
var vis=localStorage.getItem("vis");
if(vis=="memory"){
localStorage.setItem("vis-memory",set);
}
}
function loadVis(){
var vist = localStorage.getItem("vis");
if (!vist) {
vis("public");
} else {
if (vist == "memory") {
var memory = localStorage.getItem("vis-memory");
if (!memory) {
memory = "public";
}
vis(memory);
} else {
vis(vist);
function loadVis() {
var vist = localStorage.getItem("vis");
if (!vist) {
vis("public");
} else {
if (vist == "memory") {
var acct_id = $("#post-acct-sel").val();
var memory = localStorage.getItem("vis-memory-" + acct_id);
if (!memory) {
memory = "public";
}
vis(memory);
} else if (vist == "useapi") {
var acct_id = $("#post-acct-sel").val();
var multi = localStorage.getItem("multi");
var obj = JSON.parse(multi);
var memory = obj[acct_id]["vis"];
if (!memory) {
memory = "public";
}
vis(memory);
} else {
vis(vist);
}
}
}
loadVis();
//コンテンワーニング
function cw(){
if($("#cw").hasClass("cw-avail")){
//コンテンワーニング
function cw() {
if ($("#cw").hasClass("cw-avail")) {
$("#cw-text").val();
$("#cw-text").hide();
$("#cw").removeClass("yellow-text");
$("#cw").removeClass("cw-avail");
}else{
} else {
$("#cw-text").show();
$("#cw").addClass("yellow-text");
$("#cw").addClass("cw-avail");
var cwt=localStorage.getItem("cw-text");
if(cwt){
var cwt = localStorage.getItem("cw-text");
if (cwt) {
$("#cw-text").val(cwt);
}
}
}
//TLでコンテンワーニングを表示トグル
function cw_show(id){
$(".cw_hide_"+id).toggleClass("cw");
$(".cw-long-"+id).toggleClass("hide");
}
//TLでコンテンワーニングを表示トグル
function cw_show(id) {
$(".cw_hide_" + id).toggleClass("cw");
$(".cw-long-" + id).toggleClass("hide");
}
$(function () {
$('#cw-text').on('change', function (event) {
var acct_id = $("#post-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var cwlen = $('#cw-text').val().length;
if (idata[domain + "_letters"]) {
$("#textarea").attr("data-length", idata[domain + "_letters"] - cwlen)
} else {
$("#textarea").attr("data-length", 500 - cwlen)
}
});
});
//スケジュール
function schedule() {
if ($("#sch-box").hasClass("sch-avail")) {
$("#sch-box").hide();
$("#sch-box").removeClass("sch-avail");
} else {
var date = new Date();
$("#sch-box").show();
$("#sch-date").val(formattime(date));
$("#sch-box").addClass("sch-avail");
}
}

View File

@@ -1,386 +1,539 @@
//お気に入り登録やブースト等、フォローやブロック等
//お気に入り登録
function fav(id, acct_id, remote) {
if ($("#pub_" + id).hasClass("faved")) {
var flag = "unfavourite";
} else {
var flag = "favourite";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
if(remote!="remote"){
//APIのふぁぼカウントがおかしい
if ($("[toot-id=" + id + "] .fav_ct").text() == json.favourites_count){
if(flag=="unfavourite"){
var fav=json.favourites_count - 1;
}else{
var fav=json.favourites_count + 1;
//var fav = json.favourites_count;
}
}else{
var fav = json.favourites_count;
}
$("[toot-id=" + id + "] .fav_ct").text(fav);
if (!json.reblog) {
} else {
$("[toot-id=" + id + "] .rt_ct").text(fav);
}
if ($("[toot-id=" + id +"]").hasClass("faved")) {
$("[toot-id=" + id +"]").removeClass("faved");
$(".fav_" + id).removeClass("yellow-text");
} else {
$("[toot-id=" + id +"]").addClass("faved");
$(".fav_" + id).addClass("yellow-text");
}
}else{
Materialize.toast("お気に入り登録しました。インスタンスが違うときは時間がかかる場合があります。", 1000);
}
if ($("#pub_" + id).hasClass("faved")) {
var flag = "unfavourite";
} else {
var flag = "favourite";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
if (json.reblog) {
json = json.reblog;
}
if (remote != "remote") {
//APIのふぁぼカウントがおかしい
if ($("[unique-id=" + id + "] .fav_ct").text() == json.favourites_count) {
if (flag == "unfavourite") {
var fav = json.favourites_count - 1;
if (fav * 1 < 0) {
fav = 0;
}
} else {
var fav = json.favourites_count;
//var fav = json.favourites_count;
}
} else {
var fav = json.favourites_count;
}
$("[unique-id=" + id + "] .fav_ct").text(fav);
$("[unique-id=" + id + "] .rt_ct").text(json.reblogs_count);
if ($("[unique-id=" + id + "]").hasClass("faved")) {
$("[unique-id=" + id + "]").removeClass("faved");
$(".fav_" + id).removeClass("yellow-text");
} else {
$("[unique-id=" + id + "]").addClass("faved");
$(".fav_" + id).addClass("yellow-text");
}
}
} else {
M.toast({ html: lang.lang_status_favWarn, displayLength: 1000 });
}
}
};
}
//ブースト
function rt(id, acct_id, remote) {
if ($("#pub_" + id).hasClass("rted")) {
var flag = "unreblog";
} else {
var flag = "reblog";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
console.log(json);
if (remote != "remote") {
$("[toot-id=" + id + "] .fav_ct").text(json.favourites_count);
if (!json.reblog) {
if (flag == "unreblog") {
var rt = json.reblogs_count - 1;
} else {
var rt = json.reblogs_count + 1;
}
$("[toot-id=" + id + "] .rt_ct").text(rt);
} else {
$("[toot-id=" + id + "] .rt_ct").text(json.reblog.reblogs_count);
}
function rt(id, acct_id, remote, vis) {
if ($("#pub_" + id).hasClass("rted")) {
var flag = "unreblog";
} else {
var flag = "reblog";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
if (vis) {
httpreq.send(JSON.stringify({ visibility: vis }));
} else {
httpreq.send();
}
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
if (json.reblog) {
json = json.reblog;
}
console.log(["Success: boost", json]);
$("[unique-id=" + id + "] .fav_ct").text(json.favourites_count);
if (!json.reblog) {
if (flag == "unreblog") {
var rt = json.reblogs_count - 1;
if (rt * 1 < 0) {
rt = 0;
}
} else {
var rt = json.reblogs_count;
}
$("[unique-id=" + id + "] .rt_ct").text(rt);
} else {
$("[unique-id=" + id + "] .rt_ct").text(json.reblogs_count);
}
if ($("[toot-id=" + id + "]").hasClass("rted")) {
$("[toot-id=" + id + "]").removeClass("rted");
$(".rt_" + id).removeClass("teal-text");
} else {
$("[toot-id=" + id + "]").addClass("rted");
$(".rt_" + id).addClass("teal-text");
}
} else {
Materialize.toast("ブーストしました。インスタンスが違うときは時間がかかる場合があります。", 1000);
}
}
}
if ($("[unique-id=" + id + "]").hasClass("rted")) {
$("[unique-id=" + id + "]").removeClass("rted");
$(".rt_" + id).removeClass("light-blue-text");
} else {
$("[unique-id=" + id + "]").addClass("rted");
$(".rt_" + id).addClass("light-blue-text");
}
}
};
}
function boostWith(vis) {
var id = $("#tootmodal").attr("data-id");
var acct_id = $("#tootmodal").attr("data-acct");
rt(id, acct_id, false, vis);
}
//フォロー
function follow(acct_id,remote) {
if (!acct_id && acct_id!="selector") {
var acct_id = $('#his-data').attr("use-acct");
}else if (acct_id=="selector") {
var acct_id = $("#user-acct-sel").val();
}
if (!remote && $("#his-data").hasClass("following")) {
var flag = "unfollow";
} else {
var flag = "follow";
}
var id = $("#his-data").attr("user-id");
if(!remote){
var remote = $("#his-data").attr("remote");
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
if(remote=="true" && flag=="follow"){
var start = "https://" + domain + "/api/v1/follows";
var user=$("#his-acct").text();
var ent={"uri":user}
}else{
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var ent={}
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
console.log(json);
if ($("#his-data").hasClass("following")) {
$("#his-data").removeClass("following");
$("#his-follow-btn").text("フォロー");
} else {
$("#his-data").addClass("following");
$("#his-follow-btn").text("フォロー解除");
}
}
}
function follow(acct_id, remote) {
if (!acct_id && acct_id != "selector") {
var acct_id = $("#his-data").attr("use-acct");
} else if (acct_id == "selector") {
var acct_id = $("#user-acct-sel").val();
}
if (!remote && $("#his-data").hasClass("following")) {
var flag = "unfollow";
var flagm = "delete";
} else {
var flag = "follow";
var flagm = "create";
}
var id = $("#his-data").attr("user-id");
if (!remote) {
var remote = $("#his-data").attr("remote");
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var user = $("#his-acct").text();
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/following/" + flagm;
var ent = { i: at, userId: id };
} else if (remote == "true" && flag == "follow") {
var ent = {};
}
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send(JSON.stringify(ent));
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: folllow", json]);
if ($("#his-data").hasClass("following")) {
$("#his-data").removeClass("following");
$("#his-follow-btn").text(lang.lang_status_follow);
} else {
$("#his-data").addClass("following");
$("#his-follow-btn").text(lang.lang_status_unfollow);
}
}
};
}
//ブロック
function block(acct_id) {
if (!acct_id) {
var acct_id = $('#his-data').attr("use-acct");
}
var id = $("#his-data").attr("user-id");
if ($("#his-data").hasClass("blocking")) {
var flag = "unblock";
} else {
var flag = "block";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
if ($("#his-data").hasClass("blocking")) {
$("#his-data").removeClass("blocking");
$("#his-block-btn").text("ブロック");
} else {
$("#his-data").addClass("blocking");
$("#his-block-btn").text("ブロック解除");
}
}
}
if ($("#his-data").hasClass("blocking")) {
var flag = "unblock";
var txt = lang.lang_status_unmute;
} else {
var flag = "block";
var txt = lang.lang_status_block;
}
Swal.fire({
title: txt,
text: "",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
if (!acct_id) {
var acct_id = $("#his-data").attr("use-acct");
}
var id = $("#his-data").attr("user-id");
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
if ($("#his-data").hasClass("blocking")) {
$("#his-data").removeClass("blocking");
$("#his-block-btn").text(lang.lang_status_block);
} else {
$("#his-data").addClass("blocking");
$("#his-block-btn").text(lang.lang_status_unblock);
}
}
};
}
});
}
//ミュート
function mute(acct_id) {
if (!acct_id) {
var acct_id = $('#his-data').attr("use-acct");
}
var id = $("#his-data").attr("user-id");
if ($("#his-data").hasClass("muting")) {
var flag = "unmute";
} else {
var flag = "mute";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
if ($("#his-data").hasClass("muting")) {
$("#his-data").removeClass("muting");
$("#his-mute-btn").text("ミュート");
} else {
$("#his-data").addClass("muting");
$("#his-mute-btn").text("ミュート解除");
}
}
}
function muteDo(acct_id) {
if ($("#his-data").hasClass("muting")) {
var flag = "unmute";
var flagm = "delete";
var txt = lang.lang_status_unmute;
} else {
var flag = "mute";
var flagm = "create";
var txt = lang.lang_status_mute;
}
Swal.fire({
title: txt,
text: "",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
if (!acct_id) {
var acct_id = $("#his-data").attr("use-acct");
}
var id = $("#his-data").attr("user-id");
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/mute/" + flagm;
var ent = { i: at, userId: id };
var rq = JSON.stringify(ent);
} else {
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var rq = "";
}
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send(rq);
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
if ($("#his-data").hasClass("muting")) {
$("#his-data").removeClass("muting");
$("#his-mute-btn").text(lang.lang_status_mute);
} else {
$("#his-data").addClass("muting");
$("#his-mute-btn").text(lang.lang_status_unmute);
}
}
};
}
});
}
//投稿削除
function del(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id;
var httpreq = new XMLHttpRequest();
httpreq.open('DELETE', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
}
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/notes/delete";
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.responseType = "json";
httpreq.send(JSON.stringify({ i: at, noteId: id }));
$("[toot-id=" + id + "]").hide();
$("[toot-id=" + id + "]").remove();
} else {
var start = "https://" + domain + "/api/v1/statuses/" + id;
var httpreq = new XMLHttpRequest();
httpreq.open("DELETE", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
}
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
}
};
}
//redraft
function redraft(id, acct_id) {
Swal.fire({
title: lang.lang_status_redraftTitle,
text: lang.lang_status_redraft,
type: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: lang.lang_yesno,
cancelButtonText: lang.lang_no
}).then(result => {
if (result.value) {
show();
del(id, acct_id);
$("#post-acct-sel").prop("disabled", true);
$("#post-acct-sel").val(acct_id);
$("select").formSelect();
mdCheck();
var medias = $("[toot-id=" + id + "]").attr("data-medias");
var vismode = $("[toot-id=" + id + "] .vis-data").attr("data-vis");
vis(vismode);
$("#media").val(medias);
var ct = medias.split(",").length;
$("[toot-id=" + id + "] img.toot-img").each(function(i, elem) {
if (i < ct) {
var url = $(elem).attr("src");
console.log("Play back image data:" + url);
$("#preview").append(
'<img src="' + url + '" style="width:50px; max-height:100px;">'
);
}
});
var html = $("[toot-id=" + id + "] .toot").html();
html = html.replace(/^<p>(.+)<\/p>$/, "$1");
html = html.replace(/<br\s?\/?>/, "\n");
html = html.replace(/<p>/, "\n");
html = html.replace(/<\/p>/, "\n");
html = html.replace(/<img[\s\S]*alt="(.+?)"[\s\S]*?>/g, "$1");
html = $.strip_tags(html);
localStorage.setItem("nohide", true);
show();
$("#textarea").val(html);
var cwtxt = $("[toot-id=" + id + "] .cw_text").html();
if (cwtxt != "") {
cwtxt = $.strip_tags(cwtxt);
cw();
$("#cw-text").val(cwtxt);
}
}
});
}
//ピン留め
function pin(id, acct_id) {
if ($("#pub_" + id).hasClass("pined")) {
var flag = "unpin";
} else {
var flag = "pin";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('DELETE', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
console.log(json);
if ($("[toot-id=" + id + "]").hasClass("pined")) {
$("[toot-id=" + id + "]").removeClass("pined");
$(".pin_" + id).removeClass("blue-text");
} else {
$("[toot-id=" + id + "]").addClass("pined");
$(".pin_" + id).addClass("blue-text");
}
}
}
if ($("#pub_" + id).hasClass("pined")) {
var flag = "unpin";
} else {
var flag = "pin";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: pinned", json]);
if ($("[toot-id=" + id + "]").hasClass("pined")) {
$("[toot-id=" + id + "]").removeClass("pined");
$(".pin_" + id).removeClass("blue-text");
} else {
$("[toot-id=" + id + "]").addClass("pined");
$(".pin_" + id).addClass("blue-text");
}
}
};
}
//フォロリク
function request(id, flag, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/follow_requests/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
console.log(json);
showReq();
}
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start =
"https://" + domain + "/api/v1/follow_requests/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: request", "type:" + flag, json]);
showReq();
}
};
}
//ドメインブロック(未実装)
function domainblock(add, flag, acct_id) {
if (!acct_id) {
var acct_id = $('#his-data').attr("use-acct");
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/domain_blocks"
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
console.log(json);
showDom();
}
}
if (!acct_id) {
var acct_id = $("#his-data").attr("use-acct");
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/domain_blocks";
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
console.log(["Success: domain block", json]);
showDom();
}
};
}
function addDomainblock() {
var domain = $("#domainblock").val();
domainblock(domain, 'POST');
var domain = $("#domainblock").val();
domainblock(domain, "POST");
}
//ユーザー強調
function empUser(){
var usr = localStorage.getItem("user_emp");
var obj = JSON.parse(usr);
var id=$("#his-acct").attr("fullname");
console.log(id);
if(!obj){
var obj=[];
obj.push(id);
Materialize.toast(id+"を強調します。設定を適用するにはF5を押して下さい。", 4000);
}else{
var can;
Object.keys(obj).forEach(function(key) {
var usT = obj[key];
if(usT!=id && !can){
can=false;
}else{
can=true;
obj.splice(key, 1);
Materialize.toast(id+"の強調を解除しました。設定を適用するにはF5を押して下さい。", 4000);
}
});
}
var json = JSON.stringify(obj);
localStorage.setItem("user_emp", json);
function empUser() {
var usr = localStorage.getItem("user_emp");
var obj = JSON.parse(usr);
var id = $("#his-acct").attr("fullname");
if (!obj) {
var obj = [];
obj.push(id);
M.toast({ html: id + lang.lang_status_emphas, displayLength: 4000 });
} else {
var can;
Object.keys(obj).forEach(function(key) {
var usT = obj[key];
if (usT != id && !can) {
can = false;
} else {
can = true;
obj.splice(key, 1);
M.toast({ html: id + lang.lang_status_unemphas, displayLength: 4000 });
}
});
}
var json = JSON.stringify(obj);
localStorage.setItem("user_emp", json);
}
//Endorse
function pinUser() {
var id = $("#his-data").attr("user-id");
var acct_id = $("#his-data").attr("use-acct");
if ($("#his-end-btn").hasClass("endorsed")) {
var flag = "unpin";
} else {
var flag = "pin";
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + id + "/" + flag;
var httpreq = new XMLHttpRequest();
httpreq.open("POST", start, true);
httpreq.setRequestHeader("Content-Type", "application/json");
httpreq.setRequestHeader("Authorization", "Bearer " + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function() {
if (httpreq.readyState === 4) {
var json = httpreq.response;
if ($("#his-end-btn").hasClass("endorsed")) {
$("#his-end-btn").removeClass("endorsed");
$("#his-end-btn").text(lang.lang_status_endorse);
} else {
$("#his-end-btn").addClass("endorsed");
$("#his-end-btn").text(lang.lang_status_unendorse);
}
}
};
}
//URLコピー
function tootUriCopy(url){
execCopy(url);
Materialize.toast("トゥートURLをコピーしました", 1500);
function tootUriCopy(url) {
execCopy(url);
M.toast({ html: lang.lang_details_url, displayLength: 1500 });
}
//他のアカウントで…
function staEx(mode){
var url=$("#tootmodal").attr("data-url");
var acct_id = $("#status-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/search?resolve=true&q="+url
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
}
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
var id=json.statuses[0].id;
if(mode=="rt"){
rt(id, acct_id, 'remote')
}else if(mode=="fav"){
fav(id, acct_id, 'remote')
}else if(mode=="reply"){
reEx(id)
}
});
return;
function staEx(mode) {
var url = $("#tootmodal").attr("data-url");
var acct_id = $("#status-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v2/search?resolve=true&q=" + url;
fetch(start, {
method: "GET",
headers: {
"content-type": "application/json",
Authorization: "Bearer " + at
}
})
.then(function(response) {
return response.json();
})
.catch(function(error) {
todo(error);
console.error(error);
})
.then(function(json) {
var id = json.statuses[0].id;
if (mode == "rt") {
rt(id, acct_id, "remote");
} else if (mode == "fav") {
fav(id, acct_id, "remote");
} else if (mode == "reply") {
reEx(id);
}
});
return;
}
function toggleAction(id, tlid, acct_id) {
if (tlid == "notf") {
var tlide = "[data-acct=" + acct_id + "] .notf-timeline";
} else if (tlid == "user") {
var tlide = "#his-tl-contents";
} else {
var tlide = "[tlid=" + tlid + "]";
}
if (!$(tlide + " [toot-id=" + id + "]").hasClass("ext-mode")) {
$(tlide + " [toot-id=" + id + "] .type-a").hide();
$(tlide + " [toot-id=" + id + "] .type-b").show();
$(tlide + " [toot-id=" + id + "]").addClass("ext-mode");
$(tlide + " [toot-id=" + id + "] .act-icon").text("expand_less");
} else {
$(tlide + " [toot-id=" + id + "] .type-b").hide();
$(tlide + " [toot-id=" + id + "] .type-a").show();
$(tlide + " [toot-id=" + id + "]").removeClass("ext-mode");
$(tlide + " [toot-id=" + id + "] .act-icon").text("expand_more");
}
}
function toggleAction(id,tlid,acct_id){
if(tlid=="notf"){
var tlide="[data-notf="+acct_id+"]";
}else{
var tlide="[tlid="+tlid+"]";
}
if(!$(tlide+" [toot-id="+id+"]").hasClass("ext-mode")){
$(tlide+" [toot-id="+id+"] .type-a").hide();
$(tlide+" [toot-id="+id+"] .type-b").show();
$(tlide+" [toot-id="+id+"]").addClass("ext-mode")
$(tlide+" [toot-id="+id+"] .act-icon").text("expand_less");
}else{
$(tlide+" [toot-id="+id+"] .type-b").hide();
$(tlide+" [toot-id="+id+"] .type-a").show();
$(tlide+" [toot-id="+id+"]").removeClass("ext-mode")
$(tlide+" [toot-id="+id+"] .act-icon").text("expand_more");
}
}

View File

@@ -7,30 +7,78 @@ var prev_val = input.value;
var oldSuggest;
var suggest;
input.addEventListener("focus", function() {
input.addEventListener("focus", function () {
localStorage.removeItem("cursor");
var acct_id = $("#post-acct-sel").val();
$("#suggest").html("");
window.clearInterval(timer);
timer = window.setInterval(function() {
timer = window.setInterval(function () {
var new_val = input.value;
if (new_val == "") {
$("#suggest").html("");
if ($("#poll").hasClass("hide") && $("#emoji").hasClass("hide")) {
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "100%")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1
} else {
width = 300
}
$("#post-box").css("width", width + "px")
}
return;
}
if (prev_val != new_val) {
var semoji = new_val.match(/:(\S{3,})/);
if(semoji){
if (semoji) {
var obj = JSON.parse(localStorage.getItem("emoji_" + acct_id));
var num = obj.length;
var ehtml="";
for (i = 0; i < num; i++) {
var emoji = obj[i];
if ( ~emoji.shortcode.indexOf(semoji[1])) {
if (emoji) {
ehtml = ehtml+'<a onclick="emojiInsert(\':' + emoji.shortcode +
': \',\':'+semoji[1]+'\')" class="pointer"><img src="' + emoji.url + '" width="20"></a>';
if (!obj) {
var ehtml = lang.lang_suggest_nodata;
} else {
var num = obj.length;
var ehtml = "";
for (i = 0; i < num; i++) {
var emoji = obj[i];
if (~emoji.shortcode.indexOf(semoji[1])) {
if (emoji) {
ehtml = ehtml + '<a onclick="emojiInsert(\':' + emoji.shortcode +
': \',\':' + semoji[1] + '\')" class="pointer"><img src="' + emoji.url + '" width="20"></a>';
}
}
}
}
if (ehtml != "") {
$("#right-side").show()
$("#right-side").css("width", "200px")
$("#left-side").css("width", "calc(100% - 200px)")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1 + 200
} else {
width = 600
}
$("#post-box").css("width", width + "px")
$("#poll").addClass("hide")
$("#emoji").addClass("hide")
} else {
if ($("#poll").hasClass("hide") && $("#emoji").hasClass("hide")) {
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "100%")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1
} else {
width = 300
}
$("#post-box").css("width", width + "px")
}
}
$("#suggest").html(ehtml);
}
var tag = new_val.match(/#(\S{3,})/);
var acct = new_val.match(/@(\S{3,})/);
if (tag && tag[1]) {
@@ -38,44 +86,125 @@ input.addEventListener("focus", function() {
} else if (acct && acct[1]) {
var q = acct[1];
} else {
//$("#suggest").html("");
$("#suggest").html("");
if ($("#poll").hasClass("hide") && $("#emoji").hasClass("hide")) {
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "100%")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1
} else {
width = 300
}
$("#post-box").css("width", width + "px")
}
return;
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
suggest = "https://" + domain + "/api/v1/search?q=" + q
var at = localStorage.getItem("acct_" + acct_id + "_at");
suggest = "https://" + domain + "/api/v2/search?q=" + q
if (suggest != oldSuggest) {
console.log(suggest)
console.log("Try to get suggest at " + suggest)
fetch(suggest, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
if (json.hashtags[0] && tag[1]) {
var tags = "";
Object.keys(json.hashtags).forEach(function(key4) {
var tag = json.hashtags[key4];
tags = tags + '<a onclick="tagInsert(\'#' + tag + '\',\'#' + q +
'\')" class="pointer">#' + tag + '</a> ';
});
$("#suggest").html("Tags:" + tags);
}).then(function (json) {
console.log(["Search", json]);
//ハッシュタグ
if (json.hashtags[0] && tag) {
if (tag[1]) {
var tags = [];
Object.keys(json.hashtags).forEach(function (key4) {
var tag = json.hashtags[key4];
var his = tag.history;
var uses = his[0].uses * 1 + his[1].uses * 1 + his[2].uses * 1 + his[3].uses * 1 + his[4].uses * 1 + his[5].uses * 1 + his[6].uses * 1;
tagHTML = '<br><a onclick="tagInsert(\'#' + escapeHTML(tag.name) + '\',\'#' + q + '\')" class="pointer">#' +
escapeHTML(tag.name) + '</a>&nbsp;' + uses + 'toot(s)'
var item = {
"uses": uses,
"html": tagHTML
}
tags.push(item)
});
var num_a = -1;
var num_b = 1;
tags = tags.sort(function (a, b) {
var x = a["uses"];
var y = b["uses"];
if (x > y) return num_a;
if (x < y) return num_b;
return 0;
});
var ins = ""
var nev = false
Object.keys(tags).forEach(function (key7) {
ins = ins + tags[key7].html
if (key7 <= 0 && !nev) {
ins = ins + '<br>'
nev = true
}
});
$("#suggest").html(ins);
$("#right-side").show()
$("#right-side").css("width", "200px")
$("#left-side").css("width", "calc(100% - 200px)")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1 + 200
} else {
width = 600
}
$("#post-box").css("width", width + "px")
$("#poll").addClass("hide")
$("#emoji").addClass("hide")
}
} else if (json.accounts[0] && acct[1]) {
var accts = "";
Object.keys(json.accounts).forEach(function(key3) {
Object.keys(json.accounts).forEach(function (key3) {
var acct = json.accounts[key3];
accts = accts + '<a onclick="tagInsert(\'@' + acct.acct +
'\',\'@' + q + '\')" class="pointer">@' + acct.acct + '</a> ';
if (acct.acct != q) {
//Instance Actorって…
if (acct.username.indexOf(".") < 0) {
accts = accts + '<a onclick="tagInsert(\'@' + acct.acct +
'\',\'@' + q + '\')" class="pointer">@' + acct.acct + '</a><br>';
}
}
});
$("#suggest").html("@:" + accts);
$("#right-side").show()
$("#right-side").css("width", "200px")
$("#left-side").css("width", "calc(100% - 200px)")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1 + 200
} else {
width = 600
}
$("#post-box").css("width", width + "px")
$("#suggest").html(accts);
$("#poll").addClass("hide")
$("#emoji").addClass("hide")
} else {
$("#suggest").html("Not Found");
if ($("#poll").hasClass("hide") && $("#emoji").hasClass("hide")) {
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "100%")
var width = localStorage.getItem("postbox-width");
if (width) {
width = width.replace("px", "") * 1
} else {
width = 300
}
$("#post-box").css("width", width + "px")
}
}
});
}
@@ -85,7 +214,7 @@ input.addEventListener("focus", function() {
}, 1000);
}, false);
input.addEventListener("blur", function() {
input.addEventListener("blur", function () {
window.clearInterval(timer);
favTag();
}, false);
@@ -94,18 +223,56 @@ function tagInsert(code, del) {
var selin = $("#textarea").prop('selectionStart');
if (!del) {
} else {
var regExp = new RegExp(del, "g");
var regExp = new RegExp(del.replace(/[.*+?^=!:${}()|[\]\/\\]/g, "\\$&"), "g");
var now = now.replace(regExp, "");
selin=selin-del.length;
selin = selin - del.length;
}
if(selin>0){
var before = now.substr(0, selin);
var after = now.substr(selin, now.length);
newt = before + " "+ code+" " + after;
}else{
newt = code+" "+now;
if (selin > 0) {
var before = now.substr(0, selin);
var after = now.substr(selin, now.length);
newt = before + " " + code + " " + after;
} else {
newt = code + " " + now;
}
$("#textarea").val(newt);
$("#textarea").focus();
if ($("#poll").hasClass("hide") && $("#emoji").hasClass("hide")) {
$("#right-side").hide()
$("#right-side").css("width", "300px")
$("#left-side").css("width", "50%")
var width = localStorage.getItem("postbox-width").replace("px", "") * 1;
if (!width) {
width = 300
}
$("#post-box").css("width", width + "px")
}
$("#suggest").html("");
}
function cgNPs(q) {
suggest = "https://cg.toot.app/api/v1/search/light?q=" + q
if (suggest != oldSuggest) {
console.log("Try to get suggest at " + suggest)
fetch(suggest, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json[0]) {
var tags = "";
Object.keys(json).forEach(function (key4) {
var tag = json[key4];
tags = tags + '<a onclick="cgNP(\'' + json[key4] + '\')" class="pointer">' + escapeHTML(json[key4]) + '</a> ';
});
$("#suggest").html("Cinderella NowPlaying:" + tags);
} else {
$("#suggest").html("Cinderella NowPlaying:Not Found");
}
});
}
}

View File

@@ -1,46 +1,81 @@
/*リプライ*/
function re(id,at,acct_id,mode){
function re(id, ats_cm, acct_id, mode) {
clear();
var ats = ats_cm.split(',');
localStorage.setItem("nohide", true);
show();
$("#reply").val(id);
var te=$("#textarea").val();
$("#textarea").val("@"+at+" "+te);
$("#rec").text("はい");
for (var i = 0; i < ats.length; i++) {
var at = ats[i];
var te = $("#textarea").val();
if (at != localStorage.getItem("user_" + acct_id)) {
$("#textarea").val("@" + at + " " + te);
}
}
$("#rec").text(lang.lang_yesno);
$("#post-acct-sel").val(acct_id);
$('select').material_select();
$("#textarea").attr("placeholder","返信モードです。クリアするときはCtrl+Shift+Cを押してください。");
$("#post-acct-sel").prop("disabled", true);
$('select').formSelect();
mdCheck()
$("#textarea").attr("placeholder", lang.lang_usetxtbox_reply);
$("#textarea").focus();
var profimg = localStorage.getItem("prof_" + acct_id);
if (!profimg) {
profimg = "../../img/missing.svg";
}
$("#acct-sel-prof").attr("src", profimg);
vis(mode);
}
function reEx(id){
function reEx(id) {
$('#tootmodal').modal('close');
var at=$("#tootmodal").attr("data-user");
var at = $("#tootmodal").attr("data-user");
var acct_id = $("#status-acct-sel").val();
var mode=$("#tootmodal .vis-data").attr("data-vis");
re(id,at,acct_id,mode);
var mode = $("#tootmodal .vis-data").attr("data-vis");
re(id, at, acct_id, mode);
}
//引用
function qt(id,acct_id,at,url){
function qt(id, acct_id, at, url) {
localStorage.setItem("nohide", true);
var qt = localStorage.getItem("quote");
if(!qt){
var qt="simple";
if (!qt) {
var qt = "simple";
}
if(qt=="simple"){
if (qt == "nothing") {
return false;
}
if (qt == "simple") {
show();
$("#textarea").val("\n"+url);
}else if(qt=="mention"){
$("#textarea").val("\n" + url);
} else if (qt == "mention") {
show();
$("#textarea").val("\n"+url+" From:@"+at);
}else if(qt=="full"){
$("#textarea").val("\n" + url + " From:@" + at);
} else if (qt == "full") {
show();
var html=$("[toot-id="+id+"] .toot").html();
var html = $("[toot-id=" + id + "] .toot").html();
html = html.match(/^<p>(.+)<\/p>$/)[1];
html = html.replace(/<br\s?\/?>/, "\n");
html = html.replace(/<p>/, "\n");
html = html.replace(/<\/p>/, "\n");
html=$.strip_tags(html);
$("#textarea").val("\n"+"@"+at+" "+html+"\n"+url);
html = $.strip_tags(html);
$("#textarea").val("\n" + "@" + at + " " + html + "\n" + url);
} else if (qt == "apiQuote") {
clear();
localStorage.setItem("nohide", true);
show();
$("#quote").val(id);
$("#post-acct-sel").val(acct_id);
$("#post-acct-sel").prop("disabled", true);
$('select').formSelect();
$("#textarea").attr("placeholder", lang.lang_usetxtbox_reply);
$("#textarea").focus();
var profimg = localStorage.getItem("prof_" + acct_id);
if (!profimg) {
profimg = "../../img/missing.svg";
}
$("#acct-sel-prof").attr("src", profimg);
}
$("#textarea").focus();
$("#post-acct-sel").val(acct_id);
$('select').material_select();
$('select').formSelect();
mdCheck()
$("#textarea").focus();
}

View File

@@ -2,121 +2,164 @@
//全てのTL処理で呼び出し
function additional(acct_id, tlid) {
//メンション系
$(".mention").attr("href", "#");
$(".mention").addClass("parsed");
//$(".mention").attr("href", "");
$("#timeline-container .mention").addClass("parsed");
$("#timeline-container .hashtag, #timeline-container [rel=tag]").each(function (i, elem) {
var tags = $(this).attr("href").match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/tags\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
if(tags){
var tagThis = tags[2]
}else{
var tagThis = $(this).attr("data-tag")
}
if(tagThis){
$(this).attr("onclick", 'tagShow(\'' + tagThis + '\')');
$(this).attr("href", "#");
}
});
//トゥートサムネ
$("#timeline_" + tlid + " .toot a:not(.parsed)").each(function(i, elem) {
$("#timeline_" + tlid + " .toot a:not(.parsed)").each(function (i, elem) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var card = localStorage.getItem("card_" + tlid);
var text = $(this).attr('href');
var urls = text.match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/media\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
if (text) {
if (text.indexOf("twimg.com") === -1) {
var urls = text.match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/media\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
}
} else {
text = ""
var urls = []
}
//トゥートのURLぽかったら
toot = text.match(/https:\/\/([a-zA-Z0-9.-]+)\/@([a-zA-Z0-9_]+)\/([0-9]+)/);
if(toot){
if(toot[1]){
$(this).attr("data-acct",acct_id);
if (toot) {
if (toot[1]) {
$(this).attr("data-acct", acct_id);
}
}
if (urls) {
$(this).remove();
} else if (!card) {
var id = $(this).parents('.cvo').attr("toot-id");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/card";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
//body: JSON.stringify({})
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
if (json.title) {
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URLチェック:<br>Title:" + json.title + "<br>" +
json.description + "</span>");
}
if (json.html) {
$("[toot-id=" + id + "] .additional").html(json.html+'<i class="material-icons" onclick="pip('+id+')">picture_in_picture_alt</i>');
}
if (json.title) {
$("[toot-id=" + id + "] a:not(.parsed)").addClass("parsed");
$("[toot-id=" + id + "]").addClass("parsed");
}
});
}else{
$(this).attr("title",text);
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/url?url=" + text;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
//body: JSON.stringify({})
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json.title) {
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URL" + lang.lang_cards_check + ":<br>Title:" + escapeHTML(json.title) + "<br>" +
escapeHTML(json.description) + "</span>");
$("[toot-id=" + id + "] a:not(.parsed)").addClass("parsed");
$("[toot-id=" + id + "]").addClass("parsed");
}
});
}
} else {
$(this).attr("title", text);
}
});
$("i.unparsed").each(function(i, elem) {
var dem=$(this).text();
var dom=$(this);
$("i.unparsed").each(function (i, elem) {
var dem = $(this).text();
var dom = $(this);
var start = "./js/emoji/emoji-map.json";
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function()
{
if( this.readyState == 4 && this.status == 200 ) {
if( this.response){
var json=this.response;
var emojis=json.emojis;
for (i = 0; i < emojis.length; i++) {
var emojie = emojis[i];
var regExp = new RegExp(dem, "g");
if (emojie.emoji.match(regExp)) {
var sc=emojie.name;
var sc="twa-"+sc.replace(/_/g,"-");
dom.addClass(sc);
dom.text("");
dom.removeClass("unparsed");
break;
}
}
}
}
}
xmlHttpRequest.open( 'GET', start, true );
xmlHttpRequest.responseType = 'json';
xmlHttpRequest.send( null );
xmlHttpRequest.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
if (this.response) {
var json = this.response;
var emojis = json.emojis;
for (i = 0; i < emojis.length; i++) {
var emojie = emojis[i];
var regExp = new RegExp(dem, "g");
if (emojie.emoji.match(regExp)) {
var sc = emojie.name;
var sc = "twa-" + sc.replace(/_/g, "-");
dom.addClass(sc);
dom.text("");
dom.removeClass("unparsed");
break;
}
}
}
}
}
xmlHttpRequest.open('GET', start, true);
xmlHttpRequest.responseType = 'json';
xmlHttpRequest.send(null);
});
$("#timeline_" + tlid + " .toot:not(:has(a:not(.add-show,.parsed)))").each(function(i, elem) {
$("#timeline_" + tlid + " .toot:not(:has(a:not(.add-show,.parsed)))").each(function (i, elem) {
$(this).parent().find(".add-show").hide();
});
//Markdownイメージビューワー
$("#timeline_" + tlid + " .toot a:not(.img-parsed):has(img)").each(function(i, elem) {
var ilink=$(this).attr("href");
var id = $(this).parents('.cvo').attr("toot-id");
$(this).attr("href","#");
$(this).attr("onclick","imgv('"+id+"','"+i+"')");
$(this).attr("data-type","image");
$(this).attr("id",id+"-image-"+i);
$(this).attr("data-url",ilink);
$(this).addClass("img-parsed");
$("#timeline_" + tlid + " .toot a:not(.img-parsed):has(img)").each(function (i, elem) {
var ilink = $(this).attr("href");
var id = $(this).parents('.cvo').attr("toot-id");
$(this).attr("href", "#");
$(this).attr("onclick", "imgv('" + id + "','" + i + "')");
$(this).attr("data-type", "image");
$(this).attr("id", id + "-image-" + i);
$(this).attr("data-url", ilink);
$(this).addClass("img-parsed");
});
}
function additionalIndv(tlid, acct_id, id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var text = $("[toot-id="+id+"] .toot a").attr('href');
var urls = text.match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/media\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
if (urls) {
$("[toot-id="+id+"] .toot a").remove();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var text = $("[toot-id=" + id + "] .toot a").attr('href');
var urls = text.match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/media\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/
);
if (urls) {
$("[toot-id=" + id + "] .toot a").remove();
} else {
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/url?url=" + text;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json'
},
//body: JSON.stringify({})
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json.title) {
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URL" + lang.lang_cards_check + ":<br>Title:" + escapeHTML(json.title) + "<br>" +
escapeHTML(json.description) + "</span>");
$("[toot-id=" + id + "] a:not(.parsed)").addClass("parsed");
$("[toot-id=" + id + "]").addClass("parsed");
}
});
} else {
var id = $("[toot-id="+id+"] .toot a").parents('.cvo').attr("toot-id");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/card";
var id = $("[toot-id=" + id + "] .toot a").parents('.cvo').attr("toot-id");
var start = "https://" + domain + "/api/v1/statuses/" + id;
fetch(start, {
method: 'GET',
headers: {
@@ -124,21 +167,40 @@ function additionalIndv(tlid, acct_id, id) {
'Authorization': 'Bearer ' + at
},
//body: JSON.stringify({})
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
console.log(json);
if (json.title) {
}).then(function (json) {
json = json.card;
//このリンク鳥やんけ、ってとき
if (json.provider_name == "Twitter") {
if (json.image) {
var twiImg = '<br><img src="' + json.image + '" style="max-width:100%" onclick="imgv(\'twi_' + id + '\', 0, \'twitter\');" id="twi_' + id + '-image-0" data-url="' + json.image + '" data-type="image">';
} else {
var twiImg = '';
}
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URLチェック:<br>Title:" + json.title + "<br>" +
json.description + "</span>");
}
if (json.html) {
$("[toot-id=" + id + "] .additional").html(json.html+'<i class="material-icons sml pointer" onclick="pip(\''+id+'\')" title="ながら観モード">picture_in_picture_alt</i>');
'<div class="twitter-tweet"><b>' + escapeHTML(json.author_name) + '</b><br>' + escapeHTML(json.description) + twiImg + '</div>');
} else if (json.provider_name == "pixiv") {
if (json.image) {
var pxvImg = '<br><img src="' + json.image + '" style="max-width:100%" onclick="imgv(\'pixiv_' + id + '\', 0, \'pixiv\');" id="pixiv_' + id + '-image-0" data-url="' + json.embed_url + '" data-type="image">';
} else {
var pxvImg = '';
}
$("[toot-id=" + id + "] .additional").html(
'<div class="pixiv-post"><b><a href="' + json.author_url + '" target="_blank">' + escapeHTML(json.author_name) + '</a></b><br>' + escapeHTML(json.title) + pxvImg + '</div>');
} else {
if (json.title) {
$("[toot-id=" + id + "] .additional").html(
"<span class=\"gray\">URL" + lang.lang_cards_check + ":<br>Title:" + escapeHTML(json.title) + "<br>" +
escapeHTML(json.description) + "</span>");
}
if (json.html) {
$("[toot-id=" + id + "] .additional").html(json.html + '<i class="material-icons sml pointer" onclick="pip(\'' + id + '\')" title="' + lang.lang_cards_pip + '">picture_in_picture_alt</i>');
}
}
if (json.title) {
$("[toot-id=" + id + "] a:not(.parsed)").addClass("parsed");
@@ -146,6 +208,8 @@ function additionalIndv(tlid, acct_id, id) {
}
});
}
}
}
//各TL上方のLink[On/Off]
@@ -154,11 +218,11 @@ function cardToggle(tlid) {
if (!card) {
localStorage.setItem("card_" + tlid, "true");
$("#sta-card-" + tlid).text("Off");
$("#sta-card-" + tlid).css("color",'red');
$("#sta-card-" + tlid).css("color", 'red');
} else {
localStorage.removeItem("card_" + tlid);
$("#sta-card-" + tlid).text("On");
$("#sta-card-" + tlid).css("color",'#009688');
$("#sta-card-" + tlid).css("color", '#009688');
}
}
//各TL上方のLink[On/Off]をチェック
@@ -166,43 +230,56 @@ function cardCheck(tlid) {
var card = localStorage.getItem("card_" + tlid);
if (!card) {
$("#sta-card-" + tlid).text("On");
$("#sta-card-" + tlid).css("color",'#009688');
$("#sta-card-" + tlid).css("color", '#009688');
} else {
$("#sta-card-" + tlid).text("Off");
$("#sta-card-" + tlid).css("color",'red');
$("#sta-card-" + tlid).css("color", 'red');
}
}
function mov(id,tlid){
if(tlid=="notf"){
var tlide="[data-notf="+acct_id+"]";
}else{
var tlide="[tlid="+tlid+"]";
function mov(id, tlid, type) {
if (tlid == "notf") {
var tlide = "[data-notf=" + acct_id + "]";
} else if (tlid == "user") {
var tlide = "#his-data";
} else {
var tlide = "[tlid=" + tlid + "]";
}
var mouseover=localStorage.getItem("mouseover");
if(!mouseover){
mouseover="";
}else if(mouseover=="yes"){
mouseover="hide";
}else if(mouseover=="no"){
mouseover="";
var mouseover = localStorage.getItem("mouseover");
if (!mouseover) {
mouseover = "";
}
if(mouseover=="hide"){
$(tlide+" [toot-id="+id+"] .area-actions").removeClass("hide")
if (mouseover == "yes") {
mouseover = "hide";
} else if (mouseover == "click") {
if (type == "mv") {
mouseover = "";
} else {
mouseover = "hide";
}
} else if (mouseover == "no") {
mouseover = "";
}
if (mouseover == "hide") {
$(tlide + " [toot-id=" + id + "] .area-actions").toggleClass("hide")
$(tlide + " [toot-id=" + id + "] .area-side").toggleClass("hide")
}
}
function resetmv(){
var mouseover=localStorage.getItem("mouseover");
if(!mouseover){
mouseover="";
}else if(mouseover=="yes"){
mouseover="hide";
}else if(mouseover=="no"){
mouseover="";
function resetmv(type) {
var mouseover = localStorage.getItem("mouseover");
if (!mouseover) {
mouseover = "";
} else if (mouseover == "yes") {
mouseover = "hide";
} else if (mouseover == "no") {
mouseover = "";
} else if (mouseover == "click" && type != "mv") {
mouseover = "hide";
}
if(mouseover=="hide"){
if (mouseover == "hide") {
$(".area-actions").addClass("hide");
$(".area-side").addClass("hide");
}
}

View File

@@ -1,145 +1,401 @@
//トゥートの詳細
function details(id, acct_id, tlid) {
$(".toot-reset").html("データなし");
var html = $("#timeline_"+tlid+" #pub_" + id).html();
function details(id, acct_id, tlid, mode) {
if (mode == "dm") {
$(".dm-hide").hide();
} else {
$(".dm-hide").show();
}
$(".toot-reset").html('<span class="no-data">' + lang.lang_details_nodata + '</span>');
var html = $("#timeline_" + tlid + " [toot-id=" + id + "]").html();
$("#toot-this").html(html);
$('#tootmodal').modal('open');
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/notes/show";
var i = {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
var start = "https://" + domain + "/api/v1/statuses/" + id;
var i = {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}
}
fetch(start, i).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
if(!$("#timeline_"+tlid+" #pub_" + id).length){
}).then(function (json) {
console.log(["Toot data:", json]);
if (!$("#timeline_" + tlid + " #pub_" + id).length) {
var html = parse([json], '', acct_id);
$("#toot-this").html(html);
jQuery("time.timeago").timeago();
}
if (localStorage.getItem("mode_" + domain) == "misskey") {
var url = "https://" + domain + "/notes/" + json.id;
var scn = json.user.username;
if (!json.user.host) {
var local = true;
} else {
var local = false;
scn = scn + "@" + host;
}
var rep = "";
var uid = json.user.id;
if (json._replyIds) {
replyTL(json._replyIds[0], acct_id);
}
} else {
var url = json.url
if (json.account.acct == json.account.username) {
var local = true;
} else {
var local = false;
}
var scn = json.account.acct;
var uid = json.account.id;
if (json["in_reply_to_id"]) {
replyTL(json["in_reply_to_id"], acct_id);
}
}
$("#toot-this .fav_ct").text(json.favourites_count);
$("#toot-this .rt_ct").text(json.reblogs_count);
$("#tootmodal").attr("data-url",json.url);
$("#tootmodal").attr("data-id",json.id);
if(json.account.acct==json.account.username){
$("#tootmodal").attr("data-user",json.account.acct+"@"+domain);
}else{
$("#tootmodal").attr("data-user",json.account.acct);
$("#tootmodal").attr("data-url", url);
$("#tootmodal").attr("data-id", json.id);
$("#tootmodal").attr("data-acct", acct_id);
if (local) {
$("#tootmodal").attr("data-user", scn + "@" + domain);
} else {
$("#tootmodal").attr("data-user", scn);
}
if (json.in_reply_to_id) {
replyTL(json.in_reply_to_id, acct_id);
getContext(id, acct_id);
var dom = null;
if (!local) {
dom = scn.replace(/.+@/g, '');
} else {
dom = domain;
}
context(id, acct_id);
beforeToot(id, acct_id);
userToot(id, acct_id, json.account.id);
beforeToot(id, acct_id, dom);
userToot(id, acct_id, uid);
afterToot(id, acct_id, dom);
afterUserToot(id, acct_id, uid);
afterFTLToot(id, acct_id, dom);
faved(id, acct_id);
rted(id, acct_id);
if(!$("#activator").hasClass("active")){
$('#det-col').collapsible('open', 1);
if ($("#toot-this div").hasClass("cvo")) {
$("#toot-this").removeClass("cvo");
} else {
if(!$("#toot-this .cvo").hasClass("cvo")){
$("#toot-this").addClass("cvo");
}
}
if (!$("#activator").hasClass("active")) {
$('#det-col').collapsible('open', 4);
}
});
}
//返信タイムライン
function replyTL(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/notes/show";
var i = {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
return false
}
fetch(start, i).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
var templete = parse([json], '', acct_id);
$("#toot-reply").prepend(templete);
jQuery("time.timeago").timeago();
if (json.in_reply_to_id) {
replyTL(json.in_reply_to_id, acct_id);
}).then(function (json) {
if (localStorage.getItem("filter_" + acct_id) != "undefined") {
var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "thread");
} else {
var mute = [];
}
if (localStorage.getItem("mode_" + domain) == "misskey") {
var templete = misskeyParse([json], '', acct_id, "", "", mute);
$("#toot-after").prepend(templete);
$("#toot-after .hide").html(lang.lang_details_filtered);
$("#toot-after .by_filter").css("display", "block");
$("#toot-after .by_filter").removeClass("hide");
var rep = "_replyIds";
if (json[rep]) {
replyTL(json[rep][0], acct_id);
}
}
});
}
//コンテクストってなんですか
function context(id, acct_id) {
function getContext(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/context";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/notes/conversation";
var i = {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({
i: at,
noteId: id
})
}
} else {
var start = "https://" + domain + "/api/v1/statuses/" + id + "/context";
var i = {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}
}
fetch(start, i).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
var templete = parse(json.descendants, '', acct_id);
$("#toot-after").html(templete);
jQuery("time.timeago").timeago();
}).then(function (json) {
if (localStorage.getItem("mode_" + domain) == "misskey") {
json.reverse();
var templete = misskeyParse(json, '', acct_id, "", "", []);
$("#toot-reply").html(templete);
$("#toot-reply .hide").html(lang.lang_details_filtered);
$("#toot-reply .by_filter").css("display", "block");
$("#toot-reply .by_filter").removeClass("hide");
jQuery("time.timeago").timeago();
} else {
if (localStorage.getItem("filter_" + acct_id) != "undefined") {
var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "thread");
} else {
var mute = [];
}
var templete = parse(json.descendants, '', acct_id, "", "", mute);
if (templete != "") {
$("#toot-after .no-data").hide();
}
$("#toot-after").html(templete);
$("#toot-after .hide").html(lang.lang_details_filtered);
$("#toot-after .by_filter").css("display", "block");
$("#toot-after .by_filter").removeClass("hide");
var templete = parse(json.ancestors, '', acct_id, "", "", mute);
if (templete != "") {
$("#toot-reply .no-data").hide();
}
$("#toot-reply").prepend(templete);
$("#toot-reply .hide").html(lang.lang_details_filtered);
$("#toot-reply .by_filter").css("display", "block");
$("#toot-reply .by_filter").removeClass("hide");
jQuery("time.timeago").timeago();
}
});
}
//前のトゥート(Back TL)
function beforeToot(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain +
"/api/v1/timelines/public?local=true&max_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
var templete = parse(json, '', acct_id);
$("#toot-before").html(templete);
jQuery("time.timeago").timeago();
});
function beforeToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain +
"/api/notes/local-timeline"
fetch(start, {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({
i: at,
untilID: id
})
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = misskeyParse(json, 'noauth', acct_id);
$("#toot-before").html(templete);
jQuery("time.timeago").timeago();
});
} else {
var start = "https://" + domain +
"/api/v1/timelines/public?local=true&max_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = parse(json, 'noauth', acct_id);
if (templete != "") {
$("#toot-before .no-data").hide();
}
$("#toot-before").html(templete);
jQuery("time.timeago").timeago();
});
}
}
//前のユーザーのトゥート
function userToot(id, acct_id, user) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + user + "/statuses?max_id=" + id;
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain +
"/api/users/notes"
fetch(start, {
method: 'POST',
headers: {
'content-type': 'application/json',
},
body: JSON.stringify({
i: at,
untilID: id,
userId: user
})
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = misskeyParse(json, 'noauth', acct_id);
$("#user-before").html(templete);
jQuery("time.timeago").timeago();
});
} else {
var start = "https://" + domain + "/api/v1/accounts/" + user + "/statuses?max_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = parse(json, '', acct_id);
if (templete != "") {
$("#user-before .no-data").hide();
}
$("#user-before").html(templete);
jQuery("time.timeago").timeago();
});
}
}
//後のLTL
function afterToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain +
"/api/v1/timelines/public?local=true&min_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = parse(json, 'noauth', acct_id);
if (templete != "") {
$("#ltl-after .no-data").hide();
}
$("#ltl-after").html(templete);
jQuery("time.timeago").timeago();
});
}
//後のUTL
function afterUserToot(id, acct_id, user) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/accounts/" + user + "/statuses?min_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
}).then(function (json) {
var templete = parse(json, '', acct_id);
$("#user-before").html(templete);
if (templete != "") {
$("#user-after .no-data").hide();
}
$("#user-after").html(templete);
jQuery("time.timeago").timeago();
});
}
//後のFTL
function afterFTLToot(id, acct_id, domain) {
//var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain +
"/api/v1/timelines/public?min_id=" + id;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = parse(json, 'noauth', acct_id);
if (templete != "") {
$("#ftl-after .no-data").hide();
}
$("#ftl-after").html(templete);
jQuery("time.timeago").timeago();
});
}
@@ -147,7 +403,8 @@ function userToot(id, acct_id, user) {
//ふぁぼ一覧
function faved(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") { return false; }
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/favourited_by";
fetch(start, {
method: 'GET',
@@ -155,21 +412,26 @@ function faved(id, acct_id) {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
}).then(function (json) {
var templete = userparse(json, '', acct_id);
if (templete != "") {
$("#toot-fav .no-data").hide();
}
$("#toot-fav").html(templete);
jQuery("time.timeago").timeago();
});
}
//ブースト一覧
function rted(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") { return false; }
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/statuses/" + id + "/reblogged_by";
fetch(start, {
method: 'GET',
@@ -177,119 +439,109 @@ function rted(id, acct_id) {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
}).then(function (json) {
var templete = userparse(json, '', acct_id);
$("#toot-rt").html(templete);
jQuery("time.timeago").timeago();
});
}
//URL等のコピー
function cbCopy(mode){
var url=$("#tootmodal").attr("data-url");
function cbCopy(mode) {
var url = $("#tootmodal").attr("data-url");
var urls = url.match(/https?:\/\/([-.a-zA-Z0-9]+)/);
var domain=urls[1];
if(mode=="emb"){
var emb='<iframe src="'+url+'/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400"></iframe><script src="https://'+domain+'/embed.js" async="async"></script>';
var domain = urls[1];
if (mode == "emb") {
var emb = '<iframe src="' + url + '/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400"></iframe><script src="https://' + domain + '/embed.js" async="async"></script>';
execCopy(emb)
Materialize.toast("埋め込みHTMLをコピーしました", 1500);
}else{
if(execCopy(url)){
Materialize.toast("トゥートURLをコピーしました", 1500);
M.toast({ html: lang.lang_details_embed, displayLength: 1500 })
} else {
if (execCopy(url)) {
M.toast({ html: lang.lang_details_url, displayLength: 1500 })
}
}
}
//本文のコピー
function staCopy(id){
var html=$("[toot-id="+id+"] .toot").html();
html = html.match(/^<p>(.+)<\/p>$/)[1];
function staCopy(id) {
var html = $("[toot-id=" + id + "] .toot").html();
html = html.replace(/^<p>(.+)<\/p>$/, "$1");
html = html.replace(/<br\s?\/?>/, "\n");
html = html.replace(/<p>/, "\n");
html = html.replace(/<\/p>/, "\n");
html=$.strip_tags(html);
if(execCopy(html)){
Materialize.toast("トゥート本文をコピーしました", 1500);
console.log("Copy it:\n" + html);
html = html.replace(/<img[\s\S]*alt="(.+?)"[\s\S]*?>/g, "$1");
html = $.strip_tags(html);
if (execCopy(html)) {
M.toast({ html: lang.lang_details_txt, displayLength: 1500 })
}
}
//魚拓
function shot(){
var id=$("#tootmodal").attr("data-id");
var w=$("#toot-this").width();
var h=$("#toot-this").height()+150;
var text=$("#toot-this").html();
localStorage.setItem("sc-text",text)
var electron = require("electron");
var ipc = electron.ipcRenderer;
ipc.send('screen', [w,h,id]);
}
//翻訳
function trans(tar){
var html=$("#toot-this .toot").html();
if(html.match(/^<p>(.+)<\/p>$/)){
function trans(tar, to) {
var html = $("#toot-this .toot").html();
if (html.match(/^<p>(.+)<\/p>$/)) {
html = html.match(/^<p>(.+)<\/p>$/)[1];
}
html = html.replace(/<br\s?\/?>/g, "\n");
html = html.replace(/<p>/g, "\n");
html = html.replace(/<\/p>/g, "\n");
html=$.strip_tags(html);
html = $.strip_tags(html);
if (~tar.indexOf("zh")) {
tar = "zh";
}
$("#toot-this .additional").text("Loading...(Powered by Google Translate)");
var exec='https://script.google.com/macros/s/AKfycbz0ETqcUxwNlw961GjErNb7vr_X18N2s1AS5Xu5nFTbYXcdcRM/exec?text='+encodeURIComponent(html)+'&source='+tar+'&target=ja'
console.log(exec);
var exec = 'https://script.google.com/macros/s/AKfycbxhwW5tjjop9Irg-y1zr_WsXlCKEzwWG6KuoOt_vVRDfEbRv0c/exec?format=json&text=' + encodeURIComponent(html) + '&source=' + tar + '&target=' + to
console.log("Try to translate from " + tar + " to " + to + " at " + exec);
fetch(exec, {
method: 'GET',
}).then(function(response) {
return response.text();
}).catch(function(error) {
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(text) {
$("#toot-this .additional").html('<span class="gray">'+text+'</span>');
}).then(function (text) {
$("#toot-this .additional").html('<span class="gray translate">' + text.text + '</span>');
});
}
//ブラウザで開く
function brws(){
var url=$("#tootmodal").attr("data-url");
const {
shell
} = require('electron');
shell.openExternal(url);
function brws() {
var url = $("#tootmodal").attr("data-url");
postMessage(["openUrl", url], "*")
}
//外部からトゥート開く
function detEx(url,acct_id){
var domain = localStorage.getItem("domain_"+acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/search?resolve=true&q="+url
function detEx(url, acct_id) {
if (acct_id == "main") {
acct_id = localStorage.getItem("main");
}
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/search?resolve=true&q=" + url
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
}
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
if(!json.statuses){
const {
shell
} = require('electron');
shell.openExternal(url);
}else{
var id=json.statuses[0].id;
}).then(function (json) {
if (!json.statuses) {
postMessage(["openUrl", url], "*")
} else {
var id = json.statuses[0].id;
$(".loadp").text($(".loadp").attr("href"));
$(".loadp").removeClass("loadp");
details(id, acct_id, 0)
}
});
return;
}

View File

@@ -15,13 +15,14 @@ function date(str, datetype) {
} else {
var min = date.getMinutes();
}
var sec = null;
if (date.getSeconds() < 10) {
var sec = "0" + date.getSeconds();
sec = "0" + date.getSeconds();
} else {
var sec = date.getSeconds();
sec = date.getSeconds();
}
if (datetype == "full") {
var ret = date.getFullYear() + "" + month + "" + date.getDate() + " " +
var ret = date.getFullYear() + "/" + month + "/" + date.getDate() + "/ " +
date.getHours() + ":" + min + ":" + sec;
}
if (date.getFullYear() == now.getFullYear()) {
@@ -34,15 +35,15 @@ function date(str, datetype) {
}
} else {
var ret = month + "" + date.getDate() + " " + date.getHours() + ":" +
var ret = month + "/" + date.getDate() + " " + date.getHours() + ":" +
min + ":" + sec;
}
} else {
var ret = month + "" + date.getDate() + " " + date.getHours() + ":" + min +
var ret = month + "/" + date.getDate() + " " + date.getHours() + ":" + min +
":" + sec;
}
} else {
var ret = date.getFullYear() + "" + month + "" + date.getDate() + " " +
var ret = date.getFullYear() + "/" + month + "/" + date.getDate() + " " +
date.getHours() + ":" + min + ":" + sec;
}
if (datetype == "double") {
@@ -56,14 +57,39 @@ function date(str, datetype) {
//特殊フォーマット(インスタンス情報で利用)
function crat(str) {
var date = new Date(str);
var mnt = null;
if (date.getMonth() < 9) {
mnt = "0" + (date.getMonth() + 1);
} else {
mnt = date.getMonth() + 1;
}
if (date.getDate() < 10) {
var dat = "0" + date.getDate();
} else {
var dat = date.getDate();
}
if (date.getHours() < 10) {
var hrs = "0" + date.getHours();
} else {
var hrs = date.getHours();
}
if (date.getMinutes() < 10) {
var mns = "0" + date.getMinutes();
} else {
var mns = date.getMinutes();
}
if (date.getSeconds() < 10) {
var sec = "0" + date.getSeconds();
} else {
var sec = date.getSeconds();
}
format_str = 'YYYY-MM-DD hh:mm:ss';
format_str = format_str.replace(/YYYY/g, date.getFullYear());
format_str = format_str.replace(/MM/g, date.getMonth()+1);
format_str = format_str.replace(/DD/g, date.getDate());
format_str = format_str.replace(/hh/g, date.getHours());
format_str = format_str.replace(/mm/g, date.getMinutes());
format_str = format_str.replace(/ss/g, date.getSeconds());
format_str = format_str.replace(/MM/g, mnt);
format_str = format_str.replace(/DD/g, dat);
format_str = format_str.replace(/hh/g, hrs);
format_str = format_str.replace(/mm/g, mns);
format_str = format_str.replace(/ss/g, sec);
return format_str;
}

69
app/js/tl/directory.js Normal file
View File

@@ -0,0 +1,69 @@
//ディレクトリ
//ディレクトリトグル
function dirMenu() {
$("#dir-contents").html("");
directory();
$("#left-menu div").removeClass("active");
$("#dirMenu").addClass("active");
$(".menu-content").addClass("hide");
$("#dir-box").removeClass("hide");
}
function dirselCk() {
var acct = $("#dir-acct-sel").val();
if (acct == "noauth") {
$("#dirNoAuth").removeClass("hide");
} else {
$("#dirNoAuth").addClass("hide");
directory();
}
}
function directory(isMore) {
var order = $("[name=sort]:checked").val()
if (!order) {
order = "active"
}
var local_only = $("#local_only:checked").val()
if (local_only) {
local_only = "true"
} else {
local_only = "false"
}
var acct_id = $("#dir-acct-sel").val();
if (acct_id == "noauth") {
var domain = $("#dirNoAuth-url").val();
var at = "";
} else {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
}
if (isMore) {
var addOffset = $("#dir-contents .cvo").length
} else {
var addOffset = 0
$("#dir-contents").html("");
}
var start = "https://" + domain + "/api/v1/directory?order=" + order + "&local=" + local_only + "&offset=" + addOffset
console.log(start)
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
//todo(error);
console.error(error);
}).then(function (json) {
if (json) {
$("#moreDir").removeClass("disabled")
var html = userparse(json, null, acct_id, "dir", null)
$("#dir-contents").append(html)
jQuery("time.timeago").timeago();
} else {
$("#moreDir").addClass("disabled")
}
});
}

522
app/js/tl/dm.js Normal file
View File

@@ -0,0 +1,522 @@
//DM(Conv) TL
function dm(acct_id, tlid, type, delc, voice) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/conversations";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = '<div id="convList' + tlid + '">' + dmListParse(json, type, acct_id, tlid, "", mute) + '</div>';
localStorage.setItem("lastobj_" + tlid, json[0].id)
$("#timeline_" + tlid).html(templete);
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
todc();
//reload(type, '', acct_id, tlid, data, mute, delc,voice);
$(window).scrollTop(0);
});
}
function dmmore(tlid) {
var multi = localStorage.getItem("column");
var obj = JSON.parse(multi);
var acct_id = obj[tlid].domain;
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var sid = $("#timeline_" + tlid + " .cvo").last().attr("unique-id");
var start = "https://" + domain + "/api/v1/conversations?max_id=" + sid;
var type = "dm";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
var templete = '<div id="convList' + tlid + '">' + dmListParse(json, type, acct_id, tlid, "", mute) + '</div>';
$("#timeline_" + tlid).append(templete);
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
moreloading = false;
})
}
//DMオブジェクトパーサー(トゥート)
function dmListParse(obj, mix, acct_id, tlid, popup, mutefilter) {
var templete = '';
if (obj[0]) {
localStorage.setItem("lastunix_" + tlid, date(obj[0].created_at, 'unix'));
}
var actb = localStorage.getItem("action_btns");
var actb = 're,rt,fav,qt,del,pin,red';
if (actb) {
var actb = actb.split(',');
var disp = {};
for (var k = 0; k < actb.length; k++) {
if (k < 4) {
var tp = "type-a";
} else {
var tp = "type-b";
}
disp[actb[k]] = tp;
}
}
var datetype = localStorage.getItem("datetype");
var nsfwtype = localStorage.getItem("nsfw");
var sent = localStorage.getItem("sentence");
var ltr = localStorage.getItem("letters");
var gif = localStorage.getItem("gif");
var imh = localStorage.getItem("img-height");
//独自ロケール
var locale = localStorage.getItem("locale");
if (locale == "yes") {
var locale = false;
}
//ネイティブ通知
var native = localStorage.getItem("nativenotf");
if (!native) {
native = "yes";
}
//クライアント強調
var emp = localStorage.getItem("client_emp");
if (emp) {
var emp = JSON.parse(emp);
}
//クライアントミュート
var mute = localStorage.getItem("client_mute");
if (mute) {
var mute = JSON.parse(mute);
}
//ユーザー強調
var useremp = localStorage.getItem("user_emp");
if (useremp) {
var useremp = JSON.parse(useremp);
}
//ワード強調
var wordemp = localStorage.getItem("word_emp");
if (wordemp) {
var wordemp = JSON.parse(wordemp);
}
//ワードミュート
var wordmute = localStorage.getItem("word_mute");
if (wordmute) {
var wordmute = JSON.parse(wordmute);
wordmute = wordmute.concat(mutefilter);
} else {
wordmute = mutefilter;
}
//Ticker
var tickerck = localStorage.getItem("ticker_ok");
if (tickerck) {
var ticker = true;
} else {
var ticker = false;
}
//Cards
var card = localStorage.getItem("card_" + tlid);
if (!sent) {
var sent = 500;
}
if (!ltr) {
var ltr = 500;
}
if (!nsfwtype || nsfwtype == "yes") {
var nsfw = "ok";
} else {
var nsfw;
}
var cwtype = localStorage.getItem("cw");
if (!cwtype || cwtype == "yes") {
var cw = "ok";
} else {
var cw;
}
if (!datetype) {
datetype = "absolute";
}
if (!gif) {
var gif = "yes";
}
if (!imh) {
var imh = "200";
}
if (!emp) {
var emp = [];
}
if (!mute) {
var mute = [];
}
if (!useremp) {
var useremp = [];
}
if (!wordemp) {
var wordemp = [];
}
if (!wordmute) {
var wordmute = [];
}
//via通知
var viashow = localStorage.getItem("viashow");
if (!viashow) {
viashow = "via-hide";
}
if (viashow == "hide") {
viashow = "via-hide";
}
//認証なしTL
if (mix == "noauth") {
var noauth = "hide";
var antinoauth = "";
} else {
var noauth = "";
var antinoauth = "hide";
}
//マウスオーバーのみ
var mouseover = localStorage.getItem("mouseover");
if (!mouseover) {
mouseover = "";
} else if (mouseover == "yes" || mouseover == "click") {
mouseover = "hide";
} else if (mouseover == "no") {
mouseover = "";
}
var local = [];
var times = [];
Object.keys(obj).forEach(function (key) {
var conv_id = obj[key].id;
var toot = obj[key].last_status;
var dis_name = escapeHTML(toot.account.display_name);
if (toot.account.emojis) {
var actemojick = toot.account.emojis[0];
} else {
var actemojick = false;
}
//絵文字があれば
if (actemojick) {
Object.keys(toot.account.emojis).forEach(function (key5) {
var emoji = toot.account.emojis[key5];
var shortcode = emoji.shortcode;
var emoji_url = '<img src="' + emoji.url +
'" class="emoji-img" data-emoji="' + shortcode + '" alt=" :' + shortcode + ': ">';
var regExp = new RegExp(":" + shortcode + ":", "g");
dis_name = dis_name.replace(regExp, emoji_url);
});
}
var noticeavatar = "";
var if_notf = "";
var uniqueid = toot.id;
var notice = "";
var boostback = "";
//ユーザー強調
if (toot.account.username != toot.account.acct) {
var fullname = toot.account.acct;
} else {
var domain = localStorage.getItem("domain_" + acct_id);
var fullname = toot.account.acct + "@" + domain;
}
if (useremp) {
Object.keys(useremp).forEach(function (key10) {
var user = useremp[key10];
if (user == fullname) {
boostback = "emphasized";
}
});
}
var id = toot.id;
var home = "";
if (toot.account.locked) {
var locked = ' <i class="fas fa-lock red-text"></i>';
} else {
var locked = "";
}
if (!toot.application) {
var via = '';
viashow = "hide";
} else {
var via = escapeHTML(toot.application.name);
//強調チェック
Object.keys(emp).forEach(function (key6) {
var cli = emp[key6];
if (cli == via) {
boostback = "emphasized";
}
});
//ミュートチェック
Object.keys(mute).forEach(function (key7) {
var cli = mute[key7];
if (cli == via) {
boostback = "hide";
}
});
}
if (mix == "pinned") {
boostback = "emphasized";
}
if (toot.spoiler_text && cw) {
var content = toot.content;
var spoil = escapeHTML(toot.spoiler_text);
var spoiler = "cw cw_hide_" + toot.id;
var api_spoil = "gray";
var spoiler_show = '<a href="#" onclick="cw_show(\'' + toot.id +
'\')" class="nex parsed">' + lang.lang_parse_cwshow + '</a><br>';
} else {
var ct1 = toot.content.split('</p>').length + toot.content.split('<br />').length - 2;
var ct2 = toot.content.split('</p>').length + toot.content.split('<br>').length - 2;
if (ct1 > ct2) { var ct = ct1; } else { var ct = ct2; }
if ((sent < ct && $.mb_strlen($.strip_tags(toot.content)) > 5) || ($.strip_tags(toot.content).length > ltr && $.mb_strlen($.strip_tags(toot.content)) > 5)) {
var content = '<span class="gray">' + lang.lang_parse_fulltext + '</span><br>' + toot.content
var spoil = '<span class="cw-long-' + toot.id + '">' + $.mb_substr($.strip_tags(
toot.content), 0, 100) +
'</span><span class="gray">' + lang.lang_parse_autofold + '</span>';
var spoiler = "cw cw_hide_" + toot.id;
var spoiler_show = '<a href="#" onclick="cw_show(\'' + toot.id +
'\')" class="nex parsed">' + lang.lang_parse_more + '</a><br>';
} else {
var content = toot.content;
var spoil = escapeHTML(toot.spoiler_text);
var spoiler = "";
var spoiler_show = "";
}
}
var urls = $.strip_tags(content).replace(/\n/g, " ").match(
/https?:\/\/([-a-zA-Z0-9@.]+)\/?(?!.*((media|tags)|mentions)).*([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)?/
);
if (urls) {
var analyze = '<a onclick="additionalIndv(\'' + tlid + '\',' + acct_id +
',\'' + id + '\')" class="add-show pointer">' + lang.lang_parse_url + '</a><br>';
} else {
var analyze = '';
}
var viewer = "";
var hasmedia = "";
var youtube = "";
if (toot.emojis) {
var emojick = toot.emojis[0];
} else {
var emojick = false;
}
//絵文字があれば
if (emojick) {
Object.keys(toot.emojis).forEach(function (key5) {
var emoji = toot.emojis[key5];
var shortcode = emoji.shortcode;
var emoji_url = '<img src="' + emoji.url +
'" class="emoji-img" data-emoji="' + shortcode + '" alt=" :' + shortcode + ': ">';
var regExp = new RegExp(":" + shortcode + ":", "g");
content = content.replace(regExp, emoji_url);
spoil = spoil.replace(regExp, emoji_url);
});
}
//ニコフレ絵文字
if (toot.profile_emojis) {
var nicoemojick = toot.profile_emojis[0];
} else {
var nicoemojick = false;
}
//絵文字があれば
if (nicoemojick) {
Object.keys(toot.profile_emojis).forEach(function (keynico) {
var emoji = toot.profile_emojis[keynico];
var shortcode = emoji.shortcode;
var emoji_url = '<img src="' + emoji.url +
'" class="emoji-img" data-emoji="' + shortcode + '" alt=" :' + shortcode + ': ">';
var regExp = new RegExp(":" + shortcode + ":", "g");
content = content.replace(regExp, emoji_url);
spoil = spoil.replace(regExp, emoji_url);
});
}
//デフォ絵文字
content = twemoji.parse(content);
if (dis_name) {
dis_name = twemoji.parse(dis_name);
}
if (spoil) {
spoil = twemoji.parse(spoil);
}
var mediack = toot.media_attachments[0];
//メディアがあれば
var media_ids = "";
if (mediack) {
hasmedia = "hasmedia";
var cwdt = 100 / toot.media_attachments.length;
Object.keys(toot.media_attachments).forEach(function (key2) {
var media = toot.media_attachments[key2];
var purl = media.preview_url;
media_ids = media_ids + media.id + ",";
var url = media.url;
if (toot.sensitive && nsfw) {
var sense = "sensitive"
} else {
var sense = ""
}
viewer = viewer + '<a onclick="imgv(\'' + id + '\',\'' + key2 + '\',\'' +
acct_id + '\')" id="' + id + '-image-' + key2 + '" data-url="' + url +
'" data-type="' + media.type + '" class="img-parsed"><img src="' +
purl + '" class="' + sense +
' toot-img pointer" style="width:' + cwdt + '%; height:' + imh + 'px;"></a></span>';
});
media_ids = media_ids.slice(0, -1);
} else {
viewer = "";
hasmedia = "nomedia";
}
var menck = toot.mentions[0];
var mentions = "";
//メンションであれば
if (menck) {
mentions = "";
Object.keys(toot.mentions).forEach(function (key3) {
var mention = toot.mentions[key3];
mentions = mentions + '<a onclick="udg(\'' + mention.id + '\',' +
acct_id + ')" class="pointer">@' + mention.acct + '</a> ';
});
mentions = '<div style="float:right">' + mentions + '</div>';
}
var tagck = toot.tags[0];
var tags = "";
//タグであれば
if (tagck) {
Object.keys(toot.tags).forEach(function (key4) {
var tag = toot.tags[key4];
tags = tags + '<span class="hide" data-tag="' + tag.name + '">#' + tag.name + ':<a onclick="tl(\'tag\',\'' + tag.name + '\',' + acct_id +
',\'add\')" class="pointer" title="' + lang.lang_parse_tagTL.replace("{{tag}}", '#' + tag.name) + '">TL</a> <a onclick="brInsert(\'#' + tag.name + '\')" class="pointer" title="' + lang.lang_parse_tagtoot.replace("{{tag}}", '#' + tag.name) + '">Toot</a> ' +
'<a onclick="tagPin(\'' + tag.name + '\')" class="pointer" title="' + lang.lang_parse_tagpin.replace("{{tag}}", '#' + tag.name) + '">Pin</a></span> ';
});
tags = '<div style="float:right">' + tags + '</div>';
}
//アニメ再生
if (gif == "yes") {
var avatar = toot.account.avatar;
} else {
var avatar = toot.account.avatar_static;
}
//ワードミュート
if (wordmute) {
Object.keys(wordmute).forEach(function (key8) {
var worde = wordmute[key8];
if (worde) {
if (worde.tag) {
var word = worde.tag;
} else {
var word = worde
}
var regExp = new RegExp(word, "g");
if ($.strip_tags(content).match(regExp)) {
boostback = "hide by_filter";
}
}
});
}
//ワード強調
if (wordemp) {
Object.keys(wordemp).forEach(function (key9) {
var word = wordemp[key9];
if (word) {
var word = word.tag;
var regExp = new RegExp(word, "g");
content = content.replace(regExp, '<span class="emp">' + escapeHTML(word) + "</span>");
}
});
}
//日本語じゃない
if (toot.language != "ja") {
var trans = '<div class="action pin"><a onclick="trans(\'' + toot.language + '\')" class="waves-effect waves-dark btn-flat" style="padding:0" title="' + lang.lang_parse_trans + '"><i class="material-icons">g_translate</i></a></div>';
} else {
var trans = "";
}
if (toot.favourited) {
var if_fav = " yellow-text";
var fav_app = "faved";
} else {
var if_fav = "";
var fav_app = "";
}
//Cards
if (!card && toot.card) {
var cards = toot.card;
if (cards.provider_name == "Twitter") {
if (cards.image) {
var twiImg = '<br><img src="' + cards.image + '">';
} else {
var twiImg = '';
}
analyze = '<blockquote class="twitter-tweet"><b>' + escapeHTML(cards.author_name) + '</b><br>' + escapeHTML(cards.description) + twiImg + '</blockquote>';
}
if (cards.title) {
analyze = "<span class=\"gray\">URL" + lang.lang_cards_check + ":<br>Title:" + escapeHTML(cards.title) + "<br>" +
escapeHTML(cards.description) + "</span>";
}
if (cards.html) {
analyze = cards.html + '<i class="material-icons" onclick="pip(' + id + ')" title="' + lang.lang_cards_pip + '">picture_in_picture_alt</i>';
}
}
//Ticker
var tickerdom = "";
if (ticker) {
var tickerdata = localStorage.getItem("ticker")
if (tickerdata) {
var tickerdata = JSON.parse(tickerdata);
var thisdomain = toot.account.acct.split("@");
if (thisdomain.length > 1) {
thisdomain = thisdomain[1];
}
for (var i = 0; i < tickerdata.length; i++) {
var value = tickerdata[i];
if (value.domain == thisdomain) {
var tickerdom = '<div style="background:linear-gradient(to left,transparent, ' + value.bg + ' 96%) !important; color:' + value.text + ';width:100%; height:0.9rem; font-size:0.8rem;"><img src="' + value.image + '" style="height:100%;"><span style="position:relative; top:-0.2rem;"> ' + escapeHTML(value.name) + '</span></div>';
break;
}
}
}
}
templete = templete + '<div id="pub_' + toot.id + '" class="cvo ' +
boostback + ' ' + fav_app +
' ' + hasmedia + '" toot-id="' + id + '" unique-id="' + uniqueid + '" data-medias="' + media_ids + ' " unixtime="' + date(obj[
key].created_at, 'unix') + '" ' + if_notf + ' onclick="dmStatus()">' +
'<div class="area-notice"><span class="gray sharesta">' + notice + home +
'</span></div>' +
'<div class="area-icon"><a onclick="udg(\'' + toot.account.id +
'\',' + acct_id + ');" user="' + toot.account.acct + '" class="udg">' +
'<img src="' + avatar +
'" width="40" class="prof-img" user="' + toot.account.acct +
'"></a>' + noticeavatar + '</div>' +
'<div class="area-display_name"><div class="flex-name"><span class="user">' +
dis_name +
'</span><span class="sml gray" style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis; cursor:text;"> @' +
toot.account.acct + locked + '</span></div>' +
'<div class="flex-time"><span class="cbadge cbadge-hover pointer waves-effect" onclick="tootUriCopy(\'' +
toot.url + '\');" title="' + date(toot.created_at, 'absolute') +
'(' + lang.lang_parse_clickcopyurl + ')"><i class="far fa-clock-o"></i>' +
date(toot.created_at, datetype) + '</span>' +
'</div></div>' +
'<div class="area-toot">' + tickerdom + '<span class="' +
api_spoil + ' cw_text_' + toot.id + '"><span class="cw_text">' + spoil + "</span>" + spoiler_show +
'</span><span class="toot ' + spoiler + '">' + content +
'</span>' +
'' + viewer + '' +
'<br><a onclick="details(\'' + toot.id + '\',' + acct_id +
',\'' + tlid + '\',\'dm\')" class="pointer waves-effect">' + lang.lang_parse_thread + '</a></div>' +
'<div class="area-vis"></div>' +
'</div></div>';
});
return templete;
}

View File

@@ -1,16 +1,40 @@
/*メディアフィルター機能*/
//各TL上方のMedia[On/Off]
function mediaToggle(tlid) {
var media = localStorage.getItem("media_" + tlid);
if (media) {
localStorage.removeItem("media_" + tlid);
localStorage.removeItem("media_" + tlid);
$("#sta-media-" + tlid).text("Off");
$("#sta-media-" + tlid).css("color",'red');
$("#timeline_"+tlid).removeClass("media-filter")
$("#sta-media-" + tlid).css("color", 'red');
$("#timeline_" + tlid).removeClass("media-filter")
} else {
localStorage.setItem("media_" + tlid, "true");
$("#sta-media-" + tlid).text("On");
$("#sta-media-" + tlid).css("color",'#009688');
$("#timeline_"+tlid).addClass("media-filter")
$("#sta-media-" + tlid).css("color", '#009688');
$("#timeline_" + tlid).addClass("media-filter")
}
}
//各TL上方のBT[BTOnly/BTExc/Off]
function ebtToggle(tlid) {
var ebt = localStorage.getItem("ebt_" + tlid);
if (ebt == "true") {
localStorage.setItem("ebt_" + tlid, "but");
$("#sta-bt-" + tlid).text("BT Only");
$("#sta-bt-" + tlid).css("color", '#ff9800');
$("#timeline_" + tlid).addClass("except-bt-filter")
$("#timeline_" + tlid).removeClass("bt-filter")
} else if (ebt == "but") {
localStorage.removeItem("ebt_" + tlid);
$("#sta-bt-" + tlid).text("Off");
$("#sta-bt-" + tlid).css("color", 'red');
$("#timeline_" + tlid).removeClass("bt-filter")
$("#timeline_" + tlid).removeClass("except-bt-filter")
} else {
localStorage.setItem("ebt_" + tlid, "true");
$("#sta-bt-" + tlid).text("BT Ex");
$("#sta-bt-" + tlid).css("color", '#009688');
$("#timeline_" + tlid).addClass("bt-filter")
$("#timeline_" + tlid).removeClass("except-bt-filter")
}
}
//各TL上方のMedia[On/Off]をチェック
@@ -18,11 +42,417 @@ function mediaCheck(tlid) {
var media = localStorage.getItem("media_" + tlid);
if (media) {
$("#sta-media-" + tlid).text("On");
$("#sta-media-" + tlid).css("color",'#009688');
$("#timeline_"+tlid).addClass("media-filter")
$("#sta-media-" + tlid).css("color", '#009688');
$("#timeline_" + tlid).addClass("media-filter")
} else {
$("#sta-media-" + tlid).text("Off");
$("#sta-media-" + tlid).css("color",'red');
$("#timeline_"+tlid).removeClass("media-filter")
$("#sta-media-" + tlid).css("color", 'red');
$("#timeline_" + tlid).removeClass("media-filter")
}
}
//各TL上方のBT[On/Off]をチェック
function ebtCheck(tlid) {
var ebt = localStorage.getItem("ebt_" + tlid);
if (ebt == "true") {
$("#sta-bt-" + tlid).text("BT Ex");
$("#sta-bt-" + tlid).css("color", '#009688');
$("#timeline_" + tlid).addClass("bt-filter")
$("#timeline_" + tlid).removeClass("except-bt-filter")
} else if (ebt == "but") {
$("#sta-bt-" + tlid).text("BT Only");
$("#sta-bt-" + tlid).css("color", '#ff9800');
$("#timeline_" + tlid).addClass("except-bt-filter")
$("#timeline_" + tlid).removeClass("bt-filter")
} else {
$("#sta-bt-" + tlid).text("Off");
$("#sta-bt-" + tlid).css("color", 'red');
$("#timeline_" + tlid).removeClass("bt-filter")
$("#timeline_" + tlid).removeClass("except-bt-filter")
}
}
/* 削除追跡*/
function catchToggle(tlid) {
var catchck = localStorage.getItem("catch_" + tlid);
if (catchck) {
localStorage.removeItem("catch_" + tlid);
$("#sta-del-" + tlid).text("Off");
$("#sta-del-" + tlid).css("color", 'red');
parseColumn(tlid);
} else {
localStorage.setItem("catch_" + tlid, "true");
$("#sta-del-" + tlid).text("On");
$("#sta-del-" + tlid).css("color", '#009688');
parseColumn(tlid);
}
}
function catchCheck(tlid) {
var catchck = localStorage.getItem("catch_" + tlid);
if (catchck) {
$("#sta-del-" + tlid).text("On");
$("#sta-del-" + tlid).css("color", '#009688');
} else {
$("#sta-del-" + tlid).text("Off");
$("#sta-del-" + tlid).css("color", 'red');
}
}
function delreset(tlid) {
$("[tlid=" + tlid + "] .by_delcatch").hide();
$("[tlid=" + tlid + "] .by_delcatch").remove();
}
/*ワードフィルター機能*/
function filterMenu() {
$("#left-menu div").removeClass("active");
$("#filterMenu").addClass("active");
$(".menu-content").addClass("hide");
$("#filter-box").removeClass("hide");
}
function filter() {
$("#filtered-words").html("");
$("#filter-edit-id").val("")
var acct_id = $("#filter-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/filters"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var filters = "";
Object.keys(json).forEach(function (key) {
var filterword = json[key];
var context = filterword.context.join(',');
filters = filters + escapeHTML(filterword.phrase) + '<span class="sml">(for ' + context + ')</span>:<a onclick="filterEdit(\'' + filterword.id + '\',\'' + acct_id +
'\')" class="pointer">' + lang.lang_edit + '</a>/<a onclick="filterDel(' + filterword.id + ',' + acct_id +
')" class="pointer">' + lang.lang_del + '</a><br> ';
});
if (filters == "") {
filters = lang.lang_filter_nodata + "<br>";
}
$("#filtered-words").html(filters);
} else {
$("#filtered-words").html(lang_filter_nodata);
}
});
}
function filterTime(day, hour, min) {
$("#days_filter").val(day)
$("#hours_filter").val(hour)
$("#mins_filter").val(min)
}
function makeNewFilter() {
var acct_id = $("#filter-acct-sel").val();
var phr = $("#filter-add-word").val();
var cont = [];
if ($("#home_filter:checked").val()) {
cont.push("home");
}
if ($("#local_filter:checked").val()) {
cont.push("public");
}
if ($("#notf_filter:checked").val()) {
cont.push("notifications");
}
if ($("#conv_filter:checked").val()) {
cont.push("thread");
}
if (!cont.length) {
$("#filtered-words").html('Error:' + lang.lang_filter_errordegree);
}
var exc = $("#except_filter:checked").val();
var who = $("#wholeword_filter:checked").val();
if (!who) {
who = false;
}
var time = $("#days_filter").val() * 24 * 60 * 60 + $("#hours_filter").val() * 60 * 60 + $("#mins_filter").val() * 60;
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if ($("#filter-edit-id").val()) {
var start = "https://" + domain + "/api/v1/filters/" + $("#filter-edit-id").val();
var method = "PUT"
} else {
var start = "https://" + domain + "/api/v1/filters"
var method = "POST"
}
var httpreq = new XMLHttpRequest();
httpreq.open(method, start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = "json";
httpreq.send(JSON.stringify({
phrase: phr,
context: cont,
irreversible: exc,
whole_word: who,
expires_in: time
}));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
filter();
filterUpdate(acct_id)
$("#filter-add-word").val("");
$("#home_filter").prop("checked", false);
$("#local_filter").prop("checked", false);
$("#notf_filter").prop("checked", false);
$("#conv_filter").prop("checked", false);
$("#except_filter").prop("checked", false);
$("#wholeword_filter").prop("checked", false);
$("#days_filter").val("0");
$("#hours_filter").val("0");
$("#mins_filter").val("0");
$("#add-filter-btn").text(lang.lang_add);
$("#filter-edit-id").val("")
}
}
}
function filterEdit(id, acct_id) {
$("#filter-add-word").val("");
$("#home_filter").prop("checked", false);
$("#local_filter").prop("checked", false);
$("#notf_filter").prop("checked", false);
$("#conv_filter").prop("checked", false);
$("#except_filter").prop("checked", false);
$("#wholeword_filter").prop("checked", false);
$("#days_filter").val("0");
$("#hours_filter").val("0");
$("#mins_filter").val("0");
$("#add-filter-btn").text(lang.lang_edit);
$("#filter-edit-id").val(id);
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/filters/" + id
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var now = new Date();
now = now.getTime();
var now = Math.floor(now / 1000);
$("#filter-add-word").val(json.phrase);
Object.keys(json.context).forEach(function (key) {
var context = json.context[key];
$("[value=" + context + "]").prop("checked", true);
});
if (json.irreversible) {
$("#except_filter").prop("checked", true);
}
if (json.whole_word) {
$("#wholeword_filter").prop("checked", true);
}
var expires = date(json.expires_at, 'unix') - now;
var mins = Math.floor(expires / 60) % 60;
var hours = Math.floor(expires / 3600) % 24;
var days = Math.floor(expires / 3600 / 24);
$("#days_filter").val(days);
$("#hours_filter").val(hours);
$("#mins_filter").val(mins);
}
});
}
function filterDel(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/filters/" + id;
var httpreq = new XMLHttpRequest();
httpreq.open("DELETE", start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = "json";
httpreq.send();
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
filter();
filterUpdate(acct_id)
}
}
}
function getFilter(acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) != "misskey") {
var start = "https://" + domain + "/api/v1/filters"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
localStorage.setItem("filter_" + acct_id, JSON.stringify(json));
});
} else {
localStorage.setItem("filter_" + acct_id, JSON.stringify({}));
}
}
function getFilterType(json, type) {
if (!json) {
return [];
}
if (type == "local") {
type = "public";
} else if (type == "list") {
type = "home";
} else if (type == "notf") {
type = "notifi";
}
var mutedfilters = [];
Object.keys(json).forEach(function (key) {
var filterword = json[key];
var phrases = filterword.phrase;
if (filterword.context.join(",").indexOf(type) !== -1) {
mutedfilters.push(phrases);
}
});
return mutedfilters;
}
function filterUpdate(acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/filters"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
localStorage.setItem("filter_" + acct_id, JSON.stringify(json));
filterUpdateInternal(json, "home");
filterUpdateInternal(json, "local");
filterUpdateInternal(json, "notf");
filterUpdateInternal(json, "pub");
});
}
function filterUpdateInternal(json, type) {
var home = getFilterType(json, type);
var wordmute = localStorage.getItem("word_mute");
if (wordmute) {
var wordmute = JSON.parse(wordmute);
home = home.concat(wordmute);
}
if (home) {
$("[data-acct=" + acct_id + "] [data-type=" + type + "] .cvo").each(function (i, elem) {
var id = $(elem).attr("toot-id");
$("[toot-id=" + id + "]").removeClass("hide");
var text = $(elem).find('.toot').html();
Object.keys(home).forEach(function (key8) {
var word = home[key8];
var regExp = new RegExp(word.replace(/[.*+?^=!:${}()|[\]\/\\]/g, "\\$&"), "g");
if ($.strip_tags(text).match(regExp)) {
$("[toot-id=" + id + "]").addClass("hide");
}
});
});
}
}
/*
<a onclick="catchToggle(' + key +
')" class="setting nex"><i class="material-icons waves-effect nex" title="削除捕捉(削除されても残ります。背景色が変化します。)">delete</i><span id="sta-del-' +
key + '">On</span></a>削除捕捉<a onclick="delreset(' + key +
')" class="pointer">リセット</a><br>
*/
//通知フィルター
function exclude(key) {
localStorage.setItem("exclude-" + key, "")
var excludetxt = localStorage.getItem("exclude-" + key);
if ($('#exc-reply-' + key + ':checked').val()) {
excludetxt = "?exclude_types[]=mention"
}
if ($('#exc-fav-' + key + ':checked').val()) {
if (excludetxt || excludetxt !="") {
excludetxt = excludetxt + "&exclude_types[]=favourite"
} else {
excludetxt = "?exclude_types[]=favourite"
}
}
if ($('#exc-bt-' + key + ':checked').val()) {
if (excludetxt || excludetxt !="") {
excludetxt = excludetxt + "&exclude_types[]=reblog"
} else {
excludetxt = "?exclude_types[]=reblog"
}
}
if ($('#exc-follow-' + key + ':checked').val()) {
if (excludetxt || excludetxt !="") {
excludetxt = excludetxt + "&exclude_types[]=follow"
} else {
excludetxt = "?exclude_types[]=follow"
}
}
if ($('#exc-poll-' + key + ':checked').val()) {
if (excludetxt || excludetxt !="") {
excludetxt = excludetxt + "&exclude_types[]=poll"
} else {
excludetxt = "?exclude_types[]=poll"
}
} else {
}
localStorage.setItem("exclude-" + key, excludetxt)
parseColumn(key);
}
function excludeCk(key, target) {
var exc = localStorage.getItem("exclude-" + key);
if (!exc) {
return "";
}
if (~exc.indexOf(target)) {
return "checked"
} else {
return "";
}
}
function checkNotfFilter(tlid){
var excludetxt = localStorage.getItem("exclude-" + tlid);
if(!excludetxt || excludetxt != ""){
return true;
}else{
return false;
}
}
function resetNotfFilter(tlid){
localStorage.setItem("exclude-" + tlid, "")
parseColumn(tlid);
}
function notfFilter(id,tlid,acct_id){
var excludetxt = localStorage.getItem("exclude-" + tlid);
if (excludetxt || excludetxt !="") {
excludetxt = excludetxt + "&account_id="+id
} else {
excludetxt = "?account_id="+id
}
localStorage.setItem("exclude-" + tlid, excludetxt)
parseColumn(tlid);
}

View File

@@ -1,198 +1,286 @@
function listToggle(){
if ($("#list-box").hasClass("hide")) {
$("#list-box").removeClass("hide");
$("#list-box").addClass("show");
$("#list-box").css("top",$('#list-tgl').offset().top+"px");
$("#list-box").css("left",$('#list-tgl').offset().left-410+"px");
//リストロード
} else {
$("#list-box").removeClass("show");
$("#list-box").addClass("hide")
}
}
function listMenu() {
$("#left-menu div").removeClass("active");
$("#listMenu").addClass("active");
$(".menu-content").addClass("hide");
$("#list-box").removeClass("hide");
$('ul.tabs').tabs('select_tab', 'src-sta');
$("#src-contents").html("");
}
function list(){
$("#lists-user").html("");
var acct_id = $("#list-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists"
console.log(start)
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
if (json) {
var lists = "";
Object.keys(json).forEach(function(key) {
var list = json[key];
lists = lists + list.title+':<a onclick="listShow(' + list.id + ',\'' + list.title + '\',\'' + acct_id +
'\')" class="pointer">表示</a>/<a onclick="listUser(' + list.id + ',' + acct_id +
')" class="pointer">ユーザー一覧</a><br> ';
});
$("#lists").html(lists);
}else{
$("#lists").html("リストはありません");
}
});
function list() {
$("#lists-user").html("");
var acct_id = $("#list-acct-sel").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/users/lists/list"
fetch(start, {
method: 'POST',
body: JSON.stringify({
i: at
}),
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var lists = "";
Object.keys(json).forEach(function (key) {
var list = json[key];
lists = lists + escapeHTML(list.title) + ':<a onclick="listShow(\'' + list.id + '\',\'' + escapeHTML(list.title) + '\',\'' + acct_id +
'\')" class="pointer">' + lang.lang_list_show + '</a><br>';
});
$("#lists").html(lists);
} else {
$("#lists").html(lang.lang_list_nodata);
}
});
} else {
var start = "https://" + domain + "/api/v1/lists"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var lists = "";
Object.keys(json).forEach(function (key) {
var list = json[key];
lists = lists + escapeHTML(list.title) + ':<a onclick="listShow(\'' + list.id + '\',\'' + escapeHTML(list.title) + '\',\'' + acct_id +
'\')" class="pointer">' + lang.lang_list_show + '</a>/<a onclick="listUser(\'' + list.id + '\',' + acct_id +
')" class="pointer">' + lang.lang_list_users + '</a><br>';
});
$("#lists").html(lists);
} else {
$("#lists").html(lang.lang_list_nodata);
}
});
}
}
function makeNewList(){
var acct_id = $("#list-acct-sel").val();
var text=$("#list-add").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists"
console.log(start)
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send(JSON.stringify({
title: text
}));
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
var json = httpreq.response;
list();
$("#list-add").val("")
function makeNewList() {
var acct_id = $("#list-acct-sel").val();
var text = $("#list-add").val();
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) != "misskey") {
var start = "https://" + domain + "/api/v1/lists"
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = "json";
httpreq.send(JSON.stringify({
title: text
}));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
list();
$("#list-add").val("")
}
}
} else {
var start = "https://" + domain + "/api/users/lists/create"
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.responseType = "json";
httpreq.send(JSON.stringify({
i: at,
title: text
}));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
list();
$("#list-add").val("")
}
}
}
}
function listShow(id,title,acct_id){
localStorage.setItem("list_"+id+"_"+acct_id,title);
tl('list',id,acct_id,'add');
function listShow(id, title, acct_id) {
localStorage.setItem("list_" + id + "_" + acct_id, title);
tl('list', id, acct_id, 'add');
}
function listUser(id,acct_id){
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists/"+id+"/accounts"
console.log(start)
function listUser(id, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/lists/" + id + "/accounts"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(json) {
}).then(function (json) {
if (json) {
var lists = "";
var templete = userparse(json,'',acct_id);
if(!json[0]){
templete="ユーザーはいません";
}
var templete = userparse(json, '', acct_id);
if (!json[0]) {
templete = lang.lang_list_nouser;
}
$("#lists-user").html(templete);
}else{
$("#lists-user").html("ユーザーはいません");
}
jQuery("time.timeago").timeago();
} else {
$("#lists-user").html(lang.lang_list_nouser);
}
});
}
function hisList(user,acct_id){
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists"
console.log(start)
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
if (json) {
var lists = "リストに追加<br>";
Object.keys(json).forEach(function(key) {
var list = json[key];
lists = lists + '<a onclick="listAdd(' + list.id + ',\'' + user + '\',\'' + acct_id +
'\')" class="pointer">'+list.title+'</a><br> ';
});
$("#his-lists-a").html(lists);
}else{
$("#his-lists-a").html('リストはありません');
}
});
var start = "https://" + domain + "/api/v1/accounts/"+user+"/lists"
console.log(start)
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(json) {
if (json) {
var lists = "リストから削除<br>";
Object.keys(json).forEach(function(key) {
var list = json[key];
lists = lists + '<a onclick="listRemove(' + list.id + ',\'' + user + '\',\'' + acct_id +
'\')" class="pointer">'+list.title+'</a><br> ';
});
$("#his-lists-b").html(lists);
}else{
$("#his-lists-b").html('リストはありません');
}
});
function hisList(user, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) != "misskey") {
var start = "https://" + domain + "/api/v1/lists"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var lists = lang.lang_list_add + "<br>";
Object.keys(json).forEach(function (key) {
var list = json[key];
lists = lists + '<a onclick="listAdd(\'' + list.id + '\',\'' + user + '\',\'' + acct_id +
'\')" class="pointer">' + escapeHTML(list.title) + '</a><br> ';
});
$("#his-lists-a").html(lists);
} else {
$("#his-lists-a").html(lang.lang_list_nodata);
}
});
var start = "https://" + domain + "/api/v1/accounts/" + user + "/lists"
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var lists = lang.lang_list_remove + "<br>";
Object.keys(json).forEach(function (key) {
var list = json[key];
lists = lists + '<a onclick="listRemove(\'' + list.id + '\',\'' + user + '\',\'' + acct_id +
'\')" class="pointer">' + escapeHTML(list.title) + '</a><br> ';
});
$("#his-lists-b").html(lists);
} else {
$("#his-lists-b").html(lang.lang_list_nodata);
}
});
} else {
var start = "https://" + domain + "/api/users/lists/list"
fetch(start, {
method: 'POST',
body: JSON.stringify({
i: at
}),
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (json) {
if (json) {
var lists = "";
Object.keys(json).forEach(function (key) {
var list = json[key];
lists = lists + list.title + ':<a onclick="listShow(\'' + list.id + '\',\'' + escapeHTML(list.title) + '\',\'' + acct_id +
'\')" class="pointer">' + lang.lang_list_show + '</a>/<a onclick="listAdd(\'' + list.id + '\',\'' + user + '\',\'' + acct_id +
'\')" class="pointer">' + lang.lang_list_add + lang.lang_list_add_misskey + '</a><br>';
});
$("#his-lists-a").html(lists);
} else {
$("#his-lists-a").html(lang.lang_list_nodata);
}
});
$("#his-lists-b").html("");
}
}
function listAdd(id,user,acct_id){
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists/"+id+"/accounts"
console.log(start)
function listAdd(id, user, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/users/lists/push"
var i = {
i: at,
listId: id,
userId: user
}
} else {
var start = "https://" + domain + "/api/v1/lists/" + id + "/accounts"
var i = {
account_ids: [user]
}
}
var httpreq = new XMLHttpRequest();
httpreq.open('POST', start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send(JSON.stringify({
account_ids: [user]
}));
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
httpreq.responseType = "json";
httpreq.send(JSON.stringify(i));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
hisList(user,acct_id)
hisList(user, acct_id)
}
}
}
function listRemove(id,user,acct_id){
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/lists/"+id+"/accounts"
console.log(start)
function listRemove(id, user, acct_id) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("mode_" + domain) == "misskey") {
var start = "https://" + domain + "/api/users/lists/push"
var method = 'POST'
var i = {
i: at,
listId: id,
userId: user
}
} else {
var start = "https://" + domain + "/api/v1/lists/" + id + "/accounts"
var method = 'DELETE'
var i = {
account_ids: [user]
}
}
var httpreq = new XMLHttpRequest();
httpreq.open('DELETE', start, true);
httpreq.open(method, start, true);
httpreq.setRequestHeader('Content-Type', 'application/json');
httpreq.setRequestHeader('Authorization', 'Bearer ' + at);
httpreq.responseType = 'json';
httpreq.send(JSON.stringify({
account_ids: [user]
}));
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4) {
httpreq.responseType = "json";
httpreq.send(JSON.stringify(i));
httpreq.onreadystatechange = function () {
if (httpreq.readyState === 4) {
var json = httpreq.response;
hisList(user,acct_id)
hisList(user, acct_id)
}
}
}

1055
app/js/tl/misskeyparse.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,109 +1,127 @@
//Integrated TL
function mixtl(acct_id, tlid, type) {
console.log(type);
function mixtl(acct_id, tlid, type, delc, voice) {
localStorage.removeItem("morelock")
localStorage.setItem("now", type);
todo("Integrated TL Loading...(Local)");
//まずLocal
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var start = "https://" + domain + "/api/v1/timelines/public?local=true";
//まずLocal
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem("acct_" + acct_id + "_at");
var start = "https://" + domain + "/api/v1/timelines/public?local=true";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(jsonL) {
var start = "https://" + domain + "/api/v1/timelines/home";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(jsonH) {
var homearr=[];
var timeline = jsonL.concat(jsonH);
timeline.sort(function(a,b){
if(date(a.created_at,"unix")>date(b.created_at,"unix")) return -1;
if(date(a.created_at,"unix")<date(b.created_at,"unix")) return 1;
return 0;
}).then(function (jsonL) {
var start = "https://" + domain + "/api/v1/timelines/home";
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (jsonH) {
var homearr = [];
var timeline = jsonL.concat(jsonH);
timeline.sort(function (a, b) {
if (date(a.created_at, "unix") >= date(b.created_at, "unix")) return -1;
if (date(a.created_at, "unix") < date(b.created_at, "unix")) return 1;
return 0;
});
if(type=="integrated"){
if (type == "integrated") {
timeline.splice(20);
}
var templete="";
Object.keys(timeline).forEach(function(key) {
var pkey=key*1+1;
if(pkey<timeline.length){
if(date(timeline[key].created_at,"unix")!=date(timeline[pkey].created_at,"unix")){
if(type=="integrated"){
templete = templete+parse([timeline[key]], '', acct_id, tlid);
}else if(type=="plus"){
if(timeline[key].account.acct==timeline[key].account.username){
templete = templete+parse([timeline[key]], '', acct_id, tlid);
var templete = "";
if (localStorage.getItem("filter_" + acct_id) != "undefined") {
var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "mix");
} else {
var mute = [];
}
Object.keys(timeline).forEach(function (key) {
var pkey = key * 1 + 1;
if (pkey < timeline.length) {
if (date(timeline[key].created_at, "unix") != date(timeline[pkey].created_at, "unix")) {
if (type == "integrated") {
templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
} else if (type == "plus") {
if (timeline[key].account.acct == timeline[key].account.username) {
templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "plus");
}
}
}
}
}
}
});
$("#timeline_" + tlid).html(templete);
mixre(acct_id, tlid, type);
});
$("#landing_" + tlid).hide();
$("#timeline_" + tlid).html(templete);
mixre(acct_id, tlid, type, mute, delc, voice);
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
todc();
});
});
});
});
}
//Streamingに接続
function mixre(acct_id, tlid, TLtype) {
function mixre(acct_id, tlid, TLtype, mute, delc, voice, mode) {
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var startHome = "wss://" + domain +
var at = localStorage.getItem("acct_" + acct_id + "_at");
if (localStorage.getItem("streaming_" + acct_id)) {
var wss = localStorage.getItem("streaming_" + acct_id)
} else {
var wss = "wss://" + domain
}
var startHome = wss +
"/api/v1/streaming/?stream=user&access_token=" + at;
var startLocal = "wss://" + domain +
var startLocal = wss +
"/api/v1/streaming/?stream=public:local&access_token=" + at;
var wshid = websocketHome.length;
var wslid = websocketLocal.length;
websocketHome[wshid] = new WebSocket(startHome);
websocketLocal[wslid] = new WebSocket(startLocal);
websocketHome[wshid].onopen = function(mess) {
console.log("Connect Streaming API(Home)");
websocketHome[wshid].onopen = function (mess) {
localStorage.setItem("wssH_" + tlid, wshid);
console.table({ "tlid": tlid, "type": "Connect Streaming API(Integrated:Home)", "domain": domain, "message": mess })
$("#notice_icon_" + tlid).removeClass("red-text");
}
websocketLocal[wslid].onopen = function(mess) {
console.log("Connect Streaming API(Local)");
websocketLocal[wslid].onopen = function (mess) {
localStorage.setItem("wssL_" + tlid, wslid);
console.table({ "tlid": tlid, "type": "Connect Streaming API(Integrated:Local)", "domain": domain, "message": mess })
$("#notice_icon_" + tlid).removeClass("red-text");
}
websocketLocal[wslid].onmessage = function(mess) {
console.log("Receive Streaming API:");
websocketLocal[wslid].onmessage = function (mess) {
console.log(["Receive Streaming API:(Integrated:Local)", obj]);
var obj = JSON.parse(JSON.parse(mess.data).payload);
console.log(obj);
var type = JSON.parse(mess.data).event;
if (type == "delete") {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
if (delc == "true") {
$("#timeline_" + tlid + " [toot-id=" + JSON.parse(mess.data).payload + "]").addClass("emphasized");
$("#timeline_" + tlid + " [toot-id=" + JSON.parse(mess.data).payload + "]").addClass("by_delcatch");
} else {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
}
} else if (type == "update") {
var templete = parse([obj], '', acct_id, tlid);
if (!$("[toot-id="+obj.id+"]").length) {
var templete = parse([obj], '', acct_id, tlid, "", mute);
if ($("#timeline_" + tlid + " [toot-id=" + obj.id + "]").length < 1) {
if (voice) {
say(obj.content)
}
var templete = parse([obj], type, acct_id, tlid, "", mute, "mix");
var pool = localStorage.getItem("pool_" + tlid);
if (pool) {
pool = templete + pool;
@@ -111,32 +129,50 @@ function mixre(acct_id, tlid, TLtype) {
pool = templete
}
localStorage.setItem("pool_" + tlid, pool);
scrollck();
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
todc();
}}
}
websocketHome[wshid].onmessage = function(mess) {
console.log("Receive Streaming API:(Home)");
} else {
todo("二重取得発生中");
}
}
}
websocketHome[wshid].onmessage = function (mess) {
console.log(["Receive Streaming API:(Integrated:Home)", obj]);
var obj = JSON.parse(JSON.parse(mess.data).payload);
console.log(obj);
var type = JSON.parse(mess.data).event;
if (type == "delete") {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
if (del > 10) {
reconnector(tlid, type, acct_id, data)
} else {
localStorage.setItem("delete", del * 1 + 1)
}
if (delc == "true") {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").addClass("emphasized");
$("[toot-id=" + JSON.parse(mess.data).payload + "]").addClass("by_delcatch");
} else {
$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
}
} else if (type == "update") {
if(TLtype=="integrated"){
localStorage.removeItem("delete");
if (TLtype == "integrated") {
var templete = parse([obj], '', acct_id, tlid);
}else if(TLtype=="plus"){
if(obj.account.acct==obj.account.username){
var templete = parse([obj], '', acct_id, tlid);
}else{
var templete="";
} else if (TLtype == "plus") {
if (obj.account.acct == obj.account.username) {
var templete = parse([obj], '', acct_id, tlid, "", mute, "mix");
} else {
var templete = "";
}
}
if (!$("[toot-id="+obj.id+"]").length) {
if ($("#timeline_" + tlid + " [toot-id=" + obj.id + "]").length < 1) {
if (voice) {
say(obj.content)
}
var templete = parse([obj], type, acct_id, tlid, "", mute, "mix");
var pool = localStorage.getItem("pool_" + tlid);
if (pool) {
pool = templete + pool;
@@ -144,89 +180,148 @@ function mixre(acct_id, tlid, TLtype) {
pool = templete
}
localStorage.setItem("pool_" + tlid, pool);
scrollck();
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
} else {
todo("二重取得発生中");
}
}
}
websocketLocal[wslid].onerror = function(error) {
console.error('WebSocket Error ' + error);
websocketLocal[wslid].onerror = function (error) {
console.error('WebSocketLocal Error')
console.error(error);
if (mode == "error") {
$("#notice_icon_" + tlid).addClass("red-text");
todo('WebSocket Error ' + error);
} else {
var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
localStorage.setItem("wserror_" + tlid, errorct);
if (errorct < 3) {
reconnector(tlid, TLtype, acct_id, "", "error");
}
}
};
websocketHome[wshid].onerror = function(error) {
console.error('WebSocket Error ' + error);
websocketLocal[wslid].onclose = function () {
console.warn('WebSocketLocal Closing:' + tlid);
if (mode == "error") {
$("#notice_icon_" + tlid).addClass("red-text");
todo('WebSocket Closed');
} else {
var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
localStorage.setItem("wserror_" + tlid, errorct);
if (errorct < 3) {
reconnector(tlid, TLtype, acct_id, "", "error");
}
}
};
websocketHome[wshid].onerror = function (error) {
console.error(['WebSocketHome Error', error])
if (mode == "error") {
$("#notice_icon_" + tlid).addClass("red-text");
todo('WebSocket Error ' + error);
} else {
var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
localStorage.setItem("wserror_" + tlid, errorct);
if (errorct < 3) {
reconnector(tlid, TLtype, acct_id, "", "error");
}
}
};
websocketHome[wshid].onclose = function () {
console.warn('WebSocketHome Closing:' + tlid);
if (mode == "error") {
$("#notice_icon_" + tlid).addClass("red-text");
todo('WebSocket Closed');
} else {
var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
localStorage.setItem("wserror_" + tlid, errorct);
if (errorct < 3) {
reconnector(tlid, TLtype, acct_id, "", "error");
}
}
};
}
//ある程度のスクロールで発火
function mixmore(tlid,type) {
function mixmore(tlid, type) {
var multi = localStorage.getItem("column");
var obj = JSON.parse(multi);
var acct_id = obj[tlid].domain;
moreloading = true;
todo("Integrated TL MoreLoading...(Local)");
var domain = localStorage.getItem("domain_" + acct_id);
var at = localStorage.getItem(domain + "_at");
var sid = $("#timeline_" + tlid + " .cvo").last().attr("toot-id");
var at = localStorage.getItem("acct_" + acct_id + "_at");
var sid = $("#timeline_" + tlid + " .cvo").last().attr("unique-id");
var start = "https://" + domain + "/api/v1/timelines/public?local=true&max_id="+sid;
var start = "https://" + domain + "/api/v1/timelines/public?local=true&max_id=" + sid;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
}).then(function (response) {
return response.json();
}).catch(function(error) {
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function(jsonL) {
var start = "https://" + domain + "/api/v1/timelines/home?max_id="+sid;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function(response) {
return response.json();
}).catch(function(error) {
todo(error);
console.error(error);
}).then(function(jsonH) {
var homearr=[];
var timeline = jsonL.concat(jsonH);
timeline.sort(function(a,b){
if(date(a.created_at,"unix")>date(b.created_at,"unix")) return -1;
if(date(a.created_at,"unix")<date(b.created_at,"unix")) return 1;
return 0;
});
timeline.splice(20);
var templete="";
Object.keys(timeline).forEach(function(key) {
var pkey=key*1+1;
if(pkey<20){
if(date(timeline[key].created_at,"unix")!=date(timeline[pkey].created_at,"unix")){
if(type=="integrated"){
templete = templete+parse([timeline[key]], '', acct_id, tlid);
}else if(type=="plus"){
if(timeline[key].account.acct==timeline[key].account.username){
templete = templete+parse([timeline[key]], '', acct_id, tlid);
}).then(function (jsonL) {
var start = "https://" + domain + "/api/v1/timelines/home?max_id=" + sid;
fetch(start, {
method: 'GET',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + at
},
}).then(function (response) {
return response.json();
}).catch(function (error) {
todo(error);
console.error(error);
}).then(function (jsonH) {
var homearr = [];
var timeline = jsonL.concat(jsonH);
timeline.sort(function (a, b) {
if (date(a.created_at, "unix") > date(b.created_at, "unix")) return -1;
if (date(a.created_at, "unix") < date(b.created_at, "unix")) return 1;
return 0;
});
timeline.splice(20);
var templete = "";
Object.keys(timeline).forEach(function (key) {
var pkey = key * 1 + 1;
if (pkey < 20) {
if (date(timeline[key].created_at, "unix") != date(timeline[pkey].created_at, "unix")) {
if (localStorage.getItem("filter_" + acct_id) != "undefined") {
var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "mix");
} else {
var mute = [];
}
if (type == "integrated") {
templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
} else if (type == "plus") {
if (timeline[key].account.acct == timeline[key].account.username) {
templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
}
}
}
}
}
}
});
$("#timeline_" + tlid).append(templete);
mixre(acct_id, tlid);
});
$("#timeline_" + tlid).append(templete);
additional(acct_id, tlid);
jQuery("time.timeago").timeago();
moreloading = false;
todc();
});
});
});
}

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