From ae3339e49fc229a4484c0f8a756442846961a8e3 Mon Sep 17 00:00:00 2001 From: kimpure Date: Thu, 21 May 2026 13:09:54 +0000 Subject: [PATCH] add more safer korean replace --- packages/bot/commands/readChannel.ts | 3 +- packages/bot/commands/unreadChannel.ts | 5 ++-- packages/bot/events/readChannel.ts | 22 +++++++-------- packages/utils/saferKorean.ts | 38 ++++++++++++++++++++++---- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/packages/bot/commands/readChannel.ts b/packages/bot/commands/readChannel.ts index 1cf2e6d..92ef62b 100644 --- a/packages/bot/commands/readChannel.ts +++ b/packages/bot/commands/readChannel.ts @@ -1,4 +1,4 @@ -import { Channel, ChatInputCommandInteraction, MessageFlags, SlashCommandSubcommandBuilder } from "discord.js"; +import { Channel, ChannelType, ChatInputCommandInteraction, MessageFlags, SlashCommandSubcommandBuilder } from "discord.js"; import { defineCommand, DiscordCommand } from "../command"; import { insertGuildReadChannel } from "../db"; @@ -9,6 +9,7 @@ export default defineCommand( .addChannelOption(option => option .setName("channel") + .addChannelTypes(ChannelType.GuildText, ChannelType.GuildVoice) .setDescription("예주가 읽을 채널이에요") .setRequired(true) ), diff --git a/packages/bot/commands/unreadChannel.ts b/packages/bot/commands/unreadChannel.ts index b1ad45a..20da2e3 100644 --- a/packages/bot/commands/unreadChannel.ts +++ b/packages/bot/commands/unreadChannel.ts @@ -1,4 +1,4 @@ -import { Channel, ChatInputCommandInteraction, MessageFlags, SlashCommandSubcommandBuilder } from "discord.js"; +import { Channel, ChannelType, ChatInputCommandInteraction, MessageFlags, SlashCommandSubcommandBuilder } from "discord.js"; import { defineCommand, DiscordCommand } from "../command"; import { insertGuildReadChannel, removeGuildReadChannel } from "../db"; @@ -9,6 +9,7 @@ export default defineCommand( .addChannelOption(option => option .setName("channel") + .addChannelTypes(ChannelType.GuildText, ChannelType.GuildVoice) .setDescription("예주가 더이상 읽지 않을 채널이에요") .setRequired(true) ), @@ -29,7 +30,7 @@ export default defineCommand( return await interaction.editReply("읽지 않는것을 실패했어요 ?ㄴ"); } - await interaction.editReply("예주가 이제 이 채널을 읽지않아요!"); + await interaction.editReply(`예주가 <#${channel.id}> 채널을 읽지않아요!`); }, true ) \ No newline at end of file diff --git a/packages/bot/events/readChannel.ts b/packages/bot/events/readChannel.ts index 0a987da..7912aa0 100644 --- a/packages/bot/events/readChannel.ts +++ b/packages/bot/events/readChannel.ts @@ -55,21 +55,19 @@ export default defineEvent("messageCreate", async (message) => { return; if (message.content === "") { - return await playVoice( - guild, - profile, - voice, - content = - message.attachments.size > 0 - ? `${message.attachments.size} 개의 첨부파일` - : "알수없는 메시지" - ); - } else { - for (const text of content.split("\n")) { - await playVoice(guild, profile, voice, text, options); + content = message.attachments.size > 0 + ? `${message.attachments.size} 개의 첨부파일` + : "알수없는 메시지" + + if (message.attachments.size == 1 && Math.random() < 0.05) { + content = "어이, 유저. 일개의 첨부파일이 뭘 할 수 있지?" } } + for (const text of content.split("\n")) { + await playVoice(guild, profile, voice, text, options); + } + } catch(err) { message.reply("말이 꼬이네요 ㅜ.ㅜ"); console.log("playVoice failed. ", err); diff --git a/packages/utils/saferKorean.ts b/packages/utils/saferKorean.ts index 1cbdfef..9776349 100644 --- a/packages/utils/saferKorean.ts +++ b/packages/utils/saferKorean.ts @@ -103,10 +103,33 @@ export const LangPrefixMaxLength = (()=>{ return max; })(); +export const SIPrefix = { + "k": "킬로", + "ki": "키비", + "m": "메가", + "mi": "메비", + "g": "기가", + "gi": "기비", + "t": "테라", + "ti": "테비", + "p": "페타", + "pi": "페비", + "e": "엑사", + "ei": "엑시", + "z": "제타", + "zi": "제비", + "y": "요타", + "yi": "요비", +} + +export function processDots(input: string): string { + return input.replace(/[\.,]+$/, "") + .replace(/[\.,]{2,}/g, "") + .replace(/[\.,]\s/g, " "); +} + export function saferKorean(input: string): string { - return input.replace(/\.+$/, "") - .replace(/\.\.+/g, "") - .replace(/\.[ \t]/g, " ") + return processDots(input) .replace(/^[\?\!\'\"]+$/, (total)=>( [...total].map(element => IsolatedSymbolMap[ element as keyof typeof IsolatedSymbolMap @@ -123,7 +146,7 @@ export function saferKorean(input: string): string { } return lang + "코드블럭"; }) - .replace(/ㅋ{2,}/g, "크") + .replace(/ㅋ{2,}/g, (content) => "크".repeat(content.length)) .replace(/[아ㅏ]{3,}/g, "아아아") .replace(/https\S+/g, "링크") .replace(/ㅌ{2,}/g, "틔틔") @@ -133,7 +156,12 @@ export function saferKorean(input: string): string { } return content; }) - .replace(/(\d+)[ \t\n]*([개살])/g, (_, num: string, postfix: string)=>{ + .replace(/(\d+)([kKMmgGtTpP][iI]?)[bB]/g, (_, num: string, mod: string) => { + num = IntegerKorean.convertFromString(num); + mod = SIPrefix[mod.toLowerCase() as keyof typeof SIPrefix]; + return `${num} ${mod}바이트 `; + }) + .replace(/(\d+)[ \t\n]*([개살시])/g, (_, num: string, postfix: string)=>{ const intNum = parseInt(num) if (CallingNumberKorean.canConvert(intNum)) { return CallingNumberKorean.convert(intNum) + postfix;