cacfea1fa5
Everything reworked and rewritten. Antisquig is now a plugin to work with moderation.lua. The bot can now upload photos, stickers, and other files. Return values in plugin functions to affect the bot's behavior. All this and more!
297 lines
7.1 KiB
Lua
Executable File
297 lines
7.1 KiB
Lua
Executable File
-- Moderation for Liberbot groups.
|
|
-- The bot must be made an admin.
|
|
-- Put this near the top, after blacklist.
|
|
-- If you want to enable antisquig, put that at the top, before blacklist.
|
|
|
|
local triggers = {
|
|
'^/modhelp[@'..bot.username..']*$',
|
|
'^/modlist[@'..bot.username..']*$',
|
|
'^/modcast[@'..bot.username..']*',
|
|
'^/add[@'..bot.username..']*$',
|
|
'^/remove[@'..bot.username..']*$',
|
|
'^/promote[@'..bot.username..']*$',
|
|
'^/demote[@'..bot.username..']*',
|
|
'^/modkick[@'..bot.username..']*',
|
|
'^/modban[@'..bot.username..']*',
|
|
}
|
|
|
|
local commands = {
|
|
|
|
['^/modhelp[@'..bot.username..']*$'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
local message = [[
|
|
/modlist - List the moderators and administrators of this group.
|
|
Moderator commands:
|
|
/modkick - Kick a user from this group.
|
|
/modban - Ban a user from this group.
|
|
Administrator commands:
|
|
/add - Add this group to the moderation system.
|
|
/remove - Remove this group from the moderation system.
|
|
/promote - Promote a user to a moderator.
|
|
/demote - Demote a moderator to a user.
|
|
/modcast - Send a broadcast to every moderated group.
|
|
]]
|
|
|
|
return message
|
|
|
|
end,
|
|
|
|
['^/modlist[@'..bot.username..']*$'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
local message = ''
|
|
|
|
for k,v in pairs(moddat[msg.chat.id_str]) do
|
|
message = message .. ' - ' .. v .. ' (' .. k .. ')\n'
|
|
end
|
|
|
|
if message ~= '' then
|
|
message = 'Moderators for ' .. msg.chat.title .. ':\n' .. message .. '\n'
|
|
end
|
|
|
|
message = message .. 'Administrators for ' .. config.moderation.realm_name .. ':\n'
|
|
for k,v in pairs(config.moderation.admins) do
|
|
message = message .. ' - ' .. v .. ' (' .. k .. ')\n'
|
|
end
|
|
|
|
return message
|
|
|
|
end,
|
|
|
|
['^/modcast[@'..bot.username..']*'] = function(msg)
|
|
|
|
local message = msg.text:input()
|
|
if not message then
|
|
return 'You must include a message.'
|
|
end
|
|
|
|
if msg.chat.id ~= config.moderation.admin_group then
|
|
return 'This command must be run in the administration group.'
|
|
end
|
|
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_admin
|
|
end
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
for k,v in pairs(moddat) do
|
|
sendMessage(k, message)
|
|
end
|
|
|
|
return 'Your broadcast has been sent.'
|
|
|
|
end,
|
|
|
|
['^/add[@'..bot.username..']*$'] = function(msg)
|
|
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_admin
|
|
end
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if moddat[msg.chat.id_str] then
|
|
return 'I am already moderating this group.'
|
|
end
|
|
|
|
moddat[msg.chat.id_str] = {}
|
|
save_data('moderation.json', moddat)
|
|
return 'I am now moderating this group.'
|
|
|
|
end,
|
|
|
|
['^/remove[@'..bot.username..']*$'] = function(msg)
|
|
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_admin
|
|
end
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
moddat[msg.chat.id_str] = nil
|
|
save_data('moderation.json', moddat)
|
|
return 'I am no longer moderating this group.'
|
|
|
|
end,
|
|
|
|
['^/promote[@'..bot.username..']*$'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_admin
|
|
end
|
|
|
|
if not msg.reply_to_message then
|
|
return 'Promotions must be done via reply.'
|
|
end
|
|
|
|
local modid = tostring(msg.reply_to_message.from.id)
|
|
local modname = msg.reply_to_message.from.first_name
|
|
|
|
if config.moderation.admins[modid] then
|
|
return modname .. ' is already an administrator.'
|
|
end
|
|
|
|
if moddat[msg.chat.id_str][modid] then
|
|
return modname .. ' is already a moderator.'
|
|
end
|
|
|
|
moddat[msg.chat.id_str][modid] = modname
|
|
save_data('moderation.json', moddat)
|
|
|
|
return modname .. ' is now a moderator.'
|
|
|
|
end,
|
|
|
|
['^/demote[@'..bot.username..']*'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_admin
|
|
end
|
|
|
|
local modid = msg.text:input()
|
|
|
|
if not modid then
|
|
if msg.reply_to_message then
|
|
modid = tostring(msg.reply_to_message.from.id)
|
|
else
|
|
return 'Demotions must be done via reply or specification of a moderator\'s ID.'
|
|
end
|
|
end
|
|
|
|
if config.moderation.admins[modid] then
|
|
return config.moderation.admins[modid] .. ' is an administrator.'
|
|
end
|
|
|
|
if not moddat[msg.chat.id_str][modid] then
|
|
return 'User is not a moderator.'
|
|
end
|
|
|
|
local modname = moddat[msg.chat.id_str][modid]
|
|
moddat[msg.chat.id_str][modid] = nil
|
|
save_data('moderation.json', moddat)
|
|
|
|
return modname .. ' is no longer a moderator.'
|
|
|
|
end,
|
|
|
|
['/modkick[@'..bot.username..']*'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
if not moddat[msg.chat.id_str][msg.from.id_str] then
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_mod
|
|
end
|
|
end
|
|
|
|
local userid = msg.text:input()
|
|
local usernm = userid
|
|
|
|
if not userid then
|
|
if msg.reply_to_message then
|
|
userid = tostring(msg.reply_to_message.from.id)
|
|
usernm = msg.reply_to_message.from.first_name
|
|
else
|
|
return 'Kicks must be done via reply or specification of a user/bot\'s ID or username.'
|
|
end
|
|
end
|
|
|
|
if moddat[msg.chat.id_str][userid] or config.moderation.admins[userid] then
|
|
return 'You cannot kick a moderator.'
|
|
end
|
|
|
|
sendMessage(config.moderation.admin_group, '/kick ' .. userid .. ' from ' .. math.abs(msg.chat.id))
|
|
|
|
sendMessage(config.moderation.admin_group, usernm .. ' kicked from ' .. msg.chat.title .. ' by ' .. msg.from.first_name .. '.')
|
|
|
|
end,
|
|
|
|
['^/modban[@'..bot.username..']*'] = function(msg)
|
|
|
|
local moddat = load_data('moderation.json')
|
|
|
|
if not moddat[msg.chat.id_str] then
|
|
return config.errors.moderation
|
|
end
|
|
|
|
if not moddat[msg.chat.id_str][msg.from.id_str] then
|
|
if not config.moderation.admins[msg.from.id_str] then
|
|
return config.errors.not_mod
|
|
end
|
|
end
|
|
|
|
local userid = msg.text:input()
|
|
local usernm = userid
|
|
|
|
if not userid then
|
|
if msg.reply_to_message then
|
|
userid = tostring(msg.reply_to_message.from.id)
|
|
usernm = msg.reply_to_message.from.first_name
|
|
else
|
|
return 'Bans must be done via reply or specification of a user/bot\'s ID or username.'
|
|
end
|
|
end
|
|
|
|
if moddat[msg.chat.id_str][userid] or config.moderation.admins[userid] then
|
|
return 'You cannot ban a moderator.'
|
|
end
|
|
|
|
sendMessage(config.moderation.admin_group, '/ban ' .. userid .. ' from ' .. math.abs(msg.chat.id))
|
|
|
|
sendMessage(config.moderation.admin_group, usernm .. ' banned from ' .. msg.chat.title .. ' by ' .. msg.from.first_name .. '.')
|
|
|
|
end
|
|
|
|
}
|
|
|
|
local action = function(msg)
|
|
|
|
for k,v in pairs(commands) do
|
|
if string.match(msg.text, k) then
|
|
local output = v(msg)
|
|
if output then
|
|
sendReply(msg, output)
|
|
end
|
|
return
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
return {
|
|
action = action,
|
|
triggers = triggers
|
|
}
|