From d633fe41bc68b8f6edc983049d1ef2216a390922 Mon Sep 17 00:00:00 2001 From: Evan Paterakis Date: Sat, 5 Oct 2024 14:49:29 +0300 Subject: [PATCH 01/14] Don't depend on launcher.moe for status assets --- .../src/server/web/ClientServerService.ts | 6 +++--- packages/frontend/assets/status/error.png | Bin 0 -> 26966 bytes .../frontend/assets/status/missingpage.webp | Bin 0 -> 6578 bytes packages/frontend/assets/status/nothinghere.png | Bin 0 -> 36452 bytes packages/frontend/src/const.ts | 6 +++--- packages/frontend/src/index.html | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 packages/frontend/assets/status/error.png create mode 100644 packages/frontend/assets/status/missingpage.webp create mode 100644 packages/frontend/assets/status/nothinghere.png diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 0af90a844b..e20707977f 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -193,9 +193,9 @@ export class ClientServerService { icon: meta.iconUrl, appleTouchIcon: meta.app512IconUrl, themeColor: meta.themeColor, - serverErrorImageUrl: meta.serverErrorImageUrl ?? 'https://launcher.moe/error.png', - infoImageUrl: meta.infoImageUrl ?? 'https://launcher.moe/nothinghere.png', - notFoundImageUrl: meta.notFoundImageUrl ?? 'https://launcher.moe/missingpage.webp', + serverErrorImageUrl: meta.serverErrorImageUrl ?? '/status/error.png', + infoImageUrl: meta.infoImageUrl ?? '/status/nothinghere.png', + notFoundImageUrl: meta.notFoundImageUrl ?? '/status/missingpage.webp', instanceUrl: this.config.url, randomMOTD: this.config.customMOTD ? this.config.customMOTD[Math.floor(Math.random() * this.config.customMOTD.length)] : undefined, metaJson: htmlSafeJsonStringify(await this.metaEntityService.packDetailed(meta)), diff --git a/packages/frontend/assets/status/error.png b/packages/frontend/assets/status/error.png new file mode 100644 index 0000000000000000000000000000000000000000..9f21236c39379d34cad8cb6a195ab793fcd9f65f GIT binary patch literal 26966 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/status/nothinghere.png b/packages/frontend/assets/status/nothinghere.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebe210acdaa5008678a64f3595af606755f5e57 GIT binary patch literal 36452 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/src/const.ts b/packages/frontend/src/const.ts index c94c0d4408..058db9b981 100644 --- a/packages/frontend/src/const.ts +++ b/packages/frontend/src/const.ts @@ -160,9 +160,9 @@ export const ROLE_POLICIES = [ export const CURRENT_STICKY_TOP = 'CURRENT_STICKY_TOP'; export const CURRENT_STICKY_BOTTOM = 'CURRENT_STICKY_BOTTOM'; -export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://launcher.moe/error.png'; -export const DEFAULT_NOT_FOUND_IMAGE_URL = 'https://launcher.moe/missingpage.webp'; -export const DEFAULT_INFO_IMAGE_URL = 'https://launcher.moe/nothinghere.png'; +export const DEFAULT_SERVER_ERROR_IMAGE_URL = '/status/error.png'; +export const DEFAULT_NOT_FOUND_IMAGE_URL = '/status/missingpage.webp'; +export const DEFAULT_INFO_IMAGE_URL = '/status/nothinghere.png'; export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'border', 'font', 'blur', 'rainbow', 'sparkle', 'rotate', 'ruby', 'unixtime', 'crop', 'fade', 'followmouse']; export const MFM_PARAMS: Record = { diff --git a/packages/frontend/src/index.html b/packages/frontend/src/index.html index 733116b75f..fdeb642c70 100644 --- a/packages/frontend/src/index.html +++ b/packages/frontend/src/index.html @@ -20,7 +20,7 @@ worker-src 'self'; script-src 'self' 'unsafe-eval' https://*.hcaptcha.com https://challenges.cloudflare.com https://esm.sh; style-src 'self' 'unsafe-inline'; - img-src 'self' data: blob: www.google.com xn--931a.moe launcher.moe localhost:3000 localhost:5173 127.0.0.1:5173 127.0.0.1:3000 activitypub.software secure.gravatar.com avatars.githubusercontent.com; + img-src 'self' data: blob: www.google.com xn--931a.moe localhost:3000 localhost:5173 127.0.0.1:5173 127.0.0.1:3000 activitypub.software secure.gravatar.com avatars.githubusercontent.com; media-src 'self' localhost:3000 localhost:5173 127.0.0.1:5173 127.0.0.1:3000; connect-src 'self' localhost:3000 localhost:5173 127.0.0.1:5173 127.0.0.1:3000 https://newassets.hcaptcha.com https://api.listenbrainz.org; frame-src *;" From 1410f8d501405919e9b03f68d83714f5f764bdea Mon Sep 17 00:00:00 2001 From: PrivateGER Date: Fri, 13 Sep 2024 11:38:51 +0100 Subject: [PATCH 02/14] Experimental: dont mark backfetched notes as silent --- packages/backend/src/core/activitypub/models/ApNoteService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts index 7b7a7921fb..382cda301f 100644 --- a/packages/backend/src/core/activitypub/models/ApNoteService.ts +++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts @@ -587,7 +587,7 @@ export class ApNoteService { // ここでuriの代わりに添付されてきたNote Objectが指定されていると、サーバーフェッチを経ずにノートが生成されるが // 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。 const createFrom = options.sentFrom?.origin === new URL(uri).origin ? value : uri; - return await this.createNote(createFrom, options.resolver, true); + return await this.createNote(createFrom, options.resolver, false); } finally { unlock(); } From 5cd44433a0c4b18f24172c31a528e12c767c4fc9 Mon Sep 17 00:00:00 2001 From: Evan Paterakis Date: Sat, 5 Oct 2024 21:10:33 +0300 Subject: [PATCH 03/14] Set visitor dashboard's menu button z-index to 50 --- packages/frontend/src/components/MkVisitorDashboard.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/components/MkVisitorDashboard.vue b/packages/frontend/src/components/MkVisitorDashboard.vue index b154f7a5b3..ff2e27aaf8 100644 --- a/packages/frontend/src/components/MkVisitorDashboard.vue +++ b/packages/frontend/src/components/MkVisitorDashboard.vue @@ -142,6 +142,7 @@ function showMenu(ev: MouseEvent) { height: 32px; border-radius: var(--radius-sm); font-size: 18px; + z-index: 50; } .mainFg { From c0702fd92f70782005517c0065048ececa1ef287 Mon Sep 17 00:00:00 2001 From: Evan Paterakis Date: Sat, 5 Oct 2024 22:58:43 +0300 Subject: [PATCH 04/14] Check if time-based achievements are unlocked before initializing them in main-boot --- packages/frontend/src/boot/main-boot.ts | 28 +++++++++++++++---------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index c10930a038..5ff998fac4 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -216,19 +216,25 @@ export async function mainBoot() { claimAchievement('collectAchievements30'); } - window.setInterval(() => { - if (Math.floor(Math.random() * 20000) === 0) { - claimAchievement('justPlainLucky'); - } - }, 1000 * 10); + if (!claimedAchievements.includes('justPlainLucky')) { + window.setInterval(() => { + if (Math.floor(Math.random() * 20000) === 0) { + claimAchievement('justPlainLucky'); + } + }, 1000 * 10); + } - window.setTimeout(() => { - claimAchievement('client30min'); - }, 1000 * 60 * 30); + if (!claimedAchievements.includes('client30min')) { + window.setTimeout(() => { + claimAchievement('client30min'); + }, 1000 * 60 * 30); + } - window.setTimeout(() => { - claimAchievement('client60min'); - }, 1000 * 60 * 60); + if (!claimedAchievements.includes('client60min')) { + window.setTimeout(() => { + claimAchievement('client60min'); + }, 1000 * 60 * 60); + } // 邪魔 //const lastUsed = miLocalStorage.getItem('lastUsed'); From ca98107eeeb2ea4a498693caff8a725cf8333b40 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sat, 5 Oct 2024 18:25:13 -0400 Subject: [PATCH 05/14] respect following privacy settings --- .../frontend/src/components/MkPostForm.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index dc3f3aa94c..e2aeda7a94 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -630,11 +630,21 @@ async function onPaste(ev: ClipboardEvent) { if (paste.length > 1000) { ev.preventDefault(); - os.confirm({ - type: 'info', + os.actions({ + type: 'question', text: i18n.ts.attachAsFileQuestion, - }).then(({ canceled }) => { - if (canceled) { + actions: [ + { + value: 'yes', + text: i18n.ts.yes, + }, + { + value: 'no', + text: i18n.ts.no, + }, + ], + }).then(({ result }) => { + if (result !== 'yes') { insertTextAtCursor(textareaEl.value, paste); return; } From c63599261603b6c4619a9d31ba89006115140e88 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sat, 5 Oct 2024 18:47:50 -0400 Subject: [PATCH 06/14] restore primary highlighting --- packages/frontend/src/components/MkPostForm.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index e2aeda7a94..add5296f0a 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -637,6 +637,7 @@ async function onPaste(ev: ClipboardEvent) { { value: 'yes', text: i18n.ts.yes, + primary: true, }, { value: 'no', From e622ab7cc7e13b96ca14c7ef496bb6572ee7af97 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sat, 5 Oct 2024 19:13:09 -0400 Subject: [PATCH 07/14] indicate if a user is blocked / muted by the current user --- locales/en-US.yml | 2 ++ locales/index.d.ts | 20 +++++++++++----- locales/ja-JP.yml | 2 ++ packages/frontend/src/pages/user/home.vue | 29 +++++++++++++++++------ 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 221ade4028..2f855ef9eb 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -143,8 +143,10 @@ markAsSensitive: "Mark as sensitive" unmarkAsSensitive: "Unmark as sensitive" enterFileName: "Enter filename" mute: "Mute" +muted: "Muted" unmute: "Unmute" renoteMute: "Mute Boosts" +renoteMuted: "Boosts muted" renoteUnmute: "Unmute Boosts" block: "Block" unblock: "Unblock" diff --git a/locales/index.d.ts b/locales/index.d.ts index f93ef14325..8a17705600 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -588,6 +588,10 @@ export interface Locale extends ILocale { * ミュート */ "mute": string; + /** + * Muted + */ + "muted": string; /** * ミュート解除 */ @@ -596,6 +600,10 @@ export interface Locale extends ILocale { * ブーストをミュート */ "renoteMute": string; + /** + * Boosts muted + */ + "renoteMuted": string; /** * ブーストのミュートを解除 */ @@ -3128,6 +3136,10 @@ export interface Locale extends ILocale { * 返信にサーバー情報を表示する */ "showTickerOnReplies": string; + /** + * 猫の話し方を無効にする + */ + "disableCatSpeak": string; /** * 検索MFMの検索エンジン */ @@ -4429,10 +4441,6 @@ export interface Locale extends ILocale { * 連合なしにする */ "disableFederationOk": string; - /** - * 猫の話し方を無効にする - */ - "disableCatSpeak": string; /** * 現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。 */ @@ -5777,7 +5785,7 @@ export interface Locale extends ILocale { */ "social": string; /** - * バッッブルタイムラインでは、管理者が選択した接続サーバーからのメモを表示できます。 + * バブルタイムラインでは、管理者が選択した接続サーバーからの投稿を表示できます。 */ "bubble": string; /** @@ -9139,7 +9147,7 @@ export interface Locale extends ILocale { */ "global": string; /** - * バッッブル + * バブル */ "bubble": string; }; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 70acc3adf4..724e9a23a1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -143,8 +143,10 @@ markAsSensitive: "センシティブとして設定" unmarkAsSensitive: "センシティブを解除する" enterFileName: "ファイル名を入力" mute: "ミュート" +muted: "Muted" unmute: "ミュート解除" renoteMute: "ブーストをミュート" +renoteMuted: "Boosts muted" renoteUnmute: "ブーストのミュートを解除" block: "ブロック" unblock: "ブロック解除" diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index b997fe1c3f..e82ec0cb97 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -30,7 +30,12 @@ SPDX-License-Identifier: AGPL-3.0-only - {{ i18n.ts.followsYou }} +
+ {{ i18n.ts.followsYou }} + {{ i18n.ts.muted }} + {{ i18n.ts.renoteMuted }} + {{ i18n.ts.blocked }} +
@@ -445,15 +450,25 @@ onUnmounted(() => { background: linear-gradient(transparent, rgba(#000, 0.7)); } - > .followed { + > .info-badges { position: absolute; top: 12px; left: 12px; - padding: 4px 8px; - color: #fff; - background: rgba(0, 0, 0, 0.7); - font-size: 0.7em; - border-radius: var(--radius-sm); + + display: flex; + flex-direction: row; + + > * { + padding: 4px 8px; + color: #fff; + background: rgba(0, 0, 0, 0.7); + font-size: 0.7em; + border-radius: var(--radius-sm); + } + + > :not(:first-child) { + margin-left: 8px; + } } > .actions { From c315f9ccf5f652278a5f70394f191b0a84566fa5 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sat, 5 Oct 2024 19:48:35 -0400 Subject: [PATCH 08/14] include Mastodon's "indexable" property on federated user profiles --- packages/backend/src/core/activitypub/ApRendererService.ts | 1 + packages/backend/src/core/activitypub/misc/contexts.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts index 55d1054de9..499a163d6c 100644 --- a/packages/backend/src/core/activitypub/ApRendererService.ts +++ b/packages/backend/src/core/activitypub/ApRendererService.ts @@ -526,6 +526,7 @@ export class ApRendererService { publicKey: this.renderKey(user, keypair, '#main-key'), isCat: user.isCat, noindex: user.noindex, + indexable: !user.noindex, speakAsCat: user.speakAsCat, attachment: attachment.length ? attachment : undefined, }; diff --git a/packages/backend/src/core/activitypub/misc/contexts.ts b/packages/backend/src/core/activitypub/misc/contexts.ts index 815b20b910..86a665732a 100644 --- a/packages/backend/src/core/activitypub/misc/contexts.ts +++ b/packages/backend/src/core/activitypub/misc/contexts.ts @@ -545,6 +545,7 @@ const extension_context_definition = { Emoji: 'toot:Emoji', featured: 'toot:featured', discoverable: 'toot:discoverable', + indexable: 'toot:indexable', // schema schema: 'http://schema.org#', PropertyValue: 'schema:PropertyValue', From b23d650a153ad2e150350fe2c808896ae8a2e3f9 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sat, 5 Oct 2024 20:42:31 -0400 Subject: [PATCH 09/14] warn when a domain is hard-blocked by a base domain --- locales/en-US.yml | 2 ++ locales/index.d.ts | 20 +++++++++++++------ locales/ja-JP.yml | 2 ++ packages/frontend/src/pages/instance-info.vue | 20 +++++++++++++++++-- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 221ade4028..4321c9b5fe 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -263,6 +263,8 @@ noCustomEmojis: "There are no emoji" noJobs: "There are no jobs" federating: "Federating" blocked: "Blocked" +blockedByBase: "This host is blocked implicitly because a base domain is blocked. To unblock this host, first unblock the base domain(s)." +silencedByBase: "This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s)." suspended: "Suspended" all: "All" subscribing: "Subscribing" diff --git a/locales/index.d.ts b/locales/index.d.ts index f93ef14325..530c5008e3 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1068,6 +1068,14 @@ export interface Locale extends ILocale { * ブロック中 */ "blocked": string; + /** + * This host is blocked implicitly because a base domain is blocked. To unblock this host, first unblock the base domain(s). + */ + "blockedByBase": string; + /** + * This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s). + */ + "silencedByBase": string; /** * 配信停止 */ @@ -3128,6 +3136,10 @@ export interface Locale extends ILocale { * 返信にサーバー情報を表示する */ "showTickerOnReplies": string; + /** + * 猫の話し方を無効にする + */ + "disableCatSpeak": string; /** * 検索MFMの検索エンジン */ @@ -4429,10 +4441,6 @@ export interface Locale extends ILocale { * 連合なしにする */ "disableFederationOk": string; - /** - * 猫の話し方を無効にする - */ - "disableCatSpeak": string; /** * 現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。 */ @@ -5777,7 +5785,7 @@ export interface Locale extends ILocale { */ "social": string; /** - * バッッブルタイムラインでは、管理者が選択した接続サーバーからのメモを表示できます。 + * バブルタイムラインでは、管理者が選択した接続サーバーからの投稿を表示できます。 */ "bubble": string; /** @@ -9139,7 +9147,7 @@ export interface Locale extends ILocale { */ "global": string; /** - * バッッブル + * バブル */ "bubble": string; }; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 70acc3adf4..ab70767925 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -263,6 +263,8 @@ noCustomEmojis: "絵文字はありません" noJobs: "ジョブはありません" federating: "連合中" blocked: "ブロック中" +blockedByBase: "This host is blocked implicitly because a base domain is blocked. To unblock this host, first unblock the base domain(s)." +silencedByBase: "This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s)." suspended: "配信停止" all: "全て" subscribing: "購読中" diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 4ff26197d8..6848a0715a 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -45,8 +45,10 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts._delivery.stop }} {{ i18n.ts._delivery.resume }} - {{ i18n.ts.blockThisInstance }} - {{ i18n.ts.silenceThisInstance }} + {{ i18n.ts.blockedByBase }} + {{ i18n.ts.blockThisInstance }} + {{ i18n.ts.silenedByBase }} + {{ i18n.ts.silenceThisInstance }} Mark as NSFW {{ i18n.ts.mediaSilenceThisInstance }} Refresh metadata @@ -174,6 +176,20 @@ const isMediaSilenced = ref(false); const faviconUrl = ref(null); const moderationNote = ref(''); +const baseDomains = computed(() => { + const domains: string[] = []; + + const parts = props.host.toLowerCase().split('.'); + for (let s = 1; s < parts.length; s++) { + const domain = parts.slice(s).join('.'); + domains.push(domain); + } + + return domains; +}); +const isBaseBlocked = computed(() => meta.value && baseDomains.value.some(d => meta.value?.blockedHosts.includes(d))); +const isBaseSilenced = computed(() => meta.value && meta.value.silencedHosts && baseDomains.value.some(d => meta.value?.silencedHosts?.includes(d))); + const usersPagination = { endpoint: iAmModerator ? 'admin/show-users' : 'users' as const, limit: 10, From 2bc9ce93b8760b128cd86e4c69ce727fc1f15524 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sun, 6 Oct 2024 10:47:55 -0400 Subject: [PATCH 10/14] add missing import --- packages/frontend/src/pages/instance-info.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 6848a0715a..94c0f4c3a5 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -158,6 +158,7 @@ import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue'; import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js'; import { dateString } from '@/filters/date.js'; import MkTextarea from '@/components/MkTextarea.vue'; +import MkInfo from '@/components/MkInfo.vue'; const props = defineProps<{ host: string; From 008ac896723a3d1f8ad281c3c61ca954cfff4a92 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sun, 6 Oct 2024 10:58:06 -0400 Subject: [PATCH 11/14] fix translation string --- packages/frontend/src/pages/instance-info.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 94c0f4c3a5..1a90abba12 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -47,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts._delivery.resume }} {{ i18n.ts.blockedByBase }} {{ i18n.ts.blockThisInstance }} - {{ i18n.ts.silenedByBase }} + {{ i18n.ts.silencedByBase }} {{ i18n.ts.silenceThisInstance }} Mark as NSFW {{ i18n.ts.mediaSilenceThisInstance }} From 605c22b55e9cead59e780de58f3fb5673c961f29 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sun, 6 Oct 2024 10:58:27 -0400 Subject: [PATCH 12/14] add lockout for isMediaSilenced --- packages/frontend/src/pages/instance-info.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 1a90abba12..929c22d114 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -50,7 +50,8 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.silencedByBase }} {{ i18n.ts.silenceThisInstance }} Mark as NSFW - {{ i18n.ts.mediaSilenceThisInstance }} + {{ i18n.ts.mediaSilencedByBase }} + {{ i18n.ts.mediaSilenceThisInstance }} Refresh metadata @@ -190,6 +191,7 @@ const baseDomains = computed(() => { }); const isBaseBlocked = computed(() => meta.value && baseDomains.value.some(d => meta.value?.blockedHosts.includes(d))); const isBaseSilenced = computed(() => meta.value && meta.value.silencedHosts && baseDomains.value.some(d => meta.value?.silencedHosts?.includes(d))); +const isBaseMediaSilenced = computed(() => meta.value && meta.value.mediaSilencedHosts && baseDomains.value.some(d => meta.value?.mediaSilencedHosts.includes(d))); const usersPagination = { endpoint: iAmModerator ? 'admin/show-users' : 'users' as const, From eec4a5082d3adf0164c4d320ac444c35bc43e381 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sun, 6 Oct 2024 11:03:28 -0400 Subject: [PATCH 13/14] fix OpenAPI definition for admin/meta.silencedHosts --- packages/backend/src/server/api/endpoints/admin/meta.ts | 2 +- packages/frontend/src/pages/instance-info.vue | 4 ++-- packages/misskey-js/src/autogen/types.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 5a69fbf679..dbfa31024a 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -128,7 +128,7 @@ export const meta = { }, silencedHosts: { type: 'array', - optional: true, + optional: false, nullable: false, items: { type: 'string', diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 929c22d114..821cd599eb 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -190,8 +190,8 @@ const baseDomains = computed(() => { return domains; }); const isBaseBlocked = computed(() => meta.value && baseDomains.value.some(d => meta.value?.blockedHosts.includes(d))); -const isBaseSilenced = computed(() => meta.value && meta.value.silencedHosts && baseDomains.value.some(d => meta.value?.silencedHosts?.includes(d))); -const isBaseMediaSilenced = computed(() => meta.value && meta.value.mediaSilencedHosts && baseDomains.value.some(d => meta.value?.mediaSilencedHosts.includes(d))); +const isBaseSilenced = computed(() => meta.value && baseDomains.value.some(d => meta.value?.silencedHosts.includes(d))); +const isBaseMediaSilenced = computed(() => meta.value && baseDomains.value.some(d => meta.value?.mediaSilencedHosts.includes(d))); const usersPagination = { endpoint: iAmModerator ? 'admin/show-users' : 'users' as const, diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 0e83bdfcca..e3bf828982 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -5199,7 +5199,7 @@ export type operations = { enableEmail: boolean; enableServiceWorker: boolean; translatorAvailable: boolean; - silencedHosts?: string[]; + silencedHosts: string[]; mediaSilencedHosts: string[]; pinnedUsers: string[]; hiddenTags: string[]; From b9e89edbc7cde6a62360fd15eaadf4f7309e2ba6 Mon Sep 17 00:00:00 2001 From: Hazel K Date: Sun, 6 Oct 2024 11:16:18 -0400 Subject: [PATCH 14/14] add missing translation --- locales/en-US.yml | 1 + locales/index.d.ts | 4 ++++ locales/ja-JP.yml | 1 + 3 files changed, 6 insertions(+) diff --git a/locales/en-US.yml b/locales/en-US.yml index 4b949b705a..7e24a62022 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -267,6 +267,7 @@ federating: "Federating" blocked: "Blocked" blockedByBase: "This host is blocked implicitly because a base domain is blocked. To unblock this host, first unblock the base domain(s)." silencedByBase: "This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s)." +mediaSilencedByBase: "This host's media is silenced implicitly because a base domain's media is silenced. To un-silence this host, first un-silence the base domain(s)." suspended: "Suspended" all: "All" subscribing: "Subscribing" diff --git a/locales/index.d.ts b/locales/index.d.ts index c1001125a0..9a02dbc1e2 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1084,6 +1084,10 @@ export interface Locale extends ILocale { * This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s). */ "silencedByBase": string; + /** + * This host's media is silenced implicitly because a base domain's media is silenced. To un-silence this host, first un-silence the base domain(s). + */ + "mediaSilencedByBase": string; /** * 配信停止 */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d6a8faf1e7..c422172eb9 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -267,6 +267,7 @@ federating: "連合中" blocked: "ブロック中" blockedByBase: "This host is blocked implicitly because a base domain is blocked. To unblock this host, first unblock the base domain(s)." silencedByBase: "This host is silenced implicitly because a base domain is silenced. To un-silence this host, first un-silence the base domain(s)." +mediaSilencedByBase: "This host's media is silenced implicitly because a base domain's media is silenced. To un-silence this host, first un-silence the base domain(s)." suspended: "配信停止" all: "全て" subscribing: "購読中"