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:
topkecleon 2016-02-25 04:42:13 -05:00
parent 12c442d870
commit ddaf304460
9 changed files with 192 additions and 43 deletions

View File

@ -14,12 +14,13 @@ end
sendRequest = function(url) sendRequest = function(url)
local dat, res = HTTPS.request(url) local dat, res = HTTPS.request(url)
local tab = JSON.decode(dat)
if res ~= 200 then if res ~= 200 then
return false, res return false, res
end end
local tab = JSON.decode(dat)
if not tab.ok then if not tab.ok then
return false, tab.description return false, tab.description
end end

View File

@ -11,7 +11,7 @@ local action = function(msg)
-- other plugins. -- other plugins.
if msg.forward_from then return end 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 if msg.new_chat_participant and msg.new_chat_participant.id == bot.id then
sendMessage(msg.chat.id, message, true) sendMessage(msg.chat.id, message, true)

View File

@ -1,6 +1,6 @@
--[[ --[[
administration.lua administration.lua
Version 1.1 Version 1.2
Part of the otouto project. Part of the otouto project.
© 2016 topkecleon <drew@otou.to> © 2016 topkecleon <drew@otou.to>
GNU General Public License, version 2 GNU General Public License, version 2
@ -11,8 +11,12 @@
Important notices about updates will be here! Important notices about updates will be here!
Remember to load this before blacklist.lua. Remember to load this before blacklist.lua.
The global banlist has been merged with the blacklist. This merge will occur The global banlist has been merged with the blacklist. This merge will occur
automatically on versions 1.1 and 1.2. 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. -- Build the administration db if nonexistent.
@ -36,6 +40,18 @@ if database.administration.global.bans then
database.administration.global.bans = nil database.administration.global.bans = nil
end 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') local sender = dofile('lua-tg/sender.lua')
tg = sender(localhost, config.cli_port) tg = sender(localhost, config.cli_port)
local last_admin_cron = os.date('%M', os.time()) local last_admin_cron = os.date('%M', os.time())
@ -44,26 +60,30 @@ local flags = {
[1] = { [1] = {
name = 'unlisted', name = 'unlisted',
desc = 'Removes this group from the group listing.', desc = 'Removes this group from the group listing.',
short = 'This group is unlisted.',
enabled = 'This group is no longer listed in /groups.', enabled = 'This group is no longer listed in /groups.',
disabled = 'This group is now listed in /groups.' disabled = 'This group is now listed in /groups.'
}, },
[2] = { [2] = {
name = 'antisquig', name = 'antisquig',
desc = 'Automatically removes users who post Arabic script or RTL characters.', 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.', 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..', 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] = { [3] = {
name = 'antisquig Strict', name = 'antisquig Strict',
desc = 'Automatically removes users whose names contain Arabic script or RTL characters.', 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.', 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.', 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] = { [4] = {
name = 'antibot', name = 'antibot',
desc = 'Prevents the addition of bots by non-moderators. Only useful in non-supergroups.', 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.', enabled = 'Non-moderators will no longer be able to add bots.',
disabled = 'Non-moderators will now 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 output = output .. '\n\n*Message of the Day:*\n' .. group.motd
end end
if group.rules then 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 end
return output return output
@ -193,7 +224,8 @@ local commands = {
{ -- antisquig { -- antisquig
triggers = { triggers = {
'[\216-\219][\128-\191]', -- arabic '[\216-\219][\128-\191]', -- arabic
'' -- rtl '', -- rtl
'', -- other rtl
}, },
privilege = 0, privilege = 0,
@ -235,7 +267,7 @@ local commands = {
-- antisquig Strict -- antisquig Strict
if group.flags[3] == true then 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) kick_user(msg.from.id, msg.chat.id)
sendMessage(msg.from.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title)) sendMessage(msg.from.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title))
return return
@ -260,7 +292,7 @@ local commands = {
-- antisquig Strict -- antisquig Strict
if group.flags[3] == true then 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) kick_user(msg.new_chat_participant.id, msg.chat.id)
sendMessage(msg.new_chat_participant.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title)) sendMessage(msg.new_chat_participant.id, flags[3].kicked:gsub('GROUPNAME', msg.chat.title))
return return
@ -275,9 +307,7 @@ local commands = {
end end
else else
local output = get_desc(msg.chat.id) local output = get_desc(msg.chat.id)
if not sendMessage(msg.new_chat_participant.id, output, true, nil, true) then sendMessage(msg.new_chat_participant.id, output, true, nil, true)
sendMessage(msg.chat.id, output, true, nil, true)
end
return return
end end
@ -360,7 +390,18 @@ local commands = {
interior = true, interior = true,
action = function(msg) 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 end
}, },
@ -412,8 +453,12 @@ local commands = {
action = function(msg) action = function(msg)
local output = get_desc(msg.chat.id) local output = get_desc(msg.chat.id)
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) sendMessage(msg.chat.id, output, true, nil, true)
end end
end
}, },
{ -- rules { -- rules
@ -428,7 +473,10 @@ local commands = {
action = function(msg) action = function(msg)
local output = 'No rules have been set for ' .. msg.chat.title .. '.' local output = 'No rules have been set for ' .. msg.chat.title .. '.'
if database.administration[msg.chat.id_str].rules then 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 end
sendMessage(msg.chat.id, output, true, nil, true) sendMessage(msg.chat.id, output, true, nil, true)
end end
@ -574,6 +622,59 @@ local commands = {
end 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 { -- setrules
triggers = { triggers = {
'^/setrules[@'..bot.username..']*' '^/setrules[@'..bot.username..']*'
@ -589,15 +690,15 @@ local commands = {
sendReply(msg, '/setrules [rule]\n<rule>\n[rule]\n...') sendReply(msg, '/setrules [rule]\n<rule>\n[rule]\n...')
return return
end end
database.administration[msg.chat.id_str].rules = {}
input = input:trim() .. '\n' input = input:trim() .. '\n'
local output = '' local output = '*Rules for* _' .. msg.chat.title .. '_ *:*\n'
local i = 0 local i = 1
for m in input:gmatch('(.-)\n') do for l in input:gmatch('(.-)\n') do
output = output .. '*' .. i .. '.* ' .. l .. '\n'
i = i + 1 i = i + 1
output = output .. '*' .. i .. '.* ' .. m:trim() .. '\n' table.insert(database.administration[msg.chat.id_str].rules, l:trim())
end 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) sendMessage(msg.chat.id, output, true, nil, true)
end end
}, },
@ -665,7 +766,7 @@ local commands = {
local output = '*Flags for* _' .. msg.chat.title .. '_ *:*\n' local output = '*Flags for* _' .. msg.chat.title .. '_ *:*\n'
for i,v in ipairs(flags) do for i,v in ipairs(flags) do
local status = database.administration[msg.chat.id_str].flags[i] or false 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 end
sendMessage(msg.chat.id, output, true, nil, true) sendMessage(msg.chat.id, output, true, nil, true)
return return
@ -984,17 +1085,16 @@ for i,v in ipairs(commands) do
end end
end end
-- Generate help text, and store it so we don't have to use a global variable. database.administration.global.help = {}
local help_text = '' for i,v in pairs(ranks) do
for i = 1, 5 do database.administration.global.help[i] = {}
help_text = help_text .. '*' .. ranks[i] .. ':*\n' end
for k,v in pairs(commands) do for i,v in ipairs(commands) do
if v.privilege == i and v.command then if v.command then
help_text = help_text .. '• /' .. v.command .. '\n' table.insert(database.administration.global.help[v.privilege], v.command)
end end
end end
end
database.administration.global.help = help_text
local action = function(msg) -- wee nesting local action = function(msg) -- wee nesting
for i,v in ipairs(commands) do for i,v in ipairs(commands) do

View File

@ -1,4 +1,4 @@
local command = 'apod [query]' local command = 'apod [date]'
local doc = [[``` local doc = [[```
/apod [query] /apod [query]
Returns the Astronomy Picture of the Day. Returns the Astronomy Picture of the Day.

46
plugins/dilbert.lua Normal file
View 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
}

View File

@ -58,11 +58,12 @@ local action = function(msg)
end end
local i = math.random(jdat.queries.request[1].count) local i = math.random(jdat.queries.request[1].count)
local result = jdat.items[i].link local img_url = jdat.items[i].link
local output = '[]('..result..')' 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) sendReply(msg, result)
else else
sendMessage(msg.chat.id, output, false, nil, true) sendMessage(msg.chat.id, output, false, nil, true)

View File

@ -5,13 +5,13 @@ local help_text = '*Available commands:*'
for i,v in ipairs(plugins) do for i,v in ipairs(plugins) do
if v.command then if v.command then
help_text = help_text .. '\n /' .. v.command:gsub('%[', '\\[') help_text = help_text .. '\n /' .. v.command:gsub('%[', '\\[')
end end
end end
help_text = help_text .. [[ help_text = help_text .. [[
/help <command> /help <command>
Arguments: <required> \[optional] Arguments: <required> \[optional]
]] ]]

View File

@ -46,7 +46,10 @@ local action = function(msg)
end end
local i = math.random(jdat.pageInfo.resultsPerPage) 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) sendMessage(msg.chat.id, output, false, nil, true)

View File

@ -187,14 +187,12 @@ download_file = function(url, filename)
if code ~= 200 then return false end if code ~= 200 then return false end
filename = filename or os.time() filename = filename or '/tmp/' .. os.time()
local file_path = '/tmp/'..filename local file = io.open(filename, 'w+')
file = io.open(file_path, 'w+')
file:write(table.concat(respbody)) file:write(table.concat(respbody))
file:close() file:close()
return file_path return filename
end end