Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save timelf123/bb3e6d8eef0800594b210101c8fa3af5 to your computer and use it in GitHub Desktop.
Save timelf123/bb3e6d8eef0800594b210101c8fa3af5 to your computer and use it in GitHub Desktop.
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