diff --git a/package.json b/package.json index 26d50f8..b751858 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@nhcarrigan/logger": "1.0.0", "@octokit/rest": "20.1.1", "@prisma/client": "5.13.0", + "diff": "8.0.2", "discord.js": "14.15.2", "dotenv": "16.4.5", "express": "4.19.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f52262..bbff01a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@prisma/client': specifier: 5.13.0 version: 5.13.0(prisma@5.13.0) + diff: + specifier: 8.0.2 + version: 8.0.2 discord.js: specifier: 14.15.2 version: 14.15.2 @@ -766,6 +769,10 @@ packages: devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3064,6 +3071,8 @@ snapshots: devtools-protocol@0.0.1147663: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 diff --git a/src/events/message/onMessageEdit.ts b/src/events/message/onMessageEdit.ts index 9872126..821f97d 100644 --- a/src/events/message/onMessageEdit.ts +++ b/src/events/message/onMessageEdit.ts @@ -4,6 +4,7 @@ import { ExtendedClient } from "../../interfaces/ExtendedClient"; import { getConfig } from "../../modules/data/getConfig"; import { customSubstring } from "../../utils/customSubstring"; import { errorHandler } from "../../utils/errorHandler"; +import { generateDiff } from "../../modules/events/generateDiff"; /** * Handles a message edit event. @@ -46,16 +47,15 @@ export const onMessageEdit = async ( return; } + const diffContent + = (oldMessage.content ?? newMessage.content) === null + ? "This message appears to have no content." + : generateDiff(oldMessage.content ?? "", newMessage.content ?? ""); + await logChannel.send({ content: `${author?.tag} (${author?.id}) edited their message in in <#${ channel.id - }>:\n\n**Old Content:**\n\`${customSubstring( - oldMessage.content, - 1750 - )}\`\n\n**New content:**\n\`${customSubstring( - newMessage.content, - 1750 - )}\`\n\n${newMessage.url}`, + }>:\`\`\`diff\n${customSubstring(diffContent, 4000)}\n\`\`\``, allowedMentions: { parse: [] } }); } catch (err) { diff --git a/src/modules/events/generateDiff.ts b/src/modules/events/generateDiff.ts new file mode 100644 index 0000000..7ce56b0 --- /dev/null +++ b/src/modules/events/generateDiff.ts @@ -0,0 +1,22 @@ +import { diffSentences } from "diff"; + +/** + * Module to generate a diff string from two strings. + * @param old - The old string. + * @param updated - The new string. + * @returns The diff string, formatted. + */ +export const generateDiff = (old: string, updated: string): string => { + return diffSentences(old, updated). + map((element) => { + if (element.added) { + return `+ ${element.value}`; + } + if (element.removed) { + return `- ${element.value}`; + } + return ""; + }). + filter(Boolean). + join("\n"); +};