You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.1 KiB
79 lines
2.1 KiB
-- ShareVersion1.lua
|
|
-- @Author : DengSir (tdaddon@163.com)
|
|
-- @Link : https://dengsir.github.io
|
|
-- @Date : 9/21/2018, 9:59:09 AM
|
|
|
|
local ns = select(2, ...)
|
|
local Addon = ns.Addon
|
|
local AceSerializer = LibStub('AceSerializer-3.0')
|
|
local Base64 = LibStub('LibBase64-1.0')
|
|
local CRC32 = LibStub('LibCRC32-1.0')
|
|
local VERSION = 1
|
|
local Share = Addon:NewShareHandler(VERSION)
|
|
|
|
local template = [[
|
|
# Pet Battle Scripts
|
|
# Version: %s
|
|
# Name: %s
|
|
# (Script) : #
|
|
%s
|
|
]]
|
|
|
|
function Share:RawExport(script)
|
|
local code = AceSerializer:Serialize({
|
|
db = script:GetDB(),
|
|
plugin = script:GetPlugin():GetPluginName(),
|
|
key = script:GetKey(),
|
|
extra = script:GetPlugin():OnExport(script:GetKey()),
|
|
})
|
|
return CRC32:enc(code) .. code
|
|
end
|
|
|
|
function Share:Export(script)
|
|
return template:format(
|
|
VERSION,
|
|
script:GetName(),
|
|
Base64.Encode(self:RawExport(script)):gsub('(..?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?)', function(x)
|
|
return '# ' .. x .. '\n'
|
|
end)
|
|
)
|
|
end
|
|
|
|
function Share:Import(code)
|
|
local code = code:match('%(Script%) : (.+)')
|
|
if not code then
|
|
return false, 'Decode failed'
|
|
end
|
|
|
|
code = code:gsub('[# ]', '')
|
|
local ok, data = pcall(Base64.Decode, code)
|
|
if not ok then
|
|
return false, 'Decode failed'
|
|
end
|
|
|
|
local crc, data = data:match('^(%d+)(^.+)$')
|
|
if not crc or not data then
|
|
return false, 'Decode failed'
|
|
end
|
|
if CRC32:enc(data) ~= tonumber(crc) then
|
|
return false, 'CRC32 error'
|
|
end
|
|
|
|
local ok, data = AceSerializer:Deserialize(data)
|
|
if not ok or type(data) ~= 'table' then
|
|
return false, 'Deserialize failed'
|
|
end
|
|
|
|
if not data.db or not data.db.code then
|
|
return false, 'Data error'
|
|
end
|
|
return true, data
|
|
end
|
|
|
|
function Share:Is(code)
|
|
if not code:find('(Script)', nil, true) then
|
|
return
|
|
end
|
|
local version = code:match('# Version: (%d+)')
|
|
return not version or tonumber(version) == VERSION
|
|
end
|
|
|