 -- 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 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 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 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 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
}
