-
Notifications
You must be signed in to change notification settings - Fork 0
/
ulx_auto_unban.lua
269 lines (199 loc) · 8.16 KB
/
ulx_auto_unban.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
--[[-------------------------------------------------------------------------
Скрипт, который использовался для автоматического разбана игроком на ULX
Если тот пытался зайти на сервер и у него был бан, а также деньги на балансе IGS,
то ему предлагало совершить еще пару попыток входа для подтверждения разбана
Удален из-за желания переосмыслить баны, чтобы игрок все же мог зайти на сервер даже в бане
---------------------------------------------------------------------------]]
local BM = {} -- Ban Message
BM.cfg = {}
BM.cfg.msgWrongPass =
[[
--------------------------------------------------------------------
Неверный пароль
--------------------------------------------------------------------
]]
BM.cfg.msgWrongPassChat =
"{Name} попытался войти в город с фальшивым паспортом: {Pass}"
BM.cfg.msgBanned =
[[Похоже, вы что-то нарушили
Уполномоченный: {AdminName}
Осталось: {TimeLeft}
Статья: {Reason}
Аппеляции на trigon.im]]
BM.cfg.msgBannedChat =
"{Name} попытался вернуться в город, хотя он изгнан за {Reason}"
BM.cfg.msgUnbanPrice =
[[Vas nakazal {AdminName}
Statya: {Reason}
Na donat schetu {Balance} rub.
Perepodkl. escho {Times} raz, dlya advtorazbana.
Cena razbana: {UnbanPrice} rub
Ili sidi v bane escho {TimeLeft}]]
BM.cfg.msgNotEnoughMoney =
[[Vas nakazal {AdminName}
Statya: {Reason}
Na vashem donat schetu {Balance} Alc.
Vam ne hvatayet {Lacks} Alc dlya avtorazbana
Va ne smozete igrat escho {TimeLeft}]]
BM.cfg.msgTlgNotify =
[[%s купил автоматический разбан
💰 Заплатил: %i
⏲ Был забанен на: %s
🐓 Банил: %s
📝 Причина: %s
]]
BM.cfg.chatMsgColorPASS = Color(255,0,0)
BM.cfg.chatMsgColorBAN = Color(255,0,0)
BM.cfg.notifyAdmins = true
BM.cfg.notifyAll = false
BM.cfg.prices = {
{60, 50}, -- час
{360,70}, -- 6
{720,100}, -- 12
{1440,150}, -- сутки
{2880,250}, -- 2
{4320,300}, -- 3
{10080,500}, -- неделя
{20160,650}, -- 2
{30240,750}, -- 3
{43200, 999}, -- месяц
{86400, 1337}, -- 2
{129600,1666}, -- 3
{259200,2300}, -- пол года
{518400,2500}, -- год
}
local c = BM.cfg
local prices = c.prices
local function getUnbanPrice(unban)
local minLeft = (unban - os.time()) / 60
-- Перма
if unban == 0 then
return 3000
-- Срок меньше часа
elseif minLeft < prices[1][1] then
return prices[1][2]
-- Бан более, чем на год, но не перма
elseif minLeft > prices[#prices][1] then
return prices[#prices][2]
-- Бан в пределах таблицы
else
for i,cDat in ipairs(prices) do
local _,nDat = next(prices,i)
if minLeft >= cDat[1] and minLeft < nDat[1] then
return cDat[2]
end
end
end
end
local aUnbanCache = {}
hook("PostGamemodeLoaded","CustomBanMsgPostGamemode", function()
function GAMEMODE:CheckPassword(sid64,_ip_,sv_pass,cl_pass,clientname)
--[[-------------------------------------------------------------------------
Стоит пароль
---------------------------------------------------------------------------]]
if sv_pass ~= "" and sv_pass ~= cl_pass then
local msg = string.gsub(c.msgWrongPassChat, "{Name}",clientname)
msg = string.gsub(msg, "{Pass}", cl_pass)
for _,ply in ipairs(
(c.notifyAdmins and getAllStaff()) or
(c.notifyAll and player.GetAll()) or {}
) do
qq.CMessage(ply,msg,c.chatMsgColorPASS)
end
MsgC(c.chatMsgColorPASS, msg .. "\n")
return false, c.msgWrongPass
end
--[[-------------------------------------------------------------------------
Проверка бана
---------------------------------------------------------------------------]]
local sid = util.SteamIDFrom64(sid64)
local BanInfo = ULib.bans[sid]
if BanInfo then
local BanLeft =
-- tostring, потому что иногда число, а иногда строка попадается. Хз как
tostring(BanInfo.unban) == "0" and "чуть дольше вечности" or
timeToStr(BanInfo.unban - os.time())
local BanReason =
BanInfo.reason ~= "" and BanInfo.reason or "не указана"
local UnBanPrice = getUnbanPrice(tonumber(BanInfo.unban))
UnBanPrice = IGS.PriceInCurrency(UnBanPrice)
--[[-------------------------------------------------------------------------
Платный авторазбан
---------------------------------------------------------------------------]]
-- Первый вход после бана или ожидания 5 минут
-- Неизвестно использовал ли чел IGS
if !aUnbanCache[sid] then
aUnbanCache[sid] = {
loginAttempts = 0
}
IGS.GetBalance(sid64,function(bal)
aUnbanCache[sid]["bal"] = bal -- может быть nil
end)
timer.Simple(60 * 5,function()
aUnbanCache[sid] = nil
end)
-- Если чел использовал IGS и заходит второй раз
elseif aUnbanCache[sid]["bal"] then
aUnbanCache[sid]["loginAttempts"] = aUnbanCache[sid]["loginAttempts"] + 1
-- Хватает бабла
if aUnbanCache[sid]["bal"] >= UnBanPrice then
-- Снимаем деньги и бан после 5 попыток входа
if aUnbanCache[sid]["loginAttempts"] == 5 then
-- проверяем еще раз на случай если вдруг БД отвалилась
-- или чел за это время потратил эти деньги на другом сервере
IGS.GetBalance(sid64,function(bal)
aUnbanCache[sid]["bal"] = bal or 0 -- обновляем данные
if aUnbanCache[sid]["bal"] >= UnBanPrice then
local notif = c.msgTlgNotify:format(sid,UnBanPrice,BanLeft,BanInfo.admin,BanReason)
IGS.Transaction(sid64, -UnBanPrice, "Unban " .. BanLeft, function()
ta.TLGMSG(TLG_CONF_TGDONS,notif)
RunConsoleCommand("ulx","unban",sid)
aUnbanCache[sid] = nil
end)
OM.SendToAny(sid64,
"Спасибо за покупку автоматического разбана. Техническая информация:\n\n" .. notif
)
end
end)
return false,"Перезайдите еще раз.\n\nЕсли все хорошо, то вы уже не в бане\n\nИли свяжитесь с нами через форум trigon.im"
end
-- Меньше 5 попыток входа
return false,c.msgUnbanPrice
:gsub("{AdminName}",BanInfo.admin)
:gsub("{Reason}",BanReason)
:gsub("{Balance}",aUnbanCache[sid]["bal"])
:gsub("{Times}",5 - aUnbanCache[sid]["loginAttempts"])
:gsub("{UnbanPrice}",UnBanPrice)
:gsub("{TimeLeft}",BanLeft)
-- Не хватает бабла
else
return false, c.msgNotEnoughMoney
:gsub("{AdminName}",BanInfo.admin)
:gsub("{Reason}",BanReason)
:gsub("{Balance}",aUnbanCache[sid]["bal"])
:gsub("{Lacks}",UnBanPrice - aUnbanCache[sid]["bal"])
:gsub("{TimeLeft}",BanLeft)
end
-- Чел НЕ использовал IGS
--elseif !aUnbanCache[sid]["bal"] then
end
--[[-------------------------------------------------------------------------
---------------------------------------------------------------------------]]
local SendChatMsg =
c.msgBannedChat
:gsub("{Name}",clientname)
:gsub("{Reason}",BanInfo.reason ~= "" and BanInfo.reason or "хмм.. а причины нет")
if c.notifyAll then
qq.CMessage(player.GetAll(),SendChatMsg,c.chatMsgColorPASS)
elseif c.notifyAdmins then
qq.CMessage(getAllStaff(),SendChatMsg,c.chatMsgColorPASS)
end
MsgC(c.chatMsgColorBAN, SendChatMsg .. "\n" )
return false, c.msgBanned
:gsub("{AdminName}",BanInfo.admin or "CONSOLE")
:gsub("{Reason}", BanReason)
:gsub("{TimeBan}", BanInfo.time == 0 and "Неизвестно" or os.date("%d.%m.%y %H:%M", BanInfo.time))
:gsub("{TimeLeft}", BanLeft)
end
end
end)