const events = require("../lib/events.js"); const {hasFlag} = require("../lib/guildSettings.js"); const fetch = require("node-fetch"); 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); if (githubLinks?.length) { 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, }, }); });