From 0c463f934051d78d0e1f201c5501539a451e07ca Mon Sep 17 00:00:00 2001 From: Yessiest Date: Sat, 9 Apr 2022 23:12:47 +0400 Subject: [PATCH] Added luaqalc library --- .gitignore | 1 + .gitmodules | 6 ++ bot.lua | 33 +---------- libraries/classes/command.lua | 22 +++++++- libraries/libraries/luaqalc | 1 + libraries/luaqalc | 1 + plugins/meta/init.lua | 10 ++-- plugins/reactions/init.lua | 44 ++++++++------- plugins/security/init.lua | 100 ++++++++++++++++++++++++++++++++++ plugins/tools/init.lua | 13 ++++- 10 files changed, 171 insertions(+), 60 deletions(-) create mode 100644 .gitmodules create mode 160000 libraries/libraries/luaqalc create mode 160000 libraries/luaqalc create mode 100644 plugins/security/init.lua diff --git a/.gitignore b/.gitignore index c79f01b..df741ed 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /servers /discordia.log /gateway.json +*.so diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ec0145d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "libraries/libraries/luaqalc"] + path = libraries/libraries/luaqalc + url = https://512mb.org/git/Yessiest/luaqalculator +[submodule "libraries/luaqalc"] + path = libraries/luaqalc + url = https://512mb.org/git/Yessiest/luaqalculator diff --git a/bot.lua b/bot.lua index 4ebe0d5..7210510 100644 --- a/bot.lua +++ b/bot.lua @@ -13,21 +13,6 @@ local servers = {} local server = import("classes.server-handler") client:on("ready",function() print("starting test") - if not servers["766606858667950091"] then - servers["766606858667950091"] = server(client,client:getGuild("766606858667950091"),{ - path = os.getenv("HOME").."/bot-savedata/766606858667950091/", - autosave_frequency = 20, - default_plugins = { - "meta", - "help", - "plugins", - "esolang", - "tools", - "reactions", - "roledefaults" - } - }) - end if not servers["640251445949759499"] then servers["640251445949759499"] = server(client,client:getGuild("640251445949759499"),{ path = os.getenv("HOME").."/bot-savedata/640251445949759499/", @@ -39,22 +24,8 @@ client:on("ready",function() "esolang", "tools", "reactions", - "roledefaults" - } - }) - end - if not servers["946474639364849704"] then - servers["946474639364849704"] = server(client,client:getGuild("946474639364849704"),{ - path = os.getenv("HOME").."/bot-savedata/946474639364849704/", - autosave_frequency = 20, - default_plugins = { - "meta", - "help", - "plugins", - "esolang", - "tools", - "reactions", - "roledefaults" + "roledefaults", + "security" } }) end diff --git a/libraries/classes/command.lua b/libraries/classes/command.lua index 3774875..4c1fe60 100644 --- a/libraries/classes/command.lua +++ b/libraries/classes/command.lua @@ -127,7 +127,7 @@ function command:exec(message,args,opts) local exec = self.callback if not self.callback then error("Callback not set for command "..self.name) - end + end if self.decorator then self.callback = self.decorator(self.callback) end @@ -139,12 +139,30 @@ function command:exec(message,args,opts) content = message.content:sub(strend+1,-1) end if self:check_permissions(message) then + if self.options.typing_decorator then + message.channel:broadcastTyping() + end local status,args,opts,err = import("air").parse(content,self.args,message.client,message.guild.id) if status then - self.callback(message,args,opts) + local callst,status,response = pcall(self.callback,message,args,opts) + if callst then + if type(status) == "boolean" then + if status then + message:addReaction("✅") + else + message:addReaction("❌") + end + end + else + message:addReaction("⚠️") + message:reply("An internal error occured: "..status) + end else + message:addReaction("❌") message:reply(err) end + else + message:addReaction("❌") end end --add decorators for the callback diff --git a/libraries/libraries/luaqalc b/libraries/libraries/luaqalc new file mode 160000 index 0000000..5e11056 --- /dev/null +++ b/libraries/libraries/luaqalc @@ -0,0 +1 @@ +Subproject commit 5e1105631195255e8305fcaba6d37d167e9bd897 diff --git a/libraries/luaqalc b/libraries/luaqalc new file mode 160000 index 0000000..5e11056 --- /dev/null +++ b/libraries/luaqalc @@ -0,0 +1 @@ +Subproject commit 5e1105631195255e8305fcaba6d37d167e9bd897 diff --git a/plugins/meta/init.lua b/plugins/meta/init.lua index 471c58a..8c2ecf1 100644 --- a/plugins/meta/init.lua +++ b/plugins/meta/init.lua @@ -250,11 +250,11 @@ local c_server = command("server", { title = msg.guild.name, description = msg.guild.description, fields = { - {name = "Members",value = msg.guild.totalMemberCount,inline = true}, - {name = "Owner",value = (msg.guild.owner and msg.guild.owner.user.tag..":"..msg.guild.owner.user.id),inline = true}, - {name = "Created At",value = os.date("!%c",msg.guild.createdAt).." (UTC+0)",inline = true}, - {name = "Text Channels",value = msg.guild.textChannels:count(),inline = true}, - {name = "Voice Channels",value = msg.guild.voiceChannels:count(),inline = true} + {name = "Members",value = msg.guild.totalMemberCount}, + {name = "Owner",value = (msg.guild.owner and msg.guild.owner.user.tag..":"..msg.guild.owner.user.id) or msg.guild.ownerId}, + {name = "Created At",value = os.date("!%c",msg.guild.createdAt).." (UTC+0)"}, + {name = "Text Channels",value = msg.guild.textChannels:count()}, + {name = "Voice Channels",value = msg.guild.voiceChannels:count()} } }}) end, diff --git a/plugins/reactions/init.lua b/plugins/reactions/init.lua index e637918..3afb9df 100644 --- a/plugins/reactions/init.lua +++ b/plugins/reactions/init.lua @@ -46,7 +46,7 @@ local pivot = command("pivot",{ local message = args[1] if not message then msg:reply("Couldn't find message with id "..args[2]) - return nil + return false end if not segment.pivots[message.id] then print("[REACTIONS] Creating pivot: "..tostring(message.id)) @@ -56,7 +56,7 @@ local pivot = command("pivot",{ segment.pivots[message.id].buttons = {} end segment.pivot = segment.pivots[message.id] - msg:reply("Pivot message set to "..message.link) + return true end }) plugin:add_command(pivot) @@ -80,18 +80,18 @@ local role_toggle = command("role-toggle",{ exec = function(msg,args,opts) if not segment.pivot then msg:reply("Pivot not selected. Use "..globals.prefix.."pivot to select it and then try again") - return nil + return false end local emoji = getEmoji(args[1]) local channel = guild:getChannel(segment.pivot.channel) if not channel then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end local message = channel:getMessage(segment.pivot.message) if not message then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end print("[REACTIONS] Adding role-toggle listener") local grabEmoji = function(reaction) @@ -99,13 +99,15 @@ local role_toggle = command("role-toggle",{ type = "role-toggler", role = tostring(args[2].id) } - msg:reply("Role toggler added successfully") end message:removeReaction(emoji,client.user.id) client:once("reactionAdd",grabEmoji) if not message:addReaction(emoji) then client:removeListener("reactionAdd",grabEmoji) msg:reply("Couldn't add reaction - emoji might be invalid") + return false + else + return true end end }) @@ -126,24 +128,24 @@ local remove_reaction = command("remove-reaction",{ local channel = guild:getChannel(segment.pivot.channel) if not channel then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end local message = channel:getMessage(segment.pivot.message) if not message then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end print("[REACTIONS] Removing reaction listener") if args[1] then local emoji = getEmoji(args[1]) message:removeReaction(emoji,client.user.id) segment.pivot.buttons[((type(emoji) == "table") and emoji.id) or emoji] = nil - msg:reply("Action successfully removed") + return true else message:clearReactions() segment.pivots[tostring(message.id)] = nil segment.pivot = nil - msg:reply("Pivot successfully removed") + return true end end }) @@ -168,18 +170,18 @@ local toggle = command("toggle",{ exec = function(msg,args,opts) if not segment.pivot then msg:reply("Pivot not selected. Use "..globals.prefix.."pivot to select it and then try again") - return nil + return false end local emoji = getEmoji(args[1]) local channel = guild:getChannel(segment.pivot.channel) if not channel then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end local message = channel:getMessage(segment.pivot.message) if not message then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end print("[REACTIONS] Adding toggle listener") local grabEmoji = function(reaction) @@ -188,13 +190,15 @@ local toggle = command("toggle",{ on = args[2], off = args[3], } - msg:reply("Toggler added successfully") end message:removeReaction(emoji,client.user.id) client:once("reactionAdd",grabEmoji) if not message:addReaction(emoji) then client:removeListener("reactionAdd",grabEmoji) msg:reply("Couldn't add reaction - emoji might be invalid") + return false + else + return true end end }) @@ -218,18 +222,18 @@ local button = command("button",{ exec = function(msg,args,opts) if not segment.pivot then msg:reply("Pivot not selected. Use "..globals.prefix.."pivot to select it and then try again") - return nil + return false end local emoji = getEmoji(args[1]) local channel = guild:getChannel(segment.pivot.channel) if not channel then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end local message = channel:getMessage(segment.pivot.message) if not message then msg:reply("Something went horribly wrong, but it's not your fault. This incident has been (hopefully) reported") - return nil + return false end print("[REACTIONS] Adding button listener") local grabEmoji = function(reaction) @@ -237,13 +241,15 @@ local button = command("button",{ type = "button", on = args[2], } - msg:reply("Button added successfully") end message:removeReaction(emoji,client.user.id) client:once("reactionAdd",grabEmoji) if not message:addReaction(emoji) then client:removeListener("reactionAdd",grabEmoji) msg:reply("Couldn't add reaction - emoji might be invalid") + return false + else + return true end end }) @@ -252,7 +258,7 @@ plugin:add_command(button) local buttonOn = function(message,hash,userID) if not message then log("ERROR","Attempted to find a deleted message") - return + return end if segment.pivots[tostring(message.id)] and userID ~= client.user.id then local current_pivot = segment.pivots[tostring(message.id)] diff --git a/plugins/security/init.lua b/plugins/security/init.lua new file mode 100644 index 0000000..a0451df --- /dev/null +++ b/plugins/security/init.lua @@ -0,0 +1,100 @@ +local pluginc = import("classes.plugin") +local command = import("classes.command") +local sql = import("sqlite3") +local plugin = pluginc("help") + +local db = sql.open(server.config_path.."sec.sqlite") + +if not db:rowexec("SELECT name FROM sqlite_master WHERE type='table' AND name='infractions'") then + db:exec [[ +CREATE TABLE infractions(id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT, desc TEXT, action TEXT, timestamp INTEGER); +]] +end + +local grantrole = command("grant-role",{ + help = {embed={ + title = "Grant a role to the user", + description = "If is not provided, the caller is assumed as the argument.", + fields = { + {name = "Usage:",value = "grant-role []"}, + {name = "Perms:",value = "administrator"}, + {name = "Options:",value = "-q - quiet (don't print the result)"} + } + }}, + perms = { + "administrator" + }, + args = { + "role" + }, + exec = function(msg,args,opts) + return ((args[2] and msg.guild:getMember(args[2])) or msg.member):addRole(args[1]) + end +}) +plugin:add_command(grantrole) + +local revokerole = command("revoke-role",{ + help = {embed={ + title = "Revoke a role from the user", + description = "If is not provided, the caller is assumed as the argument.", + fields = { + {name = "Usage:",value = "revoke-role []"}, + {name = "Perms:",value = "administrator"}, + {name = "Options:",value = "-q - quiet (don't print the result)"} + } + }}, + perms = { + "administrator" + }, + args = { + "role" + }, + exec = function(msg,args,opts) + return ((args[2] and msg.guild:getMember(args[2])) or msg.member):removeRole(args[1]) + end +}) +plugin:add_command(revokerole) + +local warn = command("warn",{ + help = {embed={ + title = "Warn a user", + description = "nuff said.", + fields = { + {name = "Usage:",value = "warn "}, + {name = "Perms:",value = "kick_members"}, + } + }}, + perms = { + "kick_members" + }, + args = { + "member", + "string" + }, + exec = function(msg,args,opts) + local warnst = db:prepare("INSERT INTO infractions VALUES(NULL, ?,?,?, date())") + warnst:reset():bind(tostring(args[1].id),args[2],"warn"):step() + local countst = db:prepare("SELECT COUNT(*) FROM infractions WHERE user=?") + local v = countst:reset():bind(tostring(args[1].id)):step() + msg:reply({embed = { + title = "User has been warned successfully", + description = args[1].name.." has been given out a warning.", + fields = { + { name = "Warning count: ", value = tostring(tonumber(v[1])) }, + { name = "Reason: ", value = args[2] }, + { name = "Timestamp: ", value = os.date("%a %b %e %H:%M:%S %Y",os.time(os.date("!*t"))) } + }, + }}) + end +}) +plugin:add_command(warn) +--[[ +local infractions = command("infractions", { + help = { embed = { + title = "List user infractions", + description = "Infractions include kicks, bans, mutes and warnings." + fields = { + {name = "Usage: ", value = "infractions []"}, + {name = "Perms: ", value = "kick_members"}, + ]] +return plugin diff --git a/plugins/tools/init.lua b/plugins/tools/init.lua index 440b5a4..07db3a2 100644 --- a/plugins/tools/init.lua +++ b/plugins/tools/init.lua @@ -161,14 +161,21 @@ local pfp = command("pfp",{ }) plugin:add_command(pfp) local markov = command("markov",{ - help = "Generate some text using markov chains", - usage = "markov ",[[ + help = { embed = { + title = "Generate some text using markov chains", + description = "Generates text using the markov chain rule applied to a predefined set of words", + fields = { + {name = "Usage: ", value = "markov "}, + {name = "Options: ", value = [[ --preset= - Select a text preset. Currently available: ``default`` - Generated from a wikipedia page on markov chains ``freud`` - The largest one, generated from a page on Sigmund Freud ``reddit`` - Generated from reddit comments ``travisscott`` - Generated from transcript of a video by PlasticPills on travis scott burger -]], +]] }, + {name = "Perms: ", value = "any"} + } + }}, exec = function(msg,args,opts) local preset,code,err = import("file").readJSON("./resources/"..(opts["preset"] or "default"):match("%w+")..".json",{system_failed = true}) if preset.system_failed then