Compare commits

..

116 Commits

Author SHA1 Message Date
syuilo
ea60565b0d Update package.json 2019-06-10 21:09:06 +09:00
Acid Chicken (硫酸鶏)
a26585dcc7 Add @rinsuki into collaborators (#4762) 2019-06-10 14:23:39 +09:00
Acid Chicken (硫酸鶏)
008e5bd24c Merge branch 'riamu' into v10 2019-06-10 14:01:51 +09:00
Acid Chicken (硫酸鶏)
ebc6564fbb Update packages 2019-06-10 14:01:36 +09:00
Acid Chicken (硫酸鶏)
06b5078245 Add resolitions 2019-06-10 13:19:04 +09:00
Acid Chicken (硫酸鶏)
68337f95ff Update README.md [AUTOGEN] (#5026) 2019-06-04 18:19:19 +09:00
Acid Chicken (硫酸鶏)
72e148002a Update README.md [AUTOGEN] (#5018) 2019-06-02 10:13:07 +09:00
Acid Chicken (硫酸鶏)
f0a03f71eb Update README.md [AUTOGEN] (#5012) 2019-06-01 20:38:43 +09:00
Acid Chicken (硫酸鶏)
6049473e46 Update README.md [AUTOGEN] (#5004) 2019-05-27 23:44:49 +09:00
Acid Chicken (硫酸鶏)
f9f2787dfc Update README.md [AUTOGEN] (#5002) 2019-05-27 23:15:51 +09:00
MeiMei
b0a068e269 Fix: Firefoxでトークの下が隠れてしまう (#4973) 2019-05-25 09:11:09 +09:00
Acid Chicken (硫酸鶏)
dd5546690a Update README.md [AUTOGEN] (#4939) 2019-05-19 15:08:06 +09:00
MeiMei
d87b6d38ab Update ObjectStorage example (#4919) 2019-05-14 02:53:27 +09:00
MeiMei
4069bb170a Fix meta tags (#4917) 2019-05-14 02:50:53 +09:00
Acid Chicken (硫酸鶏)
600c009549 Update README.md [AUTOGEN] (#4915) 2019-05-13 18:03:24 +09:00
syuilo
c953a28201 10.102.3 2019-05-12 11:40:51 +09:00
Acid Chicken (硫酸鶏)
f6541df42a Update README.md [AUTOGEN] (#4887) 2019-05-09 22:04:15 +09:00
MeiMei
a57e9460c8 Fix: IPv4 onlyホストからDualstackホストにAP deliverできない (#4879) 2019-05-09 15:43:49 +09:00
MeiMei
c7bcf31105 Supports Node.js v12 for Misskey v10 (#4851)
* Update dependencies

* Update diskusage to 1.1.1

* Fix: Node v12 で TS error がでる
2019-05-04 13:53:16 +09:00
MeiMei
a397c040fe エクスポートファイルでは同一ハッシュチェックをしないように (#4841) 2019-05-03 18:34:45 +09:00
MeiMei
e311d73ffc Fix: user menu (#4845)
* Fix: Firefoxで自分のメニューが開けないなど

* 自分のユーザーメニューにはミュートなどを表示しないようになど
2019-05-03 18:34:22 +09:00
MeiMei
2a3599a14d Fix: mention (あなた宛て) streaming にミュートが効かない (#4822) 2019-04-30 15:37:10 +09:00
MeiMei
b85dc8a658 Fix: エクスポートリクエストに失敗してもエラーが出ない (#4821) 2019-04-30 15:01:29 +09:00
syuilo
7513123052 Update package.json 2019-04-30 07:13:37 +09:00
MeiMei
2526b86ec5 Fix: Mastodon v2.8.0 のフォローリストがインポートできない (#4817) 2019-04-30 05:54:36 +09:00
MeiMei
e45aa0532c Noteが間接参照されたときはstreaming等にpublishしない (#4796) 2019-04-25 04:08:03 +09:00
mei23
71fc84e224 Use meid7 for Note 2019-04-24 02:52:48 +09:00
MeiMei
6b726eea39 リファクタリング syuilo#4587 (#4766) 2019-04-22 03:22:19 +09:00
syuilo
acd4b101e1 10.102.1 2019-04-22 00:51:57 +09:00
MeiMei
98b8a94f2b Fix: リモートユーザーの修復処理が自動的に実行されない for v10 (#4763)
* Fix: ユーザーresyncが自動実行されない

* ここにあっても意味がない

* lastFetchedAt事前更新はWebFingerする前のみ

* lint fix
2019-04-21 23:56:56 +09:00
MeiMei
7d31bd97ff Validate Note on createNote for v10 (#4757)
* Validate Note on createNote

* Add extractApHost
2019-04-21 02:41:12 +09:00
MeiMei
828a2a73c9 Fix 投稿増殖 for v10 (#4758)
* Fix #4632

* remove unused import
2019-04-21 02:38:02 +09:00
syuilo
bdc7167cf4 10.102.0 2019-04-19 01:39:39 +09:00
MeiMei
45b94086ed サイレンス, ブロック, ミュートの確認表示 for v10 (#4744)
* confirm on user menu

* confirm silence

* Resolve #4554
2019-04-18 04:34:47 +09:00
MeiMei
e62bb7cdaf Update dependencies (#4739) 2019-04-18 03:30:01 +09:00
MeiMei
c5f65d9eeb アンケートウィジットでもMFMを使用するように v10 (#4740)
* MFM in poll

* use mfm
2019-04-18 03:15:00 +09:00
かひわし4(バージョン1)
4557856104 Doc: Update setup documents for 10.x (#4676)
* Doc: Update setup documents

Use GitHub api to checkout latest release instead of "git tag" command
which cannot accurately determine prerelease tag.
Also, Changed numbered list format because
the shell command is too long to fit on one line.

 Conflicts:
	docs/docker.en.md
	docs/docker.fr.md
	docs/docker.ja.md
	docs/setup.en.md
	docs/setup.fr.md
	docs/setup.ja.md

* Doc: Checkout 10.x tag only

Update "checkout latest release" command.
Checkout latest tag but 10.x tag only.

* Doc: Restore MongoDB

* Use tab instead of spaces
2019-04-16 13:09:31 +09:00
MeiMei
4a23c36740 Backport #4674 (#4708) 2019-04-16 02:05:16 +09:00
syuilo
2553b20130 10.101.0 2019-04-15 12:44:11 +09:00
MeiMei
6982faf668 Fix: ObjectStrage利用時にドライブファイルアイコンが表示されない (#4677) 2019-04-14 17:19:25 +09:00
MeiMei
4db972318f インスタンスブロックチェック時のhostのnormalizeを統一 (#4669) 2019-04-12 20:54:50 +09:00
MeiMei
81006566a5 Fix: Punycodeなインスタンスが重複登録される (#4667) 2019-04-12 20:03:00 +09:00
MeiMei
6abc053a48 Fix: AP actor Service のサポートが不完全 (#4661) 2019-04-11 02:46:29 +09:00
Acid Chicken (硫酸鶏)
155da0c6a3 Avoid roma-ji naming 2019-04-10 20:30:00 +09:00
MeiMei
03a3c56a54 WebFingerリクエストで Proxy, Keep-Alive などをサポート (#4658)
* no webfinger.js

* Fix: エラーメッセージがくどい
2019-04-10 12:28:59 +09:00
syuilo
83b7010d6a 10.100.0 2019-04-09 21:13:52 +09:00
syuilo
71654cbe47 Fix #4636 2019-04-09 21:11:05 +09:00
syuilo
e8f96e848a Merge branch 'v10' of https://github.com/syuilo/misskey into v10 2019-04-09 21:10:36 +09:00
syuilo
251abf21d4 Update .gitignore 2019-04-09 21:10:18 +09:00
MeiMei
d103427932 Fix non media thumbnails (#4380) 2019-04-09 21:07:46 +09:00
MeiMei
592cdfa910 ユーザーリストでフォローボタンを表示するように (#4654) 2019-04-08 20:18:42 +09:00
MeiMei
f2ad1a0406 Fix: 投稿ウィジットでローカルのみの公開範囲で投稿できない (#4653) 2019-04-08 20:16:00 +09:00
MeiMei
82af9320c0 Fix: TLを遡った時に抜けがある時がある (v10) (#4629)
* Update the cursor when the timeline is updated

* fix releaseQueue
2019-04-08 15:18:44 +09:00
MeiMei
fceebf7388 Fix #4562 (#4563) 2019-04-08 15:17:39 +09:00
Acid Chicken (硫酸鶏)
13caf37991 Update README.md [AUTOGEN] (#4639) 2019-04-06 12:47:02 +09:00
syuilo
b71a602107 10.99.0 2019-04-06 00:58:45 +09:00
syuilo
e6ce0dd43a New Crowdin translations (#4521)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Spanish)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations ja-JP.yml (Dutch)

* New translations ja-JP.yml (Norwegian)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (English)
2019-04-06 00:51:54 +09:00
tamaina
094a5214f1 Re: fix drive file preview: Fix #4532, Fix #4577 (#4590)
* 🎨 Re: fix drive file preview

* clean

* fix

* fix
2019-04-06 00:51:31 +09:00
tamaina
0932fcd114 fix #4532 (#4592) 2019-04-06 00:50:35 +09:00
syuilo
f26643cea3 Update dependencies 🚀 2019-04-06 00:48:05 +09:00
MeiMei
63b1689155 Fix #4556 (#4558) 2019-04-06 00:41:08 +09:00
MeiMei
59dc929431 フォローインポートで自分をスキップするように (#4614)
* skip myself in import-following

* skip owner in publishToFollowers
2019-04-06 00:07:23 +09:00
Acid Chicken (硫酸鶏)
deaadc33db Update README.md [AUTOGEN] (#4634) 2019-04-05 18:45:20 +09:00
syuilo
0ba92a4f29 設定でポートが指定されていない場合、環境変数を参照するように 2019-04-05 18:21:08 +09:00
syuilo
7dc5009ec7 Create Procfile 2019-04-05 18:17:30 +09:00
syuilo
0ee827afd3 Update 01_bug-report.md 2019-04-05 01:14:25 +09:00
syuilo
551d1b7f86 Metaに投稿やユーザーのIDを設定するように 2019-04-04 02:22:50 +09:00
Acid Chicken (硫酸鶏)
7ed1b695f5 Update README.md [AUTOGEN] (#4631) 2019-04-04 00:50:33 +09:00
Acid Chicken (硫酸鶏)
7ad31b9b33 Update README.md [AUTOGEN] (#4627) 2019-04-03 12:48:51 +09:00
Acid Chicken (硫酸鶏)
edd8992f7f Update README.md [AUTOGEN] (#4626) 2019-04-02 03:59:54 +09:00
Acid Chicken (硫酸鶏)
96fe42cfcb Update README.md [AUTOGEN] (#4624) 2019-04-02 00:25:14 +09:00
Acid Chicken (硫酸鶏)
c3872b4a38 Fix bug
FYI: https://developer.mozilla.org/ja/docs/Web/CSS/@charset
2019-04-01 21:23:16 +09:00
MeiMei
762945113d Fix #4586 (#4621)
* Fix #4586

* Revert "Fix #4586"

This reverts commit e3e600d3c8.

* note-headerにnarrow
2019-04-01 11:04:11 +09:00
syuilo
037e9230fc Update reset.styl 2019-04-01 02:28:32 +09:00
MeiMei
3f59ebf986 manifest.json にインスタンス名を反映させるように (#4619) 2019-04-01 01:05:49 +09:00
MeiMei
e51e1d2b09 Fix: ServiceWorkerの設定がUIで有効にならない (#4620) 2019-04-01 01:04:55 +09:00
MeiMei
26cc49eb69 ユーザーリストの user.description を single line 扱いで表示するように (#4604) 2019-03-31 21:32:09 +09:00
syuilo
7987bb491c 🎨 2019-03-29 22:05:51 +09:00
MeiMei
16b7ac5a87 Fix #4593 (#4594) 2019-03-29 18:35:47 +09:00
MeiMei
5932cb8609 Fix: View source on GitHub (#4584) 2019-03-27 03:10:56 +09:00
MeiMei
dfe694d39f Fix #4581 (#4583) 2019-03-27 02:58:42 +09:00
syuilo
278624f2c8 10.98.3 2019-03-26 22:26:12 +09:00
Acid Chicken (硫酸鶏)
899f42c070 Update reaction-lib.ts (#4580) 2019-03-26 22:24:46 +09:00
Acid Chicken (硫酸鶏)
8ce1d4d6a3 Fix #4576 (#4579)
* Update update.ts

* Update api.ts
2019-03-26 22:24:14 +09:00
tamaina
52225d703b Fix drive file preview Fix #4532 (#4577)
* fix #4532

* fix
2019-03-26 22:23:17 +09:00
MeiMei
81739af7cb Fix: リアクションのカスタム絵文字の情報がNoteに添付されない (#4574) 2019-03-26 22:22:39 +09:00
Acid Chicken (硫酸鶏)
25473222cc Follow lint 2019-03-26 21:52:58 +09:00
syuilo
0b7be70935 10.98.2 2019-03-25 23:36:30 +09:00
MeiMei
818b71abd6 fix Content-Disposition (#4573) 2019-03-25 03:12:08 +09:00
syuilo
25575e8510 10.98.1 2019-03-24 13:03:22 +09:00
Acid Chicken (硫酸鶏)
6c85adcf23 Fix typo 2019-03-23 13:50:10 +09:00
syuilo
5dc92d7a40 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-03-22 19:07:29 +09:00
syuilo
4e2b966b80 Fix #4559
Close #4564
2019-03-22 19:07:13 +09:00
Acid Chicken (硫酸鶏)
d34f8c3cb9 Update README.md [AUTOGEN] (#4566) 2019-03-22 19:01:29 +09:00
Zero King
9049ecb1cf Add name of series in instance count chart (#4565) 2019-03-22 14:57:09 +09:00
MeiMei
7bebea087c Fix #4546 (#4548)
* Refactor download

* emoji type
2019-03-21 04:50:44 +09:00
MeiMei
1c79e30436 Fix NoteReaction (#4547) 2019-03-20 21:39:02 +09:00
tamaina
1d7933349b Fix #4538 (#4539)
* fix #4538

* clean up

* fix

* fix
2019-03-19 23:35:22 +09:00
syuilo
d002f67140 10.98.0 2019-03-19 18:50:09 +09:00
syuilo
da3447765b Revert "Remove deepcopy dependency"
This reverts commit cbf5663179.
2019-03-19 18:47:14 +09:00
syuilo
cbf5663179 Remove deepcopy dependency 2019-03-19 17:59:44 +09:00
syuilo
b217fba235 Fix #4531 2019-03-19 17:47:40 +09:00
tamaina
7f7e6d5aba 「メッセージ」「トーク」「ダイレクト投稿」( Fix #2748 ) (#4515)
* 「メッセージ」「トーク」「ダイレクト投稿」
トーク: 一対一のチャット機能・画面
メッセージ: トークでやり取りする発言
ダイレクト投稿: 自分向けのダイレクト投稿が一覧されるTL

* Fix display of messaging

* ✌️

* Update ja-JP.yml
2019-03-19 17:45:46 +09:00
tamaina
87c5a9d9a6 Fix #97, Fix #2943 (#4533) 2019-03-19 17:35:50 +09:00
tamaina
8ca1fe3f0a Resolve #1465 (#4532)
* [client] show drive file icon

* 🎨

* exchange icon

* fix

* fuck crlf

* 背景差し戻し

* fix selected color

* 🎨

* fix

* pointer-events none

* fix bug

* ✌️

* Clean up

* ✌️

* Clean up

* Fix
2019-03-19 17:26:07 +09:00
MeiMei
763ae8f1a6 Change Twemoji CDN (#4527) 2019-03-18 22:02:45 +09:00
MeiMei
c65256d02b Fix custom emoji validation (#4528) 2019-03-18 20:02:25 +09:00
syuilo
bd2ac515d1 🎨 2019-03-18 17:37:29 +09:00
MeiMei
681f372889 proxy cropper url (#4525) 2019-03-18 16:41:29 +09:00
MeiMei
c2eec272e6 Content-Disposition in ObjectStrage (#4524)
* Content-Disposition in ObjectStrage

* encode filename
2019-03-18 15:23:45 +09:00
syuilo
bd720491a9 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-03-18 13:30:13 +09:00
syuilo
a408226509 Refactor 2019-03-18 13:29:58 +09:00
syuilo
c015e99e6e Update black.json5 2019-03-18 13:25:56 +09:00
tamaina
de47a17be7 Improve drive downloading (#4523)
* Improve drive file downloading

* fix name

* wtf crlf

* semicolon
2019-03-18 13:20:49 +09:00
syuilo
d38fc490ad 10.97.2 2019-03-18 02:22:28 +09:00
syuilo
662167e792 Remove unused import 2019-03-18 02:21:29 +09:00
166 changed files with 1810 additions and 1163 deletions

View File

@@ -53,40 +53,54 @@ mongodb:
drive:
storage: 'db'
# OR
# OR
# storage: 'minio'
# bucket:
# prefix:
# config:
# endPoint:
# port:
# useSSL:
# accessKey:
# secretKey:
#drive:
# storage: 'minio'
# bucket:
# prefix:
# config:
# endPoint:
# port:
# useSSL:
# accessKey:
# secretKey:
# S3 example
# storage: 'minio'
# bucket: bucket-name
# prefix: files
# config:
# endPoint: s3-us-west-2.amazonaws.com
# region: us-west-2
# useSSL: true
# accessKey: XXX
# secretKey: YYY
# S3/GCS example
#
# * Replace <endpoint> to
# S3: see https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
# GCS: use 'storage.googleapis.com'
#
# * Replace <region> to
# S3: see https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
# GCS: not needed (just delete the region line)
#
#drive:
# storage: 'minio'
# bucket: bucket-name
# prefix: files
# baseUrl: https://bucket-name.<endpoint>
# config:
# endPoint: <endpoint>
# region: <region>
# useSSL: true
# accessKey: XXX
# secretKey: YYY
# S3 example (with CDN, custom domain)
# storage: 'minio'
# bucket: drive.example.com
# prefix: files
# baseUrl: https://drive.example.com
# config:
# endPoint: s3-us-west-2.amazonaws.com
# region: us-west-2
# useSSL: true
# accessKey: XXX
# secretKey: YYY
# S3/GCS example (with CDN, custom domain)
#
#drive:
# storage: 'minio'
# bucket: drive.example.com
# prefix: files
# baseUrl: https://drive.example.com
# config:
# endPoint: <endpoint>
# region: <region>
# useSSL: true
# accessKey: XXX
# secretKey: YYY
# If enabled:
# The first account created is automatically marked as Admin.
@@ -113,3 +127,6 @@ autoAdmin: true
# Clustering
#clusterLimit: 1
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4

4
.github/CODEOWNERS vendored
View File

@@ -1,7 +1,7 @@
# PATH OWNERS
/.autogen/ @acid-chicken
/.circleci/ @syuilo @acid-chicken
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki
# /.config/mongo_initdb_example.js @khws4v1
/.github/ @syuilo @AyaMorisawa @acid-chicken
/.vscode/ @acid-chicken
@@ -12,7 +12,7 @@
# /docs/*.fr.md @BoFFire
# /docs/docker.*.md @khws4v1
/locales/ @syuilo
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken @rinsuki
# /src/crypto_key.cc @akihikodaki
# /src/crypto_key.d.ts @akihikodaki
/.dockerignore @syuilo # @khws4v1

View File

@@ -7,24 +7,24 @@ assignees: ''
---
## Summary
## 💡 Summary
<!-- Tell us what the bug is -->
## Expected Behavior
## 🙂 Expected Behavior
<!--- Tell us what should happen -->
## Actual Behavior
## ☹️ Actual Behavior
<!--- Tell us what happens instead of the expected behavior -->
## Steps to Reproduce
## 📝 Steps to Reproduce
1.
2.
3.
## Environment
## 📌 Environment
<!-- Tell us where on the platform it happens -->

1
.gitignore vendored
View File

@@ -19,3 +19,4 @@ api-docs.json
*.code-workspace
yarn.lock
.DS_Store
/files

View File

@@ -5,6 +5,71 @@ If you encounter any problems with updating, please try the following:
1. `npm run clean` or `npm run cleanall`
2. Retry update (Don't forget `npm i`)
10.102.1
----------
* 投稿が増殖する問題を修正
* リモートユーザーの修復処理が自動的に実行されない問題を修正
10.101.0
----------
* WebFingerリクエストで Proxy, Keep-Alive などをサポート
* AP actor Service のサポートが不完全な問題を修正
* Punycodeなインスタンスが重複登録される問題を修正
* ObjectStrage利用時にドライブファイルアイコンが表示されない問題を修正
10.100.0
----------
* ユーザーリストでフォローボタンを表示するように
* ドライブのファイルのサムネイルを修正
* 投稿ウィジットでローカルのみの公開範囲で投稿できない問題を修正
* TLを遡った時に抜けがある時がある問題を修正
* ユーザータイムラインが投稿日時順ではなくなっているのを修正
* 10.99.0 でチャートのレンダリングがおかしい問題を修正
10.99.0
----------
* manifest.json にインスタンス名を反映させるように
* Metaに投稿やユーザーのIDを設定するように
* 設定でポートが指定されていない場合、環境変数を参照するように
* フォローインポートで途中にエラーになるユーザーがいると途中で終了してしまう問題を修正
* フォローインポートで自分が含まれていた場合自分をフォローしてしまう問題を修正
* ServiceWorkerの設定がUIで有効にならない問題を修正
* ユーザー一覧でのユーザーの自己紹介が複数行になることがある問題を修正
* フォローインポートでAPI limitに達していても正常にリクエストされたように表示されてしまう問題を修正
* DBに保存されたrepository urlを変更する方法がない問題を修正
* デスクトップDeckだとviaが投稿内に2箇所表示される問題を修正
* デザインの調整
* 依存関係の更新
* ローカリゼーション
10.98.3
----------
* リアクションのカスタム絵文字の情報がNoteに添付されない問題を修正
* フォルダーの移動をするとき親フォルダーに自分自身を指定できてしまう問題を修正
* デザインの調整
10.98.2
----------
* 他のインスタンスから添付画像が見れない問題を修正
10.98.1
----------
* ドライブのファイルのサムネイルが表示されない問題を修正
* APでカスタム絵文字を送る時に常にimage/pngで送っている問題を修正
* いくらいじってもページリロードするとmisskeyのテーマがdark(future)になっちゃう問題を修正
10.98.0
----------
* ドライブのファイルダウンロード時に元のファイル名を尊重するように
* ドライブで画像以外のファイルを分かりやすく表示するように
* TwemojiのCDNを変更
* モバイルで通知の設定がない問題を修正
* デザインの調整
10.97.2
----------
* ビルド時に警告が出ないように修正
10.97.1
----------
* デザインの調整

1
Procfile Normal file
View File

@@ -0,0 +1 @@
web: NODE_ENV=production npm start

View File

@@ -88,12 +88,14 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><img src="https://avatars0.githubusercontent.com/u/10798641?s=460&v=4" alt="AyaMorisawa" width="100"></td>
<td><img src="https://avatars1.githubusercontent.com/u/30769358?s=460&v=4" alt="mei23" width="100"></td>
<td><img src="https://avatars2.githubusercontent.com/u/20679825?s=460&v=4" alt="acid-chicken" width="100"></td>
<td><img src="https://avatars2.githubusercontent.com/u/6533808?s=460&v=4" alt="rinsuki" width="100"></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/syuilo">@syuilo</a></td>
<td align="center"><a href="https://github.com/AyaMorisawa">@AyaMorisawa</a></td>
<td align="center"><a href="https://github.com/mei23">@mei23</a></td>
<td align="center"><a href="https://github.com/acid-chicken">@acid-chicken</a></td>
<td align="center"><a href="https://github.com/rinsuki">@rinsuki</a></td>
</tr>
</table>
@@ -101,60 +103,83 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
----------------------------------------------------------------
<!-- PATREON_START -->
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/12059069" alt="naga_rus" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4?token-time=2145916800&token-hash=vZdDTTF-ahiKBjjgppS2ev4rkD8H7TTKkXXoxsucs6Y%3D" alt="Melilot" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5888816/36da0f7c15954df0ab13f9abdf227f66/1.jpeg?token-time=2145916800&token-hash=at8QpJXJ8C0zINY_NmoMKv-MhXVoUK-YzTgaJPJzJYU%3D" alt="Hiroshi Seki" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/3.png?token-time=2145916800&token-hash=oH_i7gJjNT7Ot6j9JiVwy7ZJIBqACVnzLqlz4YrDAZA%3D" alt="weepjp" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19045173/cb91c0f345c24d4ebfd05f19906d5e26/1.png?token-time=2145916800&token-hash=o_zKBytJs_AxHwSYw_5R8eD0eSJe3RoTR3kR3Q0syN0%3D" alt="kiritan" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/776209" alt="Denshi" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/557245" alt="mkatze" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13099460/43cecdbaa63a40d79bf50a96b9910b9d/1.jpe?token-time=2145916800&token-hash=bqwLTk0Wo0hUJJ8J5y7ii05bLzz-_CDA7Bo0Mp4RFU0%3D" alt="ne_moni" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/4.jpe?token-time=2145916800&token-hash=zEyJqVM7u9d8Ri-65fJYSJcWF1jBH1nJ5a3taRzrTmw%3D" alt="Melilot" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5670915/ee175f0bfb6347ffa4ea101a8c097bff/1.jpg?token-time=2145916800&token-hash=mPLM9CA-riFHx-myr3bLZJuH2xBRHA9se5VbHhLIOuA%3D" alt="osapon" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
<td><a href="https://www.patreon.com/user?u=12059069">naga_rus</a></td>
<td><a href="https://www.patreon.com/rane_hs">Hiroshi Seki</a></td>
<td><a href="https://www.patreon.com/weepjp">weepjp</a></td>
<td><a href="https://www.patreon.com/user?u=19045173">kiritan</a></td>
<td><a href="https://www.patreon.com/user?u=776209">Denshi</a></td>
<td><a href="https://www.patreon.com/user?u=557245">mkatze</a></td>
<td><a href="https://www.patreon.com/user?u=13099460">ne_moni</a></td>
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/osapon">osapon</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1?token-time=2145916800&token-hash=0xgcpqvFDqRcV_YIEhcPNVH7gs9sLg_BBnTJXCkN4ao%3D" alt="mydarkstar" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18899730/6a22797f68254034a854d69ea2445fc8/1.png?token-time=2145916800&token-hash=b_uj57yxo5VzkSOUS7oXE_762dyOTB_oxzbO6lFNG3k%3D" alt="YuzuRyo61" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1.png?token-time=2145916800&token-hash=FMV7cPKBD1TU2WTbl1jg6AcdKSvTb2BSFcDhgc-EO8w%3D" alt="gutfuckllc" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/11357794/923ce94cd8c44ba788ee931907881839/1.png?token-time=2145916800&token-hash=9nEQje_eMvUjq9a7L3uBqW-MQbS-rRMaMgd7UYVoFNM%3D" alt="mydarkstar" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/12718187" alt="Peter G." width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1?token-time=2145916800&token-hash=2PsbFNw0tnubZzgSXD01R6hIgncfiElG7H7HX2Y3dyo%3D" alt="nemu" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13039004/509d0c412eb14ae08d6a812a3054f7d6/1.jpe?token-time=2145916800&token-hash=UQRWf01TwHDV4Cls1K0YAOAjM29ssif7hLVq0ESQ0hs%3D" alt="nemu" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17866454" alt="sikyosyounin" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3.png?token-time=2145916800&token-hash=KjfQL8nf3AIf6WqzLshBYAyX44piAqOAZiYXgZS_H6A%3D" alt="YUKIMOCHI" width="100"></td>
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1?token-time=2145916800&token-hash=95p8VdGX45E8BitZR_eOcDlqCjumjzNLBPQJrJdeCpI%3D" alt="takimura" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/935a10339daa4ede8e555903a0707060/1?token-time=2145916800&token-hash=3CrpqH-XtKs_NoIlSsTyVs8wCzP1WFCsG2xwps1IJq0%3D" alt="Atsuko Tominaga" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/19356899/496b4681d33b4520bd7688e0fd19c04d/2.jpeg?token-time=2145916800&token-hash=_sTj3dUBOhn9qwiJ7F19Qd-yWWfUqJC_0jG1h0agEqQ%3D" alt="sheeta.s" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
<td><a href="https://www.patreon.com/Yuzulia">YuzuRyo61</a></td>
<td><a href="https://www.patreon.com/gutfuckllc">gutfuckllc</a></td>
<td><a href="https://www.patreon.com/mydarkstar">mydarkstar</a></td>
<td><a href="https://www.patreon.com/user?u=12718187">Peter G.</a></td>
<td><a href="https://www.patreon.com/user?u=13039004">nemu</a></td>
<td><a href="https://www.patreon.com/user?u=17866454">sikyosyounin</a></td>
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
<td><a href="https://www.patreon.com/user?u=19356899">sheeta.s</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13737140/1adf7835017d479280d90fe8d30aade2/1.png?token-time=2145916800&token-hash=0pdle8h5pDZrww0BDOjdz6zO-HudeGTh36a3qi1biVU%3D" alt="Satsuki Yanagi" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17880724/311738c8a48f4a6b9443c2445a75adde/1.jpe?token-time=2145916800&token-hash=CPxGQhKIlEaa6WUcgbyHixyKEhakiw9RFdOhsIJBQ_o%3D" alt="takimura" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4.jpe?token-time=2145916800&token-hash=UslrPVM-8TXOe8AapuNiaFYjcIJgPNcU-fKpGbfGJNI%3D" alt="Damillora" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/16900731/83884b38afc74d4cbe83c30a13b10edd/1.png?token-time=2145916800&token-hash=R5Tog8RWg0rguRoCIoir3lThokrdPvs8Utfikhc0nhY%3D" alt="Atsuko Tominaga" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3.png?token-time=2145916800&token-hash=FTm3WVom4dJ9NwWMU4OpCL_8Yc13WiwEbKrDPyTZTPs%3D" alt="natalie" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1.jpe?token-time=2145916800&token-hash=EWxXhVbZYH7KB4IDT3joc8TbIg8zPO40x1r5IDn3R7c%3D" alt="Hiratake" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5923936/2a743cbfbff946c2af3f09026047c0da/2.png?token-time=2145916800&token-hash=h6yphW1qnM0n_NOWaf8qtszMRLXEwIxfk5beu4RxdT0%3D" alt="noellabo" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/2384390/5681180e1efb46a8b28e0e8d4c8b9037/1.jpg?token-time=2145916800&token-hash=SJcMy-Q1BcS940-LFUVOMfR7-5SgrzsEQGhYb3yowFk%3D" alt="CG" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1.jpe?token-time=2145916800&token-hash=qA8j97lIZNc-74AuZ0p4F3ms6sKPeKjtNt2vEuwpsyo%3D" alt="Hekovic" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/10789744/97175095d8f04c0f86225ff47cb98d40/1.jpeg?token-time=2145916800&token-hash=l4AoMR7Nj7K4yAHrkrk2hAoggPkbSPm12m1nmbe9Pb8%3D" alt="Naoki Hirayama" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=13737140">Satsuki Yanagi</a></td>
<td><a href="https://www.patreon.com/takimura">takimura</a></td>
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
<td><a href="https://www.patreon.com/user?u=16900731">Atsuko Tominaga</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/3?token-time=2145916800&token-hash=-iJszBqgYBhsM5qMdA1knf9wvprhEfESzKfR2oh7mIA%3D" alt="natalie" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/18072312/98e894d960314fa7bc236a72a39488fe/1?token-time=2145916800&token-hash=D6QK3fPyqiYKJfOzc-QqaSSairUrWdjld-ewp2waj6s%3D" alt="Hekovic" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=Ksk_2l3gjPDbnzMUOCSW1E-hdPJsNs2tSR4_RAakRK8%3D" alt="dansup" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=CXe9AqlZy9AsYfiWd3OBYVOzvODoN47Litz0Tu4BFpU%3D" alt="Gargron" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1?token-time=2145916800&token-hash=xhR1n6NAAyEb-IUXLD6_dshkFa3mefU5ZZuk1L8qKTs%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1?token-time=2145916800&token-hash=uR-48MQ0A4j0irQSrCAQZJ-sJUSs_Fkihlg3-l59b7c%3D" alt="Takashi Shibuya" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
<td><a href="https://www.patreon.com/noellabo">noellabo</a></td>
<td><a href="https://www.patreon.com/Corset">CG</a></td>
<td><a href="https://www.patreon.com/hekovic">Hekovic</a></td>
<td><a href="https://www.patreon.com/spinlock">Naoki Hirayama</a></td>
</tr></table>
<table><tr>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1.jpeg?token-time=2145916800&token-hash=L55UhJ0rcuNAH3w_ryeeGN4hC6taoOixyAhraEi0bzw%3D" alt="dansup" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1.jpeg?token-time=2145916800&token-hash=d8jBQLMOHD87KtXs5C9fk1o58DMF73pQ-dYH3uZJPBE%3D" alt="Gargron" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5731881/4b6038e6cda34c04b83a5fcce3806a93/1.png?token-time=2145916800&token-hash=hBayGfOmQH3kRMdNnDe4oCZD_9fsJWSt29xXR3KRMVk%3D" alt="Nokotaro Takeda" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12531784/93a45137841849329ba692da92ac7c60/1.jpeg?token-time=2145916800&token-hash=vGe7wXGqmA8Q7m-kDNb6fyGdwk-Dxk4F-ut8ZZu51RM%3D" alt="Takashi Shibuya" width="100"></td>
</tr><tr>
<td><a href="https://www.patreon.com/dansup">dansup</a></td>
<td><a href="https://www.patreon.com/mastodon">Gargron</a></td>
<td><a href="https://www.patreon.com/takenoko">Nokotaro Takeda</a></td>
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Tue, 12 Mar 2019 00:50:06 UTC
**Last updated:** Mon, 03 Jun 2019 17:28:09 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright

View File

@@ -9,9 +9,23 @@ This guide describes how to install and setup Misskey with Docker.
*1.* Download Misskey
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone Misskey repository's master branch.
2. `cd misskey` Move to misskey directory.
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
1. Clone Misskey repository's master branch.
`git clone -b master git://github.com/syuilo/misskey.git`
2. Move to misskey directory.
`cd misskey`
3. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag.
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
*2.* Configure Misskey
----------------------------------------------------------------
@@ -39,7 +53,15 @@ Just `docker-compose up -d`. GLHF!
### How to update your Misskey server to the latest version
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3.
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
4. `git stash pop`
5. `docker-compose build`
6. Check [ChangeLog](../CHANGELOG.md) for migration information

View File

@@ -10,9 +10,23 @@ Ce guide explique comment installer et configurer Misskey avec Docker.
*1.* Télécharger Misskey
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` Clone le dépôt de Misskey sur la branche master.
2. `cd misskey` Naviguez dans le dossier du dépôt.
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
1. Clone le dépôt de Misskey sur la branche master.
`git clone -b master git://github.com/syuilo/misskey.git`
2. Naviguez dans le dossier du dépôt.
`cd misskey`
3. Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest).
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
*2.* Configuration de Misskey
----------------------------------------------------------------
@@ -40,7 +54,15 @@ Utilisez la commande `docker-compose up -d`. GLHF!
### How to update your Misskey server to the latest version
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3.
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
4. `git stash pop`
5. `docker-compose build`
6. Consultez le [ChangeLog](../CHANGELOG.md) pour avoir les éventuelles informations de migration
@@ -52,14 +74,28 @@ Utilisez la commande `docker-compose up -d`. GLHF!
### Configuration d'ElasticSearch (pour la fonction de recherche)
*1.* Préparation de l'environnement
----------------------------------------------------------------
1. `mkdir elasticsearch && chown 1000:1000 elasticsearch` Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
2. `sysctl -w vm.max_map_count=262144` Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
1. Permet de créer le dossier d'accueil de la base ElasticSearch aves les bons droits
`mkdir elasticsearch && chown 1000:1000 elasticsearch`
2. Augmente la valeur max du paramètre map_count du système (valeur minimum pour pouvoir lancer ES)
`sysctl -w vm.max_map_count=262144`
*2.* Après lancement du docker-compose, initialisation de la base ElasticSearch
----------------------------------------------------------------
1. `docker-compose -it web /bin/sh` Connexion dans le conteneur web
2. `apk add curl` Ajout du paquet curl
3. `curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'` Création de la base ES
1. Connexion dans le conteneur web
`docker-compose -it web /bin/sh`
2. Ajout du paquet curl
`apk add curl`
3. Création de la base ES
`curl -X PUT "es:9200/misskey" -H 'Content-Type: application/json' -d'{ "settings" : { "index" : { } }}'`
4. `exit`
----------------------------------------------------------------

View File

@@ -9,9 +9,23 @@ Dockerを使ったMisskey構築方法
*1.* Misskeyのダウンロード
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
2. `cd misskey` misskeyディレクトリに移動
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
1. masterブランチからMisskeyレポジトリをクローン
`git clone -b master git://github.com/syuilo/misskey.git`
2. misskeyディレクトリに移動
`cd misskey`
3. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
*2.* 設定ファイルを作成する
----------------------------------------------------------------
@@ -39,7 +53,15 @@ Dockerを使ったMisskey構築方法
### Misskeyを最新バージョンにアップデートする方法:
1. `git fetch`
2. `git stash`
3. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3.
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
4. `git stash pop`
5. `docker-compose build`
6. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する

View File

@@ -41,15 +41,38 @@ As root:
*4.* Install Misskey
----------------------------------------------------------------
1. `su - misskey` Connect to misskey user.
2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch.
3. `cd misskey` Navigate to misskey directory
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
5. `npm install` Install misskey dependencies.
1. Connect to misskey user.
`su - misskey`
2. Clone the misskey repo from master branch.
`git clone -b master git://github.com/syuilo/misskey.git`
3. Navigate to misskey directory
`cd misskey`
4. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
5. Install misskey dependencies.
`npm install`
*5.* Configure Misskey
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
1. Copy the `.config/example.yml` and rename it to `default.yml`.
`cp .config/example.yml .config/default.yml`
2. Edit `default.yml`
*6.* Build Misskey
@@ -77,37 +100,53 @@ Just `NODE_ENV=production npm start`. GLHF!
### Launch with systemd
1. Create a systemd service here: `/etc/systemd/system/misskey.service`
1. Create a systemd service here
`/etc/systemd/system/misskey.service`
2. Edit it, and paste this and save:
```
[Unit]
Description=Misskey daemon
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service.
4. `systemctl start misskey` Start the misskey service.
3. Reload systemd and enable the misskey service.
`systemctl daemon-reload ; systemctl enable misskey`
4. Start the misskey service.
`systemctl start misskey`
You can check if the service is running with `systemctl status misskey`.
### How to update your Misskey server to the latest version
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
2.  
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
3. `npm install`
4. `NODE_ENV=production npm run build`
5. Check [ChangeLog](../CHANGELOG.md) for migration information

View File

@@ -41,15 +41,38 @@ En root :
*4.* Installation de Misskey
----------------------------------------------------------------
1. `su - misskey` Basculez vers l'utilisateur misskey.
2. `git clone -b master git://github.com/syuilo/misskey.git` Clonez la branche master du dépôt misskey.
3. `cd misskey` Accédez au dossier misskey.
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
5. `npm install` Installez les dépendances de misskey.
1. Basculez vers l'utilisateur misskey.
`su - misskey`
2. Clonez la branche master du dépôt misskey.
`git clone -b master git://github.com/syuilo/misskey.git`
3. Accédez au dossier misskey.
`cd misskey`
4. Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest)
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
5. Installez les dépendances de misskey.
`npm install`
*5.* Création du fichier de configuration
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
1. Copiez le fichier `.config/example.yml` et renommez-le`default.yml`.
`cp .config/example.yml .config/default.yml`
2. Editez le fichier `default.yml`
*6.* Construction de Misskey
@@ -77,37 +100,53 @@ Lancez tout simplement `NODE_ENV=production npm start`. Bonne chance et amusez-v
### Démarrage avec systemd
1. Créez un service systemd sur : `/etc/systemd/system/misskey.service`
1. Créez un service systemd sur
`/etc/systemd/system/misskey.service`
2. Editez-le puis copiez et coller ceci dans le fichier :
```
[Unit]
Description=Misskey daemon
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` Redémarre systemd et active le service misskey.
4. `systemctl start misskey` Démarre le service misskey.
3. Redémarre systemd et active le service misskey.
`systemctl daemon-reload ; systemctl enable misskey`
4. Démarre le service misskey.
`systemctl start misskey`
Vous pouvez vérifier si le service a démarré en utilisant la commande `systemctl status misskey`.
### Méthode de mise à jour vers la plus récente version de Misskey
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
2.  
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
3. `npm install`
4. `NODE_ENV=production npm run build`
5. Consultez [ChangeLog](../CHANGELOG.md) pour les information de migration.

View File

@@ -48,15 +48,38 @@ adduser --disabled-password --disabled-login misskey
*4.* Misskeyのインストール
----------------------------------------------------------------
1. `su - misskey` misskeyユーザーを使用
2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
3. `cd misskey` misskeyディレクトリに移動
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
5. `npm install` Misskeyの依存パッケージをインストール
1. misskeyユーザーを使用
`su - misskey`
2. masterブランチからMisskeyレポジトリをクローン
`git clone -b master git://github.com/syuilo/misskey.git`
3. misskeyディレクトリに移動
`cd misskey`
4. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
5. Misskeyの依存パッケージをインストール
`npm install`
*5.* 設定ファイルを作成する
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
1. `.config/example.yml`をコピーし名前を`default.yml`にする。
`cp .config/example.yml .config/default.yml`
2. `default.yml` を編集する。
*6.* Misskeyのビルド
@@ -82,38 +105,56 @@ Debianをお使いであれば、`build-essential`パッケージをインスト
`NODE_ENV=production npm start`するだけです。GLHF!
### systemdを用いた起動
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
1. systemdサービスのファイルを作成
`/etc/systemd/system/misskey.service`
2. エディタで開き、以下のコードを貼り付けて保存:
```
[Unit]
Description=Misskey daemon
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
4. `systemctl start misskey` misskeyサービスの起動
CentOSで1024以下のポートを使用してMisskeyを使用する場合は`ExecStart=/usr/bin/sudo /usr/bin/npm start`に変更する必要があります。
3. systemdを再読み込みしmisskeyサービスを有効化
`systemctl daemon-reload ; systemctl enable misskey`
4. misskeyサービスの起動
`systemctl start misskey`
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
### Misskeyを最新バージョンにアップデートする方法:
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
2.  
```bash
git tag | grep '^10\.' | sort -V --reverse | \
while read tag_name; do \
if ! curl -s "https://api.github.com/repos/syuilo/misskey/releases/tags/$tag_name" \
| grep -qE '"(draft|prerelease)": true'; \
then git checkout $tag_name; break; fi ; done
```
3. `npm install`
4. `NODE_ENV=production npm run build`
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する

View File

@@ -131,7 +131,7 @@ common:
other: "Ostatní"
appearance: "Vzhled"
behavior: "Chování"
fetch-on-scroll: "Nekonečné rolování"
fetch-on-scroll: "Nekonečné načítaní posuvem"
fetch-on-scroll-desc: "Pokud budete rolovat dolů po stránce, automaticky bude načten další obsah."
note-visibility: "Viditelnost příspěvku"
default-note-visibility: "Výchozí viditelnost příspěvku"
@@ -436,17 +436,23 @@ common/views/components/user-menu.vue:
push-to-list: "Přidat do seznamu"
select-list: "Vyberte seznam"
report-abuse-reported: "Problém byl nahlášen administrátorovi. Děkujeme za Vaší kooperaci."
silence: "Ztlumit"
suspend: "Zmrazit"
common/views/components/poll.vue:
vote-count: "{} hlasů"
vote: "Hlasovat"
show-result: "Podívat se na výsledky"
voted: "Už jste hlasovaly"
closed: "Ukončeno"
remaining-days: "zbývá {d} dnů, {h} hodin"
remaining-hours: "zbývá {h} hodin, a {m} minut"
remaining-minutes: "zbývá {m} minut, a {s} sekund"
remaining-seconds: "zbývá {s} sekund"
common/views/components/poll-editor.vue:
no-only-one-choice: "Musíte vybrat alespoň dvě možnosti"
destroy: "Zahodit dotazník"
infinite: "Nekonečne"
at: "Výběr data a času"
day: "Ne"
common/views/components/emoji-picker.vue:
custom-emoji: "Emoji"
@@ -603,6 +609,8 @@ common/views/widgets/memo.vue:
save: "Uložit"
common/views/widgets/slideshow.vue:
no-image: "V této složce nebyly nalezeny žádné fotky."
common/views/pages/not-found.vue:
page-not-found: "Stránka nenalezena"
desktop:
banner: "Baner"
avatar-crop-title: "Vyberte část, která se zobrazí jako avatar"
@@ -687,10 +695,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Zrušit"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Zprávy:"
desktop/views/components/messaging-window.vue:
title: "Zprávy"
desktop/views/components/note-detail.vue:
private: "Tento příspěvek je soukromý"
deleted: "Tento příspěvek byl odstraněn"
@@ -796,7 +800,6 @@ desktop/views/components/timeline.vue:
local: "Lokální"
global: "Globální"
mentions: "Zmínění"
messages: "Zprávy"
list: "Seznamy"
hashtag: "Hashtag"
add-list: "Přidat do seznamu"
@@ -1057,8 +1060,6 @@ desktop/views/pages/user/user.header.vue:
posts: "Poznámky"
month: "Po"
day: "Ne"
desktop/views/widgets/messaging.vue:
title: "Zprávy"
desktop/views/widgets/notifications.vue:
title: "Oznámení"
desktop/views/widgets/polls.vue:
@@ -1139,7 +1140,6 @@ mobile/views/pages/home.vue:
local: "Lokální"
global: "Globální"
mentions: "Zmínění"
messages: "Zprávy"
mobile/views/pages/tag.vue:
no-posts-found: "Nebyly nalezeny žádné příspěvky s \"{q}\"."
mobile/views/pages/widgets.vue:

View File

@@ -445,10 +445,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Abbrechen"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Nachrichten:"
desktop/views/components/messaging-window.vue:
title: "Nachrichten"
desktop/views/components/note-detail.vue:
private: "Dieser Post ist privat"
deleted: "Dieser Beitrag wurde entfernt"
@@ -534,7 +530,6 @@ desktop/views/components/timeline.vue:
home: "Home"
local: "Lokal"
global: "Global"
messages: "Nachrichten"
list: "Listen"
desktop/views/components/ui.header.account.vue:
profile: "Dein Profil"
@@ -600,8 +595,6 @@ desktop/views/pages/user/user.photos.vue:
desktop/views/pages/user/user.header.vue:
month: "Mo"
day: "So"
desktop/views/widgets/messaging.vue:
title: "Nachrichten"
desktop/views/widgets/notifications.vue:
title: "Benachrichtigungen"
desktop/views/widgets/polls.vue:
@@ -647,7 +640,6 @@ mobile/views/pages/home.vue:
home: "Home"
local: "Lokal"
global: "Global"
messages: "Nachrichten"
mobile/views/pages/widgets.vue:
add-widget: "Hinzufügen"
customization-tips: "Anpassung-Tipps"

View File

@@ -224,7 +224,7 @@ common:
delete: "Delete"
loading: "Loading"
ok: "Confirm"
cancel: "Exit"
cancel: "Cancel"
update-available-title: "Update available"
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
@@ -483,8 +483,8 @@ common/views/components/user-menu.vue:
report-abuse: "Report abuse"
report-abuse-detail: "What kind of nuisance did you encounter?"
report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
silence: "Mute"
unsilence: "Unmute"
silence: "Silence"
unsilence: "Unsilence"
suspend: "Suspend"
unsuspend: "Unsuspend"
common/views/components/poll.vue:
@@ -839,10 +839,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Cancel"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Messages:"
desktop/views/components/messaging-window.vue:
title: "Messaging"
desktop/views/components/note-detail.vue:
private: "Post is private"
deleted: "Post has been removed"
@@ -881,7 +877,6 @@ desktop/views/components/post-form.vue:
posting: "Posting"
attach-media-from-local: "Attach media from your device"
attach-media-from-drive: "Attach media from your Drive"
attach-cancel: "Cancel attachment"
insert-a-kao: "v('ω')v"
create-poll: "Create a poll"
text-remain: "{} characters remaining"
@@ -974,6 +969,10 @@ common/views/components/password-settings.vue:
not-match: "The new passwords do not match"
changed: "Password changed"
failed: "Failed to change password"
common/views/components/post-form-attaches.vue:
attach-cancel: "Remove Attachment"
mark-as-sensitive: "Mark as 'sensitive'"
unmark-as-sensitive: "Unmark as 'sensitive'"
desktop/views/components/sub-note-content.vue:
private: "This post is private"
deleted: "This post has been deleted"
@@ -992,7 +991,7 @@ desktop/views/components/timeline.vue:
hybrid: "Social"
global: "Global"
mentions: "Mentions"
messages: "Messages"
messages: "Direct posts"
list: "Lists"
hashtag: "Hashtag"
add-tag-timeline: "Add hashtag cloud"
@@ -1114,6 +1113,7 @@ admin/views/instance.vue:
disable-global-timeline: "Disable global timeline"
disabling-timelines-info: "Even if you disable these timelines, the administrator as well as moderators can use them continually."
enable-emoji-reaction: "Enable pictograms for reactions"
use-star-for-reaction-fallback: "Use the star as fallback for unknown reaction"
invite: "Invite"
save: "Save"
saved: "Saved"
@@ -1202,8 +1202,8 @@ admin/views/users.vue:
unsuspend: "Unsuspend"
unsuspend-confirm: "Are you sure you want to unsuspend this account?"
unsuspended: "The user has successfully unsuspended."
make-silence: "Mute"
unmake-silence: "Unmute"
make-silence: "Silence"
unmake-silence: "Unsilence"
verify: "Verify account"
verify-confirm: "Do you want this to be a verified account?"
verified: "The account is now being verified"
@@ -1388,8 +1388,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Posts and replies"
with-media: "Media"
my-posts: "My posts"
desktop/views/widgets/messaging.vue:
title: "Messaging"
desktop/views/widgets/notifications.vue:
title: "Notifications"
desktop/views/widgets/polls.vue:
@@ -1511,7 +1509,7 @@ mobile/views/pages/home.vue:
hybrid: "Social"
global: "Global"
mentions: "Mentions"
messages: "Messages"
messages: "Direct posts"
mobile/views/pages/tag.vue:
no-posts-found: "No posts contains \"{q}\" found."
mobile/views/pages/widgets.vue:

View File

@@ -595,10 +595,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Cancelar"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Mensajes:"
desktop/views/components/messaging-window.vue:
title: "Mensajes"
desktop/views/components/note-detail.vue:
private: "Esta publicación es privada"
deleted: "Esta publicación ha sido removida"
@@ -714,7 +710,6 @@ desktop/views/components/timeline.vue:
local: "Local"
hybrid: "Social"
global: "Global"
messages: "Mensajes"
list: "Listas"
hashtag: "Hashtags"
list-name: "Nombre de lista"
@@ -841,8 +836,6 @@ desktop/views/pages/user/user.photos.vue:
desktop/views/pages/user/user.header.vue:
month: "lunes"
day: "domingo"
desktop/views/widgets/messaging.vue:
title: "Mensajes"
desktop/views/widgets/notifications.vue:
title: "Notificaciones"
desktop/views/widgets/polls.vue:
@@ -907,7 +900,6 @@ mobile/views/pages/home.vue:
local: "Local"
hybrid: "Social"
global: "Global"
messages: "Mensajes"
mobile/views/pages/widgets.vue:
dashboard: "Panel de control"
add-widget: "Agregar"

View File

@@ -29,6 +29,10 @@ common:
2fa: "Authentification à deux facteurs"
customize-home: "Personnaliser la disposition de votre accueil"
featured-notes: "Les notes mises en avant"
dark-mode: "Mode nuit"
signin: "Se connecter"
signup: "S'enregistrer"
signout: "Se déconnecter"
got-it: "Jai compris !"
customization-tips:
title: "Conseils de personnalisation"
@@ -111,17 +115,54 @@ common:
d: "Désirez-vous publier quelques mots ?"
e: "Écrivez ici"
f: "En attente de vos écrits"
settings: "Paramètres"
_settings:
profile: "Votre profil"
notification: "Notifications"
apps: "Applications"
tags: "Hashtags"
blocking: "En cours blocage"
security: "Sécurité"
signin: "Historique des connexions"
password: "Mot de passe"
other: "Avancé"
appearance: "Apparence"
behavior: "Comportement"
fetch-on-scroll: "Chargement automatique lors du défilement"
note-visibility: "Visibilité de la publication"
default-note-visibility: "Visibilité par défaut"
remember-note-visibility: "Se souvenir du mode de visibilité de la publication"
web-search-engine: "Moteur de recherche Web"
web-search-engine-desc: "Exemple: https://www.google.com/?#q={{query}}"
show-via: "Afficher via"
reduce-motion: "Réduire les animations dans linterface utilisateur"
this-setting-is-this-device-only: "Uniquement sur cet appareil"
use-os-default-emojis: "Utiliser les émojis standards du système"
line-width: "Epaisseur du trait"
line-width-thin: "Fine"
line-width-normal: "Normale"
line-width-thick: "Épaisse"
font-size: "Taille du texte"
font-size-medium: "Normale"
font-size-x-large: "Large"
deck-column-align-center: "Centrer"
deck-column-align-left: "À gauche"
deck-column-align-flexible: "Flexible"
deck-column-width: "Largeur des colonnes du Deck"
deck-column-width-normal: "Normale"
timeline: "Fil dactualité"
navbar-position-top: "en haut"
navbar-position-left: "À gauche"
navbar-position-right: "à droite"
post-style-standard: "Standard"
post-style-smart: "Intelligent"
notification-position: "Afficher les notifications"
notification-position-bottom: "en bas"
notification-position-top: "en haut"
search: "Recherche"
delete: "Supprimer"
loading: "Chargement en cours…"
cancel: "Quitter"
update-available-title: "Mise à jour disponible"
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre jeton vient dêtre généré, vous allez maintenant être déconnecté."
@@ -392,6 +433,10 @@ common/views/components/poll-editor.vue:
remove: "Supprimer ce choix"
add: "+ Ajouter un choix"
destroy: "Annuler ce sondage"
interval: "Durée"
unit: "Unité"
second: "secondes"
minute: "Minutes"
day: "D"
common/views/components/reaction-picker.vue:
choose-reaction: "Choisissez votre réaction"
@@ -710,10 +755,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Annuler"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Messages :"
desktop/views/components/messaging-window.vue:
title: "Messagerie"
desktop/views/components/note-detail.vue:
private: "cette publication est privée"
deleted: "cette publication a été supprimée"
@@ -863,7 +904,7 @@ desktop/views/components/timeline.vue:
hybrid: "Social"
global: "Global"
mentions: "Mentions"
messages: "Messages"
messages: "Messages directs"
list: "Listes"
hashtag: "Hashtag"
add-tag-timeline: "Ajouter un fil de hashtags"
@@ -927,6 +968,7 @@ admin/views/dashboard.vue:
this-instance: "Cette instance"
federated: "Fédérées"
admin/views/queue.vue:
title: "File d'attente"
remove-all-jobs: "Enlever toutes les tâches en attente"
admin/views/abuse.vue:
title: "Abus"
@@ -1243,8 +1285,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Publications et réponses"
with-media: "Média"
my-posts: "Mes Messages"
desktop/views/widgets/messaging.vue:
title: "Messagerie"
desktop/views/widgets/notifications.vue:
title: "Notifications"
desktop/views/widgets/polls.vue:
@@ -1365,7 +1405,7 @@ mobile/views/pages/home.vue:
hybrid: "Social"
global: "Global"
mentions: "Mentions"
messages: "Messages"
messages: "Messages directs"
mobile/views/pages/tag.vue:
no-posts-found: "Aucune publication ayant pour hashtag « {q} » na été trouvée."
mobile/views/pages/widgets.vue:

View File

@@ -513,8 +513,12 @@ common/views/components/user-menu.vue:
mention: "メンション"
mute: "ミュート"
unmute: "ミュート解除"
mute-confirm: "このユーザーをミュートしますか?"
unmute-confirm: "このユーザーをミュート解除しますか?"
block: "ブロック"
unblock: "ブロック解除"
block-confirm: "このユーザーをブロックしますか?"
unblock-confirm: "このユーザーをブロック解除しますか?"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
report-abuse: "スパムを報告"
@@ -522,8 +526,12 @@ common/views/components/user-menu.vue:
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
silence: "サイレンス"
unsilence: "サイレンス解除"
silence-confirm: "このユーザーをサイレンスしますか?"
unsilence-confirm: "このユーザーをサイレンス解除しますか?"
suspend: "凍結"
unsuspend: "凍結解除"
suspend-confirm: "このユーザーを凍結しますか?"
unsuspend-confirm: "このユーザーを凍結解除しますか?"
common/views/components/poll.vue:
vote-to: "「{}」に投票する"
@@ -925,12 +933,6 @@ desktop/views/input-dialog.vue:
cancel: "キャンセル"
ok: "決定"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/note-detail.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -973,7 +975,6 @@ desktop/views/components/post-form.vue:
posting: "投稿中"
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
@@ -1079,6 +1080,11 @@ common/views/components/password-settings.vue:
changed: "パスワードを変更しました"
failed: "パスワード変更に失敗しました"
common/views/components/post-form-attaches.vue:
attach-cancel: "添付取り消し"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
desktop/views/components/sub-note-content.vue:
private: "この投稿は非公開です"
deleted: "この投稿は削除されました"
@@ -1100,7 +1106,7 @@ desktop/views/components/timeline.vue:
hybrid: "ソーシャル"
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
messages: "ダイレクト投稿"
list: "リスト"
hashtag: "ハッシュタグ"
add-tag-timeline: "ハッシュタグを追加"
@@ -1332,7 +1338,9 @@ admin/views/users.vue:
unsuspend-confirm: "凍結を解除しますか?"
unsuspended: "凍結を解除しました"
make-silence: "サイレンス"
silence-confirm: "サイレンスしますか?"
unmake-silence: "サイレンスの解除"
unsilence-confirm: "サイレンスを解除しますか?"
verify: "公式アカウントにする"
verify-confirm: "公式アカウントにしますか?"
verified: "公式アカウントにしました"
@@ -1535,9 +1543,6 @@ desktop/views/pages/user/user.timeline.vue:
with-media: "メディア"
my-posts: "私の投稿"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
@@ -1685,7 +1690,7 @@ mobile/views/pages/home.vue:
hybrid: "ソーシャル"
global: "グローバル"
mentions: "あなた宛て"
messages: "メッセージ"
messages: "ダイレクト投稿"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"

View File

@@ -652,10 +652,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "やめとくわ"
ok: "これや!"
desktop/views/components/messaging-room-window.vue:
title: "メッセージ:"
desktop/views/components/messaging-window.vue:
title: "メッセージ"
desktop/views/components/note-detail.vue:
private: "この投稿は見せられへんわ"
deleted: "この投稿なんか無くなってもうたわ"
@@ -799,7 +795,7 @@ desktop/views/components/timeline.vue:
hybrid: "ソーシャル"
global: "グローバル"
mentions: "あんた宛て"
messages: "メッセージ"
messages: "ダイレクト投稿"
list: "リスト"
hashtag: "ハッシュタグ"
add-tag-timeline: "ハッシュタグ増やす"
@@ -1061,8 +1057,6 @@ desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"
with-media: "メディア"
desktop/views/widgets/messaging.vue:
title: "メッセージ"
desktop/views/widgets/notifications.vue:
title: "通知"
desktop/views/widgets/polls.vue:
@@ -1183,7 +1177,7 @@ mobile/views/pages/home.vue:
hybrid: "ソーシャル"
global: "グローバル"
mentions: "あんた宛て"
messages: "メッセージ"
messages: "ダイレクト投稿"
mobile/views/pages/tag.vue:
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿はあらへんかった。"
mobile/views/pages/widgets.vue:

View File

@@ -7,7 +7,7 @@ common:
about: "Misskey를 찾아주셔서 감사합니다. Misskey는 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse(다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
intro:
title: "Misskey란?"
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 반응, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
about: "Misskey는 오픈소스 <b>분산형 마이크로블로그 SNS</b>입니다. 다양하고 폭넓게 커스터마이징할 수 있는 UI, 글에 대한 리액션, 파일을 관리할 수 있는 드라이브 등의 선진적인 기능을 갖추고 있습니다. 더하여 Fediverse라고 부르는 네트워크에 연결할 수 있어 다른 SNS와도 주고받을 수 있습니다. 예를 들자면, 당신이 무언가를 게시하면, 해당 게시물은 Misskey 뿐만 아니라 다른 SNS에도 전해집니다. 살짝 어떤 행성에서 다른 행성으로 전파를 발신하고 있는 모습을 상상해주세요."
features: "특징"
rich-contents: "글"
rich-contents-desc: "자신의 생각, 화제의 사건, 모두와 공유하고 싶은 것을 올려주세요. 필요한 경우 다양한 스타일을 사용하여 글을 장식하거나 마음에 드는 이미지, 영상 등의 파일이나 투표를 올리는 것도 가능합니다."
@@ -520,7 +520,7 @@ common/views/components/poll-editor.vue:
hour: "시간"
day: "일"
common/views/components/reaction-picker.vue:
choose-reaction: "반응 선택"
choose-reaction: "리액션 선택"
common/views/components/emoji-picker.vue:
custom-emoji: "커스텀 이모지"
people: "사람들"
@@ -839,10 +839,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "취소"
ok: "확인"
desktop/views/components/messaging-room-window.vue:
title: "메시지:"
desktop/views/components/messaging-window.vue:
title: "메시지"
desktop/views/components/note-detail.vue:
private: "이 글은 비공개입니다"
deleted: "이 글은 삭제되었습니다"
@@ -992,7 +988,7 @@ desktop/views/components/timeline.vue:
hybrid: "소셜"
global: "글로벌"
mentions: "받은 멘션"
messages: "메시지"
messages: "다이렉트 게시글"
list: "리스트"
hashtag: "해시태그"
add-tag-timeline: "해시태그 추가"
@@ -1113,6 +1109,8 @@ admin/views/instance.vue:
disable-local-timeline: "로컬 타임라인 비활성화"
disable-global-timeline: "글로벌 타임라인 비활성화"
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
enable-emoji-reaction: "리액션에 이모지를 사용할 수 있게 함"
use-star-for-reaction-fallback: "알 수 없는 리액션을 star로 대체하여 사용"
invite: "초대"
save: "저장"
saved: "저장하였습니다"
@@ -1387,8 +1385,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "글과 답글"
with-media: "미디어"
my-posts: "내 글"
desktop/views/widgets/messaging.vue:
title: "메시지"
desktop/views/widgets/notifications.vue:
title: "알림"
desktop/views/widgets/polls.vue:
@@ -1510,7 +1506,7 @@ mobile/views/pages/home.vue:
hybrid: "소셜"
global: "글로벌"
mentions: "받은 멘션"
messages: "메시지"
messages: "다이렉트 게시글"
mobile/views/pages/tag.vue:
no-posts-found: "해시태그 \"{q}\"가 붙은 글을 찾을 수 없습니다."
mobile/views/pages/widgets.vue:

View File

@@ -307,10 +307,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Annuleren"
ok: "Oké"
desktop/views/components/messaging-room-window.vue:
title: "Berichten:"
desktop/views/components/messaging-window.vue:
title: "Gesprekken"
desktop/views/components/note-detail.vue:
private: "(dit bericht is privé)"
location: "Locatie"
@@ -394,7 +390,6 @@ desktop/views/components/timeline.vue:
home: "Startpagina"
local: "Lokaal"
global: "Algemeen"
messages: "Gesprekken"
list: "Lijsten"
desktop/views/components/ui.header.account.vue:
profile: "Je profiel"
@@ -497,8 +492,6 @@ desktop/views/pages/user/user.timeline.vue:
default: "Berichten"
with-replies: "Berichten en antwoorden"
with-media: "Media"
desktop/views/widgets/messaging.vue:
title: "Gesprekken"
desktop/views/widgets/notifications.vue:
title: "Meldingen"
desktop/views/widgets/polls.vue:
@@ -571,7 +564,6 @@ mobile/views/pages/home.vue:
home: "Startpagina"
local: "Lokaal"
global: "Algemeen"
messages: "Gesprekken"
mobile/views/pages/widgets.vue:
add-widget: "Toevoegen"
mobile/views/pages/widgets/activity.vue:

View File

@@ -244,8 +244,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Avbryt"
ok: "Ok"
desktop/views/components/messaging-window.vue:
title: "Samtaler"
desktop/views/components/note-detail.vue:
location: "Lokasjon"
desktop/views/components/note.vue:
@@ -290,7 +288,6 @@ desktop/views/components/timeline.vue:
home: "Hjem"
local: "Lokalt"
global: "Globalt"
messages: "Samtaler"
list: "Lister"
list-name: "Liste navn"
desktop/views/components/ui.header.vue:
@@ -394,8 +391,6 @@ desktop/views/pages/user/user.timeline.vue:
default: "Innlegg"
with-replies: "Innlegg og svar"
with-media: "Media"
desktop/views/widgets/messaging.vue:
title: "Melding"
desktop/views/widgets/notifications.vue:
title: "Notifikasjon"
desktop/views/widgets/polls.vue:
@@ -456,7 +451,6 @@ mobile/views/pages/home.vue:
home: "Hjem"
local: "Lokalt"
global: "Globalt"
messages: "Samtaler"
mobile/views/pages/widgets.vue:
add-widget: "Legg til"
mobile/views/pages/received-follow-requests.vue:

View File

@@ -146,9 +146,11 @@ common:
choose-wallpaper: "Wybierz tapetę"
timeline: "Oś czasu"
sound: "Dźwięk"
volume: "Głośność"
test: "Test"
update: "Aktualizacja Misskey"
version: "Wersja:"
do-update: "Sprawdź dostępność nowych aktualizacji"
navbar-position-left: "Z lewej"
search: "Szukaj"
delete: "Usuń"
@@ -677,10 +679,6 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "Anuluj"
ok: "OK"
desktop/views/components/messaging-room-window.vue:
title: "Wiadomości:"
desktop/views/components/messaging-window.vue:
title: "Wiadomości"
desktop/views/components/note-detail.vue:
private: "ten wpis jest prywatny"
deleted: "ten wpis został usunięty"
@@ -815,7 +813,7 @@ desktop/views/components/timeline.vue:
hybrid: "Społeczność"
global: "Globalne"
mentions: "Wspomnienia"
messages: "Wiadomości"
messages: "Bezpośrednie wpisy"
list: "Listy"
hashtag: "Hashtag"
add-tag-timeline: "Dodaj hashtag"
@@ -1009,8 +1007,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "Wpisy i odpowiedzi"
with-media: "Multimedia"
my-posts: "Moje wpisy"
desktop/views/widgets/messaging.vue:
title: "Wiadomości"
desktop/views/widgets/notifications.vue:
title: "Powiadomienia"
desktop/views/widgets/polls.vue:
@@ -1126,7 +1122,7 @@ mobile/views/pages/home.vue:
hybrid: "Społeczność"
global: "Globalne"
mentions: "Wspomnienia"
messages: "Wiadomości"
messages: "Bezpośrednie wpisy"
mobile/views/pages/widgets.vue:
dashboard: "Kokpit"
add-widget: "Dodaj"

View File

@@ -577,7 +577,7 @@ common/views/components/notification-settings.vue:
mark-as-read-all-unread-notes: "将所有帖子标为已读"
mark-as-read-all-talk-messages: "将所有对话标为已读"
auto-watch: "自动查看帖子"
auto-watch-desc: "自动接收有关您做出应或回复的帖子的通知。"
auto-watch-desc: "自动接收有关您做出应或回复的帖子的通知。"
common/views/components/integration-settings.vue:
title: "服务合作"
connect: "连接"
@@ -839,22 +839,18 @@ desktop/views/components/home.vue:
desktop/views/input-dialog.vue:
cancel: "取消"
ok: "确定"
desktop/views/components/messaging-room-window.vue:
title: "信息:"
desktop/views/components/messaging-window.vue:
title: "正在聊天"
desktop/views/components/note-detail.vue:
private: "私密投稿"
deleted: "投稿已删除"
location: "位置信息"
renote: "转发"
add-reaction: "添加一个反应"
undo-reaction: "取消应"
add-reaction: "应"
undo-reaction: "取消应"
desktop/views/components/note.vue:
reply: "回复"
renote: "Renote"
add-reaction: "添加一个反应"
undo-reaction: "取消应"
add-reaction: "应"
undo-reaction: "取消应"
detail: "详细信息"
private: "这个投稿是私密的"
deleted: "投稿已删除"
@@ -992,7 +988,7 @@ desktop/views/components/timeline.vue:
hybrid: "社交"
global: "全球"
mentions: "提到的"
messages: "信息"
messages: "直接发布"
list: "列表"
hashtag: "标签"
add-tag-timeline: "添加标签"
@@ -1113,6 +1109,8 @@ admin/views/instance.vue:
disable-local-timeline: "停用本地时间线功能"
disable-global-timeline: "禁用全局时间线"
disabling-timelines-info: "即使禁用时间线,管理员和版主仍然可用。"
enable-emoji-reaction: "在回应上使用表情符号"
use-star-for-reaction-fallback: "使用默认的star来表示未知的回应"
invite: "邀请"
save: "保存"
saved: "保存完毕"
@@ -1387,8 +1385,6 @@ desktop/views/pages/user/user.timeline.vue:
with-replies: "帖子与回复"
with-media: "媒体"
my-posts: "我的帖子"
desktop/views/widgets/messaging.vue:
title: "信息"
desktop/views/widgets/notifications.vue:
title: "通知"
desktop/views/widgets/polls.vue:
@@ -1452,7 +1448,7 @@ mobile/views/components/note.vue:
location: "位置信息"
mobile/views/components/note-detail.vue:
reply: "回复"
reaction: "应"
reaction: "应"
private: "这个帖子是私密的"
deleted: "帖子已删除"
location: "位置信息"
@@ -1510,7 +1506,7 @@ mobile/views/pages/home.vue:
hybrid: "Social"
global: "Global"
mentions: "Mentions"
messages: "信息"
messages: "直接发布"
mobile/views/pages/tag.vue:
no-posts-found: "没有找到带有主题标签“{q}”的帖子"
mobile/views/pages/widgets.vue:
@@ -1639,7 +1635,7 @@ dev/views/new-app.vue:
account-read: "查看账户信息"
account-write: "修改账户信息"
note-write: "投稿。"
reaction-write: "添加或删除应。"
reaction-write: "添加或删除应。"
following-write: "关注和不关注"
drive-read: "查看网盘"
drive-write: "管理网盘文件。"

View File

@@ -1,7 +1,7 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.97.1",
"version": "10.102.4",
"codename": "nighthike",
"repository": {
"type": "git",
@@ -22,24 +22,27 @@
"test": "gulp test",
"format": "gulp format"
},
"resolutions": {
"gulp-cssnano/cssnano/postcss-svgo/svgo/js-yaml": "^3.13.1",
"video-thumbnail-generator/lodash": "^4.17.11"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "1.2.15",
"@fortawesome/free-brands-svg-icons": "5.7.2",
"@fortawesome/free-regular-svg-icons": "5.7.2",
"@fortawesome/free-solid-svg-icons": "5.7.2",
"@fortawesome/vue-fontawesome": "0.1.5",
"@fortawesome/fontawesome-svg-core": "1.2.19",
"@fortawesome/free-brands-svg-icons": "5.9.0",
"@fortawesome/free-regular-svg-icons": "5.9.0",
"@fortawesome/free-solid-svg-icons": "5.9.0",
"@fortawesome/vue-fontawesome": "0.1.6",
"@koa/cors": "2.2.3",
"@prezzemolo/rap": "0.1.2",
"@prezzemolo/zip": "0.0.3",
"@types/bcryptjs": "2.4.2",
"@types/bull": "3.5.8",
"@types/bull": "3.5.14",
"@types/chai-http": "3.0.5",
"@types/dateformat": "3.0.0",
"@types/deep-equal": "1.0.1",
"@types/double-ended-queue": "2.1.0",
"@types/elasticsearch": "5.0.30",
"@types/file-type": "10.6.0",
"@types/gulp": "4.0.5",
"@types/elasticsearch": "5.0.34",
"@types/gulp": "4.0.6",
"@types/gulp-mocha": "0.0.32",
"@types/gulp-rename": "0.0.33",
"@types/gulp-replace": "0.0.31",
@@ -47,84 +50,86 @@
"@types/gulp-util": "3.0.34",
"@types/is-root": "1.0.0",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.12.0",
"@types/js-yaml": "3.12.1",
"@types/jsdom": "12.2.3",
"@types/katex": "0.10.1",
"@types/koa": "2.0.48",
"@types/koa-bodyparser": "5.0.2",
"@types/koa-compress": "2.0.8",
"@types/koa-compress": "2.0.9",
"@types/koa-cors": "0.0.0",
"@types/koa-favicon": "2.0.19",
"@types/koa-logger": "3.1.1",
"@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.40",
"@types/koa-send": "4.1.1",
"@types/koa-send": "4.1.2",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.3",
"@types/minio": "7.0.1",
"@types/minio": "7.0.2",
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.5",
"@types/mongodb": "3.1.20",
"@types/mocha": "5.2.7",
"@types/mongodb": "3.1.28",
"@types/node": "11.10.4",
"@types/nodemailer": "4.6.6",
"@types/nprogress": "0.0.29",
"@types/nodemailer": "6.2.0",
"@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1",
"@types/parse5": "5.0.0",
"@types/parsimmon": "1.10.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
"@types/qrcode": "1.3.0",
"@types/qrcode": "1.3.3",
"@types/ratelimiter": "2.1.28",
"@types/redis": "2.8.10",
"@types/redis": "2.8.13",
"@types/rename": "1.0.1",
"@types/request": "2.48.1",
"@types/request-promise-native": "1.0.15",
"@types/request-promise-native": "1.0.16",
"@types/request-stats": "3.0.0",
"@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27",
"@types/sharp": "0.21.2",
"@types/seedrandom": "2.4.28",
"@types/sharp": "0.22.2",
"@types/showdown": "1.9.2",
"@types/speakeasy": "2.0.4",
"@types/systeminformation": "3.23.1",
"@types/tinycolor2": "1.4.1",
"@types/tmp": "0.0.33",
"@types/tinycolor2": "1.4.2",
"@types/tmp": "0.1.0",
"@types/uuid": "3.4.4",
"@types/web-push": "3.3.0",
"@types/webpack": "4.4.24",
"@types/webpack": "4.4.32",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.40",
"@types/ws": "6.0.1",
"animejs": "3.0.1",
"apexcharts": "3.6.2",
"apexcharts": "3.8.0",
"autobind-decorator": "2.4.0",
"autosize": "4.0.2",
"autwh": "0.1.0",
"bcryptjs": "2.4.3",
"bootstrap-vue": "2.0.0-rc.13",
"bull": "3.7.0",
"cafy": "15.1.0",
"bootstrap-vue": "2.0.0-rc.22",
"bull": "3.10.0",
"cafy": "15.1.1",
"chai": "4.2.0",
"chai-http": "4.2.1",
"chai-http": "4.3.0",
"chalk": "2.4.2",
"commander": "2.19.0",
"commander": "2.20.0",
"content-disposition": "0.5.3",
"crc-32": "1.2.0",
"css-loader": "2.1.1",
"cssnano": "4.1.10",
"dateformat": "3.0.3",
"deep-equal": "1.0.1",
"deepcopy": "0.6.3",
"diskusage": "1.0.0",
"diskusage": "1.1.1",
"double-ended-queue": "2.1.0-0",
"elasticsearch": "15.4.1",
"emojilib": "2.4.0",
"escape-regexp": "0.0.1",
"eslint": "5.15.1",
"eslint": "5.16.0",
"eslint-plugin-vue": "5.2.2",
"eventemitter3": "3.1.0",
"eventemitter3": "3.1.2",
"feed": "2.0.4",
"file-type": "10.9.0",
"file-type": "10.10.0",
"fuckadblock": "3.2.1",
"gulp": "4.0.0",
"gulp": "4.0.2",
"gulp-cssnano": "2.1.3",
"gulp-imagemin": "5.0.3",
"gulp-mocha": "6.0.0",
@@ -133,20 +138,20 @@
"gulp-sourcemaps": "2.6.5",
"gulp-stylus": "2.7.0",
"gulp-tslint": "8.1.4",
"gulp-typescript": "5.0.0",
"gulp-typescript": "5.0.1",
"gulp-uglify": "3.0.2",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.13.1",
"html-minifier": "3.5.21",
"html-minifier": "4.0.0",
"http-signature": "1.2.0",
"insert-text-at-cursor": "0.1.2",
"is-root": "2.0.0",
"is-svg": "4.0.0",
"js-yaml": "3.12.2",
"jsdom": "14.0.0",
"insert-text-at-cursor": "0.2.0",
"is-root": "2.1.0",
"is-svg": "4.2.0",
"js-yaml": "3.13.1",
"jsdom": "15.1.1",
"json5": "2.1.0",
"json5-loader": "1.0.1",
"katex": "0.10.1",
"json5-loader": "2.0.0",
"katex": "0.10.2",
"koa": "2.7.0",
"koa-bodyparser": "4.2.1",
"koa-compress": "3.0.0",
@@ -158,19 +163,19 @@
"koa-router": "7.4.0",
"koa-send": "5.0.0",
"koa-slow": "2.1.0",
"koa-views": "6.1.5",
"koa-views": "6.2.0",
"langmap": "0.0.16",
"loader-utils": "1.2.3",
"lookup-dns-cache": "2.1.0",
"minio": "7.0.5",
"minio": "7.0.8",
"mkdirp": "0.5.1",
"mocha": "5.2.0",
"moji": "0.5.1",
"moment": "2.24.0",
"mongodb": "3.1.13",
"mongodb": "3.2.7",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.12.1",
"ms": "2.1.2",
"nan": "2.14.0",
"nested-property": "0.0.7",
"nodemailer": "5.1.1",
"nprogress": "0.2.0",
@@ -180,7 +185,7 @@
"parsimmon": "1.12.0",
"portscanner": "2.2.0",
"postcss-loader": "3.0.0",
"prismjs": "1.15.0",
"prismjs": "1.16.0",
"progress-bar-webpack-plugin": "1.12.1",
"promise-any": "0.2.0",
"promise-limit": "2.7.0",
@@ -193,6 +198,7 @@
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "4.1.10",
"redis": "2.8.0",
"rename": "1.0.4",
"request": "2.88.0",
"request-promise-native": "1.0.7",
"request-stats": "3.0.0",
@@ -200,7 +206,7 @@
"rndstr": "1.0.0",
"s-age": "1.1.2",
"seedrandom": "2.4.4",
"sharp": "0.21.3",
"sharp": "0.22.1",
"showdown": "1.9.0",
"showdown-highlightjs-extension": "0.1.2",
"speakeasy": "2.0.0",
@@ -209,17 +215,17 @@
"stylus": "0.54.5",
"stylus-loader": "3.0.2",
"summaly": "2.2.0",
"systeminformation": "4.0.16",
"systeminformation": "4.9.0",
"syuilo-password-strength": "0.0.1",
"terser-webpack-plugin": "1.2.3",
"terser-webpack-plugin": "1.3.0",
"textarea-caret": "3.1.0",
"tinycolor2": "1.4.1",
"tmp": "0.0.33",
"tmp": "0.1.0",
"ts-loader": "5.3.3",
"ts-node": "8.0.3",
"tslint": "5.13.1",
"tslint": "5.17.0",
"tslint-sonarts": "1.9.0",
"typescript": "3.3.3333",
"typescript": "3.5.1",
"typescript-eslint-parser": "22.0.0",
"uglify-es": "3.3.9",
"url-loader": "1.1.2",
@@ -227,31 +233,30 @@
"v-animate-css": "0.0.3",
"v-debounce": "0.1.2",
"video-thumbnail-generator": "1.1.3",
"vue": "2.6.8",
"vue": "2.6.10",
"vue-color": "2.7.0",
"vue-content-loading": "1.5.3",
"vue-content-loading": "1.6.0",
"vue-cropperjs": "3.0.0",
"vue-i18n": "8.9.0",
"vue-js-modal": "1.3.28",
"vue-json-pretty": "1.4.1",
"vue-i18n": "8.11.2",
"vue-js-modal": "1.3.31",
"vue-json-pretty": "1.6.0",
"vue-loader": "15.7.0",
"vue-marquee-text-component": "1.1.1",
"vue-prism-component": "1.1.1",
"vue-router": "3.0.2",
"vue-router": "3.0.6",
"vue-sequential-entrance": "1.1.3",
"vue-style-loader": "4.1.2",
"vue-svg-inline-loader": "1.2.13",
"vue-template-compiler": "2.6.8",
"vuedraggable": "2.19.2",
"vue-svg-inline-loader": "1.2.15",
"vue-template-compiler": "2.6.10",
"vuedraggable": "2.21.0",
"vuewordcloud": "18.7.11",
"vuex": "3.1.0",
"vuex": "3.1.1",
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.3",
"webfinger.js": "2.7.0",
"webpack": "4.28.4",
"webpack-cli": "3.2.3",
"web-push": "3.3.5",
"webpack": "4.33.0",
"webpack-cli": "3.3.3",
"websocket": "1.0.28",
"ws": "6.2.0",
"ws": "6.2.1",
"xev": "2.0.1"
}
}

View File

@@ -1,17 +1,19 @@
declare module 'deepcopy';
declare namespace deepcopy {
declare module 'deepcopy' {
type DeepcopyCustomizerValueType = 'Object';
type DeepcopyCustomizer<T> = (
value: T,
valueType: DeepcopyCustomizerValueType) => T;
interface DeepcopyOptions<T> {
interface IDeepcopyOptions<T> {
customizer: DeepcopyCustomizer<T>;
}
export function deepcopy<T>(
function deepcopy<T>(
value: T,
options?: DeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
options?: IDeepcopyOptions<T> | DeepcopyCustomizer<T>): T;
namespace deepcopy {} // Hack
export = deepcopy;
}

View File

@@ -8,7 +8,7 @@ declare module 'koa-slow' {
function slow(options?: ISlowOptions): Middleware;
namespace slow { } // Hack
namespace slow {} // Hack
export = slow;
}

View File

@@ -1,65 +0,0 @@
declare module 'webfinger.js' {
interface IWebFingerConstructorConfig {
tls_only?: boolean;
webfist_fallback?: boolean;
uri_fallback?: boolean;
request_timeout?: number;
}
type JRDProperties = { [type: string]: string };
interface IJRDLink {
rel: string;
type?: string;
href?: string;
template?: string;
titles?: { [lang: string]: string };
properties?: JRDProperties;
}
interface IJRD {
subject?: string;
expires?: Date;
aliases?: string[];
properties?: JRDProperties;
links?: IJRDLink[];
}
interface IIDXLinks {
'avatar': IJRDLink[];
'remotestorage': IJRDLink[];
'blog': IJRDLink[];
'vcard': IJRDLink[];
'updates': IJRDLink[];
'share': IJRDLink[];
'profile': IJRDLink[];
'webfist': IJRDLink[];
'camlistore': IJRDLink[];
[type: string]: IJRDLink[];
}
interface IIDXProperties {
'name': string;
[type: string]: string;
}
interface IIDX {
links: IIDXLinks;
properties: IIDXProperties;
}
interface ILookupCallbackResult {
object: IJRD;
json: string;
idx: IIDX;
}
type LookupCallback = (err: Error | string, result?: ILookupCallbackResult) => void;
export class WebFinger {
constructor(config?: IWebFingerConstructorConfig);
public lookup(address: string, cb: LookupCallback): NodeJS.Timeout;
public lookupLink(address: string, rel: string, cb: IJRDLink): void;
}
}

View File

@@ -245,6 +245,7 @@ export default Vue.extend({
federationInstancesChart(total: boolean): any {
return {
series: [{
name: 'Instances',
data: this.format(total
? this.stats.federation.instance.total
: sum(this.stats.federation.instance.inc, negate(this.stats.federation.instance.dec))

View File

@@ -38,7 +38,7 @@
<div class="kidvdlkg" v-for="file in files">
<div @click="file._open = !file._open">
<div>
<div class="thumbnail" :style="thumbnail(file)"></div>
<x-file-thumbnail class="thumbnail" :file="file" fit="contain" @click="showFileMenu(file)"/>
</div>
<div>
<header>
@@ -75,10 +75,15 @@ import Vue from 'vue';
import i18n from '../../i18n';
import { faCloud, faTerminal, faSearch } from '@fortawesome/free-solid-svg-icons';
import { faTrashAlt, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import XFileThumbnail from '../../common/views/components/drive-file-thumbnail.vue';
export default Vue.extend({
i18n: i18n('admin/views/drive.vue'),
components: {
XFileThumbnail
},
data() {
return {
file: null,
@@ -151,13 +156,6 @@ export default Vue.extend({
});
},
thumbnail(file: any): any {
return {
'background-color': file.properties.avgColor && file.properties.avgColor.length == 3 ? `rgb(${file.properties.avgColor.join(',')})` : 'transparent',
'background-image': `url(${file.thumbnailUrl})`
};
},
async del(file: any) {
const process = async () => {
await this.$root.api('drive/files/delete', { fileId: file.id });
@@ -179,9 +177,9 @@ export default Vue.extend({
this.$root.api('drive/files/update', {
fileId: file.id,
isSensitive: !file.isSensitive
}).then(() => {
file.isSensitive = !file.isSensitive;
});
file.isSensitive = !file.isSensitive;
},
async show() {
@@ -244,7 +242,7 @@ export default Vue.extend({
> div:nth-child(1)
> .thumbnail
display block
display flex
width 64px
height 64px
background-size cover

View File

@@ -130,7 +130,7 @@
<span>{{ $t('status') }}</span>
</header>
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
<a @click.prevent="showInstance(instance.host)" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
<a @click.prevent="showInstance(instance.host)" rel="nofollow noopener" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
<span>{{ instance.notesCount | number }}</span>
<span>{{ instance.usersCount | number }}</span>
<span>{{ instance.followingCount | number }}</span>

View File

@@ -232,6 +232,8 @@ export default Vue.extend({
},
async silenceUser() {
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
const process = async () => {
await this.$root.api('admin/silence-user', { userId: this.user._id });
this.$root.dialog({
@@ -251,6 +253,8 @@ export default Vue.extend({
},
async unsilenceUser() {
if (!await this.getConfirmed(this.$t('unsilence-confirm'))) return;
const process = async () => {
await this.$root.api('admin/unsilence-user', { userId: this.user._id });
this.$root.dialog({

View File

@@ -1,7 +1,7 @@
<template>
<div class="form">
<header>
<h1 v-html="$t('share-access', { name: app.name })"></h1>
<h1 v-html="$t('share-access', { name })"></h1>
<img :src="app.iconUrl"/>
</header>
<div class="app">
@@ -42,6 +42,11 @@ export default Vue.extend({
i18n: i18n('auth/views/form.vue'),
props: ['session'],
computed: {
name(): string {
const el = document.createElement('div');
el.textContent = this.app.name
return el.innerHTML;
},
app(): any {
return this.session.app;
}

View File

@@ -19,7 +19,7 @@
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
<span class="emoji" v-else>{{ emoji.emoji }}</span>
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
<span class="name">{{ beforeQ }}<b>{{ q }}</b>{{ afterQ }}</span>
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
</li>
</ol>
@@ -30,6 +30,7 @@
import Vue from 'vue';
import * as emojilib from 'emojilib';
import contains from '../../../common/scripts/contains';
import { twemojiBase } from '../../../../../misc/twemoji-base';
type EmojiDef = {
emoji: string;
@@ -54,7 +55,7 @@ const emjdb: EmojiDef[] = lib.map((x: any) => ({
emoji: x[1].char,
name: x[0],
aliasOf: null,
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
}));
for (const x of lib as any) {
@@ -64,7 +65,7 @@ for (const x of lib as any) {
emoji: x[1].char,
name: k,
aliasOf: x[0],
url: `https://twemoji.maxcdn.com/2/svg/${char2file(x[1].char)}.svg`
url: `${twemojiBase}/2/svg/${char2file(x[1].char)}.svg`
});
}
}
@@ -88,6 +89,14 @@ export default Vue.extend({
},
computed: {
beforeQ(): string {
return this.emoji.name.split(this.q)[0];
},
afterQ(): string {
return this.emoji.name.split(this.q)[1] || '';
},
items(): HTMLCollection {
return (this.$refs.suggests as Element).children;
},

View File

@@ -183,9 +183,6 @@ export default Vue.extend({
height 100%
&.splash
&, *
pointer-events none !important
> .main
min-width 0
width initial

View File

@@ -0,0 +1,187 @@
<template>
<div class="zdjebgpv" :class="{ detail }" ref="thumbnail" :style="`background-color: ${ background }`">
<img
:src="file.url"
:alt="file.name"
:title="file.name"
@load="onThumbnailLoaded"
v-if="detail && is === 'image'"/>
<video
:src="file.url"
ref="volumectrl"
preload="metadata"
controls
v-else-if="detail && is === 'video'"/>
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded" :style="`object-fit: ${ fit }`" v-else-if="isThumbnailAvailable"/>
<fa :icon="faFileImage" class="icon" v-else-if="is === 'image'"/>
<fa :icon="faFileVideo" class="icon" v-else-if="is === 'video'"/>
<audio
:src="file.url"
ref="volumectrl"
preload="metadata"
controls
v-else-if="detail && is === 'audio'"/>
<fa :icon="faMusic" class="icon" v-else-if="is === 'audio' || is === 'midi'"/>
<fa :icon="faFileCsv" class="icon" v-else-if="is === 'csv'"/>
<fa :icon="faFilePdf" class="icon" v-else-if="is === 'pdf'"/>
<fa :icon="faFileAlt" class="icon" v-else-if="is === 'textfile'"/>
<fa :icon="faFileArchive" class="icon" v-else-if="is === 'archive'"/>
<fa :icon="faFile" class="icon" v-else/>
<fa :icon="faFilm" class="icon-sub" v-if="!detail && isThumbnailAvailable && is === 'video'"/>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import anime from 'animejs';
import {
faFile,
faFileAlt,
faFileImage,
faMusic,
faFileVideo,
faFileCsv,
faFilePdf,
faFileArchive,
faFilm
} from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
props: {
file: {
type: Object,
required: true
},
fit: {
type: String,
required: true
},
detail: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
isContextmenuShowing: false,
isDragging: false,
faFile,
faFileAlt,
faFileImage,
faMusic,
faFileVideo,
faFileCsv,
faFilePdf,
faFileArchive,
faFilm
};
},
computed: {
is(): 'image' | 'video' | 'midi' | 'audio' | 'csv' | 'pdf' | 'textfile' | 'archive' | 'unknown' {
if (this.file.type.startsWith('image/')) return 'image';
if (this.file.type.startsWith('video/')) return 'video';
if (this.file.type === 'audio/midi') return 'midi';
if (this.file.type.startsWith('audio/')) return 'audio';
if (this.file.type.endsWith('/csv')) return 'csv';
if (this.file.type.endsWith('/pdf')) return 'pdf';
if (this.file.type.startsWith('text/')) return 'textfile';
if ([
"application/zip",
"application/x-cpio",
"application/x-bzip",
"application/x-bzip2",
"application/java-archive",
"application/x-rar-compressed",
"application/x-tar",
"application/gzip",
"application/x-7z-compressed"
].some(e => e === this.file.type)) return 'archive';
return 'unknown';
},
isThumbnailAvailable(): boolean {
return this.file.thumbnailUrl
? this.file.thumbnailUrl.endsWith('?thumbnail')
? (this.is === 'image' || this.is === 'video')
: true
: false;
},
background(): string {
return this.file.properties.avgColor && this.file.properties.avgColor.length == 3
? `rgb(${this.file.properties.avgColor.join(',')})`
: 'transparent';
}
},
mounted() {
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
if (audioTag) audioTag.volume = this.$store.state.device.mediaVolume;
},
methods: {
onThumbnailLoaded() {
if (this.file.properties.avgColor && this.file.properties.avgColor.length == 3) {
anime({
targets: this.$refs.thumbnail,
backgroundColor: `rgba(${this.file.properties.avgColor.join(',')}, 0)`,
duration: 100,
easing: 'linear'
});
}
},
volumechange() {
const audioTag = this.$refs.volumectrl as HTMLAudioElement;
this.$store.commit('device/set', { key: 'mediaVolume', value: audioTag.volume });
}
}
});
</script>
<style lang="stylus" scoped>
.zdjebgpv
display flex
> img,
> .icon
pointer-events none
> .icon-sub
position absolute
width 30%
height auto
margin 0
right 4%
bottom 4%
> *
margin auto
&:not(.detail)
> img
height 100%
width 100%
object-fit cover
> .icon
height 65%
width 65%
> video,
> audio
width 100%
&.detail
> .icon
height 100px
width 100px
margin 16px
> *:not(.icon)
max-height 300px
max-width 100%
height 100%
object-fit contain
</style>

View File

@@ -10,6 +10,7 @@ import Vue from 'vue';
// スクリプトサイズがデカい
//import { lib } from 'emojilib';
import { getStaticImageUrl } from '../../../common/scripts/get-static-image-url';
import { twemojiBase } from '../../../../../misc/twemoji-base';
export default Vue.extend({
props: {
@@ -77,7 +78,7 @@ export default Vue.extend({
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
codes = codes.filter(x => x && x.length);
this.url = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
this.url = `${twemojiBase}/2/svg/${codes.join('-')}.svg`;
}
}
});

View File

@@ -1,5 +1,5 @@
<template>
<a class="a" :href="repo" target="_blank" title="View source on GitHub">
<a class="a" :href="repositoryUrl" rel="noopener" target="_blank" title="View source on GitHub">
<svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="aria-hidden">
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path class="octo-arm" d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor"></path>
@@ -15,12 +15,6 @@ export default Vue.extend({
return {
repositoryUrl: 'https://github.com/syuilo/misskey'
};
},
created() {
this.$root.getMeta().then(meta => {
if (meta.maintainer)
this.repositoryUrl = meta.maintainer.repository_url;
});
}
});
</script>

View File

@@ -1,5 +1,5 @@
<template>
<a class="zxrjzpcj" :href="url" :class="service" target="_blank">
<a class="zxrjzpcj" :href="url" :class="service" rel="noopener" target="_blank">
<fa :icon="icon" size="lg" fixed-width /><span>{{ text }}</span>
</a>
</template>

View File

@@ -1,7 +1,7 @@
<template>
<div class="onchrpzrvnoruiaenfcqvccjfuupzzwv" :class="{ isMobile: $root.isMobile }">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ hukidasi }" ref="popover">
<div class="popover" :class="{ bubble }" ref="popover">
<template v-for="item, i in items">
<div v-if="item === null"></div>
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
@@ -28,7 +28,7 @@ export default Vue.extend({
},
data() {
return {
hukidasi: !this.$root.isMobile
bubble: !this.$root.isMobile
};
},
mounted() {
@@ -56,12 +56,12 @@ export default Vue.extend({
if (left + width - window.pageXOffset > window.innerWidth) {
left = window.innerWidth - width + window.pageXOffset;
this.hukidasi = false;
this.bubble = false;
}
if (top + height - window.pageYOffset > window.innerHeight) {
top = window.innerHeight - height + window.pageYOffset;
this.hukidasi = false;
this.bubble = false;
}
if (top < 0) {
@@ -150,7 +150,7 @@ export default Vue.extend({
$balloon-size = 16px
&.hukidasi
&.bubble
margin-top $balloon-size
transform-origin center -($balloon-size)

View File

@@ -9,7 +9,7 @@
<div class="content" v-if="!message.isDeleted">
<mfm class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
<div class="file" v-if="message.file">
<a :href="message.file.url" target="_blank" :title="message.file.name">
<a :href="message.file.url" rel="noopener" target="_blank" :title="message.file.name">
<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"
:style="{ backgroundColor: message.file.properties.avgColor && message.file.properties.avgColor.length == 3 ? `rgb(${message.file.properties.avgColor.join(',')})` : 'transparent' }"/>
<p v-else>{{ message.file.name }}</p>

View File

@@ -270,17 +270,13 @@ export default Vue.extend({
<style lang="stylus" scoped>
.mk-messaging-room
display flex
flex 1
flex-direction column
height 100%
background var(--messagingRoomBg)
> .body
width 100%
max-width 600px
margin 0 auto
flex 1
min-height calc(100% - 103px)
> .init,
> .empty

View File

@@ -174,6 +174,7 @@ export default Vue.component('misskey-flavored-markdown', {
key: Math.random(),
props: {
url: token.node.props.url,
rel: 'nofollow noopener',
target: '_blank'
},
attrs: {
@@ -187,6 +188,7 @@ export default Vue.component('misskey-flavored-markdown', {
attrs: {
class: 'link',
href: token.node.props.url,
rel: 'nofollow noopener',
target: '_blank',
title: token.node.props.url,
style: 'color:var(--mfmLink);'

View File

@@ -2,9 +2,9 @@
<span class="mk-nav">
<a :href="aboutUrl">{{ $t('about') }}</a>
<i></i>
<a :href="repositoryUrl">{{ $t('repository') }}</a>
<a :href="repositoryUrl" rel="noopener" target="_blank">{{ $t('repository') }}</a>
<i></i>
<a :href="feedbackUrl" target="_blank">{{ $t('feedback') }}</a>
<a :href="feedbackUrl" rel="noopener" target="_blank">{{ $t('feedback') }}</a>
<i></i>
<a href="/dev">{{ $t('develop') }}</a>
</span>
@@ -23,12 +23,6 @@ export default Vue.extend({
repositoryUrl: 'https://github.com/syuilo/misskey',
feedbackUrl: 'https://github.com/syuilo/misskey/issues/new'
}
},
created() {
this.$root.getMeta().then(meta => {
if (meta.maintainer.repository_url) this.repositoryUrl = meta.maintainer.repository_url;
if (meta.maintainer.feedback_url) this.feedbackUrl = meta.maintainer.feedback_url;
});
}
});
</script>

View File

@@ -0,0 +1,140 @@
<template>
<div class="skeikyzd" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id" @click="showFileMenu(file, $event)" @contextmenu.prevent="showFileMenu(file, $event)">
<x-file-thumbnail :data-id="file.id" class="thumbnail" :file="file" fit="cover"/>
<img class="remove" @click.stop="detachMedia(file.id)" src="/assets/desktop/remove.png" :title="$t('attach-cancel')" alt=""/>
<div class="sensitive" v-if="file.isSensitive">
<fa class="icon" :icon="faExclamationTriangle"/>
</div>
</div>
</x-draggable>
<p class="remain">{{ 4 - files.length }}/4</p>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import * as XDraggable from 'vuedraggable';
import XMenu from '../../../common/views/components/menu.vue';
import { faTimesCircle, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import XFileThumbnail from './drive-file-thumbnail.vue'
export default Vue.extend({
i18n: i18n('common/views/components/post-form-attaches.vue'),
components: {
XDraggable,
XFileThumbnail
},
props: {
files: {
type: Object,
required: true
},
detachMediaFn: {
type: Object,
required: false
}
},
data() {
return {
faExclamationTriangle
};
},
methods: {
detachMedia(id) {
if (this.detachMediaFn) this.detachMediaFn(id)
else if (this.$parent.detachMedia) this.$parent.detachMedia(id)
},
toggleSensitive(file) {
this.$root.api('drive/files/update', {
fileId: file.id,
isSensitive: !file.isSensitive
}).then(() => {
file.isSensitive = !file.isSensitive;
});
},
showFileMenu(file, ev: MouseEvent) {
this.$root.new(XMenu, {
items: [{
type: 'item',
text: file.isSensitive ? this.$t('unmark-as-sensitive') : this.$t('mark-as-sensitive'),
icon: file.isSensitive ? faEyeSlash : faEye,
action: () => { this.toggleSensitive(file) }
}, {
type: 'item',
text: this.$t('attach-cancel'),
icon: faTimesCircle,
action: () => { this.detachMedia(file.id) }
}],
source: ev.currentTarget || ev.target
});
}
}
});
</script>
<style lang="stylus" scoped>
.skeikyzd
padding 4px
> .files
display flex
flex-wrap wrap
> div
width 64px
height 64px
margin 4px
cursor move
&:hover > .remove
display block
> .thumbnail
width 100%
height 100%
z-index 1
color var(--text)
background-color: rgba(128, 128, 128, 0.3)
> .remove
display none
position absolute
top -6px
right -6px
width 16px
height 16px
cursor pointer
z-index 1000
> .sensitive
display flex
position absolute
width 64px
height 64px
top 0
left 0
z-index 2
background rgba(17, 17, 17, .7)
color #fff
> .icon
margin auto
> .remain
display block
position absolute
top 8px
right 8px
margin 0
padding 0
color var(--primaryAlpha04)
</style>

View File

@@ -278,7 +278,7 @@ export default Vue.extend({
border-bottom solid var(--lineWidth) var(--faceDivider)
> .buttons
padding 4px
padding 4px 4px 8px 4px
width 216px
text-align center
@@ -316,7 +316,7 @@ export default Vue.extend({
> .text
width 216px
padding 4px 8px 8px 8px
padding 0 8px 8px 8px
> input
width 100%

View File

@@ -9,7 +9,7 @@
</template>
<div v-if="data && !$store.state.i.twoFactorEnabled">
<ol>
<li>{{ $t('authenticator') }}<a href="https://support.google.com/accounts/answer/1066447" target="_blank">{{ $t('howtoinstall') }}</a></li>
<li>{{ $t('authenticator') }}<a href="https://support.google.com/accounts/answer/1066447" rel="noopener" target="_blank">{{ $t('howtoinstall') }}</a></li>
<li>{{ $t('scan') }}<br><img :src="data.qr"></li>
<li>{{ $t('done') }}<br>
<ui-input v-model="token">{{ $t('token') }}</ui-input>

View File

@@ -4,21 +4,21 @@
<section v-if="enableTwitterIntegration">
<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
</section>
<section v-if="enableDiscordIntegration">
<header><fa :icon="['fab', 'discord']"/> Discord</header>
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
</section>
<section v-if="enableGithubIntegration">
<header><fa :icon="['fab', 'github']"/> GitHub</header>
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" rel="nofollow noopener" target="_blank">@{{ $store.state.i.github.login }}</a></p>
<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
<ui-button v-else @click="connectGithub">{{ $t('connect') }}</ui-button>
</section>

View File

@@ -290,12 +290,17 @@ export default Vue.extend({
this.exportTarget == 'mute' ? 'i/export-mute' :
this.exportTarget == 'blocking' ? 'i/export-blocking' :
this.exportTarget == 'user-lists' ? 'i/export-user-lists' :
null, {});
this.$root.dialog({
type: 'info',
text: this.$t('export-requested')
});
null, {}).then(() => {
this.$root.dialog({
type: 'info',
text: this.$t('export-requested')
});
}).catch((e: any) => {
this.$root.dialog({
type: 'error',
text: e.message
});
});
},
doImport() {
@@ -305,11 +310,16 @@ export default Vue.extend({
this.exportTarget == 'user-lists' ? 'i/import-user-lists' :
null, {
fileId: file.id
}).then(() => {
this.$root.dialog({
type: 'info',
text: this.$t('import-requested')
});
}).catch((e: any) => {
this.$root.dialog({
type: 'error',
text: e.message
});
this.$root.dialog({
type: 'info',
text: this.$t('import-requested')
});
});
},

View File

@@ -159,7 +159,7 @@
</template>
<template v-if="page == null || page == 'notification'">
<x-notification v-show="page == 'notification'"/>
<x-notification/>
</template>
<template v-if="page == null || page == 'drive'">

View File

@@ -45,7 +45,7 @@
</ui-select>
</label>
<a href="https://assets.msky.cafe/theme/list" target="_blank">{{ $t('find-more-theme') }}</a>
<a href="https://assets.msky.cafe/theme/list" rel="noopener" target="_blank">{{ $t('find-more-theme') }}</a>
<details class="creator">
<summary><fa icon="palette"/> {{ $t('create-a-theme') }}</summary>

View File

@@ -3,12 +3,14 @@
<ol v-if="uploads.length > 0">
<li v-for="ctx in uploads" :key="ctx.id">
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
<p class="status">
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
<span class="percentage" v-if="ctx.progress != undefined">{{ Math.floor((ctx.progress.value / ctx.progress.max) * 100) }}</span>
</p>
<div class="top">
<p class="name"><fa icon="spinner" pulse/>{{ ctx.name }}</p>
<p class="status">
<span class="initing" v-if="ctx.progress == undefined">{{ $t('waiting') }}<mk-ellipsis/></span>
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
<span class="percentage" v-if="ctx.progress != undefined">{{ Math.floor((ctx.progress.value / ctx.progress.max) * 100) }}</span>
</p>
</div>
<progress v-if="ctx.progress != undefined && ctx.progress.value != ctx.progress.max" :value="ctx.progress.value" :max="ctx.progress.max"></progress>
<div class="progress initing" v-if="ctx.progress == undefined"></div>
<div class="progress waiting" v-if="ctx.progress != undefined && ctx.progress.value == ctx.progress.max"></div>
@@ -116,12 +118,17 @@ export default Vue.extend({
list-style none
> li
display block
display grid
margin 8px 0 0 0
padding 0
height 36px
width: 100%
box-shadow 0 -1px 0 var(--primaryAlpha01)
border-top solid 8px transparent
grid-template-columns 36px calc(100% - 44px)
grid-template-rows 1fr 8px
column-gap 8px
box-sizing content-box
&:first-child
margin 0
@@ -130,68 +137,62 @@ export default Vue.extend({
> .img
display block
position absolute
top 0
left 0
width 36px
height 36px
background-size cover
background-position center center
grid-column 1 / 2
grid-row 1 / 3
> .name
display block
position absolute
top 0
left 44px
margin 0
padding 0
max-width 256px
font-size 0.8em
color var(--primaryAlpha07)
white-space nowrap
text-overflow ellipsis
overflow hidden
> [data-icon]
margin-right 4px
> .status
display block
position absolute
top 0
right 0
margin 0
padding 0
font-size 0.8em
> .initing
color var(--primaryAlpha05)
> .kb
color var(--primaryAlpha05)
> .percentage
display inline-block
width 48px
text-align right
> .top
display flex
grid-column 2 / 3
grid-row 1 / 2
> .name
display block
padding 0 8px 0 0
margin 0
font-size 0.8em
color var(--primaryAlpha07)
white-space nowrap
text-overflow ellipsis
overflow hidden
flex-shrink 1
&:after
content '%'
> [data-icon]
margin-right 4px
> .status
display block
margin 0 0 0 auto
padding 0
font-size 0.8em
flex-shrink 0
> .initing
color var(--primaryAlpha05)
> .kb
color var(--primaryAlpha05)
> .percentage
display inline-block
width 48px
text-align right
color var(--primaryAlpha07)
&:after
content '%'
> progress
display block
position absolute
bottom 0
right 0
margin 0
width calc(100% - 44px)
height 8px
background transparent
border none
border-radius 4px
overflow hidden
grid-column 2 / 3
grid-row 2 / 3
z-index 2
&::-webkit-progress-value
background var(--primary)
@@ -201,12 +202,6 @@ export default Vue.extend({
> .progress
display block
position absolute
bottom 0
right 0
margin 0
width calc(100% - 44px)
height 8px
border none
border-radius 4px
background linear-gradient(
@@ -221,6 +216,9 @@ export default Vue.extend({
)
background-size 32px 32px
animation bg 1.5s linear infinite
grid-column 2 / 3
grid-row 2 / 3
z-index 1
&.initing
opacity 0.3

View File

@@ -9,7 +9,7 @@
</blockquote>
</div>
<div v-else class="mk-url-preview">
<a :class="{ mini: narrow, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
<a :class="{ mini: narrow, compact }" :href="url" rel="nofollow noopener" target="_blank" :title="url" v-if="!fetching">
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`">
<button v-if="!playerEnabled && player.url" @click.prevent="playerEnabled = true" :title="$t('enable-player')"><fa :icon="['far', 'play-circle']"/></button>
</div>

View File

@@ -1,5 +1,5 @@
<template>
<a class="mk-url" :href="url" :target="target">
<a class="mk-url" :href="url" :rel="rel" :target="target">
<span class="schema">{{ schema }}//</span>
<span class="hostname">{{ hostname }}</span>
<span class="port" v-if="port != ''">:{{ port }}</span>
@@ -15,7 +15,7 @@ import Vue from 'vue';
import { toUnicode as decodePunycode } from 'punycode';
export default Vue.extend({
props: ['url', 'target'],
props: ['url', 'rel', 'target'],
data() {
return {
schema: null,

View File

@@ -8,7 +8,7 @@
<div class="no-users" v-if="inited && us.length == 0">
<p>{{ $t('no-users') }}</p>
</div>
<div class="user" v-for="user in us">
<div class="user" v-for="user in us" :key="user.id">
<mk-avatar class="avatar" :user="user"/>
<div class="body" v-if="!iconOnly">
<div class="name">
@@ -16,8 +16,9 @@
<p class="username">@{{ user | acct }}</p>
</div>
<div class="description" v-if="user.description" :title="user.description">
<mfm :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/>
<mfm :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false" :plain-text="true"/>
</div>
<mk-follow-button class="follow-button" v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" mini/>
</div>
</div>
<button class="more" :class="{ fetching: fetchingMoreUsers }" v-if="cursor != null" @click="fetchMoreUsers()" :disabled="fetchingMoreUsers">
@@ -160,6 +161,12 @@ export default Vue.extend({
text-overflow ellipsis
opacity 0.7
font-size 14px
padding-right 40px
> .follow-button
position absolute
top 8px
right 0px
> .more
display block

View File

@@ -7,7 +7,6 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import { faExclamationCircle, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
@@ -27,19 +26,23 @@ export default Vue.extend({
icon: ['fas', 'list'],
text: this.$t('push-to-list'),
action: this.pushList
}, null, {
icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'],
text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'),
action: this.toggleMute
}, {
icon: 'ban',
text: this.user.isBlocking ? this.$t('unblock') : this.$t('block'),
action: this.toggleBlock
}, null, {
icon: faExclamationCircle,
text: this.$t('report-abuse'),
action: this.reportAbuse
}];
}] as any;
if (this.$store.getters.isSignedIn && this.$store.state.i.id != this.user.id) {
menu = menu.concat([null, {
icon: this.user.isMuted ? ['fas', 'eye'] : ['far', 'eye-slash'],
text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'),
action: this.toggleMute
}, {
icon: 'ban',
text: this.user.isBlocking ? this.$t('unblock') : this.$t('block'),
action: this.toggleBlock
}, null, {
icon: faExclamationCircle,
text: this.$t('report-abuse'),
action: this.reportAbuse
}]);
}
if (this.$store.getters.isSignedIn && (this.$store.state.i.isAdmin || this.$store.state.i.isModerator)) {
menu = menu.concat([null, {
@@ -89,8 +92,10 @@ export default Vue.extend({
});
},
toggleMute() {
async toggleMute() {
if (this.user.isMuted) {
if (!await this.getConfirmed(this.$t('unmute-confirm'))) return;
this.$root.api('mute/delete', {
userId: this.user.id
}).then(() => {
@@ -102,6 +107,8 @@ export default Vue.extend({
});
});
} else {
if (!await this.getConfirmed(this.$t('mute-confirm'))) return;
this.$root.api('mute/create', {
userId: this.user.id
}).then(() => {
@@ -115,8 +122,10 @@ export default Vue.extend({
}
},
toggleBlock() {
async toggleBlock() {
if (this.user.isBlocking) {
if (!await this.getConfirmed(this.$t('unblock-confirm'))) return;
this.$root.api('blocking/delete', {
userId: this.user.id
}).then(() => {
@@ -128,6 +137,8 @@ export default Vue.extend({
});
});
} else {
if (!await this.getConfirmed(this.$t('block-confirm'))) return;
this.$root.api('blocking/create', {
userId: this.user.id
}).then(() => {
@@ -164,7 +175,9 @@ export default Vue.extend({
});
},
toggleSilence() {
async toggleSilence() {
if (!await this.getConfirmed(this.$t(this.user.isSilenced ? 'unsilence-confirm' : 'silence-confirm'))) return;
this.$root.api(this.user.isSilenced ? 'admin/unsilence-user' : 'admin/silence-user', {
userId: this.user.id
}).then(() => {
@@ -181,7 +194,9 @@ export default Vue.extend({
});
},
toggleSuspend() {
async toggleSuspend() {
if (!await this.getConfirmed(this.$t(this.user.isSuspended ? 'unsuspend-confirm' : 'suspend-confirm'))) return;
this.$root.api(this.user.isSuspended ? 'admin/unsuspend-user' : 'admin/suspend-user', {
userId: this.user.id
}).then(() => {
@@ -196,7 +211,18 @@ export default Vue.extend({
text: e
});
});
}
},
async getConfirmed(text: string): Promise<Boolean> {
const confirm = await this.$root.dialog({
type: 'warning',
showCancelButton: true,
title: 'confirm',
text,
});
return !confirm.canceled;
},
}
});
</script>

View File

@@ -8,7 +8,7 @@
<div class="is-remote" v-if="note.user.host != null">
<details>
<summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-post') }}</summary>
<a :href="note.url || note.uri" target="_blank">{{ $t('@.view-on-remote') }}</a>
<a :href="note.url || note.uri" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</details>
</div>
<mk-note :note="note" :detail="true" :key="note.id"/>

View File

@@ -157,6 +157,7 @@ export default Vue.extend({
// オーバーフローしたら古い投稿は捨てる
if (this.notes.length >= displayLimit) {
this.notes = this.notes.slice(0, displayLimit);
this.cursor = this.notes[this.notes.length - 1].id
}
} else {
this.queue.push(note);
@@ -165,6 +166,7 @@ export default Vue.extend({
append(note) {
this.notes.push(note);
this.cursor = this.notes[this.notes.length - 1].id
},
releaseQueue() {

View File

@@ -85,7 +85,7 @@ export default Vue.extend({
this.makePromise = cursor => this.$root.api('users/notes', {
userId: this.user.id,
limit: fetchLimit + 1,
untilId: cursor ? cursor : undefined,
untilDate: cursor ? cursor : new Date().getTime() + 1000 * 86400 * 365,
withFiles: this.withFiles,
includeMyRenotes: this.$store.state.settings.showMyRenotes,
includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
@@ -95,7 +95,7 @@ export default Vue.extend({
notes.pop();
return {
notes: notes,
cursor: notes[notes.length - 1].id
cursor: new Date(notes[notes.length - 1].createdAt).getTime()
};
} else {
return {

View File

@@ -8,7 +8,7 @@
<div class="is-remote" v-if="user.host != null">
<details>
<summary><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}</summary>
<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a>
<a :href="user.url || user.uri" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</details>
</div>
<header :style="bannerStyle">

View File

@@ -21,14 +21,7 @@
<fa :icon="['far', 'laugh']"/>
</button>
</div>
<div class="files" v-show="files.length != 0">
<x-draggable :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id">
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" :title="$t('attach-cancel')" alt=""/>
</div>
</x-draggable>
</div>
<x-post-form-attaches class="files" :files="files" :detachMediaFn="detachMedia"/>
<input ref="file" type="file" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
<mk-uploader ref="uploader" @uploaded="attachMedia"/>
<footer>
@@ -45,7 +38,7 @@
import define from '../../../common/define-widget';
import i18n from '../../../i18n';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import XPostFormAttaches from '../components/post-form-attaches.vue';
export default define({
name: 'post-form',
@@ -56,7 +49,7 @@ export default define({
i18n: i18n('desktop/views/widgets/post-form.vue'),
components: {
XDraggable
XPostFormAttaches
},
data() {
@@ -176,10 +169,22 @@ export default define({
post() {
this.posting = true;
let visibility = 'public';
let localOnly = false;
const m = this.$store.state.settings.defaultNoteVisibility.match(/^local-(.+)/);
if (m) {
visibility = m[1];
localOnly = true;
} else {
visibility = this.$store.state.settings.defaultNoteVisibility;
}
this.$root.api('notes/create', {
text: this.text == '' ? undefined : this.text,
fileIds: this.files.length > 0 ? this.files.map(f => f.id) : undefined,
visibility: this.$store.state.settings.defaultNoteVisibility
visibility,
localOnly,
}).then(data => {
this.clear();
}).catch(err => {
@@ -237,38 +242,6 @@ export default define({
& + .emoji
opacity 0.7
> .files
> div
padding 4px
&:after
content ""
display block
clear both
> div
float left
border solid 4px transparent
cursor move
&:hover > .remove
display block
> .img
width 64px
height 64px
background-size cover
background-position center center
> .remove
display none
position absolute
top -6px
right -6px
width 16px
height 16px
cursor pointer
> input[type=file]
display none

View File

@@ -7,7 +7,7 @@
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
<p class="fetching" v-if="fetching"><fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p>
<div class="feed" v-else>
<a v-for="item in items" :href="item.link" target="_blank" :title="item.title">{{ item.title }}</a>
<a v-for="item in items" :href="item.link" rel="nofollow noopener" target="_blank" :title="item.title">{{ item.title }}</a>
</div>
</div>
</ui-container>

View File

@@ -11,7 +11,7 @@
<div class="weekday"
v-for="(day, i) in Array(7).fill(0)"
:data-today="year == today.getFullYear() && month == today.getMonth() + 1 && today.getDay() == i"
:data-is-donichi="i == 0 || i == 6"
:data-is-weekend="i == 0 || i == 6"
>{{ weekdayText[i] }}</div>
</template>
<div v-for="n in paddingDays"></div>
@@ -19,7 +19,7 @@
:data-today="isToday(i + 1)"
:data-selected="isSelected(i + 1)"
:data-is-out-of-range="isOutOfRange(i + 1)"
:data-is-donichi="isDonichi(i + 1)"
:data-is-weekend="isWeekend(i + 1)"
@click="go(i + 1)"
:title="isOutOfRange(i + 1) ? null : $t('go')"
>
@@ -96,7 +96,7 @@ export default Vue.extend({
(this.start ? test < (this.start as any).getTime() : false);
},
isDonichi(day) {
isWeekend(day) {
const weekday = (new Date(this.year, this.month - 1, day)).getDay();
return weekday == 0 || weekday == 6;
},
@@ -199,14 +199,14 @@ export default Vue.extend({
&.weekday
color var(--calendarWeek)
&[data-is-donichi]
&[data-is-weekend]
color var(--calendarSaturdayOrSunday)
&[data-today]
box-shadow 0 0 0 var(--lineWidth) var(--calendarWeek) inset
border-radius 6px
&[data-is-donichi]
&[data-is-weekend]
box-shadow 0 0 0 var(--lineWidth) var(--calendarSaturdayOrSunday) inset
&.day
@@ -222,7 +222,7 @@ export default Vue.extend({
&:active > div
background var(--faceClearButtonActive)
&[data-is-donichi]
&[data-is-weekend]
color var(--calendarSaturdayOrSunday)
&[data-is-out-of-range]

View File

@@ -6,7 +6,7 @@
<p @click="click(item)"><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}</p>
</template>
<template v-else-if="item.type == 'link'">
<a :href="item.href" :target="item.target" @click="click(item)"><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}</a>
<a :href="item.href" :target="item.target" @click="click(item)" :download="item.download"><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}</a>
</template>
<template v-else-if="item.type == 'nest'">
<p><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}...<span class="caret"><fa icon="caret-right"/></span></p>

View File

@@ -3,7 +3,7 @@
<template #header><fa icon="crop"/>{{ title }}</template>
<div class="body">
<vue-cropper ref="cropper"
:src="image.url"
:src="imageUrl"
:view-mode="1"
:aspect-ratio="aspectRatio"
:container-style="{ width: '100%', 'max-height': '400px' }"
@@ -21,6 +21,7 @@
import Vue from 'vue';
import i18n from '../../../i18n';
import VueCropper from 'vue-cropperjs';
import * as url from '../../../../../prelude/url';
export default Vue.extend({
i18n: i18n('desktop/views/components/crop-window.vue'),
@@ -41,6 +42,13 @@ export default Vue.extend({
required: true
}
},
computed: {
imageUrl() {
return `/proxy/?${url.query({
url: this.image.url
})}`;
},
},
methods: {
ok() {
(this.$refs.cropper as any).getCroppedCanvas().toBlob(blob => {

View File

@@ -21,9 +21,9 @@
<img src="/assets/label-red.svg"/>
<p>{{ $t('nsfw') }}</p>
</div>
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
<img :src="file.thumbnailUrl" alt="" @load="onThumbnailLoaded"/>
</div>
<x-file-thumbnail class="thumbnail" :file="file" fit="contain"/>
<p class="name">
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
<span class="ext" v-if="file.name.lastIndexOf('.') != -1">{{ file.name.substr(file.name.lastIndexOf('.')) }}</span>
@@ -34,14 +34,18 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import anime from 'animejs';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import updateAvatar from '../../api/update-avatar';
import updateBanner from '../../api/update-banner';
import { appendQuery } from '../../../../../prelude/url';
import XFileThumbnail from '../../../common/views/components/drive-file-thumbnail.vue';
export default Vue.extend({
i18n: i18n('desktop/views/components/drive.file.vue'),
props: ['file'],
components: {
XFileThumbnail
},
data() {
return {
isContextmenuShowing: false,
@@ -57,11 +61,6 @@ export default Vue.extend({
},
title(): string {
return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.datasize)}`;
},
background(): string {
return this.file.properties.avgColor && this.file.properties.avgColor.length == 3
? `rgb(${this.file.properties.avgColor.join(',')})`
: 'transparent';
}
},
methods: {
@@ -88,9 +87,10 @@ export default Vue.extend({
action: this.copyUrl
}, {
type: 'link',
href: `${this.file.url}?download`,
href: appendQuery(this.file.url, 'download'),
text: this.$t('contextmenu.download'),
icon: 'download',
download: this.file.name
}, null, {
type: 'item',
text: this.$t('@.delete'),
@@ -205,7 +205,7 @@ export default Vue.extend({
<style lang="stylus" scoped>
.gvfdktuvdgwhmztnuekzkswkjygptfcv
padding 8px 0 0 0
height 180px
min-height 180px
border-radius 4px
&, *
@@ -254,6 +254,9 @@ export default Vue.extend({
> .name
color var(--primaryForeground)
> .thumbnail
color var(--primaryForeground)
&[data-is-contextmenu-showing]
&:after
content ""
@@ -319,18 +322,7 @@ export default Vue.extend({
width 128px
height 128px
margin auto
> img
display block
position absolute
top 0
left 0
right 0
bottom 0
margin auto
max-width 128px
max-height 128px
pointer-events none
color var(--driveFileIcon)
> .name
display block

View File

@@ -769,7 +769,6 @@ export default Vue.extend({
> .mk-uploader
height 100px
padding 16px
background #fff
> input
display none

View File

@@ -1,6 +1,6 @@
<template>
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
<template #header><fa icon="comments"/> {{ $t('title') }} <mk-user-name :user="user"/></template>
<template #header><fa icon="comments"/> {{ $t('@.messaging') }}: <mk-user-name :user="user"/></template>
<x-messaging-room :user="user" :class="$style.content"/>
</mk-window>
</template>
@@ -12,7 +12,7 @@ import { url } from '../../../config';
import getAcct from '../../../../../misc/acct/render';
export default Vue.extend({
i18n: i18n('desktop/views/components/messaging-room-window.vue'),
i18n: i18n(),
components: {
XMessagingRoom: () => import('../../../common/views/components/messaging-room.vue').then(m => m.default)
},

View File

@@ -1,6 +1,6 @@
<template>
<mk-window ref="window" width="500px" height="560px" @closed="destroyDom">
<template #header :class="$style.header"><fa icon="comments"/>{{ $t('title') }}</template>
<template #header :class="$style.header"><fa icon="comments"/>{{ $t('@.messaging') }}</template>
<x-messaging :class="$style.content" @navigate="navigate"/>
</mk-window>
</template>
@@ -11,7 +11,7 @@ import i18n from '../../../i18n';
import MkMessagingRoomWindow from './messaging-room-window.vue';
export default Vue.extend({
i18n: i18n('desktop/views/components/messaging-window.vue'),
i18n: i18n(),
components: {
XMessaging: () => import('../../../common/views/components/messaging.vue').then(m => m.default)
},

View File

@@ -54,7 +54,7 @@
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="map" v-if="appearNote.geo" ref="map"></div>
<div class="renote" v-if="appearNote.renote">
<mk-note-preview :note="appearNote.renote"/>

View File

@@ -15,7 +15,7 @@
<article class="article">
<mk-avatar class="avatar" :user="appearNote.user"/>
<div class="main">
<mk-note-header class="header" :note="appearNote"/>
<mk-note-header class="header" :note="appearNote" :mini="narrow"/>
<div class="body" v-if="appearNote.deletedAt == null">
<p v-if="appearNote.cw != null" class="cw">
<mfm v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
@@ -32,7 +32,7 @@
<mk-media-list :media-list="appearNote.files"/>
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/>
</div>

View File

@@ -157,6 +157,7 @@ export default Vue.extend({
// オーバーフローしたら古い投稿は捨てる
if (this.notes.length >= displayLimit) {
this.notes = this.notes.slice(0, displayLimit);
this.cursor = this.notes[this.notes.length - 1].id
}
} else {
this.queue.push(note);
@@ -165,6 +166,7 @@ export default Vue.extend({
append(note) {
this.notes.push(note);
this.cursor = this.notes[this.notes.length - 1].id
},
releaseQueue() {

View File

@@ -27,15 +27,7 @@
<button class="emoji" @click="emoji" ref="emoji">
<fa :icon="['far', 'laugh']"/>
</button>
<div class="files" :class="{ with: poll }" v-show="files.length != 0">
<x-draggable :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id">
<div class="img" :style="{ backgroundImage: `url(${file.thumbnailUrl})` }" :title="file.name"></div>
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" :title="$t('attach-cancel')" alt=""/>
</div>
</x-draggable>
<p class="remain">{{ 4 - files.length }}/4</p>
</div>
<x-post-form-attaches class="files" :files="files" :detachMediaFn="detachMedia"/>
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="onPollUpdate()"/>
</div>
</div>
@@ -65,7 +57,6 @@
import Vue from 'vue';
import i18n from '../../../i18n';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import getFace from '../../../common/scripts/get-face';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import { parse } from '../../../../../mfm/parse';
@@ -74,13 +65,14 @@ import { erase, unique } from '../../../../../prelude/array';
import { length } from 'stringz';
import { toASCII } from 'punycode';
import extractMentions from '../../../../../misc/extract-mentions';
import XPostFormAttaches from '../../../common/views/components/post-form-attaches.vue';
export default Vue.extend({
i18n: i18n('desktop/views/components/post-form.vue'),
components: {
XDraggable,
MkVisibilityChooser
MkVisibilityChooser,
XPostFormAttaches
},
props: {
@@ -640,17 +632,14 @@ export default Vue.extend({
border solid 4px transparent
cursor move
&:hover > .remove
display block
> .img
width 64px
height 64px
background-size cover
background-position center center
background-color: rgba(128, 128, 128, 0.3)
> .remove
display none
position absolute
top -6px
right -6px

View File

@@ -4,7 +4,7 @@
<fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}
</div>
<div class="is-remote" v-if="user.host != null" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }">
<fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a>
<fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a>
</div>
<div class="main">
<x-header class="header" :user="user"/>

View File

@@ -1,7 +1,7 @@
<template>
<div class="header" :class="{ shadow: $store.state.device.useShadow, round: $store.state.device.roundedCorners }">
<div class="banner-container" :style="style">
<div class="banner" ref="banner" :style="style" @click="onBannerClick"></div>
<div class="banner" ref="banner" :style="style"></div>
<div class="fade"></div>
<div class="title">
<p class="name">
@@ -105,14 +105,6 @@ export default Vue.extend({
if (blur <= 10) banner.style.filter = `blur(${blur}px)`;
},
onBannerClick() {
if (!this.$store.getters.isSignedIn || this.$store.state.i.id != this.user.id) return;
this.$updateBanner().then(i => {
this.user.bannerUrl = i.bannerUrl;
});
},
menu() {
this.$root.new(XUserMenu, {
source: this.$refs.menu,
@@ -171,9 +163,6 @@ export default Vue.extend({
> .menu
height 100%
display block
position absolute
left -42px
padding 0 14px
color #fff
text-shadow 0 0 8px #000

View File

@@ -36,13 +36,13 @@ export default Vue.extend({
includeReplies: this.mode == 'with-replies',
includeMyRenotes: this.mode != 'my-posts',
withFiles: this.mode == 'with-media',
untilId: cursor ? cursor : undefined
untilDate: cursor ? cursor : new Date().getTime() + 1000 * 86400 * 365
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
return {
notes: notes,
cursor: notes[notes.length - 1].id
cursor: new Date(notes[notes.length - 1].createdAt).getTime()
};
} else {
return {

View File

@@ -12,7 +12,7 @@ import parseAcct from '../../../../../misc/acct/parse';
import getUserName from '../../../../../misc/get-user-name';
export default Vue.extend({
i18n: i18n('.vue'),
i18n: i18n(),
components: {
XMessagingRoom: () => import('../../../common/views/components/messaging-room.vue').then(m => m.default)
},
@@ -51,7 +51,7 @@ export default Vue.extend({
this.user = user;
this.fetching = false;
document.title = `メッセージ: ${getUserName(this.user)}`;
document.title = this.$t('@.messaging') + ': ' + getUserName(this.user);
Progress.done();
});

View File

@@ -1,7 +1,7 @@
<template>
<div class="mkw-messaging">
<ui-container :show-header="props.design == 0">
<template #header><fa icon="comments"/>{{ $t('title') }}</template>
<template #header><fa icon="comments"/>{{ $t('@.messaging') }}</template>
<template #func><button @click="add"><fa icon="plus"/></button></template>
<x-messaging ref="index" compact @navigate="navigate"/>
@@ -21,7 +21,7 @@ export default define({
design: 0
})
}).extend({
i18n: i18n('desktop/views/widgets/messaging.vue'),
i18n: i18n(''),
components: {
XMessaging: () => import('../../../common/views/components/messaging.vue').then(m => m.default)
},

View File

@@ -11,7 +11,9 @@
<div class="mkw-polls--body">
<div class="poll" v-if="!fetching && poll != null">
<p v-if="poll.text"><router-link :to="poll | notePage">{{ poll.text }}</router-link></p>
<p v-if="poll.text"><router-link :to="poll | notePage">
<mfm :text="poll.text" :author="poll.user" :custom-emojis="poll.emojis"/>
</router-link></p>
<p v-if="!poll.text"><router-link :to="poll | notePage"><fa icon="link"/></router-link></p>
<mk-poll :note="poll"/>
</div>

View File

@@ -1,9 +1,9 @@
@charset "utf-8";
/**
* Boot screen style
*/
@charset 'utf-8';
html {
font-family: sans-serif;
}

View File

@@ -16,11 +16,11 @@ import App from './app.vue';
import checkForUpdate from './common/scripts/check-for-update';
import MiOS from './mios';
import { version, codename, lang, locale } from './config';
import { builtinThemes, applyTheme, blackTheme } from './theme';
import { builtinThemes, applyTheme, futureTheme } from './theme';
import Dialog from './common/views/components/dialog.vue';
if (localStorage.getItem('theme') == null) {
applyTheme(blackTheme);
applyTheme(futureTheme);
}
//#region FontAwesome

View File

@@ -1,11 +1,7 @@
<template>
<div class="pyvicwrksnfyhpfgkjwqknuururpaztw">
<div class="preview">
<img v-if="kind == 'image'" ref="img"
:src="file.url"
:alt="file.name"
:title="file.name"
:style="style">
<x-file-thumbnail class="preview" :file="file" :detail="true"/>
<template v-if="kind != 'image'"><fa icon="file"/></template>
<footer v-if="kind == 'image' && file.properties && file.properties.width && file.properties.height">
<span class="size">
@@ -38,7 +34,7 @@
<div class="menu">
<div>
<ui-input readonly :value="file.url">URL</ui-input>
<ui-button link :href="`${file.url}?download`" :download="file.name"><fa icon="download"/> {{ $t('download') }}</ui-button>
<ui-button link :href="dlUrl" :download="file.name"><fa icon="download"/> {{ $t('download') }}</ui-button>
<ui-button @click="rename"><fa icon="pencil-alt"/> {{ $t('rename') }}</ui-button>
<ui-button @click="move"><fa :icon="['far', 'folder-open']"/> {{ $t('move') }}</ui-button>
<ui-button @click="toggleSensitive" v-if="file.isSensitive"><fa :icon="['far', 'eye']"/> {{ $t('unmark-as-sensitive') }}</ui-button>
@@ -61,11 +57,17 @@
import Vue from 'vue';
import i18n from '../../../i18n';
import { gcd } from '../../../../../prelude/math';
import { appendQuery } from '../../../../../prelude/url';
import XFileThumbnail from '../../../common/views/components/drive-file-thumbnail.vue';
export default Vue.extend({
i18n: i18n('mobile/views/components/drive.file-detail.vue'),
props: ['file'],
components: {
XFileThumbnail
},
data() {
return {
gcd,
@@ -86,6 +88,10 @@ export default Vue.extend({
return this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? {
'background-color': `rgb(${ this.file.properties.avgColor.join(',') })`
} : {};
},
dlUrl(): string {
return appendQuery(this.file.url, 'download');
}
},
@@ -142,12 +148,13 @@ export default Vue.extend({
padding 8px
background var(--bg)
> img
display block
> .preview
width fit-content
max-width 100%
max-height 300px
margin 0 auto
box-shadow 1px 1px 4px rgba(#000, 0.2)
overflow hidden
color var(--driveFileIcon)
> footer
padding 8px 8px 0 8px

View File

@@ -1,7 +1,7 @@
<template>
<a class="vupkuhvjnjyqaqhsiogfbywvjxynrgsm" @click.prevent="onClick" :href="`/i/drive/file/${ file.id }`" :data-is-selected="isSelected">
<div class="container">
<div class="thumbnail" :style="thumbnail"></div>
<x-file-thumbnail class="thumbnail" :file="file" fit="cover"/>
<div class="body">
<p class="name">
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
@@ -26,9 +26,14 @@
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
import XFileThumbnail from '../../../common/views/components/drive-file-thumbnail.vue';
export default Vue.extend({
i18n: i18n('mobile/views/components/drive.file.vue'),
props: ['file'],
components: {
XFileThumbnail
},
data() {
return {
isSelected: false
@@ -37,12 +42,6 @@ export default Vue.extend({
computed: {
browser(): any {
return this.$parent;
},
thumbnail(): any {
return {
'background-color': this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent',
'background-image': `url(${this.file.thumbnailUrl})`
};
}
},
created() {
@@ -74,9 +73,12 @@ export default Vue.extend({
pointer-events none
> .container
display grid
max-width 500px
margin 0 auto
padding 16px
grid-template-columns 64px 1fr
grid-column-gap 10px
&:after
content ""
@@ -84,18 +86,13 @@ export default Vue.extend({
clear both
> .thumbnail
display block
float left
width 64px
height 64px
background-size cover
background-position center center
color var(--driveFileIcon)
> .body
display block
float left
width calc(100% - 74px)
margin-left 10px
word-break break-all
> .name
display block
@@ -104,8 +101,7 @@ export default Vue.extend({
font-size 0.9em
font-weight bold
color var(--text)
text-overflow ellipsis
overflow-wrap break-word
word-break break-word
> .ext
opacity 0.5
@@ -154,6 +150,6 @@ export default Vue.extend({
background var(--primary)
&, *
color #fff !important
color var(--primaryForeground) !important
</style>

View File

@@ -7,6 +7,7 @@
</div>
<a class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else
:href="video.url"
rel="nofollow noopener"
target="_blank"
:style="imageStyle"
:title="video.name"

View File

@@ -40,7 +40,7 @@
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="map" v-if="appearNote.geo" ref="map"></div>
<div class="renote" v-if="appearNote.renote">
<mk-note-preview :note="appearNote.renote"/>

View File

@@ -32,7 +32,7 @@
</div>
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="true"/>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" rel="noopener" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
</div>
<span class="app" v-if="appearNote.app && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span>

View File

@@ -151,6 +151,7 @@ export default Vue.extend({
// オーバーフローしたら古い投稿は捨てる
if (this.notes.length >= displayLimit) {
this.notes = this.notes.slice(0, displayLimit);
this.cursor = this.notes[this.notes.length - 1].id
}
} else {
this.queue.push(note);
@@ -159,6 +160,7 @@ export default Vue.extend({
append(note) {
this.notes.push(note);
this.cursor = this.notes[this.notes.length - 1].id
},
releaseQueue() {

View File

@@ -21,13 +21,7 @@
</div>
<input v-show="useCw" ref="cw" v-model="cw" :placeholder="$t('annotations')" v-autocomplete="{ model: 'cw' }">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder" v-autocomplete="{ model: 'text' }"></textarea>
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id">
<div class="img" :style="`background-image: url(${file.thumbnailUrl})`" @click="detachMedia(file)"></div>
</div>
</x-draggable>
</div>
<x-post-form-attaches class="attaches" :files="files"/>
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="onPollUpdate()"/>
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
<footer>
@@ -57,7 +51,6 @@
import Vue from 'vue';
import i18n from '../../../i18n';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import getFace from '../../../common/scripts/get-face';
import { parse } from '../../../../../mfm/parse';
@@ -66,11 +59,12 @@ import { erase, unique } from '../../../../../prelude/array';
import { length } from 'stringz';
import { toASCII } from 'punycode';
import extractMentions from '../../../../../misc/extract-mentions';
import XPostFormAttaches from '../../../common/views/components/post-form-attaches.vue';
export default Vue.extend({
i18n: i18n('mobile/views/components/post-form.vue'),
components: {
XDraggable
XPostFormAttaches
},
props: {
@@ -264,8 +258,8 @@ export default Vue.extend({
this.$emit('change-attached-files', this.files);
},
detachMedia(file) {
this.files = this.files.filter(x => x.id != file.id);
detachMedia(id) {
this.files = this.files.filter(x => x.id != id);
this.$emit('change-attached-files', this.files);
},
@@ -481,32 +475,6 @@ export default Vue.extend({
min-width 100%
min-height 80px
> .attaches
> .files
display block
margin 0
padding 4px
list-style none
&:after
content ""
display block
clear both
> .file
display block
float left
margin 0
padding 0
border solid 4px transparent
> .img
width 64px
height 64px
background-size cover
background-position center center
> .mk-uploader
margin 8px 0 0 0
padding 8px

View File

@@ -21,13 +21,13 @@ export default Vue.extend({
userId: this.user.id,
limit: fetchLimit + 1,
withFiles: this.withMedia,
untilId: cursor ? cursor : undefined
untilDate: cursor ? cursor : new Date().getTime() + 1000 * 86400 * 365
}).then(notes => {
if (notes.length == fetchLimit + 1) {
notes.pop();
return {
notes: notes,
cursor: notes[notes.length - 1].id
cursor: new Date(notes[notes.length - 1].createdAt).getTime()
};
} else {
return {

View File

@@ -5,7 +5,7 @@
</template>
<div class="wwtwuxyh" v-if="!fetching">
<div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</p></div>
<div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div>
<div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" rel="nofollow noopener" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div>
<header>
<div class="banner" :style="style"></div>
<div class="body">

View File

@@ -26,6 +26,7 @@ button
*
pointer-events none
user-select none
&[disabled]
cursor default

View File

@@ -10,26 +10,26 @@ export type Theme = {
props: { [key: string]: string };
};
export const lightTheme: Theme = require('../theme/light.json5');
export const darkTheme: Theme = require('../theme/dark.json5');
export const pinkTheme: Theme = require('../theme/pink.json5');
export const blackTheme: Theme = require('../theme/black.json5');
export const halloweenTheme: Theme = require('../theme/halloween.json5');
export const cafeTheme: Theme = require('../theme/cafe.json5');
export const japaneseSushiSetTheme: Theme = require('../theme/japanese-sushi-set.json5');
export const gruvboxDarkTheme: Theme = require('../theme/gruvbox-dark.json5');
export const monokaiTheme: Theme = require('../theme/monokai.json5');
export const colorfulTheme: Theme = require('../theme/colorful.json5');
export const rainyTheme: Theme = require('../theme/rainy.json5');
export const mauveTheme: Theme = require('../theme/mauve.json5');
export const grayTheme: Theme = require('../theme/gray.json5');
export const tweetDeckTheme: Theme = require('../theme/tweet-deck.json5');
export const lightTheme: Theme = require('../themes/light.json5');
export const darkTheme: Theme = require('../themes/dark.json5');
export const lavenderTheme: Theme = require('../themes/lavender.json5');
export const futureTheme: Theme = require('../themes/future.json5');
export const halloweenTheme: Theme = require('../themes/halloween.json5');
export const cafeTheme: Theme = require('../themes/cafe.json5');
export const japaneseSushiSetTheme: Theme = require('../themes/japanese-sushi-set.json5');
export const gruvboxDarkTheme: Theme = require('../themes/gruvbox-dark.json5');
export const monokaiTheme: Theme = require('../themes/monokai.json5');
export const colorfulTheme: Theme = require('../themes/colorful.json5');
export const rainyTheme: Theme = require('../themes/rainy.json5');
export const mauveTheme: Theme = require('../themes/mauve.json5');
export const grayTheme: Theme = require('../themes/gray.json5');
export const tweetDeckTheme: Theme = require('../themes/tweet-deck.json5');
export const builtinThemes = [
lightTheme,
darkTheme,
pinkTheme,
blackTheme,
lavenderTheme,
futureTheme,
halloweenTheme,
cafeTheme,
japaneseSushiSetTheme,

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -153,6 +153,8 @@
messagingRoomMessageBg: '$secondary',
messagingRoomMessageFg: '#fff',
driveFileIcon: '$text',
formButtonBorder: 'rgba(255, 255, 255, 0.1)',
formButtonHoverBg: ':alpha<0.2<$primary',
formButtonHoverBorder: ':alpha<0.5<$primary',

View File

@@ -8,13 +8,13 @@
base: 'dark',
vars: {
c0: '#0c0c0c',
c0: '#0e0e0e',
c1: 'rgb(255, 105, 78)',
c2: 'rgb(99, 197, 210)',
c4: 'rgb(253, 254, 214)',
c3: 'rgb(204, 254, 253)',
primary: '$c1',
secondary: '#131313',
secondary: '#191919',
text: '$c3',
},
@@ -24,7 +24,7 @@
noteHeaderAcct: ':alpha<0.65<$c4',
noteHeaderInfo: ':alpha<0.5<$c4',
subNoteText: ':alpha<0.7<$c4',
renoteGradient: 'rgba(0, 0, 0, 0)',
renoteGradient: '$secondary',
renoteText: '$c2',
quoteBorder: '$c2',
mfmHashtag: '$c1',

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