function formatResponse(text) { return text // Escape HTML entities first .replace(/&/g, "&") .replace(//g, ">") // Bold: **text** .replace(/\*\*(.+?)\*\*/g, "$1") // Italic: *text* .replace(/\*(.+?)\*/g, "$1") // Dice notation: 🎲 lines get highlighted .replace(/^(🎲.*)$/gm, '$1') // Line breaks .replace(/\n\n/g, "
")
.replace(/\n/g, "
")
// Wrap in paragraph
.replace(/^(.*)$/, "
$1
"); } Hooks.on("createChatMessage", async (chatData, options, userId) => { if (chatData.speaker?.alias === 'AI DM') return if(chatData.isRoll){ console.log(chatData); } }) Hooks.on("chatMessage", async (chatLog, message, chatData) => { const formattedContent = chatData.speaker.actor ? `${chatData.speaker.alias} says, "${message}"` : message const response = await fetch('https://ai-dm-api.artisan.al/prompt', { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ content: formattedContent }) }); const data = await response.json(); await ChatMessage.create({ content: formatResponse(data.result), speaker: { alias: 'AI DM'}, style: CONST.CHAT_MESSAGE_STYLES.IC }); }) Hooks.once("ready", () => { console.log('Claude listening...'); });