mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2025-09-02 16:41:25 +03:00
feat: update checker
This commit is contained in:
@@ -183,7 +183,6 @@ commands:
|
||||
name: tag
|
||||
tickets:
|
||||
description: List your own or someone else's tickets
|
||||
fields:
|
||||
name: tickets
|
||||
not_staff:
|
||||
description: Only staff members can view others' tickets.
|
||||
@@ -346,6 +345,12 @@ misc:
|
||||
unknown_category:
|
||||
description: Please try a different category.
|
||||
title: ❌ That ticket category doesn't exist
|
||||
update:
|
||||
description: |
|
||||
> [View `{version}` on GitHub]({github})
|
||||
> [Changelog]({changelog})
|
||||
> [Update guide]({guide})
|
||||
title: An update is available
|
||||
modals:
|
||||
feedback:
|
||||
comment:
|
||||
|
@@ -32,7 +32,7 @@ const { colours } = require('leeks.js');
|
||||
|
||||
// check node version
|
||||
if (!semver.satisfies(process.versions.node, pkg.engines.node)) {
|
||||
console.log('\x07' + colours.redBright(`Error: Your current Node.js version, ${process.versions.node}, does not meet the requirement "${pkg.engines.node}".`));
|
||||
console.log('\x07' + colours.redBright(`Error: Your current Node.js version, ${process.versions.node}, does not meet the requirement "${pkg.engines.node}". Please update to version ${semver.minVersion(pkg.engines.node).version} or higher.`));
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
|
@@ -5,6 +5,7 @@ const {
|
||||
} = require('leekslazylogger');
|
||||
const DTF = require('@eartharoid/dtf');
|
||||
const { short } = require('leeks.js');
|
||||
const { format } = require('util');
|
||||
|
||||
const dtf = new DTF('en-GB');
|
||||
const colours = {
|
||||
@@ -24,7 +25,13 @@ module.exports = config => {
|
||||
format: log => {
|
||||
const timestamp = dtf.fill('DD/MM/YY HH:mm:ss', log.timestamp);
|
||||
const colour = colours[log.level.name];
|
||||
return short(`&f&!7 ${timestamp} &r ${colour[0]}[${log.level.name.toUpperCase()}]&r ${log.namespace ? `&d(${log.namespace.toUpperCase()})&r ` : ''}${colour[1]}${log.content}`);
|
||||
return format(
|
||||
short(`&f&!7 %s &r ${colour[0]}[%s]&r %s${colour[1]}%s&r`),
|
||||
timestamp,
|
||||
log.level.name.toUpperCase(),
|
||||
log.namespace ? short(`&d(${log.namespace.toUpperCase()})&r `) : '',
|
||||
log.content,
|
||||
);
|
||||
},
|
||||
level: config.logs.level,
|
||||
}),
|
||||
|
89
src/lib/updates.js
Normal file
89
src/lib/updates.js
Normal file
@@ -0,0 +1,89 @@
|
||||
const semver = require('semver');
|
||||
const { short } = require('leeks.js');
|
||||
const ExtendedEmbedBuilder = require('./embed');
|
||||
const { version: currentVersion } = require('../../package.json');
|
||||
|
||||
/** @param {import("client")} client */
|
||||
module.exports = client => {
|
||||
client.log.info('Checking for updates...');
|
||||
fetch('https://api.github.com/repos/discord-tickets/bot/releases')
|
||||
.then(res => res.json())
|
||||
.then(async json => {
|
||||
// releases are ordered by date, so a patch for an old version could be before the latest version
|
||||
const releases = json
|
||||
.filter(release => !release.prerelease)
|
||||
.sort((a, b) => semver.compare(semver.coerce(b.tag_name)?.version, semver.coerce(a.tag_name)?.version));
|
||||
const latestRelease = releases[0];
|
||||
const latestVersion = semver.coerce(latestRelease.tag_name)?.version;
|
||||
const compared = semver.compare(latestVersion, currentVersion);
|
||||
|
||||
switch (compared) {
|
||||
case -1: {
|
||||
client.log.notice('You are running a pre-release version of Discord Tickets');
|
||||
break;
|
||||
}
|
||||
case 0: {
|
||||
client.log.info('No updates available');
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
let currentRelease = releases.findIndex(release => semver.coerce(release.tag_name)?.version === currentVersion);
|
||||
if (currentRelease === -1) return client.log.warn('Failed to find current release');
|
||||
const behind = currentRelease;
|
||||
currentRelease = releases[currentRelease];
|
||||
const changelog = `https://discordtickets.app/changelogs/v${latestVersion.replaceAll('.', '') }/`;
|
||||
const guide = 'https://discordtickets.app/self-hosting/updating/';
|
||||
const { default: boxen } = await import('boxen');
|
||||
|
||||
client.log.notice(
|
||||
short('&r&6A new version of Discord Tickets is available (&c%s&6 -> &a%s&6)&r\n'),
|
||||
currentVersion,
|
||||
latestVersion,
|
||||
boxen(
|
||||
short([ // uses template literals to ensure boxen adds the correct padding
|
||||
`&6You are &f${behind}&6 version${behind === 1 ? '' : 's'} behind the latest version, &a${latestVersion}&6.&r`,
|
||||
`&6Changelog: &e${changelog}&r`,
|
||||
`&6Update guide: &e${guide}&r`,
|
||||
].join('\n')),
|
||||
{
|
||||
align: 'center',
|
||||
borderColor: 'yellow',
|
||||
borderStyle: 'round',
|
||||
margin: 1,
|
||||
padding: 1,
|
||||
title: 'Update available',
|
||||
}),
|
||||
);
|
||||
|
||||
if (process.env.PUBLIC_BOT !== 'true') {
|
||||
const guilds = await client.prisma.guild.findMany({ where: { logChannel: { not: null } } });
|
||||
for (const guild of guilds) {
|
||||
const getMessage = client.i18n.getLocale(guild.locale);
|
||||
await client.channels.cache.get(guild.logChannel).send({
|
||||
embeds: [
|
||||
new ExtendedEmbedBuilder()
|
||||
.setColor('Blurple')
|
||||
.setAuthor({
|
||||
iconURL: latestRelease.author.avatar_url,
|
||||
name: latestRelease.author.login,
|
||||
})
|
||||
.setTitle(getMessage('misc.update.title'))
|
||||
.setDescription(getMessage('misc.update.fields.links.value', {
|
||||
changelog,
|
||||
github: latestRelease.html_url,
|
||||
guide,
|
||||
version: latestRelease.tag_name,
|
||||
})),
|
||||
],
|
||||
});
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
client.log.warn('Failed to check for updates');
|
||||
client.log.error(error);
|
||||
});
|
||||
};
|
@@ -4,6 +4,7 @@ const ms = require('ms');
|
||||
const { version } = require('../../../package.json');
|
||||
const { msToMins } = require('../../lib/misc');
|
||||
const sync = require('../../lib/sync');
|
||||
const checkForUpdates = require('../../lib/updates');
|
||||
|
||||
module.exports = class extends Listener {
|
||||
constructor(client, options) {
|
||||
@@ -118,6 +119,11 @@ module.exports = class extends Listener {
|
||||
setInterval(() => send(), ms('12h'));
|
||||
}
|
||||
|
||||
if (client.config.updates) {
|
||||
checkForUpdates(client);
|
||||
setInterval(() => checkForUpdates(client), ms('1w'));
|
||||
}
|
||||
|
||||
setInterval(() => {
|
||||
// TODO: check lastMessageAt and set stale
|
||||
// this.$stale.set(ticket.id, {
|
||||
|
Reference in New Issue
Block a user