diff options
| -rw-r--r-- | commands/games/battleship.js | 9 | ||||
| -rw-r--r-- | commands/mod/blacklist.js | 56 | ||||
| -rw-r--r-- | commands/mod/confirm.js | 11 | ||||
| -rw-r--r-- | commands/mod/defaults/blacklist.js.json | 2 | ||||
| -rw-r--r-- | commands/util/say.js | 24 | ||||
| -rw-r--r-- | events/dm.js | 3 | ||||
| -rw-r--r-- | events/interaction.js | 14 | ||||
| -rw-r--r-- | events/member-add.js | 8 | ||||
| -rw-r--r-- | events/member-update.js | 3 | ||||
| -rw-r--r-- | events/message.js | 8 | ||||
| -rw-r--r-- | events/ready.js | 13 | ||||
| -rw-r--r-- | i.js | 1 | ||||
| -rw-r--r-- | index.js | 15 | ||||
| -rw-r--r-- | src/db.js | 19 | ||||
| -rw-r--r-- | src/interaction-preserve.js | 8 | ||||
| -rw-r--r-- | src/logg.js | 35 | ||||
| -rw-r--r-- | src/webui.js | 9 | 
17 files changed, 180 insertions, 58 deletions
| diff --git a/commands/games/battleship.js b/commands/games/battleship.js index 136124a..085365a 100644 --- a/commands/games/battleship.js +++ b/commands/games/battleship.js @@ -5,6 +5,7 @@ const { PermissionsBitField, EmbedBuilder, AttachmentBuilder,ActionRowBuilder,Bu  let config = JSON.parse(fs.readFileSync(config_loc))  const util = require("../../src/util.js")  const sharp = require("sharp"); +const llog = require("../../src/logg")  const db = require("../../src/db.js")  module.exports = {      name : "battleship", @@ -34,9 +35,9 @@ module.exports = {              .setCustomId('up')              .setEmoji('⬆️')              .setStyle(ButtonStyle.Primary); -        const down = new ButtonBuilder() -            .setCustomId('down') -            .setEmoji('⬇️') +            const down = new ButtonBuilder() +                .setCustomId('down') +                .setEmoji('⬇️')              .setStyle(ButtonStyle.Primary);          const right = new ButtonBuilder()              .setCustomId('right') @@ -146,7 +147,7 @@ module.exports = {                  return rec_edit(mess)              } catch (e) { -                console.log(e) +                llog.error(e)              }          }          return await rec_edit(mess) diff --git a/commands/mod/blacklist.js b/commands/mod/blacklist.js new file mode 100644 index 0000000..a585640 --- /dev/null +++ b/commands/mod/blacklist.js @@ -0,0 +1,56 @@ +const fs = require('fs') +const path = require("path"); +let config_loc = __filename+".json" +const { PermissionsBitField } = require('discord.js'); +let config = JSON.parse(fs.readFileSync(config_loc)) +const { EmbedBuilder, ActionRowBuilder,ButtonBuilder,ButtonStyle } = require("discord.js"); +const settings = require("../../src/settings") +const {upload_limit} = require("../../src/util") + +module.exports = { +    name : "blacklist", +    command: ["blacklist"], +    mod_only: true, +    config:config, +    config_loc:config_loc, +    async main (client,Discord,message,args){ + +        let del = false +        switch(args[0]){ +            case "del": +                del = true; +                args.shift() +                break; +            case "dump": +                let flist = "" +                for(let l of await global.preserve.blacklist.values()) +                    flist+=l + " " +                let filename = "/tmp/blacklist.txt" +                fs.writeFileSync(filename,flist) + +                let stats = fs.statSync(filename) +                if(stats.size / (1024*1024) > upload_limit(message.guild)) +                    return message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb") +                message.reply({files:[filename]}) +                return +                break; +            case "test": +                return message.reply(await global.preserve.blacklist.getItem(args[1]) != null ? "found" : "not found") +                break; +        } + +        let len = await global.preserve.blacklist.length() +        for(let id of args){ +            console.log(id) +            if(del){ +                await global.preserve.blacklist.removeItem(id); +            } else { +                await global.preserve.blacklist.setItem(id,id); +            } +        } + +        return message.reply("wrote " + (await global.preserve.blacklist.length() - len) + " entrie(s)") + + +    }, +}
\ No newline at end of file diff --git a/commands/mod/confirm.js b/commands/mod/confirm.js index 9ef0ed0..e4d2233 100644 --- a/commands/mod/confirm.js +++ b/commands/mod/confirm.js @@ -7,6 +7,7 @@ const message = require("../../events/message");  let config_loc = __filename+".json"  let config = JSON.parse(fs.readFileSync(config_loc))  let { Events, ModalBuilder, TextInputBuilder, TextInputStyle } = require('discord.js'); +const llog = require("../../src/logg")  const preserve = require("../../src/interaction-preserve")  module.exports = {    name: "ban", @@ -181,14 +182,14 @@ module.exports = {                      try {                          await user.send({embeds:[ban_embed]})                      } catch (e) { -                        console.log(e) +                        console.error(e)                          could_send = false;                      }                      try{                          user = param.message.guild.members.cache.get(user.id)                          await user.ban({deleteMessageSeconds: 60 * 60 * 24 * 7, reason: param.reason})                      } catch (e) { -                        console.log(e) +                        console.error(e)                          could_ban = false;                      } @@ -206,7 +207,7 @@ module.exports = {                  mess.edit({embeds:[embed],components:[]})              }          } catch (e) { -            console.log(e) +            console.error(e)          }      }      //await rec_read(); @@ -248,14 +249,14 @@ module.exports = {                      try {                          await user.send({embeds:[ban_embed]})                      } catch (e) { -                        console.log(e) +                        console.error(e)                          could_send = false;                      }                      try{                          user = interaction.guild.members.cache.get(user.id)                          await user.ban({deleteMessageSeconds: 60 * 60 * 24 * 7, reason: data.param.reason})                      } catch (e) { -                        console.log(e) +                        console.error(e)                          could_ban = false;                      } diff --git a/commands/mod/defaults/blacklist.js.json b/commands/mod/defaults/blacklist.js.json new file mode 100644 index 0000000..513645f --- /dev/null +++ b/commands/mod/defaults/blacklist.js.json @@ -0,0 +1,2 @@ +{"cooldown":-1,"desc":"Blacklist a user id, once banned blacklist will be removed","restrict":[],"restricted":[], +"usage":"{command} (del | dump) [id, ...]"}
\ No newline at end of file diff --git a/commands/util/say.js b/commands/util/say.js index 1966512..eda3675 100644 --- a/commands/util/say.js +++ b/commands/util/say.js @@ -55,22 +55,26 @@ module.exports = {                  {type:"string",name:"footer",desc:"footer text",required:false,autocomplete:false},              ]}],      async s_main (client,Discord,interaction){ -        let action = interaction.options.getSubcommand() -        if(action == "text"){ -            this.exec(client, -                {echo:interaction.options.getString("echo"), -                id:interaction.options.getChannel("channel") ?? interaction.channel}) -            await interaction.reply({ content:'sent', ephemeral: true }) -            interaction.deleteReply() -        } else if(action == "embed"){ -            this.embed_exec(client, {msg:interaction,id:interaction.channel}) +        try{ +            let action = interaction.options.getSubcommand() +            if(action == "text"){ +                this.exec(client, +                    {echo:interaction.options.getString("echo"), +                    id:interaction.options.getChannel("channel") ?? interaction.channel}) +                await interaction.reply({ content:'sent', ephemeral: true }) +                interaction.deleteReply() +            } else if(action == "embed"){ +                this.embed_exec(client, {msg:interaction,id:interaction.channel}) +            } +        } catch(e) { +            info.interaction.channel.reply({ content: 'error sending message, most likely from permissions or length', ephemeral: true})          }      },      async exec(client,info){ -        return info.id.send(info.echo) +        return await info.id.send(info.echo)      },      async embed_exec(client, info){ diff --git a/events/dm.js b/events/dm.js index dfb7f51..0396a35 100644 --- a/events/dm.js +++ b/events/dm.js @@ -4,12 +4,15 @@ const fs = require('fs')  const path = require("path");  let db = require("../src/db")  let settings = require("../src/settings") +const llog = require("../src/logg")  let config_loc = __filename+".json"  module.exports = {      name : "dm",      config_loc : config_loc,      async main (client,Discord,message){ +        llog.debug("dm")          if(message==null||message.author.bot)return; +        llog.debug("dm " + message.author.id)          let config = JSON.parse(fs.readFileSync(config_loc))          //start tickets          let date = new Date().toLocaleString() diff --git a/events/interaction.js b/events/interaction.js index 8b61445..828ba20 100644 --- a/events/interaction.js +++ b/events/interaction.js @@ -5,6 +5,8 @@ const { EmbedBuilder } = require("discord.js");  let db = require("../src/db")  let settings = require('../src/settings')  let util = require("../src/util") +const llog = require("../src/logg") +  let config_loc = __filename+".json"  module.exports = {      name : "interactionCreate", @@ -13,10 +15,11 @@ module.exports = {          await db._raw.sync()          let config = JSON.parse(fs.readFileSync(config_loc))          client.on("interactionCreate", async(interaction) => { +            llog.debug("interaction " + interaction.user.id);              if(interaction.guild==null)return              if(!settings["allowed-servers"].includes(interaction.guild.id)) -                return console.log("denied interaction from (guild)"+interaction.guild.id) +                return llog.error("denied interaction from (guild)"+interaction.guild.id)              let date = new Date()              interaction.author = interaction.user              if(interaction.isChatInputCommand() || interaction.isUserContextMenuCommand()){ @@ -44,7 +47,7 @@ module.exports = {                  await command.command[interaction.isChatInputCommand()?"s_main":"c_main"](client,Discord,interaction);              } else if (interaction.isAutocomplete()){ -                console.log(interaction.user.id + " : autocomplete") +                llog.log(interaction.user.id + " : autocomplete")                  const focused = interaction.options.getFocused(true);                  let command = global.s_commands.find(o => o.name === interaction.commandName)                  if(interaction.options._subcommand!=null){ @@ -63,15 +66,14 @@ module.exports = {                      filtered.map(choice => ({ name: choice, value: choice })),                  );                  } catch(e) { -                    console.log(e) -                    console.log("failed to send autocomplete") +                    llog.error(e) +                    llog.error("failed to send autocomplete")                  }              } else if (interaction.isButton()){ -                console.log(global.preserve.interactions.length()) +                llog.log(global.preserve.interactions.length())                  let sel = await global.preserve.interactions.getItem(interaction.message.id)                  if(sel != null){ -                    console.log("hi")                      sel.data = await sel.fn(sel.data, interaction);                      global.preserve.interactions.setItem(interaction.message.id, sel)                  } diff --git a/events/member-add.js b/events/member-add.js index 6392c4c..76b8536 100644 --- a/events/member-add.js +++ b/events/member-add.js @@ -10,7 +10,13 @@ module.exports = {      name : "guildMemberAdd",      config_loc : config_loc,      async main (client,Discord){ -        client.on("guildMemberAdd",(m)=>{ +        client.on("guildMemberAdd",async (m)=>{ +            if(await global.preserve.blacklist.getItem(m.id) != null) { +                await global.preserve.blacklist.removeItem(m.id) +                m.ban() +                global.channels["logging"].send("banned blacklisted user <@"+m.id+"> ("+m.id+")") +                return; +            }              //global.channels.general.send("Welcome to the server <@"+m.id+">!")              if(global.notif == null)                  global.notif = {} diff --git a/events/member-update.js b/events/member-update.js index d276e16..2074d9b 100644 --- a/events/member-update.js +++ b/events/member-update.js @@ -4,6 +4,7 @@ const path = require("path");  const { EmbedBuilder } = require("discord.js");  let db = require("../src/db")  let settings = require("../src/settings") +let llog = require("../src/logg")  let config_loc = __filename+".json"  module.exports = {      name : "guildMemberUpdate", @@ -65,7 +66,7 @@ module.exports = {                          try{                              await m[1].delete()                          } catch(e) { -                            console.log("failed to delete message") +                            llog.error("failed to delete message")                          }                      }                      found = true diff --git a/events/message.js b/events/message.js index 63202d8..5c4d6ac 100644 --- a/events/message.js +++ b/events/message.js @@ -7,6 +7,7 @@ const { PermissionsBitField } = require('discord.js');  const { EmbedBuilder } = require("discord.js");  const util = require("../src/util")  let settings = require('../src/settings') +const llog = require("../src/logg")  let config_loc = __filename+".json"  module.exports = {      name : "messageCreate", @@ -14,6 +15,7 @@ module.exports = {      async main (client,Discord){          let config = JSON.parse(fs.readFileSync(config_loc))          client.on("messageCreate", async (message) => { +            llog.debug("message " + message.author.id)              if(message.guild==null)                  return require("./dm").main(client,Discord,message)              if(!settings["allowed-servers"].includes(message.guild.id)||message.author.bot||message.member==null) @@ -21,7 +23,7 @@ module.exports = {              //spam messages -            for(let i = 0; i < global.recent_messages.length; i++){ +            /*for(let i = 0; i < global.recent_messages.length; i++){                  let diff = util.diff((new Date(message.createdTimestamp)).getUTCSeconds(),(new Date(global.recent_messages[i].createdTimestamp)).getUTCSeconds());                  if(diff>2){ @@ -58,7 +60,7 @@ module.exports = {                      .setDescription("<@"+message.author.id+"> sent "+matching_ids.length+" messages, similar to or matching \n`"+message.content+"`")                  global.channels["admin-chan"].send({ embeds: [embed]}) -            } +            }*/              //done w/ spam              //track message @@ -142,7 +144,7 @@ module.exports = {                                  message.reply(config["error-message-not-here"].value).then((msg)=>{remove(msg)})                          } catch(e) {                              message.reply(config["error-message"].value + "\n```"+e.stack+"```").then((msg)=>{remove(msg)}) -                            console.log(e.stack) +                            llog.error(e.stack)                          }                          break;                      } diff --git a/events/ready.js b/events/ready.js index 02064a8..a830353 100644 --- a/events/ready.js +++ b/events/ready.js @@ -5,6 +5,7 @@ const { EmbedBuilder } = require("discord.js");  let db = require("../src/db")  let settings = require('../src/settings')  let config_loc = __filename+".json" +const llog = require('../src/logg')  module.exports = {      name : "ready", @@ -18,12 +19,12 @@ module.exports = {              global.channels = {}              for(let guild of Object.keys(settings.preloads)){                  let mem = Object.fromEntries(await client.guilds.cache.get(guild).members.fetch()) -                console.log(Object.keys(mem)) +                //console.log(Object.keys(mem))                  for(let chan of Object.keys(settings.preloads[guild])){                      let t_add = client.guilds.cache.get(guild).channels.cache.get(chan)                      if(t_add==null) -                        console.log("failed to load "+chan+" from "+guild+", skipping"); +                        llog.error("failed to load "+chan+" from "+guild+", skipping");                      else                          global.channels[settings.preloads[guild][chan].name] = t_add; @@ -38,18 +39,18 @@ module.exports = {              client.guilds.cache.forEach((g)=>{                  if(settings["allowed-servers"].includes(g.id)){                      g.commands.set(global.s_commands).catch((e)=>{ -                        console.log("unable to load commands for " + g.id + "\n\n****\n") -                        console.log(e) +                        llog.error("unable to load commands for " + g.id + "\n\n****\n") +                        llog.error(e)                      })                      passed++;                  } else {                      failed++;                  }              }) -            console.log("loaded "+global.s_commands.length+" slash commands for "+passed+" guilds, and denied "+failed+" guilds") +            llog.log("loaded "+global.s_commands.length+" slash commands for "+passed+" guilds, and denied "+failed+" guilds")              //done w/ slash commands -            console.log("online!") +            llog.log("online!")              function set_pres() {                  client.user.setPresence({                      activities: [{ name: config.status.value, type: ActivityType[config.type.value] }] @@ -1 +0,0 @@ -require("./src/webui")
\ No newline at end of file @@ -8,7 +8,8 @@ process.stdout.write = process.stderr.write  = (function(write) {    }  })(process.stdout.write)  process.title = "sns\-chan" -console.log("["+process.pid+"] running under the name "+process.title) +const llog = require("./src/logg") +llog.log("["+process.pid+"] running under the name "+process.title)  /**   * Module Imports   */ @@ -123,7 +124,7 @@ async function main(){                .setName(com.name.replace(/ /g,'-'))                .setDescription(com.config.desc)              if(com.mod_only) -              scom.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageRoles) +              scom.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)              if(com.s_options!=null){                update_options(scom,com.s_options);              } @@ -136,18 +137,18 @@ async function main(){                .setName(com.name.replace(/ /g,'-'))                .setType(ApplicationCommandType.User)              if(com.mod_only) -              ccom.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageRoles) +              ccom.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)              ccom = ccom.toJSON()              ccom.command = com              s_commands.push(ccom)            }          } catch (e) {            if(e.code=="ENOENT"){ -            console.log("[ENOENT] missing some config files:( run 'sh buildconfig.sh' to get them\nexiting~") +            llog.error("[ENOENT] missing some config files:( run 'sh buildconfig.sh' to get them\nexiting~")              process.exit(e.errno)            } -          console.log("["+e.code+"]"+" unexpected error:( something is wrong with the ./commands/*/* files\n****\n") -          console.log(e) +          llog.error("["+e.code+"]"+" unexpected error:( something is wrong with the ./commands/*/* files\n****\n") +          llog.error(e)            process.exit(e.errno)          } @@ -175,7 +176,7 @@ async function main(){    try{      require("./src/webui")    } catch(e) { -    console.log("failed loading webui:c") +    llog.error("failed loading webui:c")    }  }  main() @@ -1,5 +1,6 @@  const path = require('path');  const { Sequelize, DataTypes } = require('sequelize'); +const llog = require("../src/logg")  const _db_raw = new Sequelize({      dialect: 'sqlite', @@ -69,11 +70,25 @@ db.Track = _db_raw.define('Track', {  try {      db.BattleShip.sync({force:true})      db._raw.authenticate(); -    console.log('db connected'); +    llog.log('db connected');  } catch (error) { -    console.error('Unable to connect to the database:', error); +    llog.error('Unable to connect to the database:', error);  }  _db_raw.sync() +const persist = require("node-persist") +let serialize = require('serialize-javascript'); +function deserialize(i){ +    return eval('(' + i + ')'); +} + +global.preserve = {} + +global.preserve.interactions = persist.create({dir:"./.node-persist/interaction", parse:deserialize, stringify:serialize}) +global.preserve.interactions.init() + +global.preserve.blacklist = persist.create({dir:"./.node-persist/blacklist", parse:deserialize, stringify:serialize}) +global.preserve.blacklist.init() +  module.exports = db
\ No newline at end of file diff --git a/src/interaction-preserve.js b/src/interaction-preserve.js index da4f1c9..9e0449c 100644 --- a/src/interaction-preserve.js +++ b/src/interaction-preserve.js @@ -1,12 +1,4 @@  const { stringify } = require('querystring'); -let serialize = require('serialize-javascript'); -function deserialize(i){ -    return eval('(' + i + ')'); -  } -global.preserve = {} -global.preserve.interactions = require('node-persist') -global.preserve.interactions.initSync({dir:"./.node-persist/interaction",parse:deserialize, -     stringify:serialize})  module.exports = {      register: async (id, fn, data) => { diff --git a/src/logg.js b/src/logg.js new file mode 100644 index 0000000..8e7aa4b --- /dev/null +++ b/src/logg.js @@ -0,0 +1,35 @@ +module.exports = { +    levels : { +        nothing : 0, +        error : 1, +        log : 2, +        debug : 3 +    }, + +    get_time(){ +        let date = new Date(); +        return `${date.getDate()}/${date.getMonth() + 1} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` +    }, +    get_level(){ +        return global._logg_level ?? this.set_level(this.levels.debug); +    }, +    set_level(level){ +        return global._logg_level = level; +    }, +    color(str, code){ +        return "\x1b[" + code + "m" + str + "\x1b[0m"; +    }, + +    error(str) { +        if(this.get_level() >= this.levels.error) +            console.log(this.color("["+this.get_time()+"]: ", 31) + this.color(str, 90)); +    }, +    log(str) { +        if(this.get_level() >= this.levels.log) +            console.log(this.color("["+this.get_time()+"]: ", 90) + str); +    }, +    debug(str) { +        if(this.get_level() >= this.levels.debug) +            console.log(this.color("["+this.get_time()+"]: " + str, 90)); +    } +}
\ No newline at end of file diff --git a/src/webui.js b/src/webui.js index 999de2f..98ff924 100644 --- a/src/webui.js +++ b/src/webui.js @@ -6,6 +6,7 @@ const fs = require('fs');  let db = require("../src/db");  const path = require("path")  const Tickets = db.Tickets +const llog = require("./logg")  const app = express();  app.use(bodyParser.urlencoded({ extended: false })); @@ -23,7 +24,7 @@ app.post('/tickets/data', async (req, res) => {  })  app.post('/tickets/edit', async (req, res) => {    if(req.body.key == key){ -    console.log('pass') +    llog.log('pass')  		res.send('pass')    }    else @@ -71,7 +72,7 @@ for(let dir of settings_dirs){    })  } -console.log(settings_full) +//console.log(settings_full)  app.get('/settings/', async (req, res) => {    res.sendFile(path.join(__dirname+'/../html/settings.html'))  }) @@ -94,10 +95,10 @@ for(let ddir in settings_full){        let data = {data:settings_full,sel:c.toString()}        res.send(JSON.stringify(data))      }) -    console.log('/settings/'+at) +    //console.log('/settings/'+at)      app.get('/settings/'+at, async (req, res) => {        res.sendFile(path.join(__dirname+'/../html/settings.html'))      })    }  } -app.listen(port, () => console.log(`listening at http://localhost:${port}`)); +app.listen(port, () => llog.log(`listening at http://localhost:${port}`)); | 
