diff --git a/src/modules/codePreviews.js b/src/modules/codePreviews.js new file mode 100644 index 0000000..86f781b --- /dev/null +++ b/src/modules/codePreviews.js @@ -0,0 +1,100 @@ +const events = require("../lib/events.js"); +const {hasFlag} = require("../lib/guildSettings.js"); + +const REGEX_GITHUB = + /(?:\s|^)https?:\/\/(www\.)?github\.com\/.+?\/.+?\/blob\/([a-zA-Z0-9-_.#/]*)/g; +const REGEX_GITLAB = + /(?:\s|^)https?:\/\/(www\.)?gitlab\.com\/.+?\/.+?\/-\/blob\/([a-zA-Z0-9-_.#/]*)/g; +const REGEX_GITEA = + /(?:\s|^)https?:\/\/.+?\/.+?\/.+?\/src\/branch\/([a-zA-Z0-9-_.#/]*)/g; + +function unindent(str) { + str = str.replace(/\t/g, " "); + const minIndent = + str + .match(/^ *(?=\S)/gm) + ?.reduce((prev, curr) => Math.min(prev, curr.length), Infinity) ?? 0; + if (!minIndent) return str; + return str.replace(new RegExp(`^ {${minIndent}}`, "gm"), ""); +} + +events.add("messageCreate", "codePreviews", async function (msg) { + if (!msg.guildID) return; + if (!hasFlag(msg.guildID, "codePreviews")) return; + + let out = ""; + + const githubLinks = msg.content.match(REGEX_GITHUB); + const gitlabLinks = msg.content.match(REGEX_GITLAB); + const giteaLinks = msg.content.match(REGEX_GITEA); + + for (const link of githubLinks) { + const rawLink = link.replace("/blob/", "/raw/"); + const file = await fetch(rawLink).then((res) => res.text()); + const lines = file.replace(/\r/g, "").split("\n"); + + const fileName = link.substring( + link.lastIndexOf("/") + 1, + link.indexOf("#") == -1 ? link.length : link.indexOf("#") + ); + const fileType = + fileName.indexOf(".") == -1 + ? "" + : fileName.subString(fileName.indexOf(".") + 1); + + const lineStr = link.match(/#L\d+?(-L\d+?)?/)[0]; + let startLine, endLine; + let entireFile = false; + + if (lineStr) { + let [start, end] = link.match(/L\d+?/g); + start = parseInt(start.replace("L", "")); + if (!end) { + startLine = endLine = start; + } else { + end = parseInt(end.replace("L", "")); + startLine = start; + endLine = end; + } + } else { + entireFile = true; + startLine = 1; + endLine = lines.length; + } + + const whichLines = entireFile + ? "" + : startLine == endLine + ? "Line " + startLine + : "Lines " + startLine + "-" + endLine; + + startLine--; + endLine--; + + const targetLines = ( + entireFile ? lines : lines.slice(startLine, endLine) + ).join("\n"); + + out += + "**" + + fileName + + ": **" + + whichLines + + "\n```" + + fileType + + "\n" + + unindent(targetLines) + + "\n```\n"; + } + + if (out !== "") + msg.channel.createMessage({ + content: out, + allowedMentions: { + repliedUser: false, + }, + messageReference: { + messageID: msg.id, + }, + }); +});