refactor: 🔥 remove legacy reactions
BREAKING: Breaks emoji reaction compatibility with Misskey versions before custom reactions were added (v9?)
This commit is contained in:
parent
3a671e42d1
commit
c119abc36c
6 changed files with 11 additions and 186 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
*/
|
|
Loading…
Reference in a new issue