Simp-O-Matic

Dumb Discord bot in TS.
git clone git://git.knutsen.co/Simp-O-Matic
Log | Files | Refs | README | LICENSE

commit fe83519567bcdac02d9b1414dcbefe4e5cab7068
parent 5bc3a14acb7c99c27283f108f48f3408a9d46c30
Author: Demonstrandum <moi@knutsen.co>
Date:   Tue, 26 May 2020 23:06:36 +0100

Add author information to !code command.

Diffstat:
M.gitignore | 1+
Mlib/commands/code.ts | 56++++++++++++++++++++++++++++++++++++++++++++++++++------
Dtest.sh | 4----
3 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -2,6 +2,7 @@ secrets.json .env export_secrets.sh +console.rb # Node / NPM / Yarn node_modules/ diff --git a/lib/commands/code.ts b/lib/commands/code.ts @@ -1,9 +1,41 @@ import { readFileSync as read_file } from 'fs'; +import path from 'path'; + +import git from 'nodegit'; import { FORMATS } from '../extensions'; import { glue_strings } from '../utils'; -export default (homescope : HomeScope) => { +const GIT_DIR = path.resolve(process.cwd(), "./.git"); + +type Authors = Record<string, number>; + +const file_authors = async (filename: string): Promise<Authors> => { + const authors = <Authors>{}; + + const repo = await git.Repository.open(GIT_DIR); + const blame = await git.Blame.file(repo, filename, ['p']); + + for (let i = 0; i < blame.getHunkCount(); i++) { + // Hunk has bad type signatures, someone should tell `nodegit'. + const hunk: any = blame.getHunkByIndex(i); + for (let j = 0; j < hunk.linesInHunk(); j++) { + const oid = hunk.finalCommitId(); + const commit = await repo.getCommit(oid); + const name = commit.author().name(); + + if (authors.hasOwnProperty(name)) + authors[name] += 1; + else + authors[name] = 1; + } + } + + return authors; +}; + + +export default async (homescope : HomeScope) => { const { message, args, CONFIG } = homescope; const p = CONFIG.commands.prefix; @@ -12,6 +44,9 @@ export default (homescope : HomeScope) => { const command = args[0].startsWith(p) ? args[0].tail() : args[0]; + if (command.match(/\//g)) + return message.answer("No paths allowed..."); + const expansion = CONFIG.commands.aliases[command]; if (expansion) return message.channel.send(`\`${p}${command}\`` + `is an alias that expands to \`${p}${expansion}\`.`); @@ -20,19 +55,28 @@ export default (homescope : HomeScope) => { try { const source = read_file(filename).toString(); - const msg = `Source code for \`${p}${command}\`:`; + const authors = await file_authors(filename); + const author_str = "\n**Authors**: " + Object.keys(authors) + .map(author => `(\`${authors[author]}\`) ${author}`) + .join(','); + + const msg = `Source code for \`${p}${command}\`:\n`; - if (source.length > 1900) { + const msg_len = [msg, source, author_str] + .reduce((acc, s) => acc + s.length, 0); + + if (msg_len > 1990) { const chunks = glue_strings(source.split(/^/m), 1950); message.channel.send(msg); - for (const chunk of chunks) message.channel.send( chunk.format(FORMATS.code_block, 'typescript')); + message.channel.send(author_str); } else { - message.channel.send(`${msg}\n` - + source.format(FORMATS.code_block, 'typescript')); + message.channel.send(msg + + source.format(FORMATS.code_block, 'typescript') + + author_str); } } catch { message.answer(`Source for \`${p}${command}\`` diff --git a/test.sh b/test.sh @@ -1,4 +0,0 @@ - #/bin/bash - for i; do - echo "Arg: '$i'" - done