2022-09-17 18:43:54 -04:00

122 lines
5.7 KiB
Lua

local discordia=require('discordia')
local API=require('./../strafes_net.lua')
local commands=require('./../commands.lua')
function sleep(n) local t = os.clock() while os.clock()-t <= n do end end
discordia.extensions()
local pad = API.Pad
commands:Add('skill',{},'skill <username|mention|"me"> <game> <style> <sort?=skill|point>', function(t)
local args=t.args
local message=t.message
if not _G.locked then
if #args<3 then return message:reply('usage: `skill <username|mention|"me"> <game> <style> <sort?="skill"|"point">`') end
local user=args[1]
local game=API.GAMES[args[2]]
local style=API.STYLES[args[3]]
if not game then return message:reply('invalid game') end
if not style then return message:reply('invalid style') end
local sort = args[4]
if type(sort)=='string' and sort:lower()~='skill' and sort:lower()~='point' then
return message:reply('invalid sort option, valid options are "skill" or "point"')
elseif sort==nil then
sort = 'skill'
end
print('getting user')
local user = API:GetUserFromAny(user,message)
if type(user)=='string' then return message:reply('```'..user..'```') end
local sn_info = API:GetUser(user.id)
if not sn_info.ID then return message:reply('```No data with StrafesNET is associated with that user.```') end
if sn_info.State==2 then return message:reply('```This user is currently blacklisted```') end
print(user.name,user.id,API.GAMES[game],API.STYLES[style]:lower())
_G.locked = true
_G.current = {name=user.name,game=API.GAMES[game],style=API.STYLES[style]:lower()}
local times = {}
local res,rheaders = API:GetUserTimes(user.id,nil,style,game)
if #res~=0 then
local pages = tonumber(rheaders['Pagination-Count'])
for _,v in next,res do
table.insert(times,v)
end
if pages>1 then
for i=2,pages do
print('getting times page',i)
res,rheaders = API:GetUserTimes(user.id,nil,style,game,i)
for _,v in next,res do
table.insert(times,v)
end
end
end
print('times:',#times)
t.message:reply('ETA: '..(math.floor(#times*3/100))..' minutes '..((#times*3)%60)..' seconds (found '..#times..' times out of '..API.MAPS[game].count..' maps)')
local test_a,test_b = 0,0
for _,time in next,times do
local rank = API:GetTimeRank(time.ID).Rank
local count = tonumber(API:GetMapCompletionCount(time.Map,style))
if not rank or not count then
print('NO RANK OR COUNT')
print(rank,count)
rank = 1
count = 1
end
time.Points = API.CalculatePoint(rank,count)
time.Rank = rank
time.MapCompletionCount = count
time.SkillRaw = rank == 1 and 1 or (count-rank)/(count-1)
time.Skill = API.FormatSkill(time.SkillRaw)
test_a=test_a+(count-rank)
test_b=test_b+(count-1)
end
table.sort(times,sort=='skill' and function(t1,t2)
return t1.SkillRaw<t2.SkillRaw
end or sort=='point' and function(t1,t2)
return t1.Points<t2.Points
end)
local points = 0
for _,time in next,times do
points = points+time.Points
end
local skillFinal = (test_a)/(test_b-1)
local msg = 'Average Skill: '..API.FormatSkill(math.clamp(skillFinal,0,1))..'\n'..
'Points: '..points..'\n'..
pad('Map',50)..' | '..pad('Points')..' | '..pad('Skill',7)..' | '.. pad('Placement',14)..' | Time\n\n'
for _,time in next,times do
-- msg = msg..'['..time.Rank..'/'..time.MapCompletionCount..'] '..time.Map..' ('..time.Skill..')\n'
local mapStr = API.MAPS[game][time.Map].DisplayName..' ('..time.Map..')'
local skill = time.Skill
local point = time.Points
local rankStr = time.Rank..'/'..time.MapCompletionCount
local timeStr = API.FormatTime(time.Time)
msg = msg.. pad(mapStr,50)..' | '..pad(point)..' | '..pad(skill,7)..' | '.. pad(rankStr,14)..' | '..timeStr..'\n'
end
local txt = './skill-'..API.GAMES[game]..'-'..API.STYLES[style]:lower()..'-'..user.name..'.txt'
local file=io.open(txt,'w+')
file:write(msg)
file:close()
message:reply({
file=txt,
reference={
message=message,
mention=true
}
})
os.remove(txt)
_G.locked = false
else
message:reply('```No times found for that user.```')
_G.locked = false
end
else
--_G.current = {name=user.name,game=API.GAMES[game],style=API.STYLES[style]:lower()}
message:reply('Bot is currently in use, please try again later ('.._G.current.name..' for '.._G.current.game..' in '.._G.current.style..')')
end
end)
commands:Add('compare',{},'compare n1 n2', function(t)
local args=t.args
local message=t.message
local n1 = args[1]
local n2 = args[2]
local compared = API.CalculateDifference(n1,n2)
local compared_percent = API.CalculateDifferencePercent(n1,n2)
message:reply(tostring(compared)..' ('..compared_percent..')')
end)