This repository has been archived on 2021-04-24. You can view files and clone it, but cannot push or open issues or pull requests.
Mikubot-2/plugins/moderation.lua
2016-04-10 21:04:47 -07:00

310 lines
8.6 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 moderation = {}
local bindings = require('bindings')
local utilities = require('utilities')
local antisquig = {}
local commands = {
['^/modhelp$'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
local output = [[
*Users:*
• /modlist - List the moderators and administrators of this group.
*Moderators:*
• /modkick - Kick a user from this group.
• /modban - Ban a user from this group.
*Administrators:*
• /modadd - Add this group to the moderation system.
• /modrem - Remove this group from the moderation system.
• /modprom - Promote a user to a moderator.
• /moddem - Demote a moderator to a user.
• /modcast - Send a broadcast to every moderated group.
]]
output = output:gsub('\t', '')
bindings.sendMessage(self, msg.chat.id, output, true, nil, true)
end,
['^/modlist$'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
local output = ''
for k,v in pairs(self.database.moderation[msg.chat.id_str]) do
output = output .. '' .. v .. ' (' .. k .. ')\n'
end
if output ~= '' then
output = '*Moderators for* _' .. msg.chat.title .. '_ *:*\n' .. output
end
output = output .. '*Administrators for* _' .. self.config.moderation.realm_name .. '_ *:*\n'
for k,v in pairs(self.config.moderation.admins) do
output = output .. '' .. v .. ' (' .. k .. ')\n'
end
bindings.sendMessage(self, msg.chat.id, output, true, nil, true)
end,
['^/modcast'] = function(self, msg)
local output = utilities.input(msg.text)
if not output then
return 'You must include a message.'
end
if msg.chat.id ~= self.config.moderation.admin_group then
return 'This command must be run in the administration group.'
end
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_admin
end
output = '*Admin Broadcast:*\n' .. output
for k,_ in pairs(self.database.moderation) do
bindings.sendMessage(self, k, output, true, nil, true)
end
return 'Your broadcast has been sent.'
end,
['^/modadd$'] = function(self, msg)
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_admin
end
if self.database.moderation[msg.chat.id_str] then
return 'I am already moderating this group.'
end
self.database.moderation[msg.chat.id_str] = {}
return 'I am now moderating this group.'
end,
['^/modrem$'] = function(self, msg)
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_admin
end
if not self.database.moderation[msg.chat.id_str] then
return self.config.moderation.errors.moderation
end
self.database.moderation[msg.chat.id_str] = nil
return 'I am no longer moderating this group.'
end,
['^/modprom$'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.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 self.config.moderation.admins[modid] then
return modname .. ' is already an administrator.'
end
if self.database.moderation[msg.chat.id_str][modid] then
return modname .. ' is already a moderator.'
end
self.database.moderation[msg.chat.id_str][modid] = modname
return modname .. ' is now a moderator.'
end,
['^/moddem'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_admin
end
local modid = utilities.input(msg.text)
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 self.config.moderation.admins[modid] then
return self.config.moderation.admins[modid] .. ' is an administrator.'
end
if not self.database.moderation[msg.chat.id_str][modid] then
return 'User is not a moderator.'
end
local modname = self.database.moderation[msg.chat.id_str][modid]
self.database.moderation[msg.chat.id_str][modid] = nil
return modname .. ' is no longer a moderator.'
end,
['/modkick'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
if not self.database.moderation[msg.chat.id_str][msg.from.id_str] then
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_mod
end
end
local userid = utilities.input(msg.text)
local usernm = userid
if msg.reply_to_message then
userid = tostring(msg.reply_to_message.from.id)
usernm = msg.reply_to_message.from.first_name
end
if not userid then
return 'Kicks must be done via reply or specification of a user/bot\'s ID or username.'
end
if self.database.moderation[msg.chat.id_str][userid] or self.config.moderation.admins[userid] then
return 'You cannot kick a moderator.'
end
bindings.sendMessage(self, self.config.moderation.admin_group, '/kick ' .. userid .. ' from ' .. math.abs(msg.chat.id))
bindings.sendMessage(self, self.config.moderation.admin_group, usernm .. ' kicked from ' .. msg.chat.title .. ' by ' .. msg.from.first_name .. '.')
end,
['^/modban'] = function(self, msg)
if not self.database.moderation[msg.chat.id_str] then return end
if not self.database.moderation[msg.chat.id_str][msg.from.id_str] then
if not self.config.moderation.admins[msg.from.id_str] then
return self.config.moderation.errors.not_mod
end
end
local userid = utilities.input(msg.text)
local usernm = userid
if msg.reply_to_message then
userid = tostring(msg.reply_to_message.from.id)
usernm = msg.reply_to_message.from.first_name
end
if not userid then
return 'Kicks must be done via reply or specification of a user/bot\'s ID or username.'
end
if self.database.moderation[msg.chat.id_str][userid] or self.config.moderation.admins[userid] then
return 'You cannot ban a moderator.'
end
bindings.sendMessage(self.config.moderation.admin_group, '/ban ' .. userid .. ' from ' .. math.abs(msg.chat.id))
bindings.sendMessage(self.config.moderation.admin_group, usernm .. ' banned from ' .. msg.chat.title .. ' by ' .. msg.from.first_name .. '.')
end
}
function moderation:init()
if not self.database.moderation then
self.database.moderation = {}
end
if self.config.moderation.antisquig then
commands['[\216-\219][\128-\191]'] = function(msg)
if not self.database.moderation[msg.chat.id_str] then return true end
if self.config.moderation.admins[msg.from.id_str] then return true end
if self.database.moderation[msg.chat.id_str][msg.from.id_str] then return true end
if antisquig[msg.from.id] == true then
return
end
antisquig[msg.from.id] = true
bindings.sendReply(self, msg, self.config.moderation.errors.antisquig)
bindings.sendMessage(self, self.config.moderation.admin_group, '/kick ' .. msg.from.id .. ' from ' .. math.abs(msg.chat.id))
bindings.sendMessage(self, self.config.moderation.admin_group, 'ANTISQUIG: ' .. msg.from.first_name .. ' kicked from ' .. msg.chat.title .. '.')
end
end
moderation.triggers = {}
for trigger,_ in pairs(commands) do
if trigger[-1] == '$' then
moderation.triggers:insert(trigger:sub(1, -2)..'@'..self.info.username..'$')
else
moderation.triggers:insert(trigger..'%s+[^%s]*')
moderation.triggers:insert(trigger..'@'..self.info.username..'%s+[^%s]*')
moderation.triggers:insert(trigger..'$')
moderation.triggers:insert(trigger..'@'..self.info.username..'$')
end
end
end
function moderation:action(msg)
for trigger,command in pairs(commands) do
if string.match(msg.text_lower, trigger) then
local output = command(self, msg)
if output == true then
return true
elseif output then
bindings.sendReply(self, msg, output)
end
return
end
end
return true
end
-- When a user is kicked for squiggles, his ID is added to this table.
-- That user will not be kicked again as long as his ID is in the table.
-- The table is emptied every five seconds.
-- Thus the bot will not spam the group or admin group when a user posts more than one infringing messages.
function moderation:cron()
antisquig = {}
end
return moderation