import { config } from '../../config.js'; import { Score } from '../types/score.js'; import { defaultTemplate } from '../../backend/const.js'; import { IUser } from '../types/user.js'; import { createGacha } from './create-gacha.js'; import { Count } from '../../backend/models/count.js'; import { getDelta } from '../../backend/functions/get-scores.js'; /** * 埋め込み変数の型 */ export type Variable = string | ((score: Score, user: IUser) => string); /** * 埋め込み可能な変数のリスト */ export const variables: Record = { notesCount: score => String(score.notesCount), followingCount: score => String(score.followingCount), followersCount: score => String(score.followersCount), notesDelta: score => String(score.notesDelta), followingDelta: score => String(score.followingDelta), followersDelta: score => String(score.followersDelta), url: config.url, username: (_, user) => String(user.username), host: (_, user) => String(user.host), rating: (_, user) => String(user.rating), gacha: () => createGacha(), }; const variableRegex = /\{([a-zA-Z0-9_]+?)}/g; /** * スコア情報とユーザー情報からテキストを生成する * @param user ユーザー情報 * @param count カウント * @returns 生成したテキスト */ export const format = (user: IUser, count: Count): string => { const score: Score = { ...count, ...getDelta(user, count), }; const template = user.template || defaultTemplate; let result = template.replace(variableRegex, (m, name) => { const v = variables[name]; return !v ? m : typeof v === 'function' ? v(score, user) : v; }); if (user.appendHashtag) { result = result + '\n\n#misshaialert'; } return result; };