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"