mirror of
https://github.com/xHyroM/bun-discord-bot.git
synced 2024-12-22 12:11:06 +01:00
chore(validateTags): finish
This commit is contained in:
parent
9d3dda4b6b
commit
de8a1e27f1
8 changed files with 91 additions and 16 deletions
6
.github/workflows/validate.yml
vendored
6
.github/workflows/validate.yml
vendored
|
@ -28,6 +28,6 @@ jobs:
|
|||
|
||||
- name: Validate tag
|
||||
run: bun run validate
|
||||
env:
|
||||
PR_ID: ${{ github.event.pull_request.number }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-sha: ${{ github.event.pull_request.head.sha }}
|
|
@ -15,6 +15,6 @@ I love bun ❤️
|
|||
|
||||
Informations:
|
||||
- The bot uses interactions so you can use emoji from all discord servers. However, please only use ours as we can't control the others.
|
||||
- You can use hyperlink `[bun.sh](https://bun.sh)`
|
||||
- You can use hyperlink `[bun.sh](<https://bun.sh>)`
|
||||
- Keywords need to include the tag name
|
||||
- Use `+++` for codeblock (https://canary.discord.com/channels/876711213126520882/887787428973281300/997045766411530281)
|
|
@ -3,7 +3,7 @@
|
|||
"name": "bun-discord-bot",
|
||||
"scripts": {
|
||||
"start": "bun src/index.ts",
|
||||
"validate": "cd scripts/validateTags && bun start",
|
||||
"validate": "cd scripts/validateTags && bun install && bun start",
|
||||
"cloudflare:tunnel": "sudo cloudflared tunnel run"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
BIN
scripts/validateTags/bun.lockb
Executable file
BIN
scripts/validateTags/bun.lockb
Executable file
Binary file not shown.
3
scripts/validateTags/files.json
Normal file
3
scripts/validateTags/files.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
[
|
||||
"files/tags.toml"
|
||||
]
|
|
@ -1,6 +1,10 @@
|
|||
{
|
||||
"name": "validate-tags",
|
||||
"scripts": {
|
||||
"start": "bun src/index.ts"
|
||||
}
|
||||
"name": "validate-tags",
|
||||
"scripts": {
|
||||
"start": "bun src/index.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.0",
|
||||
"@actions/github": "^5.0.3"
|
||||
}
|
||||
}
|
|
@ -1,8 +1,80 @@
|
|||
import { context } from '@actions/github';
|
||||
import { getInput } from '@actions/core';
|
||||
|
||||
interface Tag {
|
||||
keywords: string[];
|
||||
content: string;
|
||||
}
|
||||
|
||||
const githubToken = getInput('github-token');
|
||||
const commitSha = getInput('commit-sha');
|
||||
|
||||
const codeBlockRegex = /(`{1,3}).+?\1/gs;
|
||||
const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)/gi;
|
||||
const files = await Bun.file('./files.json').text();
|
||||
if (!files.includes('files/tags.toml')) process.exit(0);
|
||||
|
||||
// @ts-expect-error types
|
||||
const tags = await import('../../../files/tags.toml');
|
||||
console.log(tags);
|
||||
const errors = [];
|
||||
|
||||
let tags;
|
||||
try {
|
||||
// @ts-expect-error types
|
||||
tags = (await import('../../../files/tags.toml')).default;
|
||||
} catch(e) {
|
||||
tags = [];
|
||||
errors.push(e.message);
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(tags)) {
|
||||
const tag = value as Tag;
|
||||
|
||||
if (!tag?.keywords || tag.keywords.length === 0) errors.push(`**[${key}]:** Tag must have keywords`);
|
||||
if (tag?.keywords?.[0] !== key) errors.push(`**[${key}]:** First keyword of tag is not the same as the tag name`);
|
||||
if (!tag.content) errors.push(`**[${key}]:** Tag must have content`);
|
||||
|
||||
if (tag.content) {
|
||||
const cleanedContent = tag.content.replaceAll('+++', '```').replace(codeBlockRegex, '');
|
||||
for (const url of cleanedContent.match(urlRegex) || []) {
|
||||
const firstChar = tag.content.split(url)[0].slice(-1);
|
||||
const lastChar = tag.content.split(url)[1].slice(0, 1);
|
||||
if (
|
||||
firstChar !== '<' ||
|
||||
lastChar !== '>'
|
||||
) errors.push(`**[${key}]:** Link must be wrapped in <>`);
|
||||
}
|
||||
}
|
||||
|
||||
if (tag.keywords) {
|
||||
const keywords = [...new Set(tag.keywords)];
|
||||
if (keywords.length !== tag.keywords.length) errors.push(`**[${key}]:** Keywords must be unique`);
|
||||
}
|
||||
}
|
||||
|
||||
if (errors.length === 0) {
|
||||
fetch(`https://api.github.com/repos/${context.repo.owner}/${context.repo.repo}/pulls/${context.payload.pull_request.number}/reviews`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/vnd.github+json',
|
||||
'Authorization': `token ${githubToken}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
commit_id: commitSha,
|
||||
event: 'APPROVE',
|
||||
})
|
||||
})
|
||||
} else {
|
||||
fetch(`https://api.github.com/repos/${context.repo.owner}/${context.repo.repo}/pulls/${context.payload.pull_request.number}/reviews`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/vnd.github+json',
|
||||
'Authorization': `token ${githubToken}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
commit_id: commitSha,
|
||||
body: 'Please fix the following problems:\n' + errors.join('\n'),
|
||||
event: 'REQUEST_CHANGES',
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export { };
|
||||
|
|
|
@ -8,10 +8,6 @@ export interface Tag {
|
|||
content: string;
|
||||
}
|
||||
|
||||
export interface ExtendedTag extends Tag {
|
||||
match: '✅' | '🔑' | '📄'
|
||||
}
|
||||
|
||||
const tagCache: Collection<string, Tag> = new Collection();
|
||||
|
||||
for (const [key, value] of Object.entries(tags)) {
|
||||
|
|
Loading…
Reference in a new issue