Added Reports

This commit is contained in:
Cooldude2606
2018-01-06 14:17:08 +00:00
parent d96e9ac075
commit fe899ef138
8 changed files with 294 additions and 43 deletions

View File

@@ -8,28 +8,45 @@ Discord: https://discord.gg/r6dC2uK
]]
--Please Only Edit Below This Line-----------------------------------------------------------
local report_to_warnings = 1
local varified_to_warings = 3
local report_to_warnings = 1 -- used in count_reports
local varified_to_warings = 3 -- used in count_reports
local reports_needed_for_jail = 10
local take_action = 5 -- below this number no action is taken, the first admin given warning jumps to this number
local min_time_to_remove_warning = 18000 -- this is in ticks
local take_action = 8 -- below this number no action is taken, the first admin given warning jumps to this number
local punishments = {
{'nothing'},
{'nothing'},
{'nothing'},
{'nothing'},
{'nothing'},
{'message'},
{'message'},
{'message-reported'},
{'message-kick'},
{'message',{'reports.message'},defines.text_color.info},
{'message',{'reports.message'},defines.text_color.info},
{'report',{'reports.reported'},defines.text_color.med},
{'message',{'reports.kick-warn'},defines.text_color.med},
{'kick'},
{'message-temp-ban'},
{'message',{'reports.temp-warn'},defines.text_color.high},
{'temp-ban'},
{'message-ban'},
{'message-last-waring'},
{'message',{'reports.ban-warn'},defines.text_color.high},
{'message',{'reports.last-warn'},defines.text_color.crit},
{'ban'}
}
local actions = {
none=0,
report=1,
jail=2,
kick=3,
temp=4,
ban=5
}
local function valid_players(player,by_player)
local player = Game.get_player(player)
local by_player_name = Game.get_player(by_player) and Game.get_player(by_player).name or '<server>'
local rank = Ranking.get_rank(by_player_name)
return player, by_player_name, rank
end
local function _reports(reset)
global.addons = not reset and global.addons or {}
global.addons.reports = not reset and global.addons.reports or {warnings={},reports={},varified={},actions={}}
@@ -38,49 +55,209 @@ end
local function get_warnings(player)
local player = Game.get_player(player)
return Admin._reports()[player.name] or 0
return _reports().warnings[player.name] or 0
end
local function report_message(player,by_player,reason)
local low_rank = Ranking.get_group('User').highest
local high_rank = Ranking.get_group('Admin').lowest
local player, by_player_name = valid_players(player,by_player)
if not player then return end
if _reports().actions[player.name] == actions.report then return end
Ranking.print(low_rank,{'reports.low-print',player.name,med},defines.text_color.info,true)
Ranking.print(high_rank,{'reports.high-print',player.name,by_player_name,reason},defines.text_color.med)
discord_emit{
title='Player Report',
color=Color.to_hex(defines.text_color.med),
description='There was a player reported.',
['Player:']='<<inline>>'..player.name,
['By:']='<<inline>>'..by_player_name,
['Reason:']=reason
}
end
local function count_reports(player)
-- counts the value of the reports
local player = Game.get_player(player)
if not player then return 0 end
local _count = 0
local data = _reports()
if data.reports[player.name] then
for _,report in pairs(data.reports[player.name]) do
_count=_count+report_to_warnings
end
end
if data.varified[player.name] then
for _,report in pairs(data.varified[player.name]) do
_count=_count+varified_to_warings
end
end
return _count
end
local function cheak_reports(player)
-- jails a player if too many reports
local player = Game.get_player(player)
if not player then return end
local reports = count_reports(player)
if reports >= reports_needed_for_jail and _reports().actions[player.name] ~= 'report-jail' and Ranking.get_rank(player).group.name ~= 'Jail' then
_reports().actions[player.name] = actions.report
Admin.jail(player,'<server>','To many user reports. Contact an Admin to be unjailed.')
discord_emit{
title='Player Report Jail',
color=Color.to_hex(defines.text_color.med),
description='There was a player reported and jailed.',
['Player:']=player.name,
}
end
end
local function give_punishment(player)
-- gives a punishment based on the warnings, or nothing
local function give_punishment(player,reason)
local warnings = get_warnings(player)
local punishment = punishments[warnings]
local reason = reason or 'No Other Reason'
if punishment[1] == 'nothing' then return
elseif punishment[1] == 'message' then
local message = punishment[2]
local colour = punishment[3]
player_return(message,colour,player)
elseif punishment[1] == 'report' then
local message = punishment[2]
local colour = punishment[3]
player_return(message,colour,player)
report_message(player,'<server>',reason)
elseif punishment[1] == 'kick' then
_reports().actions[player.name] = actions.kick
Admin.kick(player,'<server>','Too Many Warnings: '..warnings..' Also: '..reason)
elseif punishment[1] == 'temp-ban' then
_reports().actions[player.name] = actions.temp
Admin.temp_ban(player,'<server>','Too Many Warnings: '..warnings..' Also: '..reason)
elseif punishment[1] == 'ban' then
_reports().actions[player.name] = actions.ban
Admin.ban(player,'<server>','Too Many Warnings: '..warnings..' Also: '..reason)
end
end
function Admin.give_warning(player,by_player,reason)
-- gives a waring, by_player is nil when done by script
function Admin.give_warning(player,by_player,reason,min)
local player, by_player_name = valid_players(player,by_player)
if not player then return end
local min = by_player_name and take_action or min or 0
local warnings = get_warnings(player)
if warnings < min then warnings = min end
warnings = warnings+1
_reports().warnings[player.name] = warnings
give_punishment(player,reason)
end
function Admin.report(player,by_player,reason)
-- reports a user and adds to the right area
local player, by_player_name = valid_players(player,by_player)
if not player or Ranking.get_rank(player):allowed('no-report') then return end
if rank:allowed('varified') then
_reports.varified[player.name] = _reports.varified[player.name] or {}
table.insert(_reports.varified,{by_player_name,reason})
else
_reports.reports[player.name] = _reports.reports[player.name] or {}
table.insert(_reports.reports,{by_player_name,reason})
end
cheak_reports(player)
end
function Admin.clear_warings(player,by_player)
-- clears all warnings
function Admin.clear_warings(player,by_player,no_emit)
local player, by_player_name = valid_players(player,by_player)
if not player then return end
_reports().warnings[player.name]=0
if not no_emit then
discord_emit{
title='Player Clear',
color=Color.to_hex(defines.text_color.low),
description='A player had there warnings cleared.',
['Player:']='<<inline>>'..player.name,
['By:']='<<inline>>'..by_player_name,
}
end
end
function Admin.clear_reports(player,by_player)
-- clears any reports
function Admin.clear_reports(player,by_player,no_emit)
local player, by_player_name = valid_players(player,by_player)
if not player then return end
_reports().reports[player.name]={}
_reports().varified[player.name]={}
if not no_emit then
discord_emit{
title='Player Clear',
color=Color.to_hex(defines.text_color.low),
description='A player had there reports cleared.',
['Player:']='<<inline>>'..player.name,
['By:']='<<inline>>'..by_player_name,
}
end
end
function Admin.clear_player(player,by_player)
-- clears, warnings, reports, jail
local player, by_player_name = valid_players(player,by_player)
if not player then return end
Admin.clear_warings(player,by_player)
Admin.clear_reports(player,by_player)
_reports().actions[player.name]=actions.none
if rank.group.name == 'Jail' then Ranking.revert(player,by_player) end
discord_emit{
title='Player Clear',
color=Color.to_hex(defines.text_color.low),
description='A player had there reports and warnings cleared.',
['Player:']='<<inline>>'..player.name,
['By:']='<<inline>>'..by_player_name,
}
end
function Admin.temp_ban(player,by_player,reason)
-- jails a player and cant be unjailed and custom gui
local function append_name(reason,name)
local reason = reason or 'No Reason'
if not string.find(string.lower(reason),string.lower(name)) then return reason..' - '..name
else return reason end
end
local player, by_player_name = valid_players(player,by_player)
if not player or Admin.is_banned(player) then return end
_reports().actions[player.name] = actions.temp
discord_emit{
title='Player Temp-Ban',
color=Color.to_hex(defines.text_color.med),
description='There was a player jailed.',
['Player:']='<<inline>>'..player.name,
['By:']='<<inline>>'..by_player_name,
['Reason:']=append_name(reason,by_player_name)
}
game.print({'reports.temp-ban',player,by_player_name},defines,text_color.info)
Ranking._presets().last_jail = player.name
Ranking.give_rank(player,'Jail',by_player_name)
end
-- add an on_tick event to slowly remove warnings, faster for higher ranks
function Admin.is_banned(player)
local player=Game.get_player(player)
local action = _reports().actions[player.name]
if action == actions.temp then return 'temp'
elseif action == actions.ban then return true
else return false end
end
-- add warnings to tree decon, then add warnings file to give warnings for diffrent actions
Event.register(defines.events.on_tick,function(event)
if not _reports().remove_warnings_time then
_reports().remove_warnings_time = {}
local highest = nil
for power,rank in pairs(Ranking._rank) do
if not highest and not rank:allowed('no-report') then highest = power+1 end
local _power = power; if highest then _power = highest-power end
if rank:allowed('no-report') then _reports().remove_warnings_time[power] = 0
else _reports().remove_warnings_time[power] = min_time_to_remove_warning*_power end
end
end
if (game.tick % min_time_to_remove_warning) == 0 then
for name,warnings in pairs(_reports().warnings) do
if warnings > 0 then
local rank = Ranking.get_rank(name)
local time_to_remove = _reports().remove_warnings_time[rank.power]
if (game.tick % time_to_remove) == 0 then
_reports().warnings[name]=warnings-1
player_return({'reports.remove-warn',_reports().warnings[name],tick_to_displayer_format(time_to_remove)},defines,text_color.low,name)
end
end
end
end
end)