added full api and more

This commit is contained in:
CorwinDev committed 2022-08-10 12:23:19 +02:00
1 parent 47dfdbd344
commit c83c27a8ac
23 files changed
+570 -73

No files matched your search

+2
View File
@@ -1 +1,3 @@
node_modules
.VSCodeCounter
.vscode
+38 -6
View File
@@ -4,10 +4,11 @@ const bots = require('../models/bot');
var config = client.config
const colors = require('colors');
const bsl = colors.blue("BSL: ");
const ms = require("parse-ms-2");
// Set intents
client.on('ready',async () => {
const bot = await bots.find();
client.user.setPresence({ activity: { type: 'WATCHING', name: 'botscord.xyz | '+bot.length+' bots' }, status: "online" });
const bot = await bots.find({ verified: true});
client.user.setPresence({ activities: [{ name: 'botscord.xyz | '+bot.length+' bots' }] });
console.log(bsl, 'Bot is ready!');
// Log server count
setTimeout(() => {
@@ -15,18 +16,21 @@ client.on('ready',async () => {
`${client.guilds.cache.size} servers`);
}, 1000);
});
const { SlashCommandBuilder, Routes } = require('discord.js');
const { SlashCommandBuilder, Routes, EmbedBuilder } = require('discord.js');
const { REST } = require('@discordjs/rest');
const commands = [
new SlashCommandBuilder().setName('ping').setDescription('Replies with pong!'),
new SlashCommandBuilder().setName('topserver').setDescription('Replies with highest server!'),
new SlashCommandBuilder().setName('user').setDescription('Replies with user info and connected bots/servers!'),
new SlashCommandBuilder().setName('help').setDescription('Replies with the help embed!'),
new SlashCommandBuilder().setName('bump').setDescription('Bump you server'),
new SlashCommandBuilder().setName('info').setDescription('Get info about your server and the bot'),
]
.map(command => command.toJSON());
const rest = new REST({ version: '10' }).setToken(config.bot.token);
const rest = new REST({ version: '10' }).setToken(config.bot.bsl.token);
rest.put(Routes.applicationCommands(config.bot.id), { body: commands })
rest.put(Routes.applicationCommands(config.bot.bsl.id), { body: commands })
.then(() => console.log(bsl, 'Successfully registered application commands.'))
.catch(console.error);
@@ -38,11 +42,39 @@ client.on('interactionCreate', async interaction => {
} else if (commandName === 'topserver') {
const topServer = await servers.find({}).sort({ votes: -1 });
console.log(bsl, topServer);
await interaction.reply(`The top server is ${topServer[0].name} with ${topServer[0].votes} votes!`);
} else if (commandName === 'user') {
const { user } = interaction;
await interaction.reply(`${user.username}#${user.discriminator} has ${user.bot ? 'a bot' : 'no bot'} and is connected to ${user.guilds.size} servers!`);
}else if (commandName === 'help') {
await interaction.reply(`
**Commands**
\`ping\` - Replies with pong!
\`topserver\` - Replies with highest server!
\`user\` - Replies with user info and connected bots/servers!
`);
}else if (commandName === 'bump') {
let findServer = await servers.findOne({ id: interaction.guild.id });
if (!findServer) return interaction.reply(
"This server was not found in our list.\nAdd your server: https://botscord.xyz/server/add"
);
let cooldown = 3600000;
let lastDaily = findServer.bump;
if (cooldown - (Date.now() - lastDaily) > 0) {
let time = ms(cooldown - (Date.now() - lastDaily));
return interaction.reply(`You can bump again in ${time.minutes}m ${time.seconds}s`);
}
findServer.bump = Date.now();
findServer.bumps++;
await findServer.save();
const embed = new EmbedBuilder()
.setColor('#0099ff')
.setTitle('Bump')
.setDescription('You have successfully bumped your server!')
.setFooter({ iconURL: interaction.user.avatarURL(), text: 'BotsCord' })
.setTimestamp();
await interaction.reply({ embeds: [embed] });
}else if (commandName === 'info') {
} else {
await interaction.reply('Command not found!');
-3
View File
@@ -38,9 +38,6 @@ client.on('ready', () => {
require('./website/bot')
require('./bsl')
});
bsl.on('ready', () => {
console.log(colors.blue("BSL: "), 'BSL ready');
});
// Login
client.login(client.config.bot.token);
bsl.login(bsl.config.bot.bsl.token);
+1
View File
@@ -13,6 +13,7 @@ let hm = new mongoose.Schema({
servers: String,
users: String,
votes: Number,
token: String,
});
module.exports = mongoose.model("bots", hm);
+3
View File
@@ -10,6 +10,9 @@ let hm = new mongoose.Schema({
icon: String,
members: Number,
votes: Number,
bump: Date,
webhook: String,
bumps: Number,
});
module.exports = mongoose.model("servers", hm);
+1
View File
@@ -3,6 +3,7 @@ let model = new mongoose.Schema({
user: String,
date: Date,
bot: String,
server: String
});
module.exports = mongoose.model("votes", model);
+11
View File
@@ -19,6 +19,7 @@
"express-session": "^1.17.3",
"memorystore": "^1.6.7",
"mongoose": "^6.5.0",
"parse-ms-2": "^1.0.0",
"passport": "^0.6.0",
"passport-discord": "^0.1.4",
"request": "^2.88.2",
@@ -1789,6 +1790,11 @@
"node": ">= 0.8"
}
},
"node_modules/parse-ms-2": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-ms-2/-/parse-ms-2-1.0.0.tgz",
"integrity": "sha512-f7WNVL5s4hEhDVEqe+GO6p88AVMn7dvjE/My0Z48Das0bDbkLBDu21AH9sZtuE39OKkuAs1OEQrTv2Yaj9oIeQ=="
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -4130,6 +4136,11 @@
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
},
"parse-ms-2": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-ms-2/-/parse-ms-2-1.0.0.tgz",
"integrity": "sha512-f7WNVL5s4hEhDVEqe+GO6p88AVMn7dvjE/My0Z48Das0bDbkLBDu21AH9sZtuE39OKkuAs1OEQrTv2Yaj9oIeQ=="
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+1
View File
@@ -36,6 +36,7 @@
"express-session": "^1.17.3",
"memorystore": "^1.6.7",
"mongoose": "^6.5.0",
"parse-ms-2": "^1.0.0",
"passport": "^0.6.0",
"passport-discord": "^0.1.4",
"request": "^2.88.2",
+1 -1
View File
@@ -12,7 +12,7 @@ module.exports = {
"secondary-color": "#F5F5F5",
"blue-color": "#18191C",
"footer": "#27282D",
"button-primary": "5865F2"
"button-primary": "#5865F2"
},
fontFamily: {
sans: ["QuickSand", "sans-serif"],
+2
View File
@@ -15,6 +15,7 @@ var bot = require('./routers/bot');
var admin = require('./routers/admin');
var auth = require('./routers/auth');
var servers = require('./routers/servers');
var api = require('./routers/api');
var client = require('../index');
passport.serializeUser(function (user, done) {
done(null, user);
@@ -70,6 +71,7 @@ app.use('/bot', bot);
app.use('/admin', admin);
app.use('/auth', auth);
app.use('/server', servers);
app.use('/api', api);
// set up routes
app.get('/', async (req, res) => {
+55 -7
View File
@@ -619,6 +619,9 @@ video {
.float-right {
float: right;
}
.float-left {
float: left;
}
.m-8 {
margin: 2rem;
}
@@ -727,6 +730,27 @@ video {
.ml-5 {
margin-left: 1.25rem;
}
.ml-10 {
margin-left: 2.5rem;
}
.ml-16 {
margin-left: 4rem;
}
.ml-0 {
margin-left: 0px;
}
.ml-px {
margin-left: 1px;
}
.ml-auto {
margin-left: auto;
}
.ml-40 {
margin-left: 10rem;
}
.ml-36 {
margin-left: 9rem;
}
.block {
display: block;
}
@@ -996,6 +1020,9 @@ video {
.flex-wrap {
flex-wrap: wrap;
}
.place-content-end {
place-content: end;
}
.place-items-center {
place-items: center;
}
@@ -1032,6 +1059,9 @@ video {
.gap-6 {
gap: 1.5rem;
}
.gap-11 {
gap: 2.75rem;
}
.gap-x-0 {
-moz-column-gap: 0px;
column-gap: 0px;
@@ -1058,6 +1088,9 @@ video {
--tw-divide-opacity: 1;
border-color: rgb(243 244 246 / var(--tw-divide-opacity));
}
.self-end {
align-self: flex-end;
}
.overflow-hidden {
overflow: hidden;
}
@@ -1125,7 +1158,8 @@ video {
border-color: transparent;
}
.border-button-primary {
border-color: 5865F2;
--tw-border-opacity: 1;
border-color: rgb(88 101 242 / var(--tw-border-opacity));
}
.border-gray-300 {
--tw-border-opacity: 1;
@@ -1182,7 +1216,8 @@ video {
background-color: rgb(39 40 45 / var(--tw-bg-opacity));
}
.bg-button-primary {
background-color: 5865F2;
--tw-bg-opacity: 1;
background-color: rgb(88 101 242 / var(--tw-bg-opacity));
}
.bg-gray-50 {
--tw-bg-opacity: 1;
@@ -1382,6 +1417,9 @@ video {
.text-center {
text-align: center;
}
.text-end {
text-align: end;
}
.text-3xl {
font-size: 1.875rem;
line-height: 2.25rem;
@@ -1586,7 +1624,8 @@ video {
--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
}
.ring-button-primary {
--tw-ring-color: 5865F2;
--tw-ring-opacity: 1;
--tw-ring-color: rgb(88 101 242 / var(--tw-ring-opacity));
}
.ring-black {
--tw-ring-opacity: 1;
@@ -1743,7 +1782,8 @@ body {
}
.hover\:bg-button-primary:hover {
background-color: 5865F2;
--tw-bg-opacity: 1;
background-color: rgb(88 101 242 / var(--tw-bg-opacity));
}
.hover\:bg-blue-800:hover {
@@ -1756,6 +1796,11 @@ body {
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.hover\:text-blue-600:hover {
--tw-text-opacity: 1;
color: rgb(37 99 235 / var(--tw-text-opacity));
}
.hover\:text-gray-900:hover {
--tw-text-opacity: 1;
color: rgb(17 24 39 / var(--tw-text-opacity));
@@ -1882,7 +1927,8 @@ body {
}
.dark\:bg-button-primary {
background-color: 5865F2;
--tw-bg-opacity: 1;
background-color: rgb(88 101 242 / var(--tw-bg-opacity));
}
.dark\:bg-gray-700 {
@@ -1920,7 +1966,8 @@ body {
}
.dark\:hover\:bg-button-primary:hover {
background-color: 5865F2;
--tw-bg-opacity: 1;
background-color: rgb(88 101 242 / var(--tw-bg-opacity));
}
.dark\:hover\:bg-blue-700:hover {
@@ -1949,7 +1996,8 @@ body {
}
.dark\:focus\:ring-button-primary:focus {
--tw-ring-color: 5865F2;
--tw-ring-opacity: 1;
--tw-ring-color: rgb(88 101 242 / var(--tw-ring-opacity));
}
.dark\:focus\:ring-gray-500:focus {
Binary file not shown.

After

Width:  |  Height:  |  Size: 706 KiB

+13
View File
@@ -0,0 +1,13 @@
var express = require('express'),
router = express.Router();
var bots = require('../../../models/bot');
var votes = require('../../../models/votes');
const client = require('../../index');
var v1 = require('./v1');
router.use('/v1', v1);
router.get('/', function (req, res) {
res.redirect('/v1');
});
module.exports = router;
+134
View File
@@ -0,0 +1,134 @@
var express = require('express'),
router = express.Router();
var bots = require('../../../../models/bot');
var votes = require('../../../../models/votes');
var servers = require('../../../../models/server');
const client = require('../../../index');
router.get('/', function (req, res) {
res.json({
message: "Welcome to the bots API, please use /v1"
})
});
router.get('/search/:id', function (req, res) {
bots.findOne({ id: req.params.id }, function (err, bot) {
if (err) throw err;
if (!bot) {
servers.find()
return res.json({
message: "Bot not found"
});
}
res.json({
bot: bot,
})
router.use(function (req, res, next) {
if (!req.headers.authorization) {
return res.status(403).json({ error: 'No credentials sent!' });
} else {
bots.findOne({ token: req.headers.authorization }, function (err, bot) {
if (err) {
res.status(503).json({
error: "Something went wrong"
})
}
if (bot) {
if (bot.token == req.headers.authorization) {
next();
}
} else {
res.status(403).json({
error: "Unauthorized"
})
}
})
}
next();
});
router.post('/bots/servers', function (req, res) {
if (req.headers.authorization) {
bots.findOne({ token: req.headers.authorization }, function (err, bot) {
if (err) {
res.status(503).json({
error: "Something went wrong"
})
}
if (bot) {
if (bot.token == req.headers.authorization) {
bot.servers = req.headers.servercount;
bot.save(function (err) {
if (err) {
res.status(503).json({
error: "Something went wrong"
})
} else {
res.status(200).json({
message: "Success"
})
}
})
} else {
res.status(403).json({
error: "Invalid token or bot"
})
}
} else {
res.status(403).json({
error: "Invalid token or bot"
})
}
})
} else {
res.status(401).json({
message: "Please provide a bot token"
})
}
});
router.get('/bots/search/:id', function (req, res) {
bots.findOne({ id: req.params.id }, function (err, bot) {
if (err) {
res.status(503).json({
error: "Something went wrong"
})
}
if (bot) {
res.status(200).json({
id: bot.id,
name: bot.name,
description: bot.description,
long_description: bot.long_description,
tags: bot.tags,
owners: bot.owners,
premium: bot.premium,
servers: bot.servers,
users: bot.users,
votes: bot.votes
})
} else {
res.status(403).json({
error: "No bot found"
})
}
});
});
router.get('/bots/check/:id', function (req, res) {
votes.findOne({ user: req.params.id }, function (err, vote) {
if (err) {
res.status(503).json({
error: "Something went wrong"
})
}
if (vote) {
res.status(200).json({
vote: true
})
} else {
res.status(403).json({
vote: false
})
}
});
})
module.exports = router;
+1 -2
View File
@@ -36,7 +36,7 @@ router.get('/callback', passport.authenticate('discord', {
} catch { };
const embed = new client.embed()
.setTitle('User logged in')
.setDescription(`${req.user.username}#${req.user.discriminator} logged in\nID: ${req.user.id}\nEmail: ${req.user.email}`)
.setDescription(`${req.user.username}#${req.user.discriminator} logged in\nID: ${req.user.id}`)
.setColor('#0099ff')
.setTimestamp()
.setThumbnail("https://cdn.discordapp.com/avatars/" + req.user.id + "/" + req.user.avatar + ".png")
@@ -48,7 +48,6 @@ router.get('/logout', function (req, res) {
req.logout(function (err) {
if (err) { return next(err); }
req.session.destroy();
req.session.message = 'You have been logged out';
res.redirect('/');
});
});
+73 -2
View File
@@ -3,6 +3,17 @@ var express = require('express'),
var bots = require('../../../models/bot');
var votes = require('../../../models/votes');
const client = require('../../index');
function makeid(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() *
charactersLength));
}
return result;
}
router.get('/', function () {
return res.redirect('/bots');
})
@@ -16,9 +27,9 @@ router.get('/add', function (req, res) {
}
});
router.post('/add', function (req, res) {
router.post('/add', async function (req, res) {
if (req.user) {
var checkbot = bots.findOne({ id: req.body.id });
var checkbot = await bots.findOne({ id: req.body.id });
if (checkbot) {
req.session.error = "Bot already exists";
res.redirect('/');
@@ -37,6 +48,7 @@ router.post('/add', function (req, res) {
owners: owners,
description: req.body.bot_short,
tags: req.body.tags,
token: makeid(64),
});
bot.save(function (err) {
@@ -91,6 +103,65 @@ router.get('/:botID', async function (req, res) {
})
})
router.get('/:botID/settings', async function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
return res.redirect('/auth');
} else {
bots.findOne({ id: req.params.botID }, async function (err, bot) {
if (err) {
console.log(err);
return res.redirect('/');
}
if (!bot) {
req.session.error = "No bot found";
return res.redirect('/');
}
res.render('bot/edit', {
bot: bot,
user: req.user,
});
});
}
});
router.post('/:botID/settings', async function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
return res.redirect('/auth');
} else {
bots.findOne({ id: req.params.botID }, async function (err, bot) {
if (err) {
console.log(err);
return res.redirect('/');
}
if (!bot) {
req.session.error = "No bot found";
return res.redirect('/');
}
if(!bot.owners.includes(req.user.id)){
req.session.error = "You do not have permission to edit this bot";
return res.redirect('/');
}
bot.name = req.body.bot_name;
bot.description = req.body.bot_short;
bot.long_description = req.body.bot_description;
bot.save(function (err) {
if (err) {
console.log(err);
req.session.error = "Something went wrong";
res.redirect('/');
} else {
req.session.message = "Bot updated";
res.redirect('/');
}
});
});
}
});
router.get('/:botID/vote', async function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
+112 -2
View File
@@ -1,6 +1,7 @@
var express = require('express'),
router = express.Router();
var servers = require('../../../models/server');
var votes = require('../../../models/votes');
const client = require('../../../index');
const Discord = require('discord.js');
var showdown = require('showdown'),
@@ -102,10 +103,11 @@ router.get('/:server', function (req, res) {
})
})
router.get('/:server/edit', function (req, res) {
router.get('/:server/settings', function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
res.redirect('/auth');
return;
}
servers.findOne({ id: req.params.server }, function (err, server) {
if (err) {
@@ -135,7 +137,7 @@ router.get('/:server/edit', function (req, res) {
})
})
router.post('/:server/edit', async function (req, res) {
router.post('/:server/settings', async function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
res.redirect('/auth');
@@ -155,6 +157,7 @@ router.post('/:server/edit', async function (req, res) {
server.description = req.body.server_short;
server.long_description = req.body.server_description;
server.tags = req.body.tags;
server.webhook = req.body.server_webhook;
server.save(function (err) {
if (err) {
console.log(err);
@@ -175,4 +178,111 @@ router.post('/:server/edit', async function (req, res) {
}
})
})
router.get('/:server/vote', function (req, res) {
if (!req.user) {
req.session.backURL = req.originalUrl;
res.redirect('/auth');
} else {
servers.findOne({ id: req.params.server }, async function (err, bot) {
if (err) {
console.log(err);
return res.redirect('/');
}
if (!bot) {
req.session.error = "No bot found";
return res.redirect('/');
}
// check if users has already voted for this bot
votes.findOne({ user: req.user.id, server: bot.id }, function (err, vote) {
if (err) {
console.log(err);
return res.redirect('/');
}
if (vote) {
if (vote.date > Date.now() - (1000 * 60 * 60 * 24)) {
req.session.error = "You can only vote once per day";
return res.redirect('/');
}
vote.date = Date.now();
vote.save(function (err) {
if (err) {
console.log(err);
return res.redirect('/');
}
if (bot.votes) {
bot.votes = 1;
} else {
bot.votes++;
}
bot.save(function (err) {
if (err) {
console.log(err);
req.session.error = "Something went wrong";
return res.redirect('/');
}
})
if (bot.webhook) {
try {
var webhook = new Discord.WebhookClient({ url: bot.webhook });
webhook.send({
content: `${req.user.username} has voted for ${bot.name}`,
username: "BotsCord",
avatarURL: "https://botscord.xyz/img/logo.png"
});
} catch (e) {
console.log(e);
}
}
req.session.message = "Vote added";
return res.redirect('/');
})
} else {
// add vote to database
var vote = new votes({
user: req.user.id,
date: new Date(),
server: bot.id,
});
vote.save(function (err) {
if (err) {
console.log(err);
req.session.error = "Something went wrong";
return res.redirect('/');
} else {
if (bot.votes) {
bot.votes = 1;
} else {
bot.votes++;
}
bot.save(function (err) {
if (err) {
console.log(err);
req.session.error = "Something went wrong";
return res.redirect('/');
} else {
if (bot.webhook) {
try {
var webhook = new Discord.WebhookClient({ url: bot.webhook });
webhook.send({
content: `${req.user.username} has voted for ${bot.name}`,
username: "BotsCord",
avatarURL: "https://botscord.xyz/img/logo.png"
});
} catch (e) {
console.log(e);
}
}
req.session.message = "Vote added";
return res.redirect('/');
}
})
}
});
}
})
})
}
})
module.exports = router;
+33
View File
@@ -0,0 +1,33 @@
<%- include("../includes/header.ejs", {title: "Edit " + bot.name}) %>
<!-- create form -->
<div class="container-sm p-10">
<form method="post" action="">
<div class="relative z-0 mb-6 w-full group">
<textarea type="text" name="bot_description" id="bot_name" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " required rows="5"><%= bot.long_description %></textarea>
<label for="bot_name" class="peer-focus:font-medium absolute text-sm text-white dark:text-white duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Bot description </label>
</div>
<div class="relative z-0 mb-6 w-full group">
<input type="text" name="bot_short" id="floating_last_name" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " required value="<%= bot.description %>" />
<label for="bot_name" class="peer-focus:font-medium absolute text-sm text-white dark:text-white duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Short
Description (Will be show on home page)</label>
</div><br>
<h1 class="text-xl text-white">This token can be used to access your bot via our api</h1>
<a href="/docs/api" class="text-sm text-white hover:text-blue-600 underline ">
<h1 class="text-sm text-white hover:text-blue-600">Access api docs</h1>
</a>
<div class="relative z-0 mb-6 w-full group">
<input type="text" id="token" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " required value="<%= bot.token %>" onclick="copy()"/>
</div>
<script>
function copy() {
var copyText = document.getElementById("token");
copyText.select();
copyText.setSelectionRange(0, 99999);
navigator.clipboard.writeText(copyText.value);
alert("Copied your token");
}
</script>
<button type="submit" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">Update</button>
</form>
</div>
+2 -2
View File
@@ -14,12 +14,12 @@
Invite</a>
<% if(user) {
bot.owners.forEach(a=>{
if(a.id == user.id) {
if(a == user.id) {
%>
<div class="h6 mt-4">
<i class="fa fa-user-crown"></i>Owner Options
</div>
<a href="/bot/<%= bot.id %>/edit" class="button float-right"><i class="fa fa-edit"></i>
<a href="/bot/<%= bot.id %>/settings" class="button float-right"><i class="fa fa-edit"></i>
Edit</a>
<%
}
+9 -3
View File
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
@@ -17,6 +17,7 @@
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png">
<link rel="manifest" href="/img/site.webmanifest">
<!-- meta -->
<meta name="description"
content="BotsCord is a Discord bot that allows you to create your own Discord bot and have it run on your server.">
@@ -31,14 +32,19 @@
<meta property="og:type" content="website" />
<meta property="og:url" content="http://botscord.xyz" />
<meta property="og:image" content="http://botscord.xyz/img/logo.png" />
<meta property="og:description"
content="Botscord is a place where you can promote and vote for your favorite bot/server!" />
<meta property="og:description" content="Botscord is a place where you can promote and vote for your favorite bot/server!" />
<meta name="theme-color" content="#FF0000">
<meta name="author" content="BotsCord">
<meta name="robots" content="index, follow">
</head>
<body class="bg-primary-color">
<script>
console.log("%cBotsCord", "color: #FF0000; font-size: 50px; font-weight: bold;");
console.log("%cBotsCord is a Website that allows you to advertise your own Discord bot and have your users vote for it!.", "color: #FFFFF; font-size: 20px; font-weight: bold;");
console.log("%cDont paste anything in here..", "color: #FF0000; font-size: 10px; font-weight: bold;");
</script>
<div class="p-2 pl-5 pr-5 bg-blue-color">
<!-- navbar in tailwind with login buttons -->
<nav class="flex flex-wrap p-6 bg-blue-color">
+54 -39
View File
@@ -3,7 +3,7 @@
<div class="container-sm mx-auto px-3 mb-5 mt-1 h-fit p-1">
<div class="mb-3 mx-auto h-fit">
<span style="float: right; margin-right: 10%;" class="logo">
<img draggable="false" title="botscord.site" src="/img/logo.png" width="320" alt="Discord Bots | Discord Bot List">
<img draggable="false" title="botscord.site" src="/img/logo.webp" width="320" alt="Discord Bots | Discord Bot List">
</span>
<br><br>
<h1 class="text-xl" style="font-weight:800;color:#fff">BotsCord</h1>
@@ -52,10 +52,11 @@
<div class="grid columns items-center content-center justify-center grid-cols-1 gap-4 col-auto sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 m-8">
<% } %>
<% for(let i=0; i < nbots.length; i++) { if (i===3) break; var bot=nbots[i]; if(bot) { %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color ">
<img class="w-full rounded-full" src="https://cdn.discordapp.com/avatars/860390761307439114/2845a42b0c7868c3db29ea1996e84320.webp" alt="<%= bot.name %>">
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color " onclick="location.href='/bot/<%=bot.id%> ';" style="cursor: pointer;">
<img class="w-full rounded-full" src="<%= bot.icon %>" onerror="this.src='/img/logo.webp'" alt="<%= bot.name %>">
<div class="px-6 text-white text-base">
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <%if(bot.servers) { %><i class="fa fa-server"></i>: <%= bot.servers %><% } %></p>
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <%if(bot.servers) { %><i class="fa fa-server"></i>: <%= bot.servers %><% } %>
</p>
</div>
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2 text-white">
@@ -65,14 +66,6 @@
<%= bot.description %>
</p>
</div>
<div class="px-6 pt-4 pb-2">
<a href="/bot/<%= bot.id %>" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">
<i class="fa fa-eye" aria-hidden="true"></i> View
</a>
<a href="/bot/<%= bot.id %>/invite" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">
<i class="fa fa-link" aria-hidden="true"></i> Invite
</a>
</div>
<% if(bot.tags) {%>
<div class="px-6 pt-4 pb-2">
<% bot.tags.forEach(tag=>{ %>
@@ -103,10 +96,11 @@
<div class="grid columns items-center content-center justify-center grid-cols-1 gap-4 col-auto sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 m-8">
<% } %>
<% for(let i=0; i < nbots.length; i++) { if (i===3) break; var bot=nbots[i]; if(bot) { %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color ">
<img class="w-full rounded-full" src="https://cdn.discordapp.com/avatars/860390761307439114/2845a42b0c7868c3db29ea1996e84320.webp" alt="<%= bot.name %>">
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color " onclick="location.href='/bot/<%=bot.id%> ';" style="cursor: pointer;">
<img class="w-full rounded-full" src="<%= bot.icon %>" onerror="this.src='/img/logo.webp'" alt="<%= bot.name %>">
<div class="px-6 text-white text-base">
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <%if(bot.servers) { %><i class="fa fa-server"></i>: <%= bot.servers %><% } %></p>
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <%if(bot.servers) { %><i class="fa fa-server"></i>: <%= bot.servers %><% } %>
</p>
</div>
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2 text-white">
@@ -116,14 +110,6 @@
<%= bot.description %>
</p>
</div>
<div class="px-6 pt-4 pb-2">
<a href="/bot/<%= bot.id %>" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">
<i class="fa fa-eye" aria-hidden="true"></i> View
</a>
<a href="/bot/<%= bot.id %>/invite" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">
<i class="fa fa-link" aria-hidden="true"></i> Invite
</a>
</div>
<% if(bot.tags) {%>
<div class="px-6 pt-4 pb-2">
<% bot.tags.forEach(tag=>{ %>
@@ -153,10 +139,10 @@
<div class="grid columns items-center content-center justify-center grid-cols-1 gap-4 col-auto sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 m-8">
<% } %>
<% for(let i=0; i < nbots.length; i++) { if (i===3) break; var bot=nbots[i]; if(bot) { %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color ">
<img class="w-full rounded-full" src="https://cdn.discordapp.com/avatars/860390761307439114/2845a42b0c7868c3db29ea1996e84320.webp" alt="<%= bot.name %>">
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color " onclick="location.href='/server/<%=bot.id%> ';" style="cursor: pointer;">
<img class="w-full rounded-full" src="<%= bot.icon %>" onerror="this.src='/img/logo.webp'" alt="<%= bot.name %>">
<div class="px-6 text-white text-base">
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <%if(bot.members) { %><i class="fa fa-user"></i>: <%= bot.members %><% } %></p>
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <i class="fa fa-user"></i>: <%= global.bsl.guilds.cache.get(bot.id).memberCount.toLocaleString().replace(',', '.' ) %>
</p>
</div>
<div class="px-6 py-4">
@@ -188,6 +174,44 @@
<% } %>
</div>
</div>
<div class="bumpservers">
<div class="mx-auto text-center">
<br>
<h2 class="text-xl text-white text-center"><i class="fa fa-bomb" aria-hidden="true"></i> Bumped servers
</h2>
<p class="content text-white text-center" style="opacity:.6">Last bumped servers!</p>
</div>
<div class="grid columns items-center content-center justify-center grid-cols-1 gap-4 col-auto sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 m-8">
<% servers.sort((a, b) => b.bump - a.bump).slice(0, 5).map(bot => {
if(!bot) return; %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color " onclick="location.href='/server/<%=bot.id%> ';" style="cursor: pointer;">
<img class="w-full rounded-full" src="<%= bot.icon %> " onerror="this.src='/img/logo.webp'" alt="<%= bot.name %>">
<% if (bot.votes){ %>
<div class="px-6 text-white text-base">
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <i class="fa fa-user"></i>: <%= global.bsl.guilds.cache.get(bot.id).memberCount.toLocaleString().replace(',', '.' ) %><span class="float-right"><i class=" fa fa-bomb"></i>&nbsp;<%=bot.bump %></span>
</p>
</div>
<% } %>
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2 text-white">
<%= bot.name %>
</div>
<p class="text-white text-base">
<%= bot.description %>
</p>
</div>
<% if(bot.tags) {%>
<div class="px-6 pt-4 pb-2">
<% bot.tags.forEach(tag=>{ %>
<a href="/tag/<%= tag %>" class="inline-block bg-button-primary rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">#<%= tag %>
</a>
<% }) %>
</div>
<% } %>
</div>
<% }) %>
</div>
</div>
<div class="randomservers">
<% var nbots=servers
nbots.forEach((val, key) => {
@@ -205,12 +229,11 @@
<div class="grid columns items-center content-center justify-center grid-cols-1 gap-4 col-auto sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 m-8">
<% } %>
<% for(let i=0; i < nbots.length; i++) { if (i===3) break; var bot=nbots[i]; if(bot) { %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color ">
<img class="w-full rounded-full" src="<% bot.icon %> " onerror="this.src='/img/logo.png'" alt="<%= bot.name %>">
<% if (bot.votes || bot.members){ %>
<div class="transition-shadow ease-in-out duration-300 hover:shadow-blue-900 shadow-2xl rounded-lg max-w-sm bg-blue-color " onclick="location.href='/server/<%=bot.id%> ';" style="cursor: pointer;">
<img class="w-full rounded-full" src="<%= bot.icon %> " onerror="this.src='/img/logo.webp'" alt="<%= bot.name %>">
<% if (bot.votes){ %>
<div class="px-6 text-white text-base">
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes %> <i class="fa fa-user"></i>: <%= bot.members %>
</p>
<p><i class="fa-solid fa-check-to-slot"></i>: <%= bot.votes || 0 %> <i class="fa fa-user"></i>: <%= global.bsl.guilds.cache.get(bot.id).memberCount.toLocaleString().replace(',', '.' ) %></p>
</div>
<% } %>
<div class="px-6 py-4">
@@ -221,14 +244,6 @@
<%= bot.description %>
</p>
</div>
<div class="px-6 pt-4 pb-2">
<a href="/server/<%= bot.id %>" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2">
<i class="fa fa-eye" aria-hidden="true"></i> View
</a>
<a href="/server<%= bot.id %>/invite" class="inline-block bg-blue-700 rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2" data-toggle="tooltip" title="Join the server" data-placement="top">
<i class="fa fa-link" aria-hidden="true"></i> Join
</a>
</div>
<% if(bot.tags) {%>
<div class="px-6 pt-4 pb-2">
<% bot.tags.forEach(tag=>{ %>
+17
View File
@@ -12,6 +12,10 @@
<label for="server_name" class="peer-focus:font-medium absolute text-sm text-white dark:text-white duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Short
Description (Will be show on home page)</label>
</div>
<div class="relative z-0 mb-6 w-full group">
<input type="text" name="server_webhook" id="floating_last_name" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " value="<%= server.webhook %>" />
<label for="server_webhook" class="peer-focus:font-medium absolute text-sm text-white dark:text-white duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Discord WebHook to recieve votes.</label>
</div>
<div class="relative z-0 mb-6 w-full group">
<select multiple name="tags" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" required>
<option value="development">Development</option>
@@ -29,7 +33,20 @@
<option value="nsfw">NSFW</option>
<option value="challange">Challange</option>
</select>
</div><br>
<!--<h1 class="text-xl text-white">This token can be used to access your server via our api</h1>
<div class="relative z-0 mb-6 w-full group">
<input type="text" name="token" id="token" class="block py-2.5 px-0 w-full text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" placeholder=" " required value="<%= server.token %>" onclick="copy()" />
<label for="token" class="peer-focus:font-medium absolute text-sm text-white dark:text-white duration-300 transform -translate-y-6 scale-75 top-3 -z-10 origin-[0] peer-focus:left-0 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-6">Token</label>
</div>
<script>
function copy() {
var copyText = document.getElementById("token");
copyText.select();
copyText.setSelectionRange(0, 99999);
navigator.clipboard.writeText(copyText.value);
}
</script>-->
<button type="submit" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">Update</button>
</form>
</div>
+7 -6
View File
@@ -5,21 +5,22 @@
<pre><br><%= server.long_description %></pre>
</div>
<div class="bg-blue-color w-1/4 p-10 text-white h-full m-4 ">
<% console.log(serverr) %>
<img class="w-full rounded-full" src="<%= serverr.icon %>" alt="<%= server.name %>" onerror="this.src='/img/logo.png'">
<h1 class="text-3xl">
<%= server.name %>
</h1>
<a href="/server/<%= server.id %>/join" class="button float-right"><i class="fa fa-link"></i>
<a href="/server/<%= server.id %>/vote" class="button float-left inline-block bg-button-primary rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2"><i class="fa fa-link"></i>
Vote</a>
<a href="/server/<%= server.id %>/join" class="button float-right inline-block bg-button-primary rounded-full px-3 py-1 text-sm font-semibold text-white mr-2 mb-2"><i class="fa fa-link"></i>
Join</a>
<br>
<% if(user) { if(serverr.members.cache.get(user.id)) {
if(serverr.members.cache.get(user.id).permissions.has('ADMINISTRATOR')) { %>
<div class="h6 mt-4">
<i class="fa user-crown"></i>Owner Options
</div>
<a href="/server/<%= server.id %>/edit" class="mt-1">
<div class="box-2-p"><i class="mt-1 fa fa-pencil"></i></div>
<p class="box-2">Edit Server</p>
<a href="/server/<%= server.id %>/settings" class="mt-1">
<div class="box-2-p"><i class="mt-1 fa fa-pencil"></i><p class="box-2">Edit Server</p></div>
</a>
<% } } } %>
<h6 class="text-xl mt-4">
@@ -27,7 +28,7 @@
</h6>
<div class="mt-1">
<div class="box-2-p"><i class="mt-1 fa fa-users"></i></div>
<p class="box-2">Votes:&nbsp;<%= bot.votes || 0 %>
<p class="box-2">Votes:&nbsp;<%= server.votes || 0 %>
</p>
</div>
<div class="mt-1">