summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/ReactionService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-05-18 18:45:49 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-05-18 18:45:49 +0900
commit7ce569424a67c786a4f44993ce74f06989eba9df (patch)
tree895e142f514452310382ce8c315feebcce27b1e9 /packages/backend/src/core/ReactionService.ts
parentperf(backend): pre-compile regexp (diff)
downloadsharkey-7ce569424a67c786a4f44993ce74f06989eba9df.tar.gz
sharkey-7ce569424a67c786a4f44993ce74f06989eba9df.tar.bz2
sharkey-7ce569424a67c786a4f44993ce74f06989eba9df.zip
feat: カスタム絵文字ごとにそれをリアクションとして使えるロールを設定できるように
Diffstat (limited to 'packages/backend/src/core/ReactionService.ts')
-rw-r--r--packages/backend/src/core/ReactionService.ts51
1 files changed, 32 insertions, 19 deletions
diff --git a/packages/backend/src/core/ReactionService.ts b/packages/backend/src/core/ReactionService.ts
index 2184cfeb41..27334b33e6 100644
--- a/packages/backend/src/core/ReactionService.ts
+++ b/packages/backend/src/core/ReactionService.ts
@@ -20,6 +20,7 @@ import { bindThis } from '@/decorators.js';
import { UtilityService } from '@/core/UtilityService.js';
import { UserBlockingService } from '@/core/UserBlockingService.js';
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
+import { RoleService } from '@/core/RoleService.js';
const FALLBACK = '❤';
@@ -75,6 +76,7 @@ export class ReactionService {
private utilityService: UtilityService,
private metaService: MetaService,
private customEmojiService: CustomEmojiService,
+ private roleService: RoleService,
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private userBlockingService: UserBlockingService,
@@ -88,7 +90,7 @@ export class ReactionService {
}
@bindThis
- public async create(user: { id: User['id']; host: User['host']; isBot: User['isBot'] }, note: Note, reaction?: string | null) {
+ public async create(user: { id: User['id']; host: User['host']; isBot: User['isBot'] }, note: Note, _reaction?: string | null) {
// Check blocking
if (note.userId !== user.id) {
const blocked = await this.userBlockingService.checkBlocked(note.userId, user.id);
@@ -102,10 +104,36 @@ export class ReactionService {
throw new IdentifiableError('68e9d2d1-48bf-42c2-b90a-b20e09fd3d48', 'Note not accessible for you.');
}
+ let reaction = _reaction ?? FALLBACK;
+
if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote') && (user.host != null))) {
reaction = '❤️';
- } else {
- reaction = await this.toDbReaction(reaction, user.host);
+ } else if (_reaction) {
+ const custom = reaction.match(isCustomEmojiRegexp);
+ if (custom) {
+ const reacterHost = this.utilityService.toPunyNullable(user.host);
+
+ const name = custom[1];
+ const emoji = reacterHost == null
+ ? (await this.customEmojiService.localEmojisCache.fetch()).get(name)
+ : await this.emojisRepository.findOneBy({
+ host: reacterHost,
+ name,
+ });
+
+ if (emoji) {
+ if (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0 || (await this.roleService.getUserRoles(user.id)).some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id))) {
+ reaction = reacterHost ? `:${name}@${reacterHost}:` : `:${name}:`;
+ } else {
+ // リアクションとして使う権限がない
+ reaction = FALLBACK;
+ }
+ } else {
+ reaction = FALLBACK;
+ }
+ } else {
+ reaction = this.normalize(reaction ?? null);
+ }
}
const record: NoteReaction = {
@@ -291,11 +319,9 @@ export class ReactionService {
}
@bindThis
- public async toDbReaction(reaction?: string | null, reacterHost?: string | null): Promise<string> {
+ public normalize(reaction: string | null): string {
if (reaction == null) return FALLBACK;
- reacterHost = this.utilityService.toPunyNullable(reacterHost);
-
// 文字列タイプのリアクションを絵文字に変換
if (Object.keys(legacies).includes(reaction)) return legacies[reaction];
@@ -309,19 +335,6 @@ export class ReactionService {
return unicode.match('\u200d') ? unicode : unicode.replace(/\ufe0f/g, '');
}
- const custom = reaction.match(isCustomEmojiRegexp);
- if (custom) {
- const name = custom[1];
- const emoji = reacterHost == null
- ? (await this.customEmojiService.localEmojisCache.fetch()).get(name)
- : await this.emojisRepository.findOneBy({
- host: reacterHost,
- name,
- });
-
- if (emoji) return reacterHost ? `:${name}@${reacterHost}:` : `:${name}:`;
- }
-
return FALLBACK;
}