98 lines
2.3 KiB
Lua
98 lines
2.3 KiB
Lua
local PLAYER_EVENT_ON_COMMAND = 42
|
|
local PLAYER_EVENT_ON_LOGIN = 3
|
|
local PREMIUM_FLAG_INDEX = 100
|
|
local SUMMON_COMPANION_SPELL_ID = 9000
|
|
local ACCOUNT_FLAG_RECURRING_BILLING = 8192
|
|
|
|
---todo extract to utils
|
|
---@param inputstr string
|
|
---@param separator string
|
|
---@return table
|
|
local function SplitString(inputstr, separator)
|
|
if separator == nil then
|
|
separator = "%s"
|
|
end
|
|
local t = {}
|
|
for str in string.gmatch(inputstr, "([^" .. separator .. "]+)") do
|
|
table.insert(t, str)
|
|
end
|
|
return t
|
|
end
|
|
|
|
---@return boolean
|
|
local function IsPremium(player)
|
|
return player:HasFlag(PREMIUM_FLAG_INDEX, 1)
|
|
end
|
|
|
|
local function OnPremiumPlayer(player)
|
|
if not IsPremium(player) then
|
|
return
|
|
end
|
|
|
|
player:SendAreaTriggerMessage('На вашем аккаунте активна подписка Premium! Благодарим за поддержку проекта MoonWell.')
|
|
end
|
|
|
|
local function RefreshPremiumStatus(player)
|
|
local query = AuthDBQuery("SELECT flags FROM account WHERE id = " .. player:GetAccountId())
|
|
|
|
if query then
|
|
local function HasFlag(mask, flag)
|
|
return bit_and(mask, flag) == flag
|
|
end
|
|
|
|
|
|
local flags = query:GetUInt32(0)
|
|
|
|
if HasFlag(flags, ACCOUNT_FLAG_RECURRING_BILLING) then
|
|
player:SetFlag(PREMIUM_FLAG_INDEX, 1)
|
|
|
|
OnPremiumPlayer(player)
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
|
|
return false
|
|
end
|
|
|
|
local function ApplyPremium(player)
|
|
AuthDBExecute(
|
|
string.format(
|
|
"UPDATE account SET flags = flags | %d WHERE id = %d",
|
|
ACCOUNT_FLAG_RECURRING_BILLING,
|
|
player:GetAccountId()
|
|
)
|
|
)
|
|
|
|
RefreshPremiumStatus(player)
|
|
end
|
|
|
|
local function OnLogin(event, player)
|
|
RefreshPremiumStatus(player)
|
|
end
|
|
|
|
--- @param event any
|
|
--- @param player any
|
|
--- @param command string
|
|
--- @param chatHandler any
|
|
local function OnCommand(event, player, command, chatHandler)
|
|
---Console is not supported yet
|
|
if not player then return end
|
|
|
|
local parts = SplitString(command:lower(), ' ')
|
|
|
|
if parts[1] ~= 'premium' then return end
|
|
|
|
if parts[2] == 'add' then
|
|
ApplyPremium(player:GetSelection())
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, OnLogin)
|
|
RegisterPlayerEvent(PLAYER_EVENT_ON_COMMAND, OnCommand)
|