[IGS] Купоны на донат валюту в виде чат-команд

У меня не поворачивается язык назвать это модификацией, но про такую штуку слишком часто спрашивают

Настройка

Добавьте свой промокод в таблицу codes. Индекс - команда для активации (включая слеш), значение - сумма, которую получит активировавший игрок

Важно

  • Сохранение происходит в локальной БД, поэтому если у вас несколько серверов с общим донатом, то промокод можно будет активировать на обоих.
  • Чтобы можно было в будущем создать промокод с уже использованным названием, используйте консольную команду igs_freemoney_clear КОД (только в серверной консоли)

Код

Путь: garrysmod/addons/ТВОЙ АДДОН/lua/autorun/sv_coupons.lua

if not sql.TableExists('igs_freemoney') then
	sql.Query('CREATE TABLE igs_freemoney (steamid VARCHAR(40), date INTEGER, code TEXT)')
end

local codes = {
	['/dengi'] = 10,
	['/gavno'] = 1000,
}

hook.Add('PlayerSay', 'babosiki', function(pl, code)
	local amount = codes[code]
	if not amount then return end

	if pl.codeCD and pl.codeCD > CurTime() then
		DarkRP.notify(pl, 1, 5, 'Ты вводишь промокоды слишком часто!')
		return ''
	end

	pl.codeCD = CurTime() + 1

	local d = sql.Query('SELECT * FROM igs_freemoney WHERE steamid = "' .. pl:SteamID() .. '" AND code = ' .. sql.SQLStr(code))

	if d and d[1] then
		DarkRP.notify(pl, 1, 5, 'Ты уже активировал этот промокод')
		return ''
	end

	sql.Query('INSERT INTO igs_freemoney (steamid, date, code) VALUES("' .. pl:SteamID() .. '", ' .. os.time() .. ', ' .. sql.SQLStr(code) .. ')')
	pl:AddIGSFunds(amount)
	DarkRP.notify(pl, 0, 10, 'Ты получил ' .. amount .. 'р по промокоду!')
	return ''
end)

concommand.Add('igs_freemoney_clear', function(pl, cmd, args)
	if IsValid(pl) then return end

	local res = sql.Query('DELETE FROM igs_freemoney WHERE code = ' .. sql.SQLStr(args[1]) .. '')
	if res == false then
		print('Произошла ошибка при очистке записей: ' .. sql.LastError())
	else
		print('Успешно очищены все записи с кодом "' .. args[1] .. '"')
	end
end)
2 лайка

Альтернативная версия

  • :new: Добавлена возможность создавать купоны, которые можно активировать повторно через какое-то время
  • :one: Работа с существующей таблицей вместо создания новой в sv.db

Команда удаления всех активаций определенного купона заменена командой сбросой активации конкретного купона для конкретного игрока в связи с переходом на другой тип хранения данных

Установка

  1. Закинуть код снизу по пути addons/igs-modification/lua/autorun/server/coupons.lua
  2. Перезапустить сервер или попробовать выполнить lua_run include("autorun/server/coupons.lua")
local codes = {
	["/kit_daily"] = {10, 86400}, -- 10 руб раз в 24 часа (86400 сек)
	["/kit_start"] = {1000}, -- 1000 руб один раз за все время
}

hook.Add("PlayerSay", "babosiki", function(pl, code)
	if not codes[code] then return end
	local amount, cooldown = unpack(codes[code])

	local last_activated = cookie.GetNumber("igs_freemoney:" .. pl:SteamID64() .. ":" .. code)
	if last_activated then
		if not cooldown then DarkRP.notify(pl, 1, 5, "Ты уже активировал этот промокод") return "" end

		local time_ago = os.time() - (last_activated or 0)
		if time_ago < cooldown then DarkRP.notify(pl, 1, 5, "Ты сможешь активировать этот промокод через " .. string.NiceTime(cooldown - time_ago)) return "" end
	end

	cookie.Set("igs_freemoney:" .. pl:SteamID64() .. ":" .. code, os.time())
	pl:AddIGSFunds(amount)
	DarkRP.notify(pl, 0, 10, "Ты получил " .. string.Comma(amount) .. "р по промокоду!")
	return ""
end)

concommand.Add("igs_reset_player_code", function(pl, _, _, argss)
	if IsValid(pl) then return end

	local steamid, code = argss:match("(STEAM_%d:%d:%d+) (%w+)")
	if not (steamid and code) then print("Неверный стимайди или не введен код") return end

	cookie.Delete("igs_freemoney:" .. util.SteamIDTo64(steamid) .. ":" .. code)
	print("Сбросил активацию промокода для " .. steamid)
end)

Использование

В файле сверху список купонов настройка купонов.

Вместо слеша в начале названия купона можно использовать и другие символы, например убрать слеш совсем, либо заменить например на “!”.

Второе число после названия купона это время, через которое можно повторно использовать купон в секундах. Если его не указать, то купон будет одноразовым.

Есть консольная команда igs_reset_player_code $steamid $code. Работает только через консоль сервера. Она удаляет информацию про активацию определенного купона на указанном игроке. В теории полезно для тестов, а по факту для тестов лучше просто создать купон с другим названием, а команду просто удалить.

:information_source: Может быть также интересно