Skip to content

Commit

Permalink
rewritten for a new api (or not?)
Browse files Browse the repository at this point in the history
  • Loading branch information
mirdukkkkk committed Feb 7, 2024
1 parent 59785cc commit c42b35f
Show file tree
Hide file tree
Showing 15 changed files with 189 additions and 109 deletions.
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,24 @@
3. Save the changes, and start bot with `npm run prod` command

## settings.json form
```js
```json
{
"database": "",
"dbname": "pixelbattle",
"token": "",
"insideToken": "",
"api_domain": "",
"owner": [],
"prefix": "p!"
"prefix": "p!",
"SYSTEM_TOKEN": ""
}
```
where:
`database` - mongodb url connection string
`dbname` - name of the database where the data will be stored
`token` - Discord bot token, get [here (DDevs)](https://discord.com/developers/applications)
`insideToken` - token used for communication between the bot and the API
`api_domain` - API domain with protocol
`owner` - array with discord account IDs, used for special commands
`prefix` - prefix used by the bot
`prefix` - prefix used by the bot
`SYSTEM_TOKEN` - bot user token in the database (you must create it yourself)
4 changes: 3 additions & 1 deletion settings.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
{
"database": "",
"dbname": "pixelbattle",
"token": "",
"insideToken": "",
"api_domain": "",
"owner": [],
"prefix": "p!"
"prefix": "p!",
"SYSTEM_TOKEN": ""
}
10 changes: 6 additions & 4 deletions src/commands/BaninfoCommand.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
const PixelCommand = require('../structures/PixelCommand');
//const BansManager = require('../managers/BansManager');
const { EmbedBuilder } = require('discord.js');

class BaninfoCommand extends PixelCommand {
Expand All @@ -19,11 +18,14 @@ class BaninfoCommand extends PixelCommand {

const msg = await message.reply({ content: 'Поиск данных об игроке...' });

const manager = new BansManager(message.client);
const ban = await manager.find({ userID: user.id });
const ban = (await message.client.database.collection('users').findOne(
{ userID: user.id },
{ projection: { _id: 0, banned: 1 } }
))?.banned;
if(!ban)
return msg.edit({ content: 'Указанный вами игрок не находится в бане' });
const moderator = message.client.users.cache.get(ban.moderatorID) || await message.client.users.fetch(ban.moderatorID).catch(() => {});
const moderator = message.client.users.cache.get(ban.moderatorID) || await message.client.users.fetch(ban.moderatorID)
.catch(() => {});

return msg.edit({
content: null,
Expand Down
20 changes: 13 additions & 7 deletions src/commands/ClearCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class ClearCommand extends PixelCommand {
}

async run(message, args) {
if(!message.client.permissions.admin.includes(message.author.id))
if(!message.client.permissions.admin.has(message.author.id))
return message.reply({ content: 'Вы не являетесь создателем проекта/администратором, доступ к команде ограничен' });
const color = (args[0] ?? '#FFFFFF');
if(!hexRegExp.test(color))
Expand All @@ -26,20 +26,26 @@ class ClearCommand extends PixelCommand {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + (await message.client.database.collection('users').findOne(
{ userID: message.author.id },
{ projection: { token: 1 } }
)).token
{ projection: { _id: 0, token: 1 } }
))?.token
},
body: JSON.stringify({
color
})
}).then(res => res.json());
}).then(res => res.json()).catch(() => {});

if(data?.error ?? !data)
return msg.edit({
content: `API PixelBattle недоступно в данный момент, регенерация холста не возможна\n`
if(data?.error ?? !data) {
if(data?.reason === 'NotEnoughPrivileges') return msg.edit({
content: 'Судя по всему, в кэше API Pixel Battle вы не являетесь модератором или выше\n'
+ codeBlock('json', JSON.stringify(data))
});

return msg.edit({
content: 'API PixelBattle недоступно в данный момент, регенерация холста не возможна\n'
+ codeBlock('json', JSON.stringify(data || null))
});
}

return msg.edit({ content: `Холст ${data.canvas.width}x${data.canvas.height} был успешно очищен! Как его цвет был установлен - \`${color}\`` });
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/commands/EvalCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class EvalCommand extends PixelCommand {
let isAsync = false;

try {
if(!message.client.permissions.special.includes(message.author.id))
if(!message.client.permissions.special.has(message.author.id))
return message.react('❌');
if(!code)
return message.reply({ content: 'Введите код, который необходимо выполнить!' });
Expand All @@ -37,9 +37,9 @@ class EvalCommand extends PixelCommand {
)
)
}
message.reply({ content: Discord.codeBlock('js', executed) });
return message.reply({ content: Discord.codeBlock('js', executed) });
} catch(error) {
message.reply({ content: Discord.codeBlock('js', error) });
return message.reply({ content: Discord.codeBlock('js', error) });
}
}
}
Expand Down
51 changes: 36 additions & 15 deletions src/commands/ModCommand.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const PixelCommand = require('../structures/PixelCommand');
const fetch = require('node-fetch');
const { codeBlock } = require('discord.js');

class ModeratorCommand extends PixelCommand {
constructor() {
Expand All @@ -10,37 +11,57 @@ class ModeratorCommand extends PixelCommand {
}

async run(message, args) {
// further development
if(!message.client.permissions.special.includes(message.author.id))
if(!message.client.permissions.special.has(message.author.id))
return message.react('❌');
if(!(['add', 'remove'].includes(args[0])))
return message.reply({ content: `Используйте только add/remove` });

const user = message.mentions.members.first()?.id || args[1];
if(!user)
return message.reply({ content: 'Укажите участника для проведения действия' });
const action = (args[0] != 'remove');
if(action === message.client.permissions.moderator.includes(user))
const action = (args[0] !== 'remove');
if(action === message.client.permissions.moderator.has(user))
return message.reply({ content: `Указанный вами модератор уже **${action ? 'является' : 'не является'}** модератором` });

message.client.moderators[action ? 'set' : 'delete'](user, { userID: user });
if(action) message.client.database.collection('moderators')
.updateOne({ userID: user }, { $set: { warns: 0 } }, { upsert: true });
else message.client.database.collection('moderators')
.deleteOne({ userID: user });
const msg = await message.reply(`Смена роли игрока \`${user}\` в процессе...`);

fetch(`${message.client.config.api_domain}/moderators/${user}/edit`, {
const request = await fetch(`${message.client.config.api_domain}/moderators/${user}/edit`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: message.client.config.insideToken,
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + (await message.client.database.collection('users').findOne(
{ userID: message.author.id },
{ projection: { _id: 0, token: 1 } }
)).token
},
body: JSON.stringify({
action
})
});
}).then(res => res?.json()).catch(() => {});

if(request?.error ?? !request) {
if(request?.reason === 'NotEnoughPrivileges') return msg.edit({
content: 'Смена роли не удалась! Возможная причина: ваша роль в API PixelBattle не является админской (2)\n'
+ codeBlock('json', JSON.stringify(request))
});

return msg.edit({
content: 'Смена роли не удалась!\n'
+ codeBlock('json', JSON.stringify(request ?? null))
});
}

message.client.permissions.moderator[action ? 'add' : 'delete'](user);
message.client.database.collection('users')
.updateOne(
{ userID: user },
{ $set: { role: Number(action) } },
{ upsert: true }
);

message.guild.members.cache.get(user).roles[action ? 'add' : 'remove']('969950074874515476').catch(() => {});

return message.reply({ content: `Модератор <@${user}> был успешно **${action ? 'назначен' : 'снят'}**!` });
return msg.edit({ content: `Модератор <@${user}> был успешно **${action ? 'назначен' : 'снят'}**!` });
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/commands/PointsCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class PointsCommand extends PixelCommand {
switch(args[0]) {
case 'edit':
case 'change': {
if(!message.client.permissions.special.includes(message.author.id))
if(!message.client.permissions.special.has(message.author.id))
{ message.react('❌'); break; }

const change = Number(args[1]);
Expand All @@ -35,7 +35,7 @@ class PointsCommand extends PixelCommand {
case 'leaders':
case 'leader': {
const msg = await message.reply({ content: 'Идёт построение таблицы лидеров...' });
let users = await message.client.database.collection('users').find({}, { userID: 1, username: 1, points: 1 }).toArray();
let users = await message.client.database.collection('users').find({}, { userID: 1, points: 1 }).toArray();
users = users.filter(u => u.points !== 0);

let i = 1;
Expand Down Expand Up @@ -68,7 +68,7 @@ class PointsCommand extends PixelCommand {
.setDescription(
`> Итоговое количество баллов: \`${data?.points || 0}\``
)
.setFooter({ text: message.client.constants.phrases.random() })
.setFooter({ text: 'Система баллов лишь до сих пор готовится, не обожгись :D'/*message.client.constants.phrases.random()*/ })
.setTimestamp()
]
});
Expand Down
77 changes: 40 additions & 37 deletions src/commands/TokenCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,63 +13,66 @@ class TokenCommand extends PixelCommand {
}

async run(message, args) {
if(!message.client.moderators.has(message.author.id))
if(!message.client.permissions.moderator.has(message.author.id))
return message.reply({ content: 'Вы не являетесь модератором чтобы использовать эту команду!' });

switch(args[0]) {
case 'ban':
case 'unban': {
const manager = new BansManager(message.client);
const action = (args[0] == 'unban') ? false : true;
const action = (args[0] !== 'unban');
const user = message.mentions.users.first() || message.client.users.cache.get(args[action ? 2 : 1]) || await message.client.users.fetch(args[action ? 2 : 1]).catch(() => {});

if(action) {
var time = args[1];
if(!ms(time))
var timeout = args[1];
if(!ms(timeout))
{ message.reply({ content: 'Укажите правильную длительность бана, например \`28d\`' }); break; };
if(!ms(time) || ms(time) > ms('2000d') || ms(time) < ms('1s'))
if(!ms(timeout) || ms(timeout) > ms('2000d') || ms(timeout) < ms('1s'))
{ message.reply({ content: 'Минимальная длительность бана - 1 секунда, максимальная - 2000 дней' }); break; };

time = ms(time);
timeout = ms(timeout) + Date.now();
}

if(!user)
{ message.reply({ content: 'Указанный вами игрок не был найден' }); break; };
if(message.client.moderators.has(user.id) && (message.author.id !== message.client.config.owner))
{ message.reply({ content: `Вы не можете проводить это действие с модератором` }); break; };
if(message.client.permissions.moderator.has(user.id) && !message.client.permissions.special.has(message.author.id))
{ message.reply({ content: `Вы не можете проводить это действие с модератором` }); break; }

const reason = args.slice(action ? 3 : 2).join(' ') || null;
const assumption = await manager.find({ userID: user.id });
const assumption = (await message.client.database.collection('users').findOne({ userID: user.id }, { projection: { _id: 0, banned: 1 } }))?.banned;
if(action ? assumption : !assumption)
{ message.reply({ content: `Вы не можете ${action ? 'забанить' : 'разбанить'} человека, который уже ${action ? '' : 'не '}в бане` }); break; };
{ message.reply({ content: `Вы не можете ${action ? 'забанить' : 'разбанить'} человека, который уже ${action ? '' : 'не '}в бане` }); break; }

const msg = await message.reply({ content: 'Производятся записи в базе данных и сервере Pixel Battle...' });
const msg = await message.reply({ content: 'Производятся записи в базе данных и API Pixel Battle...' });

fetch(`${message.client.config.api_domain}/bans/${user.id}/edit`, {
fetch(`${message.client.config.api_domain}/users/${user.id}/${args[0]}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: message.client.config.insideToken,
action
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + (await message.client.database.collection('users').findOne(
{ userID: message.author.id },
{ projection: { _id: 0, token: 1 } }
))?.token
},
body: JSON.stringify({
timeout,
reason
})
});

switch(action) {
case true:
await manager.create({
userID: user.id,
moderatorID: message.author.id,
timeout: Date.now() + time,
reason
});
break;

case false:
await manager.delete({
userID: user.id
});
break;
}
await message.client.database.collection('users').updateOne(
{
userID: user.id
},
{
$set: {
banned: action ? {
moderatorID: message.author.id,
timeout,
reason
} : null
}
}
)

msg.edit({
content: null,
Expand All @@ -81,7 +84,7 @@ class TokenCommand extends PixelCommand {
`> Модератор: \`${message.author.globalName || message.author.username} (${message.author.id})\`\n` +
`> ${action ? 'Забанил' : 'Разбанил'}: \`${user.globalName || user.username} (${user.id})\`\n` +
`> По причине: \`${reason || 'не указана'}\`\n` +
`${action ? `> Бан истекает: <t:${Math.floor((Date.now() + time) / 1000)}>` : ''}`
`${action ? `> Бан истекает: <t:${Math.floor(timeout / 1000)}>` : ''}`
)
.addFields(
[
Expand All @@ -101,19 +104,19 @@ class TokenCommand extends PixelCommand {
case 'regenerate':
case 'regen':
case 'r': {
if(!message.client.config.owner.includes(message.author.id)) return message.react('❌');
if(!message.client.permissions.special.has(message.author.id)) return message.react('❌');

const user = message.mentions.users.first() || message.client.users.cache.get(args[1]) || await message.client.users.fetch(args[1]).catch(() => {});
if(!user)
{ message.reply({ content: `Укажите игрока для проведения регенерации токена` }); break; };

const data = await message.client.database.collection('users').findOne({ userID: user.id }, { projection: { _id: 0, token: 1 } });
if(!data) { message.reply({ content: `Не найдено записи о данном игроке в базе данных` }); break; };
if(!data) { message.reply({ content: `Не найдено записи о данном игроке в базе данных` }); break; }

message.client.database.collection('users').updateOne({ userID: user.id },
{
$set: {
token: message.client.functions.generateToken(parseInt(data.token.split('.')[1], 36)),
token: message.client.functions.generateToken(parseInt(data.token.split('.')[2], 36)),
}
}
);
Expand Down
Loading

0 comments on commit c42b35f

Please sign in to comment.