first commit probably lots of errors

This commit is contained in:
404invalid-user 2021-08-25 01:01:46 +01:00
commit ec94c2080b
99 changed files with 10227 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
node_modules

3
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"git.ignoreLimitWarning": true
}

13
LICENSE Normal file
View file

@ -0,0 +1,13 @@
Copyright 2020 404invalid-user (invalidlag.con)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

40
README.md Normal file
View file

@ -0,0 +1,40 @@
### file structure
this is the guide on what is where
```
| - src - | - applications - \ - bot.js
| | / - webserver.js
| |
| | - bot - | - addons
| | | - commands
| | | - events
| | | - handlers
| |
| | - conf - \ conf.json
| | / tokens.js
| |
| | - express
| |
| | - funcs
| |
| | - models
```
# knightrider
the all-purpose open source discord bot for CWH11's Hangout Crew.
### set up
- go to discord.com/developers and make a bot token
- bot token goes in src/conf/tokens.js under { bot: {token: "here"} }
- make a mongo db with the schemas "servers" "users"
- put the mongo db connect uri in src/conf/tokens.js under { db: {URI: "here"} }
- edit neccery information and details in src/conf/conf.json
- npm install
- npm start
yeah it will be more detailed with the next update.

5
TODO Normal file
View file

@ -0,0 +1,5 @@
better nav bar
better main page
batter server page
better error checking for fivem cmd
fix discord tag not showing up in fivem commands

5458
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

36
package.json Normal file
View file

@ -0,0 +1,36 @@
{
"name": "knightrider",
"version": "4.8.420",
"description": "a bot for a private discord server",
"updatenote": "major update: now using a database, fixed exploit that allowed users to add the bot to their server give themself the Staff role and edit staff only options in CWH11's Hangout Crew, multiple server support, a better dashboard and now opensource.",
"main": "./src/knightrider.js",
"scripts": {
"start": "node ./src/knightrider.js",
"help": "if you need help with this bot please look at http://knightrider.invalidlag.com/help/"
},
"author": "404invalid-user",
"repository": {
"type": "git",
"url": "https://github.com/404invalid-user/knightrider.git"
},
"license": "Apache license 2.0",
"dependencies": {
"@discordjs/opus": "*",
"body-parser": "*",
"discord-bitfield-calculator": "^1.0.0",
"discord.js": "^12.5.3",
"ejs": "*",
"express": "*",
"express-rate-limit": "*",
"ffmpeg-static": "*",
"minecraft-server-util": "*",
"mongoose": "*",
"node-fetch": "*",
"randomstring": "*",
"request": "*",
"url": "^*",
"util": "*",
"yt-search": "*",
"ytdl-core": "*"
}
}

22
src/applications/bot.js Normal file
View file

@ -0,0 +1,22 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const chalk = require('chalk')
const { readdirSync } = require('fs')
const Discord = require('discord.js')
module.exports = (client, webServer) => {
client.commands = new Discord.Collection();
client.addons = [];
const handlers = readdirSync(__dirname + '/../bot/handlers/').filter((file) => file.endsWith(".js"));
for (let handler of handlers) {
require(`../bot/handlers/${handler}`)(client);
}
try {
client.login(require('../conf/tokens').bot.token);
} catch (error) {
console.log(chalk.blue('[bot]: ') + chalk.red('(error): ') + "cant login error: " + error);
}
}

View file

@ -0,0 +1,48 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const chalk = require('chalk')
const bodyParser = require('body-parser');
const rateLimit = require("express-rate-limit");
const express = require('express')
const fs = require('fs')
const conf = require('../conf/conf.json')
module.exports = (client, webServer) => {
webServer.use(bodyParser.json());
webServer.use(bodyParser.urlencoded({ extended: true }));
webServer.use(express.static(__dirname + '/../express/www/static'));
webServer.set('view engine', 'ejs');
webServer.set('views', __dirname + '/../express/www/views');
webServer.use((req, res, next) => {
const { headers: { cookie } } = req;
if (cookie) {
const values = cookie.split(';').reduce((res, item) => {
const data = item.trim().split('=');
return {...res, [data[0]]: data[1] };
}, {});
res.locals.cookie = values;
} else res.locals.cookie = {};
next();
});
//rate limit the api so we dont have spam
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 400
});
webServer.use("/api/", apiLimiter);
['get', 'post'].forEach(handler => {
require(`../express/handlers/${handler}`)(client, webServer)
})
try {
webServer.listen(conf.port, () => {
console.log(chalk.cyan('[webServer]: ') + 'running at ' + conf.domain + ' (port:' + conf.port + ')')
});
} catch (error) {
console.log(chalk.cyan('[webServer]: ') + chalk.cyan('(error): ') + 'could not start the web server error: ' + error)
}
}

17
src/bot/addons/caps.js Normal file
View file

@ -0,0 +1,17 @@
const Server = require('../../models/server');
const conf = require('../../conf/conf.json')
module.exports = async(message, server, user, client) => {
if (server.addons.caps == true) {
if (!message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
const textRegex = new RegExp(/[^a-zA-Z0-9]/, 'g');
const capsRegex = new RegExp(/[A-Z]/, 'g');
const capsText = message.content.replace(textRegex, '');
const capsPerc = 1 - (capsText.replace(capsRegex, '').length / capsText.length);
if (capsText.length > 6 && capsPerc > 0.7) {
message.channel.send("too many caps")
}
}
}
}

View file

@ -0,0 +1,42 @@
const conf = require('../../conf/conf.json')
module.exports = (message, server, user, client) => {
//filter banned words at different levels
try {
if (server.addons.filter == true) {
if (!message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (server.filter.level == 'safe') {
server.filter.safe.forEach(async(word) => {
let msgContent = message.content.toLowerCase();
if (msgContent.includes(word)) {
await message.delete().catch(error => {});
addstrike(user);
if (parseInt(server.channels.modLogs) !== 'NaW') {
client.guilds.cache.get(server.id).channels.cache.get(server.channels.modLogs).send({ embed: { color: conf.colour.ok, title: 'filter has been triggered', url: conf.domain + '/server/' + user.guildID + '/user/' + user.id, author: { name: conf.bot.name, icon_url: conf.bot.logo, url: conf.bot.url, }, thumbnail: { url: message.author.displayAvatarURL() }, fields: [{ name: '__**Member**__', value: message.author.tag + '<@!' + message.author.id + '> (' + message.author.id + ')', inline: true, }, { name: '__**Channel**__', value: '<#' + message.channel.id + '>', inline: true }, { name: '__**Filter level**__', value: '`safe`' }, { name: '__**Mesage Content**__', value: '`"' + message.content + '"`', }, { name: '__**Filtered Word**__', value: '`"' + word + '"`' }], timestamp: new Date(), footer: { text: 'moderation log', } } });
};
message.reply(`please dont swear.\nwas this a miss trigger? fill in ${conf.domain}/server/${server.id}/er`).then(m => m.delete({ timeout: 30000 }));
return;
};
});
//filter normal mode
} else if (server.filter.level == 'normal') {
server.filter.normal.forEach(async(word) => {
let msgContent = message.content.toLowerCase();
if (msgContent.includes(word)) {
await message.delete().catch(error => {});
functions.addstrike(message);
if (parseInt(server.channels.modLogs) !== 'NaW') {
client.guilds.cache.get(conf.server.id).channels.cache.get(conf.server.channels.modLogs).send({ embed: { color: conf.colour.ok, title: 'filter has been triggered', url: conf.domain + '/server/' + user.guildID + '/user/' + user.id, author: { name: conf.bot.name, icon_url: conf.bot.logo, url: conf.bot.url, }, thumbnail: { url: message.author.displayAvatarURL() }, fields: [{ name: '__**Member**__', value: message.author.tag + '<@!' + message.author.id + '> (' + message.author.id + ')', inline: true, }, { name: '__**Channel**__', value: '<#' + message.channel.id + '>', inline: true }, { name: '__**Filter level**__', value: '`normal`' }, { name: '__**Mesage Content**__', value: '`"' + message.content + '"`', }, { name: '__**Filtered Word**__', value: '`"' + word + '"`' }], timestamp: new Date(), footer: { text: 'moderation log', } } });
};
message.reply(`please dont swear.\nwas this a miss trigger? fill in ${conf.domain}/server/${server.id}/er`).then(m => m.delete({ timeout: 30000 }));
return;
};
});
};
};
};
} catch (error) {
console.log(error)
}
}

View file

@ -0,0 +1,119 @@
const http = require('http');
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'fivem-disables',
description: "`.fivem` gets information for the fivem server. do `.fivem players` to see who is online",
async execute(message, args, Discord, currentServer, messageUser, client) {
const url = "http://lxn4gvp-aries1.linuxnodes.net:3000"
if (!args[1]) {
let serverEmbed = new Discord.MessageEmbed()
.setAuthor("fiveM info")
.setColor(conf.colour.ok)
.setDescription("some info about the server")
try {
await http.get(`${currentServer.configs.fivem.url}/dynamic.json`, (result) => {
let body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
let dynamicResponse = JSON.parse(body)
serverEmbed.addField(`__**players:**__`, `${dynamicResponse.clients}/${dynamicResponse.sv_maxclients}`, true)
}).on('error', function(error) {
console.log('error: ' + error)
})
})
await http.get(`${currentServer.configs.fivem.url}/info.json`, (result) => {
let body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
let infoResponse = JSON.parse(body)
serverEmbed.addField(`__**server:**__`, `${infoResponse.server}`, true)
let oneEyncEnabled;
let enhancedHostSupport;
let scriptHookAllowed;
if (infoResponse.vars.onesync_enabled == 'true') {
oneEyncEnabled = ":white_check_mark:"
} else {
oneEyncEnabled = ":x:"
}
if (infoResponse.vars.sv_enhancedHostSupport == 'true') {
enhancedHostSupport = ":white_check_mark:"
} else {
enhancedHostSupport = ":x:"
}
if (infoResponse.vars.sv_scriptHookAllowed == 'true') {
scriptHookAllowed = ":white_check_mark:"
} else {
scriptHookAllowed = ":x:"
}
serverEmbed.addField(`__**server Info:**__`, ` __onesync:__ ${infoResponse.vars.onesync} \n __onesync Enabled:__ ${oneEyncEnabled} \n __Enhanced Host Support:__ ${enhancedHostSupport} \n __Script Hook Allowed:__ ${scriptHookAllowed}`)
serverEmbed.addField(`__**resources:**__`, `${infoResponse.resources}`)
message.channel.send(serverEmbed)
})
})
} catch (error) {
message.reply("__**there has been an error**__\nserver is down maybe.")
console.log('error: ' + error)
}
} else if (args[1] == 'ip') {
let fivemIpEmbed = new Discord.MessageEmbed()
.setAuthor("fiveM ip")
.setColor(conf.colour.ok)
.setDescription("the fiveM server ip is: `" + currentServer.conf.fivem.ip + "`")
message.channel.send(fivemIpEmbed)
} else if (args[1] == 'players') {
let playersEmbed = new Discord.MessageEmbed()
.setAuthor("fiveM players")
.setColor(conf.colour.ok)
try {
http.get(`${currentServer.configs.fivem.url}/players.json`, (result) => {
let body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
var response = JSON.parse(body)
if (response.length == 0 || response.length < 0) {
playersEmbed.addField("__info__", `no one is on the server`)
}
let i;
for (i = 0; i < response.length; i++) {
playersEmbed.addField(`player ${i}:`, `__**name:**__ ${response[i].name} \n __**discord:**__ <@!${response[i].identifiers[3].replace('discord:', '')}> \n __**fiveM id:**__ ${response[i].id} \n __**ping:**__ ${response[i].ping} \n`)
}
if (i == response.length) {
try {
message.channel.send(playersEmbed)
} catch (error) {
message.channel.send("i couldnt sent that maybe there are too many players online and i cant add them all to the embed.")
console.log('error: ' + error)
}
}
}).on('error', function(error) {
console.log('error: ' + error)
})
})
} catch (error) {
message.reply("__**there has been an error**__\nserver is down maybe.")
console.log('error: ' + error)
}
}
}
}

View file

@ -0,0 +1,35 @@
const Discord = require('discord.js');
const util = require('minecraft-server-util');
module.exports = {
name: 'mcstatus',
description: "mcstat",
execute(message, args, Discord, currentServer, messageUser, client) {
util.status('cwh11.mc.sparks.codes' || currentServer.conf.mc)
.then((response) => {
let minecraftEmbed = new Discord.MessageEmbed()
.setColor(conf.colour.ok)
.setAuthor(conf.bot.name, conf.bot.logo)
.setTitle('Minecraft server status')
.setURL('http://cwh11.mc.sparks.codes')
.setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`)
.setDescription('its online!')
.addField('Server IP:', `${response.host}`)
.addField('Version:', `${response.version}`)
.addField('MOTD:', `${response.description.descriptionText}`)
.addFields({ name: 'Online Players', value: `${response.onlinePlayers}`, inline: true }, { name: 'Max Players', value: `${response.maxPlayers}`, inline: true }, )
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
message.channel.send(minecraftEmbed).catch(error => console.log('error: ' + error));
})
.catch((error) => {
console.log('error: ' + error);
message.channel.send('**there has been a error**\n this is probably because the server is down');
});
}
}

View file

@ -0,0 +1,55 @@
const https = require('https');
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'memes',
description: " shrekbot meme command http://shrekbot.tk/github",
execute(message, args, Discord, currentServer, messageUser, client) {
try {
const url = `https://www.reddit.com/${currentServer.configs.memes || 'r/memes'}/.json?limit=200`
https.get(url, (result) => {
var body = ''
result.on('data', (chunk) => {
body += chunk
})
result.on('end', () => {
var response = JSON.parse(body)
var index = response.data.children[Math.floor(Math.random() * 129) + 1].data
if (index.post_hint !== 'image') {
message.channel.send('there has been a shrekup retrying...')
}
if (!index.preview) return message.channel.send('a big shrekup has hapened do that command agian');
var image = index.preview.images[0].source.url.replace('&amp;', '&')
var title = index.title
var link = 'https://reddit.com' + index.permalink
var subRedditName = index.subreddit_name_prefixed
if (index.post_hint !== 'image') {
console.log("error no image")
}
console.log(image);
const imageembed = new Discord.MessageEmbed()
.setTitle('a meme provided by reddit')
.setImage(image)
.setColor(`${conf.colour.ok}`)
.setDescription(`[${title}](${link})`)
//.setURL(`https://reddit.com/${subRedditName}`)
.setFooter('powered by ' + `${subRedditName}`)
message.channel.send(imageembed).catch(error => console.log('error: ' + error))
}).on('error', function(error) {
console.log('Got an error: ' + error);
})
})
} catch (error) {
console.log('error: ' + error);
}
}
}

View file

@ -0,0 +1,203 @@
const ytdl = require('ytdl-core');
const ytSearch = require('yt-search');
const Discord = require('discord.js')
const conf = require('../../../conf/conf.json')
const queue = new Map();
module.exports = {
name: 'play',
description: "the moosk command",
aliases: ["p", "q", "skip", "stop", "remove", "queue"],
async execute(message, args, Discord, currentServer, messageUser, client) {
/*TODO
*make these embeds better and objects
*/
const noContentErrorEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setTitle('Error')
.setURL(conf.domain)
.setColor(conf.colour.okError)
.setDescription("well what do you want to listen to?\ni know i am an amazing bot but i cant read minds ~~yet~~")
.addField("possible fixes:", `You have two spaces between ${currentServer.prefix}play and the url/song name remove one of them`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
const notVoiceErrorEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setTitle('Error')
.setURL(conf.domain)
.setColor(conf.colour.okError)
.setTitle("you need to be in a voice channel to execute this command im not exactly going to send you the cd")
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
const noSongsErrorEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setTitle('Error')
.setURL(conf.domain)
.setColor(conf.colour.okError)
.setTitle("oof there are no songs left in queue")
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
const errorEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setTitle('Error')
.setURL(conf.domain)
.setColor(conf.colour.okError)
.setTitle("There was some error ~~like there always is~~")
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
const videoErrorEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setTitle('Error')
.setURL(conf.domain)
.setColor(conf.colour.okError)
.setTitle("I cant seem to find that video")
.setDescription("try adding more key words or just use the song's url")
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
const voiceChannel = message.member.voice.channel;
if (!voiceChannel) return message.channel.send(notVoiceErrorEmbed);
const permissions = voiceChannel.permissionsFor(message.client.user);
if (!permissions.has('connect')) return message.channel.send('i cant connect to this voice channel ask someone that can help me');
if (!permissions.has('speak')) return message.channel.send('i cant talk in this voice channel aks someone that can help me');
const serverQueue = queue.get(message.guild.id);
if (args[0] === 'play' || args[0] === 'p') {
if (!args[1]) return message.channel.send(noContentErrorEmbed).catch(e => console.log(e))
let song = {};
const videoFinder = async(query) => {
const videoResult = await ytSearch(query).catch(e => console.log(e));
try {
return (videoResult.videos.length > 1) ? videoResult.videos[0] : null;
} catch (err) {
console.log(err)
}
}
let songQuery = args.slice(1).join(' ').replace('http://', '').replace('https://', '').replace('www.', '').replace('youtube.com/', '').replace('/watch?v=', '').replace('&feature=share', '').replace('youtu.be', '')
const video = await videoFinder(songQuery);
if (video) {
song = { title: video.title, url: video.url }
} else {
message.channel.send(videoErrorEmbed).catch(e => console.log(e))
}
if (!serverQueue) {
const queueConstructor = {
voiceChannel: voiceChannel,
textChannel: message.channel,
connection: null,
songs: []
}
queue.set(message.guild.id, queueConstructor);
queueConstructor.songs.push(song);
try {
const connection = await voiceChannel.join();
queueConstructor.connection = connection;
videoPlayer(message.guild, queueConstructor.songs[0], message);
} catch (error) {
queue.delete(message.guild.id);
message.channel.send(errorEmbed).catch(e => console.log(e))
console.log('error: ' + error)
}
} else {
serverQueue.songs.push(song);
let addSongEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setColor(conf.colour.ok)
.setTitle(`**${song.title}** added to the queue`)
.setURL(`${song.url}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
return message.channel.send(addSongEmbed).catch(e => console.log(e))
}
} else if (args[0] === 'queue' || args[0] === 'q') serverQueueGet(message, serverQueue, args);
else if (args[0] === 'skip') skipSong(message, serverQueue);
else if (args[0] === 'stop') stopSong(message, serverQueue);
else if (args[0] === 'remove') removeSong(message, serverQueue, args);
}
}
const videoPlayer = async(guild, song, message) => {
const songQueue = queue.get(guild.id);
if (!song) {
songQueue.voiceChannel.leave();
queue.delete(guild.id);
return;
}
const stream = ytdl(song.url, { filter: 'audioonly' });
try {
songQueue.connection.play(stream, { seek: 0, volume: 0.5 })
.on('finish', () => {
songQueue.songs.shift();
videoPlayer(guild, songQueue.songs[0], message);
})
} catch (err) {
message.channel.send("i cant connect to the voice channel within the time frame i have high ping or some other error")
}
if (song.url) {
let embedUrl = song.url
if (!embedUrl.includes('http')) {
embedUrl = conf.domain
}
let addSongEmbed = new Discord.MessageEmbed()
.setAuthor('Music', `${conf.bot.logo}`)
.setColor(conf.colour.ok)
.setTitle(`Now playing **${song.title}**`)
.setURL(`${embedUrl}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
await songQueue.textChannel.send(addSongEmbed)
}
}
const serverQueueGet = async(message, serverQueue, args) => {
if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed);
let serverQueueEmbed = new Discord.MessageEmbed()
.setAuthor('Music Queue', `${conf.bot.logo}`)
.setColor(conf.colour.ok)
.setTitle(`the server queue`)
.setURL(`${conf.domain}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`)
await serverQueue.songs.forEach(theSong => {
serverQueueEmbed.addField(`${serverQueue.songs.indexOf(theSong)}`, `__title:__ ${theSong.title}\n__url:__ ${theSong.url}`)
})
await message.channel.send(serverQueueEmbed)
}
const skipSong = (message, serverQueue) => {
if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed);
if (!serverQueue) {
return message.channel.send(noSongsErrorEmbed);
}
serverQueue.connection.dispatcher.end();
}
const stopSong = (message, serverQueue) => {
if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed);
serverQueue.songs = [];
serverQueue.connection.dispatcher.end();
}
const removeSong = (message, serverQueue) => {
serverQueue.songs.forEach(theSong => {
if (args[1] == serverQueue.songs.indexOf(theSong)) {
try {
serverQueue.songs.indexOf(theSong) > -1 ? serverQueue.songs.splice(serverQueue.songs.indexOf(theSong), 1) : false
} catch (err) {
message.channel.send("there was an error removing that song")
}
} else {
message.channel.send("That song isn't in the queue you can use the url insted.\nYou can find the url by clicking on the blue text in the embed i sent when you requested to play that song.")
}
})
}

View file

@ -0,0 +1,38 @@
const { version } = require('../../../../package.json');
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'about',
description: "about bot",
async execute(message, args, Discord, currentServer, messageUser, client) {
message.channel.send(conf.domain + '/img/loading.gif').then(m => {
let totalSeconds = (client.uptime / 1000);
let days = Math.floor(totalSeconds / 86400);
totalSeconds %= 86400;
let hours = Math.floor(totalSeconds / 3600);
totalSeconds %= 3600;
let minutes = Math.floor(totalSeconds / 60);
let seconds = Math.floor(totalSeconds % 60);
let aboutEmbed = new Discord.MessageEmbed()
.setAuthor(conf.bot.name, `${conf.bot.logo}`, `${conf.domain}`)
.setDescription('everything you need to know.')
.setColor(conf.colour.ok)
.setTitle('about')
.setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`)
.addField('Website:', `${conf.domain}`)
.addField('Coolness level', `epic bot for ${message.guild.name} server`)
.addField('Developer(s)', '<@!522534458071449620>')
.addField('Version', `${version}`)
.addField('Libary', `discord.js v12`)
.addField("commands sent:", `${currentServer.commandCount} commands`)
.addField('Bot version:', `${version}`)
.addField('Up Time', `${days} d, ${hours} h, ${minutes} m, ${seconds} s`)
.addField("Memory usage:", `${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)} MB / 1GB`)
.addField('Ping', `ping: ${m.createdTimestamp - message.createdTimestamp} api ping: ${Math.round(client.ws.ping)}`)
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
m.edit(aboutEmbed).catch(error => console.log('error: ' + error));
}).catch(error => console.log('error: ' + error))
}
}

View file

@ -0,0 +1,49 @@
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'help',
description: "help command",
execute(message, args, Discord, currentServer, messageUser, client) {
if (args[1] == 'embed') {
let helpSomethingEmbed = new Discord.MessageEmbed()
.setAuthor(conf.bot.name, conf.bot.logo)
.setColor('#10FF00')
.setTitle('Help embed')
.setDescription('**For mods and admins only**\nLets mods and admin make a custom embed.')
.addField('Command structure', `${currentServer.prefix}embed [title] [description] [colour]`)
.addField('Command example', `${currentServer.prefix}embed [bruv is awesome] [just joking you are] [#FF0000]`)
.addField('Extra info', `To get the # colour code(s) [click here](https://htmlcolorcodes.com/)`)
.setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
message.channel.send(helpSomethingEmbed).catch(error => console.log('error: ' + error));
} else if (args[1] == 'embed-img') {
let helpSomethingEmbed = new Discord.MessageEmbed()
.setAuthor(conf.bot.name, conf.bot.logo)
.setColor('#10FF00')
.setTitle('Help embed-img')
.setDescription('**For mods and admins only**\nLets mods and admin make a custom embed.')
.addField('Command structure', `${currentServer.prefix}}embed [title] [description] [colour] [img-url]`)
.addField('Command example', `${currentServer.prefix}embed [bruv is awesome] [just joking you are] [#FF0000] [http://imgsite.com/knightrider.png]`)
.addField('Extra info', `To get the # colour code(s) [click here](https://htmlcolorcodes.com/)`)
.setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
message.channel.send(helpSomethingEmbed).catch(error => console.log('error: ' + error));
} else {
let helpEmbed = new Discord.MessageEmbed()
.setColor(conf.colour.ok)
.setTitle('Help!')
.setURL(`${conf.domain}`)
.setAuthor(conf.bot.name, conf.bot.logo)
.addField("util commands:", `${currentServer.prefix}ping - shows ping\n${currentServer.prefix}about - gives general information about the bot`)
.addField("general commands:", `${currentServer.prefix}mcstatus - shows minecraft server status\n${currentServer.prefix}memes - shows a random meme from redid mus be done in memes channel\n${currentServer.prefix}fivem - shows fiveM server status\n${currentServer.prefix}fivem players - shows online players on fiveM\n${currentServer.prefix}fivem ip - gives you the fiveM server ip\n${currentServer.prefix}play (song name) or (youtube-url) - plays selected music in a voice channel\n${currentServer.prefix}skip - skips the current song to the next one on the queue\n${currentServer.prefix}stop - bot stops playing music\n`)
.addField("moderator commands:", `${currentServer.prefix}say #channel message - bot sends message in channel of choice\n${currentServer.prefix}filter <safe/normal/off> - sets the word filter level\n${currentServer.prefix}userinfo <@user> - gives how many strikes a user has and other basic info on the user like nots and join dates.\n${currentServer.prefix}noteset <@user> - sets a note for a user\n${currentServer.prefix}note <@user> - see a moderator note for a user\n${currentServer.prefix}embed [title] [description] [colour] - sends a embed\n${currentServer.prefix}embed-img [title] [description] [colour] [img-url]\n${currentServer.prefix}OTR11 - for <@!276156203770314755> announcment`)
.setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`)
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`);
message.channel.send(helpEmbed).catch(error => console.log('error: ' + error))
}
}
}

View file

@ -0,0 +1,11 @@
module.exports = {
name: 'ping',
description: "about bot",
execute(message, args, Discord, currentServer, messageUser, client) {
message.channel.send("Pinging...").then(m => {
var ping = m.createdTimestamp - message.createdTimestamp;
var apiPing = Math.round(client.ws.ping)
m.edit(`ping: ${ping}\napi ping: ${apiPing}`).catch(error => console.log('error: ' + error))
});
}
}

View file

View file

@ -0,0 +1,45 @@
const fs = require('fs')
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'editfilter',
description: "edit the filter array",
execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (!args[1]) {
message.channel.send("please specify an operation <add/remove/dash>");
return;
};
if (!args[2]) {
message.channel.send("please specify something to add to the filter");
return;
};
if (message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ").includes('@everyone') || message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ").includes('@here')) {
message.channel.send("please dont try and exploit me, if you would like to add that to the filter for a genuing reason please use the admin dashboard");
return;
};
if (args[1] == 'add') {
currentServer.filter[currentServer.filter.level].push(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" "));
currentServer.save();
message.channel.send(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ") + " has been added to the `" + currentServer.filter.level + "` filter");
} else if (args[1] == 'remove') {
const index = currentServer.filter[currentServer.filter.level].indexOf(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" "));
if (index > -1) {
currentServer.filter[currentServer.filter.level].splice(index, 1);
message.channel.send("`" + message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ") + "` has been removed from the `" + currentServer.filter.level + "` filter");
} else {
message.channel.send("you cant remove that as it dosnt exist in the `" + currentServer.filter.level + "` filter");
};
} else if (args[1] == 'dash' || args[1] == 'dashboard') {
message.channel.send(conf.domain + "/dashboard");
};
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

@ -0,0 +1,32 @@
module.exports = {
name: 'embed-img',
description: "embed with image command for mods and admins",
execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (!args[1]) return message.reply(`you at leas need to supply a title if you stuck do ${currentServer.prefix}help embed`);
if (!message.content.includes('[')) return message.reply(`something is wrong with that if youre stuck do ${currentServer.prefix}help embed`);
let mcontent = message.content;
let titleStart = mcontent.indexOf('[');
let titleEnd = mcontent.indexOf(']');
let title = mcontent.substr(titleStart + 1, titleEnd - titleStart - 1);
let descStart = mcontent.indexOf('[', titleStart + 1);
let descEnd = mcontent.indexOf(']', titleEnd + 1);
let description = mcontent.substr(descStart + 1, descEnd - descStart - 1);
let colorstart = mcontent.indexOf('[', descStart + 1);
let colorend = mcontent.indexOf(']', descEnd + 1);
let color = mcontent.substr(colorstart + 1, colorend - colorstart - 1);
let imgstart = mcontent.indexOf('[', colorstart + 1);
let imgend = mcontent.indexOf(']', colorend + 1);
let img = mcontent.substr(imgstart + 1, imgend - imgstart - 1);
let custome_embed = new Discord.MessageEmbed().setAuthor(`${message.member.displayName}`, `${message.author.displayAvatarURL()}`).setTitle(title).setDescription(description).setColor(color).setImage(`${img}`);
message.channel.send(custome_embed);
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

@ -0,0 +1,30 @@
module.exports = {
name: 'embed',
description: "embed command for mods and admins",
execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (!args[1]) return message.reply(`you at leas need to supply a title if you stuck do ${currentServer.prefix}help embed`);
if (!message.content.includes('[')) return message.reply(`something is wrong with that if youre stuck do ${currentServer.prefix}help embed`);
let mcontent = message.content;
let titleStart = mcontent.indexOf('[');
let titleEnd = mcontent.indexOf(']');
let title = mcontent.substr(titleStart + 1, titleEnd - titleStart - 1);
let descStart = mcontent.indexOf('[', titleStart + 1);
let descEnd = mcontent.indexOf(']', titleEnd + 1);
let description = mcontent.substr(descStart + 1, descEnd - descStart - 1);
let colorstart = mcontent.indexOf('[', descStart + 1);
let colorend = mcontent.indexOf(']', descEnd + 1);
let color = mcontent.substr(colorstart + 1, colorend - colorstart - 1);
let custome_embed = new Discord.MessageEmbed().setAuthor(`${message.member.displayName}`, `${message.author.displayAvatarURL()}`).setTitle(title).setDescription(description).setColor(color);
message.channel.send(custome_embed);
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

@ -0,0 +1,26 @@
module.exports = {
name: 'filter',
description: "sets filter",
async execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (args[1] == 'off') {
currentServer.filter.level = 'off';
currentServer.save();
message.channel.send("filter has been set to " + currentServer.filter.level);
} else if (args[1] == 'normal') {
currentServer.filter.level = 'normal';
currentServer.save();
message.channel.send("filter has been set to " + currentServer.filter.level);
} else if (args[1] == 'safe') {
currentServer.filter.level = 'safe';
currentServer.save();
message.channel.send("filter has been set to " + currentServer.filter.level);
} else {
message.channel.send("that is not a valid filter setting you can chose from: 'normal' 'safe' and 'off'.");
};
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

@ -0,0 +1,28 @@
const conf = require('../../../conf/conf.json');
module.exports = {
name: 'rulesrolesljoughuihoutfd8es5tryj/i.uliutygrjyhgjlkukbjhcfjklhgfhjouhbgrvycghujyiljknhbgvfhtgfhiuoihkjbnhbvgfgyuo',
description: "say command for mods and admins",
async execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
const exampleEmbed = new Discord.MessageEmbed()
.setColor(conf.colour.ok)
.setAuthor("Game Reaction Roles")
.setTitle("react to get your roles")
.setThumbnail('https://cdn.discordapp.com/icons/584484766997282836/94b16e813edb9a2f1df4a5bd16f98ad1.png')
.setURL("http://knightRider.rf.gd/reaction-role-error.php")
.setDescription("🚚 - <@&595087305212035084>\n🚜 - <@&595086913430355973>\n⛏ - <@&595087098604683277>\n🗺 - <@&604424840807710721>\n🚓 - <@&691635977889906849>\n🚗 - <@&752217267600621578>\n🏎 - <@&752217137728192543>\n🔧 - <@&595767995998011392>\n⚙ - <@&860942666195927050>")
.setFooter('something wrong? go to http://knightRider.rf.gd/er.html');
let msg = await message.channel.send(exampleEmbed);
msg.react("🚚")
msg.react("🚜")
msg.react("⛏")
msg.react("🗺")
msg.react("🚓")
msg.react("🚗")
msg.react("🏎")
msg.react("🔧")
msg.react("⚙")
}
}
}

View file

View file

@ -0,0 +1,7 @@
module.exports = {
name: 'note',
description: "shows a users note",
async execute(message, args, Discord, currentServer, messageUser, client) {
message.reply("* depricated *: do " + currentServer.prefix + "userinfo @someone")
}
}

View file

@ -0,0 +1,16 @@
module.exports = {
name: 'say',
description: "say command for mods and admins",
execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
message.delete();
let sayArgs = message.content.substring(prefix.length).split(" ");
if (message.content.toLowerCase().includes('@everyone')) return message.reply(`Holup you can't @ every one`);
if (message.content.toLowerCase().includes('@here')) return message.reply(`Holup you can't @ here`);
message.channel.send(`${sayArgs.slice(2).join(" ")}`);
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

View file

@ -0,0 +1,45 @@
const conf = require('../../../conf/conf.json')
module.exports = {
name: 'townhall',
description: "say command for mods and admins",
async execute(message, args, Discord, currentServer, messageUser, client) {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
if (args[1] == 'end') {
if (args[2] == 'confirm') {
require('../../events/voicestateupdate').members[message.guild.id] = [];
message.channel.send("townHall meeting members have been removed.")
} else {
message.channel.send("are you sure you want to end the townhall meeting? this will remove all members even ones that may still be currently in the voice channel.\nto confirm please do `" + currentServer.prefix + "townhall end confirm`.")
}
} else {
let members = require('../../events/voicestateupdate').members[message.guild.id];
let mpos = 0;
let mEmbed = new Discord.MessageEmbed()
.setColor(conf.colour.ok)
.setTitle('Members that have Joined Townhall Vc')
.setURL(conf.domain + '/server/' + message.guild.id + '/townhall')
.setAuthor(conf.bot.name, conf.bot.logo, conf.bot.url)
.setDescription('when the townhall meeting ends remember to do `' + currentServer.prefix + 'townhall end` otherwise users from the previous meeting will show up.')
.setThumbnail(message.guild.iconURL() || conf.domain + '/logo.png')
.setTimestamp()
.setFooter('TownHall Meeting');
await members.forEach(async(member) => {
let isStaff;
if (client.guilds.cache.get(currentServer.id).members.cache.get(member).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) {
isStaff = 'yes';
} else {
isStaff = 'no';
};
mpos++;
await mEmbed.addField(`__${client.users.cache.get(member).tag}:__`, `__**id:**__ ${member}\n__**@:**__ <@!${member}>\n__**isStaff:**__ ${isStaff}\n__**Join Position:**__ ${mpos}`);
})
message.channel.send({ embed: mEmbed });
};
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
}
}

View file

@ -0,0 +1,48 @@
const conf = require('../../../conf/conf.json');
const User = require('../../../models/user');
module.exports = {
name: 'userinfo',
description: "get information about someone on the server",
async execute(message, args, Discord, currentServer, messageUser, client) {
try {
if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) {
let theUser;
if (message.mentions.users.first()) {
theUser = message.mentions.users.first();
} else {
theUser = message.author;
};
let currentUser = await User.findOne({ userid: theUser, guildid: message.guild.id });
if (currentUser == null) return message.channel.send("that user inst in the database");
const userInfoEmbed = new Discord.MessageEmbed()
.setAuthor(`${conf.bot.name}`, `${conf.bot.logo}`)
.setTitle('user info')
.setURL(conf.domain)
.setColor(conf.colour.ok)
.setThumbnail(theUser.avatarURL())
.addField("__**user:**__", "<@!" + currentUser.id + "> (" + currentUser.id + ")")
.addField("__**strikes:**__", "`" + currentUser.strike.toString() + "`")
.addField("__**note:**__", "`" + currentUser.note + "`")
.setTimestamp()
.setFooter(`Requested by ${message.member.displayName} | react with a ❌ to delete`, `${message.author.displayAvatarURL()}`);
message.channel.send(userInfoEmbed).then(async sentMsg => {
await sentMsg.react('❌');
sentMsg.awaitReactions(async(reaction, user) => {
if (reaction.emoji.name === '❌') await sentMsg.delete();
});
/*
await sentMsg.react('❌');
const filter = (reaction, user) => ['❌'].includes(reaction.emoji.name) && user.id === message.author.id;
const [reaction] = await sentMsg.awaitReactions(filter, { maxMatches: 1 });
if (reaction.emoji.name === '❌') await sentMsg.delete();
*/
});
} else {
return message.reply("you cant do that only staff can").catch(e => console.log(e));
};
} catch (err) {
message.channel.send("an error happened. are they in the \"database\"?")
}
}
}

8
src/bot/events/error.js Normal file
View file

@ -0,0 +1,8 @@
const conf = require('../../conf/conf.json')
module.exports = {
name: 'error',
async exe(client, Discord, error) {
//one day i will saves these to a file or something
console.log(error)
}
}

View file

@ -0,0 +1,55 @@
const conf = require('../../conf/conf.json')
module.exports = {
name: 'guildMemberAdd',
async exe(client, Discord, member) {
try {
member.guild.fetchInvites().then(guildInvites => {
const inviteGuild = invites;
const invite = guildInvites.find(i => inviteGuild.get(i.code).uses < i.uses);
const inviter = client.users.cache.get(invite.inviter.id);
const inviteLogEmbed = {
color: `${conf.colour.ok}`,
title: 'invite',
url: `${conf.domain}`,
author: {
name: conf.bot.name
},
thumbnail: {
url: `${conf.server.logo}`,
},
description: `${member.user.discriminator} (${member.user.id}) joined using invite code ${invite.code} from ${inviter.tag} (${inviter.id}). Invite was used ${invite.uses} times since its creation.`,
fields: [{
name: 'Member joined:',
value: `${member.user.discriminator} (${member.user.id})`,
},
{
name: 'Inviter:',
value: `${inviter.tag} (${inviter.id})`,
},
{
name: 'Invite Code:',
value: `[https://discord.gg/${invite.code}](https://discord.gg/${invite.code})`,
},
{
name: 'Invite Uses:',
value: `${invite.uses}`,
},
{
name: 'Time of Invite:',
value: `${new Date()}`,
}
],
timestamp: new Date(),
footer: {
text: 'moderation logs'
},
};
member.guild.channels.cache.get(conf.server.channels.modLogs).send({ embed: inviteLogEmbed });
invites = guildInvites;
});
} catch (error) {
require('../conf/functions.js').reportError(client, conf, "guildMemberAdd", error, { name: null, id: null })
}
}
}

74
src/bot/events/message.js Normal file
View file

@ -0,0 +1,74 @@
const conf = require('../../conf/conf.json')
const getGuild = require('../../funcs/getserver');
const getUser = require('../../funcs/getuser');
function addCmd(message) {
}
module.exports = {
name: 'message',
async exe(client, Discord, message) {
if (message.author.bot || !message.guild) return;
let currentServer = await getGuild(message);
let messageUser = await getUser(message);
if (currentServer == null) return;
['caps', 'swearfilter'].forEach(addon => {
require(`../addons/${addon}`)(message, server, messageUser, client);
})
//eval command
if (message.content.toLowerCase().startsWith("--eval")) {
const evalargs = message.content.split(" ").slice(1);
function clean(text) {
if (typeof(text) === "string") {
return text.replace(/`/g, "`" + String.fromCharCode(8203)).replace(/@/g, "@" + String.fromCharCode(8203));
} else {
return text;
}
}
if (message.author.id !== conf.owner) return message.channel.send("no you cant do that, only <@!522534458071449620> can.");
if (message.author.id == conf.owner) {
try {
const code = evalargs.join(" ");
let evaled = eval(code);
if (typeof evaled !== "string") {
evaled = require("util").inspect(evaled);
}
message.channel.send(clean(evaled), { code: "xl" });
} catch (err) {
message.channel.send(`\`ERROR\` \`\`\`xl\n${clean(err)}\n\`\`\``);
}
}
}
let args = message.content.toLowerCase().substring(currentServer.prefix.length).split(" ");
if (!message.content.startsWith(currentServer.prefix)) return;
//otr commands
if (message.author.id == conf.cwh11) {
require('../../funcs/otr').otrCommand(message, args, Discord, currentServer, messageUser, client);
};
//dynamic get command name or prefix
if (client.commands.has(args[0])) {
try {
client.commands.get(args[0]).execute(message, args, Discord, currentServer, messageUser, client);
addCmd(message);
} catch (error) {
message.reply('there was an error with that command!');
};
} else if (client.commands.find(command => command.aliases && command.aliases.includes(args[0]))) {
try {
client.commands.find(command => command.aliases && command.aliases.includes(args[0])).execute(message, args, Discord, currentServer, messageUser, client);
addCmd(message);
} catch (error) {
message.reply('there was an error with that command!');
};
};
}
}

View file

@ -0,0 +1,26 @@
const Server = require('../../models/server');
module.exports = {
name: 'messageReactionAdd',
async exe(client, Discord, reaction, user) {
let currentServer = await Server.findOne({ id: reaction.message.guild.id });
if (currentServer == null) return;
if (!reaction.message.guild || user.bot) return;
if (reaction.message.partial) await reaction.message.fetch();
if (reaction.partial) await reaction.fetch();
let member = await reaction.message.guild.members.fetch(user.id);
try {
currentServer.reactionRoles.forEach(role => {
if (reaction.message.channel.id == role.channelID) {
if (reaction.emoji.name == role.emoji) {
let rr = client.guilds.cache.get(reaction.message.guild.id).roles.cache.get(role.roleID);
member.roles.add(rr).catch(e => console.log(e));
};
};
});
} catch (error) {
return console.log(error)
};
}
}

View file

@ -0,0 +1,29 @@
const Server = require('../../models/server');
const conf = require('../../conf/conf.json')
module.exports = {
name: 'messageReactionRemove',
async exe(client, Discord, reaction, user) {
let currentServer = await Server.findOne({ id: reaction.message.guild.id });
if (currentServer == null) return;
if (!reaction.message.guild || user.bot) return;
if (reaction.message.partial) await reaction.message.fetch();
if (reaction.partial) await reaction.fetch();
let member = await reaction.message.guild.members.fetch(user.id);
try {
currentServer.reactionRoles.forEach(role => {
if (reaction.message.channel.id == role.channelID) {
if (reaction.emoji.name == role.emoji) {
let rr = client.guilds.cache.get(reaction.message.guild.id).roles.cache.get(role.roleID);
member.roles.remove(rr).catch(e => console.log(e));
};
};
});
} catch (error) {
return console.log(error)
};
}
}

9
src/bot/events/ready.js Normal file
View file

@ -0,0 +1,9 @@
const { green } = require('chalk');
const conf = require('../../conf/conf.json');
module.exports = {
name: 'ready',
async exe(client) {
console.log(green('[bot]: ') + `${client.user.tag}` + " is online");
console.log("Ready!");
}
}

View file

@ -0,0 +1,71 @@
const Server = require("../../models/server");
const conf = require('../../conf/conf.json')
var members = [];
module.exports = {
members: members,
name: 'voiceStateUpdate',
async exe(client, Discord, oldMember, newMember) {
try {
let newUserChannel = newMember.channelID;
let oldUserChannel = oldMember.channelID;
const currentServer = await Server.findOne({ id: newMember.guild.id });
if (currentServer == null) return;
if (currentServer.channels.townhall == ' ' || currentServer.channels.townhallLogs == ' ') return;
if (newUserChannel == currentServer.channels.townhall) {
let isStaff;
if (client.guilds.cache.get(currentServer.id).members.cache.get(newMember.id).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) {
isStaff = 'yes';
} else {
isStaff = 'no';
};
if (!members[newMember.guild.id]) {
members[newMember.guild.id] = [];
};
if (!members[newMember.guild.id].includes(newMember.id)) {
members[newMember.guild.id].push(newMember.id)
};
const e6 = {
color: conf.colour.ok,
title: 'User joinded Town hall vc',
author: {
name: client.users.cache.get(newMember.id).tag,
icon_url: client.users.cache.get(newMember.id).avatarURL()
},
description: "a new member has joined the town hall VC.\nto get all members that have joined during this session do `" + currentServer.prefix + "townhall`.",
fields: [{
name: '**__name:**__',
value: client.users.cache.get(newMember.id).tag,
},
{
name: '__**id:**__',
value: newMember.id,
},
{
name: '__**@ mention**__',
value: '<@!' + newMember.id + '>'
},
{
name: '__**is staff**__',
value: isStaff
},
{
name: '__**join position:**__',
value: members.length
},
],
timestamp: new Date(),
footer: {
text: 'TownHall Meeting Log'
},
};
client.guilds.cache.get(currentServer.id).channels.cache.get(currentServer.channels.townhallLogs).send({ embed: e6 });
};
} catch (error) {
console.log(error)
}
}
}

13
src/bot/handlers/addon.js Normal file
View file

@ -0,0 +1,13 @@
const { readdirSync } = require("fs");
const chalk = require('chalk');
module.exports = (client) => {
const addons = readdirSync(__dirname + '/../addons/').filter((file) => file.endsWith(".js"));
for (let addonFile of addons) {
try {
console.log(chalk.green('[addon handler]: ') + " found '" + addonFile + "'");
} catch (error) {
console.log(chalk.green('[addon handler]: ') + chalk.red('(error): ') + "unhandled error: " + error);
continue;
}
}
};

View file

@ -0,0 +1,37 @@
const { readdirSync } = require("fs");
const chalk = require('chalk');
let chalkColour;
module.exports = (client) => {
readdirSync(__dirname + "/../commands/").forEach((dir) => {
const commands = readdirSync(__dirname + `/../commands/${dir}/`).filter((file) => file.endsWith(".js"));
for (let file of commands) {
let cmd = require(__dirname + `/../commands/${dir}/${file}`);
if (cmd.name && cmd.description) {
switch (dir) {
case 'fun':
chalkColour = 'green'
break;
case 'moderaton':
chalkColour = 'blue'
break;
case 'info':
chalkColour = 'cyan'
break;
default:
chalkColour = 'green'
}
try {
client.commands.set(cmd.name, cmd);
console.log(chalk.yellow('[command handler]: ') + chalk[chalkColour]('(' + dir + '): ') + "name: " + cmd.name + " path: " + `./commands/${dir}/${file}`);
} catch (error) {
console.log(chalk.yellow('[command handler]: ') + chalk.red('(command error): ') + "adding command. path: " + `./commands/${dir}/${file}`);
console.log("eeer: " + error)
continue;
}
} else {
console.log(chalk.yellow('[command handler]: ') + chalk.red('(command error): ') + "command dosnt contain a name or description. path: " + `./commands/${dir}/${file}`);
continue;
}
}
});
};

10
src/bot/handlers/event.js Normal file
View file

@ -0,0 +1,10 @@
const chalk = require('chalk');
const { readdirSync } = require("fs");
const Discord = require('discord.js');
module.exports = (client) => {
const eventFiles = readdirSync(__dirname + '/../events/').filter(file => file.endsWith('.js'));
for (const file of eventFiles) {
const event = require(__dirname + `/../events/${file}`);
client.on(event.name, async(...args) => event.exe(client, Discord, ...args));
};
}

24
src/conf/conf.json Normal file
View file

@ -0,0 +1,24 @@
{
"prefix": ".",
"owner": "522534458071449620",
"domain": "http://localhost:4758",
"port": "4758",
"cwh11": "276156203770314755",
"colour": {
"ok": "#ff0000",
"error": "#ff5733"
},
"mainServer": {
"invite": "https://discord.gg/52AugmVzjt",
"id": "here"
},
"bot": {
"name": "knightrider",
"logo": "https://cdn.discordapp.com/icons/584484766997282836/337d9f62b88bc8d343be2bb3bc90292f.png",
"url": "http://knightrider.invalidlag.com/me"
},
"webServer": {
"port": 4758,
"oauthURI": "here"
}
}

105
src/conf/functions.js Normal file
View file

@ -0,0 +1,105 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const { User } = require('discord.js');
const User = require('../models/user');
const Server = require('../models/server');
const getServer = require('../funcs/getserver');
module.exports = {
reportError: function(client, conf, task, error, user) {
const errorEmbed = {
color: `${conf.colour.okError}`,
title: 'Error',
url: `${conf.domain}`,
author: {
name: conf.bot.name
},
thumbnail: {
url: `${conf.server.logo}`,
},
description: `there has been an error executing somthing this will be somthing from a automated script or a member using the bot\nthe infromation below can be sensative **do not share** this with anyone unless you know what to hide:`,
fields: [{
name: '__**task:**__',
value: `\`${task}\``,
},
{
name: '__**Error**__',
value: `\`${error}\``,
},
{
name: '__**user who triggered it**__',
value: `__name:__ \`${currentUser.userName}\`\n__id:__ \`${user.id}\``,
}
],
timestamp: new Date(),
footer: {
text: 'Owner Error Log'
},
};
client.users.cache.get(conf.owner).send({ embed: errorEmbed });
},
addCmd: async function(message) {
let currentServer = await Server.findOne({ id: message.guild.id });
currentServer.commandCount++;
currentServer.save();
},
addstrike: async function(message) {
let currentUser = await User.findOne({ id: message.author.id })
if (currentUser == null) {
await User.create({
id: message.author.id,
avatar: message.author.avatarURL()
})
currentUser = await User.findOne({ id: message.author.id })
}
currentUser.strike++;
currentUser.save()
},
otrCommand: async function(message, args, Discord, client) {
if (message.author.id == conf.cwh11) {
let server = getServer(message);
if (server == null) return message.channel.send("this server isnt in the db");
const annoncmentsChannel = client.channels.cache.get(server.channels.annoncments);
switch (args[0]) {
case 'ito':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is in the office. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otrf':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Ford. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otrs':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Subaru. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otr11':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in his car. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otr':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'olb':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'yts':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is streaming on YouTube: https://www.youtube.com/channel/UC7uWWizg0tmQ2R1kBkuDJHg").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'ts':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is streaming on Twitch: https://www.twitch.tv/therealcwh11").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
default:
return;
};
}
}
};

View file

@ -0,0 +1,34 @@
{
"584494185453977622": {
"roles": {
"✅": "584487354194984981"
}
},
"790737726332600360": {
"roles": {
"📑": "783031927753801770",
"💻": "791376525475315742",
"🎧": "791376529233674310",
"🖥": "791376533057962095",
"📱": "791376535138467900",
"🎮": "791376535474536458",
"🔌": "791376537211371560"
}
},
"791381305111347231": {
"roles": {
"🚚": "595087305212035084",
"🚜": "595086913430355973",
"⛏️": "595087098604683277",
"🗺️": "604424840807710721",
"🚓": "691635977889906849",
"🚗": "752217267600621578",
"🏎️": "752217137728192543",
"🔧": "595767995998011392",
"⚙️": "860942666195927050"
}
}
}

15
src/conf/tokens.js Normal file
View file

@ -0,0 +1,15 @@
module.exports = {
bot: {
token: "here"
},
oauth: {
clientId: "here",
clientSecret: "here",
redirectUri: "http://localhost:4758/dashboard",
scope: "identify email guilds"
},
db: {
URI: "here"
}
}

View file

@ -0,0 +1,14 @@
const { version, repository: { url } } = require('../../../../package.json');
const { domain, prefix, mainServer: { invite } } = require('../../../conf/conf.json');
module.exports = {
name: '/api',
dynamic: false,
async exe(client, req, res) {
try {
res.status(200).json({ defaultPrefix: prefix, doamin: domain, version: version, mainGuild: invite, github: url.replace('.git', '') });
} catch (error) {
console.log(error);
res.status(500).json({ error: "500 - some error", message: "report it if it happens again" });
}
}
}

View file

@ -0,0 +1,159 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const fetch = require('node-fetch');
const config = require('../../../conf/conf.json')
const User = require('../../../models/userdashboard');
const dbc = require('discord-bitfield-calculator')
const token = require('../../../conf/tokens');
const Server = require('../../../models/server');
const randomString = require("randomstring").generate({
length: 33,
charset: 'alphabetic'
});
module.exports = {
name: '/dashboard',
dynamic: false,
async exe(client, req, res) {
// try {
if (req.query.code) {
let oath;
let userInfo;
let userGuilds = [];
let guilds = [];
let theAccessCode = randomString;
//access discord oauth2 and get nececry data
await fetch('https://discord.com/api/oauth2/token', {
method: 'POST',
body: new URLSearchParams({
client_id: token.oauth.clientId,
client_secret: token.oauth.clientSecret,
grant_type: 'authorization_code',
redirect_uri: token.oauth.redirectUri,
code: req.query.code,
scope: token.oauth.scope,
}),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
}).then(discordRes => discordRes.json()).then(info => oath = info);
//fetch user info from OAuth2 token
await fetch('https://discord.com/api/users/@me', {
headers: {
authorization: `${oath.token_type} ${oath.access_token}`,
},
}).then(async userRes => {
userInfo = await userRes.json();
});
//fetch guilds from OAuth2 token
await fetch('https://discord.com/api/users/@me/guilds', {
headers: {
authorization: `${oath.token_type} ${oath.access_token}`,
},
})
.then(async guildRes => {
userGuilds = await guildRes.json()
});
//if the access code was used/expired (from browser refresh) redirect without code and try use cookeis
if (userInfo.message == '401: Unauthorized') return res.redirect('/dashboard');
if (userGuilds.message == '401: Unauthorized') return res.redirect('/dashboard');
let botGuilds = await client.guilds.cache.map(guild => guild.id)
//loop though oauth2 guilds and push guild info for matching guilds to 'guilds' array
await userGuilds.forEach(async(userGuild) => {
let currentServer = await Server.findOne({ id: userGuild.id })
//handle servers only the user is in
if (currentServer == null) {
if (userGuild.owner == true) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: false, userPermission: 'owner' });
} else {
if (dbc.permissions(userGuild.permissions_new).includes('MANAGE_GUILD')) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: false, userPermission: 'MANAGE_GUILD' });
};
};
//handle servers the bot and user are in
} else {
if (userGuild.owner == true) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'owner' });
} else {
if (client.guilds.cache.get(currentServer.id).members.find(currentUser.userId).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'staffrole' });
} else {
currentServer.staff.forEach(userid => {
if (userInfo.id == userid) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'staffid' });
} else if (dbc.permissions(userGuild.permissions_new).includes('MANAGE_GUILD')) {
guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'MANAGE_GUILD' });
};
});
};
};
};
});
delete botGuilds;
let currentUser = await User.findOne({ userId: userInfo.id });
if (currentUser == null) {
await User.create({
userId: userInfo.id,
userName: userInfo.username,
discriminator: userInfo.discriminator || '0000',
avatar: `https://cdn.discordapp.com/avatars/${userInfo.id}/${userInfo.avatar}.png`,
accessCodes: [{ browser: req.headers['user-agent'], code: randomString }],
guilds: guilds
});
currentUser = await User.findOne({ userId: userInfo.id });
} else {
let gotCorrectAccessCode = false;
if (res.locals.cookie.accesscode) {
await currentUser.accessCodes.forEach(async(accessCode) => {
if (res.locals.cookie.accesscode == accessCode.code) {
gotCorrectAccessCode = await true;
theAccessCode = res.locals.cookie.accesscode;
}
});
};
if (gotCorrectAccessCode == false) {
currentUser.accessCodes.push({ browser: req.headers['user-agent'], code: randomString });
theAccessCode = randomString;
};
currentUser.userName = userInfo.username;
currentUser.avatar = `https://cdn.discordapp.com/avatars/${userInfo.id}/${userInfo.avatar}.png`;
currentUser.guilds = guilds;
currentUser.save();
};
res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', theAccessCode, { expires: new Date(253402300000000), httpOnly: true }).status(200).render('dashboard/index.ejs', { currentUser: currentUser, guilds: currentUser.guilds });
} else if (req.query.error) {
console.log("req query error: " + req.query.error)
await res.status(500).render('500.ejs');
} else if (res.locals.cookie.id && res.locals.cookie.accesscode) {
const currentUser = await User.findOne({ userId: res.locals.cookie.id });
if (currentUser == null) return res.redirect('/login?nouser');
let hasAccess = false;
await currentUser.accessCodes.forEach(async(userCode) => {
if (res.locals.cookie.accesscode == userCode.code) {
hasAccess = true;
return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/index.ejs', { user: { name: currentUser.userName, tag: currentUser.discriminator, avatar: currentUser.avatar }, currentUser: currentUser, guilds: currentUser.guilds });
};
});
if (hasAccess == false) return res.redirect('/login?ninvalidcode');
} else if (!res.locals.cookie.id || !res.locals.cookie.accesscode) return res.redirect('/login?nocookies');
/*
} catch (error) {
console.log(chalk.red('[express get]: ') + "there was an error with dashboard.js\nerror: " + error);
return res.status(500).render('500.ejs');
};
*/
}
}

View file

@ -0,0 +1,45 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Server = require('../../../models/server')
const Userdashboard = require('../../../models/userdashboard')
const conf = require('../../../conf/conf.json')
module.exports = {
name: '/server/:serverid/filter',
dynamic: true,
async exe(client, req, res) {
try {
if (!res.locals.cookie.id || !res.locals.cookie.accesscode) {
return res.redirect(conf.domain + "/login")
}
let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id })
let currentServer = await Server.findOne({ id: req.params.serverid })
if (currentServer == null) return res.render('404.ejs')
let hasAccess = false;
await currentUser.guilds.forEach(guild => {
if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) {
hasAccess = true;
};
});
if (hasAccess == true) {
await currentUser.accessCodes.forEach(async(userCode) => {
if (res.locals.cookie.accesscode == userCode.code) {
hasAccess = true;
return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/filter.ejs', { domain: conf.domain, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer });
};
});
if (hasAccess == false) return res.redirect('/login?ninvalidcode');
} else {
await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } })
}
} catch (error) {
console.log(error)
// require('../../../conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid })
res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" })
}
}
}

View file

@ -0,0 +1,29 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
module.exports = {
name: '/dash/message',
async exe(client, req, res) {
try {
let usersDB = JSON.parse(fs.readFileSync('./././database/users.json', 'utf8'));
if (!req.query.tmpPassWord) {
res.redirect("http://idiotlanparty.com/oauth")
}
if (usersDB[req.query.userid].admin == true) {
if (req.query.tmpPassWord == usersDB[req.query.userid].tmpPassWord) {
res.render('admin-message.ejs', { userInfo: { id: req.query.userid, username: req.query.username, avatar: req.query.userAvatar }, tmpPassWord: req.query.tmpPassWord })
} else {
await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access please login again to regenrate your temporary local oath key", userInfo: { id: req.query.userid, username: req.query.username, avatar: req.query.userAvatar } })
}
} else if (usersDB[userInfo.id].admin == false) {
await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } })
}
} catch (error) {
console.log(error)
require('../../../conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid })
res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" })
}
}
}

View file

@ -0,0 +1,52 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Server = require('../../../models/server');
const Userdashboard = require('../../../models/userdashboard');
const conf = require('../../../conf/conf.json');
module.exports = {
name: '/server/:serverid/reactionroles',
dynamic: true,
async exe(client, req, res) {
try {
if (!res.locals.cookie.id || !res.locals.cookie.accesscode) {
return res.redirect(conf.domain + "/login")
}
let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id })
if (currentUser == null) return res.render('404.ejs')
let currentServer = await Server.findOne({ id: req.params.serverid })
if (currentServer == null) return res.render('404.ejs')
let hasAccess = false;
await currentUser.guilds.forEach(guild => {
if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) {
hasAccess = true;
};
});
if (hasAccess == true) {
let listedRoles = [];
let listedChannels = [];
let server = await client.guilds.cache.get(currentServer.id);
let user = await server.members.fetch(currentUser.userId);
//push server roles to array
server.roles.cache.map((role) => listedRoles.push({ id: role.id, name: role.name }));
//push only channels user can see to array
server.channels.cache.filter(c => c.type == 'text').forEach(channel => {
if (server.channels.cache.get(channel.id).permissionsFor(user).has(['SEND_MESSAGES', 'VIEW_CHANNEL'])) listedChannels.push({ name: channel.name, id: channel.id });
});
await currentUser.accessCodes.forEach(async(userCode) => {
if (res.locals.cookie.accesscode == userCode.code) {
hasAccess = true;
return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/reactionroles.ejs', { domain: conf.domain, server: { channels: listedChannels, roles: listedRoles }, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer });
};
});
if (hasAccess == false) return res.redirect('/login?ninvalidcode');
} else {
await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } })
}
} catch (error) {
console.log(error)
res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" })
}
}
}

View file

@ -0,0 +1,44 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Server = require('../../../models/server')
const Userdashboard = require('../../../models/userdashboard')
const conf = require('../../../conf/conf.json')
module.exports = {
name: '/server/:serverid/filter',
dynamic: true,
async exe(client, req, res) {
try {
if (!res.locals.cookie.id || !res.locals.cookie.accesscode) {
return res.redirect(conf.domain + "/login")
}
let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id })
if (currentUser == null) return res.redirect('/login');
let currentServer = await Server.findOne({ id: req.params.serverid })
if (currentServer == null) return res.render('404.ejs');
let hasAccess = false;
await currentUser.guilds.forEach(guild => {
if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) {
hasAccess = true;
};
});
if (hasAccess == true) {
await currentUser.accessCodes.forEach(async(userCode) => {
if (res.locals.cookie.accesscode == userCode.code) {
hasAccess = true;
const memberCount = await client.guilds.cache.get(currentServer.id).memberCount;
return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/server.ejs', { domain: conf.domain, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer, memberCount: memberCount });
};
});
if (hasAccess == false) return res.redirect('/login?ninvalidcode');
} else {
await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } })
};
} catch (error) {
console.log(error)
res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" })
}
}
}

6
src/express/get/er/er.js Normal file
View file

@ -0,0 +1,6 @@
module.exports = {
name: '/er',
exe(client, conf, req, res) {
res.render('er/er.ejs')
}
}

View file

@ -0,0 +1,8 @@
const { webServer: { oauthURI } } = require('../../../conf/conf.json')
module.exports = {
name: '/login',
dynamic: false,
exe(client, req, res) {
res.redirect(oauthURI)
}
}

View file

@ -0,0 +1,11 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const conf = require('../../../conf/conf.json')
module.exports = {
name: '/',
dynamic: false,
exe(client, req, res) {
res.render('index.ejs', { bot: { name: conf.bot.name }, servers: client.guilds.cache.size, users: client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0) });
}
}

View file

@ -0,0 +1,38 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const chalk = require('chalk');
const { readdirSync } = require("fs");
module.exports = (client, webServer) => {
readdirSync(__dirname + '/../get/').forEach((dir) => {
const getReqFiles = readdirSync(__dirname + `/../get/${dir}/`).filter((file) => file.endsWith(".js"));
for (let file of getReqFiles) {
let getReqFile = require(__dirname + `/../get/${dir}/${file}`);
if (getReqFile.name) {
try {
if (getReqFile.dynamic == false) {
webServer.get(getReqFile.name, async(...args) => getReqFile.exe(client, ...args));
};
} catch (error) {
console.log(chalk.cyan('[webserver get handler]: ') + chalk.red('(error): ') + "executing. path: " + `./get/${dir}/${file}`);
continue;
};
} else {
console.log(chalk.cyan('[webserver get handler]: ') + chalk.red('(error): ') + "get file dosnt contain a name or description. path: " + `./get/${dir}/${file}`);
continue;
};
};
});
webServer.get('/server/:serverid', async(...args) => require('../get/dashboard/server').exe(client, ...args));
webServer.get('/server/:serverid/filter', async(...args) => require('../get/dashboard/filter').exe(client, ...args));
webServer.get('/server/:serverid/reactionroles', async(...args) => require('../get/dashboard/reactionroles').exe(client, ...args));
webServer.get('*', (req, res) => {
res.status(404).render('404.ejs');
});
console.log(chalk.cyan('[webserver]: ') + "loaded get request handler");
}

View file

@ -0,0 +1,29 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const chalk = require('chalk');
const { readdirSync } = require("fs");
const conf = require('../../conf/conf.json');
module.exports = (client, webServer) => {
readdirSync(__dirname + '/../post/').forEach((dir) => {
const postReqFiles = readdirSync(__dirname + `/../post/${dir}/`).filter((file) => file.endsWith(".js"));
for (let file of postReqFiles) {
let postReqFile = require(__dirname + `/../post/${dir}/${file}`);
if (postReqFile.name) {
try {
webServer.post(postReqFile.name, async(...args) => postReqFile.exe(client, conf, ...args));
} catch (error) {
console.log(chalk.cyan('[webserver post handler]: ') + chalk.red('(error): ') + "executing. path: " + `./get/${dir}/${file}`);
continue;
}
} else {
console.log(chalk.cyan('[webserver post handler]: ') + chalk.red('(error): ') + "post file dosnt contain a name or description. path: " + `./get/${dir}/${file}`);
continue;
};
};
});
console.log(chalk.cyan('[webserver]: ') + "loaded post request handler");
}

View file

@ -0,0 +1,16 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const { version, repository: { url } } = require('../../../../package.json');
const { domain, prefix, mainServer: { invite } } = require('../../../conf/conf.json');
module.exports = {
name: '/api',
async exe(client, req, res) {
try {
res.status(200).json({ defaultPrefix: prefix, doamin: domain, version: version, mainGuild: invite, github: url.replace('.git', '') });
} catch (error) {
console.log(error);
res.status(500).json({ error: "500 - some error", message: "report it if it happens again" });
}
}
}

View file

@ -0,0 +1,35 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Server = require('../../../models/server');
const { domain } = require('../../../conf/conf.json');
const Userdashboard = require('../../../models/userdashboard');
module.exports = {
name: '/api/updatefilter',
async exe(client, conf, req, res) {
try {
if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.normalFilter || !req.body.safeFilter) return res.status(401).JSON({ error: "000 - missing information", info: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' });
let currentUser = await Userdashboard.findOne({ userId: req.body.user.id });
if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db" });
let currentServer = await Server.findOne({ id: req.body.server.id });
if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db" });
let hasAccess = false;
await currentUser.accessCodes.forEach(async(userCode) => {
if (req.body.user.accesscode == userCode.code) {
hasAccess = true;
currentServer.filter.normal = await req.body.normalFilter;
currentServer.filter.safe = await req.body.safeFilter;
currentServer.save();
return res.status(200).json({ error: "no", message: "filters have been updates" });
};
});
if (hasAccess == false) return res.status(401).json({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' });
} catch (error) {
console.log(error);
res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + domain + '/er' });
}
}
}

View file

@ -0,0 +1,42 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Userdashboard = require('../../../models/userdashboard');
const Server = require('../../../models/server');
const { prefix, domain } = require('../../../conf/conf.json');
module.exports = {
name: '/api/updateoverview',
async exe(client, conf, req, res) {
try {
if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.staffRoles || !req.body.staffids) return res.status(403).json({ error: "000 - missing information", message: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' })
let currentUser = await Userdashboard.findOne({ userId: req.body.user.id })
if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db", message: "that user id cant be found" });
let currentServer = await Server.findOne({ id: req.body.server.id });
if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db", message: "that server id cant be found" });
let hasAccess = false;
await currentUser.accessCodes.forEach(async(userCode) => {
if (req.body.user.accesscode == userCode.code) {
hasAccess = true;
//apply all data from the req to the db (probabbly a better way to do this)
currentServer.prefix = req.body.prefix || prefix;
currentServer.staff = req.body.staffids || [];
currentServer.staffRoles = req.body.staffRoles || [];
currentServer.channels.modLogs = req.body.channels.modlogs || ' ';
currentServer.channels.announcments = req.body.channels.announcments || ' ';
currentServer.channels.townhall = req.body.channels.townhall || ' ';
currentServer.channels.townhallLogs = req.body.channels.townhallLogs || ' ';
currentServer.save();
return res.status(200);
};
});
if (hasAccess == false) return res.status(401).JSON({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' });
} catch (error) {
console.log(error);
res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again. " + domain + '/er' });
}
}
}

View file

@ -0,0 +1,78 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const Server = require('../../../models/server');
const Userdashboard = require('../../../models/userdashboard');
module.exports = {
name: '/api/updatereactionroles',
async exe(client, conf, req, res) {
try {
if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.reactionRoles) return res.status(404).json({ error: "000 - missing information", info: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' });
let currentUser = await Userdashboard.findOne({ userId: req.body.user.id });
if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db" });
let currentServer = await Server.findOne({ id: req.body.server.id });
if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db" });
let hasAccess = false;
await currentUser.accessCodes.forEach(async(userCode) => {
if (req.body.user.accesscode == userCode.code) {
hasAccess = true;
currentServer.reactionRoles = await req.body.reactionRoles;
currentServer.save();
let eachChannelRoles = {};
await currentServer.reactionRoles.forEach(role => {
if (!eachChannelRoles[role.channelID]) {
eachChannelRoles[role.channelID] = [{
roleID: role.roleID,
emoji: role.emoji
}];
} else {
eachChannelRoles[role.channelID].push({
roleID: role.roleID,
emoji: role.emoji
});
};
});
for (let i in eachChannelRoles) {
let rolesEmbed = {
color: conf.colour.ok,
title: 'ReactionRoles',
url: conf.domain,
author: {
name: conf.bot.name,
icon_url: conf.bot.logo,
url: conf.bot.url,
},
description: 'react with the appropriate emoji to get your role',
fields: [],
timestamp: new Date(),
footer: {
text: currentServer.name,
},
};
await eachChannelRoles[i].forEach(role => {
rolesEmbed.fields.push({
name: '\u200B',
value: '<@&' + role.roleID + '> - ' + role.emoji,
});
});
const channel = client.guilds.cache.get(currentServer.id).channels.cache.get(i)
if (channel !== undefined) {
const msg = await channel.send({ embed: rolesEmbed });
eachChannelRoles[i].forEach(role => {
msg.react(role.emoji);
});
};
};
return res.status(200).json({ error: "no", message: "reactionroles have been updates" });
};
});
if (hasAccess == false) return res.status(401).json({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' });
} catch (error) {
console.log(error);
res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + conf.domain + '/er' });
}
}
}

View file

@ -0,0 +1,24 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
module.exports = {
name: '/api/userinfo/update',
async exe(client, conf, req, res) {
try {
if (req.body.tmpPassWord == usersDB[req.body.userInfo.id].tmpPassWord) {
if (!usersDB[req.body.memberId]) {
res.status(404).json({ error: "user id isnt in the database", info: "user id could be wrong or that user hasnt sent a message in the discord server since the bot has been setup" })
} else {
res.status(200).json({ userStrikes: usersDB[req.body.memberId].strike, userNote: usersDB[req.body.memberId].note, userAdmin: usersDB[req.body.memberId].admin })
}
} else {
res.status(401).json({ error: "401 - unauthorised", info: "please include your tmp password and user id to use this api more info in the docs http://knightrider.rf.gd/docs/" })
}
} catch (error) {
console.log(error)
res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again." })
require('./././conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid })
}
}
}

View file

@ -0,0 +1,14 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
module.exports = {
name: '/api/userinfo',
async exe(client, conf, req, res) {
try {
} catch (error) {
console.log(error)
res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again." })
}
}
}

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>404</title>
</head>
<body>
<h2>404 - that page cant be found</h2>
</body>
</html>

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>Document</title>
</head>
<body>
<h2>500 - web server error </h2>
<p>the owner has been informed of this error.</p>
</body>
</html>

View file

@ -0,0 +1,192 @@
@import url('https://fonts.googleapis.com/css2?family=Open+Sans&display=swap');
html,
body {
margin: 0;
padding: 0;
min-width: 100%;
min-height: 100%;
background-color: #2C2F33;
color: rgb(255, 255, 255);
font-family: 'Open Sans', sans-serif;
background-image: url('/assets/topggbackground.png');
background-repeat: no-repeat;
background-attachment: fixed;
background-size: cover;
}
.user-information {
display: flex;
}
.useravatar {
padding: auto;
}
.username {
padding: auto;
}
.container {
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.servers-lists {
width: 90%;
padding: 15px 0 10px;
background: #15528f69;
border-radius: 15px;
}
/* if screen big big make button marging right more so dosnt look weirds 3% and maybe makde button text 2em and width/height bigger*/
.server-list {
position: relative;
display: flex;
flex-direction: column;
row-gap: 40px;
align-items: center;
margin-bottom: 50px;
}
.server-container {
display: flex;
justify-content: space-between;
flex-direction: row;
min-height: 10px;
width: 90%;
margin: auto;
flex-wrap: wrap;
background-color: #000000;
border-radius: 35px;
}
.server {
display: flex;
min-width: 50%;
flex-direction: row;
min-height: 10px;
flex-wrap: wrap;
}
.button-container {
margin: 0 0.5% 0 0;
display: flex;
justify-content: center;
align-items: center;
}
.server-info {
display: flex;
align-items: center;
flex-direction: row;
margin: 0.9% 0.6%;
color: rgb(255, 255, 255);
}
.server-icon {
margin-top: 0.4%;
margin-left: 0.4%;
}
.server-icon-img {
width: 70px;
height: 70px;
border-radius: 50%;
}
.server-name {
font-size: 1em;
margin: 5px;
}
.server-dash-btn {
display: flex;
align-items: center;
flex-direction: column;
flex-wrap: wrap;
}
.button {
display: flex;
justify-content: center;
align-items: center;
border: rgb(240, 236, 236) 1px solid;
color: rgb(255, 255, 255);
width: 105px;
height: 35px;
border-radius: 100px;
cursor: pointer;
transition: all .2s ease;
font-size: 1em;
text-decoration: none !important;
}
@media (max-width: 858px) {
.container {
width: 100% !important;
}
.servers-lists {
width: 100% !important;
margin: 0 !important;
padding: 5px !important;
}
.server-container {
flex-direction: column !important;
padding: 0 !important;
padding-bottom: 0 !important;
max-width: 40% !important;
min-height: 150px;
border-radius: 15% !important;
overflow: hidden !important;
}
.button-container {
margin: 0 !important;
width: 100%;
min-height: 33px !important;
background-color: aliceblue;
color: black !important;
}
.server-info {
margin-top: 8px !important;
margin-bottom: 9px !important;
margin-left: 4px !important;
}
.server-icon {
display: flex !important;
align-items: center !important;
align-content: center !important;
width: 100%;
height: 90%;
flex-direction: column !important;
margin: auto !important;
}
.server-icon-img {
width: 100% !important;
height: 90% !important;
border-radius: 0 !important;
}
.button {
display: flex;
justify-content: center;
align-items: center;
border: 0 !important;
color: rgb(0, 0, 0) !important;
width: 100% !important;
height: 35px;
cursor: pointer;
transition: all .2s ease;
font-size: 1em;
text-decoration: none !important;
border-radius: 0px;
}
}
.manage {}
.invite {
background-color: rgb(123, 255, 0);
}

View file

@ -0,0 +1,65 @@
* {
box-sizing: border-box;
}
body {
font-family: Arial, Helvetica, sans-serif;
margin: 0;
font-size: 120%;
}
.header {
padding: 90px;
padding-top: 169px;
text-align: center;
background: red;
color: white;
}
.header h1 {
font-size: 40px;
}
.content {
display: -ms-flexbox;
/* IE10 */
display: flex;
-ms-flex-wrap: wrap;
/* IE10 */
flex-wrap: wrap;
}
.main {
-ms-flex: 70%;
/* IE10 */
flex: 70%;
background-color: white;
padding: 20px;
}
#connection {
vertical-align: middle;
}
.dot {
height: 20px;
width: 20px;
background-color: red;
border-radius: 50%;
display: inline-block;
vertical-align: middle;
text-align: center;
}
.stat {
background-color: rgb(233, 223, 223);
padding: 5px;
padding-right: 7px;
border-radius: 6px;
}
.footer {
padding: 20px;
text-align: center;
background: #ddd;
}

View file

@ -0,0 +1,132 @@
/* mobile navbar navbar */
.mobnav {
top: 0;
right: 0;
width: 0;
z-index: 1;
height: 100%;
position: fixed;
transition: 0.5s;
padding-top: 60px;
overflow-x: hidden;
background-color: #25282a;
}
.mobnav a {
display: block;
font-size: 25px;
color: #ffffff;
transition: 0.3s;
text-decoration: none;
padding: 7px 8px 7px 32px;
}
.mobnav a:hover {
color: #888B8D;
}
.mobnav .closebtn {
top: 0;
right: 25px;
font-size: 36px;
margin-left: 50px;
position: absolute;
}
/* responsive */
@media screen and (max-height: 450px) {
.mobnav {
padding-top: 15px;
}
.mobnav a {
font-size: 18px;
}
}
@media screen and (min-width: 1024px) {
.mobilenavbtn {
display: none !important;
}
}
/* desktop navbar */
.navbar {
margin-top: 0;
padding-top: 5px;
background-color: #25282a;
display: block;
overflow: hidden;
}
.desktop-nav {
left: 0;
margin-top: 0;
display: block;
margin-bottom: 0;
padding-top: 3px;
margin-left: 5.5%;
padding-bottom: 3px;
transition: 143.9ms;
}
.desktop-nav li {
float: left;
margin-left: 2px;
margin-right: 2px;
transition: 0.5ms;
list-style-type: none;
}
.desktop-nav li a {
display: block;
color: #ffffff;
cursor: pointer;
margin-top: 6px;
padding-top: 8px;
margin-bottom: 6px;
padding-left: 14px;
text-align: center;
padding-bottom: 8px;
padding-right: 14px;
border-radius: 13px;
text-decoration: none;
font-family: "Zegoe UI Semi Bold - U";
font-size: 150%;
}
.desktop-nav a:hover:not(.active) {
color: #888B8D;
}
.active a {
color: #8C8B89;
}
/* responstive */
@media screen and (max-width: 1024px) {
.desktop-nav {
display: none !important;
}
}
div.user {
vertical-align: top;
display: inline-block;
text-align: center;
float: left;
margin: 5px;
margin-right: 45%;
}
.userimg {
width: 50;
height: 50;
border-radius: 45%;
background-color: grey;
}
.usercaption {
display: block;
color: #ffffff;
}

View file

@ -0,0 +1,232 @@
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #2C2F33;
color: #ffffff;
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
.headding {
margin-left: 3.4%;
}
input[type=text],
select,
textarea {
width: 30%;
padding: 12px;
border: 1px solid #2C2F33;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
background-color: #4c4e55;
color: #ffffff;
}
.buttont {
display: flex;
background-color: #5865F2;
justify-content: center;
align-items: center;
border: rgb(240, 236, 236) 1px solid;
width: 105px;
height: 35px;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: all .2s ease;
}
.buttonttt {
display: flex;
justify-content: center;
align-items: center;
border: rgb(240, 236, 236) 1px solid;
color: rgb(255, 255, 255);
min-width: 105px;
min-height: 35px;
max-width: 50%;
border-radius: 100px;
cursor: pointer;
transition: all .2s ease;
font-size: 1em;
text-decoration: none !important;
}
.button:hover {
background-color: #5460e7;
}
.button#submit:hover {
background-color: #EB459E;
}
.container {
border-radius: 5px;
background-color: #40444B;
padding: 20px;
margin: 12px;
}
.filterul {
margin: 0;
}
.filterul li {
list-style-type: none;
float: left;
padding: 5px;
margin: 3px;
border-radius: 5%;
background-color: #33363a;
}
.filters {
margin-bottom: 10px;
display: flex;
}
.flex-containor {
display: flex;
flex-direction: row;
}
@media (max-width: 858px) {
.flex-containor {
flex-direction: column;
}
.server-name-text {
margin-left: 1% !important;
}
.serverinfo {
max-width: 45% !important;
}
.dropdown-content {
width: 45% !important;
}
}
.menu {
min-width: 15%;
display: flex;
flex-direction: column;
row-gap: 0px;
}
.menu div .button {
display: flex;
justify-content: center;
align-items: center;
color: rgb(255, 255, 255);
border-radius: 25px 25px 0 0;
height: 50px;
cursor: pointer;
transition: all .2s ease;
font-size: 1em;
text-decoration: none !important;
}
.menu div .button:hover {
background-color: #363a3f;
}
.view {
min-width: 70%;
}
.view-btn-active {
background-color: #404449;
border-radius: 0 !important;
}
.serverinfo {
margin: 5px;
margin-bottom: 0;
padding: 5px;
max-width: 80%;
background-color: #575a5e;
border-radius: 8px;
}
.server-main-items {
display: flex;
flex-direction: row;
align-items: center;
align-content: center;
font-size: 1.5em;
row-gap: 1.3%;
}
.server-main-img,
.dropdown-server-main-img {
border-radius: 50%;
width: 50px;
vertical-align: middle
}
.server-name-text {
margin-left: 5.6%;
}
.server-sub-items {
margin-top: 6px;
font-size: 0.5em;
}
.dropbtn {
border: none;
}
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #6A6D70;
width: 80%;
margin: 5px;
margin-top: 0;
padding: 5px;
font-size: 0.5em;
box-shadow: 0px 8px 16px 0px rgb(0 0 0 / 20%);
z-index: 1;
border-radius: 0 0 8px 8px;
}
.dropdown-content a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #52565c;
}
.dropdown:hover .dropdown-content {
display: flex;
flex-direction: column;
max-width: 80%;
}
.dropdown:hover .serverinfo {
background-color: #6a6d70;
border-radius: 8px 8px 0 0;
}
/* buttons */
.buttons {
margin-top: 5px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -0,0 +1,11 @@
//for mobile navbar
function openNav() {
document.getElementById("mobilenavbar").style.width = "250px";
}
function closeNav() {
document.getElementById("mobilenavbar").style.width = "0";
}
if (window.innerWidth <= 280) {
alert("please open your fold phone to use this page")
}

View file

@ -0,0 +1,109 @@
var normalstr = '<ul class="filterul">';
filterNormal.forEach(function(word) {
normalstr += '<li>' + word + '</li>';
});
normalstr += '</ul>';
document.getElementById("filterNormal").innerHTML = normalstr;
async function addTofilterNormal() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterNormalInput').value.toLowerCase()
await filterNormal.push(newWord)
var str = '<ul class="filterul">'
filterNormal.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterNormal").innerHTML = str;
document.getElementById('filterNormalInput').value = ""
}
async function removeFilterNormal() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterNormalInput').value.toLowerCase()
const index = filterNormal.indexOf(newWord);
if (index > -1) {
filterNormal.splice(index, 1);
var str = '<ul class="filterul">'
filterNormal.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterNormal").innerHTML = str;
document.getElementById('filterNormalInput').value = ""
} else {
document.getElementById('filterNormalInput').value = ""
}
}
var safestr = '<ul class="filterul">'
filterSafe.forEach(function(word) {
safestr += '<li>' + word + '</li>';
});
safestr += '</ul>';
document.getElementById("filterSafe").innerHTML = safestr;
async function addTofilterSafe() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterSafeInput').value.toLowerCase()
await filterSafe.push(newWord)
var str = '<ul class="filterul">'
filterSafe.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterSafe").innerHTML = str;
document.getElementById('filterSafeInput').value = ""
}
async function removeFilterSafe() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterSafeInput').value.toLowerCase()
const index = filterSafe.indexOf(newWord);
if (index > -1) {
filterSafe.splice(index, 1);
var str = '<ul class="filterul">'
filterSafe.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterSafe").innerHTML = str;
document.getElementById('filterSafeInput').value = ""
} else {
document.getElementById('filterSafeInput').value = ""
}
}
async function updateFilters() {
var xhr = new XMLHttpRequest();
xhr.open("POST", domain + '/api/updatefilter', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader("access-control-allow-origin", "*");
await xhr.send(JSON.stringify({
user: user,
server: currentServer,
normalFilter: filterNormal,
safeFilter: filterSafe
}));
document.getElementById("info").innerHTML = "Filter has been updated"
}

View file

@ -0,0 +1,116 @@
var normalstr = '<ul class="filterul">'
staffids.forEach(function(word) {
normalstr += '<li>' + word + '</li>';
});
normalstr += '</ul>';
document.getElementById("staffids").innerHTML = normalstr;
async function addToStaffids() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('staffidsInput').value.toLowerCase()
await staffids.push(newWord)
var str = '<ul class="filterul">'
staffids.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("staffids").innerHTML = str;
document.getElementById('staffidsInput').value = ""
}
async function removeStaffids() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('staffidsInput').value.toLowerCase()
const index = staffids.indexOf(newWord);
if (index > -1) {
staffids.splice(index, 1);
var str = '<ul class="filterul">'
staffids.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("staffids").innerHTML = str;
document.getElementById('staffidsInput').value = ""
} else {
document.getElementById('staffidsInput').value = ""
}
}
var safestr = '<ul class="filterul">'
staffRoles.forEach(function(word) {
safestr += '<li>' + word + '</li>';
});
safestr += '</ul>';
document.getElementById("staffRoles").innerHTML = safestr;
async function addToStaffRoles() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('staffRolesInput').value
await staffRoles.push(newWord)
var str = '<ul class="filterul">'
staffRoles.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("staffRoles").innerHTML = str;
document.getElementById('staffRolesInput').value = ""
}
staffRoles
async function removeStaffRoles() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('staffRolesInput').value
const index = staffRoles.indexOf(newWord);
if (index > -1) {
staffRoles.splice(index, 1);
var str = '<ul class="filterul">'
staffRoles.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("staffRoles").innerHTML = str;
document.getElementById('staffRolesInput').value = ""
} else {
document.getElementById('staffRolesInput').value = ""
}
}
async function sendupdate() {
var xhr = new XMLHttpRequest();
xhr.open("POST", domain + '/api/updateoverview', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader("access-control-allow-origin", "*");
await xhr.send(JSON.stringify({
user: user,
server: currentServer,
prefix: document.getElementById('prefix').value.replace(' ', ''),
staffids: staffids,
staffRoles: staffRoles,
channels: {
modlogs: document.getElementById('modlogs').value.replace(' ', ''),
announcments: document.getElementById('announcments').value.replace(' ', ''),
townhall: document.getElementById('townhall').value.replace(' ', ''),
townhallLogs: document.getElementById('townhallLogs').value.replace(' ', ''),
}
}));
document.getElementById("info").innerHTML = "staff has been updated"
}

View file

@ -0,0 +1,67 @@
function loadroles() {
//lmao js
var rrstr = '<ul class="filterul">';
reactionRoles.forEach(function(role) {
server.roles.forEach(r => {
if (role.roleID == r.id) {
server.channels.forEach(chan => {
if (role.channelID == chan.id) {
rrstr += '<li>Channel: ' + chan.name + ' Role id: ' + r.name + ' emoji: ' + role.emoji + '</li><br>';
}
})
}
})
});
rrstr += '</ul>';
document.getElementById("ReactionRoles").innerHTML = rrstr;
}
async function addReactionRole() {
document.getElementById("info").innerHTML = ''
var channel = document.getElementById('ReactionRoleChannel').value.toLowerCase().replace(' ', '')
var role = document.getElementById('ReactionRole').value.toLowerCase().replace(' ', '');
var emoji = document.getElementById('ReactionRoleEmoji').value;
await reactionRoles.push({ channelID: channel, roleID: role, emoji: emoji });
loadroles()
document.getElementById('ReactionRoleChannel').value = '';
document.getElementById('ReactionRole').value = '';
document.getElementById('ReactionRoleEmoji').value = '';
}
async function removeReactionRole() {
document.getElementById("info").innerHTML = ''
var role = document.getElementById('ReactionRole').value.toLowerCase().replace(' ', '');
var channel = document.getElementById('ReactionRoleChannel').value.toLowerCase().replace(' ', '')
for (let i = 0; i < reactionRoles.length; i++) {
if (reactionRoles[i].channelID == channel) {
if (reactionRoles[i].roleID == role) {
reactionRoles.splice(i, 1);
loadroles()
document.getElementById('ReactionRoleChannel').value = '';
document.getElementById('ReactionRole').value = '';
document.getElementById('ReactionRoleEmoji').value = '';
};
};
};
}
async function sendupdate() {
var xhr = new XMLHttpRequest();
xhr.open("POST", domain + '/api/updatereactionroles', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader("access-control-allow-origin", "*");
await xhr.send(JSON.stringify({
user: user,
server: currentServer,
reactionRoles: reactionRoles
}));
document.getElementById("info").innerHTML = "ReactionRoles have been updated."
}
loadroles()

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -0,0 +1 @@
404

View file

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>dashboard :: knightrider</title>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #2C2F33;
color: #ffffff;
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
.headding {
margin-left: 3.4%;
}
input[type=text],
select,
textarea {
width: 30%;
padding: 12px;
border: 1px solid #2C2F33;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
background-color: #4c4e55;
color: #ffffff;
}
.button {
background-color: #5865F2;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button:hover {
background-color: #5460e7;
}
.button#submit:hover {
background-color: #EB459E;
}
</style>
</head>
<body>
<%- include('parts/dash-navbar.ejs') %>
<div style="margin-top: 60px;">
<div>
prefix bot name other things
</div>
<p style="margin: 40px;"><a class="button" href="/dash/filter?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Edit Filters</a></p>
<p style="margin: 40px;"><a class="button" href="/dash/userinfo?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Member Information</a></p>
<p style="margin: 40px;"><a class="button" href="/dash/message?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Sent Embeds And Messages</a></p>
</div>
<%- include('parts/footer.ejs') %>
</body>
</html>

View file

@ -0,0 +1,246 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>message-dashboard :: knightrider</title>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #2C2F33;
color: #ffffff;
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
.headding {
margin-left: 3.4%;
}
input[type=text],
select,
textarea {
width: 30%;
padding: 12px;
border: 1px solid #2C2F33;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
background-color: #4c4e55;
color: #ffffff;
}
.button {
background-color: #5865F2;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button:hover {
background-color: #5460e7;
}
.button#submit:hover {
background-color: #EB459E;
}
.container {
border-radius: 5px;
background-color: #40444B;
padding: 20px;
margin: 12px;
}
.filterul {
margin: 0;
}
.filterul li {
list-style-type: none;
float: left;
padding: 5px;
margin: 3px;
border-radius: 5%;
background-color: #33363a;
}
.filters {
margin-bottom: 10px;
display: flex;
}
</style>
</head>
<body>
<%- include('parts/dash-navbar.ejs') %>
<div class="headding">
<h1>Message sender</h1>
<h3>send Embeds and mesages using the bot in channels</h3>
</div>
<div style="margin: 20px;margin-top: 50px;">
<p style="margin: 20px;margin-left: 0;"><a class="button" href="/oauth">Dashboard</a>
<a class="button" href="/dash/userinfo?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Member Information</a>
<a class="button" href="/dash/message?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Sent Embeds And Messages</a></p>
<br>
<br>
<p id="info"></p>
</div>
<div class="container">
<h1>Send Message:</h1>
<input type="text" id="messageInput" placeholder="message...">
<button class="button" onclick="sendMessage()">Send</button>
</div>
<br>
<br>
<div class="container">
<h1>Send Embed:</h1>
<input type="text" id="filterSafeInput" placeholder="word...">
<button class="button" onclick="addTofilterSafe()">Add To Filter</button>
<button class="button" onclick="removeFilterSafe()">remove from Filter</button>
</div>
<%- include('parts/footer.ejs') %>
</body>
<script>
var userInfo = <%-JSON.stringify(userInfo) %>
var filterNormal = <%-JSON.stringify(filterNormal) %>
var tmpPassWord = <%= tmpPassWord %>
var normalstr = '<ul class="filterul">'
filterNormal.forEach(function(word) {
normalstr += '<li>' + word + '</li>';
});
normalstr += '</ul>';
document.getElementById("filterNormal").innerHTML = normalstr;
async function addTofilterNormal() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterNormalInput').value.toLowerCase()
await filterNormal.push(newWord)
var str = '<ul class="filterul">'
filterNormal.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterNormal").innerHTML = str;
document.getElementById('filterNormalInput').value = ""
}
async function removeFilterNormal() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterNormalInput').value.toLowerCase()
const index = filterNormal.indexOf(newWord);
if (index > -1) {
filterNormal.splice(index, 1);
var str = '<ul class="filterul">'
filterNormal.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterNormal").innerHTML = str;
document.getElementById('filterNormalInput').value = ""
} else {
document.getElementById('filterNormalInput').value = ""
}
}
var filterSafe = <%-JSON.stringify(filterSafe) %>
var safestr = '<ul class="filterul">'
filterSafe.forEach(function(word) {
safestr += '<li>' + word + '</li>';
});
safestr += '</ul>';
document.getElementById("filterSafe").innerHTML = safestr;
async function addTofilterSafe() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterSafeInput').value.toLowerCase()
await filterSafe.push(newWord)
var str = '<ul class="filterul">'
filterSafe.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterSafe").innerHTML = str;
document.getElementById('filterSafeInput').value = ""
}
async function removeFilterSafe() {
document.getElementById("info").innerHTML = ''
var newWord = document.getElementById('filterSafeInput').value.toLowerCase()
const index = filterSafe.indexOf(newWord);
if (index > -1) {
filterSafe.splice(index, 1);
var str = '<ul class="filterul">'
filterSafe.forEach(function(word) {
str += '<li>' + word + '</li>';
});
str += '</ul>';
document.getElementById("filterSafe").innerHTML = str;
document.getElementById('filterSafeInput').value = ""
} else {
document.getElementById('filterSafeInput').value = ""
}
}
async function updateFilters() {
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://idiotlanparty.com:4758/api/dash/updatefilter', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader("access-control-allow-origin", "*");
await xhr.send(JSON.stringify({
userInfo: userInfo,
tmpPassWord: tmpPassWord,
normalFilter: filterNormal,
safeFilter: filterSafe
}));
document.getElementById("info").innerHTML = "Filter has been updated"
}
</script>
</html>

View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<script defer src="/js/filter.js"></script>
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>filter-dashboard :: knightrider</title>
</head>
<body>
<%- include('../partials/dash-navbar.ejs') %>
<div class="flex-containor">
<%- include('../partials/dashboard-menu.ejs') %>
<div class="view">
<div class="headding">
<h1>Filter</h1>
<h3>add and remove words from the filters</h3>
</div>
<div style="margin: 20px;margin-top: 50px;">
<button class="button" id="submit" onclick="updateFilters()">Update Filters</button>
<br>
<p id="info"></p>
</div>
<div class="container">
<h1>Filter normal:</h1>
<div class="filters" id="filterNormal"></div>
<input type="text" id="filterNormalInput" placeholder="word...">
<button class="button" onclick="addTofilterNormal()">Add To Filter</button>
<button class="button" onclick="removeFilterNormal()">remove from Filter</button>
</div>
<br>
<br>
<div class="container">
<h1>Filter Safe:</h1>
<div class="filters" id="filterSafe"></div>
<input type="text" id="filterSafeInput" placeholder="word...">
<button class="button" onclick="addTofilterSafe()">Add To Filter</button>
<button class="button" onclick="removeFilterSafe()">remove from Filter</button>
</div>
<button class="button" id="submit" onclick="updateFilters()">Update Filters</button>
</div>
</div>
<%- include('../partials/footer.ejs') %>
</body>
<script>
document.getElementById('filter').classList.add('view-btn-active');
var domain = '<%= domain%>';
var user = <%-JSON.stringify(user) %>;
var currentServer = <%-JSON.stringify(currentServer) %>;
var filterNormal = <%-JSON.stringify(currentServer.filter.normal) %>;
var filterSafe = <%-JSON.stringify(currentServer.filter.safe) %>;
</script>
</html>

View file

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://unpkg.com/pattern.css" rel="stylesheet">
<link rel="stylesheet" href="/css/dashboard.css?v=6942011">
<script src="https://kit.fontawesome.com/f09044d61f.js" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
<title>dashboard | Proto1</title>
</head>
<body>
<div class="user-information">
<!--<h3><img src="<%= currentUser.avatar %>" alt="avatar"><span><%= currentUser.userName %></span>#<span><%= currentUser.discriminator %></span></h3> -->
<div class="useravatar">
<img src="<%= currentUser.avatar %>" alt="user-avatart">
</div>
<div class="username">
<p><span><%= currentUser.userName %></span>#<span><%= currentUser.discriminator %></span></p>
</div>
</div>
<p>dont see your server? <a href="/login">login again</a></p>
<div class="container">
<div class="servers-lists">
<div class="server-list">
<% guilds.forEach(guild => { %>
<% if(guild.mutual == true) { %>
<div class="server-container">
<div class="server">
<div class="server-info">
<div class="server-name">
<%= guild.name %>
</div>
</div>
<div class="server-icon">
<img class="server-icon-img" src="<%= guild.icon %>" alt="server icon">
</div>
</div>
<div class="button-container">
<a class="button manage" href="/server/<%= guild.id %>">Manage</a>
</div>
</div>
<% } %>
<% }) %>
</div>
<div class="server-list">
<% guilds.forEach(guild => { %>
<% if(guild.mutual == false) { %>
<div class="server-container">
<div class="server">
<div class="server-info">
<div class="server-name">
<%= guild.name %>
</div>
</div>
<div class="server-icon">
<img class="server-icon-img" src="<%= guild.icon %>" alt="server icon">
</div>
</div>
<div class="button-container">
<a class="button invite" href="https://discord.com/oauth2/authorize?client_id=INSERT_CLIENT_ID_HERE&scope=bot&permissions=4151705302">Invite</a>
</div>
</div>
<% } %>
<% }) %>
</div>
</div>
</div>
<div class="pattern-grid-lg">
</div>
</body>
</html>

View file

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<script defer src="/js/reactionroles.js"></script>
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>filter-dashboard :: knightrider</title>
<style>
.emoji-picker__tab {
color: black;
}
</style>
</head>
<body>
<%- include('../partials/dash-navbar.ejs') %>
<div class="flex-containor">
<%- include('../partials/dashboard-menu.ejs') %>
<div class="view">
<div class="headding">
<h1>reaction roles</h1>
<h3>add and remove reaction roles</h3>
</div>
<div style="margin: 20px;margin-top: 50px;">
<button class="button" id="submit" onclick="sendupdate()">Update Reaction Roles</button>
<br>
<p id="info"></p>
</div>
<div class="container">
<h1>Reaction role:</h1>
<div class="filters" id="ReactionRoles"></div>
<!-- <input type="text" id="ReactionRoleChannel" placeholder="channel id..."> -->
<select id="ReactionRoleChannel" name="ReactionRoleChannel" placeholder="channel id...">
<option value="null">channel</option>
<% server.channels.forEach(chan => { %>
<option value="<%= chan.id %>"><%= chan.name %></option>
<% }) %>
</select>
<select id="ReactionRole" name="ReactionRole" placeholder="role id...">
<option value="null">role</option>
<% server.roles.forEach(r => { %>
<option value="<%= r.id %>"><%= r.name %></option>
<% }) %>
</select>
<!-- <input type="text" id="ReactionRole" placeholder="role id..."> -->
<input type="text" id="ReactionRoleEmoji" placeholder="emoji..."><button id="emoji-button">?</button></input>
<button class="button" onclick="addReactionRole()">Add reaction role</button>
<button class="button" onclick="removeReactionRole()">remove reaction role</button>
</div>
<br>
</div>
<%- include('../partials/footer.ejs') %>
<script src="https://cdn.jsdelivr.net/npm/emoji-button@0.6.0/dist/index.min.js"></script>
<script>
document.getElementById('reactionroles').classList.add('view-btn-active');
var domain = '<%= domain%>';
var user = <%-JSON.stringify(user) %>;
var server = <%-JSON.stringify(server) %>;
var currentServer = <%-JSON.stringify(currentServer) %>;
var reactionRoles = <%-JSON.stringify(currentServer.reactionRoles) %>;;
//emoji button https://www.cssscript.com/emoji-picker-button/
window.addEventListener('DOMContentLoaded', () => {
EmojiButton(document.querySelector('#emoji-button'), function(emoji) {
document.querySelector('#ReactionRoleEmoji').value += emoji;
});
});
</script>
</body>
</html>

View file

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<link rel="icon" href="/favicon.ico">
<script defer src="/js/overview.js"></script>
<link rel="shortcut icon" href="/logo.png">
<title>dashboard :: knightrider</title>
</head>
<body>
<%- include('../partials/dash-navbar.ejs') %>
<div class="flex-containor">
<%- include('../partials/dashboard-menu.ejs') %>
<div class="view">
<div class="headding">
<h1>Server Overview</h1>
<h3>overview of your server and some quick settings to change</h3>
</div>
<div style="margin: 20px;margin-top: 50px;">
<p id="info"></p>
</div>
<div class="infoboxes">
<div>
<p>Members:
<span><%= memberCount %></span>
</p>
</div>
</div>
<div class="prefix-container">
<div class="container">
<h1>Prefix: <abbr title="the bots prefix for this server">?</abbr></h1>
<input type="text" id="prefix" value="<%= currentServer.prefix %>">
<button onclick="sendupdate()">Update</button>
</div>
<br>
<br>
</div>
<h2>STAFF</h2>
<div class="container">
<h1>Staff Member ids': <abbr title="all users with an id in this menu can accss the dashboard and execute staf only commands in the server">?</abbr></h1>
<div class="filters" id="staffids"></div>
<input type="text" id="staffidsInput" placeholder="id...">
<button class="button" onclick="addToStaffids()">Add To list</button>
<button class="button" onclick="removeStaffids()">remove from list</button>
</div>
<br>
<br>
<div class="container">
<h1>Staff Role Names: <abbr title="the people with these roles can execute staff only commands in the server (they do not have access to the dashboard)">?</abbr></h1>
<div class="filters" id="staffRoles"></div>
<input type="text" id="staffRolesInput" placeholder="Name...">
<button class="button" onclick="addToStaffRoles()">Add To list</button>
<button class="button" onclick="removeStaffRoles()">remove from list</button>
</div>
<br>
<br>
<h2>CHANNELS</h2>
<div class="container">
<h1>modlogs: <abbr title="filter actions and other moderation acctions proformed by or using the bot will be sent to this channel">?</abbr></h1>
<input type="text" id="modlogs" placeholder="channel id.." value="<%= currentServer.channels.modLogs %>">
<button onclick="sendupdate()">Update</button>
</div>
<br>
<div class="container">
<h1>announcments: <abbr title="ysed for announcments sent form the bot">?</abbr></h1>
<input type="text" id="announcments" placeholder="channel id.." value="<%= currentServer.channels.announcments %>">
<button onclick="sendupdate()">Update</button>
</div>
<br>
<div class="container">
<h1>townhall: <abbr title="your town hall voice channel id ">?</abbr></h1>
<input type="text" id="townhall" placeholder="voice channel id.." value="<%= currentServer.channels.townhall %>">
<button onclick="sendupdate()">Update</button>
</div>
<br>
<div class="container">
<h1>townhallLogs: <abbr title="text channel for logs to do with your townhall channel e.g. user joines">?</abbr></h1>
<input type="text" id="townhallLogs" placeholder="channel id.." value="<%= currentServer.channels.townhallLogs %>">
<button onclick="sendupdate()">Update</button>
</div>
<br>
</div>
</div>
<%- include('../partials/footer.ejs') %>
<script>
document.getElementById('overview').classList.add('view-btn-active');
var domain = '<%= domain %>';
var currentServer = <%- JSON.stringify(currentServer) %>;
var user = <%-JSON.stringify(user) %>;
var staffids = <%-JSON.stringify(currentServer.staff) %>;
var staffRoles = <%-JSON.stringify(currentServer.staffRoles) %>;
</script>
</body>
</html>

View file

@ -0,0 +1,201 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<title>userinfo-dashboard :: knightrider</title>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #2C2F33;
color: #ffffff;
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
.headding {
margin-left: 3.4%;
}
input[type=text],
select,
textarea {
width: 30%;
padding: 12px;
border: 1px solid #2C2F33;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
background-color: #4c4e55;
color: #ffffff;
}
.button {
background-color: #5865F2;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button:hover {
background-color: #5460e7;
}
.button#submit:hover {
background-color: #EB459E;
}
.container {
border-radius: 5px;
background-color: #40444B;
padding: 20px;
margin: 12px;
}
.filterul {
margin: 0;
}
.filterul li {
list-style-type: none;
float: left;
padding: 5px;
margin: 3px;
border-radius: 5%;
background-color: #33363a;
}
.filters {
margin-bottom: 10px;
display: flex;
}
</style>
</head>
<body>
<%- include('../partials/dash-navbar.ejs') %>
<div class="headding">
<h1>Member Info</h1>
<h3>edit and see information for a member</h3>
</div>
<div style="margin: 20px;margin-top: 50px;">
<p style="margin: 20px;margin-left: 0;"><a class="button" href="/oauth">Dashboard</a>
<a class="button" href="/dash/userinfo?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Member Information</a>
<a class="button" href="/dash/message?userid=<%= userInfo.id %>&tmpPassWord=<%= tmpPassWord %>&username=<%= userInfo.username %>&userAvatar=<%= userInfo.avatar %>">Sent Embeds And Messages</a></p>
<br>
<br>
<div>
</div>
<br>
<p id="info"></p>
</div>
<div class="container">
<h1>userinfo:</h1>
<input type="text" id="memberId" placeholder="id...">
<button class="button" onclick="memberInfoLookUp()">Submit</button>
<div>
<label for="userStrikes">Member Strikes</label>
<input type="text" id="userStrikes" />
<br>
<label for="userNote">Member Note</label>
<input type="text" id="userNote" />
<p>Member is admin: <a id="userAdmin">null</a></p>
<button class="button" onclick="memberInfoUpdate()">Submit</button>
</div>
</div>
<br>
<%- include('../partials/footer.ejs') %>
</body>
<script>
var userInfo = <%-JSON.stringify(userInfo) %>
var tmpPassWord = <%= tmpPassWord %>
async function memberInfoLookUp() {
var memberId = document.getElementById('memberId').value
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://idiotlanparty.com:4758/api/dash/userinfo/i', true);
xhr.setRequestHeader('Content-Type', 'application/json');
await xhr.send(JSON.stringify({
userInfo: userInfo,
tmpPassWord: tmpPassWord,
memberId: memberId
}));
xhr.onreadystatechange = async function() {
if (xhr.readyState === 4) {
var res = await JSON.parse(xhr.response)
if (res.error) {
document.getElementById("info").innerHTML = res.error
} else {
document.getElementById("userStrikes").value = res.userStrikes
document.getElementById("userNote").value = res.userNote
document.getElementById("userAdmin").innerHTML = res.userAdmin
}
}
}
}
async function memberInfoUpdate() {
var memberStrikes = document.getElementById("userStrikes").value
var memberNote = document.getElementById("userNote").value
var memberId = document.getElementById('memberId').value
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://idiotlanparty.com:4758/api/dash/userinfo/update', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader("access-control-allow-origin", "*");
await xhr.send(JSON.stringify({
userInfo: userInfo,
tmpPassWord: tmpPassWord,
memberId: memberId,
memberStrikes: memberStrikes,
memberNote: memberNote
}));
xhr.onreadystatechange = async function() {
if (xhr.readyState === 4) {
var res = await JSON.parse(xhr.response)
if (res.error) {
document.getElementById("info").innerHTML = res.error
} else if (res.status == 'ok') {
document.getElementById("info").innerHTML = "Member info updated sucsesfully"
} else {
document.getElementById("info").innerHTML = "Can't Upload Member Info Server Is Down."
}
}
}
}
</script>
</html>

View file

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#embedcontainer {
display: flex;
flex-wrap: nowrap;
background-color: DodgerBlue;
border-radius: 10px;
overflow: hidden;
width: 500px;
margin: 10px;
border-radius: 10px;
padding: 0;
}
#colourbar {
background-color: red;
width: 0.5%;
}
#embed {
background-color: #f1f1f1;
width: 100%;
padding-left: 1.8%;
}
#embed h4 {
margin: 0;
margin-top: 10px;
}
#author {}
#title {}
#description {}
#thumbnail {}
#feilds {}
#image {}
#footer {}
</style>
</head>
<body>
<div id="embedcontainer">
<div id="colourbar">
</div>
<div id="embed">
<div id="thembnail"><img src="../static/logo.png" style="width: 15%;height: 15%;border-radius: 15%;float: right;margin-right: 3%;margin-top: 3%;"></div>
<div id="author">
<p><img src="../static/logo.png" style="width: 24px;height: 24px;border-radius: 50%;vertical-align:middle;margin-right: 5px;">i am author</p>
</div>
<div id="title">
<h2>title</h2>
</div>
<div id="description">
<h3>some description for the embed becaiue cool</h3>
</div>
<div id="felds">
<div>
<h4>f1 title</h4>
<p>f1 description with long lots words that go things yeahhh</p>
</div>
<div>
<h4>f2 title</h4>
<p>f2 description with long lots words that go things yeahhh<br>line2</p>
</div>
<div>
<h4>f3 title</h4>
<p>f3 description with long lots words that go things yeahhh</p>
</div>
<div>
<h4>f4 title</h4>
<p>f4 description with long lots words that go things yeahhh</p>
</div>
<div>
<h4>f5 title</h4>
<p>f5 description with long lots words that go things yeahhh</p>
</div>
</div>
<center>
<div id="image">
<img src="../static/logo.png" style="width: 88.5%;height: 270px; border-radius: 3%;">
</div>
</center>
<div id="footer">
<p><img src="../static/logo.png" style="width: 16px;height: 16px;border-radius: 50%;vertical-align:middle;margin-right: 5px;">footer</p>
</div>
</div>
</div>
</body>
</html>

View file

View file

@ -0,0 +1,68 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/navbar.css">
<link rel="stylesheet" href="/css/styles.css">
<link rel="icon" href="/favicon.ico">
<link rel="shortcut icon" href="/logo.png">
<script defer src="/js/client.js"></script>
<title>dashboard :: knightrider</title>
<style>
body {
background-color: black;
margin: 0;
padding: 0;
color: #ffffff;
}
.button {
background-color: #5865F2;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button:hover {
background-color: #5460e7;
}
</style>
</head>
<body>
<script defer src="/js/client.js"></script>
<div id="mobilenavbar" class="mobnav">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/">Home</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/er/">Report Error</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/docs/">Docs</a>
</div>
<div id="nav" class="navbar">
<ul class="desktop-nav">
<li class="active"><a href="http://knightrider.rf.gd/">Home</a></li>
<li><a href="http://knightrider.rf.gd/er/">Report Error</a></li>
<li><a href="http://knightrider.rf.gd/docs/">Docs</a></li>
</ul>
<span class="mobilenavbtn" style="color:#ffffff;font-size:30px;cursor:pointer;float:right;margin-right:3.5%;" onclick="openNav()">&#9776;</span>
</div>
<div style="margin-top: 60px;color:#ffffff;">
<p>
<%= error %>
</p>
<p>
<%= errorMessage %>
</p>
</div>
</body>
</html>

View file

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>
<%= bot.name%>
</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="og:title" content="<%= bot.name%>" />
<meta property="og:description" content="the all-purpose open source discord bot for CWH11's Hangout Crew" />
<meta property="og:url" content="https://knightrider.invalidlag.com" />
<!-- we need this -->
<meta property="og:image" content="/logo.png" />
<link rel="shortcut icon" href="/logo.png" />
<meta content="" data-react-helmet="true" name="theme-color" />
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/navbar.css">
<script defer src="/js/client.js"></script>
</head>
<body>
<div id="navbarsdiv">
<div id="mobilenavbar" class="mobnav">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
<a onclick="closeNav()" href="/">Home</a>
<a onclick="closeNav()" href="/dashboard">Dashboard</a>
<a onclick="closeNav()" href="/er">Report Error</a>
</div>
<div id="nav" class="navbar">
<span class="nav-brand">
<!--<img class="nav-img" width="50" height="50" src="/assets/img/logo.png" />-->
<h3 class="nav-img" style="color:#ffff;"><a>KnightRidr</a></h3>
</span>
<ul class="desktop-nav">
<li class="active"><a href="/">Home</a></li>
<li><a href="/dashboard">dashboard</a></li>
<li><a href="/er">report error</a></li>
</ul>
<span class="mobilenavbtn" onclick="openNav()">&#9776;</span>
</div>
</div>
<div class="header">
<h1>
<%= bot.name %>
</h1>
<p>the all-purpose open source discord bot for CWH11's Hangout Crew.</p>
</div>
<div class="content">
<div class="main">
<h4>hi :)</h4>
<p>knightrider is one of them all-purpose bots it's a bit like dyno but simpler and open-source.</p>
<p>if you plan on using this code for your server keep in mind the license and that while knightrider is opensource it was specifically designed for CWH11's Hangout Crew and also this bot is not optimized to have 100s of servers just 5 - 10
<br><br> if you would like to report an error go to <a href="/er">https://knightrider.invalidlag.com/er</a> if you found the code helpful consider <a href="https://github.com/404invalid-user/knightrider">giving it a star</a> or <a href="https://github.com/404invalid-user/knightrider">contribute</a> to it.</p>
</div>
</div>
<div class="footer">
<p>knightrider &#169; <a herf="https://invalidlag.com">404invalid-user</a></p>
</div>
</body>
</html>

View file

@ -0,0 +1,19 @@
<script defer src="/js/client.js"></script>
<div id="mobilenavbar" class="mobnav">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/">Home</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/er/">Report Error</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/docs/">Docs</a>
</div>
<div id="nav" class="navbar">
<div class="user">
<img class="userimg" src="<%= currentUser.avatar%>" />
<span class="usercaption">welcome <%= currentUser.userName %></span>
</div>
<ul class="desktop-nav">
<li class="active"><a href="http://knightrider.rf.gd/">Home</a></li>
<li><a href="http://knightrider.rf.gd/er/">Report Error</a></li>
<li><a href="http://knightrider.rf.gd/docs/">Docs</a></li>
</ul>
<span class="mobilenavbtn" style="color:#ffffff;font-size:30px;cursor:pointer;float:right;margin-right:3.5%;" onclick="openNav()">&#9776;</span>
</div>

View file

@ -0,0 +1,39 @@
<div class="menu">
<div class="dropdown">
<div class="serverinfo dropbtn">
<div class="server-main-items">
<div><img class="server-main-img" src="<%= currentServer.icon %>"></div>
<span><%= currentServer.name %></span>
<div>▼</div>
</div>
<div class="server-sub-items">
<span><%= currentServer.id %></span>
</div>
</div>
<div class="dropdown-content">
<% currentUser.guilds.forEach(guild => { %>
<% if(guild.mutual == true) { %>
<div class="serverinfo">
<a href="/server/<%= guild.id %>">
<div class="server-main-items">
<div><img class="server-main-img" src="<%= guild.icon %>"></div>
<span><%= guild.name %></span>
</div>
</a>
</div>
<% } %>
<% }) %>
</div>
</div>
<div class="buttons">
<div><a id="overview" class="button" href="/server/<%= currentServer.id%>">Overview</a></div>
<div><a id="filter" class="button" href="/server/<%= currentServer.id %>/filter">Filter</a></div>
<div><a id="reactionroles" class="button" href="/server/<%= currentServer.id %>/reactionroles">Reaction Roles</a></div>
<div><a id="userinfo" class="button" href="/server/<%= currentServer.id %>/userinfo">Member Information</a></div>
<div><a id="message" class="button" href="/server/<%= currentServer.id %>/message">Sent Embeds And Messages</a></div>
</div>
</div>

View file

@ -0,0 +1,4 @@
<footer style="position:relative;bottom:0;width:100vm;height:35px;padding-left: 20px">
<p>knightrider bot &#174;
<a style="color: rgb(255, 255, 255);" href="http://invalidlag.com">invalidlag</a></p>
</footer>

View file

@ -0,0 +1,15 @@
<script defer src="/js/client.js"></script>
<div id="mobilenavbar" class="mobnav">
<a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/">Home</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/er/">Report Error</a>
<a onclick="closeNav()" href="http://knightrider.rf.gd/docs/">Docs</a>
</div>
<div id="nav" class="navbar">
<ul class="desktop-nav">
<li class="active"><a href="http://knightrider.rf.gd/">Home</a></li>
<li><a href="http://knightrider.rf.gd/er/">Report Error</a></li>
<li><a href="http://knightrider.rf.gd/docs/">Docs</a></li>
</ul>
<span class="mobilenavbtn" style="color:#ffffff;font-size:30px;cursor:pointer;float:right;margin-right:3.5%;" onclick="openNav()">&#9776;</span>
</div>

14
src/funcs/getserver.js Normal file
View file

@ -0,0 +1,14 @@
const Server = require('../models/server');
module.exports = async(message) => {
let currentServer = await Server.findOne({ id: message.guild.id });
if (currentServer == null) {
Server.create({
id: message.guild.id,
name: message.guild.name,
icon: message.guild.iconURL() || 'https://knightrider.invalidlag.com/logo.png'
});
currentServer = await Server.findOne({ id: message.guild.id });
};
return currentServer;
}

14
src/funcs/getuser.js Normal file
View file

@ -0,0 +1,14 @@
const User = require('../models/user');
module.exports = async(message) => {
let currentUser = await User.findOne({ id: message.author.id, guildID: message.guild.id });
if (currentUser == null) {
await User.create({
userid: message.author.id,
guildID: message.guild.id,
userName: message.author.tag,
avatar: message.author.avatarURL()
});
currentUser = await User.findOne({ id: message.guild.id, guildID: message.guild.id });
};
return currentUser;
}

50
src/funcs/otr.js Normal file
View file

@ -0,0 +1,50 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const getServer = require('../funcs/getserver');
module.exports = {
otrCommand: async function(message, args, Discord, client) {
if (message.author.id == conf.cwh11) {
let server = getServer(message);
if (server == null) return message.channel.send("this server isnt in the db");
const annoncmentsChannel = client.channels.cache.get(server.channels.annoncments);
if (annoncmentsChannel == null || annoncmentsChannel == undefined) return;
switch (args[0]) {
case 'ito':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is in the office. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otrf':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Ford. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otrs':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Subaru. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otr11':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road in his car. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'otr':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'olb':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'yts':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is streaming on YouTube: https://www.youtube.com/channel/UC7uWWizg0tmQ2R1kBkuDJHg").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
case 'ts':
await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?"));
annoncmentsChannel.send("@here Hey guys! Charlie is streaming on Twitch: https://www.twitch.tv/therealcwh11").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?"));
break;
default:
return;
};
};
}
}

33
src/funcs/reporterror.js Normal file
View file

@ -0,0 +1,33 @@
const conf = require('../conf/conf.json')
module.exports = (client, error, user, process) => {
const errorEmbed = {
color: `${conf.colour.okError}`,
title: 'Error',
url: `${conf.domain}/er`,
author: {
name: conf.bot.name
},
thumbnail: {
url: `${conf.server.logo}`,
},
description: `there has been an error executing somthing this will be somthing from a automated script or a member using the bot\nthe infromation below can be sensative **do not share** this with anyone unless you know what to hide:`,
fields: [{
name: '__**task:**__',
value: `\`${task}\``,
},
{
name: '__**Error**__',
value: `\`${error}\``,
},
{
name: '__**user who triggered it**__',
value: `__name:__ \`${currentUser.userName}\`\n__id:__ \`${user.id}\``,
}
],
timestamp: new Date(),
footer: {
text: 'Owner Error Log'
},
};
client.users.cache.get(conf.owner).send({ embed: errorEmbed });
}

30
src/funcs/startuplog.js Normal file
View file

@ -0,0 +1,30 @@
/*
* licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE
*/
const fetch = require('node-fetch');
const { blue, red, magenta } = require('chalk');
const { version } = require('../../package.json')
module.exports = async() => {
let latestVersion;
let updatenote = 'no note';
await fetch('https://raw.githubusercontent.com/404invalid-user/discord-bitfield-calculator/main/package.json')
.then(res => res.json())
.then(json => {
latestVersion = json.version;
if (json.note) {
updatenote = json.note;
};
});
console.log("┌──────────────────────────────────────────────────────┐\n│ Made By: " + blue('404invalid') + red('-') + magenta('user') + " (https://invalidlag.com) │\n└──────────────────────────────────────────────────────┘");
const tablea = "┌────────────────────────────────────────┐";
const tableb = "│ version infromation │";
const tablec = "├──────────────────────┬─────────────────┤";
const tabled = `│ Current Version: │ ${version}`;
const tablee = "├──────────────────────┼─────────────────┤";
const tablef = `│ Lates Version: │ ${latestVersion}`;
const tableg = "├──────────────────────┼─────────────────┤";
const tableh = `│ update note: │ ${updatenote}`;
const tablei = "└──────────────────────┴─────────────────┘";
console.log(tablea + '\n' + tableb + '\n' + tablec + '\n' + tabled + '\n' + tablee + '\n' + tablef + '\n' + tableg + '\n' + tableh + '\n' + tablei)
}

17
src/knightrider.js Normal file
View file

@ -0,0 +1,17 @@
const express = require('express');
const mongoose = require('mongoose');
const { Client } = require('discord.js');
const { red, yellow } = require('chalk');
const webServer = express();
const client = new Client({ partials: ["MESSAGE", "CHANNEL", "REACTION", "USER"] });
mongoose.connect(require('./conf/tokens.js').db.URI, { useNewUrlParser: true, useUnifiedTopology: true }).then((result) => {
console.log(yellow('[database info]: ') + "connected to database");
}).catch((error) => {
console.log(red('[database info]: ') + "there was an error connecting to the database\nerror: " + error);
});
['bot', 'webserver'].forEach(file => {
require('./applications/' + file)(client, webServer);
});
require('./funcs/startuplog')()

214
src/models/server.js Normal file
View file

@ -0,0 +1,214 @@
const { Schema, model } = require('mongoose');
const { prefix } = require('../conf/conf.json')
const serverSchema = new Schema({
id: {
type: String,
required: true
},
name: {
type: String,
required: true
},
icon: {
type: String,
required: true
},
prefix: {
type: String,
required: true,
default: prefix
},
filter: {
level: {
type: String,
required: true,
default: 'normal'
},
normal: {
type: Array,
required: true,
default: [
"nigger",
"n igger",
"ni gger",
"nig ger",
"nigg er",
"nigge r",
"n i g g e r",
"niger",
"n iger",
"ni ger",
"nig er",
"nige r",
"n i g e r"
]
},
safe: {
type: Array,
required: true,
default: [
"cunt",
"c u n t",
"cu n t",
"cun t",
"cu n t",
"c.u.n.t",
"c.unt",
"c.u.nt",
"cun.t",
"cu.n.t",
"cock",
"c o c k",
"c ock",
"c o ck",
"co ck",
"c.o.c.k",
"c.o.ck",
"coc.k",
"co.c.k",
"dick",
"d i c k",
"fric",
"shit",
"s hit",
"sh it",
"shi t",
"s h i t",
"s.h.i.t",
"sh.i.t",
"shi.t",
"s.hit",
"sh.it",
"shi.t",
"sh*t",
"sh!t",
"fuck",
"f u c k ",
"f u ck",
"f uck",
"fu ck",
"fuc k",
"bitch",
"b*tch",
"bi*ch",
"bit*h",
"b.i.t.c.h",
"b.itch",
"b.i.tch",
"b.i.t.ch",
"bi.t.c.h",
"bit.c.h",
"bitc.h",
"b!tch",
"b itch",
"bi tch",
"bit ch",
"bitc h",
"b i t c h",
"nigger",
"n igger",
"ni gger",
"nig ger",
"nigg er",
"nigge r",
"n i g g e r",
"niger",
"n iger",
"ni ger",
"nig er",
"nige r",
"n i g e r"
]
},
},
reactionRoles: {
type: Array,
required: true,
default: []
},
staffRoles: {
type: Array,
required: true,
default: []
},
staff: {
type: Array,
required: true,
default: []
},
channels: {
modLogs: {
type: String,
required: true,
default: ' '
},
announcments: {
type: String,
required: true,
default: ' '
},
townhall: {
type: String,
required: true,
default: ' '
},
townhallLogs: {
type: String,
required: true,
default: ' '
}
},
configs: {
fivem: {
url: {
type: String,
required: true,
default: "http://knightrider.invalidlag.com/fivempiproxy"
},
ip: {
type: String,
required: true,
default: "search bruvland 2.0 in the server list"
},
},
meme: {
type: String,
required: true,
default: "r/memes"
}
},
addons: {
caps: {
type: Boolean,
required: true,
default: true
},
filter: {
type: Boolean,
required: true,
default: true
},
spam: {
type: Boolean,
required: true,
default: true
},
emojiSpam: {
type: Boolean,
required: true,
default: true
},
},
commandCount: {
type: Number,
required: true,
default: 0
}
});
module.exports = model('Server', serverSchema);

32
src/models/user.js Normal file
View file

@ -0,0 +1,32 @@
const { Schema, model } = require('mongoose');
const userSchema = new Schema({
userid: {
type: String,
required: true
},
guildID: {
type: String,
required: true
},
userName: {
type: String,
required: true
},
strike: {
type: Number,
required: true,
default: 0
},
note: {
type: String,
required: true,
default: 'no note for this user'
},
blocked: {
type: Boolean,
required: true,
default: false
},
});
module.exports = model('User', userSchema);

View file

@ -0,0 +1,48 @@
const { Schema, model } = require('mongoose');
const userSchema = new Schema({
userId: {
type: String,
required: true
},
userName: {
type: String,
required: true
},
discriminator: {
type: String,
required: true,
default: '0000'
},
avatar: {
type: String,
required: true,
default: 'https://knightrider.invalidlag.com/logo.png'
},
accessCodes: {
type: Array,
required: true,
default: []
},
about: {
type: String,
required: true,
default: 'no about for this user'
},
blocked: {
type: Boolean,
required: true,
default: false
},
admin: {
type: Boolean,
required: true,
default: false
},
guilds: {
type: Array,
required: true,
default: []
}
});
module.exports = model('Userdashboard', userSchema);