From 1f99d77bc2b739cb5f94733868b07e3371dc6750 Mon Sep 17 00:00:00 2001 From: xHyroM Date: Wed, 13 Jul 2022 18:28:59 +0200 Subject: [PATCH] feat(githubUtils): show status, support for #XX search --- files/database.sqlite | Bin 143360 -> 143360 bytes src/commands/github.ts | 5 ++-- src/index.ts | 2 +- src/utils/formatStatus.ts | 18 -------------- src/utils/githubUtils.ts | 51 ++++++++++++++++++++++++++++++++------ 5 files changed, 46 insertions(+), 30 deletions(-) delete mode 100644 src/utils/formatStatus.ts diff --git a/files/database.sqlite b/files/database.sqlite index e22ac7d70414f179ebb0ed94ebd66421a0c28fc9..4ed05b6ad5a1a6ed1fcd7815f0fa1f78a9cf097e 100644 GIT binary patch delta 3499 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 delta 3235 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 diff --git a/src/commands/github.ts b/src/commands/github.ts index cef951b..e81d392 100644 --- a/src/commands/github.ts +++ b/src/commands/github.ts @@ -3,9 +3,8 @@ import { Command } from '../structures/Command'; // @ts-expect-error Types :( import utilities from '../../files/utilities.toml'; import Collection from '@discordjs/collection'; -import formatStatus from '../utils/formatStatus'; import { CommandContext } from '../structures/contexts/CommandContext'; -import { getIssueOrPR, search } from '../utils/githubUtils'; +import { getIssueOrPR, search, formatStatus } from '../utils/githubUtils'; const cooldowns: Collection = new Collection(); const invalidIssue = (ctx: CommandContext, query: string) => { @@ -83,7 +82,7 @@ new Command({ html_url: item.html_url, user_login: item.user.login, user_html_url: item.user.html_url, - type: item.pull_request ? '(PR)' : '(ISSUE)', + type: item.pull_request ? '(PR)' : '(IS)', }; } diff --git a/src/index.ts b/src/index.ts index 512fc08..fa92d59 100644 --- a/src/index.ts +++ b/src/index.ts @@ -106,7 +106,7 @@ app.post('/github_webhook', bodyParse(), (c) => { html_url: issueOrPr.issue.html_url, user_login: issueOrPr.issue.user.login, user_html_url: issueOrPr.issue.user.html_url, - type: '(ISSUE)', + type: '(IS)', }) } else { diff --git a/src/utils/formatStatus.ts b/src/utils/formatStatus.ts deleted file mode 100644 index 3378616..0000000 --- a/src/utils/formatStatus.ts +++ /dev/null @@ -1,18 +0,0 @@ -export default (data: any) => { - let operation = ''; - let timestamp = ''; - switch(data.state as 'open' | 'closed' | 'all') { - case 'open': - operation = 'opened'; - timestamp = ``; - break; - case 'closed': - operation = data?.pull_request?.merged_at ? 'merged' : 'closed'; - timestamp = data?.pull_request?.merged_at - ? `` - : ``; - break; - } - - return `${operation} ${timestamp}`; -} \ No newline at end of file diff --git a/src/utils/githubUtils.ts b/src/utils/githubUtils.ts index 26c226b..93fbdc5 100644 --- a/src/utils/githubUtils.ts +++ b/src/utils/githubUtils.ts @@ -18,7 +18,7 @@ interface Issue { html_url: string; user_login: string; user_html_url: string; - type: '(ISSUE)' | '(PR)'; + type: '(IS)' | '(PR)'; } interface PullRequest extends Issue { @@ -64,7 +64,7 @@ export const fetchIssues = async() => { issue.html_url, issue.user.login, issue.user.html_url, - '(ISSUE)' + '(IS)' ]); issues++; } @@ -145,7 +145,7 @@ export const setIssue = async(issue: Issue) => { issue.html_url, issue.user_login, issue.user_html_url, - '(ISSUE)' + '(IS)' ]); } } @@ -167,7 +167,7 @@ export const setPullRequest = async(pull: PullRequest) => { pull.html_url, pull.user_login, pull.user_html_url, - '(ISSUE)' + '(IS)' ]); } } @@ -183,14 +183,14 @@ export const search = async(query: string, repository: string): Promise new Object({ - name: `${issueOrPr.type} ${issueOrPr.title.slice(0, 93).replace(/[^a-z0-9 ]/gi, '')}`, + name: `${issueOrPr.type} ${formatEmojiStatus(issueOrPr)} ${issueOrPr.title.slice(0, 95).replace(/[^a-z0-9 ]/gi, '')}`, value: issueOrPr.number.toString() })) as APIApplicationCommandOptionChoice[] } const searcher = new MiniSearch({ - fields: ['title', 'number', 'type'], - storeFields: ['title', 'number', 'type'], + fields: query.startsWith('#') ? ['number'] : ['title'], + storeFields: ['title', 'number', 'type', 'state', 'merged_at'], searchOptions: { fuzzy: 3, processTerm: term => term.toLowerCase(), @@ -202,7 +202,7 @@ export const search = async(query: string, repository: string): Promise new Object({ - name: `${issueOrPr.type} ${issueOrPr.title.slice(0, 93).replace(/[^a-z0-9 ]/gi, '')}`, + name: `${issueOrPr.type} ${formatEmojiStatus(issueOrPr)} ${issueOrPr.title.slice(0, 95).replace(/[^a-z0-9 ]/gi, '')}`, value: issueOrPr.number.toString() })) as APIApplicationCommandOptionChoice[] } catch(e) { @@ -213,4 +213,39 @@ export const search = async(query: string, repository: string): Promise => { const issueOrPR = await db.prepare(`SELECT * FROM issuesandprs WHERE repository = '${repository}' AND number = ${number}`).get(); return issueOrPR; +} + +export const formatStatus = (data: Issue | PullRequest) => { + let operation = ''; + let timestamp = ''; + switch(data.state as 'open' | 'closed' | 'all') { + case 'open': + operation = 'opened'; + timestamp = ``; + break; + case 'closed': + operation = (data as PullRequest).merged_at ? 'merged' : 'closed'; + timestamp = (data as PullRequest).merged_at + ? `` + : ``; + break; + } + + return `${operation} ${timestamp}`; +} + +export const formatEmojiStatus = (data: Issue | PullRequest) => { + let emoji = ''; + switch(data.state as 'open' | 'closed' | 'all') { + case 'open': + emoji = '🟢'; + break; + case 'closed': + emoji = '🔴'; + break; + } + + if (data.type === '(PR)' && !isNaN(new Date((data as PullRequest).merged_at).getTime())) emoji = '🟣'; + + return emoji; } \ No newline at end of file