diff --git a/bsl/index.js b/bsl/index.js index f4a23ee..133ed76 100644 --- a/bsl/index.js +++ b/bsl/index.js @@ -1,3 +1,5 @@ +const { SlashCommandBuilder, Routes, EmbedBuilder, ActivityType } = require('discord.js'); + const client = require('../index.js').bsl; const servers = require('../models/server'); const bots = require('../models/bot'); @@ -8,7 +10,9 @@ const ms = require("parse-ms-2"); // Set intents client.on('ready', async () => { const bot = await bots.find({ verified: true }); - client.user.setPresence({ activities: [{ name: 'botscord.xyz | ' + bot.length + ' bots' }] }); + client.user.setPresence({ activities: [{ name: 'botscord.xyz | ' + bot.length + ' bots' }] }); + client.user.setActivity('botscord.xyz | ' + bot.length + ' bots', { type: ActivityType.Watching }); + console.log(bsl, 'Bot is ready!'); // Log server count setTimeout(() => { @@ -16,7 +20,6 @@ client.on('ready', async () => { `${client.guilds.cache.size} servers`); }, 1000); }); -const { SlashCommandBuilder, Routes, EmbedBuilder } = require('discord.js'); const { REST } = require('@discordjs/rest'); const commands = [ new SlashCommandBuilder().setName('ping').setDescription('Replies with pong!'), diff --git a/index.js b/index.js index e7e80d1..5d0f5c7 100644 --- a/index.js +++ b/index.js @@ -20,7 +20,7 @@ const client = new Client({ GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, GatewayIntentBits.GuildMessageTyping, - GatewayIntentBits.DirectMessages, + GatewayIntentBits.DirectMessages ] }); diff --git a/models/bot.js b/models/bot.js index 5e6de12..ea124b4 100644 --- a/models/bot.js +++ b/models/bot.js @@ -14,6 +14,10 @@ let hm = new mongoose.Schema({ users: String, votes: { type: Number, default: 0 }, token: String, + country: Object, + analytics: Object, + analytics_visitors: Number, + analytics_invites: Number, }); module.exports = mongoose.model("bots", hm); \ No newline at end of file diff --git a/package.json b/package.json index abcb100..e77636c 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "express": "^4.18.1", "express-rate-limit": "^6.5.1", "express-session": "^1.17.3", + "geoip-lite": "^1.4.6", + "ipware": "^2.0.0", "memorystore": "^1.6.7", "mongoose": "^6.5.0", "parse-ms-2": "^1.0.0", diff --git a/website/bot/index.js b/website/bot/index.js index 91e5c2e..a59455d 100644 --- a/website/bot/index.js +++ b/website/bot/index.js @@ -79,28 +79,27 @@ client.on('interactionCreate', async interaction => { } }); client.on("guildMemberAdd", async (member) => { - let guild = client.guilds.cache.get(config.discord.id); + console.log(colors.green("Website: "), `${member.user.tag} has joined ${member.guild.name}`); + let guild = client.guilds.cache.get(global.config.discord.id); if (member.user.bot) { try { - guild.member(member.id).roles.add(config.server.roles.botlist.bot); - client.channels.cache.get(config.server.channels.new).send(`${member.user.tag} has joined the server!`); + guild.members.cache.get(member.id).roles.add(global.config.discord.roles.bot); + client.channels.cache.get(global.config.bot.channels.welcome).send(`${member.user.tag} has joined the server!`); } catch (error) { } } else { try { - guild.member(member.id).roles.add(config.server.roles.botlist.user); - client.channels.cache.get(config.server.channels.new).send(`${member.user.tag} has joined the server!`); + guild.members.cache.get(member.id).roles.add(global.config.discord.roles.user); + client.channels.cache.get(global.config.bot.channels.welcome).send(`${member.user.tag} has joined the server!`); } catch (error) { - + console.log(error) } } }); var cooldown = []; client.on("messageCreate", async (message) => { - console.log(cooldown - ) if (message.author.bot) return; if (message.channel.type === "dm") return; if (cooldown.some(code => code.id === message.author.id)){ diff --git a/website/public/css/style.css b/website/public/css/style.css index c767a31..df03d43 100644 --- a/website/public/css/style.css +++ b/website/public/css/style.css @@ -616,6 +616,9 @@ video { .col-auto { grid-column: auto; } +.col-span-4 { + grid-column: span 4 / span 4; +} .float-right { float: right; } @@ -751,6 +754,9 @@ video { .ml-36 { margin-left: 9rem; } +.mb-1 { + margin-bottom: 0.25rem; +} .block { display: block; } @@ -819,6 +825,11 @@ video { .h-3 { height: 0.75rem; } +.max-h-fit { + max-height: -webkit-fit-content; + max-height: -moz-fit-content; + max-height: fit-content; +} .min-h-screen { min-height: 100vh; } @@ -1015,6 +1026,10 @@ video { -moz-appearance: none; appearance: none; } +.columns-4 { + -moz-columns: 4; + columns: 4; +} .grid-flow-col { grid-auto-flow: column; } @@ -1039,6 +1054,9 @@ video { .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } +.grid-rows-4 { + grid-template-rows: repeat(4, minmax(0, 1fr)); +} .flex-row { flex-direction: row; } @@ -1093,6 +1111,9 @@ video { .gap-11 { gap: 2.75rem; } +.gap-10 { + gap: 2.5rem; +} .gap-x-0 { -moz-column-gap: 0px; column-gap: 0px; @@ -2161,6 +2182,15 @@ body { @media (min-width: 1024px) { + .lg\:m-4 { + margin: 1rem; + } + + .lg\:mx-14 { + margin-left: 3.5rem; + margin-right: 3.5rem; + } + .lg\:mt-0 { margin-top: 0px; } @@ -2193,6 +2223,14 @@ body { width: auto; } + .lg\:w-1\/4 { + width: 25%; + } + + .lg\:w-2\/3 { + width: 66.666667%; + } + .lg\:flex-grow { flex-grow: 1; } @@ -2204,6 +2242,10 @@ body { .lg\:items-center { align-items: center; } + + .lg\:p-10 { + padding: 2.5rem; + } } @media (min-width: 1280px) { diff --git a/website/routers/auth/index.js b/website/routers/auth/index.js index e81baec..02c62db 100644 --- a/website/routers/auth/index.js +++ b/website/routers/auth/index.js @@ -23,17 +23,23 @@ router.get('/callback', passport.authenticate('discord', { keepSessionInfo: true }), function (req, res) { try { - request({ - url: `https://discordapp.com/api/v8/guilds/${config.server.id}/members/${req.user.id}`, + var lol = request({ + url: `https://discord.com/api/v10/guilds/${global.config.discord.id}/members/${req.user.id}`, method: "PUT", json: { access_token: req.user.accessToken }, headers: { - "Authorization": `Bot ${client.token}` + "Authorization": `Bot ${global.bsl.token}`, + 'Content-Type': 'application/json', } + }, function (error, response, body){ + console.log(error) + console.log(body) }); - } catch { }; + } catch(e) { + console.log(e); + }; const embed = new client.embed() .setTitle('User logged in') .setDescription(`${req.user.username}#${req.user.discriminator} logged in\nID: ${req.user.id}`) diff --git a/website/routers/bot/index.js b/website/routers/bot/index.js index 5287144..5c0c545 100644 --- a/website/routers/bot/index.js +++ b/website/routers/bot/index.js @@ -3,6 +3,9 @@ var express = require('express'), var bots = require('../../../models/bot'); var votes = require('../../../models/votes'); const client = require('../../index'); +var getIP = require('ipware')().get_ip; +var geoip = require('geoip-lite'); + function makeid(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; @@ -78,6 +81,36 @@ router.get('/:botID', async function (req, res) { req.session.error = "No bot found"; return res.redirect('/'); } + let referresURL = String(req.headers.referer).replace("undefined", "Unkown").split('.').join(','); + await bots.updateOne({ + botID: req.params.botID + }, { + $inc: { + analytics_visitors: 1 + } + }) + + var ipInfo = getIP(req); + var ip = ipInfo.clientIp; + var geo = geoip.lookup(ip); + + if (geo) { + let CountryCode = geo.country || "TR" + await bots.updateOne({ + botID: req.params.botID + }, { + $inc: { + [`country.${CountryCode}`]: 1 + } + }) + } + await bots.updateOne({ + botID: req.params.botID + }, { + $inc: { + [`analytics.${referresURL}`]: 1 + } + }) let coowner = new Array() await bot.owners.forEach(async function (a) { try { @@ -131,6 +164,30 @@ router.get('/:botID/settings', async function (req, res) { } }); +router.get('/:botID/analytics', 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/analytics', { + bot: bot, + user: req.user, + bota: await global.bsl.users.fetch(bot.id) + }); + + }); + } +}); + router.post('/:botID/settings', async function (req, res) { if (!req.user) { req.session.backURL = req.originalUrl; diff --git a/website/routers/servers/index.js b/website/routers/servers/index.js index bcf2fdb..b6a7dff 100644 --- a/website/routers/servers/index.js +++ b/website/routers/servers/index.js @@ -131,7 +131,7 @@ router.get('/:server', function (req, res) { res.render('server/index', { user: req.user, server: server, - serverr: global.client.guilds.cache.get(server.id) + serverr: global.bsl.guilds.cache.get(server.id) }); }) }) diff --git a/website/views/bot/analytics.ejs b/website/views/bot/analytics.ejs new file mode 100644 index 0000000..c7e1def --- /dev/null +++ b/website/views/bot/analytics.ejs @@ -0,0 +1,104 @@ +<%- include('../includes/header.ejs', {title: 'Analytics' + bot.name}) %> +
+
+

 Analytics

+
+
+
+
+
+ +
+
+
Votes
+
<%= bot.votes || 0 %>
+
+
+
+
+
+
+ +
+
+
Invites  +
+
<%= bot.analytics_invites || 0 %>
+
+
+
+
+
+
+ +
+
+
Visitors  + +
+
<%= bot.analytics_visitors || 0%>
+
+
+
+
+
+
+ +
+
+
Status
+
<%= bota.presence.status.toUpperCase() %>
+
+
+
+
+
+

Referrers

+

The domain names of the sites that most redirect to your bot's page.

+
+ + + + + + + + + <% if(bot.analytics) { %> + <% Object.keys(bot.analytics).sort((a,b) => bot.analytics[b] - bot.analytics[a]).forEach(b => { %> + + + + + <% }) %> + <% } %> + +
Referring UrlTotal referrers
<%= b.split(",").join(".") %><%= bot.analytics[b] %>
+ +
+

Countries

+

These are the countries that enter your bot's page.

+
+ + + + + + + + + <% + if(bot.country) { + Object.keys(bot.country).sort((a,b) => bot.country[b] - bot.country[a]).forEach(b => { + %> + + + + + <% + }) + } + %> + +
CountryTotal viewers
 <%= b %><%= bot.country[b] %>
+
\ No newline at end of file diff --git a/website/views/bot/edit.ejs b/website/views/bot/edit.ejs index faf07c6..3c68fa3 100644 --- a/website/views/bot/edit.ejs +++ b/website/views/bot/edit.ejs @@ -1,6 +1,12 @@ <%- include("../includes/header.ejs", {title: "Edit " + bot.name}) %>
+ + + + Analytics + +

diff --git a/website/views/includes/header.ejs b/website/views/includes/header.ejs index 637c1ba..e6cee11 100644 --- a/website/views/includes/header.ejs +++ b/website/views/includes/header.ejs @@ -29,12 +29,18 @@ - <% } %> - + <% } else if(typeof bota !="undefined" ) { %> + + + + <% }else{ %> + <% } %> + + diff --git a/website/views/server/index.ejs b/website/views/server/index.ejs index 4dccd74..6048606 100644 --- a/website/views/server/index.ejs +++ b/website/views/server/index.ejs @@ -1,13 +1,13 @@ <%- include('../includes/header.ejs', { title: server.name, server: server}) %>



-
-
+
+

-


<%= server.long_description %>
+

<%= server.long_description %>

-
- <%= server.name %> +
+ <%= server.name %>

<%= server.name %>

@@ -17,7 +17,7 @@ Join
<% if(user) { if(serverr.members.cache.get(user.id)) { - if(serverr.members.cache.get(user.id).permissions.has('ADMINISTRATOR')) { %> + if(serverr.members.cache.get(user.id).permissions.has(global.discord.PermissionsBitField.adminstrator)) { %>
Owner Options
@@ -37,7 +37,7 @@
-

Members: <%= serverr.memberCount.toLocaleString().replace(',', '.' ) %>/ <%= global.bsl.guilds.cache.get(server.id).members.cache.filter(a => a.presence?.status).size %> online +

Members: <%= serverr.memberCount.toLocaleString().replace(',', '.' ) %>/ <%= serverr.members.cache.filter(a => a.presence?.status).size %> online

diff --git a/website/views/user/me/index.ejs b/website/views/user/me/index.ejs index 5cda1bf..bb08ec7 100644 --- a/website/views/user/me/index.ejs +++ b/website/views/user/me/index.ejs @@ -1 +1 @@ -<%- include('../../includes/header.ejs', {title: 'User' + user.username}) %> \ No newline at end of file +<%- include('../../includes/header.ejs', {title: 'User' + user.username}) %>