From b5f3f512083707de8b0ec162a5548a82f54fe888 Mon Sep 17 00:00:00 2001 From: gasaichandesu Date: Mon, 10 Aug 2026 17:40:02 +0400 Subject: [PATCH] feat(premium): implement premium system through ACCOUNT_FLAG_RECURRING_BILLING flag --- lua_scripts/MWPremium/config.lua | 1 + lua_scripts/MWPremium/mwpremium.lua | 91 +++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 lua_scripts/MWPremium/config.lua create mode 100644 lua_scripts/MWPremium/mwpremium.lua diff --git a/lua_scripts/MWPremium/config.lua b/lua_scripts/MWPremium/config.lua new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/lua_scripts/MWPremium/config.lua @@ -0,0 +1 @@ +return {} diff --git a/lua_scripts/MWPremium/mwpremium.lua b/lua_scripts/MWPremium/mwpremium.lua new file mode 100644 index 000000000..462e63d7e --- /dev/null +++ b/lua_scripts/MWPremium/mwpremium.lua @@ -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)