2016-02-23 12:15:48 +01:00
--[[
administration.lua
2016-05-25 15:01:54 +02:00
Version 1.10
2016-02-23 12:15:48 +01:00
Part of the otouto project .
© 2016 topkecleon < drew @ otou.to >
GNU General Public License , version 2
This plugin provides self - hosted , single - realm group administration .
It requires tg ( http : // github.com / vysheng / tg ) with supergroup support .
2016-05-25 15:01:54 +02:00
For more documentation , read the the manual ( otou.to / rtfm ) .
2016-02-23 12:15:48 +01:00
Remember to load this before blacklist.lua .
2016-02-25 10:42:13 +01:00
2016-03-04 23:08:21 +01:00
Important notices about updates will be here !
2016-05-19 08:34:24 +02:00
1.9 - Added flag antihammer . Groups with antihammer enabled will not be
2016-05-25 15:01:54 +02:00
affected by global bans . However , users who are hammer ' d from an anti-
hammer group will also be banned locally . Added autobanning after ( default )
3 autokicks . Threshold onfigurable with antiflood . Autokick counters reset
within twenty - four hours . Merged antisquig action into generic . There is no
automatic migration ; simply add the following to database.administration :
2016-05-19 08:42:11 +02:00
autokick_timer = 0
groups [ * ] . flags [ 6 ] = false
groups [ * ] . autoban = 3
2016-05-29 19:08:39 +02:00
groups [ * ] . autokicks = { } b
2016-03-27 14:30:41 +02:00
2016-05-25 15:01:54 +02:00
1.9 .1 - Returned to non - toggled promotions / bans ( too many complaints ! ) .
1.10 - Added / ahelp $ command support . No migration required . All actions
have been reworked to be more elegant . Style has been slightly changed ( no
more weak - looking , italic group names ) . Added some ( but not many ) comments .
2016-05-10 21:49:05 +02:00
2016-05-26 13:22:20 +02:00
1.10 .1 - Bug fixes and minor improvements . : ^ )
2016-06-07 05:13:26 +02:00
1.10 .2 - Fixed bug in antibot . Further , ranks 2 + will be automatically made
group admins when they join a group .
1.10 .3 - / gadd now supports arguments to enable flags immediately , eg :
" /gadd 1 4 5 " will add a grouo with the unlisted , antibot , and antiflood
flags .
2016-02-23 12:15:48 +01:00
] ] --
2016-04-15 21:07:23 +02:00
local JSON = require ( ' dkjson ' )
2016-05-22 22:08:45 +02:00
local drua = dofile ( ' drua-tg.lua ' )
2016-06-07 06:31:34 +02:00
local bindings = require ( ' otouto.bindings ' )
local utilities = require ( ' otouto.utilities ' )
2016-04-08 23:12:02 +02:00
local administration = { }
2016-05-27 02:26:30 +02:00
function administration : init ( config )
2016-04-08 23:12:02 +02:00
-- Build the administration db if nonexistent.
if not self.database . administration then
self.database . administration = {
admins = { } ,
groups = { } ,
2016-05-19 08:34:24 +02:00
activity = { } ,
autokick_timer = os.date ( ' %d ' )
2016-04-08 23:12:02 +02:00
}
end
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
self.admin_temp = {
help = { } ,
flood = { }
}
2016-03-31 13:53:12 +02:00
2016-05-27 02:26:30 +02:00
drua.PORT = config.cli_port or 4567
2016-04-08 23:12:02 +02:00
2016-06-07 08:22:01 +02:00
administration.flags = administration.init_flags ( config.cmd_pat )
2016-05-27 02:26:30 +02:00
administration.init_command ( self , config )
2016-02-20 11:07:20 +01:00
2016-05-27 05:28:44 +02:00
administration.doc = ' `Returns a list of administrated groups. \n Use ' .. config.cmd_pat .. ' ahelp for more administrative commands.` '
2016-04-08 23:12:02 +02:00
end
2016-05-27 05:28:44 +02:00
function administration . init_flags ( cmd_pat ) return {
2016-02-20 11:07:20 +01:00
[ 1 ] = {
name = ' unlisted ' ,
desc = ' Removes this group from the group listing. ' ,
2016-02-25 10:42:13 +01:00
short = ' This group is unlisted. ' ,
2016-05-27 05:28:44 +02:00
enabled = ' This group is no longer listed in ' .. cmd_pat .. ' groups. ' ,
disabled = ' This group is now listed in ' .. cmd_pat .. ' groups. '
2016-02-20 11:07:20 +01:00
} ,
[ 2 ] = {
name = ' antisquig ' ,
desc = ' Automatically removes users who post Arabic script or RTL characters. ' ,
2016-02-25 10:42:13 +01:00
short = ' This group does not allow Arabic script or RTL characters. ' ,
2016-02-20 11:07:20 +01:00
enabled = ' Users will now be removed automatically for posting Arabic script and/or RTL characters. ' ,
2016-05-26 13:22:20 +02:00
disabled = ' Users will no longer be removed automatically for posting Arabic script and/or RTL characters. ' ,
2016-02-25 10:42:13 +01:00
kicked = ' You were automatically kicked from GROUPNAME for posting Arabic script and/or RTL characters. '
2016-02-20 11:07:20 +01:00
} ,
[ 3 ] = {
2016-03-31 13:53:12 +02:00
name = ' antisquig++ ' ,
2016-02-20 11:07:20 +01:00
desc = ' Automatically removes users whose names contain Arabic script or RTL characters. ' ,
2016-02-25 10:42:13 +01:00
short = ' This group does not allow users whose names contain Arabic script or RTL characters. ' ,
2016-02-20 11:07:20 +01:00
enabled = ' Users whose names contain Arabic script and/or RTL characters will now be removed automatically. ' ,
disabled = ' Users whose names contain Arabic script and/or RTL characters will no longer be removed automatically. ' ,
2016-02-25 10:42:13 +01:00
kicked = ' You were automatically kicked from GROUPNAME for having a name which contains Arabic script and/or RTL characters. '
2016-02-20 11:07:20 +01:00
} ,
[ 4 ] = {
name = ' antibot ' ,
2016-03-22 11:16:26 +01:00
desc = ' Prevents the addition of bots by non-moderators. ' ,
2016-02-25 10:42:13 +01:00
short = ' This group does not allow users to add bots. ' ,
2016-02-20 11:07:20 +01:00
enabled = ' Non-moderators will no longer be able to add bots. ' ,
disabled = ' Non-moderators will now be able to add bots. '
2016-03-31 13:53:12 +02:00
} ,
[ 5 ] = {
name = ' antiflood ' ,
desc = ' Prevents flooding by rate-limiting messages per user. ' ,
short = ' This group automatically removes users who flood. ' ,
2016-05-27 05:28:44 +02:00
enabled = ' Users will now be removed automatically for excessive messages. Use ' .. cmd_pat .. ' antiflood to configure limits. ' ,
2016-03-31 13:53:12 +02:00
disabled = ' Users will no longer be removed automatically for excessive messages. ' ,
kicked = ' You were automatically kicked from GROUPNAME for flooding. '
2016-05-19 08:34:24 +02:00
} ,
[ 6 ] = {
name = ' antihammer ' ,
2016-05-29 19:08:39 +02:00
desc = ' Allows globally banned users to enter this group. Note that users hammered in this group will also be banned locally. ' ,
2016-05-19 08:34:24 +02:00
short = ' This group does not acknowledge global bans. ' ,
enabled = ' This group will no longer remove users for being globally banned. ' ,
disabled = ' This group will now remove users for being globally banned. '
2016-02-20 11:07:20 +01:00
}
2016-05-27 05:28:44 +02:00
} end
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
administration.antiflood = {
2016-05-20 09:34:52 +02:00
text = 10 ,
voice = 10 ,
audio = 10 ,
contact = 10 ,
photo = 20 ,
video = 20 ,
location = 20 ,
document = 20 ,
2016-05-22 22:08:45 +02:00
sticker = 30
2016-03-31 13:53:12 +02:00
}
2016-04-08 23:12:02 +02:00
administration.ranks = {
2016-02-20 11:07:20 +01:00
[ 0 ] = ' Banned ' ,
[ 1 ] = ' Users ' ,
[ 2 ] = ' Moderators ' ,
[ 3 ] = ' Governors ' ,
[ 4 ] = ' Administrators ' ,
[ 5 ] = ' Owner '
}
2016-05-27 02:26:30 +02:00
function administration : get_rank ( target , chat , config )
2016-02-20 11:07:20 +01:00
target = tostring ( target )
2016-05-19 08:34:24 +02:00
chat = tostring ( chat )
2016-02-20 11:07:20 +01:00
2016-05-25 15:01:54 +02:00
-- Return 5 if the target is the bot or its owner.
2016-05-27 02:26:30 +02:00
if tonumber ( target ) == config.admin or tonumber ( target ) == self.info . id then
2016-02-20 11:07:20 +01:00
return 5
end
2016-05-25 15:01:54 +02:00
-- Return 4 if the target is an administrator.
2016-04-08 23:12:02 +02:00
if self.database . administration.admins [ target ] then
2016-02-20 11:07:20 +01:00
return 4
end
2016-04-08 23:12:02 +02:00
if chat and self.database . administration.groups [ chat ] then
2016-05-25 15:01:54 +02:00
-- Return 3 if the target is the governor of the chat.
2016-04-08 23:12:02 +02:00
if self.database . administration.groups [ chat ] . governor == tonumber ( target ) then
2016-02-20 11:07:20 +01:00
return 3
2016-05-25 15:01:54 +02:00
-- Return 2 if the target is a moderator of the chat.
2016-04-08 23:12:02 +02:00
elseif self.database . administration.groups [ chat ] . mods [ target ] then
2016-02-20 11:07:20 +01:00
return 2
2016-05-25 15:01:54 +02:00
-- Return 0 if the target is banned from the chat.
2016-04-08 23:12:02 +02:00
elseif self.database . administration.groups [ chat ] . bans [ target ] then
2016-02-20 11:07:20 +01:00
return 0
2016-05-25 15:01:54 +02:00
-- Return 1 if antihammer is enabled.
elseif self.database . administration.groups [ chat ] . flags [ 6 ] then
return 1
2016-02-20 11:07:20 +01:00
end
end
2016-05-25 15:01:54 +02:00
-- Return 0 if the target is blacklisted (and antihammer is not enabled).
2016-04-08 23:12:02 +02:00
if self.database . blacklist [ target ] then
2016-05-25 15:01:54 +02:00
return 0
2016-02-20 11:07:20 +01:00
end
2016-05-25 15:01:54 +02:00
-- Return 1 if the target is a regular user.
2016-02-20 11:07:20 +01:00
return 1
end
2016-05-27 02:26:30 +02:00
function administration : get_target ( msg , config )
2016-04-08 23:12:02 +02:00
local target = utilities.user_from_message ( self , msg )
2016-02-20 11:07:20 +01:00
if target.id then
2016-05-27 02:26:30 +02:00
target.rank = administration.get_rank ( self , target.id_str , msg.chat . id , config )
2016-02-20 11:07:20 +01:00
end
return target
end
2016-04-08 23:12:02 +02:00
function administration : mod_format ( id )
2016-03-28 08:15:46 +02:00
id = tostring ( id )
2016-04-08 23:12:02 +02:00
local user = self.database . users [ id ] or { first_name = ' Unknown ' }
local name = utilities.build_name ( user.first_name , user.last_name )
name = utilities.markdown_escape ( name )
2016-03-28 08:15:46 +02:00
local output = ' • ' .. name .. ' `[ ' .. id .. ' ]` \n '
2016-05-19 08:42:11 +02:00
return output
2016-03-28 08:15:46 +02:00
end
2016-05-27 05:28:44 +02:00
function administration : get_desc ( chat_id , config )
2016-02-23 12:15:48 +01:00
2016-04-08 23:12:02 +02:00
local group = self.database . administration.groups [ tostring ( chat_id ) ]
2016-03-28 08:15:46 +02:00
local t = { }
2016-02-23 12:15:48 +01:00
if group.link then
2016-03-28 08:15:46 +02:00
table.insert ( t , ' *Welcome to* [ ' .. group.name .. ' ]( ' .. group.link .. ' )*!* ' )
2016-02-23 12:15:48 +01:00
else
2016-05-25 15:01:54 +02:00
table.insert ( t , ' *Welcome to ' .. group.name .. ' !* ' )
2016-02-23 12:15:48 +01:00
end
if group.motd then
2016-03-28 08:15:46 +02:00
table.insert ( t , ' *Message of the Day:* \n ' .. group.motd )
2016-02-23 12:15:48 +01:00
end
2016-03-22 11:16:26 +01:00
if # group.rules > 0 then
2016-03-28 08:15:46 +02:00
local rulelist = ' *Rules:* \n '
2016-05-25 15:01:54 +02:00
for i = 1 , # group.rules do
rulelist = rulelist .. ' * ' .. i .. ' .* ' .. group.rules [ i ] .. ' \n '
2016-02-25 10:42:13 +01:00
end
2016-04-15 21:07:23 +02:00
table.insert ( t , utilities.trim ( rulelist ) )
2016-02-25 10:42:13 +01:00
end
2016-03-28 08:15:46 +02:00
local flaglist = ' '
2016-04-08 23:12:02 +02:00
for i = 1 , # administration.flags do
2016-03-28 08:15:46 +02:00
if group.flags [ i ] then
2016-04-08 23:12:02 +02:00
flaglist = flaglist .. ' • ' .. administration.flags [ i ] . short .. ' \n '
2016-02-25 10:42:13 +01:00
end
2016-02-23 12:15:48 +01:00
end
2016-03-28 08:15:46 +02:00
if flaglist ~= ' ' then
2016-04-15 21:07:23 +02:00
table.insert ( t , ' *Flags:* \n ' .. utilities.trim ( flaglist ) )
2016-03-28 08:15:46 +02:00
end
2016-04-05 09:42:16 +02:00
if group.governor then
2016-04-08 23:12:02 +02:00
local gov = self.database . users [ tostring ( group.governor ) ]
local s = utilities.md_escape ( utilities.build_name ( gov.first_name , gov.last_name ) ) .. ' `[ ' .. gov.id .. ' ]` '
2016-04-05 09:42:16 +02:00
table.insert ( t , ' *Governor:* ' .. s )
end
2016-03-28 08:15:46 +02:00
local modstring = ' '
2016-04-08 23:12:02 +02:00
for k , _ in pairs ( group.mods ) do
modstring = modstring .. administration.mod_format ( self , k )
2016-03-28 08:15:46 +02:00
end
if modstring ~= ' ' then
2016-04-15 21:07:23 +02:00
table.insert ( t , ' *Moderators:* \n ' .. utilities.trim ( modstring ) )
2016-03-28 08:15:46 +02:00
end
2016-06-07 08:22:01 +02:00
table.insert ( t , ' Run ' .. config.cmd_pat .. ' ahelp@ ' .. self.info . username .. ' for a list of commands. ' )
2016-04-05 09:42:16 +02:00
return table.concat ( t , ' \n \n ' )
end
2016-05-27 05:28:44 +02:00
function administration : update_desc ( chat , config )
2016-04-08 23:12:02 +02:00
local group = self.database . administration.groups [ tostring ( chat ) ]
2016-04-05 09:42:16 +02:00
local desc = ' Welcome to ' .. group.name .. ' ! \n '
if group.motd then desc = desc .. group.motd .. ' \n ' end
2016-04-01 19:29:00 +02:00
if group.governor then
2016-04-08 23:12:02 +02:00
local gov = self.database . users [ tostring ( group.governor ) ]
desc = desc .. ' \n Governor: ' .. utilities.build_name ( gov.first_name , gov.last_name ) .. ' [ ' .. gov.id .. ' ] \n '
2016-03-28 08:15:46 +02:00
end
2016-05-27 05:28:44 +02:00
local s = ' \n ' .. config.cmd_pat .. ' desc@ ' .. self.info . username .. ' for more information. '
2016-04-05 09:42:16 +02:00
desc = desc : sub ( 1 , 250 - s : len ( ) ) .. s
drua.channel_set_about ( chat , desc )
2016-02-23 12:15:48 +01:00
end
2016-05-27 02:26:30 +02:00
function administration : kick_user ( chat , target , reason , config )
2016-05-21 02:47:13 +02:00
drua.kick_user ( chat , target )
2016-05-26 13:22:20 +02:00
local victim = target
if self.database . users [ tostring ( target ) ] then
victim = utilities.build_name (
self.database . users [ tostring ( target ) ] . first_name ,
self.database . users [ tostring ( target ) ] . last_name
)
end
local group = self.database . administration.groups [ tostring ( chat ) ] . name
2016-05-27 02:26:30 +02:00
utilities.handle_exception ( self , victim .. ' kicked from ' .. group , reason , config )
2016-05-19 08:34:24 +02:00
end
2016-05-27 02:26:30 +02:00
function administration . init_command ( self_ , config )
2016-04-08 23:12:02 +02:00
administration.commands = {
2016-02-20 11:07:20 +01:00
2016-05-19 08:34:24 +02:00
{ -- generic, mostly autokicks
2016-04-08 23:12:02 +02:00
triggers = { ' ' } ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
privilege = 0 ,
interior = true ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
local rank = administration.get_rank ( self , msg.from . id , msg.chat . id , config )
2016-05-26 13:22:20 +02:00
local user = { }
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
if rank < 2 then
2016-02-20 11:07:20 +01:00
2016-05-19 08:34:24 +02:00
-- banned
if rank == 0 then
user.do_kick = true
2016-05-26 13:22:20 +02:00
user.dont_unban = true
2016-05-19 08:34:24 +02:00
user.reason = ' banned '
user.output = ' Sorry, you are banned from ' .. msg.chat . title .. ' . '
2016-05-22 22:08:45 +02:00
elseif group.flags [ 2 ] and ( -- antisquig
2016-05-20 09:34:52 +02:00
msg.text : match ( utilities.char . arabic )
2016-05-22 22:08:45 +02:00
or msg.text : match ( utilities.char . rtl_override )
or msg.text : match ( utilities.char . rtl_mark )
2016-05-19 08:34:24 +02:00
) then
user.do_kick = true
user.reason = ' antisquig '
user.output = administration.flags [ 2 ] . kicked : gsub ( ' GROUPNAME ' , msg.chat . title )
2016-05-22 22:08:45 +02:00
elseif group.flags [ 3 ] and ( -- antisquig++
2016-05-20 09:34:52 +02:00
msg.from . name : match ( utilities.char . arabic )
2016-05-22 22:08:45 +02:00
or msg.from . name : match ( utilities.char . rtl_override )
or msg.from . name : match ( utilities.char . rtl_mark )
2016-05-19 08:34:24 +02:00
) then
user.do_kick = true
user.reason = ' antisquig++ '
user.output = administration.flags [ 3 ] . kicked : gsub ( ' GROUPNAME ' , msg.chat . title )
2016-02-20 11:07:20 +01:00
end
2016-04-08 23:12:02 +02:00
-- antiflood
2016-05-19 08:34:24 +02:00
if group.flags [ 5 ] then
2016-04-08 23:12:02 +02:00
if not group.antiflood then
group.antiflood = JSON.decode ( JSON.encode ( administration.antiflood ) )
end
if not self.admin_temp . flood [ msg.chat . id_str ] then
self.admin_temp . flood [ msg.chat . id_str ] = { }
end
if not self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] then
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = 0
end
if msg.sticker then -- Thanks Brazil for discarding switches.
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . sticker
2016-04-08 23:12:02 +02:00
elseif msg.photo then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . photo
2016-04-08 23:12:02 +02:00
elseif msg.document then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . document
2016-04-08 23:12:02 +02:00
elseif msg.audio then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . audio
2016-04-08 23:12:02 +02:00
elseif msg.contact then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . contact
2016-04-08 23:12:02 +02:00
elseif msg.video then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . video
2016-04-08 23:12:02 +02:00
elseif msg.location then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . location
2016-04-08 23:12:02 +02:00
elseif msg.voice then
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . voice
2016-04-08 23:12:02 +02:00
else
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] + group.antiflood . text
2016-04-08 23:12:02 +02:00
end
2016-05-20 09:34:52 +02:00
if self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] > 99 then
2016-05-19 08:34:24 +02:00
user.do_kick = true
user.reason = ' antiflood '
user.output = administration.flags [ 5 ] . kicked : gsub ( ' GROUPNAME ' , msg.chat . title )
2016-05-20 09:34:52 +02:00
self.admin_temp . flood [ msg.chat . id_str ] [ msg.from . id_str ] = nil
2016-04-08 23:12:02 +02:00
end
2016-03-31 13:53:12 +02:00
end
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
2016-05-19 08:34:24 +02:00
local new_user = user
2016-05-31 01:10:58 +02:00
local new_rank = rank
2016-02-20 11:07:20 +01:00
2016-05-19 08:34:24 +02:00
if msg.new_chat_participant then
2016-02-20 11:07:20 +01:00
2016-05-31 01:10:58 +02:00
-- I hate typing this out.
local noob = msg.new_chat_participant
2016-05-19 08:34:24 +02:00
-- We'll make a new table for the new guy, unless he's also
-- the original guy.
if msg.new_chat_participant . id ~= msg.from . id then
2016-05-26 13:22:20 +02:00
new_user = { }
2016-05-27 02:26:30 +02:00
new_rank = administration.get_rank ( self , noob.id , msg.chat . id , config )
2016-02-20 11:07:20 +01:00
end
2016-05-31 01:10:58 +02:00
if new_rank == 0 then
new_user.do_kick = true
new_user.dont_unban = true
new_user.reason = ' banned '
new_user.output = ' Sorry, you are banned from ' .. msg.chat . title .. ' . '
elseif new_rank == 1 then
if group.flags [ 3 ] and ( -- antisquig++
2016-05-26 13:22:20 +02:00
noob.name : match ( utilities.char . arabic )
or noob.name : match ( utilities.char . rtl_override )
or noob.name : match ( utilities.char . rtl_mark )
2016-05-19 08:34:24 +02:00
) then
new_user.do_kick = true
new_user.reason = ' antisquig++ '
new_user.output = administration.flags [ 3 ] . kicked : gsub ( ' GROUPNAME ' , msg.chat . title )
2016-05-31 01:10:58 +02:00
elseif ( -- antibot
group.flags [ 4 ]
and noob.username
2016-05-31 03:06:33 +02:00
and noob.username : match ( ' bot$ ' )
2016-05-31 01:10:58 +02:00
and rank < 2
) then
2016-05-19 08:34:24 +02:00
new_user.do_kick = true
new_user.reason = ' antibot '
end
2016-05-31 01:10:58 +02:00
else
-- Make the new user a group admin if he's a mod or higher.
if msg.chat . type == ' supergroup ' then
drua.channel_set_admin ( msg.chat . id , msg.new_chat_participant . id , 2 )
end
2016-02-20 11:07:20 +01:00
end
2016-04-08 23:12:02 +02:00
elseif msg.new_chat_title then
if rank < 3 then
drua.rename_chat ( msg.chat . id , group.name )
else
group.name = msg.new_chat_title
if group.grouptype == ' supergroup ' then
2016-05-27 05:28:44 +02:00
administration.update_desc ( self , msg.chat . id , config )
2016-04-08 23:12:02 +02:00
end
2016-04-05 09:42:16 +02:00
end
2016-04-08 23:12:02 +02:00
elseif msg.new_chat_photo then
if group.grouptype == ' group ' then
if rank < 3 then
drua.set_photo ( msg.chat . id , group.photo )
else
group.photo = drua.get_photo ( msg.chat . id )
end
2016-02-20 11:07:20 +01:00
else
2016-03-27 14:30:41 +02:00
group.photo = drua.get_photo ( msg.chat . id )
2016-02-20 11:07:20 +01:00
end
2016-04-08 23:12:02 +02:00
elseif msg.delete_chat_photo then
if group.grouptype == ' group ' then
if rank < 3 then
drua.set_photo ( msg.chat . id , group.photo )
else
group.photo = nil
end
2016-02-20 11:07:20 +01:00
else
group.photo = nil
end
2016-05-19 08:34:24 +02:00
end
2016-05-22 22:08:45 +02:00
if new_user ~= user and new_user.do_kick then
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , msg.new_chat_participant . id , new_user.reason , config )
2016-05-22 22:08:45 +02:00
if new_user.output then
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.new_chat_participant . id , new_user.output )
2016-05-22 22:08:45 +02:00
end
2016-05-26 13:22:20 +02:00
if not new_user.dont_unban and msg.chat . type == ' supergroup ' then
2016-05-29 19:08:39 +02:00
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = msg.from . id } )
2016-05-19 08:34:24 +02:00
end
end
2016-05-26 13:22:20 +02:00
if group.flags [ 5 ] and user.do_kick and not user.dont_unban then
2016-05-19 08:34:24 +02:00
if group.autokicks [ msg.from . id_str ] then
group.autokicks [ msg.from . id_str ] = group.autokicks [ msg.from . id_str ] + 1
else
group.autokicks [ msg.from . id_str ] = 1
end
if group.autokicks [ msg.from . id_str ] >= group.autoban then
group.autokicks [ msg.from . id_str ] = 0
2016-05-26 13:22:20 +02:00
group.bans [ msg.from . id_str ] = true
user.dont_unban = true
2016-05-20 09:34:52 +02:00
user.reason = ' antiflood autoban: ' .. user.reason
2016-05-22 22:08:45 +02:00
user.output = user.output .. ' \n You have been banned for being autokicked too many times. '
2016-05-19 08:34:24 +02:00
end
end
2016-05-26 13:22:20 +02:00
if user.do_kick then
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , msg.from . id , user.reason , config )
2016-05-19 08:34:24 +02:00
if user.output then
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.from . id , user.output )
2016-05-19 08:34:24 +02:00
end
2016-05-26 13:22:20 +02:00
if not user.dont_unban and msg.chat . type == ' supergroup ' then
2016-05-29 19:08:39 +02:00
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = msg.from . id } )
2016-05-19 08:34:24 +02:00
end
end
2016-05-22 22:08:45 +02:00
if msg.new_chat_participant and not new_user.do_kick then
2016-05-27 05:28:44 +02:00
local output = administration.get_desc ( self , msg.chat . id , config )
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.new_chat_participant . id , output , true , nil , true )
2016-03-27 14:30:41 +02:00
end
2016-04-08 23:12:02 +02:00
-- Last active time for group listing.
2016-04-26 07:40:31 +02:00
if msg.text : len ( ) > 0 then
for i , v in pairs ( self.database . administration.activity ) do
if v == msg.chat . id_str then
table.remove ( self.database . administration.activity , i )
table.insert ( self.database . administration.activity , 1 , msg.chat . id_str )
end
2016-04-08 23:12:02 +02:00
end
end
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
return true
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /groups
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' groups ' ) . table ,
2016-04-08 23:12:02 +02:00
command = ' groups ' ,
privilege = 1 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of administrated groups. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local output = ' '
for _ , v in ipairs ( self.database . administration.activity ) do
local group = self.database . administration.groups [ v ]
if not group.flags [ 1 ] then -- no unlisted groups
if group.link then
2016-04-26 07:40:31 +02:00
output = output .. ' • [ ' .. utilities.md_escape ( group.name ) .. ' ]( ' .. group.link .. ' ) \n '
2016-04-08 23:12:02 +02:00
else
output = output .. ' • ' .. group.name .. ' \n '
end
2016-02-20 11:07:20 +01:00
end
end
2016-04-08 23:12:02 +02:00
if output == ' ' then
output = ' There are currently no listed groups. '
else
output = ' *Groups:* \n ' .. output
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /ahelp
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' ahelp ' , true ) . table ,
2016-04-08 23:12:02 +02:00
2016-05-25 15:01:54 +02:00
command = ' ahelp \\ [command] ' ,
2016-04-08 23:12:02 +02:00
privilege = 1 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of realm-related commands for your rank (in a private message), or command-specific help. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local rank = administration.get_rank ( self , msg.from . id , msg.chat . id , config )
2016-05-25 15:01:54 +02:00
local input = utilities.get_word ( msg.text_lower , 2 )
if input then
2016-05-27 05:28:44 +02:00
input = input : gsub ( ' ^ ' .. config.cmd_pat .. ' ' , ' ' )
2016-05-25 15:01:54 +02:00
local doc
for _ , action in ipairs ( administration.commands ) do
if action.keyword == input then
2016-05-27 05:28:44 +02:00
doc = ' ' .. config.cmd_pat .. ' ' .. action.command : gsub ( ' \\ ' , ' ' ) .. ' \n ' .. action.doc
2016-05-25 15:01:54 +02:00
break
end
2016-04-08 23:12:02 +02:00
end
2016-05-25 15:01:54 +02:00
if doc then
local output = ' *Help for* _ ' .. input .. ' _ : \n ``` \n ' .. doc .. ' \n ``` '
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
else
2016-05-27 05:28:44 +02:00
local output = ' Sorry, there is no help for that command. \n ' .. config.cmd_pat .. ' ahelp@ ' .. self.info . username
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , output )
2016-04-08 23:12:02 +02:00
end
else
2016-05-25 15:01:54 +02:00
local output = ' *Commands for ' .. administration.ranks [ rank ] .. ' :* \n '
for i = 1 , rank do
for _ , val in ipairs ( self.admin_temp . help [ i ] ) do
2016-05-27 05:28:44 +02:00
output = output .. ' • ' .. config.cmd_pat .. val .. ' \n '
2016-05-25 15:01:54 +02:00
end
end
output = output .. ' Arguments: <required> \\ [optional] '
2016-05-29 19:08:39 +02:00
if utilities.send_message ( self , msg.from . id , output , true , nil , true ) then
2016-05-25 15:01:54 +02:00
if msg.from . id ~= msg.chat . id then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I have sent you the requested information in a private message. ' )
2016-05-25 15:01:54 +02:00
end
else
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
end
2016-04-01 19:29:00 +02:00
end
2016-02-25 10:42:13 +01:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-25 15:01:54 +02:00
{ -- /ops
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' ops ' ) : t ( ' oplist ' ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' ops ' ,
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of moderators and the governor for the group. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local modstring = ' '
for k , _ in pairs ( group.mods ) do
modstring = modstring .. administration.mod_format ( self , k )
end
if modstring ~= ' ' then
2016-05-25 15:01:54 +02:00
modstring = ' *Moderators for ' .. msg.chat . title .. ' :* \n ' .. modstring
2016-04-08 23:12:02 +02:00
end
local govstring = ' '
if group.governor then
local gov = self.database . users [ tostring ( group.governor ) ]
govstring = ' *Governor:* ' .. utilities.md_escape ( utilities.build_name ( gov.first_name , gov.last_name ) ) .. ' `[ ' .. gov.id .. ' ]` '
end
2016-04-15 21:07:23 +02:00
local output = utilities.trim ( modstring ) .. ' \n \n ' .. utilities.trim ( govstring )
2016-04-08 23:12:02 +02:00
if output == ' \n \n ' then
output = ' There are currently no moderators for this group. '
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
2016-02-23 12:15:48 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /desc
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' desc ' ) : t ( ' description ' ) . table ,
2016-04-08 23:12:02 +02:00
command = ' description ' ,
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a description of the group (in a private message), including its motd, rules, flags, governor, and moderators. ' ,
2016-02-23 12:15:48 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-05-27 05:28:44 +02:00
local output = administration.get_desc ( self , msg.chat . id , config )
2016-05-29 19:08:39 +02:00
if utilities.send_message ( self , msg.from . id , output , true , nil , true ) then
2016-04-08 23:12:02 +02:00
if msg.from . id ~= msg.chat . id then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I have sent you the requested information in a private message. ' )
2016-04-08 23:12:02 +02:00
end
else
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-04-01 19:29:00 +02:00
end
2016-02-25 10:42:13 +01:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /rules
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' rules? ' , true ) . table ,
2016-04-08 23:12:02 +02:00
2016-05-25 15:01:54 +02:00
command = ' rules \\ [i] ' ,
2016-04-08 23:12:02 +02:00
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns the group \' s list of rules, or a specific rule. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local output
local input = utilities.get_word ( msg.text_lower , 2 )
input = tonumber ( input )
if # group.rules > 0 then
if input and group.rules [ input ] then
output = ' * ' .. input .. ' .* ' .. group.rules [ input ]
else
2016-05-25 15:01:54 +02:00
output = ' *Rules for ' .. msg.chat . title .. ' :* \n '
2016-04-08 23:12:02 +02:00
for i , v in ipairs ( group.rules ) do
output = output .. ' * ' .. i .. ' .* ' .. v .. ' \n '
end
2016-04-05 12:43:11 +02:00
end
2016-04-08 23:12:02 +02:00
else
output = ' No rules have been set for ' .. msg.chat . title .. ' . '
2016-02-25 10:42:13 +01:00
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /motd
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' motd ' ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' motd ' ,
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns the group \' s message of the day. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local output = ' No MOTD has been set for ' .. msg.chat . title .. ' . '
if group.motd then
2016-05-25 15:01:54 +02:00
output = ' *MOTD for ' .. msg.chat . title .. ' :* \n ' .. group.motd
2016-04-08 23:12:02 +02:00
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /link
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' link ' ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' link ' ,
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns the group \' s link. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local output = ' No link has been set for ' .. msg.chat . title .. ' . '
if group.link then
output = ' [ ' .. msg.chat . title .. ' ]( ' .. group.link .. ' ) '
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /kickme
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' leave ' ) : t ( ' kickme ' ) . table ,
2016-04-26 20:42:16 +02:00
2016-04-27 05:43:15 +02:00
command = ' kickme ' ,
privilege = 1 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Removes the user from the group. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
if administration.get_rank ( self , msg.from . id , nil , config ) == 5 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I can \' t let you do that, ' .. msg.from . name .. ' . ' )
2016-05-25 15:01:54 +02:00
else
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , msg.from . id , ' kickme ' , config )
2016-06-07 05:13:26 +02:00
utilities.send_message ( self , msg.chat . id , ' Goodbye, ' .. msg.from . name .. ' ! ' , true )
2016-05-25 15:01:54 +02:00
if msg.chat . type == ' supergroup ' then
2016-05-29 19:08:39 +02:00
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = msg.from . id } )
2016-05-25 15:01:54 +02:00
end
2016-04-27 05:43:15 +02:00
end
2016-04-18 05:28:55 +02:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /kick
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' kick ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' kick <user> ' ,
privilege = 2 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Removes a user from the group. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-04-08 23:12:02 +02:00
elseif target.rank > 1 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is too privileged to be kicked. ' )
2016-05-25 15:01:54 +02:00
else
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , target.id , ' kicked by ' .. msg.from . name , config )
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , target.name .. ' has been kicked. ' )
2016-05-25 15:01:54 +02:00
if msg.chat . type == ' supergroup ' then
2016-05-29 19:08:39 +02:00
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = target.id } )
2016-05-25 15:01:54 +02:00
end
2016-04-26 07:40:31 +02:00
end
2016-02-20 11:07:20 +01:00
end
2016-02-25 10:42:13 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /ban
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' ban ' , true ) . table ,
2016-02-25 10:42:13 +01:00
2016-04-08 23:12:02 +02:00
command = ' ban <user> ' ,
privilege = 2 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Bans a user from the group. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
elseif target.rank > 1 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is too privileged to be banned. ' )
2016-05-25 15:01:54 +02:00
elseif group.bans [ target.id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is already banned. ' )
2016-02-25 10:42:13 +01:00
else
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , target.id , ' banned by ' .. msg.from . name , config )
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' has been banned. ' )
2016-05-25 15:01:54 +02:00
group.bans [ target.id_str ] = true
2016-02-25 10:42:13 +01:00
end
end
2016-04-08 23:12:02 +02:00
} ,
2016-05-25 15:01:54 +02:00
{ -- /unban
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' unban ' , true ) . table ,
2016-04-08 23:12:02 +02:00
2016-05-25 15:01:54 +02:00
command = ' unban <user> ' ,
privilege = 2 ,
2016-04-08 23:12:02 +02:00
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Unbans a user from the group. The target may be specified via reply, username, or ID. ' ,
2016-02-25 10:42:13 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-05-25 15:01:54 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
else
if not group.bans [ target.id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is not banned. ' )
2016-04-08 23:12:02 +02:00
else
2016-05-25 15:01:54 +02:00
group.bans [ target.id_str ] = nil
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' has been unbanned. ' )
2016-05-25 15:01:54 +02:00
end
if msg.chat . type == ' supergroup ' then
2016-05-29 19:08:39 +02:00
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = target.id } )
2016-04-08 23:12:02 +02:00
end
end
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /setrules
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' setrules ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' setrules <rules> ' ,
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Sets the group \' s rules. Rules will be automatically numbered. Separate rules with a new line. Markdown is supported. Pass "--" to delete the rules. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-05-27 05:28:44 +02:00
local input = msg.text : match ( ' ^ ' .. config.cmd_pat .. ' setrules[@ ' .. self.info . username .. ' ]*(.+) ' )
2016-05-25 15:01:54 +02:00
if input == ' -- ' or input == ' ' .. utilities.char . em_dash then
2016-04-08 23:12:02 +02:00
group.rules = { }
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' The rules have been cleared. ' )
2016-05-25 15:01:54 +02:00
elseif input then
group.rules = { }
input = utilities.trim ( input ) .. ' \n '
local output = ' *Rules for ' .. msg.chat . title .. ' :* \n '
local i = 1
for l in input : gmatch ( ' (.-) \n ' ) do
output = output .. ' * ' .. i .. ' .* ' .. l .. ' \n '
i = i + 1
table.insert ( group.rules , utilities.trim ( l ) )
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
else
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' Please specify the new rules. ' )
2016-04-08 23:12:02 +02:00
end
2016-05-25 15:01:54 +02:00
end
} ,
{ -- /changerule
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' changerule ' , true ) . table ,
2016-05-25 15:01:54 +02:00
command = ' changerule <i> <rule> ' ,
privilege = 3 ,
interior = true ,
2016-06-07 05:13:26 +02:00
doc = ' Changes a single rule. Pass "--" to delete the rule. If i is a number for which there is no rule, adds a rule by the next incremented number. ' ,
2016-05-25 15:01:54 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-05-25 15:01:54 +02:00
local input = utilities.input ( msg.text )
2016-05-27 05:28:44 +02:00
local output = ' usage: ` ' .. config.cmd_pat .. ' changerule <i> <newrule>` '
2016-05-25 15:01:54 +02:00
if input then
local rule_num = tonumber ( input : match ( ' ^%d+ ' ) )
local new_rule = utilities.input ( input )
if not rule_num then
output = ' Please specify which rule you want to change. '
elseif not new_rule then
output = ' Please specify the new rule. '
elseif new_rule == ' -- ' or new_rule == utilities.char . em_dash then
if group.rules [ rule_num ] then
table.remove ( group.rules , rule_num )
output = ' That rule has been deleted. '
else
output = ' There is no rule with that number. '
end
else
if not group.rules [ rule_num ] then
rule_num = # group.rules + 1
end
group.rules [ rule_num ] = new_rule
output = ' * ' .. rule_num .. ' *. ' .. new_rule
end
2016-04-08 23:12:02 +02:00
end
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , output , true )
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /setmotd
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' setmotd ' , true ) . table ,
2016-04-08 23:12:02 +02:00
command = ' setmotd <motd> ' ,
2016-05-26 13:22:20 +02:00
privilege = 2 ,
2016-04-08 23:12:02 +02:00
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Sets the group \' s message of the day. Markdown is supported. Pass "--" to delete the message. ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local input = utilities.input ( msg.text )
2016-05-25 15:01:54 +02:00
if not input and msg.reply_to_message and msg.reply_to_message . text : len ( ) > 0 then
input = msg.reply_to_message . text
end
if input then
if input == ' -- ' or input == utilities.char . em_dash then
group.motd = nil
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' The MOTD has been cleared. ' )
2016-04-08 23:12:02 +02:00
else
2016-05-25 15:01:54 +02:00
input = utilities.trim ( input )
group.motd = input
local output = ' *MOTD for ' .. msg.chat . title .. ' :* \n ' .. input
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
end
if group.grouptype == ' supergroup ' then
2016-05-27 05:28:44 +02:00
administration.update_desc ( self , msg.chat . id , config )
2016-04-08 23:12:02 +02:00
end
2016-03-31 13:53:12 +02:00
else
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' Please specify the new message of the day. ' )
2016-03-31 13:53:12 +02:00
end
2016-04-05 09:42:16 +02:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /setlink
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' setlink ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' setlink <link> ' ,
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Sets the group \' s join link. Pass "--" to regenerate the link. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local input = utilities.input ( msg.text )
2016-05-26 13:22:20 +02:00
if input == ' -- ' or input == utilities.char . em_dash then
2016-04-08 23:12:02 +02:00
group.link = drua.export_link ( msg.chat . id )
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' The link has been regenerated. ' )
2016-05-25 15:01:54 +02:00
elseif input then
group.link = input
local output = ' [ ' .. msg.chat . title .. ' ]( ' .. input .. ' ) '
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
else
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' Please specify the new link. ' )
2016-04-08 23:12:02 +02:00
end
end
2016-04-01 19:29:00 +02:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /alist
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' alist ' ) . table ,
2016-04-01 19:29:00 +02:00
2016-04-08 23:12:02 +02:00
command = ' alist ' ,
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of administrators. Owner is denoted with a star character. ' ,
2016-04-01 19:29:00 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , config )
2016-04-08 23:12:02 +02:00
local output = ' *Administrators:* \n '
2016-05-27 02:26:30 +02:00
output = output .. administration.mod_format ( self , config.admin ) : gsub ( ' \n ' , ' ★ \n ' )
2016-04-08 23:12:02 +02:00
for id , _ in pairs ( self.database . administration.admins ) do
output = output .. administration.mod_format ( self , id )
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /flags
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' flags? ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-05-25 15:01:54 +02:00
command = ' flag \\ [i] ' ,
2016-04-08 23:12:02 +02:00
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of flags or toggles the specified flag. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local input = utilities.input ( msg.text )
if input then
input = utilities.get_word ( input , 1 )
input = tonumber ( input )
if not input or not administration.flags [ input ] then input = false end
end
if not input then
2016-05-25 15:01:54 +02:00
local output = ' *Flags for ' .. msg.chat . title .. ' :* \n '
2016-04-08 23:12:02 +02:00
for i , v in ipairs ( administration.flags ) do
local status = group.flags [ i ] or false
output = output .. ' `[ ' .. i .. ' ]` * ' .. v.name .. ' *` = ' .. tostring ( status ) .. ' ` \n • ' .. v.desc .. ' \n '
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-05-25 15:01:54 +02:00
elseif group.flags [ input ] == true then
2016-04-08 23:12:02 +02:00
group.flags [ input ] = false
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , administration.flags [ input ] . disabled )
2016-04-08 23:12:02 +02:00
else
group.flags [ input ] = true
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , administration.flags [ input ] . enabled )
2016-02-20 11:07:20 +01:00
end
end
2016-03-31 13:53:12 +02:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /antiflood
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' antiflood ' , true ) . table ,
2016-03-31 13:53:12 +02:00
2016-05-25 15:01:54 +02:00
command = ' antiflood \\ [<type> <i>] ' ,
2016-04-08 23:12:02 +02:00
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list of antiflood values or sets one. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
if not group.flags [ 5 ] then
2016-05-27 05:28:44 +02:00
utilities.send_message ( self , msg.chat . id , ' antiflood is not enabled. Use ` ' .. config.cmd_pat .. ' flag 5` to enable it. ' , true , nil , true )
2016-04-08 23:12:02 +02:00
else
2016-05-25 15:01:54 +02:00
if not group.antiflood then
group.antiflood = JSON.decode ( JSON.encode ( administration.antiflood ) )
2016-04-08 23:12:02 +02:00
end
2016-05-25 15:01:54 +02:00
local input = utilities.input ( msg.text_lower )
local output
if input then
local key , val = input : match ( ' (%a+) (%d+) ' )
if not key or not val or not tonumber ( val ) then
output = ' Not a valid message type or number. '
elseif key == ' autoban ' then
group.autoban = tonumber ( val )
output = ' Users will now be autobanned after * ' .. val .. ' * autokicks. '
else
group.antiflood [ key ] = tonumber ( val )
output = ' * ' .. key : gsub ( ' ^%l ' , string.upper ) .. ' * messages are now worth * ' .. val .. ' * points. '
end
else
2016-05-27 05:28:44 +02:00
output = ' usage: ` ' .. config.cmd_pat .. ' antiflood <type> <i>` \n example: ` ' .. config.cmd_pat .. ' antiflood text 5` \n Use this command to configure the point values for each message type. When a user reaches 100 points, he is kicked. The points are reset each minute. The current values are: \n '
2016-05-25 15:01:54 +02:00
for k , v in pairs ( group.antiflood ) do
output = output .. ' * ' .. k .. ' :* ` ' .. v .. ' ` \n '
end
output = output .. ' Users will be banned automatically after * ' .. group.autoban .. ' * autokicks. Configure this with the *autoban* keyword. '
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , msg.message_id , true )
2016-03-31 13:53:12 +02:00
end
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /mod
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' mod ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' mod <user> ' ,
privilege = 3 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Promotes a user to a moderator. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
else
if target.rank > 1 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is already a moderator or greater. ' )
2016-05-25 15:01:54 +02:00
else
group.bans [ target.id_str ] = nil
group.mods [ target.id_str ] = true
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is now a moderator. ' )
2016-05-25 15:01:54 +02:00
end
2016-04-08 23:12:02 +02:00
if group.grouptype == ' supergroup ' then
2016-05-25 15:01:54 +02:00
drua.channel_set_admin ( msg.chat . id , target.id , 2 )
2016-04-08 23:12:02 +02:00
end
2016-05-25 15:01:54 +02:00
end
end
} ,
{ -- /demod
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' demod ' , true ) . table ,
2016-05-25 15:01:54 +02:00
command = ' demod <user> ' ,
privilege = 3 ,
interior = true ,
doc = ' Demotes a moderator to a user. The target may be specified via reply, username, or ID. ' ,
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-05-25 15:01:54 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-04-08 23:12:02 +02:00
else
2016-05-25 15:01:54 +02:00
if not group.mods [ target.id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is not a moderator. ' )
2016-05-25 15:01:54 +02:00
else
group.mods [ target.id_str ] = nil
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is no longer a moderator. ' )
2016-04-08 23:12:02 +02:00
end
if group.grouptype == ' supergroup ' then
2016-05-25 15:01:54 +02:00
drua.channel_set_admin ( msg.chat . id , target.id , 0 )
2016-04-08 23:12:02 +02:00
end
2016-03-22 11:16:26 +01:00
end
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /gov
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' gov ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' gov <user> ' ,
privilege = 4 ,
interior = true ,
2016-05-25 15:01:54 +02:00
doc = ' Promotes a user to the governor. The current governor will be replaced. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-04-08 23:12:02 +02:00
else
2016-05-25 15:01:54 +02:00
if group.governor == target.id then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is already the governor. ' )
2016-05-25 15:01:54 +02:00
else
group.bans [ target.id_str ] = nil
group.mods [ target.id_str ] = nil
group.governor = target.id
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is the new governor. ' )
2016-05-25 15:01:54 +02:00
end
2016-04-08 23:12:02 +02:00
if group.grouptype == ' supergroup ' then
drua.channel_set_admin ( msg.chat . id , target.id , 2 )
2016-05-27 05:28:44 +02:00
administration.update_desc ( self , msg.chat . id , config )
2016-04-08 23:12:02 +02:00
end
2016-03-22 11:16:26 +01:00
end
2016-05-25 15:01:54 +02:00
end
} ,
{ -- /degov
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' degov ' , true ) . table ,
2016-05-25 15:01:54 +02:00
command = ' degov <user> ' ,
privilege = 4 ,
interior = true ,
doc = ' Demotes the governor to a user. The administrator will become the new governor. The target may be specified via reply, username, or ID. ' ,
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-05-25 15:01:54 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
else
if group.governor ~= target.id then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is not the governor. ' )
2016-05-25 15:01:54 +02:00
else
group.governor = msg.from . id
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is no longer the governor. ' )
2016-05-25 15:01:54 +02:00
end
if group.grouptype == ' supergroup ' then
drua.channel_set_admin ( msg.chat . id , target.id , 0 )
2016-05-27 05:28:44 +02:00
administration.update_desc ( self , msg.chat . id , config )
2016-05-25 15:01:54 +02:00
end
2016-04-01 19:29:00 +02:00
end
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /hammer
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' hammer ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' hammer <user> ' ,
privilege = 4 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Bans a user from all groups. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
elseif target.rank > 3 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is too privileged to be globally banned. ' )
2016-05-25 15:01:54 +02:00
elseif self.database . blacklist [ target.id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is already globally banned. ' )
2016-04-08 23:12:02 +02:00
else
2016-05-27 02:26:30 +02:00
administration.kick_user ( self , msg.chat . id , target.id , ' hammered by ' .. msg.from . name , config )
2016-04-08 23:12:02 +02:00
self.database . blacklist [ target.id_str ] = true
2016-05-21 02:47:13 +02:00
for k , v in pairs ( self.database . administration.groups ) do
if not v.flags [ 6 ] then
2016-05-25 15:01:54 +02:00
v.mods [ target.id_str ] = nil
2016-05-21 02:47:13 +02:00
drua.kick_user ( k , target.id )
end
end
2016-05-19 08:34:24 +02:00
local output = target.name .. ' has been globally banned. '
if group.flags [ 6 ] == true then
2016-05-25 15:01:54 +02:00
group.mods [ target.id_str ] = nil
2016-05-19 08:34:24 +02:00
group.bans [ target.id_str ] = true
output = target.name .. ' has been globally and locally banned. '
2016-04-08 23:12:02 +02:00
end
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , output )
2016-02-20 11:07:20 +01:00
end
end
} ,
2016-05-25 15:01:54 +02:00
{ -- /unhammer
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' unhammer ' , true ) . table ,
2016-05-25 15:01:54 +02:00
command = ' unhammer <user> ' ,
privilege = 4 ,
interior = false ,
doc = ' Removes a global ban. The target may be specified via reply, username, or ID. ' ,
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-05-25 15:01:54 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
elseif not self.database . blacklist [ target.id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is not globally banned. ' )
2016-05-25 15:01:54 +02:00
else
self.database . blacklist [ target.id_str ] = nil
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' has been globally unbanned. ' )
end
if msg.chat . type == ' supergroup ' then
bindings.unbanChatMember ( self , { chat_id = msg.chat . id , user_id = target.id } )
2016-05-25 15:01:54 +02:00
end
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /admin
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' admin ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' admin <user> ' ,
privilege = 5 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Promotes a user to an administrator. The target may be specified via reply, username, or ID. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-04-08 23:12:02 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
elseif target.rank >= 4 then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is already an administrator or greater. ' )
2016-04-08 23:12:02 +02:00
else
2016-05-29 19:08:39 +02:00
for _ , g in pairs ( self.database . administration.groups ) do
g.mods [ target.id_str ] = nil
2016-04-08 23:12:02 +02:00
end
self.database . administration.admins [ target.id_str ] = true
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.name .. ' is now an administrator. ' )
2016-03-22 11:16:26 +01:00
end
2016-05-25 15:01:54 +02:00
if group.grouptype == ' supergroup ' then
drua.channel_set_admin ( msg.chat . id , target.id , 2 )
end
end
} ,
{ -- /deadmin
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' deadmin ' , true ) . table ,
2016-05-25 15:01:54 +02:00
command = ' deadmin <user> ' ,
privilege = 5 ,
interior = false ,
doc = ' Demotes an administrator to a user. The target may be specified via reply, username, or ID. ' ,
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
local target = administration.get_target ( self , msg , config )
2016-05-25 15:01:54 +02:00
if target.err then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , target.err )
2016-05-25 15:01:54 +02:00
else
2016-05-31 01:10:58 +02:00
for chat_id , group in pairs ( self.database . administration.groups ) do
if group.grouptype == ' supergroup ' then
drua.channel_set_admin ( chat_id , target.id , 0 )
end
end
if target.rank ~= 4 then
utilities.send_reply ( self , msg , target.name .. ' is not an administrator. ' )
else
self.database . administration.admins [ target.id_str ] = nil
utilities.send_reply ( self , msg , target.name .. ' is no longer an administrator. ' )
end
2016-05-25 15:01:54 +02:00
end
2016-02-20 11:07:20 +01:00
end
} ,
2016-05-19 08:34:24 +02:00
{ -- /gadd
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' gadd ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-06-07 05:13:26 +02:00
command = ' gadd [i] ... ' ,
2016-04-08 23:12:02 +02:00
privilege = 5 ,
interior = false ,
2016-06-07 05:13:26 +02:00
doc = ' Adds a group to the administration system. Pass numbers as arguments to enable those flags immediately. For example, this would add the group and enable the unlisted flag, antibot, and antiflood: \n /gadd 1 4 5 ' ,
2016-02-20 11:07:20 +01:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
if self.database . administration.groups [ msg.chat . id_str ] then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I am already administrating this group. ' )
2016-05-25 15:01:54 +02:00
else
2016-06-07 05:13:26 +02:00
local flags = { }
for i = 1 , # administration.flags do
flags [ i ] = false
end
local input = utilities.input ( msg.text )
if input then
local index = utilities.index ( input )
for _ , i in ipairs ( index ) do
i = tonumber ( i )
if i and i < # administration.flags and i > 0 then
flags [ i ] = true
end
end
end
2016-05-25 15:01:54 +02:00
self.database . administration.groups [ msg.chat . id_str ] = {
mods = { } ,
governor = msg.from . id ,
bans = { } ,
2016-06-07 05:13:26 +02:00
flags = flags ,
2016-05-25 15:01:54 +02:00
rules = { } ,
grouptype = msg.chat . type ,
name = msg.chat . title ,
link = drua.export_link ( msg.chat . id ) ,
photo = drua.get_photo ( msg.chat . id ) ,
founded = os.time ( ) ,
autokicks = { } ,
autoban = 3
}
2016-05-27 05:28:44 +02:00
administration.update_desc ( self , msg.chat . id , config )
2016-05-25 15:01:54 +02:00
table.insert ( self.database . administration.activity , msg.chat . id_str )
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I am now administrating this group. ' )
2016-05-25 15:01:54 +02:00
drua.channel_set_admin ( msg.chat . id , self.info . id , 2 )
2016-04-08 23:12:02 +02:00
end
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /grem
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' grem ' , true ) : t ( ' gremove ' , true ) . table ,
2016-04-08 23:12:02 +02:00
command = ' gremove \\ [chat] ' ,
privilege = 5 ,
2016-04-26 07:40:31 +02:00
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Removes a group from the administration system. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local input = utilities.input ( msg.text ) or msg.chat . id_str
2016-04-26 07:40:31 +02:00
local output
2016-04-08 23:12:02 +02:00
if self.database . administration.groups [ input ] then
2016-04-29 06:36:35 +02:00
local chat_name = self.database . administration.groups [ input ] . name
2016-04-08 23:12:02 +02:00
self.database . administration.groups [ input ] = nil
for i , v in ipairs ( self.database . administration.activity ) do
if v == input then
table.remove ( self.database . administration.activity , i )
end
2016-03-28 08:15:46 +02:00
end
2016-04-26 07:40:31 +02:00
output = ' I am no longer administrating _ ' .. utilities.md_escape ( chat_name ) .. ' _. '
2016-04-08 23:12:02 +02:00
else
2016-04-26 07:40:31 +02:00
if input == msg.chat . id_str then
output = ' I do not administrate this group. '
else
output = ' I do not administrate that group. '
end
2016-02-27 04:06:38 +01:00
end
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , msg.chat . id , output , true , nil , true )
2016-02-20 11:07:20 +01:00
end
2016-04-01 19:29:00 +02:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /glist
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' glist ' , false ) . table ,
2016-04-08 23:12:02 +02:00
command = ' glist ' ,
privilege = 5 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Returns a list (in a private message) of all administrated groups with their governors and links. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local output = ' '
if utilities.table_size ( self.database . administration.groups ) > 0 then
for k , v in pairs ( self.database . administration.groups ) do
output = output .. ' [ ' .. utilities.md_escape ( v.name ) .. ' ]( ' .. v.link .. ' ) `[ ' .. k .. ' ]` \n '
if v.governor then
local gov = self.database . users [ tostring ( v.governor ) ]
output = output .. ' ★ ' .. utilities.md_escape ( utilities.build_name ( gov.first_name , gov.last_name ) ) .. ' `[ ' .. gov.id .. ' ]` \n '
end
2016-04-01 19:29:00 +02:00
end
2016-04-08 23:12:02 +02:00
else
output = ' There are no groups. '
2016-04-01 19:29:00 +02:00
end
2016-05-29 19:08:39 +02:00
if utilities.send_message ( self , msg.from . id , output , true , nil , true ) then
2016-04-08 23:12:02 +02:00
if msg.from . id ~= msg.chat . id then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' I have sent you the requested information in a private message. ' )
2016-04-08 23:12:02 +02:00
end
2016-04-01 19:29:00 +02:00
end
end
2016-02-20 11:07:20 +01:00
} ,
2016-05-19 08:34:24 +02:00
{ -- /broadcast
2016-05-27 05:28:44 +02:00
triggers = utilities.triggers ( self_.info . username , config.cmd_pat ) : t ( ' broadcast ' , true ) . table ,
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
command = ' broadcast <message> ' ,
privilege = 5 ,
interior = false ,
2016-05-25 15:01:54 +02:00
doc = ' Broadcasts a message to all administrated groups. ' ,
2016-04-08 23:12:02 +02:00
2016-05-27 02:26:30 +02:00
action = function ( self , msg , group , config )
2016-04-08 23:12:02 +02:00
local input = utilities.input ( msg.text )
if not input then
2016-05-29 19:08:39 +02:00
utilities.send_reply ( self , msg , ' Give me something to broadcast. ' )
2016-05-25 15:01:54 +02:00
else
input = ' *Admin Broadcast:* \n ' .. input
for id , _ in pairs ( self.database . administration.groups ) do
2016-05-29 19:08:39 +02:00
utilities.send_message ( self , id , input , true , nil , true )
2016-05-25 15:01:54 +02:00
end
2016-04-08 23:12:02 +02:00
end
2016-02-20 11:07:20 +01:00
end
2016-04-08 23:12:02 +02:00
}
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
}
2016-02-20 11:07:20 +01:00
2016-05-25 15:01:54 +02:00
-- These could be merged, but load time doesn't matter.
2016-04-08 23:12:02 +02:00
-- Generate trigger table.
administration.triggers = { }
for _ , command in ipairs ( administration.commands ) do
for _ , trigger in ipairs ( command.triggers ) do
table.insert ( administration.triggers , trigger )
end
2016-02-20 11:07:20 +01:00
end
2016-05-25 15:01:54 +02:00
-- Generate help messages.
2016-04-08 23:12:02 +02:00
self_.database . administration.help = { }
for i , _ in ipairs ( administration.ranks ) do
self_.admin_temp . help [ i ] = { }
end
for _ , v in ipairs ( administration.commands ) do
if v.command then
table.insert ( self_.admin_temp . help [ v.privilege ] , v.command )
end
2016-02-20 11:07:20 +01:00
end
2016-05-25 15:01:54 +02:00
-- Generate ahelp keywords.
for _ , v in ipairs ( administration.commands ) do
if v.command and v.doc then
v.keyword = utilities.get_word ( v.command , 1 )
end
end
2016-02-20 11:07:20 +01:00
end
2016-02-25 10:42:13 +01:00
2016-05-27 02:26:30 +02:00
function administration : action ( msg , config )
2016-04-08 23:12:02 +02:00
for _ , command in ipairs ( administration.commands ) do
for _ , trigger in pairs ( command.triggers ) do
if msg.text_lower : match ( trigger ) then
if command.interior and not self.database . administration.groups [ msg.chat . id_str ] then
2016-02-20 11:07:20 +01:00
break
end
2016-05-27 02:26:30 +02:00
if administration.get_rank ( self , msg.from . id , msg.chat . id , config ) < command.privilege then
2016-02-20 11:07:20 +01:00
break
end
2016-05-27 02:26:30 +02:00
local res = command.action ( self , msg , self.database . administration.groups [ msg.chat . id_str ] , config )
2016-02-20 11:07:20 +01:00
if res ~= true then
return res
end
end
end
end
return true
end
2016-04-08 23:12:02 +02:00
function administration : cron ( )
2016-04-12 05:55:46 +02:00
self.admin_temp . flood = { }
2016-05-19 08:34:24 +02:00
if os.date ( ' %d ' ) ~= self.database . administration.autokick_timer then
self.database . administration.autokick_timer = os.date ( ' %d ' )
for _ , v in pairs ( self.database . administration.groups ) do
v.autokicks = { }
end
end
2016-03-31 13:53:12 +02:00
end
2016-04-08 23:12:02 +02:00
administration.command = ' groups '
2016-02-20 11:07:20 +01:00
2016-04-08 23:12:02 +02:00
return administration