mirror of
https://codeberg.org/yeentown/barkey.git
synced 2025-04-28 09:36:56 +00:00
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/806 Closes #826 Approved-by: dakkar <dakkar@thenautilus.net> Approved-by: Marie <github@yuugi.dev>
This commit is contained in:
commit
d18317a7c8
16 changed files with 70 additions and 6 deletions
8
locales/index.d.ts
vendored
8
locales/index.d.ts
vendored
|
@ -10847,6 +10847,14 @@ export interface Locale extends ILocale {
|
|||
* Stop note search from indexing your public notes.
|
||||
*/
|
||||
"makeIndexableDescription": string;
|
||||
/**
|
||||
* Enable RSS feed
|
||||
*/
|
||||
"enableRss": string;
|
||||
/**
|
||||
* Generate an RSS feed containing your basic profile details and public notes. Users can subscribe to the feed without a follow request or approval.
|
||||
*/
|
||||
"enableRssDescription": string;
|
||||
/**
|
||||
* Require approval for new users
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
export class AddUserEnableRss1733748798177 {
|
||||
name = 'AddUserEnableRss1733748798177'
|
||||
|
||||
async up(queryRunner) {
|
||||
// Disable by default, then specifically enable for all existing local users.
|
||||
await queryRunner.query(`ALTER TABLE "user" ADD "enable_rss" boolean NOT NULL DEFAULT false`);
|
||||
await queryRunner.query(`UPDATE "user" SET "enable_rss" = true WHERE host IS NULL;`)
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "enable_rss"`);
|
||||
}
|
||||
}
|
|
@ -135,6 +135,7 @@ export class SignupService {
|
|||
isRoot: isTheFirstUser,
|
||||
approved: isTheFirstUser || (opts.approved ?? !this.meta.approvalRequiredForSignup),
|
||||
signupReason: reason,
|
||||
enableRss: false,
|
||||
}));
|
||||
|
||||
await transactionalEntityManager.save(new MiUserKeypair({
|
||||
|
|
|
@ -85,6 +85,7 @@ function generateDummyUser(override?: Partial<MiUser>): MiUser {
|
|||
approved: true,
|
||||
signupReason: null,
|
||||
noindex: false,
|
||||
enableRss: true,
|
||||
...override,
|
||||
};
|
||||
}
|
||||
|
@ -201,6 +202,7 @@ function toPackedUserLite(user: MiUser, override?: Packed<'UserLite'>): Packed<'
|
|||
isAdmin: false,
|
||||
isSystem: false,
|
||||
isSilenced: user.isSilenced,
|
||||
enableRss: true,
|
||||
...override,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -531,6 +531,7 @@ export class ApRendererService {
|
|||
hideOnlineStatus: user.hideOnlineStatus,
|
||||
noindex: user.noindex,
|
||||
indexable: !user.noindex,
|
||||
enableRss: user.enableRss,
|
||||
speakAsCat: user.speakAsCat,
|
||||
attachment: attachment.length ? attachment : undefined,
|
||||
};
|
||||
|
|
|
@ -567,6 +567,7 @@ const extension_context_definition = {
|
|||
hideOnlineStatus: 'sharkey:hideOnlineStatus',
|
||||
backgroundUrl: 'sharkey:backgroundUrl',
|
||||
listenbrainz: 'sharkey:listenbrainz',
|
||||
enableRss: 'sharkey:enableRss',
|
||||
// vcard
|
||||
vcard: 'http://www.w3.org/2006/vcard/ns#',
|
||||
} satisfies Context;
|
||||
|
|
|
@ -385,6 +385,7 @@ export class ApPersonService implements OnModuleInit {
|
|||
lastFetchedAt: new Date(),
|
||||
name: truncate(person.name, nameLength),
|
||||
noindex: (person as any).noindex ?? false,
|
||||
enableRss: person.enableRss === true,
|
||||
isLocked: person.manuallyApprovesFollowers,
|
||||
movedToUri: person.movedTo,
|
||||
movedAt: person.movedTo ? new Date() : null,
|
||||
|
@ -584,6 +585,7 @@ export class ApPersonService implements OnModuleInit {
|
|||
isCat: (person as any).isCat === true,
|
||||
speakAsCat: (person as any).speakAsCat != null ? (person as any).speakAsCat === true : (person as any).isCat === true,
|
||||
noindex: (person as any).noindex ?? false,
|
||||
enableRss: person.enableRss === true,
|
||||
isLocked: person.manuallyApprovesFollowers,
|
||||
movedToUri: person.movedTo ?? null,
|
||||
alsoKnownAs: person.alsoKnownAs ?? null,
|
||||
|
|
|
@ -217,6 +217,7 @@ export interface IActor extends IObject {
|
|||
'vcard:Address'?: string;
|
||||
hideOnlineStatus?: boolean;
|
||||
noindex?: boolean;
|
||||
enableRss?: boolean;
|
||||
listenbrainz?: string;
|
||||
backgroundUrl?: string;
|
||||
}
|
||||
|
|
|
@ -539,6 +539,7 @@ export class UserEntityService implements OnModuleInit {
|
|||
isBot: user.isBot,
|
||||
isCat: user.isCat,
|
||||
noindex: user.noindex,
|
||||
enableRss: user.enableRss,
|
||||
isSilenced: user.isSilenced || this.roleService.getUserPolicies(user.id).then(r => !r.canPublicNote),
|
||||
speakAsCat: user.speakAsCat ?? false,
|
||||
approved: user.approved,
|
||||
|
|
|
@ -311,6 +311,17 @@ export class MiUser {
|
|||
})
|
||||
public signupReason: string | null;
|
||||
|
||||
/**
|
||||
* True if profile RSS feeds are enabled for this user.
|
||||
* Enabled by default (opt-out) for existing users, to avoid breaking any existing feeds.
|
||||
* Disabled by default (opt-in) for newly created users, for privacy.
|
||||
*/
|
||||
@Column('boolean', {
|
||||
name: 'enable_rss',
|
||||
default: true,
|
||||
})
|
||||
public enableRss: boolean;
|
||||
|
||||
constructor(data: Partial<MiUser>) {
|
||||
if (data == null) return;
|
||||
|
||||
|
|
|
@ -130,6 +130,10 @@ export const packedUserLiteSchema = {
|
|||
type: 'boolean',
|
||||
nullable: false, optional: false,
|
||||
},
|
||||
enableRss: {
|
||||
type: 'boolean',
|
||||
nullable: false, optional: false,
|
||||
},
|
||||
isBot: {
|
||||
type: 'boolean',
|
||||
nullable: false, optional: true,
|
||||
|
|
|
@ -187,6 +187,7 @@ export const paramDef = {
|
|||
noCrawle: { type: 'boolean' },
|
||||
preventAiLearning: { type: 'boolean' },
|
||||
noindex: { type: 'boolean' },
|
||||
enableRss: { type: 'boolean' },
|
||||
isBot: { type: 'boolean' },
|
||||
isCat: { type: 'boolean' },
|
||||
speakAsCat: { type: 'boolean' },
|
||||
|
@ -337,6 +338,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus;
|
||||
if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions;
|
||||
if (typeof ps.noindex === 'boolean') updates.noindex = ps.noindex;
|
||||
if (typeof ps.enableRss === 'boolean') updates.enableRss = ps.enableRss;
|
||||
if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot;
|
||||
if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot;
|
||||
if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed;
|
||||
|
@ -587,12 +589,15 @@ 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', 'hideOnlineStatus'] as (keyof MiUser)[]) {
|
||||
const basicFields: (keyof MiUser)[] = ['avatarId', 'bannerId', 'backgroundId', 'isBot', 'username', 'name', 'isLocked', 'isExplorable', 'isCat', 'noindex', 'speakAsCat', 'movedToUri', 'alsoKnownAs', 'hideOnlineStatus', 'enableRss'];
|
||||
for (const field of basicFields) {
|
||||
if ((field in newUser) && oldUser[field] !== newUser[field]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for (const arrayField of ['emojis', 'tags'] as (keyof MiUser)[]) {
|
||||
|
||||
const arrayFields: (keyof MiUser)[] = ['emojis', 'tags'];
|
||||
for (const arrayField of arrayFields) {
|
||||
if ((arrayField in newUser) !== (arrayField in oldUser)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -602,7 +607,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
if (!Array.isArray(oldArray) || !Array.isArray(newArray)) {
|
||||
return true;
|
||||
}
|
||||
if (oldArray.join("\0") !== newArray.join("\0")) {
|
||||
if (oldArray.join('\0') !== newArray.join('\0')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -610,12 +615,15 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
}
|
||||
|
||||
private profileNeedsPublishing(oldProfile: MiUserProfile, newProfile: Partial<MiUserProfile>): boolean {
|
||||
for (const field of ['description', 'followedMessage', 'birthday', 'location', 'listenbrainz'] as (keyof MiUserProfile)[]) {
|
||||
const basicFields: (keyof MiUserProfile)[] = ['description', 'followedMessage', 'birthday', 'location', 'listenbrainz'];
|
||||
for (const field of basicFields) {
|
||||
if ((field in newProfile) && oldProfile[field] !== newProfile[field]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for (const arrayField of ['fields'] as (keyof MiUserProfile)[]) {
|
||||
|
||||
const arrayFields: (keyof MiUserProfile)[] = ['fields'];
|
||||
for (const arrayField of arrayFields) {
|
||||
if ((arrayField in newProfile) !== (arrayField in oldProfile)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -625,7 +633,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
|||
if (!Array.isArray(oldArray) || !Array.isArray(newArray)) {
|
||||
return true;
|
||||
}
|
||||
if (oldArray.join("\0") !== newArray.join("\0")) {
|
||||
if (oldArray.join('\0') !== newArray.join('\0')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -510,6 +510,7 @@ export class ClientServerService {
|
|||
usernameLower: username.toLowerCase(),
|
||||
host: host ?? IsNull(),
|
||||
isSuspended: false,
|
||||
enableRss: true,
|
||||
});
|
||||
|
||||
return user && await this.feedService.packFeed(user);
|
||||
|
|
|
@ -43,6 +43,10 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
{{ i18n.ts.makeExplorable }}
|
||||
<template #caption>{{ i18n.ts.makeExplorableDescription }}</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="enableRss" @update:modelValue="save()">
|
||||
{{ i18n.ts.enableRss }}
|
||||
<template #caption>{{ i18n.ts.enableRssDescription }}</template>
|
||||
</MkSwitch>
|
||||
|
||||
<FormSection>
|
||||
<div class="_gaps_m">
|
||||
|
@ -89,6 +93,7 @@ const isLocked = ref($i.isLocked);
|
|||
const autoAcceptFollowed = ref($i.autoAcceptFollowed);
|
||||
const noCrawle = ref($i.noCrawle);
|
||||
const noindex = ref($i.noindex);
|
||||
const enableRss = ref($i.enableRss);
|
||||
const isExplorable = ref($i.isExplorable);
|
||||
const hideOnlineStatus = ref($i.hideOnlineStatus);
|
||||
const publicReactions = ref($i.publicReactions);
|
||||
|
@ -106,6 +111,7 @@ function save() {
|
|||
autoAcceptFollowed: !!autoAcceptFollowed.value,
|
||||
noCrawle: !!noCrawle.value,
|
||||
noindex: !!noindex.value,
|
||||
enableRss: !!enableRss.value,
|
||||
isExplorable: !!isExplorable.value,
|
||||
hideOnlineStatus: !!hideOnlineStatus.value,
|
||||
publicReactions: !!publicReactions.value,
|
||||
|
|
|
@ -3913,6 +3913,7 @@ export type components = {
|
|||
/** @default false */
|
||||
isSystem?: boolean;
|
||||
noindex: boolean;
|
||||
enableRss: boolean;
|
||||
isBot?: boolean;
|
||||
isCat?: boolean;
|
||||
speakAsCat?: boolean;
|
||||
|
@ -21320,6 +21321,7 @@ export type operations = {
|
|||
noCrawle?: boolean;
|
||||
preventAiLearning?: boolean;
|
||||
noindex?: boolean;
|
||||
enableRss?: boolean;
|
||||
isBot?: boolean;
|
||||
isCat?: boolean;
|
||||
speakAsCat?: boolean;
|
||||
|
|
|
@ -88,6 +88,8 @@ searchEngineCustomURIDescription: "The custom URI must be input in the format li
|
|||
searchEngineCusomURI: "Custom URI"
|
||||
makeIndexable: "Make public notes not indexable"
|
||||
makeIndexableDescription: "Stop note search from indexing your public notes."
|
||||
enableRss: "Enable RSS feed"
|
||||
enableRssDescription: "Generate an RSS feed containing your basic profile details and public notes. Users can subscribe to the feed without a follow request or approval."
|
||||
sendErrorReportsDescription: "When turned on, detailed error information will be shared with Sharkey when a problem occurs, helping to improve the quality of Sharkey.\nThis will include information such the version of your OS, what browser you're using, your activity in Sharkey, etc."
|
||||
noInquiryUrlWarning: "Contact URL is not set."
|
||||
misskeyUpdated: "Sharkey has been updated!"
|
||||
|
|
Loading…
Add table
Reference in a new issue