summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-10-13 20:11:00 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-10-13 20:11:00 +0900
commit65e5cfa68eee619843192f3bf2a3e901a0910101 (patch)
tree6ed53b64d96371a5543208b5815718492aebe753 /src
parentMerge branch 'develop' of https://github.com/syuilo/misskey into develop (diff)
downloadsharkey-65e5cfa68eee619843192f3bf2a3e901a0910101.tar.gz
sharkey-65e5cfa68eee619843192f3bf2a3e901a0910101.tar.bz2
sharkey-65e5cfa68eee619843192f3bf2a3e901a0910101.zip
Resolve #2853
Diffstat (limited to 'src')
-rw-r--r--src/client/app/desktop/views/components/settings.profile.vue42
-rw-r--r--src/client/app/desktop/views/components/ui.header.account.vue2
-rw-r--r--src/client/app/mobile/views/components/ui.nav.vue2
-rw-r--r--src/client/app/mobile/views/pages/settings/settings.profile.vue6
-rw-r--r--src/models/user.ts11
-rw-r--r--src/server/api/endpoints/i/update.ts7
-rw-r--r--src/services/following/create.ts115
7 files changed, 105 insertions, 80 deletions
diff --git a/src/client/app/desktop/views/components/settings.profile.vue b/src/client/app/desktop/views/components/settings.profile.vue
index 5f465a52bb..15569d3694 100644
--- a/src/client/app/desktop/views/components/settings.profile.vue
+++ b/src/client/app/desktop/views/components/settings.profile.vue
@@ -21,12 +21,13 @@
<ui-button primary @click="save">%i18n:@save%</ui-button>
<section>
<h2>%i18n:@locked-account%</h2>
- <ui-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked">%i18n:@is-locked%</ui-switch>
+ <ui-switch v-model="isLocked" @change="save(false)">%i18n:@is-locked%</ui-switch>
+ <ui-switch v-model="carefulBot" @change="save(false)">%i18n:@careful-bot%</ui-switch>
</section>
<section>
<h2>%i18n:@other%</h2>
- <ui-switch v-model="$store.state.i.isBot" @change="onChangeIsBot">%i18n:@is-bot%</ui-switch>
- <ui-switch v-model="$store.state.i.isCat" @change="onChangeIsCat">%i18n:@is-cat%</ui-switch>
+ <ui-switch v-model="isBot" @change="save(false)">%i18n:@is-bot%</ui-switch>
+ <ui-switch v-model="isCat" @change="save(false)">%i18n:@is-cat%</ui-switch>
<ui-switch v-model="alwaysMarkNsfw">%i18n:common.always-mark-nsfw%</ui-switch>
</section>
</div>
@@ -42,6 +43,10 @@ export default Vue.extend({
location: null,
description: null,
birthday: null,
+ isBot: false,
+ isCat: false,
+ isLocked: false,
+ carefulBot: false,
};
},
computed: {
@@ -55,34 +60,29 @@ export default Vue.extend({
this.location = this.$store.state.i.profile.location;
this.description = this.$store.state.i.description;
this.birthday = this.$store.state.i.profile.birthday;
+ this.isCat = this.$store.state.i.isCat;
+ this.isBot = this.$store.state.i.isBot;
+ this.isLocked = this.$store.state.i.isLocked;
+ this.carefulBot = this.$store.state.i.carefulBot;
},
methods: {
updateAvatar() {
(this as any).apis.updateAvatar();
},
- save() {
+ save(notify) {
(this as any).api('i/update', {
name: this.name || null,
location: this.location || null,
description: this.description || null,
- birthday: this.birthday || null
+ birthday: this.birthday || null,
+ isCat: this.isCat,
+ isBot: this.isBot,
+ isLocked: this.isLocked,
+ carefulBot: this.carefulBot
}).then(() => {
- (this as any).apis.notify('%i18n:@profile-updated%');
- });
- },
- onChangeIsLocked() {
- (this as any).api('i/update', {
- isLocked: this.$store.state.i.isLocked
- });
- },
- onChangeIsBot() {
- (this as any).api('i/update', {
- isBot: this.$store.state.i.isBot
- });
- },
- onChangeIsCat() {
- (this as any).api('i/update', {
- isCat: this.$store.state.i.isCat
+ if (notify) {
+ (this as any).apis.notify('%i18n:@profile-updated%');
+ }
});
}
}
diff --git a/src/client/app/desktop/views/components/ui.header.account.vue b/src/client/app/desktop/views/components/ui.header.account.vue
index a541dea121..80fc1648de 100644
--- a/src/client/app/desktop/views/components/ui.header.account.vue
+++ b/src/client/app/desktop/views/components/ui.header.account.vue
@@ -19,7 +19,7 @@
<li @click="list">
<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
</li>
- <li @click="followRequests" v-if="$store.state.i.isLocked">
+ <li @click="followRequests" v-if="($store.state.i.isLocked || $store.state.i.carefulBot)">
<p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p>
</li>
</ul>
diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue
index c9c0c082b2..068ad74815 100644
--- a/src/client/app/mobile/views/components/ui.nav.vue
+++ b/src/client/app/mobile/views/components/ui.nav.vue
@@ -18,7 +18,7 @@
<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li>
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
- <li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
+ <li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/reversi" :data-active="$route.name == 'reversi'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
</ul>
<ul>
diff --git a/src/client/app/mobile/views/pages/settings/settings.profile.vue b/src/client/app/mobile/views/pages/settings/settings.profile.vue
index 77c59faf37..160a05a3e0 100644
--- a/src/client/app/mobile/views/pages/settings/settings.profile.vue
+++ b/src/client/app/mobile/views/pages/settings/settings.profile.vue
@@ -58,6 +58,7 @@
<div>
<ui-switch v-model="isLocked" @change="save(false)">%i18n:@is-locked%</ui-switch>
+ <ui-switch v-model="carefulBot" @change="save(false)">%i18n:@careful-bot%</ui-switch>
</div>
</section>
</ui-card>
@@ -80,6 +81,7 @@ export default Vue.extend({
bannerId: null,
isCat: false,
isLocked: false,
+ carefulBot: false,
saving: false,
avatarUploading: false,
bannerUploading: false
@@ -103,6 +105,7 @@ export default Vue.extend({
this.bannerId = this.$store.state.i.bannerId;
this.isCat = this.$store.state.i.isCat;
this.isLocked = this.$store.state.i.isLocked;
+ this.carefulBot = this.$store.state.i.carefulBot;
},
methods: {
@@ -161,7 +164,8 @@ export default Vue.extend({
avatarId: this.avatarId,
bannerId: this.bannerId,
isCat: this.isCat,
- isLocked: this.isLocked
+ isLocked: this.isLocked,
+ carefulBot: this.carefulBot
}).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 e0ce561421..6ca09ca168 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -66,6 +66,16 @@ type IUserBase = {
isLocked: boolean;
/**
+ * Botか否か
+ */
+ isBot: boolean;
+
+ /**
+ * Botからのフォローを承認制にするか
+ */
+ carefulBot: boolean;
+
+ /**
* このアカウントに届いているフォローリクエストの数
*/
pendingReceivedFollowRequestsCount: number;
@@ -94,7 +104,6 @@ export interface ILocalUser extends IUserBase {
tags: string[];
};
lastUsedAt: Date;
- isBot: boolean;
isCat: boolean;
isAdmin?: boolean;
isVerified?: boolean;
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 548ce5cadb..77825a4aaa 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -67,6 +67,12 @@ export const meta = {
}
}),
+ carefulBot: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'Botからのフォローを承認制にするか'
+ }
+ }),
+
isBot: $.bool.optional.note({
desc: {
'ja-JP': 'Botか否か'
@@ -110,6 +116,7 @@ export default async (params: any, user: ILocalUser, app: IApp) => new Promise(a
if (ps.wallpaperId !== undefined) updates.wallpaperId = ps.wallpaperId;
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.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 637e3e8093..01b6b4aed9 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -11,70 +11,75 @@ import { deliver } from '../../queue';
import createFollowRequest from './requests/create';
export default async function(follower: IUser, followee: IUser) {
- if (followee.isLocked || isLocalUser(follower) && isRemoteUser(followee)) {
+ // フォロー対象が鍵アカウントである or
+ // フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or
+ // フォロワーがローカルユーザーであり、フォロー対象がリモートユーザーである
+ // 上記のいずれかに当てはまる場合はすぐフォローせずにフォローリクエストを発行しておく
+ if (followee.isLocked || (followee.carefulBot && follower.isBot) || (isLocalUser(follower) && isRemoteUser(followee))) {
await createFollowRequest(follower, followee);
- } else {
- const following = await Following.insert({
- createdAt: new Date(),
- followerId: follower._id,
- followeeId: followee._id,
+ return;
+ }
- // 非正規化
- _follower: {
- host: follower.host,
- inbox: isRemoteUser(follower) ? follower.inbox : undefined,
- sharedInbox: isRemoteUser(follower) ? follower.sharedInbox : undefined
- },
- _followee: {
- host: followee.host,
- inbox: isRemoteUser(followee) ? followee.inbox : undefined,
- sharedInbox: isRemoteUser(followee) ? followee.sharedInbox : undefined
- }
- });
+ const following = await Following.insert({
+ createdAt: new Date(),
+ followerId: follower._id,
+ followeeId: followee._id,
- //#region Increment following count
- User.update({ _id: follower._id }, {
- $inc: {
- followingCount: 1
- }
- });
+ // 非正規化
+ _follower: {
+ host: follower.host,
+ inbox: isRemoteUser(follower) ? follower.inbox : undefined,
+ sharedInbox: isRemoteUser(follower) ? follower.sharedInbox : undefined
+ },
+ _followee: {
+ host: followee.host,
+ inbox: isRemoteUser(followee) ? followee.inbox : undefined,
+ sharedInbox: isRemoteUser(followee) ? followee.sharedInbox : undefined
+ }
+ });
- FollowingLog.insert({
- createdAt: following.createdAt,
- userId: follower._id,
- count: follower.followingCount + 1
- });
- //#endregion
+ //#region Increment following count
+ User.update({ _id: follower._id }, {
+ $inc: {
+ followingCount: 1
+ }
+ });
- //#region Increment followers count
- User.update({ _id: followee._id }, {
- $inc: {
- followersCount: 1
- }
- });
- FollowedLog.insert({
- createdAt: following.createdAt,
- userId: followee._id,
- count: followee.followersCount + 1
- });
- //#endregion
+ FollowingLog.insert({
+ createdAt: following.createdAt,
+ userId: follower._id,
+ count: follower.followingCount + 1
+ });
+ //#endregion
- // Publish follow event
- if (isLocalUser(follower)) {
- packUser(followee, follower).then(packed => publishMainStream(follower._id, 'follow', packed));
+ //#region Increment followers count
+ User.update({ _id: followee._id }, {
+ $inc: {
+ followersCount: 1
}
+ });
+ FollowedLog.insert({
+ createdAt: following.createdAt,
+ userId: followee._id,
+ count: followee.followersCount + 1
+ });
+ //#endregion
+
+ // Publish follow event
+ if (isLocalUser(follower)) {
+ packUser(followee, follower).then(packed => publishMainStream(follower._id, 'follow', packed));
+ }
- // Publish followed event
- if (isLocalUser(followee)) {
- packUser(follower, followee).then(packed => publishMainStream(followee._id, 'followed', packed)),
+ // Publish followed event
+ if (isLocalUser(followee)) {
+ packUser(follower, followee).then(packed => publishMainStream(followee._id, 'followed', packed)),
- // 通知を作成
- notify(followee._id, follower._id, 'follow');
- }
+ // 通知を作成
+ notify(followee._id, follower._id, 'follow');
+ }
- if (isRemoteUser(follower) && isLocalUser(followee)) {
- const content = pack(renderAccept(renderFollow(follower, followee)));
- deliver(followee, content, follower.inbox);
- }
+ if (isRemoteUser(follower) && isLocalUser(followee)) {
+ const content = pack(renderAccept(renderFollow(follower, followee)));
+ deliver(followee, content, follower.inbox);
}
}