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.

522 lines
18 KiB

const GuildM = require('../models/guilds');
const STRIKES = require('../models/strikes');
const roleRulesM = require('../models/autoRoleRule');
const feedsM = require('../models/feeds');
const xmlparser = require('xml-js');
const {DiscordAPI, getRules, confirmArgsForYTFeed, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, Random} = require('../lib')
exports.home = async (req,res)=>
{
res.render('home.ejs');
}
exports.redirect = async (req, res)=>
{
res.render('redirect.ejs');
}
exports.dashboard = (bot)=>
{
return async (req, res)=>
{
const userPlaceholder =
{
id:'',
username:'placeholder',
avatar:'',
}
if(!req.headers.cookie) return res.render('dashboard.ejs', {user:userPlaceholder, guilds:[{}]});
const connector = new DiscordAPI(req.headers.cookie, bot);
const user = await connector.getUser();
const guilds = await connector.getGuildsFull();
res.render('dashboard.ejs',{user, guilds});
}
}
exports.getModerator = (bot)=>
{
return async (req,res)=>
{
const modId = {moderatorid} = req.params;
const user = await bot.users.cache.get('1203446477024927764');
res.render('user.ejs', {user})
}
}
exports.guilds = (bot)=>
{
return async (req, res) =>
{
try {
const connector = new DiscordAPI(req.headers.cookie, bot);
const userGuilds = await connector.getUserGuilds();
const guilds = await connector.getGuildsFull(userGuilds);
res.render('guilds.ejs', { guilds });
} catch (err) {
console.error(err);
res.status(500).send('Internal Server Error');
}
}
}
exports.gDash = (bot)=>
{
return async (req, res)=>
{
const userid = await new DiscordAPI(req.headers.cookie, bot).getUserId();
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.id);
res.render('guildPopup.ejs', {guild, userid})
}
}
exports.guildUpdate = (bot)=>
{
return async (req, res)=>
{
/**
* ! /gdash/:id/:setting?'
*/
const original = await GuildM.find({gID:req.params.id}).then(guild=>{return guild[0]});
var aux = {}
aux[req.params.setting] = !original[req.params.setting]
const updated = await GuildM.findOneAndUpdate({gID:req.params.id}, aux)
const userid = await new DiscordAPI(req.headers.cookie, bot).getUserId();
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.id);
res.render('guildPopup.ejs', {guild,userid})
}
}
exports.rDash = (bot)=>
{
//! /rolerulesdash/:id -> Discord Guild Id (GuildId)
return async (req, res)=>
{
const roles = await getRules(req.params.id);
res.render('roleRules.ejs', {roles, id:req.params.id});
}
}
exports.roleChange = (bot)=>
{
//! '/roleChange/:id/:guildid'
return async (req, res)=>
{
const role = await getRules(req.params.id);
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
res.render('rolePopup.ejs', {role, id:req.params.id, guild});
}
}
exports.saveRoleChange = (bot)=>
{
//! '/rolechange
return async (req, res)=>
{
const body = req.body;
if(!body.roleid || !body.emojiid || !body.messageid || !body.guildid) return res.status(400).send('Bad Request');
const extra = await getRoleName(req.body, bot)
if(extra.error) return res.status(400).send(`Bad Request - ${extra.error}`)
var rule =
{
gID:body.guildid,
mID:body.messageid,
roleID:body.roleid,
roleEmoji:body.emojiid,
roleName:extra.roleName,
}
const updatedRule = await roleRulesM.findOneAndUpdate({_id:req.params.id}, rule);
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
res.render('rolePopup.ejs', {role:updatedRule, id:body.id, guild});
}
}
exports.deleteRole = async (req, res)=>
{
const deleted = await roleRulesM.findOneAndDelete({_id:req.params.id});
const roles = await getRules(req.params.guildid);
res.render('roleRules.ejs', {roles, id:req.params.guildid});
}
exports.newRoleRule = (bot)=>
{
//! '/newrolerule/:guildid'
return async (req, res)=>
{
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildData(req.params.guildid);
const role = 'N/A';
res.render('rolePopup.ejs', {guild, role,id:req.params.guildid})
}
}
exports.newRule = (bot)=>
{
return async (req, res)=>
{
const body = req.body;
if(!body.roleid || !body.emojiid || !body.messageid || !body.guildid) return res.status(400).send('Bad Request');
const extra = await getRoleName(req.body, bot)
if(extra.error) return res.status(400).send(`Bad Request - ${extra.error}`)
var rule =
{
gID:body.guildid,
mID:body.messageid,
roleID:body.roleid,
roleEmoji:body.emojiid,
roleName:extra.roleName,
}
const newRule = await roleRulesM.create(rule); //Might need it later, not sure what for tho.
const roles = await getRules(body.guildid);
/**
* exports.rDash = (bot)=>
{
//! /rolerulesdash/:id -> Discord Guild Id (GuildId)
return async (req, res)=>
{
const roles = await getRules(req.params.id);
res.render('roleRules.ejs', {roles, id:req.params.id});
}
}
*/
res.render('roleRules.ejs', {roles, id:body.guildid});
}
}
async function getRoleName(args, bot)
{
var mID = args.messageid;
var roleID = args.roleid;
var roleEmoji = args.emojiid;
var gID = args.guildid;
var roleName;
const guild = bot.guilds.cache.get(gID);
var m = await (async ()=>
{
for(const [id, channel] of bot.channels.cache)
{
if(channel.type == 0)
{
try {
const exists = await bot.channels.cache.get(id).messages.fetch(mID);
if(exists) return m = true;
} catch (error) {}
}
}
})();
const r = guild.roles.cache.get(roleID);
const e = guild.emojis.cache.get(roleEmoji);
if(!m || !r || !e) return m?(r?(e?false:{error:'Emoji ID'}):{error:'Role ID'}):{error:'Message ID'}
roleName = r.name;
return {roleName}
}
exports.fDash = (bot)=>
{
//! /feedsdash/:guildid'
return async (req, res)=>
{
const preFeeds = await feedsM.find({gID:req.params.guildid}).then(feeds=>{return feeds});
var feeds = [];
await Promise.all(preFeeds.map(async (feed) => {
feed['channelName'] = await getChannelName(feed.YTChannelId);
feeds.push(feed);
}));
feeds.sort((a, b) => {
return a.channelName.localeCompare(b.channelName);
});
res.render('feeds.ejs', {feeds, id:req.params.guildid});
}
}
async function getChannelName(channelID)
{
return await fetch('https://www.youtube.com/feeds/videos.xml?channel_id='+channelID,
{
method: "GET",
mode: "cors",
})
.then(response=>
{
if(response.ok) return response.text();
})
.then(data=>
{
data = xmlparser.xml2json(data,
{
compact: true,
space: 4
});
data = JSON.parse(data);
return data.feed.author.name._text
})
.catch(error=>
{
return error;
});
}
exports.feedChange = (bot)=>
{
//! /feedChange/:id/:guildid?
return async (req, res)=>
{
var feed = await feedsM.find({_id:req.params.id}).then(feed=>{return feed[0]});
feed.channelName = await getChannelName(feed.YTChannelId);
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
res.render('feedPopup.ejs', {feed, id:req.params.id, guild});
}
}
exports.addFeed = (bot)=>
{
//! /feedChange/:guildid?
return async (req, res)=>
{
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
res.render('feedPopup.ejs', {feed:null, id:req.params.id, guild});
}
}
exports.saveNewFeed = (bot)=>
{
//! /feedChange/:guildid?
return async (req, res)=>
{
const {DCchannelID, ytchannel, costummessage} = req.body
const {guildid} = req.params;
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
var feed = {
ChannelId: '',
YTChannelId: '',
CostumMessage:'',
gID:guildid
};
if(!costummessage && !ytchannel && !DCchannelID) return res.status(400).send('Bad Request');
const validated = await confirmArgsForYTFeed([guildid, DCchannelID, ytchannel],bot);
if(validated.error) return res.status(400).send('Bad Request');
feed.ChannelId=validated.channelId;
feed.YTChannelId = validated.YTChannelId;
feed.CostumMessage = costummessage;
const newFeed = await feedsM.create(feed).then(f=>{return f}).catch(err=>{console.log(err)});
newFeed.channelName = validated.channelName;
res.render('feedPopup.ejs', {feed:newFeed, id:req.params.id, guild});
}
}
exports.deleteFeed = (bot)=>
{
//! /feedChange/:id/:guildid?
return async (req, res)=>
{
const deleted = await feedsM.findByIdAndDelete(req.params.id).then(deleted => {return deleted}).catch(err=>console.log(err));
const preFeeds = await feedsM.find({gID:req.params.guildid}).then(feeds=>{return feeds});
var feeds = [];
await Promise.all(preFeeds.map(async (feed) => {
feed['channelName'] = await getChannelName(feed.YTChannelId);
feeds.push(feed);
}));
feeds.sort((a, b) => {
return a.channelName.localeCompare(b.channelName);
});
res.render('feeds.ejs', {feeds, id:req.params.guildid});
}
}
exports.updateFeed = (bot)=>
{
//! /feedChange/:id/:guildid?
return async (req, res)=>
{
const {DCchannelID, ytchannel, costummessage} = req.body
const {guildid} = req.params;
const guild = await new DiscordAPI(req.headers.cookie, bot).getSpecificGuildDataForDash(req.params.guildid);
var feed = {
ChannelId: '',
YTChannelId: '',
CostumMessage:'',
gID:guildid
};
if(!costummessage && !ytchannel && !DCchannelID) return res.status(400).send('Bad Request');
const validated = await confirmArgsForYTFeed([guildid, DCchannelID, ytchannel],bot);
if(validated.error) return res.status(400).send('Bad Request');
feed.ChannelId=validated.channelId;
feed.YTChannelId = validated.YTChannelId;
feed.CostumMessage = costummessage;
const newFeed = await feedsM.findOneAndUpdate({_id:req.params.id}, feed).then(f =>{return f}).catch(err=>{console.log(err)});
res.render('feedPopup.ejs', {feed:newFeed, id:req.params.id, guild});
}
}
exports.strikeDashboard = (bot)=>
{
return async (req, res)=>
{
// const user = bot.users.cache.get(req.params.userid)
const guild = bot.guilds.cache.get(req.params.id);
const strikeList = await STRIKES.find({guildID:req.params.id})
const moderator = req.params.userid;
var strikes = [];
await Promise.all(strikeList.map(async (strike) => {
var aux = {...strike._doc }
if(strike.validated)
{
if(strike.validatedBy)
{
const user = bot.users.cache.get(strike.validatedBy);
const moderator = {
username:user.username,
avatar:user.avatar,
id:user.id
};
aux = {...aux, moderator};
}
}
strikes.push(aux);
}));
// console.log(strikes)
res.render('strikesDashboard.ejs', {strikes, guild, moderator, params:req.params})
}
}
exports.updateStrikes = (bot)=>
{
return async (req,res)=>
{
const moderator = req.params.userid;
const strike = await STRIKES.findByIdAndUpdate(req.params.strikeid, {validated:true, validatedBy:moderator});
const guild = bot.guilds.cache.get(req.params.id);
const strikeList = await STRIKES.find({guildID:req.params.id})
var strikes = [];
await Promise.all(strikeList.map(async (strike) => {
var aux = {...strike._doc }
if(strike.validated)
{
if(strike.validatedBy)
{
const user = bot.users.cache.get(strike.validatedBy);
const moderator = {
username:user.username,
avatar:user.avatar,
id:user.id
};
aux = {...aux, moderator};
}
}
strikes.push(aux);
}));
res.render('strikelist.ejs', {strikes, guild, moderator, params:req.params})
}
}
exports.deleteStrikes = (bot)=>
{
return async (req,res)=>
{
await STRIKES.findByIdAndDelete(req.params.strikeid);
const guild = bot.guilds.cache.get(req.params.id);
const strikeList = await STRIKES.find({guildID:req.params.id})
const moderator = req.params.userid;
var strikes = [];
await Promise.all(strikeList.map(async (strike) => {
var aux = {...strike._doc }
if(strike.validated)
{
if(strike.validatedBy)
{
const user = bot.users.cache.get(strike.validatedBy);
const moderator = {
username:user.username,
avatar:user.avatar,
id:user.id
};
aux = {...aux, moderator};
}
}
strikes.push(aux);
}));
res.render('strikelist.ejs', {strikes, guild, moderator, params:req.params})
}
}
exports.pp = (req, res) =>
{
res.render('pp.ejs')
}
exports.tos = (req, res) =>
{
res.render('tos.ejs')
}
exports.torrent = (bot)=>
{
return async (req, res) =>
{
const user = await bot.users.cache.get('186540961650835456');
const embed = new EmbedBuilder()
embed.setFooter({text:'Rem-chan on ', iconURL:"https://i.imgur.com/g6FSNhL.png"})
embed.setAuthor({name:"Rem-chan", iconURL:"https://i.imgur.com/g6FSNhL.png",url:'https://rem.wordfights.com/addtodiscord'});
embed.setColor(0x4287f5);
embed.setTimestamp();
embed.setTitle('Torrent Added:');
embed.addFields({name:req.params.name, value:" "},
{name:'Size', value:`${req.params.size/1024/1024}MB`},
{name:'From:', value:req.params.category});
let random = Random(5);
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId('Redirect'+random)
.setLabel('Aprove')
.setStyle(ButtonStyle.Success),
)
.addComponents(
new ButtonBuilder()
.setCustomId('Remove'+random)
.setLabel('Remove')
.setStyle(ButtonStyle.Danger),
)
const filter = i => i.customId === 'Redirect'+random || i.customId === 'Remove'+random;
let message = await user.send({embeds: [embed], components: [row] });
const collector = message.createMessageComponentCollector({ filter, time: 60000 });
collector.on('collect', async m =>
{
collector.stop();
m.deferUpdate();
if(m.customId === 'Remove'+random) return m.message.delete();
let cookie = await fetch('https://utorrent.wordfights.com/api/v2/auth/login',
{
"headers":
{
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body":`username=${process.env.qbittorrentusername}&password=${process.env.qbittorrentpassword}`,
"method": "POST"
}
)
.then(handleResponse)
async function handleResponse(response)
{
try {
let headers = [...response.headers.entries()];
headers = headers.filter(i=>i[0]=='set-cookie')[0][1]
return headers
} catch (error) {
console.log(error)
return
}
}
if(!cookie) return
await fetch("https://utorrent.wordfights.com/api/v2/torrents/setForceStart", {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"cookie": `${cookie}`,
},
"body": `value=true&hashes=${req.params.id}`,
"method": "POST"
});
});
collector.on('end', async ()=>
{
message.edit({ components: [] });
})
res.json({ok:'OK'})
}
}