From 29ca79a1936a561fec0b53de48c6a7b2e7ea022d Mon Sep 17 00:00:00 2001 From: yago Date: Sat, 14 Mar 2015 17:21:20 +0100 Subject: [PATCH] Matches one pattern per plugin only. do_lex msg as param. --- bot/bot.lua | 132 +++++++++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 59 deletions(-) diff --git a/bot/bot.lua b/bot/bot.lua index 2396afa..e7d2f2d 100644 --- a/bot/bot.lua +++ b/bot/bot.lua @@ -2,22 +2,20 @@ require("./bot/utils") VERSION = '0.9.5' +-- This function is called when tg receive a msg function on_msg_receive (msg) - vardump(msg) - - if msg_valid(msg) == false then - return + -- vardump(msg) + if msg_valid(msg) then + msg = pre_process_msg(msg) + match_plugins(msg) end - - do_action(msg) end function ok_cb(extra, success, result) end -function on_binlog_replay_end () +function on_binlog_replay_end() started = 1 - -- Uncomment the line to enable cron plugins. postpone (cron_plugins, false, 60*5.0) -- See plugins/ping.lua as an example for cron @@ -42,67 +40,82 @@ function msg_valid(msg) print("Not valid, readed") return false end + return true end -function do_lex(msg, text) + +function do_lex(msg) -- Plugins which implements lex. - for name, desc in pairs(plugins) do - if (desc.lex ~= nil) then - result = desc.lex(msg, text) - if (result ~= nil) then - print ("Mutating to " .. result) - text = result - end + for name, plugin in pairs(plugins) do + if plugin.lex ~= nil then + msg = plugin.lex(msg) end end - return text + + return msg end --- Where magic happens -function do_action(msg) - local receiver = get_receiver(msg) - local text = msg.text - - if text == nil then - -- Not a text message, make text the same as what tg shows so - -- we can match on it. Maybe a plugin activated my media type. - if msg.media ~= nil then - text = '['..msg.media.type..']' - end +-- Go over enabled plugins patterns. +function match_plugins(msg) + for name, plugin in pairs(plugins) do + match_plugin(plugin, msg) end +end - -- We can't do anything - if msg.text == nil then return false end +function match_plugin(plugin, msg) + local receiver = get_receiver(msg) - msg.text = do_lex(msg, text) - - for name, desc in pairs(plugins) do - -- print("Trying module", name) - for k, pattern in pairs(desc.patterns) do - -- print("Trying", text, "against", pattern) - matches = { string.match(text, pattern) } - if matches[1] then - mark_read(receiver, ok_cb, false) - print(" matches", pattern) - if desc.run ~= nil then - -- If plugin is for privileged user - if desc.privileged and not is_sudo(msg) then - local text = 'This plugin requires privileged user' - send_msg(receiver, text, ok_cb, false) - else - result = desc.run(msg, matches) - -- print(" sending", result) - if (result) then - result = do_lex(msg, result) - _send_msg(receiver, result) - end + -- Go over patterns. If one matches is enought. + for k, pattern in pairs(plugin.patterns) do + -- print(msg.text, pattern) + matches = { string.match(msg.text, pattern) } + if matches[1] then + mark_read(receiver, ok_cb, false) + print(" matches", pattern) + -- Function exists + if plugin.run ~= nil then + -- If plugin is for privileged users only + if not user_allowed(plugin, msg) then + local text = 'This plugin requires privileged user' + send_msg(receiver, text, ok_cb, false) + else + -- Send the returned text by run function. + result = plugin.run(msg, matches) + if result ~= nil then + _send_msg(receiver, result) end end end + -- One matches + return end end end +-- Check if user can use the plugin +function user_allowed(plugin, msg) + if plugin.privileged and not is_sudo(msg) then + return false + end + return true +end + +--Apply lex and other text. +function pre_process_msg(msg) + + if msg.text == nil then + -- Not a text message, make text the same as what tg shows so + -- we can match on it. Maybe a plugin activated my media type. + if msg.media ~= nil then + msg.text = '['..msg.media.type..']' + end + end + + msg = do_lex(msg) + + return msg +end + -- If text is longer than 4096 chars, send multiple msg. -- https://core.telegram.org/method/messages.sendMessage function _send_msg( destination, text) @@ -125,7 +138,8 @@ function save_config( ) print ('saved config into ./data/config.lua') end - +-- Returns the config from config.lua file. +-- If file doesnt exists, create it. function load_config( ) local f = io.open('./data/config.lua', "r") -- If config.lua doesnt exists @@ -197,18 +211,18 @@ end function load_plugins() for k, v in pairs(_config.enabled_plugins) do print("Loading plugin", v) - t = loadfile("plugins/"..v..'.lua')() + local t = loadfile("plugins/"..v..'.lua')() table.insert(plugins, t) end end --- Cron all the enabled plugins +-- Call and postpone execution for cron plugins function cron_plugins() - for name, desc in pairs(plugins) do - if desc.cron ~= nil then - print(desc.description) - desc.cron() + for name, plugin in pairs(plugins) do + -- Only plugins with cron function + if plugin.cron ~= nil then + plugin.cron() end end