diff --git a/README.md b/README.md index 1add588..9958d3f 100644 --- a/README.md +++ b/README.md @@ -184,4 +184,4 @@ Das ist die Datenbank-Struktur: `database.userdata` speichert Daten von verschiedenen Plugins, hierzu wird aber für Brawlbot-Plugins Redis verwendet. -`database.version` speichert die Bot-Version. \ No newline at end of file +`database.version` speichert die Bot-Version \ No newline at end of file diff --git a/launch.sh b/launch.sh index 6f6f5f2..2e115aa 100755 --- a/launch.sh +++ b/launch.sh @@ -1,5 +1,6 @@ #!/bin/sh - +# Launch Brawlbot +# Restart Brawlbot five seconds after halted. while true; do lua main.lua echo 'otouto has stopped. ^C to exit.' diff --git a/otouto/bot.lua b/otouto/bot.lua index 2b16481..a512d9c 100644 --- a/otouto/bot.lua +++ b/otouto/bot.lua @@ -23,6 +23,7 @@ local bot = {} bot.version = '2.2.7' function bot:init(config) -- The function run when the bot is started or reloaded. + assert(config.bot_api_key, 'Dein Bot-Token ist nicht in der Config gesetzt!') bindings = require('otouto.bindings').init(config.bot_api_key) utilities = require('otouto.utilities') cred_data = load_cred() diff --git a/otouto/plugins/luarun.lua b/otouto/plugins/luarun.lua index e6c40ca..2184bb4 100644 --- a/otouto/plugins/luarun.lua +++ b/otouto/plugins/luarun.lua @@ -1,58 +1,72 @@ local luarun = {} +local utilities = require('otouto.utilities') +local URL = require('socket.url') +local JSON, serpent + function luarun:init(config) - luarun.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lua', true):t('return', true).table - if config.luarun_serpent then - serpent = require('serpent') - luarun.serialize = function(t) - return serpent.block(t, {comment=false}) - end - else - JSON = require('dkjson') - luarun.serialize = function(t) - return JSON.encode(t, {indent=true}) - end - end + luarun.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lua', true):t('return', true).table + if config.luarun_serpent then + serpent = require('serpent') + luarun.serialize = function(t) + return serpent.block(t, {comment=false}) + end + else + JSON = require('dkjson') + luarun.serialize = function(t) + return JSON.encode(t, {indent=true}) + end + end end function luarun:action(msg, config) - if not is_sudo(msg, config) then - return true - end + if msg.from.id ~= config.admin then + return true + end - local input = utilities.input(msg.text) - if not input then - utilities.send_reply(msg, 'Bitte gebe einen Befehl ein.') - return - end + local input = utilities.input(msg.text) + if not input then + utilities.send_reply(msg, 'Bitte tätige eine Eingabe.') + return + end - if msg.text_lower:match('^'..config.cmd_pat..'return') then - input = 'return ' .. input - end + if msg.text_lower:match('^'..config.cmd_pat..'return') then + input = 'return ' .. input + end - local output = loadstring( [[ - local bot = require('otouto.bot') - local bindings = require('otouto.bindings') - local utilities = require('otouto.utilities') - local json = require('dkjson') - local URL = require('socket.url') - local http = require('socket.http') - local https = require('ssl.https') - return function (msg, config) ]] .. input .. [[ end - ]] )()(msg, config) - if output == nil then - output = 'Ausgeführt!' - else - if type(output) == 'table' then - local s = luarun.serialize(output) - if URL.escape(s):len() < 4000 then - output = s - end - end - output = '```\n' .. tostring(output) .. '\n```' - end - utilities.send_message(msg.chat.id, output, true, msg.message_id, true) + local output, success = + load("local bot = require('otouto.bot')\n\z + local bindings = require('otouto.bindings')\n\z + local utilities = require('otouto.utilities')\n\z + local json = require('dkjson')\n\z + local URL = require('socket.url')\n\z + local http = require('socket.http')\n\z + local https = require('ssl.https')\n\z + return function (self, msg, config)\n" .. input .. "\nend") + + local function err_msg(x) + return "Fehler:\n" .. tostring(x) + end + + if output == nil then + output = success + else + success, output = xpcall(output(), err_msg, self, msg, config) + end + + if output == nil then + output = 'Fertig!' + else + if type(output) == 'table' then + local s = luarun.serialize(output) + if URL.escape(s):len() < 4000 then + output = s + end + end + output = '' .. utilities.html_escape(tostring(output)) .. '' + end + utilities.send_message(msg.chat.id, output, true, msg.message_id, 'html') end