From 8c97cf463733527f3f26e1ff249e9cb7c66963ab Mon Sep 17 00:00:00 2001 From: Andreas Bielawski Date: Sun, 7 Aug 2016 20:45:51 +0200 Subject: [PATCH] =?UTF-8?q?-=20Code-Optimierung=20-=20Tabellen=20als=20R?= =?UTF-8?q?=C3=BCckgabewerte=20von=20Plugins=20werden=20nicht=20mehr=20unt?= =?UTF-8?q?erst=C3=BCtzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- otouto/bot.lua | 71 ++++++++++++----------------------- otouto/plugins/gImages.lua | 2 +- otouto/plugins/help.lua | 4 +- otouto/plugins/id.lua | 4 +- otouto/plugins/post_photo.lua | 3 +- otouto/plugins/twitter.lua | 6 +-- otouto/plugins/wikipedia.lua | 3 +- otouto/utilities.lua | 3 +- 9 files changed, 37 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 2c652c5..941d642 100644 --- a/README.md +++ b/README.md @@ -92,14 +92,12 @@ Ein Plugin kann zehn Komponenten haben, aber nur zwei werden benötigt: | `plugin.command` | Einfaches Kommando mit Syntax. Wird bei `/hilfe` gelistet | N | | `plugin.doc` | Plugin-Hilfe. Wird mit `/help $kommando` gelistet | N | | `plugin.error` | Plugin-spezifische Fehlermeldung | N | -| `plugin:callback` | Aktion, die ausgeführt wird, nachdem auf einen Callback-Button gedrückt wird. Siehe `gImages.lua` für ein Beispiel. Argumente: `callback` (enthält Callback-Daten), `msg`, `self`, `config`, `input` (enthält Parameter ohne `callback` | N | +| `plugin:callback` | Aktion, die ausgeführt wird, nachdem auf einen Callback-Button gedrückt wird. Siehe `gImages.lua` für ein Beispiel. Argumente: `callback` (enthält Callback-Daten), `msg`, `self`, `config`, `input` (enthält Parameter ohne `callback`) | N | | `plugin:inline_callback` | Aktion, die ausgeführt wird, wenn der Bot per Inline-Query ausgelöst wird. Argumente sind `inline_query` für die Daten, `config` und `matches` | N | Die`bot:on_msg_receive` Funktion fügt einige nützte Variablen zur ` msg` Tabelle hinzu. Diese sind:`msg.from.id_str`, `msg.to.id_str`, `msg.chat.id_str`, `msg.text_lower`, `msg.from.name`. -Rückgabewerte für `plugin:action` sind optional, aber wenn eine Tabelle zurückgegeben wird, wird diese die neue `msg`,-Tabelle und `on_msg_receive` wird damit fortfahren. - Interaktionen mit der Bot-API sind sehr einfach. Siehe [Bindings](#bindings) für Details. Einige Funktionen, die oft benötigt werden, sind in `utilites.lua` verfügbar. diff --git a/otouto/bot.lua b/otouto/bot.lua index 8d53820..8a69333 100644 --- a/otouto/bot.lua +++ b/otouto/bot.lua @@ -26,22 +26,12 @@ function bot:init(config) -- The function run when the bot is started or reloade self.database = utilities.load_data(self.info.username..'.db') end - -- Table to cache user info (usernames, IDs, etc). - self.database.users = self.database.users or {} - -- Table to store userdata (nicknames, lastfm usernames, etc). - self.database.userdata = self.database.userdata or {} - -- Save the bot's version in the database to make migration simpler. - self.database.version = bot.version - -- Add updated bot info to the user info cache. - self.database.users = self.database.users or {} -- Table to cache userdata. - self.database.users[tostring(self.info.id)] = self.info - self.plugins = {} -- Load plugins. enabled_plugins = load_plugins() for k,v in pairs(enabled_plugins) do local p = require('otouto.plugins.'..v) -- print('loading plugin',v) - table.insert(self.plugins, p) + self.plugins[k] = p self.plugins[k].name = v if p.init then p.init(self, config) end end @@ -62,18 +52,6 @@ function bot:on_msg_receive(msg, config) -- The fn run whenever a message is rec if msg.date < os.time() - 5 then return end -- Do not process old messages. - -- Cache user info for those involved. - self.database.users[tostring(msg.from.id)] = msg.from - if msg.reply_to_message then - self.database.users[tostring(msg.reply_to_message.from.id)] = msg.reply_to_message.from - elseif msg.forward_from then - self.database.users[tostring(msg.forward_from.id)] = msg.forward_from - elseif msg.new_chat_member then - self.database.users[tostring(msg.new_chat_member.id)] = msg.new_chat_member - elseif msg.left_chat_member then - self.database.users[tostring(msg.left_chat_member.id)] = msg.left_chat_member - end - msg = utilities.enrich_message(msg) if msg.reply_to_message then @@ -97,9 +75,10 @@ function bot:on_msg_receive(msg, config) -- The fn run whenever a message is rec msg = service_modify_msg(msg) end - for _, plugin in ipairs(self.plugins) do - match_plugins(self, msg, config, plugin) - end + for n=1, #self.plugins do + local plugin = self.plugins[n] + match_plugins(self, msg, config, plugin) + end end function bot:on_callback_receive(callback, msg, config) -- whenever a new callback is received @@ -123,7 +102,8 @@ function bot:on_callback_receive(callback, msg, config) -- whenever a new callba msg = utilities.enrich_message(msg) - for _, plugin in ipairs(self.plugins) do + for n=1, #self.plugins do + local plugin = self.plugins[n] if plugin.name == called_plugin then if is_plugin_disabled_on_chat(plugin.name, msg) then return end plugin:callback(callback, msg, self, config, param) @@ -144,7 +124,9 @@ function bot:process_inline_query(inline_query, config) -- When an inline query if inline_query.query:match('"') then inline_query.query = inline_query.query:gsub('"', '\\"') end - for _, plugin in ipairs(self.plugins) do + + for n=1, #self.plugins do + local plugin = self.plugins[n] match_inline_plugins(self, inline_query, config, plugin) end end @@ -155,7 +137,8 @@ function bot:run(config) while self.is_started do -- Start a loop while the bot should be running. local res = bindings.getUpdates(self, { timeout=20, offset = self.last_update+1 } ) if res then - for _,v in ipairs(res.result) do -- Go through every new message. + for n=1, #res.result do -- Go through every new message. + local v = res.result[n] self.last_update = v.update_id if v.inline_query then bot.process_inline_query(self, v.inline_query, config) @@ -172,7 +155,8 @@ function bot:run(config) if self.last_cron ~= os.date('%M') then -- Run cron jobs every minute. self.last_cron = os.date('%M') utilities.save_data(self.info.username..'.db', self.database) -- Save the database. - for i,v in ipairs(self.plugins) do + for n=1, #self.plugins do + local v = self.plugins[n] if v.cron then -- Call each plugin's cron function, if it has one. local result, err = pcall(function() v.cron(self, config) end) if not result then @@ -194,7 +178,8 @@ end -- Apply plugin.pre_process function function pre_process_msg(self, msg, config) - for _,plugin in ipairs(self.plugins) do + for n=1, #self.plugins do + local plugin = self.plugins[n] if plugin.pre_process and msg then -- print('Preprocess '..plugin.name) -- remove comment to restore old behaviour new_msg = plugin:pre_process(msg, self, config) @@ -204,7 +189,9 @@ function pre_process_msg(self, msg, config) end function match_inline_plugins(self, inline_query, config, plugin) - for _, trigger in ipairs(plugin.inline_triggers or {}) do + local match_table = plugin.inline_triggers or {} + for n=1, #match_table do + local trigger = plugin.inline_triggers[n] if string.match(string.lower(inline_query.query), trigger) then local success, result = pcall(function() for k, pattern in pairs(plugin.inline_triggers) do @@ -224,18 +211,16 @@ function match_inline_plugins(self, inline_query, config, plugin) end function match_plugins(self, msg, config, plugin) - for _, trigger in ipairs(plugin.triggers or {}) do + local match_table = plugin.triggers or {} + for n=1, #match_table do + local trigger = plugin.triggers[n] if string.match(msg.text_lower, trigger) then -- Check if Plugin is disabled if is_plugin_disabled_on_chat(plugin.name, msg) then return end local success, result = pcall(function() -- trying to port matches to otouto - for k, pattern in pairs(plugin.triggers) do - matches = match_pattern(pattern, msg.text) - if matches then - break; - end - end + local pattern = plugin.triggers[n] + local matches = match_pattern(pattern, msg.text) print(plugin.name..' triggered') return plugin.action(self, msg, config, matches) end) @@ -251,14 +236,6 @@ function match_plugins(self, msg, config, plugin) utilities.handle_exception(self, result, msg.from.id .. ': ' .. msg.text, config) return end - - -- If the action returns a table, make that table the new msg. - if type(result) == 'table' then - msg = result - -- If the action returns true, continue. - elseif result ~= true then - return - end end end end diff --git a/otouto/plugins/gImages.lua b/otouto/plugins/gImages.lua index 9eaa939..2e956ad 100644 --- a/otouto/plugins/gImages.lua +++ b/otouto/plugins/gImages.lua @@ -128,7 +128,7 @@ end function gImages:cache_result(results, text) local cache = {} for v in pairs(results) do - table.insert(cache, results[v].link) + cache[v] = results[v].link end for n, link in pairs(cache) do redis:hset('telegram:cache:gImages:'..link, 'mime', results[n].mime) diff --git a/otouto/plugins/help.lua b/otouto/plugins/help.lua index 7ded719..034a13e 100644 --- a/otouto/plugins/help.lua +++ b/otouto/plugins/help.lua @@ -51,11 +51,11 @@ function help:action(msg, config, matches) local help_text = '*Verfügbare Befehle:*\n• '..config.cmd_pat for _,plugin in ipairs(self.plugins) do if plugin.command then - table.insert(commandlist, plugin.command) + commandlist[#commandlist+1] = plugin.command end end - table.insert(commandlist, 'hilfe [Befehl]') + commandlist[#commandlist+1] = 'hilfe [Befehl]' table.sort(commandlist) local help_text = help_text .. table.concat(commandlist, '\n• '..config.cmd_pat) .. '\nParameter: [optional]' local help_text = help_text:gsub('%[', '\\[') diff --git a/otouto/plugins/id.lua b/otouto/plugins/id.lua index 29726cb..3baed62 100644 --- a/otouto/plugins/id.lua +++ b/otouto/plugins/id.lua @@ -89,7 +89,7 @@ function id:action(msg) for i = 1, #users do local user_id = users[i] local user_info = id:get_user(user_id, chat_id) - table.insert(users_info, user_info) + users_info[#users_info+1] = user_info end -- get all administrators and the creator @@ -97,7 +97,7 @@ function id:action(msg) local admins = {} for num in pairs(administrators.result) do if administrators.result[num].status ~= 'creator' then - table.insert(admins, tostring(administrators.result[num].user.id)) + admins[#admins+1] = tostring(administrators.result[num].user.id) else creator_id = administrators.result[num].user.id end diff --git a/otouto/plugins/post_photo.lua b/otouto/plugins/post_photo.lua index bf39102..4eb01b4 100644 --- a/otouto/plugins/post_photo.lua +++ b/otouto/plugins/post_photo.lua @@ -10,7 +10,8 @@ post_photo.triggers = { function post_photo:pre_process(msg, self, config) if not msg.document then return msg end -- Ignore local mime_type = msg.document.mime_type - if mime_type ~= 'image/jpeg' and mime_type ~= 'image/png' and mime_type ~= 'image/bmp' then return msg end + local valid_mimetypes = {['image/jpeg'] = true, ['image/png'] = true, ['image/bmp'] = true} + if not valid_mimetypes[mime_type] then return msg end local file_id = msg.document.file_id local file_size = msg.document.file_size diff --git a/otouto/plugins/twitter.lua b/otouto/plugins/twitter.lua index 529b20c..cef8190 100644 --- a/otouto/plugins/twitter.lua +++ b/otouto/plugins/twitter.lua @@ -104,14 +104,14 @@ function twitter:action(msg, config, matches) if v.video_info then if not v.video_info.variants[3] then local vid = v.video_info.variants[1].url - table.insert(videos, vid) + videos[#videos+1] = vid else local vid = v.video_info.variants[3].url - table.insert(videos, vid) + videos[#videos+1] = vid end end text = text:gsub(url, "") - table.insert(images, pic) + images[#images+1] = pic end end diff --git a/otouto/plugins/wikipedia.lua b/otouto/plugins/wikipedia.lua index d0d8ede..cd85d95 100644 --- a/otouto/plugins/wikipedia.lua +++ b/otouto/plugins/wikipedia.lua @@ -197,8 +197,7 @@ function wikipedia:inline_callback(inline_query, config, matches) end end local results = results..']' - local res, err = utilities.answer_inline_query(self, inline_query, results, 10) - print(results) + utilities.answer_inline_query(self, inline_query, results, 10) end function wikipedia:action(msg, config, matches) diff --git a/otouto/utilities.lua b/otouto/utilities.lua index e9b9b6b..3cb7b7d 100644 --- a/otouto/utilities.lua +++ b/otouto/utilities.lua @@ -11,7 +11,6 @@ URL = require('socket.url') json = require("dkjson") pcall(json.use_lpeg) serpent = require("serpent") -bindings = require('otouto.bindings') redis = (loadfile "./otouto/redis.lua")() mimetype = (loadfile "./otouto/mimetype.lua")() OAuth = require "OAuth" @@ -608,7 +607,7 @@ function plugins_names() for k, v in pairs(scandir("otouto/plugins")) do -- Ends with .lua if (v:match(".lua$")) then - table.insert(files, v) + files[#files+1] = v end end return files