refactor: 🔥 remove legacy reactions

BREAKING: Breaks emoji reaction compatibility with Misskey versions before custom reactions were added (v9?)
This commit is contained in:
ThatOneCalculator 2023-09-20 20:48:13 -07:00
parent 3a671e42d1
commit c119abc36c
No known key found for this signature in database
GPG key ID: 8703CACD01000000
6 changed files with 11 additions and 186 deletions

View file

@ -110,9 +110,8 @@ export function fromHtml(html: string, hashtagNames?: string[]): string {
} }
case "h1": { case "h1": {
text += "【";
appendChildren(node.childNodes); appendChildren(node.childNodes);
text += "\n"; text += "\n";
break; break;
} }

View file

@ -1,28 +0,0 @@
export default function (reaction: string): string {
switch (reaction) {
case "like":
return "👍";
case "love":
return "❤️";
case "laugh":
return "😆";
case "hmm":
return "🤔";
case "surprise":
return "😮";
case "congrats":
return "🎉";
case "angry":
return "💢";
case "confused":
return "😥";
case "rip":
return "😇";
case "pudding":
return "🍮";
case "star":
return "⭐";
default:
return reaction;
}
}

View file

@ -4,60 +4,11 @@ import { Emojis } from "@/models/index.js";
import { toPunyNullable } from "./convert-host.js"; import { toPunyNullable } from "./convert-host.js";
import { IsNull } from "typeorm"; import { IsNull } from "typeorm";
const legacies = new Map([
["like", "👍"],
["love", "❤️"],
["laugh", "😆"],
["hmm", "🤔"],
["surprise", "😮"],
["congrats", "🎉"],
["angry", "💢"],
["confused", "😥"],
["rip", "😇"],
["pudding", "🍮"],
["star", "⭐"],
]);
export async function getFallbackReaction() { export async function getFallbackReaction() {
const meta = await fetchMeta(); const meta = await fetchMeta();
return meta.defaultReaction; return meta.defaultReaction;
} }
export function convertLegacyReactions(reactions: Record<string, number>) {
const _reactions = new Map();
const decodedReactions = new Map();
for (const reaction in reactions) {
if (reactions[reaction] <= 0) continue;
let decodedReaction;
if (decodedReactions.has(reaction)) {
decodedReaction = decodedReactions.get(reaction);
} else {
decodedReaction = decodeReaction(reaction);
decodedReactions.set(reaction, decodedReaction);
}
let emoji = legacies.get(decodedReaction.reaction);
if (emoji) {
_reactions.set(emoji, (_reactions.get(emoji) || 0) + reactions[reaction]);
} else {
_reactions.set(
reaction,
(_reactions.get(reaction) || 0) + reactions[reaction],
);
}
}
const _reactions2 = new Map();
for (const [reaction, count] of _reactions) {
const decodedReaction = decodedReactions.get(reaction);
_reactions2.set(decodedReaction.reaction, count);
}
return Object.fromEntries(_reactions2);
}
export async function toDbReaction( export async function toDbReaction(
reaction?: string | null, reaction?: string | null,
reacterHost?: string | null, reacterHost?: string | null,
@ -66,9 +17,7 @@ export async function toDbReaction(
reacterHost = toPunyNullable(reacterHost); reacterHost = toPunyNullable(reacterHost);
// Convert string-type reactions to unicode if (reaction === "♥️") return "❤️";
const emoji = legacies.get(reaction) || (reaction === "♥️" ? "❤️" : null);
if (emoji) return emoji;
// Allow unicode reactions // Allow unicode reactions
const match = emojiRegex.exec(reaction); const match = emojiRegex.exec(reaction);
@ -128,9 +77,3 @@ export function decodeReaction(str: string): DecodedReaction {
host: undefined, host: undefined,
}; };
} }
export function convertLegacyReaction(reaction: string): string {
const decoded = decodeReaction(reaction).reaction;
if (legacies.has(decoded)) return legacies.get(decoded)!;
return decoded;
}

View file

@ -2,7 +2,6 @@ import { db } from "@/db/postgre.js";
import { NoteReaction } from "@/models/entities/note-reaction.js"; import { NoteReaction } from "@/models/entities/note-reaction.js";
import { Notes, Users } from "../index.js"; import { Notes, Users } from "../index.js";
import type { Packed } from "@/misc/schema.js"; import type { Packed } from "@/misc/schema.js";
import { convertLegacyReaction } from "@/misc/reaction-lib.js";
import type { User } from "@/models/entities/user.js"; import type { User } from "@/models/entities/user.js";
export const NoteReactionRepository = db.getRepository(NoteReaction).extend({ export const NoteReactionRepository = db.getRepository(NoteReaction).extend({
@ -27,10 +26,9 @@ export const NoteReactionRepository = db.getRepository(NoteReaction).extend({
id: reaction.id, id: reaction.id,
createdAt: reaction.createdAt.toISOString(), createdAt: reaction.createdAt.toISOString(),
user: await Users.pack(reaction.user ?? reaction.userId, me), user: await Users.pack(reaction.user ?? reaction.userId, me),
type: convertLegacyReaction(reaction.reaction), type: reaction.reaction,
...(opts.withNote ...(opts.withNote
? { ? {
// may throw error
note: await Notes.pack(reaction.note ?? reaction.noteId, me), note: await Notes.pack(reaction.note ?? reaction.noteId, me),
} }
: {}), : {}),
@ -41,7 +39,7 @@ export const NoteReactionRepository = db.getRepository(NoteReaction).extend({
src: NoteReaction[], src: NoteReaction[],
me?: { id: User["id"] } | null | undefined, me?: { id: User["id"] } | null | undefined,
options?: { options?: {
withNote: booleam; withNote: boolean;
}, },
): Promise<Packed<"NoteReaction">[]> { ): Promise<Packed<"NoteReaction">[]> {
const reactions = await Promise.allSettled( const reactions = await Promise.allSettled(

View file

@ -14,11 +14,7 @@ import {
import type { Packed } from "@/misc/schema.js"; import type { Packed } from "@/misc/schema.js";
import { nyaize } from "@/misc/nyaize.js"; import { nyaize } from "@/misc/nyaize.js";
import { awaitAll } from "@/prelude/await-all.js"; import { awaitAll } from "@/prelude/await-all.js";
import { import { decodeReaction } from "@/misc/reaction-lib.js";
convertLegacyReaction,
convertLegacyReactions,
decodeReaction,
} from "@/misc/reaction-lib.js";
import type { NoteReaction } from "@/models/entities/note-reaction.js"; import type { NoteReaction } from "@/models/entities/note-reaction.js";
import { import {
aggregateNoteEmojis, aggregateNoteEmojis,
@ -77,7 +73,7 @@ async function populateMyReaction(
if (_hint_?.myReactions) { if (_hint_?.myReactions) {
const reaction = _hint_.myReactions.get(note.id); const reaction = _hint_.myReactions.get(note.id);
if (reaction) { if (reaction) {
return convertLegacyReaction(reaction.reaction); return reaction.reaction;
} else if (reaction === null) { } else if (reaction === null) {
return undefined; return undefined;
} }
@ -90,7 +86,7 @@ async function populateMyReaction(
}); });
if (reaction) { if (reaction) {
return convertLegacyReaction(reaction.reaction); return reaction.reaction;
} }
return undefined; return undefined;
@ -107,7 +103,7 @@ export const NoteRepository = db.getRepository(Note).extend({
return true; return true;
} else { } else {
// 指定されているかどうか // 指定されているかどうか
return note.visibleUserIds.some((id: any) => meId === id); return note.visibleUserIds.some((id: string) => meId === id);
} }
} }
@ -182,7 +178,7 @@ export const NoteRepository = db.getRepository(Note).extend({
let text = note.text; let text = note.text;
if (note.name && (note.url ?? note.uri)) { if (note.name && (note.url ?? note.uri)) {
text = `${note.name}\n${(note.text || "").trim()}\n\n${ text = `${note.name}\n${(note.text || "").trim()}\n\n${
note.url ?? note.uri note.url ?? note.uri
}`; }`;
} }
@ -220,7 +216,7 @@ export const NoteRepository = db.getRepository(Note).extend({
note.visibility === "specified" ? note.visibleUserIds : undefined, note.visibility === "specified" ? note.visibleUserIds : undefined,
renoteCount: note.renoteCount, renoteCount: note.renoteCount,
repliesCount: note.repliesCount, repliesCount: note.repliesCount,
reactions: convertLegacyReactions(note.reactions), reactions: note.reactions,
reactionEmojis: reactionEmoji, reactionEmojis: reactionEmoji,
emojis: noteEmoji, emojis: noteEmoji,
tags: note.tags.length > 0 ? note.tags : undefined, tags: note.tags.length > 0 ? note.tags : undefined,
@ -301,7 +297,7 @@ export const NoteRepository = db.getRepository(Note).extend({
if (meId) { if (meId) {
const renoteIds = notes const renoteIds = notes
.filter((n) => n.renoteId != null) .filter((n) => n.renoteId != null)
.map((n) => n.renoteId!); .map((n) => n.renoteId);
const targets = [...notes.map((n) => n.id), ...renoteIds]; const targets = [...notes.map((n) => n.id), ...renoteIds];
const myReactions = await NoteReactions.findBy({ const myReactions = await NoteReactions.findBy({
userId: meId, userId: meId,

View file

@ -1,83 +0,0 @@
/*
import * as assert from 'assert';
import { toDbReaction } from '../src/misc/reaction-lib.js';
describe('toDbReaction', async () => {
it('既存の文字列リアクションはそのまま', async () => {
assert.strictEqual(await toDbReaction('like'), 'like');
});
it('Unicodeプリンは寿司化不能とするため文字列化しない', async () => {
assert.strictEqual(await toDbReaction('🍮'), '🍮');
});
it('プリン以外の既存のリアクションは文字列化する like', async () => {
assert.strictEqual(await toDbReaction('👍'), 'like');
});
it('プリン以外の既存のリアクションは文字列化する love', async () => {
assert.strictEqual(await toDbReaction('❤️'), 'love');
});
it('プリン以外の既存のリアクションは文字列化する love 異体字セレクタなし', async () => {
assert.strictEqual(await toDbReaction('❤'), 'love');
});
it('プリン以外の既存のリアクションは文字列化する laugh', async () => {
assert.strictEqual(await toDbReaction('😆'), 'laugh');
});
it('プリン以外の既存のリアクションは文字列化する hmm', async () => {
assert.strictEqual(await toDbReaction('🤔'), 'hmm');
});
it('プリン以外の既存のリアクションは文字列化する surprise', async () => {
assert.strictEqual(await toDbReaction('😮'), 'surprise');
});
it('プリン以外の既存のリアクションは文字列化する congrats', async () => {
assert.strictEqual(await toDbReaction('🎉'), 'congrats');
});
it('プリン以外の既存のリアクションは文字列化する angry', async () => {
assert.strictEqual(await toDbReaction('💢'), 'angry');
});
it('プリン以外の既存のリアクションは文字列化する confused', async () => {
assert.strictEqual(await toDbReaction('😥'), 'confused');
});
it('プリン以外の既存のリアクションは文字列化する rip', async () => {
assert.strictEqual(await toDbReaction('😇'), 'rip');
});
it('それ以外はUnicodeのまま', async () => {
assert.strictEqual(await toDbReaction('🍅'), '🍅');
});
it('異体字セレクタ除去', async () => {
assert.strictEqual(await toDbReaction('㊗️'), '㊗');
});
it('異体字セレクタ除去 必要なし', async () => {
assert.strictEqual(await toDbReaction('㊗'), '㊗');
});
it('fallback - undefined', async () => {
assert.strictEqual(await toDbReaction(undefined), 'like');
});
it('fallback - null', async () => {
assert.strictEqual(await toDbReaction(null), 'like');
});
it('fallback - empty', async () => {
assert.strictEqual(await toDbReaction(''), 'like');
});
it('fallback - unknown', async () => {
assert.strictEqual(await toDbReaction('unknown'), 'like');
});
});
*/