Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
255222bfb4 | |||
9e5e3c2f2e | |||
5bd80f115f | |||
c86e1a3e9b | |||
128a201b9d | |||
b68f74f39c | |||
cd28504dd8 | |||
f762cf2770 | |||
d84cae9358 | |||
9c54721010 | |||
16f35c81a1 | |||
d0dbb62a54 | |||
9fa68f4478 | |||
0d76625868 | |||
5a8a701188 | |||
121344afbb | |||
d647cf3446 | |||
04a23b3f2f | |||
08826e1c41 | |||
2e31e3c7cb | |||
7aed50f9fa | |||
2de782dbe4 | |||
50693fbe25 | |||
9a2ff56a79 | |||
daed63d66c | |||
f2241a47b7 | |||
de95aac59b | |||
8612ac0c6a | |||
2118e500a8 | |||
a7063eab85 | |||
5b5ae0e47f | |||
b19ecc1a0d | |||
ac9223957f | |||
e580adc41e | |||
607a105b78 | |||
cc601cf600 | |||
be9f6ad294 | |||
a2952c02cf | |||
244d567b3a | |||
61a9ad23f1 | |||
4f7c19461e | |||
4ba6e1c2b2 | |||
864d1a39cd | |||
e14f244e83 |
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "I prefer sushi rather than pudding"
|
i-like-sushi: "I prefer sushi rather than pudding"
|
||||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||||
verified-user: "Verified user"
|
verified-user: "Verified user"
|
||||||
|
disable-animated-mfm: "Disable animated texts in a post"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Draw"
|
drawn: "Draw"
|
||||||
my-turn: "Your turn"
|
my-turn: "Your turn"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "Waiting for {}"
|
waiting-for: "Waiting for {}"
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "Surrender"
|
||||||
|
surrendered: "By surrender"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Play reversi with your friends!"
|
sub-title: "Play reversi with your friends!"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "Prefiero sushi a pudín"
|
i-like-sushi: "Prefiero sushi a pudín"
|
||||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||||
verified-user: "Usuario verificado"
|
verified-user: "Usuario verificado"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Empatado"
|
drawn: "Empatado"
|
||||||
my-turn: "Mi turno"
|
my-turn: "Mi turno"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "Esperando por {}"
|
waiting-for: "Esperando por {}"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "Je préfère les sushis (au pudding)"
|
i-like-sushi: "Je préfère les sushis (au pudding)"
|
||||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||||
verified-user: "Utilisateur·trice vérifié·e"
|
verified-user: "Utilisateur·trice vérifié·e"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Partie nulle"
|
drawn: "Partie nulle"
|
||||||
my-turn: "C’est votre tour"
|
my-turn: "C’est votre tour"
|
||||||
@ -156,7 +157,7 @@ auth/views/form.vue:
|
|||||||
accept: "Autoriser l’accès"
|
accept: "Autoriser l’accès"
|
||||||
auth/views/index.vue:
|
auth/views/index.vue:
|
||||||
loading: "Chargement en cours"
|
loading: "Chargement en cours"
|
||||||
denied: "アプリケーションの連携をキャンセルしました。"
|
denied: "L'autorisation de l'application a été refusée."
|
||||||
denied-paragraph: "Cette application ne va pas accéder à votre compte."
|
denied-paragraph: "Cette application ne va pas accéder à votre compte."
|
||||||
already-authorized: "Cette application est déjà autorisée"
|
already-authorized: "Cette application est déjà autorisée"
|
||||||
allowed: "アプリケーションの連携を許可しました"
|
allowed: "アプリケーションの連携を許可しました"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "En attente de {}"
|
waiting-for: "En attente de {}"
|
||||||
cancel: "Annuler"
|
cancel: "Annuler"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
sub-title: "Jouer à Reversi avec vos amis·es !"
|
||||||
@ -364,15 +368,15 @@ common/views/widgets/slideshow.vue:
|
|||||||
common/views/widgets/tips.vue:
|
common/views/widgets/tips.vue:
|
||||||
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
||||||
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
||||||
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
|
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||||
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
|
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||||
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
|
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
|
||||||
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
||||||
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
||||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||||
tips-line9: "Misskey est sous licence AGPLv3"
|
tips-line9: "Misskey est sous licence AGPLv3"
|
||||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||||
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
|
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
|
||||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -95,6 +95,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
|
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
@ -182,6 +183,10 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
|
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
meta:
|
meta:
|
||||||
lang: "日本語"
|
lang: "한국어"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "A ⭐ of fediverse"
|
misskey: "A ⭐ of fediverse"
|
||||||
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "Wolę sushi od puddingu"
|
i-like-sushi: "Wolę sushi od puddingu"
|
||||||
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
||||||
verified-user: "Zweryfikowany użytkownik"
|
verified-user: "Zweryfikowany użytkownik"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "Remis"
|
drawn: "Remis"
|
||||||
my-turn: "Twoja kolej"
|
my-turn: "Twoja kolej"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -88,6 +88,7 @@ common:
|
|||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||||
verified-user: "認証済みのユーザー"
|
verified-user: "認証済みのユーザー"
|
||||||
|
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||||
reversi:
|
reversi:
|
||||||
drawn: "引き分け"
|
drawn: "引き分け"
|
||||||
my-turn: "あなたのターンです"
|
my-turn: "あなたのターンです"
|
||||||
@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
matching:
|
matching:
|
||||||
waiting-for: "{}を待っています"
|
waiting-for: "{}を待っています"
|
||||||
cancel: "キャンセル"
|
cancel: "キャンセル"
|
||||||
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "5.13.0",
|
"version": "5.15.0",
|
||||||
"clientVersion": "1.0.7963",
|
"clientVersion": "1.0.8007",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -59,7 +59,7 @@
|
|||||||
"@types/mocha": "5.2.3",
|
"@types/mocha": "5.2.3",
|
||||||
"@types/mongodb": "3.1.3",
|
"@types/mongodb": "3.1.3",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.5.5",
|
"@types/node": "10.5.6",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.2.0",
|
"@types/qrcode": "1.2.0",
|
||||||
@ -88,7 +88,7 @@
|
|||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "11.3.0",
|
"cafy": "11.3.0",
|
||||||
"chalk": "2.4.1",
|
"chalk": "2.4.1",
|
||||||
"commander": "2.16.0",
|
"commander": "2.17.0",
|
||||||
"crc-32": "1.2.0",
|
"crc-32": "1.2.0",
|
||||||
"css-loader": "1.0.0",
|
"css-loader": "1.0.0",
|
||||||
"dateformat": "3.0.3",
|
"dateformat": "3.0.3",
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
||||||
<header><b>{{ blackUser | userName }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser | userName }}</b>(%i18n:common.reversi.white%)</header>
|
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
|
||||||
|
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
||||||
|
|
||||||
<div style="overflow: hidden">
|
<div style="overflow: hidden">
|
||||||
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p>
|
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p>
|
||||||
@ -8,7 +9,10 @@
|
|||||||
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
|
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
|
||||||
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
|
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
|
||||||
<p class="result" v-if="game.isEnded && logPos == logs.length">
|
<p class="result" v-if="game.isEnded && logPos == logs.length">
|
||||||
<template v-if="game.winner">{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
|
<template v-if="game.winner">
|
||||||
|
<span>{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}</span>
|
||||||
|
<span v-if="game.surrendered != null"> (%i18n:@surrendered%)</span>
|
||||||
|
</template>
|
||||||
<template v-else>%i18n:common.reversi.drawn%</template>
|
<template v-else>%i18n:common.reversi.drawn%</template>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -41,6 +45,10 @@
|
|||||||
|
|
||||||
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
|
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
|
||||||
|
|
||||||
|
<div class="actions" v-if="!game.isEnded && iAmPlayer">
|
||||||
|
<form-button @click="surrender">%i18n:@surrender%</form-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<el-button-group>
|
<el-button-group>
|
||||||
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
|
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
|
||||||
@ -62,7 +70,20 @@ import Reversi, { Color } from '../../../../../../../games/reversi/core';
|
|||||||
import { url } from '../../../../../config';
|
import { url } from '../../../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['initGame', 'connection'],
|
props: {
|
||||||
|
initGame: {
|
||||||
|
type: Object,
|
||||||
|
require: true
|
||||||
|
},
|
||||||
|
connection: {
|
||||||
|
type: Object,
|
||||||
|
require: true
|
||||||
|
},
|
||||||
|
selfNav: {
|
||||||
|
type: Boolean,
|
||||||
|
require: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -79,22 +100,27 @@ export default Vue.extend({
|
|||||||
if (!this.$store.getters.isSignedIn) return false;
|
if (!this.$store.getters.isSignedIn) return false;
|
||||||
return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
|
return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
|
||||||
},
|
},
|
||||||
|
|
||||||
myColor(): Color {
|
myColor(): Color {
|
||||||
if (!this.iAmPlayer) return null;
|
if (!this.iAmPlayer) return null;
|
||||||
if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
|
if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
|
||||||
if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
|
if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
opColor(): Color {
|
opColor(): Color {
|
||||||
if (!this.iAmPlayer) return null;
|
if (!this.iAmPlayer) return null;
|
||||||
return this.myColor === true ? false : true;
|
return this.myColor === true ? false : true;
|
||||||
},
|
},
|
||||||
|
|
||||||
blackUser(): any {
|
blackUser(): any {
|
||||||
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
||||||
},
|
},
|
||||||
|
|
||||||
whiteUser(): any {
|
whiteUser(): any {
|
||||||
return this.game.black == 1 ? this.game.user2 : this.game.user1;
|
return this.game.black == 1 ? this.game.user2 : this.game.user1;
|
||||||
},
|
},
|
||||||
|
|
||||||
turnUser(): any {
|
turnUser(): any {
|
||||||
if (this.o.turn === true) {
|
if (this.o.turn === true) {
|
||||||
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
||||||
@ -104,11 +130,13 @@ export default Vue.extend({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
isMyTurn(): boolean {
|
isMyTurn(): boolean {
|
||||||
if (!this.iAmPlayer) return false;
|
if (!this.iAmPlayer) return false;
|
||||||
if (this.turnUser == null) return false;
|
if (this.turnUser == null) return false;
|
||||||
return this.turnUser.id == this.$store.state.i.id;
|
return this.turnUser.id == this.$store.state.i.id;
|
||||||
},
|
},
|
||||||
|
|
||||||
cellsStyle(): any {
|
cellsStyle(): any {
|
||||||
return {
|
return {
|
||||||
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
|
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
|
||||||
@ -165,11 +193,13 @@ export default Vue.extend({
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.connection.on('set', this.onSet);
|
this.connection.on('set', this.onSet);
|
||||||
this.connection.on('rescue', this.onRescue);
|
this.connection.on('rescue', this.onRescue);
|
||||||
|
this.connection.on('ended', this.onEnded);
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.connection.off('set', this.onSet);
|
this.connection.off('set', this.onSet);
|
||||||
this.connection.off('rescue', this.onRescue);
|
this.connection.off('rescue', this.onRescue);
|
||||||
|
this.connection.off('ended', this.onEnded);
|
||||||
|
|
||||||
clearInterval(this.pollingClock);
|
clearInterval(this.pollingClock);
|
||||||
},
|
},
|
||||||
@ -215,6 +245,10 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onEnded(x) {
|
||||||
|
this.game = x.game;
|
||||||
|
},
|
||||||
|
|
||||||
checkEnd() {
|
checkEnd() {
|
||||||
this.game.isEnded = this.o.isEnded;
|
this.game.isEnded = this.o.isEnded;
|
||||||
if (this.game.isEnded) {
|
if (this.game.isEnded) {
|
||||||
@ -250,6 +284,16 @@ export default Vue.extend({
|
|||||||
|
|
||||||
this.checkEnd();
|
this.checkEnd();
|
||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
|
},
|
||||||
|
|
||||||
|
surrender() {
|
||||||
|
(this as any).api('games/reversi/games/surrender', {
|
||||||
|
gameId: this.game.id
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
goIndex() {
|
||||||
|
this.$emit('go-index');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -261,10 +305,21 @@ export default Vue.extend({
|
|||||||
root(isDark)
|
root(isDark)
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
|
> .go-index
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
z-index 1
|
||||||
|
width 42px
|
||||||
|
height 42px
|
||||||
|
|
||||||
> header
|
> header
|
||||||
padding 8px
|
padding 8px
|
||||||
border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4
|
border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4
|
||||||
|
|
||||||
|
a
|
||||||
|
color inherit
|
||||||
|
|
||||||
> .board
|
> .board
|
||||||
width calc(100% - 16px)
|
width calc(100% - 16px)
|
||||||
max-width 500px
|
max-width 500px
|
||||||
@ -381,6 +436,9 @@ root(isDark)
|
|||||||
margin 0
|
margin 0
|
||||||
padding 16px 0
|
padding 16px 0
|
||||||
|
|
||||||
|
> .actions
|
||||||
|
padding-bottom 16px
|
||||||
|
|
||||||
> .player
|
> .player
|
||||||
padding-bottom 32px
|
padding-bottom 32px
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<x-room v-if="!g.isStarted" :game="g" :connection="connection"/>
|
<x-room v-if="!g.isStarted" :game="g" :connection="connection"/>
|
||||||
<x-game v-else :init-game="g" :connection="connection"/>
|
<x-game v-else :init-game="g" :connection="connection" :self-nav="selfNav" @go-index="goIndex"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -16,7 +16,16 @@ export default Vue.extend({
|
|||||||
XGame,
|
XGame,
|
||||||
XRoom
|
XRoom
|
||||||
},
|
},
|
||||||
props: ['game'],
|
props: {
|
||||||
|
game: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
selfNav: {
|
||||||
|
type: Boolean,
|
||||||
|
require: true
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
connection: null,
|
connection: null,
|
||||||
@ -36,6 +45,9 @@ export default Vue.extend({
|
|||||||
onStarted(game) {
|
onStarted(game) {
|
||||||
Object.assign(this.g, game);
|
Object.assign(this.g, game);
|
||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
|
},
|
||||||
|
goIndex() {
|
||||||
|
this.$emit('go-index');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -96,11 +96,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
go(game) {
|
go(game) {
|
||||||
(this as any).api('games/reversi/games/show', {
|
this.$emit('go', game);
|
||||||
gameId: game.id
|
|
||||||
}).then(game => {
|
|
||||||
this.$emit('go', game);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
match() {
|
match() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="vchtoekanapleubgzioubdtmlkribzfd">
|
<div class="vchtoekanapleubgzioubdtmlkribzfd">
|
||||||
<div v-if="game">
|
<div v-if="game">
|
||||||
<x-gameroom :game="game"/>
|
<x-gameroom :game="game" :self-nav="selfNav" @go-index="goIndex"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="matching" v-else-if="matching">
|
<div class="matching" v-else-if="matching">
|
||||||
<h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
|
<h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
|
||||||
@ -34,6 +34,11 @@ export default Vue.extend({
|
|||||||
gameId: {
|
gameId: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false
|
required: false
|
||||||
|
},
|
||||||
|
selfNav: {
|
||||||
|
type: Boolean,
|
||||||
|
require: false,
|
||||||
|
default: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -48,6 +53,10 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
|
game() {
|
||||||
|
this.$emit('gamed', this.game);
|
||||||
|
},
|
||||||
|
|
||||||
gameId() {
|
gameId() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
}
|
}
|
||||||
@ -91,18 +100,24 @@ export default Vue.extend({
|
|||||||
(this as any).api('games/reversi/games/show', {
|
(this as any).api('games/reversi/games/show', {
|
||||||
gameId: this.gameId
|
gameId: this.gameId
|
||||||
}).then(game => {
|
}).then(game => {
|
||||||
this.nav(game, true);
|
this.game = game;
|
||||||
Progress.done();
|
Progress.done();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
nav(game, silent) {
|
async nav(game, actualNav = true) {
|
||||||
this.matching = null;
|
if (this.selfNav) {
|
||||||
this.game = game;
|
// 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
|
||||||
|
if (game != null && (game.settings == null || game.settings.map == null)) {
|
||||||
|
game = await (this as any).api('games/reversi/games/show', {
|
||||||
|
gameId: game.id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (!silent) {
|
this.game = game;
|
||||||
this.$emit('nav', this.game);
|
} else {
|
||||||
|
this.$emit('nav', game, actualNav);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -121,7 +136,8 @@ export default Vue.extend({
|
|||||||
}).then(game => {
|
}).then(game => {
|
||||||
if (game) {
|
if (game) {
|
||||||
this.matching = null;
|
this.matching = null;
|
||||||
this.game = game;
|
|
||||||
|
this.nav(game);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -129,6 +145,11 @@ export default Vue.extend({
|
|||||||
onMatched(game) {
|
onMatched(game) {
|
||||||
this.matching = null;
|
this.matching = null;
|
||||||
this.game = game;
|
this.game = game;
|
||||||
|
this.nav(game, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
goIndex() {
|
||||||
|
this.nav(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -63,12 +63,23 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
attrs: {
|
attrs: {
|
||||||
style: 'display: inline-block; font-size: 200%;'
|
style: 'display: inline-block; font-size: 200%;'
|
||||||
},
|
},
|
||||||
directives: [{
|
directives: [this.$store.state.settings.disableAnimatedMfm ? {} : {
|
||||||
name: 'animate-css',
|
name: 'animate-css',
|
||||||
value: { classes: 'tada', iteration: 'infinite' }
|
value: { classes: 'tada', iteration: 'infinite' }
|
||||||
}]
|
}]
|
||||||
}, token.big);
|
}, token.big);
|
||||||
|
|
||||||
|
case 'motion':
|
||||||
|
return (createElement as any)('span', {
|
||||||
|
attrs: {
|
||||||
|
style: 'display: inline-block;'
|
||||||
|
},
|
||||||
|
directives: [this.$store.state.settings.disableAnimatedMfm ? {} : {
|
||||||
|
name: 'animate-css',
|
||||||
|
value: { classes: 'rubberBand', iteration: 'infinite' }
|
||||||
|
}]
|
||||||
|
}, token.motion);
|
||||||
|
|
||||||
case 'url':
|
case 'url':
|
||||||
return createElement(MkUrl, {
|
return createElement(MkUrl, {
|
||||||
props: {
|
props: {
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
<span>%i18n:@show-maps-desc%</span>
|
<span>%i18n:@show-maps-desc%</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
||||||
|
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
@ -376,6 +377,12 @@ export default Vue.extend({
|
|||||||
value: v
|
value: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeDisableAnimatedMfm(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'disableAnimatedMfm',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeGradientWindowHeader(v) {
|
onChangeGradientWindowHeader(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'gradientWindowHeader',
|
key: 'gradientWindowHeader',
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<component :is="ui ? 'mk-ui' : 'div'">
|
<component :is="ui ? 'mk-ui' : 'div'">
|
||||||
<mk-reversi :game-id="$route.params.game" @nav="nav"/>
|
<mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
|
||||||
</component>
|
</component>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -14,9 +14,14 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
nav(game) {
|
nav(game, actualNav) {
|
||||||
history.pushState(null, null, '/reversi/' + game.id);
|
if (actualNav) {
|
||||||
},
|
this.$router.push('/reversi/' + game.id);
|
||||||
|
} else {
|
||||||
|
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||||
|
this.$router.push('/reversi/' + game.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<mk-ui>
|
||||||
<span slot="header">%fa:gamepad%%i18n:@reversi%</span>
|
<span slot="header">%fa:gamepad%%i18n:@reversi%</span>
|
||||||
<mk-reversi :game-id="$route.params.game" @nav="nav"/>
|
<mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
|
||||||
</mk-ui>
|
</mk-ui>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -14,8 +14,13 @@ export default Vue.extend({
|
|||||||
document.documentElement.style.background = '#fff';
|
document.documentElement.style.background = '#fff';
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
nav(game) {
|
nav(game, actualNav) {
|
||||||
history.pushState(null, null, '/reversi/' + game.id);
|
if (actualNav) {
|
||||||
|
this.$router.push('/reversi/' + game.id);
|
||||||
|
} else {
|
||||||
|
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||||
|
this.$router.push('/reversi/' + game.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
||||||
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
||||||
|
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div>%i18n:@timeline%</div>
|
<div>%i18n:@timeline%</div>
|
||||||
@ -192,6 +193,13 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onChangeDisableAnimatedMfm(v) {
|
||||||
|
this.$store.dispatch('settings/set', {
|
||||||
|
key: 'disableAnimatedMfm',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
onChangeShowReplyTarget(v) {
|
onChangeShowReplyTarget(v) {
|
||||||
this.$store.dispatch('settings/set', {
|
this.$store.dispatch('settings/set', {
|
||||||
key: 'showReplyTarget',
|
key: 'showReplyTarget',
|
||||||
|
@ -172,3 +172,6 @@ type: `textbox`
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
メッセージの種類: `success`, `info`, `warning`, `error`。
|
メッセージの種類: `success`, `info`, `warning`, `error`。
|
||||||
|
|
||||||
|
## 投了する
|
||||||
|
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
const { lib: emojilib } = require('emojilib');
|
const { lib: emojilib } = require('emojilib');
|
||||||
const JSDOM = require('jsdom');
|
const jsdom = require('jsdom');
|
||||||
|
const { JSDOM } = jsdom;
|
||||||
import config from '../config';
|
import config from '../config';
|
||||||
import { INote } from '../models/note';
|
import { INote } from '../models/note';
|
||||||
import { TextElement } from './parse';
|
import { TextElement } from './parse';
|
||||||
@ -17,6 +18,12 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers:
|
|||||||
document.body.appendChild(b);
|
document.body.appendChild(b);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
motion({ document }, { big }) {
|
||||||
|
const b = document.createElement('strong');
|
||||||
|
b.textContent = big;
|
||||||
|
document.body.appendChild(b);
|
||||||
|
},
|
||||||
|
|
||||||
code({ document }, { code }) {
|
code({ document }, { code }) {
|
||||||
const pre = document.createElement('pre');
|
const pre = document.createElement('pre');
|
||||||
const inner = document.createElement('code');
|
const inner = document.createElement('code');
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Bold
|
* Big
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export type TextElementBig = {
|
export type TextElementBig = {
|
||||||
|
20
src/mfm/parse/elements/motion.ts
Normal file
20
src/mfm/parse/elements/motion.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* Motion
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type TextElementMotion = {
|
||||||
|
type: 'motion'
|
||||||
|
content: string
|
||||||
|
motion: string
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function(text: string) {
|
||||||
|
const match = text.match(/^\(\(\((.+?)\)\)\)/);
|
||||||
|
if (!match) return null;
|
||||||
|
const motion = match[0];
|
||||||
|
return {
|
||||||
|
type: 'motion',
|
||||||
|
content: motion,
|
||||||
|
motion: match[1]
|
||||||
|
} as TextElementMotion;
|
||||||
|
}
|
@ -14,6 +14,7 @@ import { TextElementQuote } from './elements/quote';
|
|||||||
import { TextElementSearch } from './elements/search';
|
import { TextElementSearch } from './elements/search';
|
||||||
import { TextElementTitle } from './elements/title';
|
import { TextElementTitle } from './elements/title';
|
||||||
import { TextElementUrl } from './elements/url';
|
import { TextElementUrl } from './elements/url';
|
||||||
|
import { TextElementMotion } from './elements/motion';
|
||||||
|
|
||||||
const elements = [
|
const elements = [
|
||||||
require('./elements/big'),
|
require('./elements/big'),
|
||||||
@ -27,7 +28,8 @@ const elements = [
|
|||||||
require('./elements/inline-code'),
|
require('./elements/inline-code'),
|
||||||
require('./elements/quote'),
|
require('./elements/quote'),
|
||||||
require('./elements/emoji'),
|
require('./elements/emoji'),
|
||||||
require('./elements/search')
|
require('./elements/search'),
|
||||||
|
require('./elements/motion')
|
||||||
].map(element => element.default as TextElementProcessor);
|
].map(element => element.default as TextElementProcessor);
|
||||||
|
|
||||||
export type TextElement = { type: 'text', content: string }
|
export type TextElement = { type: 'text', content: string }
|
||||||
@ -42,7 +44,8 @@ export type TextElement = { type: 'text', content: string }
|
|||||||
| TextElementQuote
|
| TextElementQuote
|
||||||
| TextElementSearch
|
| TextElementSearch
|
||||||
| TextElementTitle
|
| TextElementTitle
|
||||||
| TextElementUrl;
|
| TextElementUrl
|
||||||
|
| TextElementMotion;
|
||||||
export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[];
|
export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[];
|
||||||
|
|
||||||
export default (source: string): TextElement[] => {
|
export default (source: string): TextElement[] => {
|
||||||
|
@ -25,6 +25,7 @@ export interface IReversiGame {
|
|||||||
isStarted: boolean;
|
isStarted: boolean;
|
||||||
isEnded: boolean;
|
isEnded: boolean;
|
||||||
winnerId: mongo.ObjectID;
|
winnerId: mongo.ObjectID;
|
||||||
|
surrendered: mongo.ObjectID;
|
||||||
logs: Array<{
|
logs: Array<{
|
||||||
at: Date;
|
at: Date;
|
||||||
color: boolean;
|
color: boolean;
|
||||||
|
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import $ from 'cafy'; import ID from '../../../../../../misc/cafy-id';
|
||||||
|
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
|
||||||
|
import { ILocalUser } from '../../../../../../models/user';
|
||||||
|
import getParams from '../../../../get-params';
|
||||||
|
import { publishReversiGameStream } from '../../../../../../stream';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
desc: {
|
||||||
|
ja: '指定したリバーシの対局で投了します。'
|
||||||
|
},
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
params: {
|
||||||
|
gameId: $.type(ID).optional.note({
|
||||||
|
desc: {
|
||||||
|
ja: '投了したい対局'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
|
||||||
|
const [ps, psErr] = getParams(meta, params);
|
||||||
|
if (psErr) return rej(psErr);
|
||||||
|
|
||||||
|
const game = await ReversiGame.findOne({ _id: ps.gameId });
|
||||||
|
|
||||||
|
if (game == null) {
|
||||||
|
return rej('game not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (game.isEnded) {
|
||||||
|
return rej('this game is already ended');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) {
|
||||||
|
return rej('access denied');
|
||||||
|
}
|
||||||
|
|
||||||
|
const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id;
|
||||||
|
|
||||||
|
await ReversiGame.update({
|
||||||
|
_id: game._id
|
||||||
|
}, {
|
||||||
|
$set: {
|
||||||
|
surrendered: user._id,
|
||||||
|
isEnded: true,
|
||||||
|
winnerId: winnerId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
publishReversiGameStream(game._id, 'ended', {
|
||||||
|
winnerId: winnerId,
|
||||||
|
game: await pack(game._id, user)
|
||||||
|
});
|
||||||
|
|
||||||
|
res();
|
||||||
|
});
|
@ -11,7 +11,7 @@ const handler = new EventEmitter();
|
|||||||
|
|
||||||
let bot: IUser;
|
let bot: IUser;
|
||||||
|
|
||||||
const post = async (text: string) => {
|
const post = async (text: string, home = true) => {
|
||||||
if (bot == null) {
|
if (bot == null) {
|
||||||
const account = await User.findOne({
|
const account = await User.findOne({
|
||||||
usernameLower: config.github_bot.username.toLowerCase()
|
usernameLower: config.github_bot.username.toLowerCase()
|
||||||
@ -25,7 +25,7 @@ const post = async (text: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createNote(bot, { text, visibility: 'home' });
|
createNote(bot, { text, visibility: home ? 'home' : 'public' });
|
||||||
};
|
};
|
||||||
|
|
||||||
// Init router
|
// Init router
|
||||||
@ -130,7 +130,7 @@ handler.on('issue_comment', event => {
|
|||||||
|
|
||||||
handler.on('watch', event => {
|
handler.on('watch', event => {
|
||||||
const sender = event.sender;
|
const sender = event.sender;
|
||||||
post(`⭐️ Starred by **${sender.login}** ⭐️`);
|
post(`(((⭐️))) Starred by **${sender.login}** (((⭐️)))`, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
handler.on('fork', event => {
|
handler.on('fork', event => {
|
||||||
|
@ -39,6 +39,14 @@ describe('Text', () => {
|
|||||||
], tokens);
|
], tokens);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('motion', () => {
|
||||||
|
const tokens = analyze('(((Strawberry))) Pasta');
|
||||||
|
assert.deepEqual([
|
||||||
|
{ type: 'motion', content: '***Strawberry***', motion: 'Strawberry' },
|
||||||
|
{ type: 'text', content: ' Pasta' }
|
||||||
|
], tokens);
|
||||||
|
});
|
||||||
|
|
||||||
it('mention', () => {
|
it('mention', () => {
|
||||||
const tokens = analyze('@himawari お腹ペコい');
|
const tokens = analyze('@himawari お腹ペコい');
|
||||||
assert.deepEqual([
|
assert.deepEqual([
|
||||||
|
Reference in New Issue
Block a user