diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 49d6a836d..ea7922f26 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -518,6 +518,7 @@ common/views/components/profile-editor.vue: is-bot: "このアカウントはBotです" is-locked: "フォローを承認制にする" careful-bot: "Botからのフォローだけ承認制にする" + auto-accept-followed: "フォローしているユーザーからのフォローを自動承認する" advanced: "その他" privacy: "プライバシー" save: "保存" diff --git a/src/client/app/common/views/components/profile-editor.vue b/src/client/app/common/views/components/profile-editor.vue index 5f462a258..75d14236c 100644 --- a/src/client/app/common/views/components/profile-editor.vue +++ b/src/client/app/common/views/components/profile-editor.vue @@ -70,6 +70,7 @@
{{ $t('is-locked') }} {{ $t('careful-bot') }} + {{ $t('auto-accept-followed') }}
@@ -118,6 +119,7 @@ export default Vue.extend({ isBot: false, isLocked: false, carefulBot: false, + autoAcceptFollowed: false, saving: false, avatarUploading: false, bannerUploading: false @@ -156,6 +158,7 @@ export default Vue.extend({ this.isBot = this.$store.state.i.isBot; this.isLocked = this.$store.state.i.isLocked; this.carefulBot = this.$store.state.i.carefulBot; + this.autoAcceptFollowed = this.$store.state.i.autoAcceptFollowed; }, methods: { @@ -217,7 +220,8 @@ export default Vue.extend({ isCat: !!this.isCat, isBot: !!this.isBot, isLocked: !!this.isLocked, - carefulBot: !!this.carefulBot + carefulBot: !!this.carefulBot, + autoAcceptFollowed: !!this.autoAcceptFollowed }).then(i => { this.saving = false; this.$store.state.i.avatarId = i.avatarId; diff --git a/src/models/user.ts b/src/models/user.ts index 19291a2cb..61fb7244e 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -69,6 +69,11 @@ type IUserBase = { */ carefulBot: boolean; + /** + * フォローしているユーザーからのフォローリクエストを自動承認するか + */ + autoAcceptFollowed: boolean; + /** * このアカウントに届いているフォローリクエストの数 */ diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 7bdd52883..ec6aaa04d 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -94,6 +94,13 @@ export const meta = { } }, + autoAcceptFollowed: { + validator: $.bool.optional, + desc: { + 'ja-JP': 'フォローしているユーザーからのフォローリクエストを自動承認するか' + } + }, + isBot: { validator: $.bool.optional, desc: { @@ -140,6 +147,7 @@ export default define(meta, (ps, user, app) => new Promise(async (res, rej) => { if (typeof ps.isLocked == 'boolean') updates.isLocked = ps.isLocked; if (typeof ps.isBot == 'boolean') updates.isBot = ps.isBot; if (typeof ps.carefulBot == 'boolean') updates.carefulBot = ps.carefulBot; + if (typeof ps.autoAcceptFollowed == 'boolean') updates.autoAcceptFollowed = ps.autoAcceptFollowed; if (typeof ps.isCat == 'boolean') updates.isCat = ps.isCat; if (typeof ps.autoWatch == 'boolean') updates['settings.autoWatch'] = ps.autoWatch; if (typeof ps.alwaysMarkNsfw == 'boolean') updates['settings.alwaysMarkNsfw'] = ps.alwaysMarkNsfw; diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 46b818f8b..fac53c40a 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -45,8 +45,22 @@ export default async function(follower: IUser, followee: IUser, requestId?: stri // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである // 上記のいずれかに当てはまる場合はすぐフォローせずにフォローリクエストを発行しておく if (followee.isLocked || (followee.carefulBot && follower.isBot) || (isLocalUser(follower) && isRemoteUser(followee))) { - await createFollowRequest(follower, followee, requestId); - return; + let autoAccept = false; + + // フォローしているユーザーは自動承認オプション + if (isLocalUser(followee) && followee.autoAcceptFollowed) { + const followed = await Following.findOne({ + followerId: followee._id, + followeeId: follower._id + }); + + if (followed) autoAccept = true; + } + + if (!autoAccept) { + await createFollowRequest(follower, followee, requestId); + return; + } } await Following.insert({