diff --git a/CHANGELOG.md b/CHANGELOG.md
index dc81997d4..e6c66f085 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,7 @@
- Feat: プロフィールでのリンク検証
- Feat: 通知をテストできるようになりました
- Feat: PWAのアイコンが設定できるようになりました
+- Enhance: アンテナの受信ソースに指定したユーザを除外するものを追加
- Enhance: 二要素認証設定時のセキュリティを強化
- パスワード入力が必要な操作を行う際、二要素認証が有効であれば確認コードの入力も必要になりました
- Enhance: manifest.jsonをオーバーライド可能に
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 3009c9918..f6b6daae8 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -1917,6 +1917,7 @@ export interface Locale {
"homeTimeline": string;
"users": string;
"userList": string;
+ "userBlacklist": string;
};
"_weekday": {
"sunday": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index b30fd5333..82ced0aa3 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1834,6 +1834,7 @@ _antennaSources:
homeTimeline: "フォローしているユーザーのノート"
users: "指定した一人または複数のユーザーのノート"
userList: "指定したリストのユーザーのノート"
+ userBlacklist: "指定した一人または複数のユーザーを除いた全てのノート"
_weekday:
sunday: "日曜日"
diff --git a/packages/backend/migration/1689325027964-UserBlacklistAnntena.js b/packages/backend/migration/1689325027964-UserBlacklistAnntena.js
new file mode 100644
index 000000000..ce246b20f
--- /dev/null
+++ b/packages/backend/migration/1689325027964-UserBlacklistAnntena.js
@@ -0,0 +1,10 @@
+export class UserBlacklistAnntena1689325027964 {
+ name = 'UserBlacklistAnntena1689325027964'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TYPE "antenna_src_enum" ADD VALUE 'users_blacklist' AFTER 'list'`);
+ }
+
+ async down(queryRunner) {
+ }
+}
diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts
index a7e74eeef..841ce4b84 100644
--- a/packages/backend/src/core/AntennaService.ts
+++ b/packages/backend/src/core/AntennaService.ts
@@ -119,6 +119,12 @@ export class AntennaService implements OnApplicationShutdown {
return this.utilityService.getFullApAccount(username, host).toLowerCase();
});
if (!accts.includes(this.utilityService.getFullApAccount(noteUser.username, noteUser.host).toLowerCase())) return false;
+ } else if (antenna.src === 'users_blacklist') {
+ const accts = antenna.users.map(x => {
+ const { username, host } = Acct.parse(x);
+ return this.utilityService.getFullApAccount(username, host).toLowerCase();
+ });
+ if (accts.includes(this.utilityService.getFullApAccount(noteUser.username, noteUser.host).toLowerCase())) return false;
}
const keywords = antenna.keywords
diff --git a/packages/backend/src/models/Antenna.ts b/packages/backend/src/models/Antenna.ts
index 7c1d80cc4..dc398b6dd 100644
--- a/packages/backend/src/models/Antenna.ts
+++ b/packages/backend/src/models/Antenna.ts
@@ -41,8 +41,8 @@ export class MiAntenna {
})
public name: string;
- @Column('enum', { enum: ['home', 'all', 'users', 'list'] })
- public src: 'home' | 'all' | 'users' | 'list';
+ @Column('enum', { enum: ['home', 'all', 'users', 'list', 'users_blacklist'] })
+ public src: 'home' | 'all' | 'users' | 'list' | 'users_blacklist';
@Column({
...id(),
diff --git a/packages/backend/src/models/json-schema/antenna.ts b/packages/backend/src/models/json-schema/antenna.ts
index 3f58cbee6..7b6475919 100644
--- a/packages/backend/src/models/json-schema/antenna.ts
+++ b/packages/backend/src/models/json-schema/antenna.ts
@@ -47,7 +47,7 @@ export const packedAntennaSchema = {
src: {
type: 'string',
optional: false, nullable: false,
- enum: ['home', 'all', 'users', 'list'],
+ enum: ['home', 'all', 'users', 'list', 'users_blacklist'],
},
userListId: {
type: 'string',
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index f1170efe4..15fca4904 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -47,7 +47,7 @@ export const paramDef = {
type: 'object',
properties: {
name: { type: 'string', minLength: 1, maxLength: 100 },
- src: { type: 'string', enum: ['home', 'all', 'users', 'list'] },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'users_blacklist'] },
userListId: { type: 'string', format: 'misskey:id', nullable: true },
keywords: { type: 'array', items: {
type: 'array', items: {
diff --git a/packages/backend/src/server/api/endpoints/antennas/update.ts b/packages/backend/src/server/api/endpoints/antennas/update.ts
index b020a7595..0e9874688 100644
--- a/packages/backend/src/server/api/endpoints/antennas/update.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/update.ts
@@ -46,7 +46,7 @@ export const paramDef = {
properties: {
antennaId: { type: 'string', format: 'misskey:id' },
name: { type: 'string', minLength: 1, maxLength: 100 },
- src: { type: 'string', enum: ['home', 'all', 'users', 'list'] },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'users_blacklist'] },
userListId: { type: 'string', format: 'misskey:id', nullable: true },
keywords: { type: 'array', items: {
type: 'array', items: {
diff --git a/packages/frontend/src/pages/my-antennas/editor.vue b/packages/frontend/src/pages/my-antennas/editor.vue
index cd920b75e..4add66c39 100644
--- a/packages/frontend/src/pages/my-antennas/editor.vue
+++ b/packages/frontend/src/pages/my-antennas/editor.vue
@@ -16,12 +16,13 @@ SPDX-License-Identifier: AGPL-3.0-only
+
{{ i18n.ts.userList }}
-
+
{{ i18n.ts.users }}
{{ i18n.ts.antennaUsersDescription }}