Compare commits

..

68 Commits

Author SHA1 Message Date
syuilo
a2a31236f6 10.78.5 2019-01-23 05:37:37 +09:00
syuilo
0b191b4d0e Merge pull request #3959 from syuilo/l10n_develop
New Crowdin translations
2019-01-23 05:33:51 +09:00
syuilo
2e97f29411 Merge branch 'develop' of https://github.com/syuilo/misskey into develop 2019-01-23 05:30:12 +09:00
syuilo
eb1ad54427 Clean up 2019-01-23 05:30:02 +09:00
syuilo
e4974392e5 🎨 2019-01-23 05:25:46 +09:00
dependabot[bot]
4e0d43b45a Update progress-bar-webpack-plugin requirement from 1.11.0 to 1.12.0 (#3962)
Updates the requirements on [progress-bar-webpack-plugin](https://github.com/clessg/progress-bar-webpack-plugin) to permit the latest version.
- [Release notes](https://github.com/clessg/progress-bar-webpack-plugin/releases)
- [Commits](https://github.com/clessg/progress-bar-webpack-plugin/commits/v1.12.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-23 05:24:23 +09:00
syuilo
78c185a05a [Client] Improve usability 2019-01-23 05:20:28 +09:00
MeiMei
fa124abbe2 Supports Twemoji / CustomEmoji in poll (#3960)
* Supports Twemoji / CustomEmoji in poll

* extract emojis in polls
2019-01-23 04:49:16 +09:00
syuilo
f4fa3f031e New translations ja-JP.yml (Korean) 2019-01-22 22:43:09 +09:00
syuilo
3cc7a99d0f New translations ja-JP.yml (Korean) 2019-01-22 22:34:27 +09:00
syuilo
8bf9e87117 Fix types 2019-01-22 21:42:05 +09:00
syuilo
97e8ac1d27 [Client] Fix bug 2019-01-22 21:32:51 +09:00
syuilo
45fb2ecb3a [Client] Fix UI 2019-01-22 21:25:37 +09:00
syuilo
d5e80caac8 [Server] Fix #3958 2019-01-22 21:21:47 +09:00
Acid Chicken (硫酸鶏)
7ceea61170 Create CODEOWNERS (#3882)
* Create CODEOWNERS

* Update CODEOWNERS

* Update CODEOWNERS

* Update CODEOWNERS
2019-01-22 20:56:55 +09:00
syuilo
a3ce65ee28 Merge pull request #3956 from syuilo/l10n_develop
New Crowdin translations
2019-01-22 20:56:10 +09:00
syuilo
d6b7a048e4 Merge branches 'develop', 'develop', 'develop' and 'develop' of https://github.com/syuilo/misskey into develop 2019-01-22 18:31:16 +09:00
syuilo
f7c8e31b36 Update mfm.ts 2019-01-22 18:30:58 +09:00
syuilo
26c327145f [Test] Add streaming test
#3955
2019-01-22 18:30:49 +09:00
syuilo
b7afd07d6a New translations ja-JP.yml (Chinese Simplified) 2019-01-22 18:11:53 +09:00
syuilo
eaff52548f New translations ja-JP.yml (Chinese Simplified) 2019-01-22 17:52:48 +09:00
syuilo
76828adc54 New translations ja-JP.yml (Chinese Simplified) 2019-01-22 17:42:35 +09:00
syuilo
198b0b3de3 New translations ja-JP.yml (Chinese Simplified) 2019-01-22 17:34:17 +09:00
syuilo
3cdee2732a New translations ja-JP.yml (Chinese Simplified) 2019-01-22 17:22:13 +09:00
syuilo
27a7bb7229 New translations ja-JP.yml (Chinese Simplified) 2019-01-22 17:15:40 +09:00
Stanislas
cf38a6d0a0 Little english improvements (#3931)
* Little english improvements

* Revert incorrect fix
2019-01-22 16:04:37 +09:00
syuilo
02c88f9b3b Merge pull request #3954 from syuilo/l10n_develop
New Crowdin translations
2019-01-22 15:35:47 +09:00
syuilo
3ac1077b36 New translations ja-JP.yml (French) 2019-01-22 15:32:15 +09:00
syuilo
2b4f6abc15 New translations ja-JP.yml (French) 2019-01-22 15:22:17 +09:00
syuilo
7bd24348d2 New translations ja-JP.yml (French) 2019-01-22 15:11:55 +09:00
dependabot[bot]
c49ae672f2 Update @types/koa-router requirement from 7.0.35 to 7.0.38 (#3951)
Updates the requirements on [@types/koa-router](https://github.com/DefinitelyTyped/DefinitelyTyped) to permit the latest version.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-22 08:08:29 +09:00
dependabot[bot]
2eb2cc7880 Update nodemailer requirement from 5.0.0 to 5.1.1 (#3950)
Updates the requirements on [nodemailer](https://github.com/nodemailer/nodemailer) to permit the latest version.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodemailer/nodemailer/commits/v5.1.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-22 08:08:21 +09:00
dependabot[bot]
f2f3d4beec Update typescript requirement from 3.2.2 to 3.2.4 (#3953)
Updates the requirements on [typescript](https://github.com/Microsoft/TypeScript) to permit the latest version.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/commits/v3.2.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-22 08:08:02 +09:00
dependabot[bot]
3fd1ea900a Update vue-loader requirement from 15.4.2 to 15.5.1 (#3952)
Updates the requirements on [vue-loader](https://github.com/vuejs/vue-loader) to permit the latest version.
- [Release notes](https://github.com/vuejs/vue-loader/releases)
- [Changelog](https://github.com/vuejs/vue-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-loader/commits/v15.5.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-22 08:07:37 +09:00
syuilo
c815d11ed2 10.78.4 2019-01-21 21:55:18 +09:00
syuilo
350151ca5b Merge pull request #3945 from syuilo/l10n_develop
New Crowdin translations
2019-01-21 21:52:34 +09:00
syuilo
4339f9af29 [Server] Fix #3947 2019-01-21 21:51:58 +09:00
syuilo
b44227948d Add unique index
#3946
2019-01-21 21:45:11 +09:00
syuilo
5dc8c8846d New translations ja-JP.yml (Norwegian) 2019-01-21 21:05:29 +09:00
syuilo
e1bee8adf3 New translations ja-JP.yml (Dutch) 2019-01-21 21:05:23 +09:00
syuilo
b9ef750321 New translations ja-JP.yml (Japanese, Kansai) 2019-01-21 21:05:17 +09:00
syuilo
e05c0e7d37 New translations ja-JP.yml (Spanish) 2019-01-21 21:05:11 +09:00
syuilo
a3eb0ddc4f New translations ja-JP.yml (Russian) 2019-01-21 21:05:04 +09:00
syuilo
da6e71f2e0 New translations ja-JP.yml (Portuguese) 2019-01-21 21:04:59 +09:00
syuilo
09e08e829d New translations ja-JP.yml (Polish) 2019-01-21 21:04:54 +09:00
syuilo
1b78ae6290 New translations ja-JP.yml (Korean) 2019-01-21 21:04:48 +09:00
syuilo
97f5ba0bc5 New translations ja-JP.yml (Italian) 2019-01-21 21:04:41 +09:00
syuilo
8e29ccdc7f New translations ja-JP.yml (German) 2019-01-21 21:04:34 +09:00
syuilo
4e48214068 New translations ja-JP.yml (French) 2019-01-21 21:04:28 +09:00
syuilo
1bd128d507 New translations ja-JP.yml (English) 2019-01-21 21:04:24 +09:00
syuilo
bfc1f8a25d New translations ja-JP.yml (Chinese Simplified) 2019-01-21 21:04:17 +09:00
syuilo
6369d79aaf New translations ja-JP.yml (Catalan) 2019-01-21 21:04:12 +09:00
syuilo
2df2cf0983 [Client] Fix #3321 2019-01-21 21:03:55 +09:00
syuilo
c93fe423ea [API] Fix bug 2019-01-21 21:01:04 +09:00
syuilo
ecac2990eb [Client] Fix bug 2019-01-21 20:56:10 +09:00
syuilo
a483af1b08 10.78.3 2019-01-21 17:28:53 +09:00
syuilo
01584a6bf9 Fix 404 2019-01-21 17:25:36 +09:00
syuilo
443f967611 Update reversi.vue 2019-01-21 17:20:41 +09:00
syuilo
bf931f2c82 🎨 2019-01-21 17:19:00 +09:00
MeiMei
5b32b900e4 投票未対応インスタンス向けメッセージをわかりやすくする (#3944)
* Poll message

* fix

* fix

* とりあえず日本語にしちゃう

* TODO

* fix
2019-01-21 16:34:17 +09:00
Acid Chicken (硫酸鶏)
0bdcb15b3b Re: Fix routing
本当に申し訳ありませんでした。
2019-01-21 15:52:25 +09:00
Acid Chicken (硫酸鶏)
1b316ab98b Update README.md [AUTOGEN] (#3943) 2019-01-21 15:46:59 +09:00
syuilo
4cd79dd530 Update README.md 2019-01-21 15:40:58 +09:00
syuilo
c204e0518f 10.78.2 2019-01-21 15:32:01 +09:00
syuilo
129d74b463 [Server] ストリームで流れてくる投稿とAPIでタイムラインを取得したときとの不一致を修正 2019-01-21 15:31:19 +09:00
Acid Chicken (硫酸鶏)
533540031b Fix comment URL 2019-01-21 15:20:44 +09:00
Acid Chicken (硫酸鶏)
5ea0ccea22 Fix routing 2019-01-21 15:19:43 +09:00
Acid Chicken (硫酸鶏)
d2c12af085 Fix routing 2019-01-21 15:18:42 +09:00
57 changed files with 364 additions and 211 deletions

39
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,39 @@
# PATH OWNERS
/.autogen/ @acid-chicken
/.circleci/ @syuilo @acid-chicken
/.config/ @syuilo @AyaMorisawa @mei23 @acid-chicken
# /.config/mongo_initdb_example.js @khws4v1
/.github/ @syuilo @AyaMorisawa @acid-chicken
/.vscode/ @acid-chicken
/assets/ @syuilo # @tamaina
/cli/ @syuilo
/docs/ @syuilo
/docs/*.en.md @AyaMorisawa # @skid9000
# /docs/*.fr.md @BoFFire
# /docs/docker.*.md @khws4v1
/locales/ @syuilo
/src/ @syuilo @AyaMorisawa @mei23 @acid-chicken
# /src/crypto_key.cc @akihikodaki
# /src/crypto_key.d.ts @akihikodaki
/.dockerignore @syuilo # @khws4v1
/.editorconfig @syuilo @AyaMorisawa
/.eslintrc @syuilo
/.gitattributes @syuilo
/.gitignore @syuilo
/.npmrc @syuilo
/.vsls.json @AyaMorisawa
/CHANGELOG.md @syuilo
/CODE_OF_CONDUCT.md @syuilo
/CONTRIBUTING.md @syuilo
/Dockerfile @syuilo @AyaMorisawa @acid-chicken # @khws4v1
/LICENSE @syuilo
/README.md @syuilo @AyaMorisawa @acid-chicken # @nikhiljha
# /binding.gyp @akihikodaki
/crowdin.yml @syuilo
# /docker-compose.yml @khws4v1
/gulpfile.ts @syuilo @AyaMorisawa
/jsconfig.json @syuilo @AyaMorisawa
/package.json @syuilo @AyaMorisawa
/tsconfig.json @syuilo @AyaMorisawa
/tslint.json @syuilo @AyaMorisawa
/webpack.config.ts @syuilo @AyaMorisawa

View File

@@ -1,6 +1,30 @@
ChangeLog
=========
10.78.5
----------
* アンケートの選択肢にカスタム絵文字を使えるように
* 投稿の返信を取得したときにミュートが適用されていない問題を修正
* ユーザビリティの強化
10.78.4
----------
* フォロワー限定投稿がユーザータイムラインに含まれていない問題を修正
* データベースのインデックス設定を修正
* UIの修正
* など
10.78.3
----------
* 投票未対応インスタンス向けメッセージをわかりやすく
* リバーシが404になる問題を修正
* デザインの修正
10.78.2
----------
* リバーシが404になる問題を修正
* ストリームで流れてくる投稿とAPIでタイムラインを取得したときとの不一致を修正
10.78.1
----------
* 「関係のない返信がタイムラインに流れる問題を修正」を取り消し

View File

@@ -13,7 +13,7 @@
<a href="https://misskey.xyz">Misskey</a> is a decentralized microblogging platform born on Earth.
Since it exists within the Fediverse (a universe where various social media platforms are organized),
it is mutually linked with other social media platforms.
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find instance!</a>
Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet? <a href="https://joinmisskey.github.io/">Find an instance!</a>
</p>
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
@@ -61,7 +61,7 @@ Organize and store your files! Want to post a picture you have already uploaded?
...and more! Experience Misskey with your own eyes at [misskey.xyz](https://misskey.xyz) or join one of the [other instances](https://joinmisskey.github.io/) that are available.
:package: Create Your Own Instance
:package: Create your own instance
----------------------------------------------------------------
Please see the [Setup and Installation Guide](./docs/setup.en.md).
@@ -69,6 +69,22 @@ Please see the [Setup and Installation Guide](./docs/setup.en.md).
----------------------------------------------------------------
Please see the [Contribution Guide](./CONTRIBUTING.md).
### Collaborators
<table>
<tr>
<td><img src="https://avatars3.githubusercontent.com/u/4439005?s=460&v=4" alt="syuilo" width="100"></td>
<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>
</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>
</tr>
</table>
:heart: Backers & Sponsors
----------------------------------------------------------------
<!-- PATREON_START -->
@@ -95,7 +111,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><img src="https://c8.patreon.com/2/200/16542964" alt="Takumi Sugita" 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/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/8241184/39e18850e87a449e9c9a71acb3310ebd/2?token-time=2145916800&token-hash=zrInDotuEIFslKphuSiCqr3M-r-rveTXjVKWr-VK6M0%3D" alt="Acid Chicken" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%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/10789744/97175095d8f04c0f86225ff47cb98d40/1?token-time=2145916800&token-hash=ubVARikVOg3v7NW6LDhtG-ClE1LTU3I2TJ3js2-5xDs%3D" alt="Naoki Hirayama" width="100"></td>
@@ -122,7 +138,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
</tr></table>
**Last updated:** Fri, 18 Jan 2019 11:58:06 UTC
**Last updated:** Mon, 21 Jan 2019 06:45:06 UTC
<!-- PATREON_END -->
:four_leaf_clover: Copyright

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "Unblock"
push-to-list: "Add to list"
select-list: "Select a list"
list-pushed: "Successfully added {user} to {list}."
report-abuse: "Report abuse"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
delete-confirm: "Supprimer cette publication ?"
remote: "Afficher la note originale"
common/views/components/user-menu.vue:
mention: "メンション"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
mention: "Mention"
mute: "Silencier"
unmute: "Enlever la sourdine"
block: "Bloquer"
unblock: "Débloquer"
push-to-list: "Ajouter à une liste"
select-list: "Sélectionnez une liste"
report-abuse: "Signaler un abus"
report-abuse-detail: "Détail du signalement"
report-abuse-reported: "Transmit à ladministrateur. Merci de votre collaboration."
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
vote-count: "{} votes"
@@ -491,7 +490,7 @@ common/views/components/profile-editor.vue:
is-bot: "Ce compte est un Bot"
is-locked: "Demandes dabonnements requièrent lapprobation"
careful-bot: "Les demandes dabonnements venant de Bots requièrent lapprobation"
auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する"
auto-accept-followed: "Accepter automatiquement les demandes dabonnement venant des gens que vous suivez"
advanced: "Avancé"
privacy: "Vie privée"
save: "Mettre à jour le profil"
@@ -990,7 +989,7 @@ admin/views/index.vue:
federation: "Fédération"
announcements: "Annonces"
hashtags: "Hashtags"
abuse: "スパム報告"
abuse: "Abus"
back-to-misskey: "Retour vers Misskey"
admin/views/dashboard.vue:
dashboard: "Tableau de bord"
@@ -1001,11 +1000,11 @@ admin/views/dashboard.vue:
this-instance: "Cette instance"
federated: "Fédérées"
admin/views/abuse.vue:
title: "スパム報告"
target: "対象"
reporter: "報告者"
details: "詳細"
remove-report: "削除"
title: "Abus"
target: "Cible"
reporter: "Signalé par"
details: "Détails"
remove-report: "Supprimer"
admin/views/instance.vue:
instance: "Instance"
instance-name: "Nom de linstance"
@@ -1052,7 +1051,7 @@ admin/views/instance.vue:
max-note-text-length: "Nombre maximal de caractères pour les messages"
disable-registration: "Désactiver les inscriptions"
disable-local-timeline: "Désactiver le fil local"
disable-global-timeline: "グローバルタイムラインを無効にする"
disable-global-timeline: "Désactiver le fil global"
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
invite: "Inviter"
save: "Sauvegarder"
@@ -1106,10 +1105,10 @@ admin/views/charts.vue:
network-time: "Temps de réponse"
network-usage: "Traffic"
admin/views/drive.vue:
operation: "操作"
fileid-or-url: "ファイルIDまたはファイルURL"
file-not-found: "ファイルが見つかりません"
lookup: "照会"
operation: "Actions"
fileid-or-url: "ID du fichier ou URL"
file-not-found: "Fichier non trouvé"
lookup: "Recherche"
sort:
title: "Tri"
createdAtAsc: "Âge - Du plus ancien"
@@ -1125,8 +1124,8 @@ admin/views/drive.vue:
deleted: "Supprimé"
mark-as-sensitive: "Marquer comme sensible"
unmark-as-sensitive: "Ne pas marquer comme sensible"
marked-as-sensitive: "閲覧注意に設定しました"
unmarked-as-sensitive: "閲覧注意を解除しました"
marked-as-sensitive: "Marqué comme sensible"
unmarked-as-sensitive: "Marqué comme non sensible"
admin/views/users.vue:
operation: "Actions"
username-or-userid: "Nom dutilisateur·rice ou ID utilisateur"
@@ -1253,7 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
no-photos: "Pas de photos"
desktop/views/pages/user/user.profile.vue:
follows-you: "Vous suit"
menu: "メニュー"
menu: "Menu"
desktop/views/pages/user/user.header.vue:
posts: "Notes"
following: "Suit"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -388,7 +388,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -27,7 +27,7 @@ common:
do-not-copy-paste: "여기에 코드를 입력하거나 붙여넣지 마십시오. 계정이 무단으로 사용될 수 있습니다."
load-more: "더보기"
enter-password: "비밀번호를 입력하여 주십시오"
2fa: "二段階認証"
2fa: "2단계 인증"
got-it: "알겠습니다"
customization-tips:
title: "커스터마이징 도움말"
@@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
delete-confirm: "이 글을 삭제하시겠습니까?"
remote: "글 원본 보기"
common/views/components/user-menu.vue:
mention: "メンション"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
mention: "멘션"
mute: "뮤트"
unmute: "뮤트 해제"
block: "차단"
unblock: "차단 해제"
push-to-list: "리스트에 추가"
select-list: "리스트를 선택하여 주십시오"
report-abuse: "스팸 신고"
report-abuse-detail: "어떤 스팸 행위를 하고 있습니까?"
report-abuse-reported: "관리자에게 보고되었습니다. 협조해주셔서 감사합니다."
common/views/components/poll.vue:
vote-to: "\"{}\"에 투표하기"
vote-count: "{}표"
@@ -990,7 +989,7 @@ admin/views/index.vue:
federation: "연합"
announcements: "공지사항"
hashtags: "해시태그"
abuse: "スパム報告"
abuse: "스팸 신고"
back-to-misskey: "Misskey로 돌아가기"
admin/views/dashboard.vue:
dashboard: "대시보드"
@@ -1001,11 +1000,11 @@ admin/views/dashboard.vue:
this-instance: "이 인스턴스"
federated: "연합"
admin/views/abuse.vue:
title: "スパム報告"
target: "対象"
reporter: "報告者"
details: "詳細"
remove-report: "削除"
title: "스팸 신고"
target: "대상"
reporter: "신고자"
details: "상세"
remove-report: "삭제"
admin/views/instance.vue:
instance: "인스턴스"
instance-name: "인스턴스 이름"
@@ -1053,7 +1052,7 @@ admin/views/instance.vue:
disable-registration: "사용자 등록 비활성화"
disable-local-timeline: "로컬 타임라인 비활성화"
disable-global-timeline: "글로벌 타임라인 비활성화"
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
disabling-timelines-info: "이 타임라인들을 비활성화해도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
invite: "초대"
save: "저장"
saved: "저장하였습니다"
@@ -1097,7 +1096,7 @@ admin/views/charts.vue:
notes-total: "글 누적 수"
users: "사용자 증감"
users-total: "사용자 누적"
active-users: "アクティブユーザー数"
active-users: "활성 사용자 수"
drive: "드라이브 사용량 증감"
drive-total: "드라이브 사용량 누적"
drive-files: "드라이브 파일 수 증감"
@@ -1106,10 +1105,10 @@ admin/views/charts.vue:
network-time: "응답시간"
network-usage: "통신량"
admin/views/drive.vue:
operation: "操作"
fileid-or-url: "ファイルIDまたはファイルURL"
file-not-found: "ファイルが見つかりません"
lookup: "照会"
operation: "작업"
fileid-or-url: "파일 ID 또는 파일 URL"
file-not-found: "파일을 찾을 수 없습니다"
lookup: "조회"
sort:
title: "정렬"
createdAtAsc: "업로드 날짜 오랜 순"
@@ -1125,8 +1124,8 @@ admin/views/drive.vue:
deleted: "삭제하였습니다"
mark-as-sensitive: "열람주의로 설정"
unmark-as-sensitive: "열람주의 해제"
marked-as-sensitive: "閲覧注意に設定しました"
unmarked-as-sensitive: "閲覧注意を解除しました"
marked-as-sensitive: "열람주의로 설정하였습니다"
unmarked-as-sensitive: "열람주의를 제거하였습니다"
admin/views/users.vue:
operation: "작업"
username-or-userid: "사용자명 혹은 사용자 ID"
@@ -1253,7 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
no-photos: "사진이 없습니다"
desktop/views/pages/user/user.profile.vue:
follows-you: "당신을 팔로우합니다"
menu: "メニュー"
menu: "메뉴"
desktop/views/pages/user/user.header.vue:
posts: "글"
following: "팔로잉"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -357,7 +357,6 @@ common/views/components/user-menu.vue:
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"

View File

@@ -3,12 +3,12 @@ meta:
lang: "中文(简体)"
divider: ""
common:
misskey: "A ⭐ of the fediverse"
about-title: "A ⭐ of the fediverse."
about: "感谢您找到Misskey. Misskey是一个开源的程序, 她可以同其他的社交网站进行联系. 为什么不从喧嚣的城市中休息一下, 来试一试这个新的程序呢?"
misskey: "Fediverse中的一颗⭐"
about-title: "Fediverse中的一颗⭐"
about: "非常感谢您找到Misskey Misskey是出生于地球上的<b>分布式微博SNS</b>。因为她处于Fediverse(由各种SNS组成的宇宙)中所以她与其他SNS相互连接。想要远离喧嚣的城市不如深入这个新的互联网来探索一下吧。"
intro:
title: "什么是 Misskey 呢?"
about: "Misskey是开源的<b>分散式微博服务</b>。复杂的完全可定制的Ui各种各样的帖子反应提供集成管理系统和其他先进功能的免费文件存储。此外网络系统称为“Fediverse”使我们能够与其他SNS的用户进行通信。比如如果你张贴一些东西那么你的帖子不仅会发送给Misskey还会发送到其他平台。想象一下行星正在向另一颗行星发送微波来进行通信。"
about: "Misskey是开源的<b>分散式微博SNS</b>。复杂的完全可定制的Ui各种各样的帖子反应提供集成管理系统和其他先进功能的免费文件存储。此外称为“Fediverse”的网络系统使我们能够与其他SNS的用户进行通信。比如如果你张贴一些东西那么你的帖子不仅会发送给Misskey还会发送到其他SNS平台。想象一下,正如一颗行星和另一颗行星通过发送微波来进行通信一样。"
features: "特点"
rich-contents: "发布"
rich-contents-desc: "您只需要发布您的想法, 热门话题或者任何您想分享的好东西. 你可以装饰你的文字, 加上你最喜欢的图片, 发送文件或者电影, 甚至创造一个投票. 这些事情您都可以在 Misskey 上做。"
@@ -27,7 +27,7 @@ common:
do-not-copy-paste: "请不要在这里输入或粘贴代码。您帐户可能会受到损害。"
load-more: "加载更多"
enter-password: "请输入您的密码"
2fa: "二段階認証"
2fa: "双重身份验证"
got-it: "没问题"
customization-tips:
title: "客制化提示"
@@ -54,7 +54,7 @@ common:
years_ago: "{}年前"
month-and-day: "{month}月 {day}日"
trash: "垃圾箱"
drive: "Misskey 云盘"
drive: "盘"
messaging: "聊天"
weekday-short:
sunday: "日"
@@ -350,17 +350,16 @@ common/views/components/note-menu.vue:
delete-confirm: "确定删除这个投稿吗?"
remote: "显示原始投稿"
common/views/components/user-menu.vue:
mention: "メンション"
mute: "ミュート"
unmute: "ミュート解除"
block: "ブロック"
unblock: "ブロック解除"
push-to-list: "リストに追加"
select-list: "リストを選択してください"
list-pushed: "{user}を{list}に追加しました"
report-abuse: "スパムを報告"
report-abuse-detail: "どのような迷惑行為を行っていますか?"
report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
mention: "提及"
mute: "静音"
unmute: "取消静音"
block: "屏蔽"
unblock: "取消屏蔽"
push-to-list: "添加至列表"
select-list: "请选择一个列表"
report-abuse: "举报垃圾邮件"
report-abuse-detail: "做了什么骚扰的行为?"
report-abuse-reported: "已报告给管理员。 非常感谢你的合作。"
common/views/components/poll.vue:
vote-to: "为\"{}\"投票"
vote-count: "{}票"
@@ -698,12 +697,12 @@ desktop/views/components/note-detail.vue:
location: "位置信息"
renote: "转发"
add-reaction: "添加一个反应"
undo-reaction: "リアクション解除"
undo-reaction: "取消反应"
desktop/views/components/note.vue:
reply: "回复"
renote: "Renote"
add-reaction: "添加一个反应"
undo-reaction: "リアクション解除"
undo-reaction: "取消反应"
detail: "详细信息"
private: "这个投稿是私密的"
deleted: "投稿已删除"
@@ -809,16 +808,16 @@ desktop/views/components/settings.vue:
show-local-renotes: "在时间线中显示Local Renote(s)"
show-maps: "显示地图以显示位置"
remain-deleted-note: "继续显示已删除的帖子"
deck-column-align: "デッキのカラムの配置"
deck-column-align: "列对齐设置"
deck-column-align-center: "中央"
deck-column-align-left: "左"
deck-column-align-flexible: "フレキシブル"
deck-column-width: "デッキのカラムの幅"
deck-column-width-narrow: ""
deck-column-width-narrower: "やや狭"
deck-column-align-flexible: "可变"
deck-column-width: "列宽度"
deck-column-width-narrow: ""
deck-column-width-narrower: "更窄"
deck-column-width-normal: "正常"
deck-column-width-wider: "やや広"
deck-column-width-wide: ""
deck-column-width-wider: "更宽"
deck-column-width-wide: ""
sound: "声音"
enable-sounds: "开启声音"
enable-sounds-desc: "收到帖子/留言时播放声音。 此设置将被存储在浏览器中。"
@@ -867,7 +866,7 @@ desktop/views/components/settings.2fa.vue:
enter-password: "请输入您的密码"
authenticator: "首先,您需要在设备上安装 Google Authenticator"
howtoinstall: "怎样安装"
token: "トークン"
token: "令牌"
scan: "然后,扫描二维码:"
done: "请输入显示在您设备上的密钥:"
submit: "提交"
@@ -990,7 +989,7 @@ admin/views/index.vue:
federation: "联合"
announcements: "公告"
hashtags: "标签"
abuse: "スパム報告"
abuse: "举报垃圾信息"
back-to-misskey: "返回 Misskey"
admin/views/dashboard.vue:
dashboard: "Dashboard"
@@ -1001,11 +1000,11 @@ admin/views/dashboard.vue:
this-instance: "此实例"
federated: "联合"
admin/views/abuse.vue:
title: "スパム報告"
target: "対象"
reporter: "告者"
details: "詳細"
remove-report: "除"
title: "举报垃圾信息"
target: "目标"
reporter: "告者"
details: "详情"
remove-report: "除"
admin/views/instance.vue:
instance: "例子"
instance-name: "实例名称"
@@ -1052,8 +1051,8 @@ admin/views/instance.vue:
max-note-text-length: "最大帖子字符数"
disable-registration: "停用新用户注册功能"
disable-local-timeline: "停用本地时间线功能"
disable-global-timeline: "グローバルタイムラインを無効にする"
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
disable-global-timeline: "禁用全局时间线"
disabling-timelines-info: "即使禁用时间线,管理员和版主仍然可用。"
invite: "邀请"
save: "保存"
saved: "保存完毕"
@@ -1075,7 +1074,7 @@ admin/views/instance.vue:
smtp-pass: "SMTP 密码"
serviceworker-config: "ServiceWorker"
enable-serviceworker: "启用ServiceWorker"
serviceworker-info: "プッシュ通知を行うには有効する必要があります。"
serviceworker-info: "您需要启用推送通知"
vapid-publickey: "VAPID公钥"
vapid-privatekey: "VAPID私钥"
vapid-info: "如果您想要启用ServiceWorker那么您需要生成VAPID秘钥。除非您已经在其他地方设置了全局node_modules位置否则您需要将其作为root用户运行"
@@ -1097,7 +1096,7 @@ admin/views/charts.vue:
notes-total: "帖子总数"
users: "用户数量:增加/减少"
users-total: "用户总数"
active-users: "アクティブユーザー数"
active-users: "活跃用户数"
drive: "存储容量:增加/减少"
drive-total: "云盘总容量"
drive-files: "云盘上的文件数:增加/减少"
@@ -1107,15 +1106,15 @@ admin/views/charts.vue:
network-usage: "网络流量"
admin/views/drive.vue:
operation: "操作"
fileid-or-url: "ファイルIDまたはファイルURL"
file-not-found: "ファイルが見つかりません"
lookup: "照会"
fileid-or-url: "文件ID或文件URL"
file-not-found: "找不到文件"
lookup: "查询"
sort:
title: "排序"
createdAtAsc: "アップロード日時が古い順"
createdAtDesc: "アップロード日時が新しい順"
sizeAsc: "サイズが小さい順"
sizeDesc: "サイズが大きい順"
createdAtAsc: "按上传时间(升序)"
createdAtDesc: "按上传时间(降序)"
sizeAsc: "按大小(升序)"
sizeDesc: "按大小(降序)"
origin:
title: "源自"
combined: "本地+远程"
@@ -1125,8 +1124,8 @@ admin/views/drive.vue:
deleted: "已删除"
mark-as-sensitive: "标记为“敏感”"
unmark-as-sensitive: "取消标记为“敏感”"
marked-as-sensitive: "閲覧注意に設定しました"
unmarked-as-sensitive: "閲覧注意を解除しました"
marked-as-sensitive: "标记为关注"
unmarked-as-sensitive: "解除关注标记"
admin/views/users.vue:
operation: "操作"
username-or-userid: "用户名或用户ID"
@@ -1151,13 +1150,13 @@ admin/views/users.vue:
updatedAtAsc: "更新时间从旧到新"
updatedAtDesc: "更新时间从新到旧"
state:
title: "状"
all: "すべて"
admin: "管理"
moderator: "モデレーター"
adminOrModerator: "管理者+モデレーター"
verified: "公式アカウント"
suspended: "凍結済み"
title: "状"
all: "全部"
admin: "管理"
moderator: "版主"
adminOrModerator: "管理员+版主"
verified: "官方认证账户"
suspended: "已冻结"
origin:
title: "源自"
combined: "本地+远程"
@@ -1171,7 +1170,7 @@ admin/views/moderators.vue:
add: "注册"
added: "已注册版主。"
remove: "解除"
removed: "モデレーター登録を解除しました"
removed: "取消注册版主"
admin/views/emoji.vue:
add-emoji:
title: "添加emoji"
@@ -1253,7 +1252,7 @@ desktop/views/pages/user/user.photos.vue:
no-photos: "没有图片"
desktop/views/pages/user/user.profile.vue:
follows-you: "关注您"
menu: "メニュー"
menu: "菜单"
desktop/views/pages/user/user.header.vue:
posts: "帖子"
following: "关注中"
@@ -1267,7 +1266,7 @@ desktop/views/pages/user/user.timeline.vue:
default: "帖子"
with-replies: "帖子与回复"
with-media: "媒体"
my-posts: "私の投稿"
my-posts: "我的帖子"
empty: "看起来这个用户还没有发布什么呢。"
desktop/views/widgets/messaging.vue:
title: "信息"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "10.78.1",
"clientVersion": "2.0.13644",
"version": "10.78.5",
"clientVersion": "2.0.13712",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -54,7 +54,7 @@
"@types/koa-logger": "3.1.1",
"@types/koa-mount": "3.0.1",
"@types/koa-multer": "1.0.0",
"@types/koa-router": "7.0.35",
"@types/koa-router": "7.0.38",
"@types/koa-send": "4.1.1",
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.3",
@@ -169,7 +169,7 @@
"ms": "2.1.1",
"nan": "2.12.1",
"nested-property": "0.0.7",
"nodemailer": "5.0.0",
"nodemailer": "5.1.1",
"nprogress": "0.2.0",
"object-assign-deep": "0.4.0",
"on-build-webpack": "0.1.0",
@@ -178,7 +178,7 @@
"parsimmon": "1.12.0",
"portscanner": "2.2.0",
"postcss-loader": "3.0.0",
"progress-bar-webpack-plugin": "1.11.0",
"progress-bar-webpack-plugin": "1.12.0",
"promise-any": "0.2.0",
"promise-limit": "2.7.0",
"promise-sequential": "1.1.1",
@@ -216,7 +216,7 @@
"ts-node": "7.0.1",
"tslint": "5.12.0",
"tslint-sonarts": "1.8.0",
"typescript": "3.2.2",
"typescript": "3.2.4",
"typescript-eslint-parser": "21.0.2",
"uglify-es": "3.3.9",
"url-loader": "1.1.2",
@@ -228,7 +228,7 @@
"vue-cropperjs": "3.0.0",
"vue-i18n": "8.7.0",
"vue-js-modal": "1.3.28",
"vue-loader": "15.4.2",
"vue-loader": "15.5.1",
"vue-marquee-text-component": "1.1.1",
"vue-router": "3.0.2",
"vue-sequential-entrance": "1.1.3",

View File

@@ -6,10 +6,10 @@
<sequential-entrance animation="entranceFromTop" delay="25">
<div v-for="report in userReports" :key="report.id" class="haexwsjc">
<ui-horizon-group inputs>
<ui-input :value="report.user | acct" type="text">
<ui-input :value="report.user | acct" type="text" readonly>
<span>{{ $t('target') }}</span>
</ui-input>
<ui-input :value="report.reporter | acct" type="text">
<ui-input :value="report.reporter | acct" type="text" readonly>
<span>{{ $t('reporter') }}</span>
</ui-input>
</ui-horizon-group>

View File

@@ -2,12 +2,32 @@
* Clipboardに値をコピー(TODO: 文字列以外も対応)
*/
export default val => {
const form = document.createElement('textarea');
form.textContent = val;
document.body.appendChild(form);
form.select();
// 空div 生成
const tmp = document.createElement('div');
// 選択用のタグ生成
const pre = document.createElement('pre');
// 親要素のCSSで user-select: none だとコピーできないので書き換える
pre.style.webkitUserSelect = 'auto';
pre.style.userSelect = 'auto';
tmp.appendChild(pre).textContent = val;
// 要素を画面外へ
const s = tmp.style;
s.position = 'fixed';
s.right = '200%';
// body に追加
document.body.appendChild(tmp);
// 要素を選択
document.getSelection().selectAllChildren(tmp);
// クリップボードにコピー
const result = document.execCommand('copy');
document.body.removeChild(form);
// 要素削除
document.body.removeChild(tmp);
return result;
};

View File

@@ -26,7 +26,7 @@
</section>
<section v-if="myGames.length > 0">
<h2>{{ $t('my-games') }}</h2>
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/games/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>
@@ -36,7 +36,7 @@
</section>
<section v-if="games.length > 0">
<h2>{{ $t('all-games') }}</h2>
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/games/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b><mk-user-name :user="g.user1"/></b> vs <b><mk-user-name :user="g.user2"/></b></span>

View File

@@ -10,6 +10,7 @@ import i18n from '../../../i18n';
import { url } from '../../../config';
import copyToClipboard from '../../../common/scripts/copy-to-clipboard';
import { concat, intersperse } from '../../../../../prelude/array';
import { faCopy } from '@fortawesome/free-regular-svg-icons';
export default Vue.extend({
i18n: i18n('common/views/components/note-menu.vue'),
@@ -30,7 +31,7 @@ export default Vue.extend({
text: this.$t('detail'),
action: this.detail
}], [{
icon: 'align-left',
icon: faCopy,
text: this.$t('copy-content'),
action: this.copyContent
}], [{
@@ -87,10 +88,18 @@ export default Vue.extend({
copyContent() {
copyToClipboard(this.note.text);
this.$root.dialog({
type: 'success',
splash: true
});
},
copyLink() {
copyToClipboard(`${url}/notes/${this.note.id}`);
this.$root.dialog({
type: 'success',
splash: true
});
},
pin() {

View File

@@ -5,7 +5,7 @@
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
<span>
<template v-if="choice.isVoted"><fa icon="check"/></template>
<span>{{ choice.text }}</span>
<mfm :text="choice.text" :should-break="false" :plain-text="true" :custom-emojis="note.emojis"/>
<span class="votes" v-if="showResult">({{ $t('vote-count').replace('{}', choice.votes) }})</span>
</span>
</li>

View File

@@ -71,10 +71,7 @@ export default Vue.extend({
});
this.$root.dialog({
type: 'success',
text: this.$t('list-pushed', {
user: this.user.name,
list: lists.find(l => l.id === listId).title
})
splash: true
});
},

View File

@@ -66,6 +66,7 @@ import XFolder from './drive.folder.vue';
import XFile from './drive.file.vue';
import contains from '../../../common/scripts/contains';
import { url } from '../../../config';
import { faCloudUploadAlt } from '@fortawesome/free-solid-svg-icons';
export default Vue.extend({
i18n: i18n('desktop/views/components/drive.vue'),
@@ -149,7 +150,7 @@ export default Vue.extend({
}, {
type: 'item',
text: this.$t('contextmenu.url-upload'),
icon: 'cloud-upload-alt',
icon: faCloudUploadAlt,
action: this.urlUpload
}]);
},

View File

@@ -23,8 +23,8 @@ export default Vue.extend({
computed: {
popout(): string {
return this.game
? `${url}/reversi/${this.game.id}`
: `${url}/reversi`;
? `${url}/games/reversi/${this.game.id}`
: `${url}/games/reversi`;
}
}
});

View File

@@ -19,10 +19,10 @@ export default Vue.extend({
methods: {
nav(game, actualNav) {
if (actualNav) {
this.$router.push(`/reversi/${game.id}`);
this.$router.push(`/games/reversi/${game.id}`);
} else {
// TODO: https://github.com/vuejs/vue-router/issues/703
this.$router.push(`/reversi/${game.id}`);
this.$router.push(`/games/reversi/${game.id}`);
}
}
}

View File

@@ -9,7 +9,6 @@
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id">{{ friend.name }}</router-link>
<p class="username">@{{ friend | acct }}</p>
</div>
<mk-follow-button class="follow-button" :user="friend"/>
</div>
</template>
<p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p>
@@ -110,9 +109,4 @@ export default Vue.extend({
color var(--text)
opacity 0.7
> .follow-button
position absolute
top 16px
right 16px
</style>

View File

@@ -50,8 +50,7 @@ export default Vue.extend({
text-align center
line-height 24px
font-size 0.8em
color #71afc7
background #eefaff
color var(--text)
border-radius 4px
> .action-form

View File

@@ -124,7 +124,6 @@ import {
faMapMarker,
faRobot,
faHourglassHalf,
faAlignLeft,
faGavel
} from '@fortawesome/free-solid-svg-icons';
@@ -257,7 +256,6 @@ library.add(
faMapMarker,
faRobot,
faHourglassHalf,
faAlignLeft,
faGavel,
farBell,

View File

@@ -19,7 +19,7 @@
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
<li><router-link to="/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
<li><router-link to="/games/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
</ul>
<ul>
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']" fixed-width/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li>

View File

@@ -20,10 +20,10 @@ export default Vue.extend({
methods: {
nav(game, actualNav) {
if (actualNav) {
this.$router.push(`/reversi/${game.id}`);
this.$router.push(`/games/reversi/${game.id}`);
} else {
// TODO: https://github.com/vuejs/vue-router/issues/703
this.$router.push(`/reversi/${game.id}`);
this.$router.push(`/games/reversi/${game.id}`);
}
}
}

View File

@@ -892,7 +892,7 @@ export const test4: Map = {
]
};
// https://misskey.xyz/reversi/5aaabf7fe126e10b5216ea09 64
// https://misskey.xyz/games/reversi/5aaabf7fe126e10b5216ea09 64
export const test5: Map = {
name: 'Test5',
category: 'Test',

View File

@@ -4,6 +4,7 @@ import db from '../db/mongodb';
const PollVote = db.get<IPollVote>('pollVotes');
PollVote.createIndex('userId');
PollVote.createIndex('noteId');
PollVote.createIndex(['userId', 'noteId'], { unique: true });
export default PollVote;
export interface IPollVote {

View File

@@ -98,7 +98,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
if (text == null) text = '';
const url = `${config.url}/notes/${note._id}`;
// TODO: i18n
text += `\n\n[リモートで投票を見る](${url})`;
text += `\n[リモートで結果を表示](${url})`;
question = `${config.url}/questions/${note._id}`;
}
@@ -109,8 +109,10 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
// Provides choices as text for AP
if (note.poll != null) {
const cs = note.poll.choices.map(c => `${c.id}: ${c.text}`);
apText += '\n';
apText += '\n----------------------------------------\n';
apText += cs.join('\n');
apText += '\n----------------------------------------\n';
apText += '番号を返信して投票';
}
if (quote) {

View File

@@ -6,7 +6,7 @@ import call from './call';
import { IUser } from '../../models/user';
import { IApp } from '../../models/app';
export default async (endpoint: IEndpoint, ctx: Koa.Context) => {
export default async (endpoint: IEndpoint, ctx: Koa.BaseContext) => {
const body = ctx.is('multipart/form-data') ? (ctx.req as any).body : ctx.request.body;
const reply = (x?: any, y?: any) => {

View File

@@ -3,7 +3,7 @@ import * as Koa from 'koa';
import config from '../../../config';
import { ILocalUser } from '../../../models/user';
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
export default function(ctx: Koa.BaseContext, user: ILocalUser, redirect = false) {
if (redirect) {
//#region Cookie
const expires = 1000 * 60 * 60 * 24 * 365; // One Year

View File

@@ -122,7 +122,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const followQuery = followings.map(f => ({
userId: f.id,
// リプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
/*// リプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
$or: [{
// リプライでない
replyId: null
@@ -137,7 +137,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}, { // または
// 自分(フォロワー)が送信したリプライ
userId: user._id
}]
}]*/
}));
const visibleQuery = user == null ? [{
@@ -169,7 +169,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
visibility: 'public',
// リプライでない
replyId: null,
//replyId: null,
// local
'_user.host': null

View File

@@ -97,7 +97,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
visibility: 'public',
// リプライでない
replyId: null,
//replyId: null,
// local
'_user.host': null

View File

@@ -1,6 +1,7 @@
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import Note, { packMany } from '../../../../models/note';
import define from '../../define';
import Mute from '../../../../models/mute';
export const meta = {
desc: {
@@ -33,13 +34,25 @@ export const meta = {
};
export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// ミュートしているユーザーを取得
const mutedUserIds = user ? (await Mute.find({
muterId: user._id
})).map(m => m.muteeId) : null;
const notes = await Note.find({
replyId: ps.noteId
}, {
limit: ps.limit,
skip: ps.offset
});
const q = {
replyId: ps.noteId
} as any;
if (mutedUserIds && mutedUserIds.length > 0) {
q['userId'] = {
$nin: mutedUserIds
};
}
const notes = await Note.find(q, {
limit: ps.limit,
skip: ps.offset
});
res(await packMany(notes, user));
}));

View File

@@ -120,7 +120,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const followQuery = followings.map(f => ({
userId: f.id,
// ストーキングしてないならリプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
/*// リプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
$or: [{
// リプライでない
replyId: null
@@ -135,7 +135,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}, { // または
// 自分(フォロワー)が送信したリプライ
userId: user._id
}]
}]*/
}));
const visibleQuery = user == null ? [{

View File

@@ -133,7 +133,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const listQuery = list.userIds.map(u => ({
userId: u,
// リプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
/*// リプライは含めない(ただし投稿者自身の投稿へのリプライ、自分の投稿へのリプライ、自分のリプライは含める)
$or: [{
// リプライでない
replyId: null
@@ -148,7 +148,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
}, { // または
// 自分(フォロワー)が送信したリプライ
userId: user._id
}]
}]*/
}));
const visibleQuery = [{

View File

@@ -4,6 +4,7 @@ import Note, { packMany } from '../../../../models/note';
import User from '../../../../models/user';
import define from '../../define';
import { countIf } from '../../../../prelude/array';
import Following from '../../../../models/following';
export const meta = {
desc: {
@@ -160,13 +161,20 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
return rej('user not found');
}
const isFollowing = me == null ? false : ((await Following.findOne({
followerId: me._id,
followeeId: user._id
})) != null);
//#region Construct query
const sort = { } as any;
const visibleQuery = me == null ? [{
visibility: { $in: [ 'public', 'home' ] }
visibility: { $in: ['public', 'home'] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
visibility: {
$in: isFollowing ? ['public', 'home', 'followers'] : ['public', 'home']
}
}, {
// myself (for specified/private)
userId: me._id

View File

@@ -33,10 +33,6 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
// Lookup user
const user = await User.findOne({
_id: ps.userId
}, {
fields: {
_id: true
}
});
if (user === null) {

View File

@@ -7,7 +7,7 @@ import { publishMainStream } from '../../../stream';
import signin from '../common/signin';
import config from '../../../config';
export default async (ctx: Koa.Context) => {
export default async (ctx: Koa.BaseContext) => {
ctx.set('Access-Control-Allow-Origin', config.url);
ctx.set('Access-Control-Allow-Credentials', 'true');

View File

@@ -9,7 +9,7 @@ import RegistrationTicket from '../../../models/registration-tickets';
import usersChart from '../../../chart/users';
import fetchMeta from '../../../misc/fetch-meta';
export default async (ctx: Koa.Context) => {
export default async (ctx: Koa.BaseContext) => {
const body = ctx.request.body as any;
const instance = await fetchMeta();

View File

@@ -10,11 +10,11 @@ import uuid = require('uuid');
import signin from '../common/signin';
import fetchMeta from '../../../misc/fetch-meta';
function getUserToken(ctx: Koa.Context) {
function getUserToken(ctx: Koa.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
}
function compareOrigin(ctx: Koa.Context) {
function compareOrigin(ctx: Koa.BaseContext) {
function normalizeUrl(url: string) {
return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : '';
}

View File

@@ -10,11 +10,11 @@ import uuid = require('uuid');
import signin from '../common/signin';
import fetchMeta from '../../../misc/fetch-meta';
function getUserToken(ctx: Koa.Context) {
function getUserToken(ctx: Koa.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
}
function compareOrigin(ctx: Koa.Context) {
function compareOrigin(ctx: Koa.BaseContext) {
function normalizeUrl(url: string) {
return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : '';
}

View File

@@ -9,11 +9,11 @@ import config from '../../../config';
import signin from '../common/signin';
import fetchMeta from '../../../misc/fetch-meta';
function getUserToken(ctx: Koa.Context) {
function getUserToken(ctx: Koa.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
}
function compareOrigin(ctx: Koa.Context) {
function compareOrigin(ctx: Koa.BaseContext) {
function normalizeUrl(url: string) {
return url.endsWith('/') ? url.substr(0, url.length - 1) : url;
}

View File

@@ -7,12 +7,12 @@ import DriveFileWebpublic, { getDriveFileWebpublicBucket } from '../../models/dr
const assets = `${__dirname}/../../server/file/assets/`;
const commonReadableHandlerGenerator = (ctx: Koa.Context) => (e: Error): void => {
const commonReadableHandlerGenerator = (ctx: Koa.BaseContext) => (e: Error): void => {
console.error(e);
ctx.status = 500;
};
export default async function(ctx: Koa.Context) {
export default async function(ctx: Koa.BaseContext) {
// Validate id
if (!mongodb.ObjectID.isValid(ctx.params.id)) {
ctx.throw(400, 'incorrect id');
@@ -26,13 +26,13 @@ export default async function(ctx: Koa.Context) {
if (file == null) {
ctx.status = 404;
await send(ctx, '/dummy.png', { root: assets });
await send(ctx as any, '/dummy.png', { root: assets });
return;
}
if (file.metadata.deletedAt) {
ctx.status = 410;
await send(ctx, '/tombstone.png', { root: assets });
await send(ctx as any, '/tombstone.png', { root: assets });
return;
}

View File

@@ -160,7 +160,7 @@ const extractPropDefRef = (props: any[]) => {
const router = new Router();
router.get('/assets/*', async ctx => {
await send(ctx, ctx.params[0], {
await send(ctx as any, ctx.params[0], {
root: `${__dirname}/../../docs/assets/`,
maxage: ms('1 days')
});

View File

@@ -51,7 +51,7 @@ const router = new Router();
//#region static assets
router.get('/assets/*', async ctx => {
await send(ctx, ctx.path, {
await send(ctx as any, ctx.path, {
root: client,
maxage: ms('7 days'),
immutable: true
@@ -60,21 +60,21 @@ router.get('/assets/*', async ctx => {
// Apple touch icon
router.get('/apple-touch-icon.png', async ctx => {
await send(ctx, '/assets/apple-touch-icon.png', {
await send(ctx as any, '/assets/apple-touch-icon.png', {
root: client
});
});
// ServiceWorker
router.get(/^\/sw\.(.+?)\.js$/, async ctx => {
await send(ctx, `/assets/sw.${ctx.params[0]}.js`, {
await send(ctx as any, `/assets/sw.${ctx.params[0]}.js`, {
root: client
});
});
// Manifest
router.get('/manifest.json', async ctx => {
await send(ctx, '/assets/manifest.json', {
await send(ctx as any, '/assets/manifest.json', {
root: client
});
});

View File

@@ -3,7 +3,7 @@ import * as request from 'request-promise-native';
import summaly from 'summaly';
import fetchMeta from '../../misc/fetch-meta';
module.exports = async (ctx: Koa.Context) => {
module.exports = async (ctx: Koa.BaseContext) => {
const meta = await fetchMeta();
try {

View File

@@ -1,5 +1,5 @@
import es from '../../db/elasticsearch';
import Note, { pack, INote } from '../../models/note';
import Note, { pack, INote, IChoice } from '../../models/note';
import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user';
import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream';
import Following from '../../models/following';
@@ -25,7 +25,7 @@ import notesChart from '../../chart/notes';
import perUserNotesChart from '../../chart/per-user-notes';
import activeUsersChart from '../../chart/active-users';
import { erase } from '../../prelude/array';
import { erase, concat } from '../../prelude/array';
import insertNoteUnread from './unread';
import registerInstance from '../register-instance';
import Instance from '../../models/instance';
@@ -157,7 +157,11 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
if (!tags || !emojis || !mentionedUsers) {
const tokens = data.text ? parse(data.text) : [];
const cwTokens = data.cw ? parse(data.cw) : [];
const combinedTokens = tokens.concat(cwTokens);
const choiceTokens = data.poll && data.poll.choices
? concat((data.poll.choices as IChoice[]).map(choice => parse(choice.text)))
: [];
const combinedTokens = tokens.concat(cwTokens).concat(choiceTokens);
tags = data.apHashtags || extractHashtags(combinedTokens);

View File

@@ -1,10 +1,17 @@
/*
* Tests of API
*
* How to run the tests:
* > mocha test/api.ts --require ts-node/register
*
* To specify test:
* > mocha test/api.ts --require ts-node/register -g 'test name'
*/
import * as http from 'http';
import * as fs from 'fs';
import * as assert from 'chai';
import * as WebSocket from 'ws';
assert.use(require('chai-http'));
const expect = assert.expect;
@@ -20,6 +27,7 @@ process.on('unhandledRejection', console.dir);
//#endregion
const app = require('../built/server/api').default;
require('../built/server').default();
const db = require('../built/db/mongodb').default;
const server = http.createServer(app.callback());
@@ -1231,4 +1239,39 @@ describe('API', () => {
expect(res).have.status(400);
}));
});
describe('streaming', () => {
it('投稿がタイムラインに流れる', done => {
const post = {
text: 'foo'
};
signup().then(me => {
const ws = new WebSocket(`ws://localhost/streaming?i=${me.token}`);
ws.on('open', () => {
ws.on('message', data => {
const msg = JSON.parse(data.toString());
if (msg.type == 'channel' && msg.body.id == 'a') {
if (msg.body.type == 'note') {
expect(msg.body.body.text).eql(post.text);
done();
}
} else if (msg.type == 'connected' && msg.body.id == 'a') {
request('/notes/create', post, me);
}
});
ws.send(JSON.stringify({
type: 'connect',
body: {
channel: 'homeTimeline',
id: 'a',
pong: true
}
}));
});
});
});
});
});

View File

@@ -1,7 +1,11 @@
/*
* Tests of MFM
*
* How to run the tests:
* > mocha test/mfm.ts --require ts-node/register
*
* To specify test:
* > mocha test/mfm.ts --require ts-node/register -g 'test name'
*/
import * as assert from 'assert';