mirror of
https://github.com/ION606/selmerBot.git
synced 2026-05-15 05:36:54 +00:00
184 lines
6.0 KiB
JavaScript
184 lines
6.0 KiB
JavaScript
/*
|
|
-----WEBHOOKS ARE MONITORED AND PROCESSED HERE-----
|
|
https://glitch.com/edit/#!/selmer-bot-listener
|
|
--------------------------------------------------
|
|
*/
|
|
|
|
const { MongoClient, ServerApiVersion } = require('mongodb');
|
|
const { MessageActionRow, MessageSelectMenu } = require('discord.js');
|
|
|
|
|
|
//Called from the dropdown menu
|
|
async function createSubscriptionManual(bot, interaction, id, priceID) {
|
|
const stripe = bot.stripe;
|
|
const mongouri = bot.mongouri;
|
|
|
|
//Error Checking (unlikely, but just in case)
|
|
if (!id) { console.log('....What? How?'); return interaction.editReply("Uh oh, something happened with the Stripe Discord ID check, please contact support!"); }
|
|
|
|
const client = new MongoClient(mongouri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
|
|
new Promise(async function(resolve, reject) {
|
|
client.connect(async (err) => {
|
|
if (err) { return console.log(err); }
|
|
|
|
const dbo = client.db('main').collection('authorized');
|
|
await dbo.findOne({'discordID': id}).then(async (doc) => {
|
|
var userID;
|
|
|
|
if (doc != undefined) {
|
|
client.close();
|
|
|
|
reject(`An account with the tag <@${id}> already exists!`);
|
|
} else {
|
|
const stripeUser = await stripe.customers.create({
|
|
metadata: { 'discordID': id }
|
|
});
|
|
userID = stripeUser.id;
|
|
|
|
//Add to the database (I have to wait for the insertion)
|
|
await dbo.insertOne({stripeID: userID, discordID: id, paid: false, startDateUTC: null, tier: 0}).then(() => { client.close(); resolve(userID); });
|
|
}
|
|
});
|
|
});
|
|
|
|
}).then(async (userID) => {
|
|
|
|
//Deal with the session
|
|
const billingPortalSession = await stripe.billingPortal.sessions.create({
|
|
customer: userID,
|
|
return_url: "https://linktr.ee/selmerbot",
|
|
});
|
|
|
|
|
|
const session = await stripe.checkout.sessions.create(
|
|
{
|
|
payment_method_types: ["card"],
|
|
line_items: [
|
|
{
|
|
price: priceID,
|
|
quantity: 1,
|
|
},
|
|
],
|
|
customer: userID,
|
|
mode: "subscription",
|
|
success_url: billingPortalSession.url,
|
|
cancel_url: "https://linktr.ee/selmerbot"
|
|
});
|
|
|
|
interaction.editReply(session.url);
|
|
}).catch((err) => {
|
|
if (String(typeof(err)) == 'string') {
|
|
interaction.editReply(err);
|
|
} else {
|
|
console.log(err);
|
|
interaction.editReply("A Stripe error occured! Please contact support ASAP!")
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
async function changeSubscriptionManual(bot, message) {
|
|
const stripe = bot.stripe;
|
|
const mongouri = bot.mongouri;
|
|
const id = message.author.id;
|
|
|
|
//Just in case
|
|
if (!id) { return console.log('....What? How?'); }
|
|
|
|
const client = new MongoClient(mongouri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
|
|
new Promise(async function(resolve, reject) {
|
|
client.connect(async (err) => {
|
|
if (err) { return console.log(err); }
|
|
|
|
const dbo = client.db('main').collection('authorized');
|
|
await dbo.findOne({'discordID': id}).then(async (doc) => {
|
|
var userID;
|
|
|
|
if (doc != undefined) {
|
|
userID = doc.stripeID;
|
|
client.close();
|
|
resolve(userID);
|
|
} else {
|
|
client.close();
|
|
|
|
reject(`No user with the ID of <@${message.author.id}>`);
|
|
}
|
|
});
|
|
});
|
|
|
|
}).then(async (userID) => {
|
|
await stripe.billingPortal.sessions.create({
|
|
customer: userID,
|
|
return_url: "https://linktr.ee/selmerbot",
|
|
}).then((session) => {
|
|
message.reply(session.url);
|
|
})
|
|
}).catch((err) => {
|
|
|
|
if (String(typeof(err)) == 'string') {
|
|
message.reply(err);
|
|
} else {
|
|
console.log(err);
|
|
message.reply("A Stripe error occured! Please contact support ASAP!");
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
function createDropDown(bot, message) {
|
|
const stripe = bot.stripe;
|
|
|
|
const pl = [];
|
|
const vl = [];
|
|
stripe.products.list({
|
|
limit: 3,
|
|
}).then((prod) => {
|
|
prod.data.forEach((obj) => {
|
|
const pricePromise = stripe.prices.retrieve(obj.default_price);
|
|
var newObj = {label: obj.name, description: null, value: `${obj.default_price}`}
|
|
pl.push(pricePromise);
|
|
vl.push(newObj);
|
|
});
|
|
|
|
let n = Promise.all(pl);
|
|
let i = 0;
|
|
n.then((t) => {
|
|
t.forEach(data => {
|
|
let price = data.unit_amount/100;
|
|
vl[i].description = `The $${price} tier`;
|
|
i++;
|
|
});
|
|
|
|
|
|
const row = new MessageActionRow()
|
|
.addComponents(
|
|
new MessageSelectMenu()
|
|
.setCustomId(`${message.author.id}|premium`)
|
|
.setPlaceholder('Nothing selected')
|
|
.addOptions(vl)
|
|
);
|
|
|
|
message.channel.send({ content: `Please choose a tier`, components: [row] });
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
function handleInp(bot, message) {
|
|
if (message.content == '!premium' || message.content == '!premium help') {
|
|
message.reply('Use _!premium buy_ to get premium or use _!premium manage_ to change or cancel your subscription\n\n_Disclaimer: Selmer Bot uses Stripe to manage payments. Read more at *https://stripe.com/ *_');
|
|
} else if (message.content == '!premium buy') {
|
|
createDropDown(bot, message);
|
|
} else if (message.content == '!premium manage') {
|
|
changeSubscriptionManual(bot, message);
|
|
}
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
name: 'premium',
|
|
description: 'everything payment',
|
|
execute(message, args, Discord, Client, bot) {
|
|
message.reply("Please DM Selmer bot to use this command!");
|
|
}, handleInp, createSubscriptionManual
|
|
} |