Mirror of the 512mb.org bot on github (https://github.com/512mb-org/512mb.org-bot)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
5.2 KiB

local aliases = {}
local command = import("classes.command")
local plugin = import("classes.plugin")("scc")
local sql = import("sqlite3")
local db = sql.open(server.config_path.."scc.sqlite")
local cache = {
users = {},
rules = {},
usermsg = {}
}
if not db:rowexec("SELECT name FROM sqlite_master WHERE type='table' AND name='score'") then
db:exec [[
CREATE TABLE score(user TEXT PRIMARY KEY, score INTEGER);
CREATE TABLE rules(rulename TEXT NOT NULL PRIMARY KEY, value TEXT);
INSERT INTO rules VALUES("bump", 50);
INSERT INTO rules VALUES("message", 5);
INSERT INTO rules VALUES("bumpchannel","0");
INSERT INTO rules VALUES("bumpbot","0");
]]
end
local update_entry = db:prepare([[INSERT INTO score VALUES(?, ?) ON CONFLICT(user) DO UPDATE SET score = ?]])
local update_rules = db:prepare([[UPDATE rules SET value = ? WHERE rulename = ?]])
local get_rule = db:prepare("SELECT value FROM rules WHERE rulename = ?")
cache.rules.message = tonumber(get_rule:reset():bind("message"):step()[1])
cache.rules.bump = tonumber(get_rule:reset():bind("bump"):step()[1])
cache.rules.bumpchannel = get_rule:reset():bind("bumpchannel"):step()[1]
cache.rules.bumpbot = get_rule:reset():bind("bumpbot"):step()[1]
local score_init = db:exec("SELECT * FROM score;")
if score_init then
for id,uid in ipairs(score_init.user) do
cache.users[uid] = tonumber(score_init.score[id])
end
end
local timer = discordia.Clock()
timer:on("min", function()
if os.date("*t")["min"]%5 == 0 then
log("SCC","Saving SCC data")
for uname,uscore in pairs(cache.users) do
update_entry:reset():bind(uname,uscore,uscore):step()
end
end
end)
timer:start(true)
events:on("typingStart",function(userid,channelid)
if cache.rules.bumpchannel == tostring(channelid) then
cache.last_typing_user = userid
end
end)
events:on("messageCreate",function(msg)
if (not msg.author.bot) and
msg.content and
(msg.content:len() > 10) then
local stripped_content = msg.content:match("^%s*(.-)%s*$")
if not (stripped_content == cache.usermsg[msg.author.id]) then
cache.users[msg.author.id] = (cache.users[msg.author.id] or 0) +
cache.rules.message
end
cache.usermsg[msg.author.id] = stripped_content
end
if msg.author.bot and (msg.author.id == tostring(cache.rules.bumpbot)) then
if cache.last_typing_user and msg.embed and msg.embed.description and msg.embed.description:match("Bump done") then
cache.users[cache.last_typing_user] = (cache.users[cache.last_typing_user] or 0) + cache.rules.bump
end
end
end)
local c_sccrules = command("scc-rules", {
category = "Utilities",
perms = {
"administrator"
},
exec = function(msg,args,opts)
if not args[1] then
msg:reply({embed = {
title = "Current score rules: ",
fields = {
{ name = "message", value = tostring(cache.rules.message) },
{ name = "bump", value = tostring(cache.rules.bump) },
{ name = "bumpbot", value = tostring(cache.rules.bumpbot) },
{ name = "bumpchannel", value = tostring(cache.rules.bumpchannel) }
}
}})
else
local valid_params = {
message = tonumber,
bump = tonumber,
bumpchannel = tostring,
bumpbot = tostring
}
if valid_params[args[1]] then
if valid_params[args[1]](args[2]) then
local value = valid_params[args[1]](args[2])
cache.rules[args[1]] = value
update_rules:reset():bind(args[2],args[1]):step()
else
msg:reply("Invalid parameter: "..tostring(args[2]))
return false
end
else
msg:reply("Invalid rule name: "..tostring(args[1]))
return false
end
return true
end
end
})
plugin:add_command(c_sccrules)
local c_sccscore = command("scc-score", {
category = "Utilities",
exec = function(msg,args,opts)
if not args[1] then
msg:reply({embed = {
title="Your score: "..tostring(cache.users[msg.author.id] or 0),
color = discordia.Color.fromHex("2FC02A").value
}})
else
local user = msg.guild:getMember(args[1]:match("^%d*"))
if not user then
msg:reply("Invalid user")
return false
end
msg:reply({embed={
title = tostring(user.name).."'s score: "..tostring(cache.users[user] or 0),
color = discordia.Color.fromHex("2FC02A").value
}})
end
end
})
plugin:add_command(c_sccscore)
plugin.removal_callback = function()
for uname,uscore in pairs(cache.users) do
update_entry:reset():bind(uname,uscore,uscore):step()
end
end
local helpdb = import(plugin_path:sub(3,-1).."help")
plugin:for_all_commands(function(command)
if helpdb[command.name] then
command:set_help(helpdb[command.name])
end
end)
return plugin