This is the template project that's checked out and configured when you run the bando-up command from ljsthw-bandolier. This is where the code really lives.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
bandolier-template/queues/discord.js

88 lines
2.8 KiB

import assert from "assert";
import logging from '../lib/logging.js';
import { Client, IntentsBitField, Partials } from "discord.js";
import { User } from "../lib/models.js";
import { company } from '../emails/config.js';
import { discord } from "../lib/config.js";
import { send_email, load_templates, debug_templates } from '../lib/email.js';
const log = logging.create("/queues/mail.js");
const client = new Client({
intents: [
Intents.Flags.GuildInvites,
],
partials: [ Partials.GuildMember ],
});
const load_guild_channel = async (client) => {
const guilds = await client.guilds.fetch();
let temp = guilds.entries().next().value[1];
assert(temp, "Can't find any guilds/servers.");
const guild = await temp.fetch();
assert(guild, "No guild after fetch.");
const channels = await guild.channels.fetch();
for(let chan of channels.entries()) {
if(chan[1].type === "GUILD_TEXT") {
// remember, return await puts the errors here
return [guild, await chan[1].fetch()];
}
}
// fallthrough, no text channels
[guild, undefined];
}
log.info("Connecting to discord server...");
await client.login(discord.token);
const [guild, channel] = await load_guild_channel(client);
// if it doesn't exist make it and add it to their account
log.info("Connected to Sever/Guild", guild.name);
log.info("Sending invites from Channel", channel.name);
const invite_email = await load_templates("discord_email");
export const send_invite = async (job) => {
try {
console.log("JOB!", job.data);
assert(channel !== undefined, "Did not find one text channel.");
assert(job.data.user_id !== undefined, "user_id is required");
log.debug(`Discord invite request for ${job.data.user_id}`);
const user = await User.first({id: job.data.user_id});
assert(user, "didn't find user");
// check the user's account to see if a code already exists
if(user.discord_invite) {
log.info(`Ignoring user ${ user.id } because they already have invite code ${ user.discord_invite } sent on ${ user.discord_sent }`);
} else {
const invite = await channel.createInvite(discord.invites);
// update the user's account with their invite code and
const text = invite_email.txt({ user, invite, company, discord });
const html = invite_email.html({ user, invite, company, discord });
await User.update({id: user.id}, { discord_invite: invite.code, discord_sent: new Date()});
await debug_templates({ text, html }, "invite_email");
// send both txt and html as attachments
send_email({
from: company.mail,
to: user.email,
subject: `Discord Invite for ${company.website}`,
text, html
});
log.info(`INVITE code ${invite.code} sent to user ${user.id}`);
}
} catch (error) {
log.error(error);
}
}