Forked from funnbot/Discord Auto DM Advertisement Check.js
Created
January 24, 2018 21:14
-
-
Save timelf123/bb3e6d8eef0800594b210101c8fa3af5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if (process.version.startsWith("v6")) throw new Error("This Bot requires Node 7v+ because of async/await") | |
const Discord = require("discord.js") | |
const express = require("express") | |
const app = express() | |
const superagent = require("superagent") | |
//Config | |
let INVITE = process.env.INVITE || "", //An Infinite Invite to your discord server. | |
GUILD = process.env.GUILD || "", //The ID of the Guild for this invite ^ | |
OWNER = process.env.OWNER || "", //Your main account id so the bot can notify if it finds an advertiser | |
TOKEN = process.env.TOKEN || "", //The user token for your alt, | |
ONLYADVERT = process.env.ONLYADVERT || false, //If the bot should notify on every dm or only if it contains an invite link | |
APPID = process.env.APPID || "", //APp ID BRO, THis must be of a bot in the guild that you are monitoring | |
APPSECRET = process.env.APPSECRET || "", | |
APPSCOPE = process.env.APPSCOPE || "guilds.join", | |
APPREDIRECT = process.env.APPREDIRECT || "" | |
//End Config | |
const client = new Discord.Client({ | |
messageCacheMaxSize: 1, //Minimize RAM Load | |
disabledEvents: ["TYPING_START"] // ^^ | |
}) | |
let loop24H = () => { //The bot will leave then join the guild every 24 hours | |
leaveJoin() | |
let evade = Math.floor(Math.random() * 100000) - 50000 | |
let time = 86400000 + evade | |
setTimeout(() => loop24H(), time) | |
} | |
let wait10 = () => new Promise(resolve => setTimeout(resolve, 10000)) | |
//Begin The Beef | |
let cachedDMS = [] | |
let sinceLastLJ = 0 | |
//Ready Event | |
client.on("ready", () => { | |
console.log("Started") | |
if (client.user.bot) throw new Error("Auto DM Advert Checker only works on User Acounts.") | |
}) | |
let ranOnce = false | |
let appReady = () => { | |
if (ranOnce) return | |
console.log("App Is Ready") | |
loop24H() | |
} | |
//Message Event | |
client.on("message", async message => { | |
if (message.author.id === client.user.id) return | |
if (message.channel.type !== "dm") return | |
if (ONLYADVERT && !/discord\.gg\/\w+|bot\.discord\.io\/\w+|discordapp\.com\/invites\/\w+|discord\.me\/\w+/g.test(message.content)) return | |
let owner = client.users.get(OWNER) | |
let over = Date.now() - sinceLastLJ < 60000 ? "Less than a minute after I joined." : "Out of the blue." | |
if (!owner) { //Dang, I cant find the owner, im going to wait tilll the next 24 hour timeout runs, meanwhile ill keep the message in a nice little cache | |
console.log("I could not find the owner, caching till next leaveJoin.") | |
let msg = { | |
content: message.content, | |
author: { | |
id: message.author.id, | |
tag: message.author.tag | |
}, | |
over | |
} | |
return cachedDMS.push(msg) | |
} | |
let txt = `Direct message from: **${message.author.tag} (${message.author.id})**\n**Context:** ${over}\n\n**Content:** ${message.content}` | |
try { | |
await owner.send(txt) | |
} catch (err) { | |
console.log("I can't DM the OWNER.") | |
} | |
}) | |
//Leave then Join server | |
let leaveJoin = async() => { | |
sinceLastLJ = Date.now() | |
let guild = client.guilds.get(GUILD) | |
if (!guild) { | |
console.log("I'm not in the guild already, re-running.") | |
try { | |
await acceptInvite() | |
return //leaveJoin() | |
} catch (err) { | |
throw new Error("Invalid INVITE") | |
} | |
} | |
if (guild.ownerID !== OWNER) throw new Error("Please only run this bot if you are the owner of the server.") | |
try { | |
await guild.leave() | |
console.log("Leaving") | |
await wait10() | |
console.log("Waited 10 Seconds") | |
await acceptInvite() | |
console.log("Re-Joined") | |
} catch (err) { | |
return console.log(err) | |
} | |
let owner = client.users.get(OWNER) | |
if (!owner) throw new Error("I joined the guild but I cannot find the you.") | |
if (cachedDMS.length > 0) { | |
let txt = cachedDMS.map(m => `**${m.author.tag} (${m.author.id})**\n**Context:** ${m.over}\n\n**Content:** ${m.content}`) | |
try { | |
await owner.send("**Sending Cached DM's**") | |
await owner.send(txt) | |
} catch (err) { | |
console.log("I can't DM the OWNER.") | |
} | |
} | |
} | |
//Login | |
client.login(TOKEN) | |
//THe WebServer because Discord Is Mean | |
const APP = { | |
ID: APPID, //This is the ID of your Application | |
SECRET: APPSECRET, //This is the Secret of your application | |
SCOPE: APPSCOPE, | |
REDIRECT: APPREDIRECT | |
} | |
let access_token = null | |
let refresh_token = null | |
let acceptInvite = () => { | |
console.log("trying") | |
return new Promise((resolve, reject) => { | |
if (!access_token) return console.log("Accept Auth URI First to join the guild.") | |
let JOIN_URI = `https://discordapp.com/api/invites/${INVITE}` | |
superagent.post(JOIN_URI).set({ | |
Authorization: `Bearer ${access_token}` | |
}).then((response) => { | |
resolve() | |
}).catch(console.log) | |
}) | |
} | |
const AUTH_QUERY = [ | |
`client_id=${APP.ID}`, | |
`scope=${APP.SCOPE}`, | |
`redirect_uri=${APP.REDIRECT}`, | |
'response_type=code', | |
].join('&'); | |
const AUTH_URL = `https://discordapp.com/oauth2/authorize?${AUTH_QUERY}`; | |
console.log(AUTH_URL) | |
app.use("/callback", (req, res) => { | |
if (req.query.error) return console.log(req.query.error) | |
if (!req.query.code) console.log("Req.Code Errored Bad!") | |
let code = req.query.code | |
res.send("Success!") | |
const TOKEN_PARAMS = [ | |
'grant_type=authorization_code', | |
`code=${code}`, | |
`client_id=${APP.ID}`, | |
`client_secret=${APP.SECRET}`, | |
`redirect_uri=${APP.REDIRECT}`, | |
].join('&'); | |
const TOKEN_URI = `https://discordapp.com/api/oauth2/token?${TOKEN_PARAMS}` | |
superagent.post(TOKEN_URI).then(response => { | |
if (!response.body.access_token) throw new Error("Didnt get a token from TOKEN_URI") | |
access_token = response.body.access_token | |
refresh_token = response.body.refresh_token | |
console.log("Refresh: " + refresh_token) | |
appReady() | |
}) | |
}) | |
app.listen(2001, () => console.log("Listening On 2001")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment