Final fixes.
This commit is contained in:
parent
80930f389c
commit
1dc61d2c44
12
bindings.lua
12
bindings.lua
@ -75,7 +75,7 @@ function bindings:sendChatAction(chat_id, action)
|
|||||||
-- Support actions are typing, upload_photo, record_video, upload_video, record_audio, upload_audio, upload_document, find_location
|
-- Support actions are typing, upload_photo, record_video, upload_video, record_audio, upload_audio, upload_document, find_location
|
||||||
|
|
||||||
local url = self.BASE_URL .. '/sendChatAction?chat_id=' .. chat_id .. '&action=' .. action
|
local url = self.BASE_URL .. '/sendChatAction?chat_id=' .. chat_id .. '&action=' .. action
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ function bindings:sendLocation(chat_id, latitude, longitude, reply_to_message_id
|
|||||||
url = url .. '&disable_notification=true'
|
url = url .. '&disable_notification=true'
|
||||||
end
|
end
|
||||||
|
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -106,18 +106,18 @@ function bindings:forwardMessage(chat_id, from_chat_id, message_id, disable_noti
|
|||||||
url = url .. '&disable_notification=true'
|
url = url .. '&disable_notification=true'
|
||||||
end
|
end
|
||||||
|
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function bindings:kickChatMember(chat_id, user_id)
|
function bindings:kickChatMember(chat_id, user_id)
|
||||||
local url = self.BASE_URL .. '/kickChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id
|
local url = self.BASE_URL .. '/kickChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
end
|
end
|
||||||
|
|
||||||
function bindings:unbanChatMember(chat_id, user_id)
|
function bindings:unbanChatMember(chat_id, user_id)
|
||||||
local url = self.BASE_URL .. '/unbanChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id
|
local url = self.BASE_URL .. '/unbanChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- TODO: More of this.
|
-- TODO: More of this.
|
||||||
@ -138,7 +138,7 @@ function bindings:sendPhotoID(chat_id, file_id, caption, reply_to_message_id, di
|
|||||||
url = url .. '&disable_notification=true'
|
url = url .. '&disable_notification=true'
|
||||||
end
|
end
|
||||||
|
|
||||||
return bindings.sendRequest(self, url)
|
return bindings.sendRequest(url)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
40
bot.lua
40
bot.lua
@ -1,7 +1,5 @@
|
|||||||
local bot = {}
|
local bot = {}
|
||||||
|
|
||||||
local instance = {}
|
|
||||||
|
|
||||||
local bindings = require('bindings') -- Load Telegram bindings.
|
local bindings = require('bindings') -- Load Telegram bindings.
|
||||||
local utilities = require('utilities') -- Load miscellaneous and cross-plugin functions.
|
local utilities = require('utilities') -- Load miscellaneous and cross-plugin functions.
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ function bot:init() -- The function run when the bot is started or reloaded.
|
|||||||
|
|
||||||
self.plugins = {} -- Load plugins.
|
self.plugins = {} -- Load plugins.
|
||||||
for _,v in ipairs(self.config.plugins) do
|
for _,v in ipairs(self.config.plugins) do
|
||||||
local p = require('plugins/'..v)
|
local p = require('plugins.'..v)
|
||||||
table.insert(self.plugins, p)
|
table.insert(self.plugins, p)
|
||||||
if p.init then p.init(self) end
|
if p.init then p.init(self) end
|
||||||
end
|
end
|
||||||
@ -77,7 +75,7 @@ function bot:on_msg_receive(msg) -- The fn run whenever a message is received.
|
|||||||
end)
|
end)
|
||||||
if not success then
|
if not success then
|
||||||
bindings.sendReply(self, msg, 'Sorry, an unexpected error occurred.')
|
bindings.sendReply(self, msg, 'Sorry, an unexpected error occurred.')
|
||||||
bindings.handle_exception(self, result, msg.from.id .. ': ' .. msg.text)
|
utilities.handle_exception(self, result, msg.from.id .. ': ' .. msg.text)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
-- If the action returns a table, make that table msg.
|
-- If the action returns a table, make that table msg.
|
||||||
@ -93,37 +91,41 @@ function bot:on_msg_receive(msg) -- The fn run whenever a message is received.
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
bot.init(instance) -- Actually start the script. Run the bot_init function.
|
function bot:run()
|
||||||
|
bot.init(self) -- Actually start the script. Run the bot_init function.
|
||||||
|
|
||||||
while instance.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.
|
||||||
|
|
||||||
do
|
do
|
||||||
local res = bindings.getUpdates(instance, instance.last_update+1) -- Get the latest updates!
|
local res = bindings.getUpdates(self, self.last_update+1) -- Get the latest updates!
|
||||||
if res then
|
if res then
|
||||||
for _,v in ipairs(res.result) do -- Go through every new message.
|
for _,v in ipairs(res.result) do -- Go through every new message.
|
||||||
instance.last_update = v.update_id
|
self.last_update = v.update_id
|
||||||
bot.on_msg_receive(instance, v.message)
|
bot.on_msg_receive(self, v.message)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print(instance.config.errors.connection)
|
print(self.config.errors.connection)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if instance.last_cron ~= os.date('%M') then -- Run cron jobs every minute.
|
if self.last_cron ~= os.date('%M') then -- Run cron jobs every minute.
|
||||||
instance.last_cron = os.date('%M')
|
self.last_cron = os.date('%M')
|
||||||
utilities.save_data(instance.info.username..'.db', instance.database) -- Save the database.
|
utilities.save_data(self.info.username..'.db', self.database) -- Save the database.
|
||||||
for i,v in ipairs(instance.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 res, err = pcall(function() v.cron(instance) end)
|
local res, err = pcall(function() v.cron(self) end)
|
||||||
if not res then
|
if not res then
|
||||||
utilities.handle_exception(instance, err, 'CRON: ' .. i)
|
utilities.handle_exception(self, err, 'CRON: ' .. i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Save the database before exiting.
|
-- Save the database before exiting.
|
||||||
utilities.save_data(instance.info.username..'.db', instance.database)
|
utilities.save_data(self.info.username..'.db', self.database)
|
||||||
print('Halted.')
|
print('Halted.')
|
||||||
|
end
|
||||||
|
|
||||||
|
return bot
|
||||||
|
58
config.lua
58
config.lua
@ -4,8 +4,6 @@ return {
|
|||||||
bot_api_key = '',
|
bot_api_key = '',
|
||||||
-- Your Telegram ID.
|
-- Your Telegram ID.
|
||||||
admin = 00000000,
|
admin = 00000000,
|
||||||
-- Differences, in seconds, between your time and UTC.
|
|
||||||
time_offset = 0,
|
|
||||||
-- Two-letter language code.
|
-- Two-letter language code.
|
||||||
lang = 'en',
|
lang = 'en',
|
||||||
-- The channel, group, or user to send error reports to.
|
-- The channel, group, or user to send error reports to.
|
||||||
@ -51,35 +49,35 @@ Send /help to get started.
|
|||||||
},
|
},
|
||||||
|
|
||||||
plugins = { -- To enable a plugin, add its name to the list.
|
plugins = { -- To enable a plugin, add its name to the list.
|
||||||
'control.lua',
|
'control',
|
||||||
'blacklist.lua',
|
'blacklist',
|
||||||
'about.lua',
|
'about',
|
||||||
'ping.lua',
|
'ping',
|
||||||
'whoami.lua',
|
'whoami',
|
||||||
'nick.lua',
|
'nick',
|
||||||
'echo.lua',
|
'echo',
|
||||||
'gSearch.lua',
|
'gSearch',
|
||||||
'gMaps.lua',
|
'gMaps',
|
||||||
'wikipedia.lua',
|
'wikipedia',
|
||||||
'hackernews.lua',
|
'hackernews',
|
||||||
'imdb.lua',
|
'imdb',
|
||||||
'calc.lua',
|
'calc',
|
||||||
'urbandictionary.lua',
|
'urbandictionary',
|
||||||
'time.lua',
|
'time',
|
||||||
'eightball.lua',
|
'eightball',
|
||||||
'dice.lua',
|
'dice',
|
||||||
'reddit.lua',
|
'reddit',
|
||||||
'xkcd.lua',
|
'xkcd',
|
||||||
'slap.lua',
|
'slap',
|
||||||
'commit.lua',
|
'commit',
|
||||||
'pun.lua',
|
'pun',
|
||||||
'currency.lua',
|
'currency',
|
||||||
'cats.lua',
|
'cats',
|
||||||
'shout.lua',
|
'shout',
|
||||||
'patterns.lua',
|
'patterns',
|
||||||
-- Put new plugins above this line.
|
-- Put new plugins above this line.
|
||||||
'help.lua',
|
'help',
|
||||||
'greetings.lua'
|
'greetings'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
lua bot.lua
|
lua main.lua
|
||||||
echo 'otouto has stopped. ^C to exit.'
|
echo 'otouto has stopped. ^C to exit.'
|
||||||
sleep 5s
|
sleep 5s
|
||||||
done
|
done
|
||||||
|
5
main.lua
Normal file
5
main.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
local bot = require('bot')
|
||||||
|
|
||||||
|
local instance = {}
|
||||||
|
|
||||||
|
return bot.run(instance)
|
@ -324,7 +324,7 @@ function administration.init_command(self_)
|
|||||||
if self.admin_temp.flood[msg.chat.id_str][msg.from.id_str] > 99 then
|
if self.admin_temp.flood[msg.chat.id_str][msg.from.id_str] > 99 then
|
||||||
drua.kick_user(msg.chat.id, msg.from.id)
|
drua.kick_user(msg.chat.id, msg.from.id)
|
||||||
local output = administration.flags[5].kicked:gsub('GROUPNAME', msg.chat.title)
|
local output = administration.flags[5].kicked:gsub('GROUPNAME', msg.chat.title)
|
||||||
bindings.sendMessage(msg.from.id, output)
|
bindings.sendMessage(self, msg.from.id, output)
|
||||||
self.admin_temp.flood[msg.chat.id_str][msg.from.id_str] = nil
|
self.admin_temp.flood[msg.chat.id_str][msg.from.id_str] = nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -372,7 +372,7 @@ function administration.init_command(self_)
|
|||||||
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(msg.chat.id)
|
administration.update_desc(self, msg.chat.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
@ -799,7 +799,7 @@ function administration.init_command(self_)
|
|||||||
local status = group.flags[i] or false
|
local status = group.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
|
||||||
bindings.sendMessage(msg.chat.id, output, true, nil, true)
|
bindings.sendMessage(self, msg.chat.id, output, true, nil, true)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if group.flags[input] == true then
|
if group.flags[input] == true then
|
||||||
@ -987,7 +987,7 @@ function administration.init_command(self_)
|
|||||||
|
|
||||||
action = function(self, msg)
|
action = function(self, msg)
|
||||||
if self.database.administration.groups[msg.chat.id_str] then
|
if self.database.administration.groups[msg.chat.id_str] then
|
||||||
bindings.sendReply(msg, 'I am already administrating this group.')
|
bindings.sendReply(self, msg, 'I am already administrating this group.')
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
self.database.administration.groups[msg.chat.id_str] = {
|
self.database.administration.groups[msg.chat.id_str] = {
|
||||||
|
@ -10,7 +10,7 @@ Repeats a string of text.
|
|||||||
```]]
|
```]]
|
||||||
|
|
||||||
function echo:init()
|
function echo:init()
|
||||||
echo.triggers = utilities.triggers(self.info.username):t('echo').table
|
echo.triggers = utilities.triggers(self.info.username):t('echo', true).table
|
||||||
end
|
end
|
||||||
|
|
||||||
function echo:action(msg)
|
function echo:action(msg)
|
||||||
|
@ -6,24 +6,27 @@ local help = {}
|
|||||||
local bindings = require('bindings')
|
local bindings = require('bindings')
|
||||||
local utilities = require('utilities')
|
local utilities = require('utilities')
|
||||||
|
|
||||||
local help_text = '*Available commands:*'
|
local help_text
|
||||||
|
|
||||||
function help:init()
|
function help:init()
|
||||||
|
help_text = '*Available commands:*'
|
||||||
|
|
||||||
for _,plugin in ipairs(self.plugins) do
|
for _,plugin in ipairs(self.plugins) do
|
||||||
if plugin.command then
|
if plugin.command then
|
||||||
help_text = help_text .. '\n• /' .. plugin.command:gsub('%[', '\\[')
|
help_text = help_text .. '\n• /' .. plugin.command:gsub('%[', '\\[')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
help.triggers = utilities.triggers(self.info.username):t('help', true):t('h', true).table
|
help_text = help_text .. [[
|
||||||
end
|
|
||||||
|
|
||||||
help_text = help_text .. [[
|
|
||||||
|
|
||||||
• /help <command>
|
• /help <command>
|
||||||
Arguments: <required> \[optional]
|
Arguments: <required> \[optional]
|
||||||
]]
|
]]
|
||||||
|
|
||||||
|
help.triggers = utilities.triggers(self.info.username):t('help', true):t('h', true).table
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
function help:action(msg)
|
function help:action(msg)
|
||||||
|
|
||||||
local input = utilities.input(msg.text_lower)
|
local input = utilities.input(msg.text_lower)
|
||||||
|
@ -19,7 +19,7 @@ function luarun:action(msg)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local output = loadstring(input)()
|
local output = loadstring('local utilities = require(\'utilities\'); return function (instance) '..input..' end')()(self)
|
||||||
if output == nil then
|
if output == nil then
|
||||||
output = 'Done!'
|
output = 'Done!'
|
||||||
elseif type(output) == 'table' then
|
elseif type(output) == 'table' then
|
||||||
|
@ -268,12 +268,12 @@ function moderation:init()
|
|||||||
moderation.triggers = {}
|
moderation.triggers = {}
|
||||||
for trigger,_ in pairs(commands) do
|
for trigger,_ in pairs(commands) do
|
||||||
if trigger[-1] == '$' then
|
if trigger[-1] == '$' then
|
||||||
moderation.triggers:insert(trigger:sub(1, -2)..'@'..self.info.username..'$')
|
tables.insert(moderation.triggers, trigger:sub(1, -2)..'@'..self.info.username..'$')
|
||||||
else
|
else
|
||||||
moderation.triggers:insert(trigger..'%s+[^%s]*')
|
tables.insert(moderation.triggers, trigger..'%s+[^%s]*')
|
||||||
moderation.triggers:insert(trigger..'@'..self.info.username..'%s+[^%s]*')
|
tables.insert(moderation.triggers, trigger..'@'..self.info.username..'%s+[^%s]*')
|
||||||
moderation.triggers:insert(trigger..'$')
|
tables.insert(moderation.triggers, trigger..'$')
|
||||||
moderation.triggers:insert(trigger..'@'..self.info.username..'$')
|
tables.insert(moderation.triggers, trigger..'@'..self.info.username..'$')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -10,7 +10,7 @@ Set your nickname. Use "/nick --" to delete it.
|
|||||||
```]]
|
```]]
|
||||||
|
|
||||||
function nick:init()
|
function nick:init()
|
||||||
nick.triggers = utilities.triggers(self.info.nick):t('nick', true).table
|
nick.triggers = utilities.triggers(self.info.username):t('nick', true).table
|
||||||
end
|
end
|
||||||
|
|
||||||
function nick:action(msg)
|
function nick:action(msg)
|
||||||
|
@ -28,8 +28,8 @@ function reactions:init()
|
|||||||
reactions.triggers = utilities.triggers(self.info.username):t('reactions').table
|
reactions.triggers = utilities.triggers(self.info.username):t('reactions').table
|
||||||
for trigger,reaction in pairs(mapping) do
|
for trigger,reaction in pairs(mapping) do
|
||||||
help = help .. '• ' .. trigger:gsub('.%?', '') .. ': ' .. reaction .. '\n'
|
help = help .. '• ' .. trigger:gsub('.%?', '') .. ': ' .. reaction .. '\n'
|
||||||
reactions.triggers:insert(utilities.INVOCATION_PATTERN..trigger)
|
table.insert(reactions.triggers, utilities.INVOCATION_PATTERN..trigger)
|
||||||
reactions.triggers:insert(utilities.INVOCATION_PATTERN..trigger..'@'..self.username)
|
table.insert(reactions.triggers, utilities.INVOCATION_PATTERN..trigger..'@'..self.username)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ local bindings = require('bindings')
|
|||||||
local utilities = require('utilities')
|
local utilities = require('utilities')
|
||||||
|
|
||||||
function shell:init()
|
function shell:init()
|
||||||
shell.triggers = utilities.bindings(self.info.username):t('run', true).table
|
shell.triggers = utilities.triggers(self.info.username):t('run', true).table
|
||||||
end
|
end
|
||||||
|
|
||||||
function shell:action(msg)
|
function shell:action(msg)
|
||||||
|
@ -43,7 +43,9 @@ function time:action(msg)
|
|||||||
|
|
||||||
local jdat = JSON.decode(jstr)
|
local jdat = JSON.decode(jstr)
|
||||||
|
|
||||||
local timestamp = os.time() + jdat.rawOffset + jdat.dstOffset + self.config.time_offset
|
local now = os.time()
|
||||||
|
local time_offset = os.difftime(now, os.time(os.date("!*t", now)))
|
||||||
|
local timestamp = now + jdat.rawOffset + jdat.dstOffset + time_offset
|
||||||
local utcoff = (jdat.rawOffset + jdat.dstOffset) / 3600
|
local utcoff = (jdat.rawOffset + jdat.dstOffset) / 3600
|
||||||
if utcoff == math.abs(utcoff) then
|
if utcoff == math.abs(utcoff) then
|
||||||
utcoff = '+' .. utcoff
|
utcoff = '+' .. utcoff
|
||||||
|
@ -17,7 +17,7 @@ function whoami:action(msg)
|
|||||||
|
|
||||||
if msg.reply_to_message then
|
if msg.reply_to_message then
|
||||||
msg = msg.reply_to_message
|
msg = msg.reply_to_message
|
||||||
msg.from.name = utilities.build_name(self, msg.from.first_name, msg.from.last_name)
|
msg.from.name = utilities.build_name(msg.from.first_name, msg.from.last_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
local chat_id = math.abs(msg.chat.id)
|
local chat_id = math.abs(msg.chat.id)
|
||||||
|
@ -276,19 +276,20 @@ end
|
|||||||
|
|
||||||
utilities.INVOCATION_PATTERN = '/'
|
utilities.INVOCATION_PATTERN = '/'
|
||||||
|
|
||||||
utilities.triggers_metatable = {}
|
utilities.triggers_meta = {}
|
||||||
function utilities.triggers_metatable:t(pattern, has_args)
|
utilities.triggers_meta.__index = utilities.triggers_meta
|
||||||
self.table:insert('^'..utilities.INVOCATION_PATTERN..pattern..'$')
|
function utilities.triggers_meta:t(pattern, has_args)
|
||||||
self.table:insert('^'..utilities.INVOCATION_PATTERN..pattern..'@'..self.username..'$')
|
table.insert(self.table, '^'..utilities.INVOCATION_PATTERN..pattern..'$')
|
||||||
|
table.insert(self.table, '^'..utilities.INVOCATION_PATTERN..pattern..'@'..self.username..'$')
|
||||||
if has_args then
|
if has_args then
|
||||||
self.table:insert('^'..utilities.INVOCATION_PATTERN..pattern..'%s+[^%s]*')
|
table.insert(self.table, '^'..utilities.INVOCATION_PATTERN..pattern..'%s+[^%s]*')
|
||||||
self.table:insert('^'..utilities.INVOCATION_PATTERN..pattern..'@'..self.username..'%s+[^%s]*')
|
table.insert(self.table, '^'..utilities.INVOCATION_PATTERN..pattern..'@'..self.username..'%s+[^%s]*')
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function utilities.triggers(username, trigger_table)
|
function utilities.triggers(username, trigger_table)
|
||||||
local self = setmetatable({}, utilities.triggers_metatable)
|
local self = setmetatable({}, utilities.triggers_meta)
|
||||||
self.username = username
|
self.username = username
|
||||||
self.table = trigger_table or {}
|
self.table = trigger_table or {}
|
||||||
return self
|
return self
|
||||||
@ -331,3 +332,5 @@ function utilities.enrich_message(msg)
|
|||||||
end
|
end
|
||||||
return msg
|
return msg
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return utilities
|
||||||
|
Reference in New Issue
Block a user