feat(premium): implement premium system through ACCOUNT_FLAG_RECURRING_BILLING flag
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
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)
|
||||
end
|
||||
|
||||
local function OnPremiumPlayer(player)
|
||||
if not IsPremium(player) then
|
||||
return
|
||||
end
|
||||
|
||||
player:SendBroadcastMessage('На вашем аккаунте активна подписка 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.band(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()
|
||||
)
|
||||
)
|
||||
|
||||
OnPremiumPlayer(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
|
||||
end
|
||||
|
||||
|
||||
|
||||
RegsiterPlayerEvent(PLAYER_EVENT_ON_LOGIN, RefreshPremiumStatus)
|
||||
RegisterPlayerEvent(PLAYER_EVENT_ON_COMMAND, OnCommand)
|
||||
Reference in New Issue
Block a user