diff --git a/lua/plugins/backup.lua b/lua/plugins/backup.lua index c5d5508f5..e4fd1f20d 100644 --- a/lua/plugins/backup.lua +++ b/lua/plugins/backup.lua @@ -85,76 +85,85 @@ local imported_text = [['Done. ]] function plugin.onTextMessage(msg, blocks) - if msg.from.admin then - if blocks[1] == 'snap' then - local key = 'chat:'..msg.chat.id..':lastsnap' - local last_user = db:get(key) - if last_user then - local ttl = db:ttl(key) - local time_remaining = get_time_remaining(ttl) - local text = i18n([[I'm sorry, this command has been used for the last time less then 3 hours ago by %s (ask them for the file). + if not msg.from.admin then + return + end + if blocks[1] == 'snap' then + local key = 'chat:'..msg.chat.id..':lastsnap' + local last_user = db:get(key) + if last_user then + -- A snapshot has been done recently + local ttl = db:ttl(key) + local time_remaining = get_time_remaining(ttl) + local text = i18n([[I'm sorry, this command has been used for the last time less then 3 hours ago by %s (ask them for the file). Wait [%s] to use it again ]]):format(last_user, time_remaining) - api.sendReply(msg, text, 'html') - else - local name = u.getname_final(msg.from) - db:setex(key, 10800, name) --3 hours - local file_path = gen_backup(msg.chat.id) - api.sendReply(msg, i18n('*Sent in private*'), true) - api.sendDocument(msg.from.id, file_path, nil, ('#snap\n%s'):format(msg.chat.title)) - end + api.sendReply(msg, text, 'html') + else + -- no snapshot has been done recently + local name = u.getname_final(msg.from) + db:setex(key, 10800, name) --3 hours + local file_path = gen_backup(msg.chat.id) + api.sendReply(msg, i18n('*Sent in private*'), true) + api.sendDocument(msg.from.id, file_path, nil, ('#snap\n%s'):format(msg.chat.title)) + end + end + if blocks[1] == 'import' then + local text + if not msg.reply then + text = i18n('Invalid input. Please reply to the backup file (/snap command to get it)') + api.sendMessage(msg.chat.id, text) + return + end + if not msg.reply.document then + text = i18n('Invalid input. Please reply to a document') + api.sendMessage(msg.chat.id, text) + return + end + if msg.reply.document.file_name ~= 'snap'..msg.chat.id..'.gbb' then + text = i18n('This is not a valid backup file.\nReason: invalid name (%s)') + :format(tostring(msg.reply_to_message.document.file_name)) + api.sendMessage(msg.chat.id, text) + return end - if blocks[1] == 'import' then - local text - if msg.reply then - if msg.reply.document then - if msg.reply.document.file_name == 'snap'..msg.chat.id..'.gbb' then - local res = api.getFile(msg.reply.document.file_id) - local download_link = u.telegram_file_link(res) - local file_path, code = u.download_to_file(download_link, '/tmp/'..msg.chat.id..'.json') - if not file_path then - text = i18n('Download of the file failed with code %s'):format(tostring(code)) - else - local data = load_data(file_path) - for chat_id, group_data in pairs(data) do - chat_id = tonumber(chat_id) - if tonumber(chat_id) ~= msg.chat.id then - text = i18n('Chat IDs don\'t match (%s and %s)'):format(tostring(chat_id), tostring(msg.chat.id)) - else - --restoring sets - if group_data.sets and next(group_data.sets) then - for set, content in pairs(group_data.sets) do - db:sadd(('chat:%d:%s'):format(chat_id, set), unpack(content)) - end - end + local res = api.getFile(msg.reply.document.file_id) + local download_link = u.telegram_file_link(res) + local file_path, code = u.download_to_file(download_link, '/tmp/'..msg.chat.id..'.json') - --restoring hashes - if group_data.hashes and next(group_data.hashes) then - for hash, content in pairs(group_data.hashes) do - if next(content) then - --[[for key, val in pairs(content) do - print('\tkey:', key) - db:hset(('chat:%d:%s'):format(chat_id, hash), key, val) - end]] - db:hmset(('chat:%d:%s'):format(chat_id, hash), content) - end - end - end - text = i18n(imported_text) - end - end - end - else - text = i18n('This is not a valid backup file.\nReason: invalid name (%s)') - :format(tostring(msg.reply_to_message.document.file_name)) + if not file_path then + text = i18n('Download of the file failed with code %s'):format(tostring(code)) + api.sendMessage(msg.chat.id, text) + return + end + + local data = load_data(file_path) + for chat_id, group_data in pairs(data) do + chat_id = tonumber(chat_id) + if tonumber(chat_id) ~= msg.chat.id then + text = i18n('Chat IDs don\'t match (%s and %s)'):format(tostring(chat_id), tostring(msg.chat.id)) + api.sendMessage(msg.chat.id, text) + return + end + --restoring sets + if group_data.sets and next(group_data.sets) then + for set, content in pairs(group_data.sets) do + db:sadd(('chat:%d:%s'):format(chat_id, set), unpack(content)) + end + end + + --restoring hashes + if group_data.hashes and next(group_data.hashes) then + for hash, content in pairs(group_data.hashes) do + if next(content) then + --[[for key, val in pairs(content) do + print('\tkey:', key) + db:hset(('chat:%d:%s'):format(chat_id, hash), key, val) + end]] + db:hmset(('chat:%d:%s'):format(chat_id, hash), content) end - else - text = i18n('Invalid input. Please reply to a document') end - else - text = i18n('Invalid input. Please reply to the backup file (/snap command to get it)') end - api.sendMessage(msg.chat.id, text) + api.sendMessage(msg.chat.id, i18n(imported_text)) end end end