This is the code that runs https://bandolier.learnjsthehardway.com/ for you to review. It uses the https://git.learnjsthehardway.com/learn-javascript-the-hard-way/bandolier-template to create the documentation for the project.
https://bandolier.learnjsthehardway.com/
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.
89 lines
2.8 KiB
89 lines
2.8 KiB
2 years ago
|
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: [
|
||
|
IntentsBitField.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
|
||
|
return [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);
|
||
|
}
|
||
|
}
|