jillo-bot/src/lib/counter.ts

90 lines
2.7 KiB
TypeScript

import { Client, CommandInteraction, GuildMember, MessageEmbed, TextChannel } from 'discord.js';
import * as fsp from 'fs/promises';
import { exists, getSign } from './util';
const counterFile = './counter.json';
const counterMessageFile = './counterMessageID.txt';
const PISS_CHANNEL = '975802147126018150';
export const EMOJI = '🪣';
let counter = 0;
export async function initializeCounter() {
if (await exists(counterFile)) {
counter = parseInt(await fsp.readFile(counterFile, 'utf8'));
} else {
counter = 0;
await saveCounter();
}
}
async function saveCounter() {
fsp.writeFile(counterFile, Math.trunc(counter).toString());
}
export async function changeCounter(delta: number) {
counter += delta;
await saveCounter();
return counter;
}
async function getCounterMessageID() {
if (await exists(counterMessageFile)) {
const str = await fsp.readFile(counterMessageFile, 'utf8');
return str;
} else {
return null;
}
}
function saveCounterMessageID(id: string) {
return fsp.writeFile(counterMessageFile, id);
}
export async function updateCounter(bot: Client) {
const channel = await bot.channels.fetch(PISS_CHANNEL) as TextChannel;
const messageID = await getCounterMessageID();
const content = `[${EMOJI}] x${counter}`;
// bit janky
try {
if (messageID) {
const message = await channel.messages.fetch(messageID);
if (!message) throw new Error();
await message.edit(content);
} else {
throw new Error();
}
} catch(err) {
const message = await channel.send(content);
message.pin();
await saveCounterMessageID(message.id);
}
}
export async function announceCounterUpdate(bot: Client, member: GuildMember, delta: number) {
const channel = await bot.channels.fetch(PISS_CHANNEL) as TextChannel;
const embed = new MessageEmbed()
.setAuthor(`${member.user.username}#${member.user.discriminator}`, member.user.displayAvatarURL())
.setDescription(`**${member.toString()}** has ${delta > 0 ? 'increased' : 'decreased'} the counter by **${Math.abs(delta)}**.`)
.setColor(member.displayColor)
.setTimestamp()
.setFooter(`[${EMOJI}] x${counter}`);
await channel.send({
embeds: [embed]
});
}
export async function changeCounterInteraction(interaction: CommandInteraction, member: GuildMember, amount: number) {
const newCount = await changeCounter(amount);
await updateCounter(interaction.client);
await announceCounterUpdate(interaction.client, member, amount);
interaction.reply({
content: `${EMOJI} **You have ${amount > 0 ? 'increased' : 'decreased'} the counter.**\n\`\`\`diff\n ${newCount - amount}\n${getSign(amount)}${Math.abs(amount)}\n ${newCount}\`\`\``,
ephemeral: true
});
}