From acda415073d2604dab55a2b74133118c3e582cff Mon Sep 17 00:00:00 2001 From: LJ5O <75009579+LJ5O@users.noreply.github.com> Date: Fri, 20 Jan 2023 21:04:22 +0100 Subject: [PATCH 01/14] Create data_storage_functions.js These functions will allow us to manage the stored variables --- modules/data_storage_functions.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 modules/data_storage_functions.js diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js new file mode 100644 index 0000000..697baaa --- /dev/null +++ b/modules/data_storage_functions.js @@ -0,0 +1,29 @@ +'use-strict'; + +//Functions used to manage saved data in database + +module.exports = { + + saveValueInStorage: async function(database_pool, logger, serverId, storageName, key, value){ + /* Save a new value in a server's storage */ + database_pool.query("INSERT INTO stored_data (storage_id, data_key, data) VALUES ( (SELECT storage_id FROM data_storage WHERE server_id = $1 AND storage_name = $2), $3, $4);", + [serverId, storageName, key, value.toString()]) + .catch((err)=>{ + logger.error("Error while saving data in data storage for server "+serverId+" : "+err); + }); + + }, + + getValueInStorage: async function(database_pool, logger, serverId, storageName, key){ + /* Get a value stored in a data storage from database */ + try{ + const row = (await database_pool.query("SELECT d.data, s.storage_is_int FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3;", + [serverId, storageName, key])).rows[0]; + return row; + }catch(err){ + logger.error("Error while saving data in data storage for server "+serverId+" : "+err); + return undefined; + } + } + +} From 5705ffc19a6f68681ba0687ce89a4a20214a0e31 Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Tue, 24 Jan 2023 00:21:40 +0100 Subject: [PATCH 02/14] DataStorage functions are now added to sandbox These functions shouldn't be modifiable in sandbox. Database_pool object is used in these functions, but isn't accessible in sandbox --- modules/event_functions.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/modules/event_functions.js b/modules/event_functions.js index 30c6251..fa0db2e 100644 --- a/modules/event_functions.js +++ b/modules/event_functions.js @@ -5,6 +5,7 @@ const {NodeVM} = require('vm2');//Sandbox const get_sandbox = require('./init_sandbox.js').getSandbox;//Return a sandbox when called with object containing shared vars as arg const get_help_embed = require('./help_embed.js');//Return an embed that explain how to use the bot +const data_storage_functions = require('./data_storage_functions.js');//Functions used to manage data saved in database const Discord = require('discord.js'); //Alls these var must be declared when executing generated code. These var are created at code generation ( Blockly ) Functions used by blocks can also be added here @@ -38,6 +39,20 @@ async function didBotDidIt(guild, eventType){ return false;//An user did it } +//Function that will add the object that allow us to manage stored data in database to sandbox +function addDataStorageObject(vm, database_pool, logger, serverId){ + let dataStorage = { + saveValue: async function(storageName, key, value){//Pool, logger, and server_id shouldn't be editable in sandbox. + data_storage_functions.saveValueInStorage(database_pool, logger, serverId, storageName, key, value); + }, + getValue: async function(storageName, key){ + return await data_storage_functions.getValueInStorage(database_pool, logger, serverId, storageName, key); + } + }; + + vm.freeze(dataStorage, 'dataStorage'); +} + module.exports = { @@ -63,7 +78,7 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", we found a command to run !"); const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, interaction:interaction});//A sandbox is created in module init_sandbox.js - + addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); //We will delay the answer and start the sandbox : await interaction.deferReply({ ephemeral: res.rows[0].ephemeral }); vm.run(globalVars+"async function a(){"+res.rows[0].code+"};a();"); @@ -107,6 +122,7 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventMessage:eventMessage});//A sandbox is created in module init_sandbox.js + addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); for(let i=0; i Date: Wed, 25 Jan 2023 00:32:58 +0100 Subject: [PATCH 03/14] Refactored sandbox functions Removed sandbox declarations from event_functions, and moved them in a new module. This will allow us to avoid multiple sandbox declarations, and make our work easier --- modules/event_functions.js | 161 ++++++++++--------------------------- modules/init_sandbox.js | 22 ----- modules/sandbox.js | 51 ++++++++++++ 3 files changed, 94 insertions(+), 140 deletions(-) delete mode 100644 modules/init_sandbox.js create mode 100644 modules/sandbox.js diff --git a/modules/event_functions.js b/modules/event_functions.js index fa0db2e..2b08d7d 100644 --- a/modules/event_functions.js +++ b/modules/event_functions.js @@ -3,18 +3,11 @@ /* Functions executed on guilds events are defined here */ const {NodeVM} = require('vm2');//Sandbox -const get_sandbox = require('./init_sandbox.js').getSandbox;//Return a sandbox when called with object containing shared vars as arg +const run_code_in_sandbox = require('./sandbox.js').runCodeInSandbox;//Run code in a sandbox const get_help_embed = require('./help_embed.js');//Return an embed that explain how to use the bot const data_storage_functions = require('./data_storage_functions.js');//Functions used to manage data saved in database const Discord = require('discord.js'); -//Alls these var must be declared when executing generated code. These var are created at code generation ( Blockly ) Functions used by blocks can also be added here -const globalVars = `let embedMessage,createdTextChannel,createdVoiceChannel,sentMessage,createdThreadOnMessage,createdRank;let temporaryStorage = {}; - /*Functions*/ function colourRandom() {let num = Math.floor(Math.random() * Math.pow(2, 24));return '#' + ('00000' + num.toString(16)).substr(-6);} - function mathRandomInt(min, max){return Math.floor(Math.random() * (max - min + 1) + min)}; - const sleep = ms => new Promise(r => {if(ms>5000){throw('Timeout too long !')}setTimeout(r, ms)}); - function strToInt(str){if(/^[0-9]{1,16}$/.test(str)){return(parseInt(str));}else{return(-1);}}`; - //SQL request to get code to execute, $n are defined when executing this request const sqlRequest = "SELECT code FROM server_code WHERE server_id = $1 AND action_type = $2 AND active = TRUE;"; @@ -39,21 +32,6 @@ async function didBotDidIt(guild, eventType){ return false;//An user did it } -//Function that will add the object that allow us to manage stored data in database to sandbox -function addDataStorageObject(vm, database_pool, logger, serverId){ - let dataStorage = { - saveValue: async function(storageName, key, value){//Pool, logger, and server_id shouldn't be editable in sandbox. - data_storage_functions.saveValueInStorage(database_pool, logger, serverId, storageName, key, value); - }, - getValue: async function(storageName, key){ - return await data_storage_functions.getValueInStorage(database_pool, logger, serverId, storageName, key); - } - }; - - vm.freeze(dataStorage, 'dataStorage'); -} - - module.exports = { interactionCreate: async(interaction, logger, database_pool)=>{ @@ -76,12 +54,10 @@ module.exports = { } logger.debug("Got SQL result for "+CURRENT_GUILD.id+", we found a command to run !"); - - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, interaction:interaction});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); //We will delay the answer and start the sandbox : await interaction.deferReply({ ephemeral: res.rows[0].ephemeral }); - vm.run(globalVars+"async function a(){"+res.rows[0].code+"};a();"); + run_code_in_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, interaction:interaction}, + database_pool, logger, res.rows); }) .catch(err =>{//Got an error while getting data from database or while executing code @@ -121,11 +97,7 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventMessage:eventMessage});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -152,11 +124,7 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventMessage:eventMessage});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -183,11 +151,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventOldMessage:eventOldMessage, eventNewMessage:eventNewMessage});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -209,11 +174,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -235,11 +197,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -263,11 +222,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventOldUser:eventOldUser, eventNewUser:eventNewUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -305,11 +261,9 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventVoiceChannel:eventVoiceChannel, eventTextChannel:eventTextChannel, eventThreadChannel:eventThreadChannel});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -345,11 +299,9 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventVoiceChannel:eventVoiceChannel, eventTextChannel:eventTextChannel, eventThreadChannel:eventThreadChannel});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -397,13 +349,10 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, + run_code_in_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventOldVoiceChannel:eventOldVoiceChannel, eventNewVoiceChannel:eventNewVoiceChannel, eventOldTextChannel:eventOldTextChannel, - eventNewTextChannel:eventNewTextChannel, eventOldThreadChannel:eventOldThreadChannel, eventNewThreadChannel:eventNewThreadChannel});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -427,11 +376,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventRole:eventRole});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -455,11 +401,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventRole:eventRole});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -483,11 +426,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventOldRole:eventOldRole, eventNewRole:eventNewRole});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -510,11 +450,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -536,11 +473,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -578,11 +512,9 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventReaction:eventReaction, eventMessage:eventMessage, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -620,11 +552,9 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventReaction:eventReaction, eventMessage:eventMessage, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -651,11 +581,9 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventOldVoiceChannel:eventOldVoiceChannel, eventNewVoiceChannel:eventNewVoiceChannel, eventUser:eventUser});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code @@ -683,11 +611,8 @@ module.exports = { logger.debug("Got SQL result for "+CURRENT_GUILD.id+", codes to execute : "+res.rows.length); - const vm = get_sandbox({CURRENT_GUILD:CURRENT_GUILD, Discord:Discord, eventUser:eventUser, eventTextChannel:eventTextChannel});//A sandbox is created in module init_sandbox.js - addDataStorageObject(vm, database_pool, logger, CURRENT_GUILD.id); - for(let i=0; i{//Got an error while getting data from database or while executing code diff --git a/modules/init_sandbox.js b/modules/init_sandbox.js deleted file mode 100644 index af15bbe..0000000 --- a/modules/init_sandbox.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; -const {NodeVM} = require('vm2');//Sandbox - -module.exports = { - - //Get the sandbox object for a vm and return the created vm - //https://github.com/patriksimek/vm2#nodevm - getSandbox: function(args){ - - return new NodeVM({ - //console: 'inherit', //Show console - console: 'off', - sandbox: args, - eval: false, - wasm: false, - nesting: false, - require: false, - strict: true - }); - } - -} diff --git a/modules/sandbox.js b/modules/sandbox.js new file mode 100644 index 0000000..5c378fd --- /dev/null +++ b/modules/sandbox.js @@ -0,0 +1,51 @@ +'use strict'; +const {NodeVM} = require('vm2');//Sandbox +const data_storage_functions = require('./data_storage_functions.js');//Functions used to manage data saved in database + +//Alls these var must be declared when executing generated code. These var are created at code generation ( Blockly ) Functions used by blocks can also be added here +const globalVars = `let embedMessage,createdTextChannel,createdVoiceChannel,sentMessage,createdThreadOnMessage,createdRank;let temporaryStorage = {}; + /*Functions*/ function colourRandom() {let num = Math.floor(Math.random() * Math.pow(2, 24));return '#' + ('00000' + num.toString(16)).substr(-6);} + function mathRandomInt(min, max){return Math.floor(Math.random() * (max - min + 1) + min)}; + const sleep = ms => new Promise(r => {if(ms>5000){throw('Timeout too long !')}setTimeout(r, ms)}); + function strToInt(str){if(/^[0-9]{1,16}$/.test(str)){return(parseInt(str));}else{return(-1);}}`; + +//Function that will add the object that allow us to manage stored data in database to sandbox +function addDataStorageObject(vm, database_pool, logger, serverId){ + const dataStorage = { + saveValue: async function(storageName, key, value){//Pool, logger, and server_id shouldn't be editable in sandbox. + data_storage_functions.saveValueInStorage(database_pool, logger, serverId, storageName, key, value); + }, + getValue: async function(storageName, key){ + return await data_storage_functions.getValueInStorage(database_pool, logger, serverId, storageName, key); + } + }; + + vm.freeze(dataStorage, 'dataStorage'); +} + +module.exports = { + + //Create the sandbox, add neccessary variables in it, and run code + //https://github.com/patriksimek/vm2#nodevm + runCodeInSandbox: function(args, database_pool, logger, sqlRows){ + + let vm = new NodeVM({ + //console: 'inherit', //Show console + console: 'off', + sandbox: args,//Must at least contain CURRENT_GUILD, server that triggered an event + eval: false, + wasm: false, + nesting: false, + require: false, + strict: true + }); + + addDataStorageObject(vm, database_pool, logger, args.CURRENT_GUILD.id);//Used to manage data in database + + for(let i=0; i Date: Wed, 25 Jan 2023 19:22:30 +0100 Subject: [PATCH 04/14] Update data_storage_functions.js Fixed some bugs with getValueInStorage function --- modules/data_storage_functions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 697baaa..d283b0d 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -19,9 +19,9 @@ module.exports = { try{ const row = (await database_pool.query("SELECT d.data, s.storage_is_int FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3;", [serverId, storageName, key])).rows[0]; - return row; + return (row ? row.data : null); }catch(err){ - logger.error("Error while saving data in data storage for server "+serverId+" : "+err); + logger.error("Error while getting data from data storage for server "+serverId+" : "+err); return undefined; } } From ef8e2f475fafd64ea0f13bf6d6b0c7a1951cbb87 Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Tue, 28 Feb 2023 23:16:48 +0100 Subject: [PATCH 05/14] Added new sql function to update variables values Check in WebApp for more information This function delete old values before inserting new values in database. --- modules/data_storage_functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index d283b0d..54cd505 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -6,7 +6,7 @@ module.exports = { saveValueInStorage: async function(database_pool, logger, serverId, storageName, key, value){ /* Save a new value in a server's storage */ - database_pool.query("INSERT INTO stored_data (storage_id, data_key, data) VALUES ( (SELECT storage_id FROM data_storage WHERE server_id = $1 AND storage_name = $2), $3, $4);", + database_pool.query("SELECT f_insert_or_update_data($1, $2, $3, $4)", [serverId, storageName, key, value.toString()]) .catch((err)=>{ logger.error("Error while saving data in data storage for server "+serverId+" : "+err); From 64970b8de88d34fbc6b044e6ed07835e56267282 Mon Sep 17 00:00:00 2001 From: LJ5O <75009579+LJ5O@users.noreply.github.com> Date: Thu, 2 Mar 2023 17:19:41 +0100 Subject: [PATCH 06/14] Removed unused privileged intent --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index beb2a48..27e4848 100644 --- a/index.js +++ b/index.js @@ -37,7 +37,7 @@ let discordClient = new Discord.Client({ Discord.GatewayIntentBits.GuildWebhooks, Discord.GatewayIntentBits.GuildInvites, Discord.GatewayIntentBits.GuildVoiceStates, - Discord.GatewayIntentBits.GuildPresences, + //Discord.GatewayIntentBits.GuildPresences, Discord.GatewayIntentBits.GuildMessages, Discord.GatewayIntentBits.GuildMessageReactions, //Discord.GatewayIntentBits.GuildMessageTyping, From 3000b2413f4ec007d9959ed30b26f6bb6b5d5503 Mon Sep 17 00:00:00 2001 From: LJ5O <75009579+LJ5O@users.noreply.github.com> Date: Thu, 2 Mar 2023 17:22:33 +0100 Subject: [PATCH 07/14] Bot doesn't save guilds names anymore Requested by Discord, we will now get data from Discord API instead of storing it --- index.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/index.js b/index.js index 27e4848..90d0c08 100644 --- a/index.js +++ b/index.js @@ -153,7 +153,7 @@ database_pool.query('SELECT NOW();', (err, res) => { //These events are only used by the bot, users can't use these discordClient.on("guildCreate", async(guild)=>{ - database_pool.query("INSERT INTO servers (server_id, name) VALUES ($1, $2) ON CONFLICT DO NOTHING;", [guild.id, guild.name]) + database_pool.query("INSERT INTO servers (server_id) VALUES ($1) ON CONFLICT DO NOTHING;", [guild.id]) .then(()=>{ logger.info("Bot was added in a new server : "+guild.id+"("+guild.name+")"); logger.debug("Successfully added a new server to database !"); @@ -165,19 +165,6 @@ database_pool.query('SELECT NOW();', (err, res) => { logger.info("Bot was removed from a guild : "+guild.id+"("+guild.name+")"); }); - discordClient.on("guildUpdate", async(oldGuild, newGuild)=>{ - if(oldGuild.name===newGuild.name)return; - //This guild has a new name, we will save it in database - database_pool.query("UPDATE servers SET name = $1 WHERE server_id = $2;", [newGuild.name, newGuild.id]) - .then(async()=>{ - logger.debug("Saved a new name for guild "+newGuild.id); - }) - .catch((err)=>{ - logger.error("Error while saving the new name of guild "+newGuild.id+" : "+err); - }); - - }); - discordClient.on("interactionCreate", async(interaction) => {//See https://discordjs.guide/creating-your-bot/command-handling.html#executing-commands if (!interaction.isChatInputCommand()) return;//Do nothing here if not a chat command const command = interaction.client.commands.get(interaction.commandName); From 7ebb589bc0d5f74460e117152eaa8e8a484b748a Mon Sep 17 00:00:00 2001 From: LJ5O <75009579+LJ5O@users.noreply.github.com> Date: Tue, 7 Mar 2023 13:49:37 +0100 Subject: [PATCH 08/14] Update help_embed.js Added some links on this embed --- modules/help_embed.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/help_embed.js b/modules/help_embed.js index 17ddc0e..090192a 100644 --- a/modules/help_embed.js +++ b/modules/help_embed.js @@ -15,5 +15,6 @@ module.exports = ()=>{ .addFields({name:'Disblock\'s dashboard', value:'You can configure Disblock [Here](https://disblock.xyz/panel). Login, and select a server to see the editor ! ', inline:true}) .addFields({name:'I need help !', value:'No problem, you can check the [docs](https://docs.disblock.xyz), or join the [support server](https://discord.gg/4b6j3UBKWp). Also, be sure to give the right permissions to the bot when creating an action flow !', inline:true}) .addFields({name:'How do I get started ?', value:'We have a page in the docs to answer this question ! Just read [this](https://docs.disblock.xyz/disblock/first-steps) and everything should be more clear !', inline:false}) + .addFields({name:'Useful links', value:'[Dashboard](https://disblock.xyz/panel) • [Support server](https://discord.gg/4b6j3UBKWp) • [Vote for Disblock](https://top.gg/bot/903324635108634654/vote) • [Leave a review](https://top.gg/bot/903324635108634654#reviews)', inline:false}) ) } From c2f0626de4e3f769e69cf81e6c75804156edd14f Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:01:09 +0100 Subject: [PATCH 09/14] We can now handle inexistent var in data storages If users try to access an undefined var in a data storage, blocks will now return 'undefined' or -1, depending of the type of the data storage --- modules/data_storage_functions.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 54cd505..d3af5eb 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -19,10 +19,28 @@ module.exports = { try{ const row = (await database_pool.query("SELECT d.data, s.storage_is_int FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3;", [serverId, storageName, key])).rows[0]; - return (row ? row.data : null); + + if(row.data){ + return row.data; + }else if(storageName.startsWith('I')){ + return -1; + }else if(storageName.startsWith('S')){ + return 'undefined'; + }else{ + throw('Error : Invalid storage name "'+storageName+'" for server '+serverId); + } + }catch(err){ logger.error("Error while getting data from data storage for server "+serverId+" : "+err); - return undefined; + + if(storageName.startsWith('I')){ + return -1; + }else if(storageName.startsWith('S')){ + return 'undefined'; + }else{ + return null;//May cause errors in workspaces, so using this can be considered a bug + } + } } From 0b6d6d31032b9d1d41ce0223cee78920961208a3 Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:12:30 +0100 Subject: [PATCH 10/14] Update data_storage_functions.js Fixed error with commit c2f0626 --- modules/data_storage_functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index d3af5eb..58c9a5c 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -20,7 +20,7 @@ module.exports = { const row = (await database_pool.query("SELECT d.data, s.storage_is_int FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3;", [serverId, storageName, key])).rows[0]; - if(row.data){ + if(row){ return row.data; }else if(storageName.startsWith('I')){ return -1; From 8f3303ef9ee6894e126aa130e91d44c71ba2d24d Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Thu, 9 Mar 2023 00:31:07 +0100 Subject: [PATCH 11/14] Key and data have now a maximum size Will avoid some errors while executing code --- modules/data_storage_functions.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 58c9a5c..273399e 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -6,6 +6,18 @@ module.exports = { saveValueInStorage: async function(database_pool, logger, serverId, storageName, key, value){ /* Save a new value in a server's storage */ + + //Key and value must be defined + if(!key || key=='' || !value || value=='')return; + + //We will check that key and valud aren't bigger than 32 or 256 char + if(key.length > 32){ + key = key.slice(0, 32); + } + if(value.toString().length > 255){ + value = value.toString().slice(0, 255); + } + database_pool.query("SELECT f_insert_or_update_data($1, $2, $3, $4)", [serverId, storageName, key, value.toString()]) .catch((err)=>{ @@ -16,6 +28,12 @@ module.exports = { getValueInStorage: async function(database_pool, logger, serverId, storageName, key){ /* Get a value stored in a data storage from database */ + + //We will check that key isn't bigger than 32 char + if(key.length > 32){ + key = key.slice(0, 32); + } + try{ const row = (await database_pool.query("SELECT d.data, s.storage_is_int FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3;", [serverId, storageName, key])).rows[0]; From 1798ee48fe1c2f996265e8920545b46b5be4eacf Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Mon, 13 Mar 2023 19:41:09 +0100 Subject: [PATCH 12/14] Added function to delete values in data storages New function in sandbox to allow deleting values stored in data storages --- modules/data_storage_functions.js | 19 ++++++++++++++++++- modules/sandbox.js | 3 +++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 273399e..7019934 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -60,6 +60,23 @@ module.exports = { } } - } + }, + + deleteValueInStorage: async function(database_pool, logger, serverId, storageName, key){ + /* Get a value stored in a data storage from database */ + + //We will check that key isn't bigger than 32 char + if(key.length > 32){ + key = key.slice(0, 32); + } + + try{ + await database_pool.query("DELETE FROM stored_data WHERE data_id = (SELECT d.data_id FROM data_storage s INNER JOIN stored_data d ON s.storage_id=d.storage_id WHERE s.server_id = $1 AND s.storage_name = $2 AND d.data_key = $3);", + [serverId, storageName, key]); + + }catch(err){ + logger.error("Error while deleting data from data storage for server "+serverId+" : "+err); + } + }, } diff --git a/modules/sandbox.js b/modules/sandbox.js index 5c378fd..b961040 100644 --- a/modules/sandbox.js +++ b/modules/sandbox.js @@ -17,6 +17,9 @@ function addDataStorageObject(vm, database_pool, logger, serverId){ }, getValue: async function(storageName, key){ return await data_storage_functions.getValueInStorage(database_pool, logger, serverId, storageName, key); + }, + delValue: async function(storageName, key){ + return await data_storage_functions.deleteValueInStorage(database_pool, logger, serverId, storageName, key); } }; From d50f3a1c70e35acb6ab1d53328e8c2919e7f62d4 Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:55:49 +0200 Subject: [PATCH 13/14] Fixed a bug with number storages Trying to save the number 0 was considered as trying to save something undefined, and didn't worked. --- modules/data_storage_functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 7019934..05ff09c 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -8,7 +8,7 @@ module.exports = { /* Save a new value in a server's storage */ //Key and value must be defined - if(!key || key=='' || !value || value=='')return; + if(!key || key=='' || value===undefined || value==='')return; //We will check that key and valud aren't bigger than 32 or 256 char if(key.length > 32){ From 4dbf9e29c8163b8dab0cb6d09e40058eae1793ac Mon Sep 17 00:00:00 2001 From: LJ50 <75009579+LJ5O@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:42:36 +0200 Subject: [PATCH 14/14] Update data_storage_functions.js Max length for values increased from 256 to 1024 characters. --- modules/data_storage_functions.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/data_storage_functions.js b/modules/data_storage_functions.js index 05ff09c..911fad3 100644 --- a/modules/data_storage_functions.js +++ b/modules/data_storage_functions.js @@ -14,8 +14,9 @@ module.exports = { if(key.length > 32){ key = key.slice(0, 32); } - if(value.toString().length > 255){ - value = value.toString().slice(0, 255); + if(value.toString().length > 1024){ + logger.debug("Can't save data in data storage for server "+serverId+" : value length exceed limit"); + return; } database_pool.query("SELECT f_insert_or_update_data($1, $2, $3, $4)",