administration.lua:
Version 1.2. Rules are now in a table. Automatic migration until 1.4. New command: changerule /changerule <i> <rule> Change a rule. Use "/changerule 1 --" to delete rule 1. ahelp: Only displays commands the user can use. Attempts to PM before group. desc: Now displays group's flags and their "short" descs. Attemps to PM before group. antisquig: Second RTL character added to, and Strict. dilbert.lua: New command: dilbert /dilbert [YYYY-MM-DD] Returns a date's or the latest Dilbert strip. Caches strips so they are not downloaded more than once. gImages.lua & youtube.lua: Title now displayed for links. The "zero-width non-joiner" was a stupid idea. help.lua: Commands now properly bulleted. utilities.lua: download_file(): Now allows for specification of a path instead of /tmp/.
This commit is contained in:
parent
12c442d870
commit
ddaf304460
@ -14,12 +14,13 @@ end
|
||||
sendRequest = function(url)
|
||||
|
||||
local dat, res = HTTPS.request(url)
|
||||
local tab = JSON.decode(dat)
|
||||
|
||||
if res ~= 200 then
|
||||
return false, res
|
||||
end
|
||||
|
||||
local tab = JSON.decode(dat)
|
||||
|
||||
if not tab.ok then
|
||||
return false, tab.description
|
||||
end
|
||||
|
@ -11,7 +11,7 @@ local action = function(msg)
|
||||
-- other plugins.
|
||||
if msg.forward_from then return end
|
||||
|
||||
local message = config.about_text .. '\nBased on otouto v'..version..' by topkecleon.\notouto v3 is licensed under the GPLv2.\ngithub.com/topkecleon/otouto'
|
||||
local message = config.about_text .. '\nBased on otouto v'..version..' by topkecleon.\notouto is licensed under the GPLv2.\ngithub.com/topkecleon/otouto'
|
||||
|
||||
if msg.new_chat_participant and msg.new_chat_participant.id == bot.id then
|
||||
sendMessage(msg.chat.id, message, true)
|
||||
|
@ -1,6 +1,6 @@
|
||||
--[[
|
||||
administration.lua
|
||||
Version 1.1
|
||||
Version 1.2
|
||||
Part of the otouto project.
|
||||
© 2016 topkecleon <drew@otou.to>
|
||||
GNU General Public License, version 2
|
||||
@ -11,8 +11,12 @@
|
||||
|
||||
Important notices about updates will be here!
|
||||
Remember to load this before blacklist.lua.
|
||||
|
||||
The global banlist has been merged with the blacklist. This merge will occur
|
||||
automatically on versions 1.1 and 1.2.
|
||||
|
||||
Group rules will now be stored in tables rather than pre-numbered strings.
|
||||
Automatic migration will be in effect in versions 1.2 and 1.3.
|
||||
]]--
|
||||
|
||||
-- Build the administration db if nonexistent.
|
||||
@ -36,6 +40,18 @@ if database.administration.global.bans then
|
||||
database.administration.global.bans = nil
|
||||
end
|
||||
|
||||
-- Migration code: Remove this in v1.4.
|
||||
-- Rule lists have been converted from strings to tables.
|
||||
for k,v in pairs(database.administration) do
|
||||
if type(v.rules) == 'string' then
|
||||
local t = {}
|
||||
for l in v.rules:gmatch('(.-)\n') do
|
||||
table.insert(t, l:sub(6))
|
||||
end
|
||||
v.rules = t
|
||||
end
|
||||
end
|
||||
|
||||
local sender = dofile('lua-tg/sender.lua')
|
||||
tg = sender(localhost, config.cli_port)
|
||||
local last_admin_cron = os.date('%M', os.time())
|
||||
@ -44,26 +60,30 @@ local flags = {
|
||||
[1] = {
|
||||
name = 'unlisted',
|
||||
desc = 'Removes this group from the group listing.',
|
||||
short = 'This group is unlisted.',
|
||||
enabled = 'This group is no longer listed in /groups.',
|
||||
disabled = 'This group is now listed in /groups.'
|
||||
},
|
||||
[2] = {
|
||||
name = 'antisquig',
|
||||
desc = 'Automatically removes users who post Arabic script or RTL characters.',
|
||||
short = 'This group does not allow Arabic script or RTL characters.',
|
||||
enabled = 'Users will now be removed automatically for posting Arabic script and/or RTL characters.',
|
||||
disabled = 'Users will no longer be removed automatically for posting Arabic script and/or RTL characters..',
|
||||
kicked = 'You were kicked from GROUPNAME for posting Arabic script and/or RTL characters.'
|
||||
kicked = 'You were automatically kicked from GROUPNAME for posting Arabic script and/or RTL characters.'
|
||||
},
|
||||
[3] = {
|
||||
name = 'antisquig Strict',
|
||||
desc = 'Automatically removes users whose names contain Arabic script or RTL characters.',
|
||||
short = 'This group does not allow users whose names contain Arabic script or RTL characters.',
|
||||
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.',
|
||||
kicked = 'You were kicked from GROUPNAME for having a name which contains Arabic script and/or RTL characters.'
|
||||
kicked = 'You were automatically kicked from GROUPNAME for having a name which contains Arabic script and/or RTL characters.'
|
||||
},
|
||||
[4] = {
|
||||
name = 'antibot',
|
||||
desc = 'Prevents the addition of bots by non-moderators. Only useful in non-supergroups.',
|
||||
short = 'This group does not allow users to add bots.',
|
||||
enabled = 'Non-moderators will no longer be able to add bots.',
|
||||
disabled = 'Non-moderators will now be able to add bots.'
|
||||
}
|
||||
@ -182,7 +202,18 @@ local get_desc = function(chat_id)
|
||||
output = output .. '\n\n*Message of the Day:*\n' .. group.motd
|
||||
end
|
||||
if group.rules then
|
||||
output = output .. '\n\n*Rules:*\n' .. group.rules
|
||||
output = output .. '\n\n*Rules:*\n'
|
||||
for i,v in ipairs(group.rules) do
|
||||
output = output .. '*' .. i .. '.* ' .. v .. '\n'
|
||||
end
|
||||
end
|
||||
if group.flags then
|
||||
output = output .. '\n*Flags:*\n'
|
||||
for i = 1, #flags do
|
||||
if group.flags[i] then
|
||||
output = output .. '• ' .. flags[i].short .. '\n'
|
||||
end
|
||||
end
|
||||
end
|
||||
return output
|
||||
|
||||
@ -193,7 +224,8 @@ local commands = {
|
||||
{ -- antisquig
|
||||
triggers = {
|
||||
'[\216-\219][\128-\191]', -- arabic
|
||||
'' -- rtl
|
||||
'', -- rtl
|
||||
'', -- other rtl
|
||||
},
|
||||
|
||||
privilege = 0,
|
||||
@ -235,7 +267,7 @@ local commands = {
|
||||
|
||||
-- antisquig Strict
|
||||
if group.flags[3] == true then
|
||||
if msg.from.name:match('[\216-\219][\128-\191]') or msg.from.name:match('') then
|
||||
if msg.from.name:match('[\216-\219][\128-\191]') or msg.from.name:match('') or msg.from.name:match('') then
|
||||
kick_user(msg.from.id, msg.chat.id)
|
||||
sendMessage(msg.from.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title))
|
||||
return
|
||||
@ -260,7 +292,7 @@ local commands = {
|
||||
|
||||
-- antisquig Strict
|
||||
if group.flags[3] == true then
|
||||
if msg.new_chat_participant.name:match('[\216-\219][\128-\191]') or msg.new_chat_participant.name:match('') then
|
||||
if msg.new_chat_participant.name:match('[\216-\219][\128-\191]') or msg.new_chat_participant.name:match('') or msg.new_chat_participant.name:match('') then
|
||||
kick_user(msg.new_chat_participant.id, msg.chat.id)
|
||||
sendMessage(msg.new_chat_participant.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title))
|
||||
return
|
||||
@ -275,9 +307,7 @@ local commands = {
|
||||
end
|
||||
else
|
||||
local output = get_desc(msg.chat.id)
|
||||
if not sendMessage(msg.new_chat_participant.id, output, true, nil, true) then
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
sendMessage(msg.new_chat_participant.id, output, true, nil, true)
|
||||
return
|
||||
end
|
||||
|
||||
@ -360,7 +390,18 @@ local commands = {
|
||||
interior = true,
|
||||
|
||||
action = function(msg)
|
||||
sendMessage(msg.chat.id, database.administration.global.help, true, nil, true)
|
||||
local rank = get_rank(msg.from.id, msg.chat.id)
|
||||
local output = '*Commands for ' .. ranks[rank] .. ':*\n'
|
||||
for i = 1, rank do
|
||||
for ind, val in ipairs(database.administration.global.help[i]) do
|
||||
output = output .. '• /' .. val .. '\n'
|
||||
end
|
||||
end
|
||||
if sendMessage(msg.from.id, output, true, nil, true) then
|
||||
sendReply(msg, 'I have sent you the requested information in a private message.')
|
||||
else
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
@ -412,7 +453,11 @@ local commands = {
|
||||
|
||||
action = function(msg)
|
||||
local output = get_desc(msg.chat.id)
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
if sendMessage(msg.from.id, output, true, nil, true) then
|
||||
sendReply(msg, 'I have sent you the requested information in a private message.')
|
||||
else
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
@ -428,7 +473,10 @@ local commands = {
|
||||
action = function(msg)
|
||||
local output = 'No rules have been set for ' .. msg.chat.title .. '.'
|
||||
if database.administration[msg.chat.id_str].rules then
|
||||
output = '*Rules for* _' .. msg.chat.title .. '_ *:*\n' .. database.administration[msg.chat.id_str].rules
|
||||
output = '*Rules for* _' .. msg.chat.title .. '_ *:*\n'
|
||||
for i,v in ipairs(database.administration[msg.chat.id_str].rules) do
|
||||
output = output .. '*' .. i .. '.* ' .. v .. '\n'
|
||||
end
|
||||
end
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
@ -574,6 +622,59 @@ local commands = {
|
||||
end
|
||||
},
|
||||
|
||||
{ -- changerule
|
||||
triggers = {
|
||||
'^/changerule',
|
||||
'^/changerule@' .. bot.username
|
||||
},
|
||||
|
||||
command = 'changerule <i> <newrule>',
|
||||
privilege = 3,
|
||||
interior = true,
|
||||
|
||||
action = function(msg)
|
||||
local usage = 'usage: `/changerule <i> <newrule>`\n`/changerule <i> -- `deletes.'
|
||||
local input = msg.text:input()
|
||||
if not input then
|
||||
sendMessage(msg.chat.id, usage, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
local rule_num = input:match('^%d+')
|
||||
if not rule_num then
|
||||
local output = 'Please specify which rule you want to change.\n' .. usage
|
||||
sendMessage(msg.chat.id, output, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
rule_num = tonumber(rule_num)
|
||||
local rule_new = input:input()
|
||||
if not rule_new then
|
||||
local output = 'Please specify the new rule.\n' .. usage
|
||||
sendMessage(msg.chat.id, output, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
if not database.administration[msg.chat.id_str].rules then
|
||||
local output = 'Sorry, there are no rules to change. Please use /setrules.\n' .. usage
|
||||
sendMessage(msg.chat.id, output, true, msg.message_id, true)
|
||||
return
|
||||
end
|
||||
if not database.administration[msg.chat.id_str].rules[rule_num] then
|
||||
rule_num = #database.administration[msg.chat.id_str].rules + 1
|
||||
end
|
||||
if rule_new == '--' or rule_new == '—' then
|
||||
if database.administration[msg.chat.id_str].rules[rule_num] then
|
||||
table.remove(database.administration[msg.chat.id_str].rules, rule_num)
|
||||
sendReply(msg, 'That rule has been deleted.')
|
||||
else
|
||||
sendReply(msg, 'There is no rule with that number.')
|
||||
end
|
||||
return
|
||||
end
|
||||
database.administration[msg.chat.id_str].rules[rule_num] = rule_new
|
||||
local output = '*' .. rule_num .. '*. ' .. rule_new
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
},
|
||||
|
||||
{ -- setrules
|
||||
triggers = {
|
||||
'^/setrules[@'..bot.username..']*'
|
||||
@ -589,15 +690,15 @@ local commands = {
|
||||
sendReply(msg, '/setrules [rule]\n<rule>\n[rule]\n...')
|
||||
return
|
||||
end
|
||||
database.administration[msg.chat.id_str].rules = {}
|
||||
input = input:trim() .. '\n'
|
||||
local output = ''
|
||||
local i = 0
|
||||
for m in input:gmatch('(.-)\n') do
|
||||
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
|
||||
output = output .. '*' .. i .. '.* ' .. m:trim() .. '\n'
|
||||
table.insert(database.administration[msg.chat.id_str].rules, l:trim())
|
||||
end
|
||||
database.administration[msg.chat.id_str].rules = output
|
||||
output = '*Rules for* _' .. msg.chat.title .. '_ *:*\n' .. output
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
end
|
||||
},
|
||||
@ -665,7 +766,7 @@ local commands = {
|
||||
local output = '*Flags for* _' .. msg.chat.title .. '_ *:*\n'
|
||||
for i,v in ipairs(flags) do
|
||||
local status = database.administration[msg.chat.id_str].flags[i] or false
|
||||
output = output .. '`[' .. i .. ']` *' .. v.name .. '* = `' .. tostring(status) .. '`\n• ' .. v.desc .. '\n'
|
||||
output = output .. '`[' .. i .. ']` *' .. v.name .. '*` = ' .. tostring(status) .. '`\n• ' .. v.desc .. '\n'
|
||||
end
|
||||
sendMessage(msg.chat.id, output, true, nil, true)
|
||||
return
|
||||
@ -984,17 +1085,16 @@ for i,v in ipairs(commands) do
|
||||
end
|
||||
end
|
||||
|
||||
-- Generate help text, and store it so we don't have to use a global variable.
|
||||
local help_text = ''
|
||||
for i = 1, 5 do
|
||||
help_text = help_text .. '*' .. ranks[i] .. ':*\n'
|
||||
for k,v in pairs(commands) do
|
||||
if v.privilege == i and v.command then
|
||||
help_text = help_text .. '• /' .. v.command .. '\n'
|
||||
end
|
||||
database.administration.global.help = {}
|
||||
for i,v in pairs(ranks) do
|
||||
database.administration.global.help[i] = {}
|
||||
end
|
||||
for i,v in ipairs(commands) do
|
||||
if v.command then
|
||||
table.insert(database.administration.global.help[v.privilege], v.command)
|
||||
end
|
||||
end
|
||||
database.administration.global.help = help_text
|
||||
|
||||
|
||||
local action = function(msg) -- wee nesting
|
||||
for i,v in ipairs(commands) do
|
||||
|
@ -1,4 +1,4 @@
|
||||
local command = 'apod [query]'
|
||||
local command = 'apod [date]'
|
||||
local doc = [[```
|
||||
/apod [query]
|
||||
Returns the Astronomy Picture of the Day.
|
||||
|
46
plugins/dilbert.lua
Normal file
46
plugins/dilbert.lua
Normal file
@ -0,0 +1,46 @@
|
||||
dilbert = dilbert or {}
|
||||
|
||||
local command = 'dilbert [date]'
|
||||
local doc = [[```
|
||||
/dilbert [YYYY-MM-DD]
|
||||
Returns the latest Dilbert strip or that of the provided date.
|
||||
Dates before the first strip will return the first strip. Dates after the last trip will return the last strip.
|
||||
Source: dilbert.com
|
||||
```]]
|
||||
|
||||
local triggers = {
|
||||
'^/dilbert[@'..bot.username..']*'
|
||||
}
|
||||
|
||||
local action = function(msg)
|
||||
|
||||
sendChatAction(msg.chat.id, 'upload_photo')
|
||||
|
||||
local input = msg.text:input()
|
||||
if not input then input = os.date('%F') end
|
||||
if not input:match('^%d%d%d%d%-%d%d%-%d%d$') then input = os.date('%F') end
|
||||
|
||||
local url = 'http://dilbert.com/strip/' .. URL.escape(input)
|
||||
local str, res = HTTP.request(url)
|
||||
if res ~= 200 then
|
||||
sendReply(msg, config.errors.connection)
|
||||
return
|
||||
end
|
||||
|
||||
if not dilbert[input] then
|
||||
local strip_url = str:match('<meta property="og:image" content="(.-)"/>')
|
||||
dilbert[input] = download_file(strip_url, '/tmp/' .. input .. '.gif')
|
||||
end
|
||||
|
||||
local strip_title = str:match('<meta property="article:publish_date" content="(.-)"/>')
|
||||
|
||||
sendPhoto(msg.chat.id, dilbert[input], strip_title)
|
||||
|
||||
end
|
||||
|
||||
return {
|
||||
command = command,
|
||||
doc = doc,
|
||||
triggers = triggers,
|
||||
action = action
|
||||
}
|
@ -58,11 +58,12 @@ local action = function(msg)
|
||||
end
|
||||
|
||||
local i = math.random(jdat.queries.request[1].count)
|
||||
local result = jdat.items[i].link
|
||||
local output = '[]('..result..')'
|
||||
local img_url = jdat.items[i].link
|
||||
local img_title = jdat.items[i].title
|
||||
local output = '[' .. img_title .. '](' .. img_url .. ')'
|
||||
|
||||
|
||||
if string.match(msg.text, '^/i[mage]*nsfw') then
|
||||
if msg.text:match('nsfw') then
|
||||
sendReply(msg, result)
|
||||
else
|
||||
sendMessage(msg.chat.id, output, false, nil, true)
|
||||
|
@ -5,13 +5,13 @@ local help_text = '*Available commands:*'
|
||||
|
||||
for i,v in ipairs(plugins) do
|
||||
if v.command then
|
||||
help_text = help_text .. '\n /' .. v.command:gsub('%[', '\\[')
|
||||
help_text = help_text .. '\n• /' .. v.command:gsub('%[', '\\[')
|
||||
end
|
||||
end
|
||||
|
||||
help_text = help_text .. [[
|
||||
|
||||
/help <command>
|
||||
• /help <command>
|
||||
Arguments: <required> \[optional]
|
||||
]]
|
||||
|
||||
|
@ -46,7 +46,10 @@ local action = function(msg)
|
||||
end
|
||||
|
||||
local i = math.random(jdat.pageInfo.resultsPerPage)
|
||||
local output = '[](https://www.youtube.com/watch?v=' .. jdat.items[i].id.videoId .. ')'
|
||||
local vid_url = 'https://www.youtube.com/watch?v=' .. jdat.items[i].id.videoId
|
||||
local vid_title = jdat.items[i].snippet.title
|
||||
vid_title = vid_title:gsub('%(.+%)',''):gsub('%[.+%]','')
|
||||
local output = '[' .. vid_title .. '](' .. vid_url .. ')'
|
||||
|
||||
sendMessage(msg.chat.id, output, false, nil, true)
|
||||
|
||||
|
@ -187,14 +187,12 @@ download_file = function(url, filename)
|
||||
|
||||
if code ~= 200 then return false end
|
||||
|
||||
filename = filename or os.time()
|
||||
filename = filename or '/tmp/' .. os.time()
|
||||
|
||||
local file_path = '/tmp/'..filename
|
||||
|
||||
file = io.open(file_path, 'w+')
|
||||
local file = io.open(filename, 'w+')
|
||||
file:write(table.concat(respbody))
|
||||
file:close()
|
||||
|
||||
return file_path
|
||||
return filename
|
||||
|
||||
end
|
||||
|
Reference in New Issue
Block a user