aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/games/battleship.js9
-rw-r--r--commands/mod/blacklist.js56
-rw-r--r--commands/mod/confirm.js11
-rw-r--r--commands/mod/defaults/blacklist.js.json2
-rw-r--r--commands/util/say.js24
-rw-r--r--events/dm.js3
-rw-r--r--events/interaction.js14
-rw-r--r--events/member-add.js8
-rw-r--r--events/member-update.js3
-rw-r--r--events/message.js8
-rw-r--r--events/ready.js13
-rw-r--r--i.js1
-rw-r--r--index.js15
-rw-r--r--src/db.js19
-rw-r--r--src/interaction-preserve.js8
-rw-r--r--src/logg.js35
-rw-r--r--src/webui.js9
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] }]
diff --git a/i.js b/i.js
deleted file mode 100644
index 4acb17f..0000000
--- a/i.js
+++ /dev/null
@@ -1 +0,0 @@
-require("./src/webui") \ No newline at end of file
diff --git a/index.js b/index.js
index 5d462a6..b0383f5 100644
--- a/index.js
+++ b/index.js
@@ -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()
diff --git a/src/db.js b/src/db.js
index 9bd85a4..d3c15ed 100644
--- a/src/db.js
+++ b/src/db.js
@@ -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}`));