diff --git a/.gitignore b/.gitignore index 6b78c58..4fd526d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ plugins/mokubot* plugins/qtbot* +plugins/mjolnir* +plugins/antisquigbot* *.db lua-tg drua-tg diff --git a/bindings.lua b/bindings.lua index db117bd..9cf8974 100755 --- a/bindings.lua +++ b/bindings.lua @@ -12,10 +12,6 @@ function bindings.sendRequest(url) local dat, res = HTTPS.request(url) - if res ~= 200 then - return false, res - end - local tab = JSON.decode(dat) if not tab.ok then @@ -114,6 +110,16 @@ function bindings:forwardMessage(chat_id, from_chat_id, message_id, disable_noti end +function bindings:kickChatMember(chat_id, user_id) + local url = self.BASE_URL .. '/kickChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id + return bindings.sendRequest(self, url) +end + +function bindings:unbanChatMember(chat_id, user_id) + local url = self.BASE_URL .. '/unbanChatMember?chat_id=' .. chat_id .. '&user_id=' .. user_id + return bindings.sendRequest(self, url) +end + -- TODO: More of this. function bindings:sendPhotoID(chat_id, file_id, caption, reply_to_message_id, disable_notification) diff --git a/bot.lua b/bot.lua index b82b8b8..3e91658 100755 --- a/bot.lua +++ b/bot.lua @@ -5,7 +5,7 @@ local instance = {} local bindings = require('bindings') -- Load Telegram bindings. local utilities = require('utilities') -- Load miscellaneous and cross-plugin functions. -bot.version = '3.5' +bot.version = '3.6' function bot:init() -- The function run when the bot is started or reloaded. @@ -44,22 +44,6 @@ function bot:init() -- The function run when the bot is started or reloaded. self.database.users = self.database.users or {} -- Table to cache userdata. self.database.users[tostring(self.info.id)] = self.info - -- Migration code. Remove in 3.6. - if self.database.lastfm then - for k,v in pairs(self.database.lastfm) do - if not self.database.users[k] then self.database.users[k] = {} end - self.database.users[k].lastfm = v - end - end - - -- Migration code. Remove in 3.6. - if self.database.nicknames then - for k,v in pairs(self.database.nicknames) do - if not self.database.users[k] then self.database.users[k] = {} end - self.database.users[k].nickname = v - end - end - end function bot:on_msg_receive(msg) -- The fn run whenever a message is received. @@ -77,25 +61,17 @@ function bot:on_msg_receive(msg) -- The fn run whenever a message is received. end if msg.date < os.time() - 5 then return end -- Do not process old messages. - if not msg.text then msg.text = msg.caption or '' end - if msg.reply_to_message and msg.reply_to_message.caption then - msg.reply_to_message.text = msg.reply_to_message.caption - end -- If the replied-to message has a caption, make that its text. + msg = utilities.enrich_message(msg) if msg.text:match('^/start .+') then msg.text = '/' .. utilities.input(msg.text) + msg.text_lower = msg.text:lower() end for _,v in ipairs(self.plugins) do for _,w in pairs(v.triggers) do if string.match(msg.text:lower(), w) then - -- a few shortcuts - msg.chat.id_str = tostring(msg.chat.id) - msg.from.id_str = tostring(msg.from.id) - msg.text_lower = msg.text:lower() - msg.from.name = utilities.build_name(msg.from.first_name, msg.from.last_name) - local success, result = pcall(function() return v.action(self, msg) end) diff --git a/config.lua b/config.lua index aca0fc3..bac5ead 100755 --- a/config.lua +++ b/config.lua @@ -2,12 +2,12 @@ return { -- Your authorization token from the botfather. bot_api_key = '', + -- Your Telegram ID. + admin = 00000000, -- Differences, in seconds, between your time and UTC. time_offset = 0, -- Two-letter language code. lang = 'en', - -- Your Telegram ID. - admin = 00000000, -- The channel, group, or user to send error reports to. -- If this is not set, errors will be printed to the console. log_chat = nil, diff --git a/plugins/administration.lua b/plugins/administration.lua index 9e61c76..43ae4b7 100644 --- a/plugins/administration.lua +++ b/plugins/administration.lua @@ -47,15 +47,6 @@ function administration:init() flood = {} } - -- Migration code: Remove this in v1.8. - -- Most recent group activity is now cached for group listings. - if not self.database.administration.activity then - self.database.administration.activity = {} - for k,_ in pairs(self.database.administration.groups) do - table.insert(self.database.administration.activity, k) - end - end - -- Migration code: Remove this in v1.9. -- Groups have single governors now. for _,group in pairs(self.database.administration.groups) do @@ -1011,6 +1002,7 @@ function administration.init_command(self_) photo = drua.get_photo(msg.chat.id), founded = os.time() } + administration:update_desc(self, msg.chat.id) for i,_ in ipairs(administration.flags) do self.database.administration.groups[msg.chat.id_str].flags[i] = false end diff --git a/plugins/eightball.lua b/plugins/eightball.lua index f839f9c..5cbb608 100755 --- a/plugins/eightball.lua +++ b/plugins/eightball.lua @@ -43,10 +43,6 @@ local yesno_answers = { function eightball:action(msg) - if msg.reply_to_message then - msg = msg.reply_to_message - end - local message if msg.text_lower:match('y/n%p?$') then diff --git a/plugins/hearthstone.lua b/plugins/hearthstone.lua index 7e2ab13..38507b8 100755 --- a/plugins/hearthstone.lua +++ b/plugins/hearthstone.lua @@ -12,23 +12,26 @@ function hearthstone:init() print('Downloading Hearthstone database...') - self.database.hearthstone = { - expiration = os.time() + 600000 - } + -- This stuff doesn't play well with lua-sec. Disable it for now; hack in curl. + --local jstr, res = HTTPS.request('https://api.hearthstonejson.com/v1/latest/enUS/cards.json') + --if res ~= 200 then + -- print('Error connecting to hearthstonejson.com.') + -- print('hearthstone.lua will not be enabled.') + -- return + --end + --local jdat = JSON.decode(jstr) - local jstr, res = HTTPS.request('http://hearthstonejson.com/json/AllSets.json') - if res ~= 200 then + local s = io.popen('curl -s https://api.hearthstonejson.com/v1/latest/enUS/cards.json'):read('*all') + local d = JSON.decode(s) + + if not d then print('Error connecting to hearthstonejson.com.') print('hearthstone.lua will not be enabled.') return end - local jdat = JSON.decode(jstr) - for _,v in pairs(jdat) do - for _,val in pairs(v) do - table.insert(self.database.hearthstone, val) - end - end + self.database.hearthstone = d + self.database.hearthstone.expiration = os.time() + 600000 print('Download complete! It will be stored for a week.') diff --git a/utilities.lua b/utilities.lua index a9efe17..99254e5 100755 --- a/utilities.lua +++ b/utilities.lua @@ -171,7 +171,7 @@ function utilities:user_from_message(msg) if msg.reply_to_message then target = msg.reply_to_message.from elseif input and tonumber(input) then - target.id = input + target.id = tonumber(input) if self.database.users[input] then for k,v in pairs(self.database.users[input]) do target[k] = v @@ -300,3 +300,34 @@ function utilities.with_http_timeout(timeout, fun) fun() HTTP.TIMEOUT = original end + +function utilities.enrich_user(user) + user.id_str = tostring(user.id) + user.name = utilities.build_name(user.first_name, user.last_name) + return user +end + +function utilities.enrich_message(msg) + if not msg.text then msg.text = msg.caption or '' end + msg.text_lower = msg.text:lower() + msg.from = utilities.enrich_user(msg.from) + msg.chat.id_str = tostring(msg.chat.id) + if msg.reply_to_message then + if not msg.reply_to_message.text then + msg.reply_to_message.text = msg.reply_to_message.caption or '' + end + msg.reply_to_message.text_lower = msg.reply_to_message.text:lower() + msg.reply_to_message.from = utilities.enrich_user(msg.reply_to_message.from) + msg.reply_to_message.chat.id_str = tostring(msg.reply_to_message.chat.id) + end + if msg.forward_from then + msg.forward_from = utilities.enrich_user(msg.forward_from) + end + if msg.new_chat_participant then + msg.new_chat_participant = utilities.enrich_user(msg.new_chat_participant) + end + if msg.left_chat_participant then + msg.left_chat_participant = utilities.enrich_user(msg.left_chat_participant) + end + return msg +end