diff options
author | ame <[email protected]> | 2024-08-28 01:55:32 -0500 |
---|---|---|
committer | ame <[email protected]> | 2024-08-28 01:55:32 -0500 |
commit | c47415cd3e4734b111c7035074dd57e32cd60be7 (patch) | |
tree | f36d09f3db900e886973f61ac22cdd7e6572cf4a | |
parent | a3b50cdacc5653d49784a84276284e421e96cc8a (diff) |
-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}`)); |