Template:ScriptingExamples/UtilityCode/Lua/getClientFromText

From GTA Connected
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

function getClientFromText(text)

   local clients = getClients()
   local textLower = text:lower()
   local textLength = text:len()
   -- player id
   local textNumber = tonumber(text, 10)
   if textNumber then
       for i,client in ipairs(clients) do
           if client.player.id == textNumber then
               return client
           end
       end
   end
   -- player full name (case-insensitive)
   for i,client in ipairs(clients) do
       if client.player.name:lower() == textLower then
           return client
       end
   end
   -- player partial name (case-insensitive)
   for i,client in ipairs(clients) do
       if client.player.name:lower():find(textLower, 1, true) then
           return client
       end
   end
   -- nearest player name match (case-insensitive)
   local charMatchCounts = {}
   for i,client in ipairs(clients) do
       local playerNameChars = {}
       local playerNameLower = client.player.name:lower()
       local playerNameLength = client.player.name:len()
       for i2=1, playerNameLength do
           table.insert(playerNameChars, playerNameLower:sub(i2, i2))
       end
       local charMatchCount = 0
       local playerNameCharIndex
       for i2=1, textLength do
           playerNameCharIndex = false
           local textChar = textLower:sub(i2, i2)
           for i3,playerNameChar in ipairs(playerNameChars) do
               if textChar == playerNameChar then
                   charMatchCount = charMatchCount + 1
                   playerNameCharIndex = i3
                   break
               end
           end
           if playerNameCharIndex then
               table.remove(playerNameChars, playerNameCharIndex)
           end
       end
       charMatchCounts[i] = { client, charMatchCount / playerNameLength }
   end
   local highestCharMatchCount = 0
   local highestCharMatchCountClient
   for i,data in ipairs(charMatchCounts) do
       if data[2] > highestCharMatchCount then
           highestCharMatchCount = data[2]
           highestCharMatchCountClient = data[1]
       end
   end
   if highestCharMatchCountClient then
       return highestCharMatchCountClient
   end
   -- no match
   return false

end