parent
a9bc22e4e6
commit
8ae9d2eaa8
|
@ -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作成時にメンションも含むように
|
||||||
|
|
|
@ -974,6 +974,7 @@ resetPasswordConfirm: "パスワードリセットしますか?"
|
||||||
sensitiveWords: "センシティブワード"
|
sensitiveWords: "センシティブワード"
|
||||||
sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。"
|
sensitiveWordsDescription: "設定したワードが含まれるノートの公開範囲をホームにします。改行で区切って複数設定できます。"
|
||||||
notesSearchNotAvailable: "ノート検索は利用できません。"
|
notesSearchNotAvailable: "ノート検索は利用できません。"
|
||||||
|
license: "ライセンス"
|
||||||
|
|
||||||
_achievements:
|
_achievements:
|
||||||
earnedAt: "獲得日時"
|
earnedAt: "獲得日時"
|
||||||
|
|
|
@ -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"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -102,6 +102,7 @@ export class ImportCustomEmojisProcessorService {
|
||||||
host: null,
|
host: null,
|
||||||
aliases: emojiInfo.aliases,
|
aliases: emojiInfo.aliases,
|
||||||
driveFile,
|
driveFile,
|
||||||
|
license: emojiInfo.license,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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', {
|
||||||
|
|
|
@ -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']);
|
||||||
|
|
|
@ -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']);
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue