import { IChannel } from "~/types";
export default function parseBody(body: string, activeChannel: IChannel) {
if (!activeChannel.id) throw new Error("No active channel")
body = escape(body);
const rules = [
//bold, italics and paragragh rules
[/\*\*\s?([^\n]+)\*\*/g, "$1"],
[/\*\s?([^\n]+)\*/g, "$1"],
[/\_\_\s?([^\n]+)\_\_/g, "$1"],
[/\~\~\s?([^\n]+)\~\~/g, "$1"],
// code lines and blocks
[/```(.+?)```/g, "
$1"],
[/(?$1"],
];
rules.forEach(([rule, template]) => {
body = body.replace(rule, template);
})
const mentions = body.match(/<@([a-z]|[0-9]){25}>/g);
if (mentions) {
const participants = (activeChannel.DM) ? activeChannel.dmParticipants : activeChannel.server.participants;
if (!participants) throw new Error(`participants in channel "${activeChannel.id}" not found"`)
mentions.forEach((e: string) => {
if (!e) return
const id = e.split('<@')[1]?.split('>')[0];
if (!id) return;
const user = participants.find((e) => e.id === id)
if (!user) return;
body = body.split(e).join(`@${user.username}`)
});
}
return body
}
function escape(s: string) {
return s.replace(
/[^0-9A-Za-z ]/g,
c => "" + c.charCodeAt(0) + ";"
);
}