enhance: カスタム絵文字にライセンス情報を付与できるように

Resolve #10091
This commit is contained in:
syuilo 2023-03-16 15:08:48 +09:00
parent a9bc22e4e6
commit 8ae9d2eaa8
12 changed files with 36 additions and 0 deletions

View File

@ -17,6 +17,7 @@ You should also include the user name that made the change.
- ノートごとに絵文字リアクションを受け取るか設定できるように - ノートごとに絵文字リアクションを受け取るか設定できるように
- ノート検索の利用可否をロールで制御可能に(デフォルトでオフ) - ノート検索の利用可否をロールで制御可能に(デフォルトでオフ)
- ロールの並び順を設定可能に - ロールの並び順を設定可能に
- カスタム絵文字にライセンス情報を付与できるように
- 指定した文字列を含む投稿の公開範囲をホームにできるように - 指定した文字列を含む投稿の公開範囲をホームにできるように
- enhance(client): 設定から自分のロールを確認できるように - enhance(client): 設定から自分のロールを確認できるように
- enhance(client): DM作成時にメンションも含むように - enhance(client): DM作成時にメンションも含むように

View File

@ -974,6 +974,7 @@ resetPasswordConfirm: "パスワードリセットしますか?"
sensitiveWords: "センシティブワード" sensitiveWords: "センシティブワード"
sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。" sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。"
notesSearchNotAvailable: "ノート検索は利用できません。" notesSearchNotAvailable: "ノート検索は利用できません。"
license: "ライセンス"
_achievements: _achievements:
earnedAt: "獲得日時" earnedAt: "獲得日時"

View File

@ -0,0 +1,11 @@
export class addPropsForCustomEmoji1678945242650 {
name = 'addPropsForCustomEmoji1678945242650'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "emoji" ADD "license" character varying(1024)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "license"`);
}
}

View File

@ -44,6 +44,7 @@ export class CustomEmojiService {
category: string | null; category: string | null;
aliases: string[]; aliases: string[];
host: string | null; host: string | null;
license: string | null;
}): Promise<Emoji> { }): Promise<Emoji> {
const emoji = await this.emojisRepository.insert({ const emoji = await this.emojisRepository.insert({
id: this.idService.genId(), id: this.idService.genId(),
@ -55,6 +56,7 @@ export class CustomEmojiService {
originalUrl: data.driveFile.url, originalUrl: data.driveFile.url,
publicUrl: data.driveFile.webpublicUrl ?? data.driveFile.url, publicUrl: data.driveFile.webpublicUrl ?? data.driveFile.url,
type: data.driveFile.webpublicType ?? data.driveFile.type, type: data.driveFile.webpublicType ?? data.driveFile.type,
license: data.license,
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0])); }).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
if (data.host == null) { if (data.host == null) {

View File

@ -50,6 +50,7 @@ export class EmojiEntityService {
host: emoji.host, host: emoji.host,
// || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ) // || emoji.originalUrl してるのは後方互換性のためpublicUrlはstringなので??はだめ)
url: emoji.publicUrl || emoji.originalUrl, url: emoji.publicUrl || emoji.originalUrl,
license: emoji.license,
}; };
} }

View File

@ -55,4 +55,9 @@ export class Emoji {
array: true, length: 128, default: '{}', array: true, length: 128, default: '{}',
}) })
public aliases: string[]; public aliases: string[];
@Column('varchar', {
length: 1024, nullable: true,
})
public license: string | null;
} }

View File

@ -59,5 +59,9 @@ export const packedEmojiDetailedSchema = {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: false,
}, },
license: {
type: 'string',
optional: false, nullable: true,
},
}, },
} as const; } as const;

View File

@ -102,6 +102,7 @@ export class ImportCustomEmojisProcessorService {
host: null, host: null,
aliases: emojiInfo.aliases, aliases: emojiInfo.aliases,
driveFile, driveFile,
license: emojiInfo.license,
}); });
} }

View File

@ -56,6 +56,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
category: null, category: null,
aliases: [], aliases: [],
host: null, host: null,
license: null,
}); });
this.moderationLogService.insertModerationLog(me, 'addEmoji', { this.moderationLogService.insertModerationLog(me, 'addEmoji', {

View File

@ -87,6 +87,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
originalUrl: driveFile.url, originalUrl: driveFile.url,
publicUrl: driveFile.webpublicUrl ?? driveFile.url, publicUrl: driveFile.webpublicUrl ?? driveFile.url,
type: driveFile.webpublicType ?? driveFile.type, type: driveFile.webpublicType ?? driveFile.type,
license: emoji.license,
}).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0])); }).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
await this.db.queryResultCache?.remove(['meta_emojis']); await this.db.queryResultCache?.remove(['meta_emojis']);

View File

@ -35,6 +35,7 @@ export const paramDef = {
aliases: { type: 'array', items: { aliases: { type: 'array', items: {
type: 'string', type: 'string',
} }, } },
license: { type: 'string', nullable: true },
}, },
required: ['id', 'name', 'aliases'], required: ['id', 'name', 'aliases'],
} as const; } as const;
@ -64,6 +65,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
name: ps.name, name: ps.name,
category: ps.category, category: ps.category,
aliases: ps.aliases, aliases: ps.aliases,
license: ps.license,
}); });
await this.db.queryResultCache?.remove(['meta_emojis']); await this.db.queryResultCache?.remove(['meta_emojis']);

View File

@ -22,6 +22,9 @@
<template #label>{{ i18n.ts.tags }}</template> <template #label>{{ i18n.ts.tags }}</template>
<template #caption>{{ i18n.ts.setMultipleBySeparatingWithSpace }}</template> <template #caption>{{ i18n.ts.setMultipleBySeparatingWithSpace }}</template>
</MkInput> </MkInput>
<MkInput v-model="license">
<template #label>{{ i18n.ts.license }}</template>
</MkInput>
<MkButton danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton> <MkButton danger @click="del()"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
</div> </div>
</MkSpacer> </MkSpacer>
@ -45,6 +48,7 @@ let dialog = $ref(null);
let name: string = $ref(props.emoji.name); let name: string = $ref(props.emoji.name);
let category: string = $ref(props.emoji.category); let category: string = $ref(props.emoji.category);
let aliases: string = $ref(props.emoji.aliases.join(' ')); let aliases: string = $ref(props.emoji.aliases.join(' '));
let license: string = $ref(props.emoji.license ?? '');
const emit = defineEmits<{ const emit = defineEmits<{
(ev: 'done', v: { deleted?: boolean, updated?: any }): void, (ev: 'done', v: { deleted?: boolean, updated?: any }): void,
@ -61,6 +65,7 @@ async function update() {
name, name,
category, category,
aliases: aliases.split(' '), aliases: aliases.split(' '),
license: license === '' ? null : license,
}); });
emit('done', { emit('done', {
@ -69,6 +74,7 @@ async function update() {
name, name,
category, category,
aliases: aliases.split(' '), aliases: aliases.split(' '),
license: license === '' ? null : license,
}, },
}); });