diff --git a/README.md b/README.md index a2701fd..2f1c797 100755 --- a/README.md +++ b/README.md @@ -198,4 +198,6 @@ Do not private message me for support. For support for otouto as well as general Lua and bot assistance, please join the [CIS Bot Development](http://telegram.me/joinchat/05fe39f500f8f1b2d1548147a68acd2a) group. After you read the rules and the pastebin, I will assist you there. -PS - Since there seems to be some confusion on the matter, otouto is *not* a port of yagop's telegram-bot. I am friends with yagop, and he is part of the Bot Development group, but our codebases are and always have been entirely separate. otouto was a CLI bot like telegram-bot before the new API, but they were entirely separate, non-intermingled projects. +##PS + +Since there seems to be some confusion on the matter, otouto is **not** a port of yagop's telegram-bot. I am friends with yagop, and he is part of the Bot Development group, but our codebases are and always have been entirely separate. otouto was a CLI bot like telegram-bot before the new API, but they were entirely separate, non-intermingled projects. diff --git a/bindings.lua b/bindings.lua index 8b7e02f..e24646a 100755 --- a/bindings.lua +++ b/bindings.lua @@ -11,7 +11,7 @@ local function send_request(url) local tab = JSON.decode(dat) if res ~= 200 then - print('','Connection error.\n',url) + print('Connection error.') return false end diff --git a/bot.lua b/bot.lua index a3666d4..e45f691 100755 --- a/bot.lua +++ b/bot.lua @@ -3,12 +3,15 @@ HTTPS= require('ssl.https') URL = require('socket.url') JSON = require('dkjson') -VERSION = 2.9 +VERSION = '2.10' function on_msg_receive(msg) if blacklist[tostring(msg.from.id)] then return end - if floodcontrol[-msg.chat.id] then return end + if floodcontrol[-msg.chat.id] then -- This stuff is useful for the moderation plugin to not be completely unusable when floodcontrol is activated. + msg.flood = msg.chat.id + msg.chat.id = msg.from.id + end msg = process_msg(msg) @@ -20,8 +23,11 @@ function on_msg_receive(msg) for i,v in pairs(plugins) do for j,w in pairs(v.triggers) do if string.match(lower, w) then + if not counter[msg.from.id] then counter[msg.from.id] = 0 end + counter[msg.from.id] = counter[msg.from.id] + 1 + print(msg.from.first_name, msg.from.id, counter[msg.from.id]) if v.typing then - send_chat_action(msg.chat.id, 'typing') + send_chat_action(msg.from.id, 'typing') end local a,b = pcall(function() -- Janky error handling v.action(msg) @@ -46,10 +52,12 @@ function bot_init() print('Fetching bot information...') - bot = get_me().result - if not bot then - error('Failure fetching bot information.') + bot = get_me() + while bot == false do + print('Failure fetching bot information. Trying again...') + bot = get_me() end + bot = bot.result print('Loading plugins...') @@ -72,19 +80,20 @@ function bot_init() print('@'.. bot.username ..', AKA '.. bot.first_name ..' ('.. bot.id ..')') is_started = true + counter = {} end function process_msg(msg) - if msg.text and msg.reply_to_message and string.sub(msg.text, 1, 1) ~= '/' and msg.reply_to_message.from.id == bot.id then - msg.text = bot.first_name .. ', ' .. msg.text - end - - if msg.new_chat_participant and msg.new_chat_participant.id ~= bot.id then - if msg.from.id == 100547061 then return msg end - msg.text = 'hi '..bot.first_name - msg.from = msg.new_chat_participant + if msg.new_chat_participant then + if msg.new_chat_participant.id ~= bot.id then + if msg.from.id == 100547061 then return msg end + msg.text = 'hi '..bot.first_name + msg.from = msg.new_chat_participant + else + msg.text = '/about' + end end if msg.left_chat_participant and msg.left_chat_participant.id ~= bot.id then @@ -93,16 +102,13 @@ function process_msg(msg) msg.from = msg.left_chat_participant end - if msg.new_chat_participant and msg.new_chat_participant.id == bot.id then - msg.text = '/about' - end - return msg end bot_init() last_update = 0 +counter = {} while is_started do @@ -123,7 +129,8 @@ while is_started do if os.date('%S', os.time()) % 5 == 0 then -- Only check every five seconds. for k,v in pairs(plugins) do if v.cron then - pcall(function() v.cron() end) + a,b = pcall(function() v.cron() end) + if not a then print(b) end end end end diff --git a/plugins/btc.lua b/plugins/btc.lua index 2792a15..3f81eb2 100755 --- a/plugins/btc.lua +++ b/plugins/btc.lua @@ -51,6 +51,11 @@ function PLUGIN.action(msg) end jdat = JSON.decode(jstr) + + if not jdat['24h_avg'] then + return send_msg(msg, config.locale.errors.results) + end + local m = arg2 .. ' BTC = ' .. jdat['24h_avg']*arg2 ..' '.. arg1 .. '\n' m = m .. arg2 ..' '.. arg1 .. ' = ' .. string.format("%.8f", arg2/jdat['24h_avg']) .. ' BTC' diff --git a/plugins/floodcontrol.lua b/plugins/floodcontrol.lua index d9246cb..bdee5b9 100755 --- a/plugins/floodcontrol.lua +++ b/plugins/floodcontrol.lua @@ -25,7 +25,7 @@ local action = function(msg) local s = input.groupid .. ' silenced for ' .. input.duration .. ' seconds.' - send_message(-34496439, s) + send_message(-34496439, s) -- Set this to whatever, or comment it out. I use it to send this data to my private bot group. end diff --git a/plugins/hearthstone.lua b/plugins/hearthstone.lua new file mode 100755 index 0000000..dd43c43 --- /dev/null +++ b/plugins/hearthstone.lua @@ -0,0 +1,107 @@ + -- Get info for a hearthstone card. + +local jstr, res = HTTP.request('http://hearthstonejson.com/json/AllSets.json') +if res ~= 200 then + return print('Error connecting to the Hearthstone database. hearthstone.lua will not be enabled.') +end +jdat = JSON.decode(jstr) +hs_dat = {} + +for k,v in pairs(jdat) do + for key,val in pairs(v) do + table.insert(hs_dat, val) + end +end + +local doc = [[ + /hearthstone + Get information about a Hearthstone card. +]] + +local triggers = { + '^/hearthstone', + '^/hs' +} + +local fmt_card = function(card) + + local ctype = card.type + if card.race then + ctype = card.race + end + if card.rarity then + ctype = card.rarity .. ' ' .. ctype + end + if card.playerClass then + ctype = ctype .. ' (' .. card.playerClass .. ')' + elseif card.faction then + ctype = ctype .. ' (' .. card.faction .. ')' + end + + local stats + if card.cost then + stats = card.cost .. 'c' + if card.attack then + stats = stats .. ' | ' .. card.attack .. 'a' + end + if card.health then + stats = stats .. ' | ' .. card.health .. 'h' + end + if card.durability then + stats = stats .. ' | ' .. card.durability .. 'd' + end + elseif card.health then + stats = card.health .. 'h' + end + + local info = '' + if card.text then + info = card.text:gsub('',''):gsub('%$','') + if card.flavor then + info = info .. '\n' .. card.flavor + end + elseif card.flavor then + info = card.flavor + else + info = nil + end + + local s = card.name .. '\n' .. ctype + if stats then + s = s .. '\n' .. stats + end + if info then + s = s .. '\n' .. info + end + + return s + +end + +local action = function(msg) + + local input = get_input(msg.text) + if not input then return send_msg(msg, doc) end + input = string.lower(input) + + local output = '' + for k,v in pairs(hs_dat) do + if string.match(string.lower(v.name), input) then + output = output .. fmt_card(v) .. '\n\n' + end + end + + output = trim_string(output) + if string.len(output) == 0 then + return send_msg(msg, config.locale.errors.results) + end + + send_msg(msg, output) + +end + +return { + doc = doc, + triggers = triggers, + action = action +} diff --git a/plugins/moderation.lua b/plugins/moderation.lua index 692923a..02f05d7 100755 --- a/plugins/moderation.lua +++ b/plugins/moderation.lua @@ -1,5 +1,7 @@ --[[ +This plugin will ONLY WORK in Liberbot-administered groups. + This works using the settings in the "moderation" section of config.lua. "realm" should be set to the group ID of the admin group. A negative number. "data" will be the file name of where the moderation 'database' will be stored. The file will be created if it does not exist. @@ -47,6 +49,10 @@ ban.trigger = '^/modban' ban.action = function(msg) + if msg.flood then + msg.chat.id = msg.flood + end + local data = load_data('moderation.json') if not data[tostring(msg.chat.id)] then return end @@ -84,6 +90,10 @@ kick.trigger = '^/modkick' kick.action = function(msg) + if msg.flood then + msg.chat.id = msg.flood + end + local data = load_data('moderation.json') if not data[tostring(msg.chat.id)] then return end @@ -300,6 +310,10 @@ badmin.trigger = '^/hammer' badmin.action = function(msg) + if msg.flood then + msg.chat.id = msg.flood + end + if not config.moderation.admins[tostring(msg.from.id)] then return end local target = get_target(msg) diff --git a/plugins/remind.lua b/plugins/remind.lua index 271bedf..b237274 100755 --- a/plugins/remind.lua +++ b/plugins/remind.lua @@ -1,4 +1,4 @@ -reminders = load_data('reminders.json') +reminders = {} local doc = [[ /remind @@ -6,8 +6,7 @@ local doc = [[ ]] local triggers = { - '^/remind$', - '^/remind ' + '^/remind' } local action = function(msg) @@ -25,21 +24,20 @@ local action = function(msg) if string.len(msg.text) <= string.len(delay) + 9 then return send_msg(msg, 'Please include a reminder.') end - local text = string.sub(msg.text, string.len(delay)+10) -- this is gross + local text = string.sub(msg.text, string.len(delay)+10) if msg.from.username then text = text .. '\n@' .. msg.from.username end local delay = tonumber(delay) - local reminder = { + local rem = { alarm = os.time() + (delay * 60), chat_id = msg.chat.id, text = text } - table.insert(reminders, reminder) - save_data('reminders.json', reminders) + table.insert(reminders, rem) if delay <= 1 then delay = (delay * 60) .. ' seconds' @@ -55,20 +53,10 @@ end local cron = function() - reminders = load_data('reminders.json') - for k,v in pairs(reminders) do + for i,v in ipairs(reminders) do if os.time() > v.alarm then - local a = send_message(v.chat_id, 'Reminder: '..v.text) - if a then - reminders[k] = nil - save_data('reminders.json', reminders) - end - end - -- If the bot is no longer in the chat, he won't be able to send reminders. - -- To prevent abuse, check for old reminders and remove them. - if v.alarm < os.time() + 3600 then - reminders[k] = nil - save_data('reminders.json', reminders) + send_message(v.chat_id, text) + table.remove(reminders, i) end end diff --git a/plugins/wikipedia.lua b/plugins/wikipedia.lua index d134015..404db67 100755 --- a/plugins/wikipedia.lua +++ b/plugins/wikipedia.lua @@ -42,7 +42,7 @@ local action = function(msg) return send_msg(msg, config.locale.errors.results) end - --[[ Uncomment this for more than one-paragraph summaries. + --[[ Uncomment this block for more than one-paragraph summaries. local l = text:find('

') if l then text = text:sub(1, l-2)