summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-12-12 13:08:19 +0000
committerdakkar <dakkar@thenautilus.net>2024-12-12 13:08:19 +0000
commit943c6414d8b778057b8f0efeeebb030e6be265e3 (patch)
treed5e10ed2ce18b19b159dd55502d8b4ca1115b3a9
parentmerge: Schedule Notes (!804) (diff)
parentfederate profile when `hideOnlineStatus` changes (diff)
downloadsharkey-943c6414d8b778057b8f0efeeebb030e6be265e3.tar.gz
sharkey-943c6414d8b778057b8f0efeeebb030e6be265e3.tar.bz2
sharkey-943c6414d8b778057b8f0efeeebb030e6be265e3.zip
merge: Enable by default and federate "hide online status" (resolves #823) (!807)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/807 Closes #823 Approved-by: Marie <github@yuugi.dev> Approved-by: dakkar <dakkar@thenautilus.net>
-rw-r--r--packages/backend/migration/1733754069260-alter_user_hideOnlineStatus_default_true.js11
-rw-r--r--packages/backend/src/core/activitypub/ApRendererService.ts1
-rw-r--r--packages/backend/src/core/activitypub/misc/contexts.ts1
-rw-r--r--packages/backend/src/core/activitypub/models/ApPersonService.ts4
-rw-r--r--packages/backend/src/core/activitypub/type.ts1
-rw-r--r--packages/backend/src/models/User.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts2
-rw-r--r--packages/frontend/src/components/MkUserSetupDialog.Privacy.vue2
8 files changed, 22 insertions, 4 deletions
diff --git a/packages/backend/migration/1733754069260-alter_user_hideOnlineStatus_default_true.js b/packages/backend/migration/1733754069260-alter_user_hideOnlineStatus_default_true.js
new file mode 100644
index 0000000000..c0db48ceea
--- /dev/null
+++ b/packages/backend/migration/1733754069260-alter_user_hideOnlineStatus_default_true.js
@@ -0,0 +1,11 @@
+export class AlterUserHideOnlineStatusDefaultTrue1733754069260 {
+ name = 'AlterUserHideOnlineStatusDefaultTrue1733754069260'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "hideOnlineStatus" SET DEFAULT true`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ALTER COLUMN "hideOnlineStatus" SET DEFAULT false`);
+ }
+}
diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts
index 89e5217285..ff909778e8 100644
--- a/packages/backend/src/core/activitypub/ApRendererService.ts
+++ b/packages/backend/src/core/activitypub/ApRendererService.ts
@@ -528,6 +528,7 @@ export class ApRendererService {
discoverable: user.isExplorable,
publicKey: this.renderKey(user, keypair, '#main-key'),
isCat: user.isCat,
+ hideOnlineStatus: user.hideOnlineStatus,
noindex: user.noindex,
indexable: !user.noindex,
speakAsCat: user.speakAsCat,
diff --git a/packages/backend/src/core/activitypub/misc/contexts.ts b/packages/backend/src/core/activitypub/misc/contexts.ts
index da75fc1d42..1c4239502e 100644
--- a/packages/backend/src/core/activitypub/misc/contexts.ts
+++ b/packages/backend/src/core/activitypub/misc/contexts.ts
@@ -564,6 +564,7 @@ const extension_context_definition = {
speakAsCat: 'firefish:speakAsCat',
// Sharkey
sharkey: 'https://joinsharkey.org/ns#',
+ hideOnlineStatus: 'sharkey:hideOnlineStatus',
backgroundUrl: 'sharkey:backgroundUrl',
listenbrainz: 'sharkey:listenbrainz',
// vcard
diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts
index 598486cd84..2cb31b1f09 100644
--- a/packages/backend/src/core/activitypub/models/ApPersonService.ts
+++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts
@@ -389,6 +389,8 @@ export class ApPersonService implements OnModuleInit {
movedToUri: person.movedTo,
movedAt: person.movedTo ? new Date() : null,
alsoKnownAs: person.alsoKnownAs,
+ // We use "!== false" to handle incorrect types, missing / null values, and "default to true" logic.
+ hideOnlineStatus: person.hideOnlineStatus !== false,
isExplorable: person.discoverable,
username: person.preferredUsername,
approved: true,
@@ -585,6 +587,8 @@ export class ApPersonService implements OnModuleInit {
isLocked: person.manuallyApprovesFollowers,
movedToUri: person.movedTo ?? null,
alsoKnownAs: person.alsoKnownAs ?? null,
+ // We use "!== false" to handle incorrect types, missing / null values, and "default to true" logic.
+ hideOnlineStatus: person.hideOnlineStatus !== false,
isExplorable: person.discoverable,
...(await this.resolveAvatarAndBanner(exist, person.icon, person.image, person.backgroundUrl).catch(() => ({}))),
} as Partial<MiRemoteUser> & Pick<MiRemoteUser, 'isBot' | 'isCat' | 'speakAsCat' | 'isLocked' | 'movedToUri' | 'alsoKnownAs' | 'isExplorable'>;
diff --git a/packages/backend/src/core/activitypub/type.ts b/packages/backend/src/core/activitypub/type.ts
index c9e20e0168..a0a5ae00dc 100644
--- a/packages/backend/src/core/activitypub/type.ts
+++ b/packages/backend/src/core/activitypub/type.ts
@@ -215,6 +215,7 @@ export interface IActor extends IObject {
};
'vcard:bday'?: string;
'vcard:Address'?: string;
+ hideOnlineStatus?: boolean;
noindex?: boolean;
listenbrainz?: string;
backgroundUrl?: string;
diff --git a/packages/backend/src/models/User.ts b/packages/backend/src/models/User.ts
index c7ecccf1cf..73a44de558 100644
--- a/packages/backend/src/models/User.ts
+++ b/packages/backend/src/models/User.ts
@@ -32,7 +32,7 @@ export class MiUser {
public lastActiveDate: Date | null;
@Column('boolean', {
- default: false,
+ default: true,
})
public hideOnlineStatus: boolean;
@@ -160,7 +160,7 @@ export class MiUser {
length: 128, nullable: true,
})
public backgroundBlurhash: string | null;
-
+
@Column('jsonb', {
default: [],
})
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index 8e61b8f784..c640caee75 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -587,7 +587,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
// these two methods need to be kept in sync with
// `ApRendererService.renderPerson`
private userNeedsPublishing(oldUser: MiLocalUser, newUser: Partial<MiUser>): boolean {
- for (const field of ['avatarId', 'bannerId', 'backgroundId', 'isBot', 'username', 'name', 'isLocked', 'isExplorable', 'isCat', 'noindex', 'speakAsCat', 'movedToUri', 'alsoKnownAs'] as (keyof MiUser)[]) {
+ for (const field of ['avatarId', 'bannerId', 'backgroundId', 'isBot', 'username', 'name', 'isLocked', 'isExplorable', 'isCat', 'noindex', 'speakAsCat', 'movedToUri', 'alsoKnownAs', 'hideOnlineStatus'] as (keyof MiUser)[]) {
if ((field in newUser) && oldUser[field] !== newUser[field]) {
return true;
}
diff --git a/packages/frontend/src/components/MkUserSetupDialog.Privacy.vue b/packages/frontend/src/components/MkUserSetupDialog.Privacy.vue
index bc998d6158..fb4a2b1c78 100644
--- a/packages/frontend/src/components/MkUserSetupDialog.Privacy.vue
+++ b/packages/frontend/src/components/MkUserSetupDialog.Privacy.vue
@@ -44,7 +44,7 @@ import MkFolder from '@/components/MkFolder.vue';
import { misskeyApi } from '@/scripts/misskey-api.js';
const isLocked = ref(false);
-const hideOnlineStatus = ref(false);
+const hideOnlineStatus = ref(true);
const noCrawle = ref(false);
watch([isLocked, hideOnlineStatus, noCrawle], () => {