Compare commits
	
		
			69 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 2fee2e5166 | ||
|   | 98bd6c3cb8 | ||
|   | fc31e44fd2 | ||
|   | 12f89f0e2e | ||
|   | cdf15fc43a | ||
|   | 2a12af28dd | ||
|   | f128fceaba | ||
|   | 26c5d66994 | ||
|   | bd390d424a | ||
|   | 6b85730361 | ||
|   | d6176d1901 | ||
|   | 43f336bea4 | ||
|   | d2ed9e965e | ||
|   | ea73e9d5de | ||
|   | 36ef862fc6 | ||
|   | 999275ca2c | ||
|   | 78c36ec260 | ||
|   | c985fed3e4 | ||
|   | f13fe431b8 | ||
|   | f1d7cc08bb | ||
|   | e662dfbcfb | ||
|   | 8aaf667f78 | ||
|   | fdfea73bdb | ||
|   | 50161bc84d | ||
|   | 8046a4488d | ||
|   | e818c37a0c | ||
|   | 16ffa0c3c7 | ||
|   | 6a9b839e62 | ||
|   | b5da01931c | ||
|   | 99b6896cf4 | ||
|   | 0ac05df628 | ||
|   | 83726ddcec | ||
|   | be627d488c | ||
|   | e615a3fdf3 | ||
|   | f670345d45 | ||
|   | 6032ec3823 | ||
|   | 01ed052ae6 | ||
|   | 88a9a7c48f | ||
|   | d74755f0a4 | ||
|   | e05871a7f8 | ||
|   | fed44e2f2b | ||
|   | 2189f450df | ||
|   | 288e8f0f75 | ||
|   | dfe7eaaa04 | ||
|   | 51b166b419 | ||
|   | 0ac9a85314 | ||
|   | d153297294 | ||
|   | ec71658087 | ||
|   | 3f359e67b3 | ||
|   | 3220d69a69 | ||
|   | 385116bf30 | ||
|   | f3b476a348 | ||
|   | d0dec99222 | ||
|   | b3fa50d4d1 | ||
|   | 1dbf245f76 | ||
|   | 7c092bc04c | ||
|   | b8f1a8a243 | ||
|   | c2b235b4a3 | ||
|   | 19a9d8d254 | ||
|   | c79d29bd6c | ||
|   | 14816a1c6d | ||
|   | 0c86f1c1aa | ||
|   | 8f440ae633 | ||
|   | 863a5ba872 | ||
|   | c87a43bdba | ||
|   | fa6a7186e0 | ||
|   | 34a5adf951 | ||
|   | 4b3ece439e | ||
| ![greenkeeper[bot]](/assets/img/avatar_default.png)  | 10dc97c43f | 
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Datei auswählen" |   choose-file: "Datei auswählen" | ||||||
|   upload: "Dateien von deinem PC hochladen" |   upload: "Dateien von deinem PC hochladen" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "Make the stone color clear in reversi" |   use-contrast-reversi-stones: "Make the stone color clear in reversi" | ||||||
|   verified-user: "Verified account" |   verified-user: "Verified account" | ||||||
|   disable-animated-mfm: "Disable animated texts in a post" |   disable-animated-mfm: "Disable animated texts in a post" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "Do not omit the hostname from the username" | ||||||
|  |   this-setting-is-this-device-only: "Only for this device" | ||||||
|   do-not-use-in-production: 'As this is for development, do not use this in production.' |   do-not-use-in-production: 'As this is for development, do not use this in production.' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Draw" |     drawn: "Draw" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "Posts" |   notes: "Posts" | ||||||
|   users: "Users" |   users: "Users" | ||||||
|   drive: "Drive" |   drive: "Drive" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "The number of posts: increase/decrease (Combined)" |     notes: "The number of posts: increase/decrease (Combined)" | ||||||
|     local-notes: "The number of posts: increase/decrease (Local)" |     local-notes: "The number of posts: increase/decrease (Local)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "Capacity used as the storage: cumulative total" |     drive-total: "Capacity used as the storage: cumulative total" | ||||||
|     drive-files: "The number of files on the storage: increase/decrease" |     drive-files: "The number of files on the storage: increase/decrease" | ||||||
|     drive-files-total: "The number of files on the storage: cumulative total" |     drive-files-total: "The number of files on the storage: cumulative total" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Choose files" |   choose-file: "Choose files" | ||||||
|   upload: "Upload files from your device" |   upload: "Upload files from your device" | ||||||
| @@ -778,7 +786,7 @@ desktop/views/components/settings.profile.vue: | |||||||
|   birthday: "Birthday" |   birthday: "Birthday" | ||||||
|   save: "Update profile" |   save: "Update profile" | ||||||
|   locked-account: "Protect your account" |   locked-account: "Protect your account" | ||||||
|   is-locked: "フォローを承認制にする" |   is-locked: "Follow request needs approval" | ||||||
|   other: "Other" |   other: "Other" | ||||||
|   is-bot: "This account is a Bot" |   is-bot: "This account is a Bot" | ||||||
|   is-cat: "This account is a Cat" |   is-cat: "This account is a Cat" | ||||||
| @@ -1160,7 +1168,7 @@ mobile/views/pages/settings/settings.profile.vue: | |||||||
|   avatar: "Avatar" |   avatar: "Avatar" | ||||||
|   banner: "Banner" |   banner: "Banner" | ||||||
|   is-cat: "This account is a Cat" |   is-cat: "This account is a Cat" | ||||||
|   is-locked: "フォローを承認制にする" |   is-locked: "Follow request needs approval" | ||||||
|   advanced: "Advanced" |   advanced: "Advanced" | ||||||
|   privacy: "Privacy" |   privacy: "Privacy" | ||||||
|   save: "Update profile" |   save: "Update profile" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi" |   use-contrast-reversi-stones: "Hacer el color de la piedra claro en Reversi" | ||||||
|   verified-user: "Cuenta verificada" |   verified-user: "Cuenta verificada" | ||||||
|   disable-animated-mfm: "Desactivar texto animado en una publicación" |   disable-animated-mfm: "Desactivar texto animado en una publicación" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.' |   do-not-use-in-production: 'Esto está en desarrollo, no usarlo para producción.' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Empatado" |     drawn: "Empatado" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "Publicaciones" |   notes: "Publicaciones" | ||||||
|   users: "Usuarios" |   users: "Usuarios" | ||||||
|   drive: "Unidad" |   drive: "Unidad" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "Número de publicaciones: aumentar/disminuir (Combinado)" |     notes: "Número de publicaciones: aumentar/disminuir (Combinado)" | ||||||
|     local-notes: "Número de publicaciones: aumentar/disminuir (Local)" |     local-notes: "Número de publicaciones: aumentar/disminuir (Local)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "Capacidad de almacenamiento usada: Acumulativa total" |     drive-total: "Capacidad de almacenamiento usada: Acumulativa total" | ||||||
|     drive-files: "Número de archivos almacenados: aumentar/disminuir" |     drive-files: "Número de archivos almacenados: aumentar/disminuir" | ||||||
|     drive-files-total: "Número de archivos almacenados: Acumulativo total" |     drive-files-total: "Número de archivos almacenados: Acumulativo total" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Escoger archivos" |   choose-file: "Escoger archivos" | ||||||
|   upload: "Cargar archivos de tu dispositivo" |   upload: "Cargar archivos de tu dispositivo" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "Compte vérifié" |   verified-user: "Compte vérifié" | ||||||
|   disable-animated-mfm: "Désactiver les textes animés dans les publications" |   disable-animated-mfm: "Désactiver les textes animés dans les publications" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Partie nulle" |     drawn: "Partie nulle" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "Publications" |   notes: "Publications" | ||||||
|   users: "Utilisateurs" |   users: "Utilisateurs" | ||||||
|   drive: "Drive" |   drive: "Drive" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Sélection de fichiers" |   choose-file: "Sélection de fichiers" | ||||||
|   upload: "Téléverser des fichiers à partir de votre ordinateur" |   upload: "Téléverser des fichiers à partir de votre ordinateur" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -116,6 +116,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|  |  | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|  |  | ||||||
| @@ -514,6 +518,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -525,6 +530,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
|  |  | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストをつけんで!" | ||||||
|   verified-user: "アメちゃん付きアカウント" |   verified-user: "アメちゃん付きアカウント" | ||||||
|   disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める" |   disable-animated-mfm: "投稿内のちょろちょろ動いてんのを止める" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "おあいこ" |     drawn: "おあいこ" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" |   disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "무승부" |     drawn: "무승부" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Bestanden kiezen" |   choose-file: "Bestanden kiezen" | ||||||
|   upload: "Bestanden uploaden van je computer" |   upload: "Bestanden uploaden van je computer" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "Wyłącz animowany tekst we wpisach" |   disable-animated-mfm: "Wyłącz animowany tekst we wpisach" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Remis" |     drawn: "Remis" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "Wybierz plik" |   choose-file: "Wybierz plik" | ||||||
|   upload: "Wyślij pliki z Twojego komputera" |   upload: "Wyślij pliki z Twojego komputera" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "Conta verificada" |   verified-user: "Conta verificada" | ||||||
|   disable-animated-mfm: "Desativar texto animado nas publicações" |   disable-animated-mfm: "Desativar texto animado nas publicações" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "Empatado" |     drawn: "Empatado" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -109,6 +109,10 @@ common: | |||||||
|   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" |   use-contrast-reversi-stones: "リバーシのアイコンにコントラストを付ける" | ||||||
|   verified-user: "公式アカウント" |   verified-user: "公式アカウント" | ||||||
|   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" |   disable-animated-mfm: "投稿内の動きのあるテキストを無効にする" | ||||||
|  |   always-show-nsfw: "常に閲覧注意のメディアを表示する" | ||||||
|  |   always-mark-nsfw: "常にメディアを閲覧注意として投稿" | ||||||
|  |   show-full-acct: "ユーザー名のホストを省略しない" | ||||||
|  |   this-setting-is-this-device-only: "このデバイスのみ" | ||||||
|   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' |   do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。' | ||||||
|   reversi: |   reversi: | ||||||
|     drawn: "引き分け" |     drawn: "引き分け" | ||||||
| @@ -461,6 +465,7 @@ desktop/views/components/charts.vue: | |||||||
|   notes: "投稿" |   notes: "投稿" | ||||||
|   users: "ユーザー" |   users: "ユーザー" | ||||||
|   drive: "ドライブ" |   drive: "ドライブ" | ||||||
|  |   network: "ネットワーク" | ||||||
|   charts: |   charts: | ||||||
|     notes: "投稿の増減 (統合)" |     notes: "投稿の増減 (統合)" | ||||||
|     local-notes: "投稿の増減 (ローカル)" |     local-notes: "投稿の増減 (ローカル)" | ||||||
| @@ -472,6 +477,9 @@ desktop/views/components/charts.vue: | |||||||
|     drive-total: "ドライブ使用量の累計" |     drive-total: "ドライブ使用量の累計" | ||||||
|     drive-files: "ドライブのファイル数の増減" |     drive-files: "ドライブのファイル数の増減" | ||||||
|     drive-files-total: "ドライブのファイル数の累計" |     drive-files-total: "ドライブのファイル数の累計" | ||||||
|  |     network-requests: "リクエスト" | ||||||
|  |     network-time: "応答時間" | ||||||
|  |     network-usage: "通信量" | ||||||
| desktop/views/components/choose-file-from-drive-window.vue: | desktop/views/components/choose-file-from-drive-window.vue: | ||||||
|   choose-file: "ファイル選択中" |   choose-file: "ファイル選択中" | ||||||
|   upload: "PCからドライブにファイルをアップロード" |   upload: "PCからドライブにファイルをアップロード" | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| { | { | ||||||
| 	"name": "misskey", | 	"name": "misskey", | ||||||
| 	"author": "syuilo <i@syuilo.com>", | 	"author": "syuilo <i@syuilo.com>", | ||||||
| 	"version": "8.37.0", | 	"version": "8.40.0", | ||||||
| 	"clientVersion": "1.0.9642", | 	"clientVersion": "1.0.9711", | ||||||
| 	"codename": "nighthike", | 	"codename": "nighthike", | ||||||
| 	"main": "./built/index.js", | 	"main": "./built/index.js", | ||||||
| 	"private": true, | 	"private": true, | ||||||
| @@ -179,6 +179,7 @@ | |||||||
| 		"redis": "2.8.0", | 		"redis": "2.8.0", | ||||||
| 		"request": "2.88.0", | 		"request": "2.88.0", | ||||||
| 		"request-promise-native": "1.0.5", | 		"request-promise-native": "1.0.5", | ||||||
|  | 		"request-stats": "3.0.0", | ||||||
| 		"rimraf": "2.6.2", | 		"rimraf": "2.6.2", | ||||||
| 		"rndstr": "1.0.0", | 		"rndstr": "1.0.0", | ||||||
| 		"s-age": "1.1.2", | 		"s-age": "1.1.2", | ||||||
| @@ -222,7 +223,7 @@ | |||||||
| 		"vuex-persistedstate": "2.5.4", | 		"vuex-persistedstate": "2.5.4", | ||||||
| 		"web-push": "3.3.2", | 		"web-push": "3.3.2", | ||||||
| 		"webfinger.js": "2.6.6", | 		"webfinger.js": "2.6.6", | ||||||
| 		"webpack": "4.18.1", | 		"webpack": "4.19.0", | ||||||
| 		"webpack-cli": "3.1.0", | 		"webpack-cli": "3.1.0", | ||||||
| 		"websocket": "1.0.26", | 		"websocket": "1.0.26", | ||||||
| 		"ws": "6.0.0", | 		"ws": "6.0.0", | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <template> | <template> | ||||||
| <span class="mk-acct"> | <span class="mk-acct"> | ||||||
| 	<span class="name">@{{ user.username }}</span> | 	<span class="name">@{{ user.username }}</span> | ||||||
| 	<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail">@{{ user.host || host }}</span> | 	<span class="host" :class="{ fade: $store.state.settings.contrastedAcct }" v-if="user.host || detail || $store.state.settings.showFullAcct">@{{ user.host || host }}</span> | ||||||
| </span> | </span> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,6 +19,11 @@ | |||||||
| 				<option value="drive">%i18n:@charts.drive%</option> | 				<option value="drive">%i18n:@charts.drive%</option> | ||||||
| 				<option value="drive-total">%i18n:@charts.drive-total%</option> | 				<option value="drive-total">%i18n:@charts.drive-total%</option> | ||||||
| 			</optgroup> | 			</optgroup> | ||||||
|  | 			<optgroup label="%i18n:@network%"> | ||||||
|  | 				<option value="network-requests">%i18n:@charts.network-requests%</option> | ||||||
|  | 				<option value="network-time">%i18n:@charts.network-time%</option> | ||||||
|  | 				<option value="network-usage">%i18n:@charts.network-usage%</option> | ||||||
|  | 			</optgroup> | ||||||
| 		</select> | 		</select> | ||||||
| 		<div> | 		<div> | ||||||
| 			<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span> | 			<span @click="span = 'day'" :class="{ active: span == 'day' }">%i18n:@per-day%</span> | <span @click="span = 'hour'" :class="{ active: span == 'hour' }">%i18n:@per-hour%</span> | ||||||
| @@ -41,7 +46,10 @@ const colors = { | |||||||
| 	localPlus: 'rgb(52, 178, 118)', | 	localPlus: 'rgb(52, 178, 118)', | ||||||
| 	remotePlus: 'rgb(158, 255, 209)', | 	remotePlus: 'rgb(158, 255, 209)', | ||||||
| 	localMinus: 'rgb(255, 97, 74)', | 	localMinus: 'rgb(255, 97, 74)', | ||||||
| 	remoteMinus: 'rgb(255, 149, 134)' | 	remoteMinus: 'rgb(255, 149, 134)', | ||||||
|  |  | ||||||
|  | 	incoming: 'rgb(52, 178, 118)', | ||||||
|  | 	outgoing: 'rgb(255, 97, 74)', | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const rgba = (color: string): string => { | const rgba = (color: string): string => { | ||||||
| @@ -75,6 +83,9 @@ export default Vue.extend({ | |||||||
| 				case 'drive-total': return this.driveTotalChart(); | 				case 'drive-total': return this.driveTotalChart(); | ||||||
| 				case 'drive-files': return this.driveFilesChart(); | 				case 'drive-files': return this.driveFilesChart(); | ||||||
| 				case 'drive-files-total': return this.driveFilesTotalChart(); | 				case 'drive-files-total': return this.driveFilesTotalChart(); | ||||||
|  | 				case 'network-requests': return this.networkRequestsChart(); | ||||||
|  | 				case 'network-time': return this.networkTimeChart(); | ||||||
|  | 				case 'network-usage': return this.networkUsageChart(); | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| @@ -544,8 +555,96 @@ export default Vue.extend({ | |||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			}]; | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		networkRequestsChart(): any { | ||||||
|  | 			const data = this.stats.slice().reverse().map(x => ({ | ||||||
|  | 				date: new Date(x.date), | ||||||
|  | 				requests: x.network.requests | ||||||
|  | 			})); | ||||||
|  |  | ||||||
|  | 			return [{ | ||||||
|  | 				datasets: [{ | ||||||
|  | 					label: 'Requests', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localPlus), | ||||||
|  | 					borderColor: colors.localPlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.requests })) | ||||||
|  | 				}] | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		networkTimeChart(): any { | ||||||
|  | 			const data = this.stats.slice().reverse().map(x => ({ | ||||||
|  | 				date: new Date(x.date), | ||||||
|  | 				time: x.network.requests != 0 ? (x.network.totalTime / x.network.requests) : 0, | ||||||
|  | 			})); | ||||||
|  |  | ||||||
|  | 			return [{ | ||||||
|  | 				datasets: [{ | ||||||
|  | 					label: 'Avg time (ms)', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.localPlus), | ||||||
|  | 					borderColor: colors.localPlus, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.time })) | ||||||
|  | 				}] | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		networkUsageChart(): any { | ||||||
|  | 			const data = this.stats.slice().reverse().map(x => ({ | ||||||
|  | 				date: new Date(x.date), | ||||||
|  | 				incoming: x.network.incomingBytes, | ||||||
|  | 				outgoing: x.network.outgoingBytes | ||||||
|  | 			})); | ||||||
|  |  | ||||||
|  | 			return [{ | ||||||
|  | 				datasets: [{ | ||||||
|  | 					label: 'Incoming', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.incoming), | ||||||
|  | 					borderColor: colors.incoming, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.incoming })) | ||||||
|  | 				}, { | ||||||
|  | 					label: 'Outgoing', | ||||||
|  | 					fill: true, | ||||||
|  | 					backgroundColor: rgba(colors.outgoing), | ||||||
|  | 					borderColor: colors.outgoing, | ||||||
|  | 					borderWidth: 2, | ||||||
|  | 					pointBackgroundColor: '#fff', | ||||||
|  | 					lineTension: 0, | ||||||
|  | 					data: data.map(x => ({ t: x.date, y: x.outgoing })) | ||||||
|  | 				}] | ||||||
|  | 			}, { | ||||||
|  | 				scales: { | ||||||
|  | 					yAxes: [{ | ||||||
|  | 						ticks: { | ||||||
|  | 							callback: value => { | ||||||
|  | 								return Vue.filter('bytes')(value, 1); | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
|  | 					}] | ||||||
|  | 				}, | ||||||
|  | 				tooltips: { | ||||||
|  | 					callbacks: { | ||||||
|  | 						label: (tooltipItem, data) => { | ||||||
|  | 							const label = data.datasets[tooltipItem.datasetIndex].label || ''; | ||||||
|  | 							return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel, 1)}`; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}]; | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <template> | <template> | ||||||
| <div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide" @click="hide = false"> | <div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false"> | ||||||
| 	<div> | 	<div> | ||||||
| 		<b>%fa:exclamation-triangle% %i18n:@sensitive%</b> | 		<b>%fa:exclamation-triangle% %i18n:@sensitive%</b> | ||||||
| 		<span>%i18n:@click-to-show%</span> | 		<span>%i18n:@click-to-show%</span> | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ | |||||||
| 		<h2>%i18n:@other%</h2> | 		<h2>%i18n:@other%</h2> | ||||||
| 		<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> | 		<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/> | ||||||
| 		<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> | 		<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/> | ||||||
|  | 		<mk-switch v-model="alwaysMarkNsfw" text="%i18n:common.always-mark-nsfw%"/> | ||||||
| 	</section> | 	</section> | ||||||
| </div> | </div> | ||||||
| </template> | </template> | ||||||
| @@ -46,6 +47,12 @@ export default Vue.extend({ | |||||||
| 			birthday: null, | 			birthday: null, | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
|  | 	computed: { | ||||||
|  | 		alwaysMarkNsfw: { | ||||||
|  | 			get() { return this.$store.state.i.settings.alwaysMarkNsfw; }, | ||||||
|  | 			set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); } | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
| 	created() { | 	created() { | ||||||
| 		this.name = this.$store.state.i.name || ''; | 		this.name = this.$store.state.i.name || ''; | ||||||
| 		this.location = this.$store.state.i.profile.location; | 		this.location = this.$store.state.i.profile.location; | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
|  |  | ||||||
| 		<section class="web" v-show="page == 'web'"> | 		<section class="web" v-show="page == 'web'"> | ||||||
| 			<h1>%i18n:@behaviour%</h1> | 			<h1>%i18n:@behaviour%</h1> | ||||||
| 			<mk-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%"> | 			<mk-switch v-model="fetchOnScroll" text="%i18n:@fetch-on-scroll%"> | ||||||
| 				<span>%i18n:@fetch-on-scroll-desc%</span> | 				<span>%i18n:@fetch-on-scroll-desc%</span> | ||||||
| 			</mk-switch> | 			</mk-switch> | ||||||
| 			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> | 			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%"> | ||||||
| @@ -29,7 +29,7 @@ | |||||||
|  |  | ||||||
| 			<section> | 			<section> | ||||||
| 				<header>%i18n:@note-visibility%</header> | 				<header>%i18n:@note-visibility%</header> | ||||||
| 				<mk-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> | 				<mk-switch v-model="rememberNoteVisibility" text="%i18n:@remember-note-visibility%"/> | ||||||
| 				<section> | 				<section> | ||||||
| 					<header>%i18n:@default-note-visibility%</header> | 					<header>%i18n:@default-note-visibility%</header> | ||||||
| 					<ui-select v-model="defaultNoteVisibility"> | 					<ui-select v-model="defaultNoteVisibility"> | ||||||
| @@ -59,24 +59,26 @@ | |||||||
| 				<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> | 				<button class="ui" @click="updateWallpaper">%i18n:@choose-wallpaper%</button> | ||||||
| 				<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> | 				<button class="ui" @click="deleteWallpaper">%i18n:@delete-wallpaper%</button> | ||||||
| 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> | 				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/> | 				<mk-switch v-model="circleIcons" text="%i18n:@circle-icons%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct" text="%i18n:@contrasted-acct%"/> | 				<mk-switch v-model="contrastedAcct" text="%i18n:@contrasted-acct%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/> | 				<mk-switch v-model="showFullAcct" text="%i18n:common.show-full-acct%"/> | ||||||
| 				<mk-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi" text="%i18n:common.i-like-sushi%"/> | 				<mk-switch v-model="gradientWindowHeader" text="%i18n:@gradient-window-header%"/> | ||||||
|  | 				<mk-switch v-model="iLikeSushi" text="%i18n:common.i-like-sushi%"/> | ||||||
| 			</div> | 			</div> | ||||||
| 			<mk-switch v-model="$store.state.settings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> | 			<mk-switch v-model="showPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.suggestRecentHashtags" @change="onChangeSuggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> | 			<mk-switch v-model="suggestRecentHashtags" text="%i18n:@suggest-recent-hashtags%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showClockOnHeader" @change="onChangeShowClockOnHeader" text="%i18n:@show-clock-on-header%"/> | 			<mk-switch v-model="showClockOnHeader" text="%i18n:@show-clock-on-header%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/> | 			<mk-switch v-model="alwaysShowNsfw" text="%i18n:common.always-show-nsfw%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/> | 			<mk-switch v-model="showReplyTarget" text="%i18n:@show-reply-target%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> | 			<mk-switch v-model="showMyRenotes" text="%i18n:@show-my-renotes%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes" text="%i18n:@show-local-renotes%"/> | 			<mk-switch v-model="showRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%"> | 			<mk-switch v-model="showLocalRenotes" text="%i18n:@show-local-renotes%"/> | ||||||
|  | 			<mk-switch v-model="showMaps" text="%i18n:@show-maps%"> | ||||||
| 				<span>%i18n:@show-maps-desc%</span> | 				<span>%i18n:@show-maps-desc%</span> | ||||||
| 			</mk-switch> | 			</mk-switch> | ||||||
| 			<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> | 			<mk-switch v-model="disableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> | 			<mk-switch v-model="games_reversi_showBoardLabels" text="%i18n:common.show-reversi-board-labels%"/> | ||||||
| 			<mk-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones" text="%i18n:common.use-contrast-reversi-stones%"/> | 			<mk-switch v-model="games_reversi_useContrastStones" text="%i18n:common.use-contrast-reversi-stones%"/> | ||||||
| 		</section> | 		</section> | ||||||
|  |  | ||||||
| 		<section class="web" v-show="page == 'web'"> | 		<section class="web" v-show="page == 'web'"> | ||||||
| @@ -98,7 +100,7 @@ | |||||||
|  |  | ||||||
| 		<section class="web" v-show="page == 'web'"> | 		<section class="web" v-show="page == 'web'"> | ||||||
| 			<h1>%i18n:@mobile%</h1> | 			<h1>%i18n:@mobile%</h1> | ||||||
| 			<mk-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/> | 			<mk-switch v-model="disableViaMobile" text="%i18n:@disable-via-mobile%"/> | ||||||
| 		</section> | 		</section> | ||||||
|  |  | ||||||
| 		<section class="web" v-show="page == 'web'"> | 		<section class="web" v-show="page == 'web'"> | ||||||
| @@ -255,11 +257,6 @@ export default Vue.extend({ | |||||||
| 			set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); } | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		defaultNoteVisibility: { |  | ||||||
| 			get() { return this.$store.state.settings.defaultNoteVisibility; }, |  | ||||||
| 			set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		autoPopout: { | 		autoPopout: { | ||||||
| 			get() { return this.$store.state.device.autoPopout; }, | 			get() { return this.$store.state.device.autoPopout; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } | ||||||
| @@ -298,7 +295,112 @@ export default Vue.extend({ | |||||||
| 		enableExperimentalFeatures: { | 		enableExperimentalFeatures: { | ||||||
| 			get() { return this.$store.state.device.enableExperimentalFeatures; }, | 			get() { return this.$store.state.device.enableExperimentalFeatures; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); } | ||||||
| 		} | 		}, | ||||||
|  |  | ||||||
|  | 		alwaysShowNsfw: { | ||||||
|  | 			get() { return this.$store.state.device.alwaysShowNsfw; }, | ||||||
|  | 			set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		fetchOnScroll: { | ||||||
|  | 			get() { return this.$store.state.settings.fetchOnScroll; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		rememberNoteVisibility: { | ||||||
|  | 			get() { return this.$store.state.settings.rememberNoteVisibility; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		defaultNoteVisibility: { | ||||||
|  | 			get() { return this.$store.state.settings.defaultNoteVisibility; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showReplyTarget: { | ||||||
|  | 			get() { return this.$store.state.settings.showReplyTarget; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showMyRenotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showMyRenotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showMyRenotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showRenotedMyNotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showRenotedMyNotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showRenotedMyNotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showLocalRenotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showLocalRenotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showLocalRenotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showPostFormOnTopOfTl: { | ||||||
|  | 			get() { return this.$store.state.settings.showPostFormOnTopOfTl; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showPostFormOnTopOfTl', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		suggestRecentHashtags: { | ||||||
|  | 			get() { return this.$store.state.settings.suggestRecentHashtags; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'suggestRecentHashtags', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showClockOnHeader: { | ||||||
|  | 			get() { return this.$store.state.settings.showClockOnHeader; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showClockOnHeader', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showMaps: { | ||||||
|  | 			get() { return this.$store.state.settings.showMaps; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showMaps', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		circleIcons: { | ||||||
|  | 			get() { return this.$store.state.settings.circleIcons; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'circleIcons', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		contrastedAcct: { | ||||||
|  | 			get() { return this.$store.state.settings.contrastedAcct; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showFullAcct: { | ||||||
|  | 			get() { return this.$store.state.settings.showFullAcct; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		iLikeSushi: { | ||||||
|  | 			get() { return this.$store.state.settings.iLikeSushi; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		games_reversi_showBoardLabels: { | ||||||
|  | 			get() { return this.$store.state.settings.games.reversi.showBoardLabels; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.showBoardLabels', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		games_reversi_useContrastStones: { | ||||||
|  | 			get() { return this.$store.state.settings.games.reversi.useContrastStones; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		disableAnimatedMfm: { | ||||||
|  | 			get() { return this.$store.state.settings.disableAnimatedMfm; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		disableViaMobile: { | ||||||
|  | 			get() { return this.$store.state.settings.disableViaMobile; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		gradientWindowHeader: { | ||||||
|  | 			get() { return this.$store.state.settings.gradientWindowHeader; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'gradientWindowHeader', value }); } | ||||||
|  | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	created() { | 	created() { | ||||||
| 		(this as any).os.getMeta().then(meta => { | 		(this as any).os.getMeta().then(meta => { | ||||||
| @@ -327,125 +429,11 @@ export default Vue.extend({ | |||||||
| 				wallpaperId: null | 				wallpaperId: null | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
| 		onChangeFetchOnScroll(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'fetchOnScroll', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeRememberNoteVisibility(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'rememberNoteVisibility', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeAutoWatch(v) { | 		onChangeAutoWatch(v) { | ||||||
| 			(this as any).api('i/update', { | 			(this as any).api('i/update', { | ||||||
| 				autoWatch: v | 				autoWatch: v | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
| 		onChangeDark(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'dark', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowPostFormOnTopOfTl(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showPostFormOnTopOfTl', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeSuggestRecentHashtags(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'suggestRecentHashtags', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowClockOnHeader(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showClockOnHeader', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowReplyTarget(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showReplyTarget', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowMyRenotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showMyRenotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowRenotedMyNotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showRenotedMyNotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowLocalRenotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showLocalRenotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeShowMaps(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showMaps', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeCircleIcons(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'circleIcons', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeContrastedAcct(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'contrastedAcct', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeILikeSushi(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'iLikeSushi', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeReversiBoardLabels(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'games.reversi.showBoardLabels', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeUseContrastReversiStones(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'games.reversi.useContrastStones', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeDisableAnimatedMfm(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'disableAnimatedMfm', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeGradientWindowHeader(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'gradientWindowHeader', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		onChangeDisableViaMobile(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'disableViaMobile', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		checkForUpdate() { | 		checkForUpdate() { | ||||||
| 			this.checkingForUpdate = true; | 			this.checkingForUpdate = true; | ||||||
| 			checkForUpdate((this as any).os, true, true).then(newer => { | 			checkForUpdate((this as any).os, true, true).then(newer => { | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| <template> | <template> | ||||||
| <div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide" @click="hide = false"> | <div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false"> | ||||||
| 	<div> | 	<div> | ||||||
| 		<b>%fa:exclamation-triangle% %i18n:@sensitive%</b> | 		<b>%fa:exclamation-triangle% %i18n:@sensitive%</b> | ||||||
| 		<span>%i18n:@click-to-show%</span> | 		<span>%i18n:@click-to-show%</span> | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ export default Vue.extend({ | |||||||
| 	$height = 78px | 	$height = 78px | ||||||
|  |  | ||||||
| 	position fixed | 	position fixed | ||||||
| 	z-index 1024 | 	z-index 10000 | ||||||
| 	left 0 | 	left 0 | ||||||
| 	right 0 | 	right 0 | ||||||
| 	width 100% | 	width 100% | ||||||
|   | |||||||
| @@ -12,21 +12,23 @@ | |||||||
|  |  | ||||||
| 				<section> | 				<section> | ||||||
| 					<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> | 					<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch> | 					<ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.contrastedAcct" @change="onChangeContrastedAcct">%i18n:@contrasted-acct%</ui-switch> | 					<ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch> | 					<ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> | 					<ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.games.reversi.showBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> | 					<ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.games.reversi.useContrastStones" @change="onChangeUseContrastReversiStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> | 					<ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> | ||||||
|  | 					<ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> | ||||||
|  | 					<ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> | ||||||
| 				</section> | 				</section> | ||||||
|  |  | ||||||
| 				<section> | 				<section> | ||||||
| 					<header>%i18n:@timeline%</header> | 					<header>%i18n:@timeline%</header> | ||||||
| 					<div> | 					<div> | ||||||
| 						<ui-switch v-model="$store.state.settings.showReplyTarget" @change="onChangeShowReplyTarget">%i18n:@show-reply-target%</ui-switch> | 						<ui-switch v-model="showReplyTarget">%i18n:@show-reply-target%</ui-switch> | ||||||
| 						<ui-switch v-model="$store.state.settings.showMyRenotes" @change="onChangeShowMyRenotes">%i18n:@show-my-renotes%</ui-switch> | 						<ui-switch v-model="showMyRenotes">%i18n:@show-my-renotes%</ui-switch> | ||||||
| 						<ui-switch v-model="$store.state.settings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> | 						<ui-switch v-model="showRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> | ||||||
| 						<ui-switch v-model="$store.state.settings.showLocalRenotes" @change="onChangeShowLocalRenotes">%i18n:@show-local-renotes%</ui-switch> | 						<ui-switch v-model="showLocalRenotes">%i18n:@show-local-renotes%</ui-switch> | ||||||
| 					</div> | 					</div> | ||||||
| 				</section> | 				</section> | ||||||
|  |  | ||||||
| @@ -47,16 +49,16 @@ | |||||||
| 				<div slot="title">%fa:cog% %i18n:@behavior%</div> | 				<div slot="title">%fa:cog% %i18n:@behavior%</div> | ||||||
|  |  | ||||||
| 				<section> | 				<section> | ||||||
| 					<ui-switch v-model="$store.state.settings.fetchOnScroll" @change="onChangeFetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> | 					<ui-switch v-model="fetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</ui-switch> | 					<ui-switch v-model="disableViaMobile">%i18n:@disable-via-mobile%</ui-switch> | ||||||
| 					<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> | 					<ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> | ||||||
| 					<ui-switch v-model="$store.state.settings.loadRemoteMedia" @change="onChangeLoadRemoteMedia">%i18n:@load-remote-media%</ui-switch> | 					<ui-switch v-model="loadRemoteMedia">%i18n:@load-remote-media%</ui-switch> | ||||||
| 					<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> | 					<ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> | ||||||
| 				</section> | 				</section> | ||||||
|  |  | ||||||
| 				<section> | 				<section> | ||||||
| 					<header>%i18n:@note-visibility%</header> | 					<header>%i18n:@note-visibility%</header> | ||||||
| 					<ui-switch v-model="$store.state.settings.rememberNoteVisibility" @change="onChangeRememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> | 					<ui-switch v-model="rememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> | ||||||
| 					<section> | 					<section> | ||||||
| 						<header>%i18n:@default-note-visibility%</header> | 						<header>%i18n:@default-note-visibility%</header> | ||||||
| 						<ui-select v-model="defaultNoteVisibility"> | 						<ui-select v-model="defaultNoteVisibility"> | ||||||
| @@ -166,6 +168,11 @@ export default Vue.extend({ | |||||||
| 			set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); } | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | 		alwaysShowNsfw: { | ||||||
|  | 			get() { return this.$store.state.device.alwaysShowNsfw; }, | ||||||
|  | 			set(value) { this.$store.commit('device/set', { key: 'alwaysShowNsfw', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
| 		postStyle: { | 		postStyle: { | ||||||
| 			get() { return this.$store.state.device.postStyle; }, | 			get() { return this.$store.state.device.postStyle; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); } | ||||||
| @@ -176,11 +183,6 @@ export default Vue.extend({ | |||||||
| 			set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'mobileNotificationPosition', value }); } | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		defaultNoteVisibility: { |  | ||||||
| 			get() { return this.$store.state.settings.defaultNoteVisibility; }, |  | ||||||
| 			set(value) { this.$store.commit('settings/set', { key: 'defaultNoteVisibility', value }); } |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		lightmode: { | 		lightmode: { | ||||||
| 			get() { return this.$store.state.device.lightmode; }, | 			get() { return this.$store.state.device.lightmode; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); } | ||||||
| @@ -200,6 +202,86 @@ export default Vue.extend({ | |||||||
| 			get() { return this.$store.state.device.enableSounds; }, | 			get() { return this.$store.state.device.enableSounds; }, | ||||||
| 			set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); } | 			set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); } | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
|  | 		fetchOnScroll: { | ||||||
|  | 			get() { return this.$store.state.settings.fetchOnScroll; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		rememberNoteVisibility: { | ||||||
|  | 			get() { return this.$store.state.settings.rememberNoteVisibility; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'rememberNoteVisibility', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		disableViaMobile: { | ||||||
|  | 			get() { return this.$store.state.settings.disableViaMobile; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'disableViaMobile', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		loadRemoteMedia: { | ||||||
|  | 			get() { return this.$store.state.settings.loadRemoteMedia; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'loadRemoteMedia', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		circleIcons: { | ||||||
|  | 			get() { return this.$store.state.settings.circleIcons; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'circleIcons', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		contrastedAcct: { | ||||||
|  | 			get() { return this.$store.state.settings.contrastedAcct; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'contrastedAcct', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showFullAcct: { | ||||||
|  | 			get() { return this.$store.state.settings.showFullAcct; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showFullAcct', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		iLikeSushi: { | ||||||
|  | 			get() { return this.$store.state.settings.iLikeSushi; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'iLikeSushi', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		games_reversi_showBoardLabels: { | ||||||
|  | 			get() { return this.$store.state.settings.games.reversi.showBoardLabels; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.showBoardLabels', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		games_reversi_useContrastStones: { | ||||||
|  | 			get() { return this.$store.state.settings.games.reversi.useContrastStones; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'games.reversi.useContrastStones', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		disableAnimatedMfm: { | ||||||
|  | 			get() { return this.$store.state.settings.disableAnimatedMfm; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'disableAnimatedMfm', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showReplyTarget: { | ||||||
|  | 			get() { return this.$store.state.settings.showReplyTarget; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showReplyTarget', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showMyRenotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showMyRenotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showMyRenotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showRenotedMyNotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showRenotedMyNotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showRenotedMyNotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		showLocalRenotes: { | ||||||
|  | 			get() { return this.$store.state.settings.showLocalRenotes; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'showLocalRenotes', value }); } | ||||||
|  | 		}, | ||||||
|  |  | ||||||
|  | 		defaultNoteVisibility: { | ||||||
|  | 			get() { return this.$store.state.settings.defaultNoteVisibility; }, | ||||||
|  | 			set(value) { this.$store.dispatch('settings/set', { key: 'defaultNoteVisibility', value }); } | ||||||
|  | 		}, | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	mounted() { | 	mounted() { | ||||||
| @@ -211,104 +293,6 @@ export default Vue.extend({ | |||||||
| 			(this as any).os.signout(); | 			(this as any).os.signout(); | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		onChangeFetchOnScroll(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'fetchOnScroll', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeRememberNoteVisibility(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'rememberNoteVisibility', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeDisableViaMobile(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'disableViaMobile', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeLoadRemoteMedia(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'loadRemoteMedia', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeCircleIcons(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'circleIcons', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeContrastedAcct(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'contrastedAcct', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeILikeSushi(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'iLikeSushi', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeReversiBoardLabels(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'games.reversi.showBoardLabels', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeUseContrastReversiStones(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'games.reversi.useContrastStones', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeDisableAnimatedMfm(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'disableAnimatedMfm', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeShowReplyTarget(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showReplyTarget', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeShowMyRenotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showMyRenotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeShowRenotedMyNotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showRenotedMyNotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		onChangeShowLocalRenotes(v) { |  | ||||||
| 			this.$store.dispatch('settings/set', { |  | ||||||
| 				key: 'showLocalRenotes', |  | ||||||
| 				value: v |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
|  |  | ||||||
| 		checkForUpdate() { | 		checkForUpdate() { | ||||||
| 			this.checkingForUpdate = true; | 			this.checkingForUpdate = true; | ||||||
| 			checkForUpdate((this as any).os, true, true).then(newer => { | 			checkForUpdate((this as any).os, true, true).then(newer => { | ||||||
|   | |||||||
| @@ -49,6 +49,7 @@ | |||||||
|  |  | ||||||
| 		<div> | 		<div> | ||||||
| 			<ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch> | 			<ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch> | ||||||
|  | 			<ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch> | ||||||
| 		</div> | 		</div> | ||||||
| 	</section> | 	</section> | ||||||
|  |  | ||||||
| @@ -85,6 +86,13 @@ export default Vue.extend({ | |||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	computed: { | ||||||
|  | 		alwaysMarkNsfw: { | ||||||
|  | 			get() { return this.$store.state.i.settings.alwaysMarkNsfw; }, | ||||||
|  | 			set(value) { (this as any).api('i/update', { alwaysMarkNsfw: value }); } | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	created() { | 	created() { | ||||||
| 		this.name = this.$store.state.i.name || ''; | 		this.name = this.$store.state.i.name || ''; | ||||||
| 		this.username = this.$store.state.i.username; | 		this.username = this.$store.state.i.username; | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ const defaultSettings = { | |||||||
| 	showClockOnHeader: true, | 	showClockOnHeader: true, | ||||||
| 	circleIcons: true, | 	circleIcons: true, | ||||||
| 	contrastedAcct: true, | 	contrastedAcct: true, | ||||||
|  | 	showFullAcct: false, | ||||||
| 	gradientWindowHeader: false, | 	gradientWindowHeader: false, | ||||||
| 	showReplyTarget: true, | 	showReplyTarget: true, | ||||||
| 	showMyRenotes: true, | 	showMyRenotes: true, | ||||||
| @@ -47,6 +48,7 @@ const defaultDeviceSettings = { | |||||||
| 	debug: false, | 	debug: false, | ||||||
| 	lightmode: false, | 	lightmode: false, | ||||||
| 	loadRawImages: false, | 	loadRawImages: false, | ||||||
|  | 	alwaysShowNsfw: false, | ||||||
| 	postStyle: 'standard', | 	postStyle: 'standard', | ||||||
| 	mobileNotificationPosition: 'bottom' | 	mobileNotificationPosition: 'bottom' | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -204,4 +204,30 @@ export interface IStats { | |||||||
| 			decSize: number; | 			decSize: number; | ||||||
| 		}; | 		}; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * ネットワークに関する統計 | ||||||
|  | 	 */ | ||||||
|  | 	network: { | ||||||
|  | 		/** | ||||||
|  | 		 * サーバーへのリクエスト数 | ||||||
|  | 		 */ | ||||||
|  | 		requests: number; | ||||||
|  |  | ||||||
|  | 		/** | ||||||
|  | 		 * 応答時間の合計 | ||||||
|  | 		 * TIP: (totalTime / requests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる | ||||||
|  | 		 */ | ||||||
|  | 		totalTime: number; | ||||||
|  |  | ||||||
|  | 		/** | ||||||
|  | 		 * 合計受信データ量 | ||||||
|  | 		 */ | ||||||
|  | 		incomingBytes: number; | ||||||
|  |  | ||||||
|  | 		/** | ||||||
|  | 		 * 合計送信データ量 | ||||||
|  | 		 */ | ||||||
|  | 		outgoingBytes: number; | ||||||
|  | 	}; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -102,7 +102,10 @@ export interface ILocalUser extends IUserBase { | |||||||
| 	twoFactorEnabled: boolean; | 	twoFactorEnabled: boolean; | ||||||
| 	twoFactorTempSecret?: string; | 	twoFactorTempSecret?: string; | ||||||
| 	clientSettings: any; | 	clientSettings: any; | ||||||
| 	settings: any; | 	settings: { | ||||||
|  | 		autoWatch: boolean; | ||||||
|  | 		alwaysMarkNsfw?: boolean; | ||||||
|  | 	}; | ||||||
| 	hasUnreadNotification: boolean; | 	hasUnreadNotification: boolean; | ||||||
| 	hasUnreadMessagingMessage: boolean; | 	hasUnreadMessagingMessage: boolean; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ import Meta from '../../../../models/meta'; | |||||||
|  |  | ||||||
| export default () => new Promise(async (res, rej) => { | export default () => new Promise(async (res, rej) => { | ||||||
| 	const meta = await Meta.findOne({}); | 	const meta = await Meta.findOne({}); | ||||||
| 	const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); | 	const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : []; | ||||||
|  |  | ||||||
| 	const span = 1000 * 60 * 60 * 24 * 7; // 1週間 | 	const span = 1000 * 60 * 60 * 24 * 7; // 1週間 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,6 +6,15 @@ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; | |||||||
|  |  | ||||||
| function migrateStats(stats: IStats[]) { | function migrateStats(stats: IStats[]) { | ||||||
| 	stats.forEach(stat => { | 	stats.forEach(stat => { | ||||||
|  | 		if (stat.network == null) { | ||||||
|  | 			stat.network = { | ||||||
|  | 				requests: 0, | ||||||
|  | 				totalTime: 0, | ||||||
|  | 				incomingBytes: 0, | ||||||
|  | 				outgoingBytes: 0 | ||||||
|  | 			}; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		const isOldData = | 		const isOldData = | ||||||
| 			stat.users.local.inc == null || | 			stat.users.local.inc == null || | ||||||
| 			stat.users.local.dec == null || | 			stat.users.local.dec == null || | ||||||
| @@ -180,6 +189,12 @@ export default (params: any) => new Promise(async (res, rej) => { | |||||||
| 								decCount: 0, | 								decCount: 0, | ||||||
| 								decSize: 0 | 								decSize: 0 | ||||||
| 							} | 							} | ||||||
|  | 						}, | ||||||
|  | 						network: { | ||||||
|  | 							requests: 0, | ||||||
|  | 							totalTime: 0, | ||||||
|  | 							incomingBytes: 0, | ||||||
|  | 							outgoingBytes: 0 | ||||||
| 						} | 						} | ||||||
| 					}); | 					}); | ||||||
| 				} else { | 				} else { | ||||||
| @@ -236,6 +251,12 @@ export default (params: any) => new Promise(async (res, rej) => { | |||||||
| 								decCount: 0, | 								decCount: 0, | ||||||
| 								decSize: 0 | 								decSize: 0 | ||||||
| 							} | 							} | ||||||
|  | 						}, | ||||||
|  | 						network: { | ||||||
|  | 							requests: 0, | ||||||
|  | 							totalTime: 0, | ||||||
|  | 							incomingBytes: 0, | ||||||
|  | 							outgoingBytes: 0 | ||||||
| 						} | 						} | ||||||
| 					}); | 					}); | ||||||
| 				} | 				} | ||||||
|   | |||||||
| @@ -31,8 +31,8 @@ export const meta = { | |||||||
| 			} | 			} | ||||||
| 		}), | 		}), | ||||||
|  |  | ||||||
| 		isSensitive: $.bool.optional.note({ | 		isSensitive: $.bool.optional.nullable.note({ | ||||||
| 			default: false, | 			default: null, | ||||||
| 			desc: { | 			desc: { | ||||||
| 				'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', | 				'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか', | ||||||
| 				'en-US': 'Whether this media is NSFW' | 				'en-US': 'Whether this media is NSFW' | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ const max = 5; | |||||||
|  */ |  */ | ||||||
| export default () => new Promise(async (res, rej) => { | export default () => new Promise(async (res, rej) => { | ||||||
| 	const meta = await Meta.findOne({}); | 	const meta = await Meta.findOne({}); | ||||||
| 	const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase()); | 	const hidedTags = meta ? (meta.hidedTags || []).map(t => t.toLowerCase()) : []; | ||||||
|  |  | ||||||
| 	//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計 | 	//#region 1. 直近Aの内に投稿されたハッシュタグ(とユーザーのペア)を集計 | ||||||
| 	const data = await Note.aggregate([{ | 	const data = await Note.aggregate([{ | ||||||
|   | |||||||
| @@ -84,6 +84,12 @@ export const meta = { | |||||||
| 				'ja-JP': '投稿の自動ウォッチをするか否か' | 				'ja-JP': '投稿の自動ウォッチをするか否か' | ||||||
| 			} | 			} | ||||||
| 		}), | 		}), | ||||||
|  |  | ||||||
|  | 		alwaysMarkNsfw: $.bool.optional.note({ | ||||||
|  | 			desc: { | ||||||
|  | 				'ja-JP': 'アップロードするメディアをデフォルトで「閲覧注意」として設定するか' | ||||||
|  | 			} | ||||||
|  | 		}), | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -106,6 +112,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a | |||||||
| 	if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot; | 	if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot; | ||||||
| 	if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat; | 	if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat; | ||||||
| 	if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch; | 	if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch; | ||||||
|  | 	if (typeof ps.alwaysMarkNsfw == 'boolean') updates['settings.alwaysMarkNsfw'] = ps.alwaysMarkNsfw; | ||||||
|  |  | ||||||
| 	if (ps.avatarId) { | 	if (ps.avatarId) { | ||||||
| 		const avatar = await DriveFile.findOne({ | 		const avatar = await DriveFile.findOne({ | ||||||
|   | |||||||
| @@ -11,11 +11,13 @@ import * as Router from 'koa-router'; | |||||||
| import * as mount from 'koa-mount'; | import * as mount from 'koa-mount'; | ||||||
| import * as compress from 'koa-compress'; | import * as compress from 'koa-compress'; | ||||||
| import * as logger from 'koa-logger'; | import * as logger from 'koa-logger'; | ||||||
|  | const requestStats = require('request-stats'); | ||||||
| //const slow = require('koa-slow'); | //const slow = require('koa-slow'); | ||||||
|  |  | ||||||
| import activityPub from './activitypub'; | import activityPub from './activitypub'; | ||||||
| import webFinger from './webfinger'; | import webFinger from './webfinger'; | ||||||
| import config from '../config'; | import config from '../config'; | ||||||
|  | import { updateNetworkStats } from '../services/update-chart'; | ||||||
|  |  | ||||||
| // Init app | // Init app | ||||||
| const app = new Koa(); | const app = new Koa(); | ||||||
| @@ -81,4 +83,27 @@ export default () => new Promise(resolve => { | |||||||
|  |  | ||||||
| 	// Listen | 	// Listen | ||||||
| 	server.listen(config.port, resolve); | 	server.listen(config.port, resolve); | ||||||
|  |  | ||||||
|  | 	//#region Network stats | ||||||
|  | 	let queue: any[] = []; | ||||||
|  |  | ||||||
|  | 	requestStats(server, (stats: any) => { | ||||||
|  | 		if (stats.ok) { | ||||||
|  | 			queue.push(stats); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	// Bulk write | ||||||
|  | 	setInterval(() => { | ||||||
|  | 		if (queue.length == 0) return; | ||||||
|  |  | ||||||
|  | 		const requests = queue.length; | ||||||
|  | 		const time = queue.reduce((a, b) => a + b.time, 0); | ||||||
|  | 		const incomingBytes = queue.reduce((a, b) => a + b.req.bytes, 0); | ||||||
|  | 		const outgoingBytes = queue.reduce((a, b) => a + b.res.bytes, 0); | ||||||
|  | 		queue = []; | ||||||
|  |  | ||||||
|  | 		updateNetworkStats(requests, time, incomingBytes, outgoingBytes); | ||||||
|  | 	}, 5000); | ||||||
|  | 	//#endregion | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -153,7 +153,7 @@ export default async function( | |||||||
| 	isLink: boolean = false, | 	isLink: boolean = false, | ||||||
| 	url: string = null, | 	url: string = null, | ||||||
| 	uri: string = null, | 	uri: string = null, | ||||||
| 	sensitive = false | 	sensitive: boolean = null | ||||||
| ): Promise<IDriveFile> { | ): Promise<IDriveFile> { | ||||||
| 	// Calc md5 hash | 	// Calc md5 hash | ||||||
| 	const calcHash = new Promise<string>((res, rej) => { | 	const calcHash = new Promise<string>((res, rej) => { | ||||||
| @@ -329,7 +329,13 @@ export default async function( | |||||||
| 		properties: properties, | 		properties: properties, | ||||||
| 		withoutChunks: isLink, | 		withoutChunks: isLink, | ||||||
| 		isRemote: isLink, | 		isRemote: isLink, | ||||||
| 		isSensitive: sensitive | 		isSensitive: (sensitive !== null && sensitive !== undefined) | ||||||
|  | 			? sensitive | ||||||
|  | 			: isLocalUser(user) | ||||||
|  | 				? user.settings.alwaysMarkNsfw | ||||||
|  | 					? true | ||||||
|  | 					: false | ||||||
|  | 				: false | ||||||
| 	} as IMetadata; | 	} as IMetadata; | ||||||
|  |  | ||||||
| 	if (url !== null) { | 	if (url !== null) { | ||||||
|   | |||||||
| @@ -96,6 +96,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> { | |||||||
| 						decCount: 0, | 						decCount: 0, | ||||||
| 						decSize: 0 | 						decSize: 0 | ||||||
| 					} | 					} | ||||||
|  | 				}, | ||||||
|  | 				network: { | ||||||
|  | 					requests: 0, | ||||||
|  | 					totalTime: 0, | ||||||
|  | 					incomingBytes: 0, | ||||||
|  | 					outgoingBytes: 0 | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
| @@ -161,6 +167,12 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> { | |||||||
| 						decCount: 0, | 						decCount: 0, | ||||||
| 						decSize: 0 | 						decSize: 0 | ||||||
| 					} | 					} | ||||||
|  | 				}, | ||||||
|  | 				network: { | ||||||
|  | 					requests: 0, | ||||||
|  | 					totalTime: 0, | ||||||
|  | 					incomingBytes: 0, | ||||||
|  | 					outgoingBytes: 0 | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
| @@ -243,3 +255,13 @@ export async function updateDriveStats(file: IDriveFile, isAdditional: boolean) | |||||||
|  |  | ||||||
| 	await update(inc); | 	await update(inc); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export async function updateNetworkStats(requests: number, time: number, incomingBytes: number, outgoingBytes: number) { | ||||||
|  | 	const inc = {} as any; | ||||||
|  | 	inc['network.requests'] = requests; | ||||||
|  | 	inc['network.totalTime'] = time; | ||||||
|  | 	inc['network.incomingBytes'] = incomingBytes; | ||||||
|  | 	inc['network.outgoingBytes'] = outgoingBytes; | ||||||
|  |  | ||||||
|  | 	await update(inc); | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user