Moved utilities.CMD_PAT to config.cmd_pat.

This commit is contained in:
Brayden Banks 2016-05-26 20:28:44 -07:00
parent ed6b536a46
commit bb8b8b9c64
52 changed files with 385 additions and 379 deletions

116
README.md
View File

@ -35,29 +35,29 @@ When you are ready to start the bot, run `./launch.sh`. To stop the bot, send "/
Note that certain plugins, such as translate.lua and greetings.lua, will require privacy mode to be disabled. Additionally, some plugins may require or make use of various API keys: Note that certain plugins, such as translate.lua and greetings.lua, will require privacy mode to be disabled. Additionally, some plugins may require or make use of various API keys:
- bing.lua: [Bing Search API](http://datamarket.azure.com/dataset/bing/search) key (`bing_api_key`) - `bing.lua`: [Bing Search API](http://datamarket.azure.com/dataset/bing/search) key (`bing_api_key`)
- gImages.lua & youtube.lua: Google [API](http://console.developers.google.com) and [CSE](https://cse.google.com/cse) keys (`google_api_key`, `google_cse_key`) - `gImages.lua` & `youtube.lua`: Google [API](http://console.developers.google.com) and [CSE](https://cse.google.com/cse) keys (`google_api_key`, `google_cse_key`)
- weather.lua: [OpenWeatherMap](http://openweathermap.org) API key (`owm_api_key`) - `weather.lua`: [OpenWeatherMap](http://openweathermap.org) API key (`owm_api_key`)
- lastfm.lua: [last.fm](http://last.fm/api) API key (`lastfm_api_key`) - `lastfm.lua`: [last.fm](http://last.fm/api) API key (`lastfm_api_key`)
- bible.lua: [Biblia](http://api.biblia.com) API key (`biblia_api_key`) - `bible.lua`: [Biblia](http://api.biblia.com) API key (`biblia_api_key`)
- cats.lua: [The Cat API](http://thecatapi.com) API key (optional) (`thecatapi_key`) - `cats.lua`: [The Cat API](http://thecatapi.com) API key (optional) (`thecatapi_key`)
- apod.lua: [NASA](http://api.nasa.gov) API key (`nasa_api_key`) - `apod.lua`: [NASA](http://api.nasa.gov) API key (`nasa_api_key`)
- translate.lua: [Yandex](http://tech.yandex.com/keys/get) API key (`yandex_key`) - `translate.lua`: [Yandex](http://tech.yandex.com/keys/get) API key (`yandex_key`)
- chatter.lua: [SimSimi](http://developer.simsimi.com/signUp) API key (`simsimi_key`) - `chatter.lua`: [SimSimi](http://developer.simsimi.com/signUp) API key (`simsimi_key`)
* * * * * *
## Control plugins ## Control plugins
Some plugins are designed to be used by the bot's owner. Here are some examples, how they're used, and what they do. Some plugins are designed to be used by the bot's owner. Here are some examples, how they're used, and what they do.
| Plugin | Command | Function | | Plugin | Command | Function |
|:--------------|:-----------|:---------------------------------------------------| |:----------------|:-----------|:---------------------------------------------------|
| control.lua | /reload | Reloads all plugins and configuration. | | `control.lua` | /reload | Reloads all plugins and configuration. |
| | /halt | Shuts down the bot after saving the database. | | | /halt | Shuts down the bot after saving the database. |
| | /script | Runs a list a bot commands, separated by newlines. | | | /script | Runs a list a bot commands, separated by newlines. |
| blacklist.lua | /blacklist | Blocks people from using the bot. | | `blacklist.lua` | /blacklist | Blocks people from using the bot. |
| shell.lua | /run | Executes shell commands on the host system. | | `shell.lua` | /run | Executes shell commands on the host system. |
| luarun.lua | /lua | Executes Lua commands in the bot's environment. | | `luarun.lua` | /lua | Executes Lua commands in the bot's environment. |
* * * * * *
@ -68,7 +68,7 @@ To get started, run `./tg-install.sh`. Note that this script is written for Ubun
Once the installation is finished, enable the `administration` plugin in your config file. **The administration plugin must be loaded before the `about` and `blacklist` plugins.** You may have reason to change the default TCP port (4567); if that is the case, remember to change it in `tg-launch.sh` as well. Run `./tg-launch.sh` in a separate screen/tmux window. You'll have to enter your phone number and go through the login process the first time. The script is set to restart tg after two seconds, so you'll need to Ctrl+C after exiting. Once the installation is finished, enable the `administration` plugin in your config file. **The administration plugin must be loaded before the `about` and `blacklist` plugins.** You may have reason to change the default TCP port (4567); if that is the case, remember to change it in `tg-launch.sh` as well. Run `./tg-launch.sh` in a separate screen/tmux window. You'll have to enter your phone number and go through the login process the first time. The script is set to restart tg after two seconds, so you'll need to Ctrl+C after exiting.
While tg is running, you may start/reload otouto with administration.lua enabled, and have access to a wide variety of administrative commands and automata. The administration "database" is stored in `administration.json`. To start using otouto to administrate a group (note that you must be the owner (or an administrator)), send `/gadd` to that group. For a list of commands, use `/ahelp`. Below I'll describe various functions now available to you. While tg is running, you may start/reload otouto with `administration.lua` enabled, and have access to a wide variety of administrative commands and automata. The administration "database" is stored in `administration.json`. To start using otouto to administrate a group (note that you must be the owner (or an administrator)), send `/gadd` to that group. For a list of commands, use `/ahelp`. Below I'll describe various functions now available to you.
| Command | Function | Privilege | Internal? | | Command | Function | Privilege | Internal? |
|:------------|:------------------------------------------------|:----------|:----------| |:------------|:------------------------------------------------|:----------|:----------|
@ -151,46 +151,46 @@ Additionally, antiflood can be configured to automatically ban a user after he h
## List of plugins ## List of plugins
| Plugin | Command | Function | Aliases | | Plugin | Command | Function | Aliases |
|:--------------------|:------------------------------|:--------------------------------------------------------|:--------| |:----------------------|:------------------------------|:--------------------------------------------------------|:--------|
| help.lua | /help [command] | Returns a list of commands or command-specific help. | /h | | `help.lua` | /help [command] | Returns a list of commands or command-specific help. | /h |
| about.lua | /about | Returns the about text as configured in config.lua. | | `about.lua` | /about | Returns the about text as configured in config.lua. |
| ping.lua | /ping | The simplest plugin ever! | | `ping.lua` | /ping | The simplest plugin ever! |
| echo.lua | /echo text | Repeats a string of text. | | `echo.lua` | /echo text | Repeats a string of text. |
| bing.lua | /bing query | Returns Bing web results. | /g | | `bing.lua` | /bing query | Returns Bing web results. | /g |
| gImages.lua | /images query | Returns a Google image result. | /i | | `gImages.lua` | /images query | Returns a Google image result. | /i |
| gMaps.lua | /location query | Returns location data from Google Maps. | /loc | | `gMaps.lua` | /location query | Returns location data from Google Maps. | /loc |
| youtube.lua | /youtube query | Returns the top video result from YouTube. | /yt | | `youtube.lua` | /youtube query | Returns the top video result from YouTube. | /yt |
| wikipedia.lua | /wikipedia query | Returns the summary of a Wikipedia article. | /w | | `wikipedia.lua` | /wikipedia query | Returns the summary of a Wikipedia article. | /w |
| lastfm.lua | /np [username] | Returns the song you are currently listening to. | | `lastfm.lua` | /np [username] | Returns the song you are currently listening to. |
| lastfm.lua | /fmset [username] | Sets your username for /np. /fmset -- will delete it. | | `lastfm.lua` | /fmset [username] | Sets your username for /np. /fmset -- will delete it. |
| hackernews.lua | /hackernews | Returns the latest posts from Hacker News. | /hn | | `hackernews.lua` | /hackernews | Returns the latest posts from Hacker News. | /hn |
| imdb.lua | /imdb query | Returns film information from IMDb. | | `imdb.lua` | /imdb query | Returns film information from IMDb. |
| hearthstone.lua | /hearthstone query | Returns data for Hearthstone cards matching the query. | /hs | | `hearthstone.lua` | /hearthstone query | Returns data for Hearthstone cards matching the query. | /hs |
| calc.lua | /calc expression | Returns conversions and solutions to math expressions. | | `calc.lua` | /calc expression | Returns conversions and solutions to math expressions. |
| bible.lua | /bible reference | Returns a Bible verse. | /b | | `bible.lua` | /bible reference | Returns a Bible verse. | /b |
| urbandictionary.lua | /urban query | Returns the top definition from Urban Dictionary. | /ud | | `urbandictionary.lua` | /urban query | Returns the top definition from Urban Dictionary. | /ud |
| time.lua | /time query | Returns the time, date, and a timezone for a location. | | `time.lua` | /time query | Returns the time, date, and a timezone for a location. |
| weather.lua | /weather query | Returns current weather conditions for a given location. | | `weather.lua` | /weather query | Returns current weather conditions for a given location. |
| nick.lua | /nick nickname | Set your nickname. /nick - will delete it. | | `nick.lua` | /nick nickname | Set your nickname. /nick - will delete it. |
| whoami.lua | /whoami | Returns user and chat info for you or the replied-to user. | /who | | `whoami.lua` | /whoami | Returns user and chat info for you or the replied-to user. | /who |
| eightball.lua | /8ball | Returns an answer from a magic 8-ball. | | `eightball.lua` | /8ball | Returns an answer from a magic 8-ball. |
| dice.lua | /roll nDr | Returns RNG dice rolls. Uses D&D notation. | | `dice.lua` | /roll nDr | Returns RNG dice rolls. Uses D&D notation. |
| reddit.lua | /reddit [r/subreddit ¦ query] | Returns the top results from a subreddit, query, or r/all. | /r | | `reddit.lua` | /reddit [r/subreddit ¦ query] | Returns the top results from a subreddit, query, or r/all. | /r |
| xkcd.lua | /xkcd [query] | Returns an xkcd strip and its alt text. | | `xkcd.lua` | /xkcd [query] | Returns an xkcd strip and its alt text. |
| slap.lua | /slap target | Gives someone a slap (or worse). | | `slap.lua` | /slap target | Gives someone a slap (or worse). |
| commit.lua | /commit | Returns a commit message from whatthecommit.com. | | `commit.lua` | /commit | Returns a commit message from whatthecommit.com. |
| fortune.lua | /fortune | Returns a UNIX fortune. | | `fortune.lua` | /fortune | Returns a UNIX fortune. |
| pun.lua | /pun | Returns a pun. | | `pun.lua` | /pun | Returns a pun. |
| pokedex.lua | /pokedex query | Returns a Pokedex entry. | /dex | | `pokedex.lua` | /pokedex query | Returns a Pokedex entry. | /dex |
| currency.lua | /cash [amount] cur to cur | Converts one currency to another. | | `currency.lua` | /cash [amount] cur to cur | Converts one currency to another. |
| cats.lua | /cat | Returns a cat picture. | | `cats.lua` | /cat | Returns a cat picture. |
| reactions.lua | /reactions | Returns a list of emoticons which can be posted by the bot. | | `reactions.lua` | /reactions | Returns a list of emoticons which can be posted by the bot. |
| apod.lua | /apod [date] | Returns the NASA Astronomy Picture of the Day. | | `apod.lua` | /apod [date] | Returns the NASA Astronomy Picture of the Day. |
| dilbert.lua | /dilbert [date] | Returns a Dilbert strip. | | `dilbert.lua` | /dilbert [date] | Returns a Dilbert strip. |
| patterns.lua | /s/from/to/ | Search-and-replace using Lua patterns. | | `patterns.lua` | /s/from/to/ | Search-and-replace using Lua patterns. |
| me.lua | /me | Returns user-specific data stored by the bot. | | `me.lua` | /me | Returns user-specific data stored by the bot. |
| remind.lua | /remind <duration> <message> | Reminds a user of something after a duration of minutes. | | `remind.lua` | /remind <duration> <message> | Reminds a user of something after a duration of minutes. |
* * * * * *

11
bot.lua
View File

@ -61,14 +61,14 @@ function bot:on_msg_receive(msg, config) -- The fn run whenever a message is rec
msg = utilities.enrich_message(msg) msg = utilities.enrich_message(msg)
if msg.text:match('^'..utilities.CMD_PAT..'start .+') then if msg.text:match('^'..config.cmd_pat..'start .+') then
msg.text = utilities.CMD_PAT .. utilities.input(msg.text) msg.text = config.cmd_pat .. utilities.input(msg.text)
msg.text_lower = msg.text:lower() msg.text_lower = msg.text:lower()
end end
for _,v in ipairs(self.plugins) do for _,v in ipairs(self.plugins) do
for _,w in pairs(v.triggers) do for _,w in pairs(v.triggers) do
if string.match(msg.text:lower(), w) then if string.match(msg.text_lower, w) then
local success, result = pcall(function() local success, result = pcall(function()
return v.action(self, msg, config) return v.action(self, msg, config)
end) end)
@ -90,8 +90,7 @@ function bot:on_msg_receive(msg, config) -- The fn run whenever a message is rec
end end
function bot:run() function bot:run(config)
local config = require('config') -- Load configuration file.
bot.init(self, config) -- Actually start the script. bot.init(self, config) -- Actually start the script.
while self.is_started do -- Start a loop while the bot should be running. while self.is_started do -- Start a loop while the bot should be running.
@ -113,7 +112,7 @@ function bot:run()
utilities.save_data(self.info.username..'.db', self.database) -- Save the database. utilities.save_data(self.info.username..'.db', self.database) -- Save the database.
for i,v in ipairs(self.plugins) do for i,v in ipairs(self.plugins) do
if v.cron then -- Call each plugin's cron function, if it has one. if v.cron then -- Call each plugin's cron function, if it has one.
local result, err = pcall(function() v.cron(self) end) local result, err = pcall(function() v.cron(self, config) end)
if not result then if not result then
utilities.handle_exception(self, err, 'CRON: ' .. i, config) utilities.handle_exception(self, err, 'CRON: ' .. i, config)
end end

View File

@ -18,6 +18,8 @@ I am otouto, the plugin-wielding, multipurpose Telegram bot.
Send /help to get started. Send /help to get started.
]], ]],
-- The symbol that starts a command. Usually noted as '/' in documentation.
cmd_pat = '/',
-- https://datamarket.azure.com/dataset/bing/search -- https://datamarket.azure.com/dataset/bing/search
bing_api_key = '', bing_api_key = '',

View File

@ -1,5 +1,6 @@
local bot = require('bot') local bot = require('bot')
local instance = {} local instance = {}
local config = require('config')
return bot.run(instance) return bot.run(instance, config)

View File

@ -19,9 +19,9 @@ function about:action(msg, config)
local output = config.about_text .. '\nBased on otouto v'..bot.version..' by topkecleon.' local output = config.about_text .. '\nBased on otouto v'..bot.version..' by topkecleon.'
if (msg.new_chat_participant and msg.new_chat_participant.id == self.info.id) if (msg.new_chat_participant and msg.new_chat_participant.id == self.info.id)
or msg.text_lower:match('^'..utilities.CMD_PAT..'about') or msg.text_lower:match('^'..config.cmd_pat..'about')
or msg.text_lower:match('^'..utilities.CMD_PAT..'about@'..self.info.username:lower()) or msg.text_lower:match('^'..config.cmd_pat..'about@'..self.info.username:lower())
or msg.text_lower:match('^'..utilities.CMD_PAT..'start') then or msg.text_lower:match('^'..config.cmd_pat..'start') then
utilities.send_message(self, msg.chat.id, output, true) utilities.send_message(self, msg.chat.id, output, true)
return return
end end

View File

@ -66,17 +66,20 @@ function administration:init(config)
drua.PORT = config.cli_port or 4567 drua.PORT = config.cli_port or 4567
administration.init_flags(config.cmd_pat)
administration.init_command(self, config) administration.init_command(self, config)
administration.doc = '`Returns a list of administrated groups.\nUse '..config.cmd_pat..'ahelp for more administrative commands.`'
end end
administration.flags = { function administration.init_flags(cmd_pat) return {
[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.', short = 'This group is unlisted.',
enabled = 'This group is no longer listed in '..utilities.CMD_PAT..'groups.', enabled = 'This group is no longer listed in '..cmd_pat..'groups.',
disabled = 'This group is now listed in '..utilities.CMD_PAT..'groups.' disabled = 'This group is now listed in '..cmd_pat..'groups.'
}, },
[2] = { [2] = {
name = 'antisquig', name = 'antisquig',
@ -105,7 +108,7 @@ administration.flags = {
name = 'antiflood', name = 'antiflood',
desc = 'Prevents flooding by rate-limiting messages per user.', desc = 'Prevents flooding by rate-limiting messages per user.',
short = 'This group automatically removes users who flood.', short = 'This group automatically removes users who flood.',
enabled = 'Users will now be removed automatically for excessive messages. Use '..utilities.CMD_PAT..'antiflood to configure limits.', enabled = 'Users will now be removed automatically for excessive messages. Use '..cmd_pat..'antiflood to configure limits.',
disabled = 'Users will no longer be removed automatically for excessive messages.', disabled = 'Users will no longer be removed automatically for excessive messages.',
kicked = 'You were automatically kicked from GROUPNAME for flooding.' kicked = 'You were automatically kicked from GROUPNAME for flooding.'
}, },
@ -116,7 +119,7 @@ administration.flags = {
enabled = 'This group will no longer remove users for being globally banned.', enabled = 'This group will no longer remove users for being globally banned.',
disabled = 'This group will now remove users for being globally banned.' disabled = 'This group will now remove users for being globally banned.'
} }
} } end
administration.antiflood = { administration.antiflood = {
text = 10, text = 10,
@ -197,7 +200,7 @@ function administration:mod_format(id)
return output return output
end end
function administration:get_desc(chat_id) function administration:get_desc(chat_id, config)
local group = self.database.administration.groups[tostring(chat_id)] local group = self.database.administration.groups[tostring(chat_id)]
local t = {} local t = {}
@ -237,12 +240,12 @@ function administration:get_desc(chat_id)
if modstring ~= '' then if modstring ~= '' then
table.insert(t, '*Moderators:*\n' .. utilities.trim(modstring)) table.insert(t, '*Moderators:*\n' .. utilities.trim(modstring))
end end
table.insert(t, 'Run '..utilities.CMD_PAT..'ahelp@' .. self.info.username .. ' for a list of commands.') table.insert(t, 'Run '..config..'ahelp@' .. self.info.username .. ' for a list of commands.')
return table.concat(t, '\n\n') return table.concat(t, '\n\n')
end end
function administration:update_desc(chat) function administration:update_desc(chat, config)
local group = self.database.administration.groups[tostring(chat)] local group = self.database.administration.groups[tostring(chat)]
local desc = 'Welcome to ' .. group.name .. '!\n' local desc = 'Welcome to ' .. group.name .. '!\n'
if group.motd then desc = desc .. group.motd .. '\n' end if group.motd then desc = desc .. group.motd .. '\n' end
@ -250,7 +253,7 @@ function administration:update_desc(chat)
local gov = self.database.users[tostring(group.governor)] local gov = self.database.users[tostring(group.governor)]
desc = desc .. '\nGovernor: ' .. utilities.build_name(gov.first_name, gov.last_name) .. ' [' .. gov.id .. ']\n' desc = desc .. '\nGovernor: ' .. utilities.build_name(gov.first_name, gov.last_name) .. ' [' .. gov.id .. ']\n'
end end
local s = '\n'..utilities.CMD_PAT..'desc@' .. self.info.username .. ' for more information.' local s = '\n'..config.cmd_pat..'desc@' .. self.info.username .. ' for more information.'
desc = desc:sub(1, 250-s:len()) .. s desc = desc:sub(1, 250-s:len()) .. s
drua.channel_set_about(chat, desc) drua.channel_set_about(chat, desc)
end end
@ -400,7 +403,7 @@ function administration.init_command(self_, config)
else else
group.name = msg.new_chat_title group.name = msg.new_chat_title
if group.grouptype == 'supergroup' then if group.grouptype == 'supergroup' then
administration.update_desc(self, msg.chat.id) administration.update_desc(self, msg.chat.id, config)
end end
end end
elseif msg.new_chat_photo then elseif msg.new_chat_photo then
@ -461,7 +464,7 @@ function administration.init_command(self_, config)
end end
if msg.new_chat_participant and not new_user.do_kick then if msg.new_chat_participant and not new_user.do_kick then
local output = administration.get_desc(self, msg.chat.id) local output = administration.get_desc(self, msg.chat.id, config)
utilities.send_message(self, msg.new_chat_participant.id, output, true, nil, true) utilities.send_message(self, msg.new_chat_participant.id, output, true, nil, true)
end end
@ -481,7 +484,7 @@ function administration.init_command(self_, config)
}, },
{ -- /groups { -- /groups
triggers = utilities.triggers(self_.info.username):t('groups').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('groups').table,
command = 'groups', command = 'groups',
privilege = 1, privilege = 1,
@ -510,7 +513,7 @@ function administration.init_command(self_, config)
}, },
{ -- /ahelp { -- /ahelp
triggers = utilities.triggers(self_.info.username):t('ahelp', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('ahelp', true).table,
command = 'ahelp \\[command]', command = 'ahelp \\[command]',
privilege = 1, privilege = 1,
@ -521,11 +524,11 @@ function administration.init_command(self_, config)
local rank = administration.get_rank(self, msg.from.id, msg.chat.id, config) local rank = administration.get_rank(self, msg.from.id, msg.chat.id, config)
local input = utilities.get_word(msg.text_lower, 2) local input = utilities.get_word(msg.text_lower, 2)
if input then if input then
input = input:gsub('^'..utilities.CMD_PAT..'', '') input = input:gsub('^'..config.cmd_pat..'', '')
local doc local doc
for _,action in ipairs(administration.commands) do for _,action in ipairs(administration.commands) do
if action.keyword == input then if action.keyword == input then
doc = ''..utilities.CMD_PAT..'' .. action.command:gsub('\\','') .. '\n' .. action.doc doc = ''..config.cmd_pat..'' .. action.command:gsub('\\','') .. '\n' .. action.doc
break break
end end
end end
@ -533,14 +536,14 @@ function administration.init_command(self_, config)
local output = '*Help for* _' .. input .. '_ :\n```\n' .. doc .. '\n```' local output = '*Help for* _' .. input .. '_ :\n```\n' .. doc .. '\n```'
utilities.send_message(self, msg.chat.id, output, true, nil, true) utilities.send_message(self, msg.chat.id, output, true, nil, true)
else else
local output = 'Sorry, there is no help for that command.\n'..utilities.CMD_PAT..'ahelp@'..self.info.username local output = 'Sorry, there is no help for that command.\n'..config.cmd_pat..'ahelp@'..self.info.username
utilities.send_reply(self, msg, output) utilities.send_reply(self, msg, output)
end end
else else
local output = '*Commands for ' .. administration.ranks[rank] .. ':*\n' local output = '*Commands for ' .. administration.ranks[rank] .. ':*\n'
for i = 1, rank do for i = 1, rank do
for _, val in ipairs(self.admin_temp.help[i]) do for _, val in ipairs(self.admin_temp.help[i]) do
output = output .. '' .. utilities.CMD_PAT .. val .. '\n' output = output .. '' .. config.cmd_pat .. val .. '\n'
end end
end end
output = output .. 'Arguments: <required> \\[optional]' output = output .. 'Arguments: <required> \\[optional]'
@ -556,7 +559,7 @@ function administration.init_command(self_, config)
}, },
{ -- /ops { -- /ops
triggers = utilities.triggers(self_.info.username):t('ops'):t('oplist').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('ops'):t('oplist').table,
command = 'ops', command = 'ops',
privilege = 1, privilege = 1,
@ -586,7 +589,7 @@ function administration.init_command(self_, config)
}, },
{ -- /desc { -- /desc
triggers = utilities.triggers(self_.info.username):t('desc'):t('description').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('desc'):t('description').table,
command = 'description', command = 'description',
privilege = 1, privilege = 1,
@ -594,7 +597,7 @@ function administration.init_command(self_, config)
doc = 'Returns a description of the group (in a private message), including its motd, rules, flags, governor, and moderators.', doc = 'Returns a description of the group (in a private message), including its motd, rules, flags, governor, and moderators.',
action = function(self, msg, group, config) action = function(self, msg, group, config)
local output = administration.get_desc(self, msg.chat.id) local output = administration.get_desc(self, msg.chat.id, config)
if utilities.send_message(self, msg.from.id, output, true, nil, true) then if utilities.send_message(self, msg.from.id, output, true, nil, true) then
if msg.from.id ~= msg.chat.id then if msg.from.id ~= msg.chat.id then
utilities.send_reply(self, msg, 'I have sent you the requested information in a private message.') utilities.send_reply(self, msg, 'I have sent you the requested information in a private message.')
@ -606,7 +609,7 @@ function administration.init_command(self_, config)
}, },
{ -- /rules { -- /rules
triggers = utilities.triggers(self_.info.username):t('rules?', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('rules?', true).table,
command = 'rules \\[i]', command = 'rules \\[i]',
privilege = 1, privilege = 1,
@ -634,7 +637,7 @@ function administration.init_command(self_, config)
}, },
{ -- /motd { -- /motd
triggers = utilities.triggers(self_.info.username):t('motd').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('motd').table,
command = 'motd', command = 'motd',
privilege = 1, privilege = 1,
@ -651,7 +654,7 @@ function administration.init_command(self_, config)
}, },
{ -- /link { -- /link
triggers = utilities.triggers(self_.info.username):t('link').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('link').table,
command = 'link', command = 'link',
privilege = 1, privilege = 1,
@ -668,7 +671,7 @@ function administration.init_command(self_, config)
}, },
{ -- /kickme { -- /kickme
triggers = utilities.triggers(self_.info.username):t('leave'):t('kickme').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('leave'):t('kickme').table,
command = 'kickme', command = 'kickme',
privilege = 1, privilege = 1,
@ -689,7 +692,7 @@ function administration.init_command(self_, config)
}, },
{ -- /kick { -- /kick
triggers = utilities.triggers(self_.info.username):t('kick', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('kick', true).table,
command = 'kick <user>', command = 'kick <user>',
privilege = 2, privilege = 2,
@ -713,7 +716,7 @@ function administration.init_command(self_, config)
}, },
{ -- /ban { -- /ban
triggers = utilities.triggers(self_.info.username):t('ban', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('ban', true).table,
command = 'ban <user>', command = 'ban <user>',
privilege = 2, privilege = 2,
@ -737,7 +740,7 @@ function administration.init_command(self_, config)
}, },
{ -- /unban { -- /unban
triggers = utilities.triggers(self_.info.username):t('unban', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('unban', true).table,
command = 'unban <user>', command = 'unban <user>',
privilege = 2, privilege = 2,
@ -763,7 +766,7 @@ function administration.init_command(self_, config)
}, },
{ -- /setrules { -- /setrules
triggers = utilities.triggers(self_.info.username):t('setrules', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('setrules', true).table,
command = 'setrules <rules>', command = 'setrules <rules>',
privilege = 3, privilege = 3,
@ -771,7 +774,7 @@ function administration.init_command(self_, config)
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.', 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.',
action = function(self, msg, group, config) action = function(self, msg, group, config)
local input = msg.text:match('^'..utilities.CMD_PAT..'setrules[@'..self.info.username..']*(.+)') local input = msg.text:match('^'..config.cmd_pat..'setrules[@'..self.info.username..']*(.+)')
if input == ' --' or input == ' ' .. utilities.char.em_dash then if input == ' --' or input == ' ' .. utilities.char.em_dash then
group.rules = {} group.rules = {}
utilities.send_reply(self, msg, 'The rules have been cleared.') utilities.send_reply(self, msg, 'The rules have been cleared.')
@ -793,7 +796,7 @@ function administration.init_command(self_, config)
}, },
{ -- /changerule { -- /changerule
triggers = utilities.triggers(self_.info.username):t('changerule', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('changerule', true).table,
command = 'changerule <i> <rule>', command = 'changerule <i> <rule>',
privilege = 3, privilege = 3,
@ -802,7 +805,7 @@ function administration.init_command(self_, config)
action = function(self, msg, group, config) action = function(self, msg, group, config)
local input = utilities.input(msg.text) local input = utilities.input(msg.text)
local output = 'usage: `'..utilities.CMD_PAT..'changerule <i> <newrule>`' local output = 'usage: `'..config.cmd_pat..'changerule <i> <newrule>`'
if input then if input then
local rule_num = tonumber(input:match('^%d+')) local rule_num = tonumber(input:match('^%d+'))
local new_rule = utilities.input(input) local new_rule = utilities.input(input)
@ -830,7 +833,7 @@ function administration.init_command(self_, config)
}, },
{ -- /setmotd { -- /setmotd
triggers = utilities.triggers(self_.info.username):t('setmotd', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('setmotd', true).table,
command = 'setmotd <motd>', command = 'setmotd <motd>',
privilege = 2, privilege = 2,
@ -853,7 +856,7 @@ function administration.init_command(self_, config)
utilities.send_message(self, msg.chat.id, output, true, nil, true) utilities.send_message(self, msg.chat.id, output, true, nil, true)
end end
if group.grouptype == 'supergroup' then if group.grouptype == 'supergroup' then
administration.update_desc(self, msg.chat.id) administration.update_desc(self, msg.chat.id, config)
end end
else else
utilities.send_reply(self, msg, 'Please specify the new message of the day.') utilities.send_reply(self, msg, 'Please specify the new message of the day.')
@ -862,7 +865,7 @@ function administration.init_command(self_, config)
}, },
{ -- /setlink { -- /setlink
triggers = utilities.triggers(self_.info.username):t('setlink', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('setlink', true).table,
command = 'setlink <link>', command = 'setlink <link>',
privilege = 3, privilege = 3,
@ -885,7 +888,7 @@ function administration.init_command(self_, config)
}, },
{ -- /alist { -- /alist
triggers = utilities.triggers(self_.info.username):t('alist').table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('alist').table,
command = 'alist', command = 'alist',
privilege = 3, privilege = 3,
@ -903,7 +906,7 @@ function administration.init_command(self_, config)
}, },
{ -- /flags { -- /flags
triggers = utilities.triggers(self_.info.username):t('flags?', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('flags?', true).table,
command = 'flag \\[i]', command = 'flag \\[i]',
privilege = 3, privilege = 3,
@ -935,7 +938,7 @@ function administration.init_command(self_, config)
}, },
{ -- /antiflood { -- /antiflood
triggers = utilities.triggers(self_.info.username):t('antiflood', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('antiflood', true).table,
command = 'antiflood \\[<type> <i>]', command = 'antiflood \\[<type> <i>]',
privilege = 3, privilege = 3,
@ -944,7 +947,7 @@ function administration.init_command(self_, config)
action = function(self, msg, group, config) action = function(self, msg, group, config)
if not group.flags[5] then if not group.flags[5] then
utilities.send_message(self, msg.chat.id, 'antiflood is not enabled. Use `'..utilities.CMD_PAT..'flag 5` to enable it.', true, nil, true) utilities.send_message(self, msg.chat.id, 'antiflood is not enabled. Use `'..config.cmd_pat..'flag 5` to enable it.', true, nil, true)
else else
if not group.antiflood then if not group.antiflood then
group.antiflood = JSON.decode(JSON.encode(administration.antiflood)) group.antiflood = JSON.decode(JSON.encode(administration.antiflood))
@ -963,7 +966,7 @@ function administration.init_command(self_, config)
output = '*' .. key:gsub('^%l', string.upper) .. '* messages are now worth *' .. val .. '* points.' output = '*' .. key:gsub('^%l', string.upper) .. '* messages are now worth *' .. val .. '* points.'
end end
else else
output = 'usage: `'..utilities.CMD_PAT..'antiflood <type> <i>`\nexample: `'..utilities.CMD_PAT..'antiflood text 5`\nUse 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' output = 'usage: `'..config.cmd_pat..'antiflood <type> <i>`\nexample: `'..config.cmd_pat..'antiflood text 5`\nUse 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'
for k,v in pairs(group.antiflood) do for k,v in pairs(group.antiflood) do
output = output .. '*'..k..':* `'..v..'`\n' output = output .. '*'..k..':* `'..v..'`\n'
end end
@ -975,7 +978,7 @@ function administration.init_command(self_, config)
}, },
{ -- /mod { -- /mod
triggers = utilities.triggers(self_.info.username):t('mod', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('mod', true).table,
command = 'mod <user>', command = 'mod <user>',
privilege = 3, privilege = 3,
@ -1002,7 +1005,7 @@ function administration.init_command(self_, config)
}, },
{ -- /demod { -- /demod
triggers = utilities.triggers(self_.info.username):t('demod', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('demod', true).table,
command = 'demod <user>', command = 'demod <user>',
privilege = 3, privilege = 3,
@ -1028,7 +1031,7 @@ function administration.init_command(self_, config)
}, },
{ -- /gov { -- /gov
triggers = utilities.triggers(self_.info.username):t('gov', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('gov', true).table,
command = 'gov <user>', command = 'gov <user>',
privilege = 4, privilege = 4,
@ -1050,14 +1053,14 @@ function administration.init_command(self_, config)
end end
if group.grouptype == 'supergroup' then if group.grouptype == 'supergroup' then
drua.channel_set_admin(msg.chat.id, target.id, 2) drua.channel_set_admin(msg.chat.id, target.id, 2)
administration.update_desc(self, msg.chat.id) administration.update_desc(self, msg.chat.id, config)
end end
end end
end end
}, },
{ -- /degov { -- /degov
triggers = utilities.triggers(self_.info.username):t('degov', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('degov', true).table,
command = 'degov <user>', command = 'degov <user>',
privilege = 4, privilege = 4,
@ -1077,14 +1080,14 @@ function administration.init_command(self_, config)
end end
if group.grouptype == 'supergroup' then if group.grouptype == 'supergroup' then
drua.channel_set_admin(msg.chat.id, target.id, 0) drua.channel_set_admin(msg.chat.id, target.id, 0)
administration.update_desc(self, msg.chat.id) administration.update_desc(self, msg.chat.id, config)
end end
end end
end end
}, },
{ -- /hammer { -- /hammer
triggers = utilities.triggers(self_.info.username):t('hammer', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('hammer', true).table,
command = 'hammer <user>', command = 'hammer <user>',
privilege = 4, privilege = 4,
@ -1120,7 +1123,7 @@ function administration.init_command(self_, config)
}, },
{ -- /unhammer { -- /unhammer
triggers = utilities.triggers(self_.info.username):t('unhammer', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('unhammer', true).table,
command = 'unhammer <user>', command = 'unhammer <user>',
privilege = 4, privilege = 4,
@ -1144,7 +1147,7 @@ function administration.init_command(self_, config)
}, },
{ -- /admin { -- /admin
triggers = utilities.triggers(self_.info.username):t('admin', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('admin', true).table,
command = 'admin <user>', command = 'admin <user>',
privilege = 5, privilege = 5,
@ -1171,7 +1174,7 @@ function administration.init_command(self_, config)
}, },
{ -- /deadmin { -- /deadmin
triggers = utilities.triggers(self_.info.username):t('deadmin', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('deadmin', true).table,
command = 'deadmin <user>', command = 'deadmin <user>',
privilege = 5, privilege = 5,
@ -1199,7 +1202,7 @@ function administration.init_command(self_, config)
}, },
{ -- /gadd { -- /gadd
triggers = utilities.triggers(self_.info.username):t('gadd', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('gadd', true).table,
command = 'gadd [i] ...', command = 'gadd [i] ...',
privilege = 5, privilege = 5,
@ -1238,7 +1241,7 @@ function administration.init_command(self_, config)
autokicks = {}, autokicks = {},
autoban = 3 autoban = 3
} }
administration.update_desc(self, msg.chat.id) administration.update_desc(self, msg.chat.id, config)
table.insert(self.database.administration.activity, msg.chat.id_str) table.insert(self.database.administration.activity, msg.chat.id_str)
utilities.send_reply(self, msg, 'I am now administrating this group.') utilities.send_reply(self, msg, 'I am now administrating this group.')
drua.channel_set_admin(msg.chat.id, self.info.id, 2) drua.channel_set_admin(msg.chat.id, self.info.id, 2)
@ -1247,7 +1250,7 @@ function administration.init_command(self_, config)
}, },
{ -- /grem { -- /grem
triggers = utilities.triggers(self_.info.username):t('grem', true):t('gremove', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('grem', true):t('gremove', true).table,
command = 'gremove \\[chat]', command = 'gremove \\[chat]',
privilege = 5, privilege = 5,
@ -1278,7 +1281,7 @@ function administration.init_command(self_, config)
}, },
{ -- /glist { -- /glist
triggers = utilities.triggers(self_.info.username):t('glist', false).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('glist', false).table,
command = 'glist', command = 'glist',
privilege = 5, privilege = 5,
@ -1307,7 +1310,7 @@ function administration.init_command(self_, config)
}, },
{ -- /broadcast { -- /broadcast
triggers = utilities.triggers(self_.info.username):t('broadcast', true).table, triggers = utilities.triggers(self_.info.username, config.cmd_pat):t('broadcast', true).table,
command = 'broadcast <message>', command = 'broadcast <message>',
privilege = 5, privilege = 5,
@ -1389,6 +1392,5 @@ function administration:cron()
end end
administration.command = 'groups' administration.command = 'groups'
administration.doc = '`Returns a list of administrated groups.\nUse '..utilities.CMD_PAT..'ahelp for more administrative commands.`'
return administration return administration

View File

@ -8,20 +8,20 @@ local URL = require('socket.url')
local utilities = require('utilities') local utilities = require('utilities')
apod.command = 'apod [date]' apod.command = 'apod [date]'
apod.doc = [[```
]]..utilities.CMD_PAT..[[apod [query] function apod:init(config)
apod.triggers = utilities.triggers(self.info.username, config.cmd_pat)
:t('apod', true):t('apodhd', true):t('apodtext', true).table
apod.doc = [[```
]]..config.cmd_pat..[[apod [query]
Returns the Astronomy Picture of the Day. Returns the Astronomy Picture of the Day.
If the query is a date, in the format YYYY-MM-DD, the APOD of that day is returned. If the query is a date, in the format YYYY-MM-DD, the APOD of that day is returned.
]]..utilities.CMD_PAT..[[apodhd [query] ]]..config.cmd_pat..[[apodhd [query]
Returns the image in HD, if available. Returns the image in HD, if available.
]]..utilities.CMD_PAT..[[apodtext [query] ]]..config.cmd_pat..[[apodtext [query]
Returns the explanation of the APOD. Returns the explanation of the APOD.
Source: nasa.gov Source: nasa.gov
```]] ```]]
function apod:init()
apod.triggers = utilities.triggers(self.info.username)
:t('apod', true):t('apodhd', true):t('apodtext', true).table
end end
function apod:action(msg, config) function apod:action(msg, config)
@ -65,13 +65,13 @@ function apod:action(msg, config)
local img_url = jdat.url local img_url = jdat.url
if string.match(msg.text, '^'..utilities.CMD_PAT..'apodhd*') then if string.match(msg.text, '^'..config.cmd_pat..'apodhd*') then
img_url = jdat.hdurl or jdat.url img_url = jdat.hdurl or jdat.url
end end
local output = date .. '[' .. jdat.title .. '](' .. img_url .. ')' local output = date .. '[' .. jdat.title .. '](' .. img_url .. ')'
if string.match(msg.text, '^'..utilities.CMD_PAT..'apodtext*') then if string.match(msg.text, '^'..config.cmd_pat..'apodtext*') then
output = output .. '\n' .. jdat.explanation output = output .. '\n' .. jdat.explanation
disable_page_preview = true disable_page_preview = true
end end

View File

@ -3,13 +3,13 @@ local bandersnatch = {}
local utilities = require('utilities') local utilities = require('utilities')
bandersnatch.command = 'bandersnatch' bandersnatch.command = 'bandersnatch'
bandersnatch.doc = [[```
Shun the frumious Bandersnatch.
Alias: ]]..utilities.CMD_PAT..[[bc
```]]
function bandersnatch:init() function bandersnatch:init(config)
bandersnatch.triggers = utilities.triggers(self.info.username):t('bandersnatch'):t('bc').table bandersnatch.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('bandersnatch'):t('bc').table
bandersnatch.doc = [[```
Shun the frumious Bandersnatch.
Alias: ]]..config.cmd_pat..[[bc
```]]
end end
local fullnames = { "Wimbledon Tennismatch", "Rinkydink Curdlesnoot", "Butawhiteboy Cantbekhan", "Benadryl Claritin", "Bombadil Rivendell", "Wanda's Crotchfruit", "Biblical Concubine", "Syphilis Cankersore", "Buckminster Fullerene", "Bourgeoisie Capitalist" } local fullnames = { "Wimbledon Tennismatch", "Rinkydink Curdlesnoot", "Butawhiteboy Cantbekhan", "Benadryl Claritin", "Bombadil Rivendell", "Wanda's Crotchfruit", "Biblical Concubine", "Syphilis Cankersore", "Buckminster Fullerene", "Bourgeoisie Capitalist" }

View File

@ -11,15 +11,15 @@ function bible:init(config)
return return
end end
bible.triggers = utilities.triggers(self.info.username):t('bible', true):t('b', true).table bible.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('bible', true):t('b', true).table
bible.doc = [[```
]]..config.cmd_pat..[[bible <reference>
Returns a verse from the American Standard Version of the Bible, or an apocryphal verse from the King James Version. Results from biblia.com.
Alias: ]]..config.cmd_pat..[[b
```]]
end end
bible.command = 'bible <reference>' bible.command = 'bible <reference>'
bible.doc = [[```
]]..utilities.CMD_PAT..[[bible <reference>
Returns a verse from the American Standard Version of the Bible, or an apocryphal verse from the King James Version. Results from biblia.com.
Alias: ]]..utilities.CMD_PAT..[[b
```]]
function bible:action(msg, config) function bible:action(msg, config)

View File

@ -19,7 +19,7 @@ function blacklist:action(msg, config)
if self.database.blacklist[msg.from.id_str] then return end if self.database.blacklist[msg.from.id_str] then return end
if self.database.blacklist[msg.chat.id_str] then return end if self.database.blacklist[msg.chat.id_str] then return end
if not msg.text:match('^'..utilities.CMD_PAT..'blacklist') then return true end if not msg.text:match('^'..config.cmd_pat..'blacklist') then return true end
if msg.from.id ~= config.admin then return end if msg.from.id ~= config.admin then return end
local target = utilities.user_from_message(self, msg) local target = utilities.user_from_message(self, msg)

View File

@ -5,13 +5,13 @@ local HTTPS = require('ssl.https')
local utilities = require('utilities') local utilities = require('utilities')
calc.command = 'calc <expression>' calc.command = 'calc <expression>'
calc.doc = [[```
]]..utilities.CMD_PAT..[[calc <expression> function calc:init(config)
calc.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('calc', true).table
calc.doc = [[```
]]..config.cmd_pat..[[calc <expression>
Returns solutions to mathematical expressions and conversions between common units. Results provided by mathjs.org. Returns solutions to mathematical expressions and conversions between common units. Results provided by mathjs.org.
```]] ```]]
function calc:init()
calc.triggers = utilities.triggers(self.info.username):t('calc', true).table
end end
function calc:action(msg, config) function calc:action(msg, config)

View File

@ -9,7 +9,7 @@ function cats:init(config)
print('cats.lua will be enabled, but there are more features with a key.') print('cats.lua will be enabled, but there are more features with a key.')
end end
cats.triggers = utilities.triggers(self.info.username):t('cat').table cats.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('cat').table
end end
cats.command = 'cat' cats.command = 'cat'

View File

@ -6,7 +6,6 @@ local HTTP = require('socket.http')
local URL = require('socket.url') local URL = require('socket.url')
local JSON = require('dkjson') local JSON = require('dkjson')
local bindings = require('bindings') local bindings = require('bindings')
local utilities = require('utilities')
function chatter:init(config) function chatter:init(config)
if not config.simsimi_key then if not config.simsimi_key then
@ -34,7 +33,7 @@ function chatter:action(msg, config)
--Uncomment the following line for Al Gore-like conversation. --Uncomment the following line for Al Gore-like conversation.
--or (msg.reply_to_message and msg.reply_to_message.from.id == self.info.id) --or (msg.reply_to_message and msg.reply_to_message.from.id == self.info.id)
) )
or msg.text:match('^'..utilities.CMD_PAT) or msg.text:match('^'..config.CMD_PAT)
or msg.text == '' or msg.text == ''
) then ) then
return true return true

View File

@ -7,8 +7,8 @@ local utilities = require('utilities')
commit.command = 'commit' commit.command = 'commit'
commit.doc = '`Returns a commit message from whatthecommit.com.`' commit.doc = '`Returns a commit message from whatthecommit.com.`'
function commit:init() function commit:init(config)
commit.triggers = utilities.triggers(self.info.username):t('commit').table commit.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('commit').table
end end
local commits = { local commits = {

View File

@ -3,9 +3,12 @@ local control = {}
local bot = require('bot') local bot = require('bot')
local utilities = require('utilities') local utilities = require('utilities')
function control:init() local cmd_pat -- Prevents the command from being uncallable.
control.triggers = utilities.triggers(self.info.username):t('reload'):t('halt').table
table.insert(control.triggers, '^'..utilities.CMD_PAT..'script') function control:init(config)
cmd_pat = config.cmd_pat
control.triggers = utilities.triggers(self.info.username, cmd_pat,
{'^'..cmd_pat..'script'}):t('reload', true):t('halt').table
end end
function control:action(msg, config) function control:action(msg, config)
@ -16,7 +19,7 @@ function control:action(msg, config)
if msg.date < os.time() - 1 then return end if msg.date < os.time() - 1 then return end
if msg.text:match('^'..utilities.CMD_PAT..'reload') then if msg.text_lower:match('^'..cmd_pat..'reload') then
for pac, _ in pairs(package.loaded) do for pac, _ in pairs(package.loaded) do
if pac:match('^plugins%.') then if pac:match('^plugins%.') then
package.loaded[pac] = nil package.loaded[pac] = nil
@ -25,18 +28,18 @@ function control:action(msg, config)
package.loaded['bindings'] = nil package.loaded['bindings'] = nil
package.loaded['utilities'] = nil package.loaded['utilities'] = nil
package.loaded['config'] = nil package.loaded['config'] = nil
for k, v in pairs(require('config')) do if msg.text_lower:match('%+config') then for k, v in pairs(require('config')) do
config[k] = v config[k] = v
end end end
bot.init(self, config) bot.init(self, config)
utilities.send_reply(self, msg, 'Bot reloaded!') utilities.send_reply(self, msg, 'Bot reloaded!')
elseif msg.text:match('^'..utilities.CMD_PAT..'halt') then elseif msg.text_lower:match('^'..cmd_pat..'halt') then
self.is_started = false self.is_started = false
utilities.send_reply(self, msg, 'Stopping bot!') utilities.send_reply(self, msg, 'Stopping bot!')
elseif msg.text:match('^'..utilities.CMD_PAT..'script') then elseif msg.text_lower:match('^'..cmd_pat..'script') then
local input = msg.text:match('^'..utilities.CMD_PAT..'script\n(.+)') local input = msg.text_lower:match('^'..cmd_pat..'script\n(.+)')
if not input then if not input then
utilities.send_reply(self, msg, 'usage: ```\n'..utilities.CMD_PAT..'script\n'..utilities.CMD_PAT..'command <arg>\n...\n```', true) utilities.send_reply(self, msg, 'usage: ```\n'..cmd_pat..'script\n'..cmd_pat..'command <arg>\n...\n```', true)
return return
end end
input = input .. '\n' input = input .. '\n'

View File

@ -4,15 +4,15 @@ local HTTPS = require('ssl.https')
local utilities = require('utilities') local utilities = require('utilities')
currency.command = 'cash [amount] <from> to <to>' currency.command = 'cash [amount] <from> to <to>'
currency.doc = [[```
]]..utilities.CMD_PAT..[[cash [amount] <from> to <to> function currency:init(config)
Example: ]]..utilities.CMD_PAT..[[cash 5 USD to EUR currency.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('cash', true).table
currency.doc = [[```
]]..config.cmd_pat..[[cash [amount] <from> to <to>
Example: ]]..config.cmd_pat..[[cash 5 USD to EUR
Returns exchange rates for various currencies. Returns exchange rates for various currencies.
Source: Google Finance. Source: Google Finance.
```]] ```]]
function currency:init()
currency.triggers = utilities.triggers(self.info.username):t('cash', true).table
end end
function currency:action(msg, config) function currency:action(msg, config)

View File

@ -3,13 +3,13 @@ local dice = {}
local utilities = require('utilities') local utilities = require('utilities')
dice.command = 'roll <nDr>' dice.command = 'roll <nDr>'
dice.doc = [[```
]]..utilities.CMD_PAT..[[roll <nDr> function dice:init(config)
dice.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('roll', true).table
dice.doc = [[```
]]..config.cmd_pat..[[roll <nDr>
Returns a set of dice rolls, where n is the number of rolls and r is the range. If only a range is given, returns only one roll. Returns a set of dice rolls, where n is the number of rolls and r is the range. If only a range is given, returns only one roll.
```]] ```]]
function dice:init()
dice.triggers = utilities.triggers(self.info.username):t('roll', true).table
end end
function dice:action(msg) function dice:action(msg)

View File

@ -6,15 +6,15 @@ local bindings = require('bindings')
local utilities = require('utilities') local utilities = require('utilities')
dilbert.command = 'dilbert [date]' dilbert.command = 'dilbert [date]'
dilbert.doc = [[```
]]..utilities.CMD_PAT..[[dilbert [YYYY-MM-DD] function dilbert:init(config)
dilbert.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('dilbert', true).table
dilbert.doc = [[```
]]..config.cmd_pat..[[dilbert [YYYY-MM-DD]
Returns the latest Dilbert strip or that of the provided date. 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. Dates before the first strip will return the first strip. Dates after the last trip will return the last strip.
Source: dilbert.com Source: dilbert.com
```]] ```]]
function dilbert:init()
dilbert.triggers = utilities.triggers(self.info.username):t('dilbert', true).table
end end
function dilbert:action(msg, config) function dilbert:action(msg, config)

View File

@ -3,13 +3,13 @@ local echo = {}
local utilities = require('utilities') local utilities = require('utilities')
echo.command = 'echo <text>' echo.command = 'echo <text>'
echo.doc = [[```
]]..utilities.CMD_PAT..[[echo <text> function echo:init(config)
echo.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('echo', true).table
echo.doc = [[```
]]..config.cmd_pat..[[echo <text>
Repeats a string of text. Repeats a string of text.
```]] ```]]
function echo:init()
echo.triggers = utilities.triggers(self.info.username):t('echo', true).table
end end
function echo:action(msg) function echo:action(msg)

View File

@ -5,8 +5,9 @@ local utilities = require('utilities')
eightball.command = '8ball' eightball.command = '8ball'
eightball.doc = '`Returns an answer from a magic 8-ball!`' eightball.doc = '`Returns an answer from a magic 8-ball!`'
function eightball:init() function eightball:init(config)
eightball.triggers = utilities.triggers(self.info.username, {'[Yy]/[Nn]%p*$'}):t('8ball', true).table eightball.triggers = utilities.triggers(self.info.username, config.cmd_pat,
{'[Yy]/[Nn]%p*$'}):t('8ball', true).table
end end
local ball_answers = { local ball_answers = {

View File

@ -4,7 +4,7 @@ local fortune = {}
local utilities = require('utilities') local utilities = require('utilities')
function fortune:init() function fortune:init(config)
local s = io.popen('fortune'):read('*all') local s = io.popen('fortune'):read('*all')
if s:match('not found$') then if s:match('not found$') then
print('fortune is not installed on this computer.') print('fortune is not installed on this computer.')
@ -12,7 +12,7 @@ function fortune:init()
return return
end end
fortune.triggers = utilities.triggers(self.info.username):t('fortune').table fortune.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('fortune').table
end end
fortune.command = 'fortune' fortune.command = 'fortune'

View File

@ -19,15 +19,15 @@ function gImages:init(config)
return return
end end
gImages.triggers = utilities.triggers(self.info.username):t('image', true):t('i', true):t('insfw', true).table gImages.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('image', true):t('i', true):t('insfw', true).table
gImages.doc = [[```
]]..config.cmd_pat..[[image <query>
Returns a randomized top result from Google Images. Safe search is enabled by default; use "]]..config.cmd_pat..[[insfw" to disable it. NSFW results will not display an image preview.
Alias: ]]..config.cmd_pat..[[i
```]]
end end
gImages.command = 'image <query>' gImages.command = 'image <query>'
gImages.doc = [[```
]]..utilities.CMD_PAT..[[image <query>
Returns a randomized top result from Google Images. Safe search is enabled by default; use "]]..utilities.CMD_PAT..[[insfw" to disable it. NSFW results will not display an image preview.
Alias: ]]..utilities.CMD_PAT..[[i
```]]
function gImages:action(msg, config) function gImages:action(msg, config)
@ -43,7 +43,7 @@ function gImages:action(msg, config)
local url = 'https://www.googleapis.com/customsearch/v1?&searchType=image&imgSize=xlarge&alt=json&num=8&start=1&key=' .. config.google_api_key .. '&cx=' .. config.google_cse_key local url = 'https://www.googleapis.com/customsearch/v1?&searchType=image&imgSize=xlarge&alt=json&num=8&start=1&key=' .. config.google_api_key .. '&cx=' .. config.google_cse_key
if not string.match(msg.text, '^'..utilities.CMD_PAT..'i[mage]*nsfw') then if not string.match(msg.text, '^'..config.cmd_pat..'i[mage]*nsfw') then
url = url .. '&safe=high' url = url .. '&safe=high'
end end

View File

@ -4,14 +4,14 @@ local bindings = require('bindings')
local utilities = require('utilities') local utilities = require('utilities')
gMaps.command = 'location <query>' gMaps.command = 'location <query>'
gMaps.doc = [[```
]]..utilities.CMD_PAT..[[location <query>
Returns a location from Google Maps.
Alias: ]]..utilities.CMD_PAT..[[loc
```]]
function gMaps:init() function gMaps:init(config)
gMaps.triggers = utilities.triggers(self.info.username):t('location', true):t('loc', true).table gMaps.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('location', true):t('loc', true).table
gMaps.doc = [[```
]]..config.cmd_pat..[[location <query>
Returns a location from Google Maps.
Alias: ]]..config.cmd_pat..[[loc
```]]
end end
function gMaps:action(msg, config) function gMaps:action(msg, config)

View File

@ -6,14 +6,14 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
gSearch.command = 'google <query>' gSearch.command = 'google <query>'
gSearch.doc = [[```
]]..utilities.CMD_PAT..[[google <query>
Returns four (if group) or eight (if private message) results from Google. Safe search is enabled by default, use "]]..utilities.CMD_PAT..[[gnsfw" to disable it.
Alias: ]]..utilities.CMD_PAT..[[g
```]]
function gSearch:init() function gSearch:init(config)
gSearch.triggers = utilities.triggers(self.info.username):t('g', true):t('google', true):t('gnsfw', true).table gSearch.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('g', true):t('google', true):t('gnsfw', true).table
gSearch.doc = [[```
]]..config.cmd_pat..[[google <query>
Returns four (if group) or eight (if private message) results from Google. Safe search is enabled by default, use "]]..config.cmd_pat..[[gnsfw" to disable it.
Alias: ]]..config.cmd_pat..[[g
```]]
end end
function gSearch:action(msg, config) function gSearch:action(msg, config)
@ -36,7 +36,7 @@ function gSearch:action(msg, config)
url = url .. '&rsz=4' url = url .. '&rsz=4'
end end
if not string.match(msg.text, '^'..utilities.CMD_PAT..'g[oogle]*nsfw') then if not string.match(msg.text, '^'..config.cmd_pat..'g[oogle]*nsfw') then
url = url .. '&safe=active' url = url .. '&safe=active'
end end

View File

@ -6,13 +6,13 @@ local bindings = require('bindings')
local utilities = require('utilities') local utilities = require('utilities')
hackernews.command = 'hackernews' hackernews.command = 'hackernews'
hackernews.doc = [[```
Returns four (if group) or eight (if private message) top stories from Hacker News.
Alias: ]]..utilities.CMD_PAT..[[hn
```]]
function hackernews:init() function hackernews:init(config)
hackernews.triggers = utilities.triggers(self.info.username):t('hackernews', true):t('hn', true).table hackernews.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('hackernews', true):t('hn', true).table
hackernews.doc = [[```
Returns four (if group) or eight (if private message) top stories from Hacker News.
Alias: ]]..config.cmd_pat..[[hn
```]]
end end
function hackernews:action(msg, config) function hackernews:action(msg, config)

View File

@ -6,7 +6,7 @@ local hearthstone = {}
local JSON = require('dkjson') local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
function hearthstone:init() function hearthstone:init(config)
if not self.database.hearthstone or os.time() > self.database.hearthstone.expiration then if not self.database.hearthstone or os.time() > self.database.hearthstone.expiration then
print('Downloading Hearthstone database...') print('Downloading Hearthstone database...')
@ -36,15 +36,15 @@ function hearthstone:init()
end end
hearthstone.triggers = utilities.triggers(self.info.username):t('hearthstone', true):t('hs').table hearthstone.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('hearthstone', true):t('hs').table
hearthstone.doc = [[```
]]..config.cmd_pat..[[hearthstone <query>
Returns Hearthstone card info.
Alias: ]]..config.cmd_pat..[[hs
```]]
end end
hearthstone.command = 'hearthstone <query>' hearthstone.command = 'hearthstone <query>'
hearthstone.doc = [[```
]]..utilities.CMD_PAT..[[hearthstone <query>
Returns Hearthstone card info.
Alias: ]]..utilities.CMD_PAT..[[hs
```]]
local function format_card(card) local function format_card(card)

View File

@ -7,26 +7,26 @@ local utilities = require('utilities')
local help_text local help_text
function help:init() function help:init(config)
local commandlist = {} local commandlist = {}
help_text = '*Available commands:*\n'..utilities.CMD_PAT help_text = '*Available commands:*\n'..config.cmd_pat
for _,plugin in ipairs(self.plugins) do for _,plugin in ipairs(self.plugins) do
if plugin.command then if plugin.command then
table.insert(commandlist, plugin.command) table.insert(commandlist, plugin.command)
--help_text = help_text .. '\n• '..utilities.CMD_PAT .. plugin.command:gsub('%[', '\\[') --help_text = help_text .. '\n• '..config.cmd_pat .. plugin.command:gsub('%[', '\\[')
end end
end end
table.insert(commandlist, 'help [command]') table.insert(commandlist, 'help [command]')
table.sort(commandlist) table.sort(commandlist)
help_text = help_text .. table.concat(commandlist, '\n'..utilities.CMD_PAT) .. '\nArguments: <required> [optional]' help_text = help_text .. table.concat(commandlist, '\n'..config.cmd_pat) .. '\nArguments: <required> [optional]'
help_text = help_text:gsub('%[', '\\[') help_text = help_text:gsub('%[', '\\[')
help.triggers = utilities.triggers(self.info.username):t('help', true):t('h', true).table help.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('help', true):t('h', true).table
end end

View File

@ -6,13 +6,13 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
imdb.command = 'imdb <query>' imdb.command = 'imdb <query>'
imdb.doc = [[```
]]..utilities.CMD_PAT..[[imdb <query> function imdb:init(config)
imdb.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('imdb', true).table
imdb.doc = [[```
]]..config.cmd_pat..[[imdb <query>
Returns an IMDb entry. Returns an IMDb entry.
```]] ```]]
function imdb:init()
imdb.triggers = utilities.triggers(self.info.username):t('imdb', true).table
end end
function imdb:action(msg, config) function imdb:action(msg, config)

View File

@ -15,26 +15,26 @@ function lastfm:init(config)
return return
end end
lastfm.triggers = utilities.triggers(self.info.username):t('lastfm', true):t('np', true):t('fmset', true).table lastfm.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lastfm', true):t('np', true):t('fmset', true).table
lastfm.doc = [[```
]]..config.cmd_pat..[[np [username]
Returns what you are or were last listening to. If you specify a username, info will be returned for that username.
]]..config.cmd_pat..[[fmset <username>
Sets your last.fm username. Otherwise, ]]..config.cmd_pat..[[np will use your Telegram username. Use "]]..config.cmd_pat..[[fmset --" to delete it.
```]]
end end
lastfm.command = 'lastfm' lastfm.command = 'lastfm'
lastfm.doc = [[```
]]..utilities.CMD_PAT..[[np [username]
Returns what you are or were last listening to. If you specify a username, info will be returned for that username.
]]..utilities.CMD_PAT..[[fmset <username>
Sets your last.fm username. Otherwise, ]]..utilities.CMD_PAT..[[np will use your Telegram username. Use "]]..utilities.CMD_PAT..[[fmset --" to delete it.
```]]
function lastfm:action(msg, config) function lastfm:action(msg, config)
local input = utilities.input(msg.text) local input = utilities.input(msg.text)
if string.match(msg.text, '^'..utilities.CMD_PAT..'lastfm') then if string.match(msg.text, '^'..config.cmd_pat..'lastfm') then
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true) utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
return return
elseif string.match(msg.text, '^'..utilities.CMD_PAT..'fmset') then elseif string.match(msg.text, '^'..config.cmd_pat..'fmset') then
if not input then if not input then
utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true) utilities.send_message(self, msg.chat.id, lastfm.doc, true, msg.message_id, true)
elseif input == '--' or input == utilities.char.em_dash then elseif input == '--' or input == utilities.char.em_dash then
@ -57,10 +57,10 @@ function lastfm:action(msg, config)
username = self.database.users[msg.from.id_str].lastfm username = self.database.users[msg.from.id_str].lastfm
elseif msg.from.username then elseif msg.from.username then
username = msg.from.username username = msg.from.username
alert = '\n\nYour username has been set to ' .. username .. '.\nTo change it, use '..utilities.CMD_PAT..'fmset <username>.' alert = '\n\nYour username has been set to ' .. username .. '.\nTo change it, use '..config.cmd_pat..'fmset <username>.'
self.database.users[msg.from.id_str].lastfm = username self.database.users[msg.from.id_str].lastfm = username
else else
utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..utilities.CMD_PAT..'fmset.') utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.')
return return
end end
@ -78,7 +78,7 @@ function lastfm:action(msg, config)
local jdat = JSON.decode(jstr) local jdat = JSON.decode(jstr)
if jdat.error then if jdat.error then
utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..utilities.CMD_PAT..'fmset.') utilities.send_reply(self, msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.')
return return
end end

View File

@ -4,8 +4,8 @@ local utilities = require('utilities')
local URL = require('socket.url') local URL = require('socket.url')
local JSON = require('dkjson') local JSON = require('dkjson')
function luarun:init() function luarun:init(config)
luarun.triggers = utilities.triggers(self.info.username):t('lua', true):t('return', true).table luarun.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lua', true):t('return', true).table
end end
function luarun:action(msg, config) function luarun:action(msg, config)
@ -20,7 +20,7 @@ function luarun:action(msg, config)
return return
end end
if msg.text_lower:match('^'..utilities.CMD_PAT..'return') then if msg.text_lower:match('^'..config.cmd_pat..'return') then
input = 'return ' .. input input = 'return ' .. input
end end
@ -32,8 +32,8 @@ function luarun:action(msg, config)
local URL = require('socket.url') local URL = require('socket.url')
local HTTP = require('socket.http') local HTTP = require('socket.http')
local HTTPS = require('ssl.https') local HTTPS = require('ssl.https')
return function (self, msg) ]] .. input .. [[ end return function (self, msg, config) ]] .. input .. [[ end
]] )()(self, msg) ]] )()(self, msg, config)
if output == nil then if output == nil then
output = 'Done!' output = 'Done!'
else else

View File

@ -2,8 +2,8 @@ local me = {}
local utilities = require('utilities') local utilities = require('utilities')
function me:init() function me:init(config)
me.triggers = utilities.triggers(self.info.username):t('me', true).table me.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('me', true).table
end end
function me:action(msg, config) function me:action(msg, config)

View File

@ -3,13 +3,13 @@ local nick = {}
local utilities = require('utilities') local utilities = require('utilities')
nick.command = 'nick <nickname>' nick.command = 'nick <nickname>'
nick.doc = [[```
]]..utilities.CMD_PAT..[[nick <nickname>
Set your nickname. Use "]]..utilities.CMD_PAT..[[nick --" to delete it.
```]]
function nick:init() function nick:init(config)
nick.triggers = utilities.triggers(self.info.username):t('nick', true).table nick.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('nick', true).table
nick.doc = [[```
]]..config.cmd_pat..[[nick <nickname>
Set your nickname. Use "]]..config.cmd_pat..[[nick --" to delete it.
```]]
end end
function nick:action(msg, config) function nick:action(msg, config)

View File

@ -4,12 +4,12 @@ local ping = {}
local utilities = require('utilities') local utilities = require('utilities')
function ping:init() function ping:init(config)
ping.triggers = utilities.triggers(self.info.username):t('ping'):t('annyong').table ping.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('ping'):t('annyong').table
end end
function ping:action(msg) function ping:action(msg, config)
local output = msg.text_lower:match('^'..utilities.CMD_PAT..'ping') and 'Pong!' or 'Annyong.' local output = msg.text_lower:match('^'..config.cmd_pat..'ping') and 'Pong!' or 'Annyong.'
utilities.send_message(self, msg.chat.id, output) utilities.send_message(self, msg.chat.id, output)
end end

View File

@ -6,14 +6,14 @@ local bindings = require('bindings')
local utilities = require('utilities') local utilities = require('utilities')
pokedex.command = 'pokedex <query>' pokedex.command = 'pokedex <query>'
pokedex.doc = [[```
]]..utilities.CMD_PAT..[[pokedex <query>
Returns a Pokedex entry from pokeapi.co.
Alias: ]]..utilities.CMD_PAT..[[dex
```]]
function pokedex:init() function pokedex:init(config)
pokedex.triggers = utilities.triggers(self.info.username):t('pokedex', true):t('dex', true).table pokedex.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('pokedex', true):t('dex', true).table
pokedex.doc = [[```
]]..config.cmd_pat..[[pokedex <query>
Returns a Pokedex entry from pokeapi.co.
Alias: ]]..config.cmd_pat..[[dex
```]]
end end
function pokedex:action(msg, config) function pokedex:action(msg, config)

View File

@ -4,13 +4,13 @@ local HTTP = require('socket.http')
local utilities = require('utilities') local utilities = require('utilities')
preview.command = 'preview <link>' preview.command = 'preview <link>'
preview.doc = [[```
]]..utilities.CMD_PAT..[[preview <link> function preview:init(config)
preview.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('preview', true).table
preview.doc = [[```
]]..config.cmd_pat..[[preview <link>
Returns a full-message, "unlinked" preview. Returns a full-message, "unlinked" preview.
```]] ```]]
function preview:init()
preview.triggers = utilities.triggers(self.info.username):t('preview', true).table
end end
function preview:action(msg) function preview:action(msg)

View File

@ -5,8 +5,8 @@ local utilities = require('utilities')
pun.command = 'pun' pun.command = 'pun'
pun.doc = '`Returns a pun.`' pun.doc = '`Returns a pun.`'
function pun:init() function pun:init(config)
pun.triggers = utilities.triggers(self.info.username):t('pun').table pun.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('pun').table
end end
local puns = { local puns = {

View File

@ -25,24 +25,24 @@ local mapping = {
local help local help
function reactions:init() function reactions:init(config)
-- Generate a "help" message triggered by "/reactions". -- Generate a "help" message triggered by "/reactions".
help = 'Reactions:\n' help = 'Reactions:\n'
reactions.triggers = utilities.triggers(self.info.username):t('reactions').table reactions.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('reactions').table
for trigger,reaction in pairs(mapping) do for trigger,reaction in pairs(mapping) do
help = help .. '' .. utilities.CMD_PAT .. trigger:gsub('.%?', '') .. ': ' .. reaction .. '\n' help = help .. '' .. config.cmd_pat .. trigger:gsub('.%?', '') .. ': ' .. reaction .. '\n'
table.insert(reactions.triggers, utilities.CMD_PAT..trigger) table.insert(reactions.triggers, config.cmd_pat..trigger)
table.insert(reactions.triggers, utilities.CMD_PAT..trigger..'@'..self.info.username:lower()) table.insert(reactions.triggers, config.cmd_pat..trigger..'@'..self.info.username:lower())
end end
end end
function reactions:action(msg) function reactions:action(msg, config)
if string.match(msg.text_lower, utilities.CMD_PAT..'reactions') then if string.match(msg.text_lower, config.cmd_pat..'reactions') then
utilities.send_message(self, msg.chat.id, help) utilities.send_message(self, msg.chat.id, help)
return return
end end
for trigger,reaction in pairs(mapping) do for trigger,reaction in pairs(mapping) do
if string.match(msg.text_lower, utilities.CMD_PAT..trigger) then if string.match(msg.text_lower, config.cmd_pat..trigger) then
utilities.send_message(self, msg.chat.id, reaction) utilities.send_message(self, msg.chat.id, reaction)
return return
end end

View File

@ -6,14 +6,14 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
reddit.command = 'reddit [r/subreddit | query]' reddit.command = 'reddit [r/subreddit | query]'
reddit.doc = [[```
]]..utilities.CMD_PAT..[[reddit [r/subreddit | query]
Returns the top posts or results for a given subreddit or query. If no argument is given, returns the top posts from r/all. Querying specific subreddits is not supported.
Aliases: ]]..utilities.CMD_PAT..[[r, /r/subreddit
```]]
function reddit:init() function reddit:init(config)
reddit.triggers = utilities.triggers(self.info.username, {'^/r/'}):t('reddit', true):t('r', true):t('r/', true).table reddit.triggers = utilities.triggers(self.info.username, config.cmd_pat, {'^/r/'}):t('reddit', true):t('r', true):t('r/', true).table
reddit.doc = [[```
]]..config.cmd_pat..[[reddit [r/subreddit | query]
Returns the top posts or results for a given subreddit or query. If no argument is given, returns the top posts from r/all. Querying specific subreddits is not supported.
Aliases: ]]..config.cmd_pat..[[r, /r/subreddit
```]]
end end
local format_results = function(posts) local format_results = function(posts)
@ -48,7 +48,7 @@ function reddit:action(msg, config)
local text = msg.text_lower local text = msg.text_lower
if text:match('^/r/.') then if text:match('^/r/.') then
-- Normalize input so this hack works easily. -- Normalize input so this hack works easily.
text = msg.text_lower:gsub('^/r/', utilities.CMD_PAT..'r r/') text = msg.text_lower:gsub('^/r/', config.cmd_pat..'r r/')
end end
local input = utilities.input(text) local input = utilities.input(text)
local source, url local source, url

View File

@ -3,15 +3,15 @@ local remind = {}
local utilities = require('utilities') local utilities = require('utilities')
remind.command = 'remind <duration> <message>' remind.command = 'remind <duration> <message>'
remind.doc = [[```
]]..utilities.CMD_PAT..[[remind <duration> <message>
Repeats a message after a duration of time, in minutes.
```]]
function remind:init() function remind:init(config)
self.database.reminders = self.database.reminders or {} self.database.reminders = self.database.reminders or {}
remind.triggers = utilities.triggers(self.info.username):t('remind', true).table remind.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('remind', true).table
remind.doc = [[```
]]..config.cmd_pat..[[remind <duration> <message>
Repeats a message after a duration of time, in minutes.
```]]
end end
function remind:action(msg) function remind:action(msg)

View File

@ -2,26 +2,25 @@ local setandget = {}
local utilities = require('utilities') local utilities = require('utilities')
function setandget:init() function setandget:init(config)
self.database.setandget = self.database.setandget or {} self.database.setandget = self.database.setandget or {}
setandget.triggers = utilities.triggers(self.info.username):t('set', true):t('get', true).table setandget.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('set', true):t('get', true).table
setandget.doc = [[```
]]..config.cmd_pat..[[set <name> <value>
Stores a value with the given name. Use "]]..config.cmd_pat..[[set <name> --" to delete the stored value.
]]..config.cmd_pat..[[get [name]
Returns the stored value or a list of stored values.
```]]
end end
setandget.command = 'set <name> <value>' setandget.command = 'set <name> <value>'
setandget.doc = [[```
]]..utilities.CMD_PAT..[[set <name> <value>
Stores a value with the given name. Use "]]..utilities.CMD_PAT..[[set <name> --" to delete the stored value.
]]..utilities.CMD_PAT..[[get [name]
Returns the stored value or a list of stored values.
```]]
function setandget:action(msg, config)
function setandget:action(msg)
local input = utilities.input(msg.text) local input = utilities.input(msg.text)
self.database.setandget[msg.chat.id_str] = self.database.setandget[msg.chat.id_str] or {} self.database.setandget[msg.chat.id_str] = self.database.setandget[msg.chat.id_str] or {}
if msg.text_lower:match('^'..utilities.CMD_PAT..'set') then if msg.text_lower:match('^'..config.cmd_pat..'set') then
if not input then if not input then
utilities.send_message(self, msg.chat.id, setandget.doc, true, nil, true) utilities.send_message(self, msg.chat.id, setandget.doc, true, nil, true)
@ -41,7 +40,7 @@ function setandget:action(msg)
utilities.send_message(self, msg.chat.id, '"' .. name .. '" has been set to "' .. value .. '".', true) utilities.send_message(self, msg.chat.id, '"' .. name .. '" has been set to "' .. value .. '".', true)
end end
elseif msg.text_lower:match('^'..utilities.CMD_PAT..'get') then elseif msg.text_lower:match('^'..config.cmd_pat..'get') then
if not input then if not input then
local output local output

View File

@ -2,8 +2,8 @@ local shell = {}
local utilities = require('utilities') local utilities = require('utilities')
function shell:init() function shell:init(config)
shell.triggers = utilities.triggers(self.info.username):t('run', true).table shell.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('run', true).table
end end
function shell:action(msg, config) function shell:action(msg, config)

View File

@ -3,13 +3,13 @@ local shout = {}
local utilities = require('utilities') local utilities = require('utilities')
shout.command = 'shout <text>' shout.command = 'shout <text>'
shout.doc = [[```
]]..utilities.CMD_PAT..[[shout <text> function shout:init(config)
shout.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('shout', true).table
shout.doc = [[```
]]..config.CMD_PAT..[[shout <text>
Shouts something. Input may be the replied-to message. Shouts something. Input may be the replied-to message.
```]] ```]]
function shout:init()
shout.triggers = utilities.triggers(self.info.username):t('shout', true).table
end end
function shout:action(msg) function shout:action(msg)

View File

@ -3,13 +3,13 @@ local slap = {}
local utilities = require('utilities') local utilities = require('utilities')
slap.command = 'slap [target]' slap.command = 'slap [target]'
slap.doc = [[```
]]..utilities.CMD_PAT..[[slap [target] function slap:init(config)
slap.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('slap', true).table
slap.doc = [[```
]]..config.cmd_pat..[[slap [target]
Slap somebody. Slap somebody.
```]] ```]]
function slap:init()
slap.triggers = utilities.triggers(self.info.username):t('slap', true).table
end end
local slaps = { local slaps = {

View File

@ -5,13 +5,13 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
time.command = 'time <location>' time.command = 'time <location>'
time.doc = [[```
]]..utilities.CMD_PAT..[[time <location> function time:init(config)
time.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('time', true).table
time.doc = [[```
]]..config.cmd_pat..[[time <location>
Returns the time, date, and timezone for the given location. Returns the time, date, and timezone for the given location.
```]] ```]]
function time:init()
time.triggers = utilities.triggers(self.info.username):t('time', true).table
end end
function time:action(msg, config) function time:action(msg, config)

View File

@ -6,13 +6,13 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
translate.command = 'translate [text]' translate.command = 'translate [text]'
translate.doc = [[```
]]..utilities.CMD_PAT..[[translate [text] function translate:init(config)
translate.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('translate', true):t('tl', true).table
translate.doc = [[```
]]..config.cmd_pat..[[translate [text]
Translates input or the replied-to message into the bot's language. Translates input or the replied-to message into the bot's language.
```]] ```]]
function translate:init()
translate.triggers = utilities.triggers(self.info.username):t('translate', true):t('tl', true).table
end end
function translate:action(msg, config) function translate:action(msg, config)

View File

@ -6,14 +6,15 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
urbandictionary.command = 'urbandictionary <query>' urbandictionary.command = 'urbandictionary <query>'
urbandictionary.doc = [[```
]]..utilities.CMD_PAT..[[urbandictionary <query>
Returns a definition from Urban Dictionary.
Aliases: ]]..utilities.CMD_PAT..[[ud, ]]..utilities.CMD_PAT..[[urban
```]]
function urbandictionary:init() function urbandictionary:init(config)
urbandictionary.triggers = utilities.triggers(self.info.username):t('urbandictionary', true):t('ud', true):t('urban', true).table urbandictionary.triggers = utilities.triggers(self.info.username, config.cmd_pat)
:t('urbandictionary', true):t('ud', true):t('urban', true).table
urbandictionary.doc = [[```
]]..config.cmd_pat..[[urbandictionary <query>
Returns a definition from Urban Dictionary.
Aliases: ]]..config.cmd_pat..[[ud, ]]..config.cmd_pat..[[urban
```]]
end end
function urbandictionary:action(msg, config) function urbandictionary:action(msg, config)

View File

@ -11,14 +11,14 @@ function weather:init(config)
return return
end end
weather.triggers = utilities.triggers(self.info.username):t('weather', true).table weather.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('weather', true).table
weather.doc = [[```
]]..config.cmd_pat..[[weather <location>
Returns the current weather conditions for a given location.
```]]
end end
weather.command = 'weather <location>' weather.command = 'weather <location>'
weather.doc = [[```
]]..utilities.CMD_PAT..[[weather <location>
Returns the current weather conditions for a given location.
```]]
function weather:action(msg, config) function weather:action(msg, config)

View File

@ -3,13 +3,13 @@ local whoami = {}
local utilities = require('utilities') local utilities = require('utilities')
whoami.command = 'whoami' whoami.command = 'whoami'
whoami.doc = [[```
Returns user and chat info for you or the replied-to message.
Alias: ]]..utilities.CMD_PAT..[[who
```]]
function whoami:init() function whoami:init(config)
whoami.triggers = utilities.triggers(self.info.username):t('who', true):t('whoami').table whoami.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('who', true):t('whoami').table
whoami.doc = [[```
Returns user and chat info for you or the replied-to message.
Alias: ]]..config.cmd_pat..[[who
```]]
end end
function whoami:action(msg) function whoami:action(msg)

View File

@ -6,14 +6,14 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
wikipedia.command = 'wikipedia <query>' wikipedia.command = 'wikipedia <query>'
wikipedia.doc = [[```
]]..utilities.CMD_PAT..[[wikipedia <query>
Returns an article from Wikipedia.
Aliases: ]]..utilities.CMD_PAT..[[w, ]]..utilities.CMD_PAT..[[wiki
```]]
function wikipedia:init() function wikipedia:init(config)
wikipedia.triggers = utilities.triggers(self.info.username):t('wikipedia', true):t('wiki', true):t('w', true).table wikipedia.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('wikipedia', true):t('wiki', true):t('w', true).table
wikipedia.doc = [[```
]]..config.cmd_pat..[[wikipedia <query>
Returns an article from Wikipedia.
Aliases: ]]..config.cmd_pat..[[w, ]]..config.cmd_pat..[[wiki
```]]
end end
local get_title = function(search) local get_title = function(search)

View File

@ -5,13 +5,13 @@ local JSON = require('dkjson')
local utilities = require('utilities') local utilities = require('utilities')
xkcd.command = 'xkcd [i]' xkcd.command = 'xkcd [i]'
xkcd.doc = [[```
]]..utilities.CMD_PAT..[[xkcd [i] function xkcd:init(config)
xkcd.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('xkcd', true).table
xkcd.doc = [[```
]]..config.cmd_pat..[[xkcd [i]
Returns the latest xkcd strip and its alt text. If a number is given, returns that number strip. If "r" is passed in place of a number, returns a random strip. Returns the latest xkcd strip and its alt text. If a number is given, returns that number strip. If "r" is passed in place of a number, returns a random strip.
```]] ```]]
function xkcd:init()
xkcd.triggers = utilities.triggers(self.info.username):t('xkcd', true).table
end end
function xkcd:action(msg, config) function xkcd:action(msg, config)

View File

@ -14,15 +14,15 @@ function youtube:init(config)
return return
end end
youtube.triggers = utilities.triggers(self.info.username):t('youtube', true):t('yt', true).table youtube.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('youtube', true):t('yt', true).table
youtube.doc = [[```
]]..config.cmd_pat..[[youtube <query>
Returns the top result from YouTube.
Alias: ]]..config.cmd_pat..[[yt
```]]
end end
youtube.command = 'youtube <query>' youtube.command = 'youtube <query>'
youtube.doc = [[```
]]..utilities.CMD_PAT..[[youtube <query>
Returns the top result from YouTube.
Alias: ]]..utilities.CMD_PAT..[[yt
```]]
function youtube:action(msg, config) function youtube:action(msg, config)

View File

@ -281,24 +281,23 @@ end
utilities.md_escape = utilities.markdown_escape utilities.md_escape = utilities.markdown_escape
utilities.CMD_PAT = '/'
utilities.triggers_meta = {} utilities.triggers_meta = {}
utilities.triggers_meta.__index = utilities.triggers_meta utilities.triggers_meta.__index = utilities.triggers_meta
function utilities.triggers_meta:t(pattern, has_args) function utilities.triggers_meta:t(pattern, has_args)
local username = self.username:lower() local username = self.username:lower()
table.insert(self.table, '^'..utilities.CMD_PAT..pattern..'$') table.insert(self.table, '^'..self.cmd_pat..pattern..'$')
table.insert(self.table, '^'..utilities.CMD_PAT..pattern..'@'..username..'$') table.insert(self.table, '^'..self.cmd_pat..pattern..'@'..username..'$')
if has_args then if has_args then
table.insert(self.table, '^'..utilities.CMD_PAT..pattern..'%s+[^%s]*') table.insert(self.table, '^'..self.cmd_pat..pattern..'%s+[^%s]*')
table.insert(self.table, '^'..utilities.CMD_PAT..pattern..'@'..username..'%s+[^%s]*') table.insert(self.table, '^'..self.cmd_pat..pattern..'@'..username..'%s+[^%s]*')
end end
return self return self
end end
function utilities.triggers(username, trigger_table) function utilities.triggers(username, cmd_pat, trigger_table)
local self = setmetatable({}, utilities.triggers_meta) local self = setmetatable({}, utilities.triggers_meta)
self.username = username self.username = username
self.cmd_pat = cmd_pat
self.table = trigger_table or {} self.table = trigger_table or {}
return self return self
end end