diff --git a/locales/index.d.ts b/locales/index.d.ts index 5cbe918183..59637f0bcf 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -7689,6 +7689,10 @@ export interface Locale extends ILocale { * Match subdomains */ "isFromInstanceSubdomains": string; + /** + * User is from a bubble instance + */ + "fromBubbleInstance": string; /** * Has X or fewer local followers */ diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index e87c459d5c..039932b76d 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -262,6 +262,10 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { return user.host.toLowerCase() === value.host.toLowerCase(); } } + // Is the user from a local bubble instance + case 'fromBubbleInstance': { + return user.host != null && this.meta.bubbleInstances.includes(user.host); + } // サスペンド済みユーザである case 'isSuspended': { return user.isSuspended; diff --git a/packages/backend/src/models/Role.ts b/packages/backend/src/models/Role.ts index 2caf3e0bd3..f6e3050830 100644 --- a/packages/backend/src/models/Role.ts +++ b/packages/backend/src/models/Role.ts @@ -56,6 +56,13 @@ type CondFormulaValueIsFromInstance = { subdomains: boolean; }; +/** + * Is the user from a local bubble instance + */ +type CondFormulaValueFromBubbleInstance = { + type: 'fromBubbleInstance'; +}; + /** * 既に指定のマニュアルロールにアサインされている場合のみ成立とする */ @@ -234,6 +241,7 @@ export type RoleCondFormulaValue = { id: string } & ( CondFormulaValueIsLocal | CondFormulaValueIsRemote | CondFormulaValueIsFromInstance | + CondFormulaValueFromBubbleInstance | CondFormulaValueIsSuspended | CondFormulaValueIsLocked | CondFormulaValueIsBot | diff --git a/packages/frontend/src/pages/admin/RolesEditorFormula.vue b/packages/frontend/src/pages/admin/RolesEditorFormula.vue index 0f3afd5b22..b7375b0faf 100644 --- a/packages/frontend/src/pages/admin/RolesEditorFormula.vue +++ b/packages/frontend/src/pages/admin/RolesEditorFormula.vue @@ -10,6 +10,7 @@ SPDX-License-Identifier: AGPL-3.0-only + diff --git a/sharkey-locales/en-US.yml b/sharkey-locales/en-US.yml index af60fb2a61..0ebc3a9390 100644 --- a/sharkey-locales/en-US.yml +++ b/sharkey-locales/en-US.yml @@ -245,6 +245,7 @@ _role: isFromInstance: "Is from a specific instance" isFromInstanceHost: "Hostname (case-insensitive)" isFromInstanceSubdomains: "Match subdomains" + fromBubbleInstance: "User is from a bubble instance" localFollowersLessThanOrEq: "Has X or fewer local followers" localFollowersMoreThanOrEq: "Has X or more local followers" localFollowingLessThanOrEq: "Follows X or fewer local accounts"