SneakySquid icon

Images!

SneakySquid | PRO | 01/05/25 07:52:07 PM UTC (Edited) | 0 ⭐ | 881 👁️ | Never ⏰ | []
Lua |

2.63 KB

|

None

|

0 👍

/

0 👎

local default_avatar = Material("vgui/avatar_default.vtf")
 
local cache_path = "assets/%s.png"
local profile_url = "http://steamcommunity.com/profiles/%s/?xml=1"
 
local cached_avatars = {}
local cached_materials = {}
 
local avatar_patterns = {
    [32] = "<avatarIcon><!%[CDATA%[(.*)%]%]></avatarIcon>",
    [64] = "<avatarMedium><!%[CDATA%[(.*)%]%]></avatarMedium>",
    [184] = "<avatarFull><!%[CDATA%[(.*)%]%]></avatarFull>",
}
 
local FetchImage, FetchAvatar do
    function FetchImage(url, params)
        local url_hash = util.SHA1(url)
 
        if (not cached_materials[url_hash]) then
            local path = string.format(cache_path, url_hash)
 
            cached_materials[url_hash] = Material("data/" .. path, params)
 
            http.Fetch(url, function(data)
                file.CreateDir("assets")
                file.Write(path, data)
 
                local new = Material("data/" .. path, params)
                cached_materials[url_hash]:SetTexture("$basetexture", new:GetName())
            end)
        end
 
        return cached_materials[url_hash]
    end
 
    function FetchAvatar(id, size, params)
        if (type(id) == "Player") then
            id = id:SteamID64()
        end
 
        if (id == "BOT") then
            return default_avatar
        end
 
        if (not size or size > 64) then
            size = 184
        elseif (size > 32) then
            size = 64
        else
            size = 32
        end
 
        local size_id = string.format("%s_%i", id, size)
 
        if (not cached_avatars[size_id]) then
            cached_avatars[size_id] = Material("Avatar " .. size_id, params)
            cached_avatars[size_id]:SetTexture("$basetexture", default_avatar:GetName())
 
            http.Fetch(string.format(profile_url, id), function(data)
                local link = string.match(data, avatar_patterns[size])
                if (not link) then return end
 
                local new = FetchImage(link, params)
                cached_avatars[size_id]:SetTexture("$basetexture", new:GetName())
            end)
        end
 
        return cached_avatars[size_id]
    end
end
 
local SetImage, SetAvatar do
    function SetImage(...)
        surface.SetMaterial(FetchImage(...))
    end
 
    function SetAvatar(...)
        surface.SetMaterial(FetchAvatar(...))
    end
end
 
local WebImage, AvatarImage do
    function WebImage(url, x, y, w, h, col)
        SetImage(url)
 
        surface.SetDrawColor(col or color_white)
        surface.DrawTexturedRect(x, y, w, h)
    end
 
    function AvatarImage(id, x, y, w, h, col)
        SetAvatar(id, math.max(w, h))
 
        surface.SetDrawColor(col or color_white)
        surface.DrawTexturedRect(x, y, w, h)
    end
end
 
return {
    FetchImage = FetchImage,
    FetchAvatar = FetchAvatar,
 
    SetImage = SetImage,
    GetImage = FetchImage,
    SetAvatar = SetAvatar,
    GetAvatar = FetchAvatar,
 
    WebImage = WebImage,
    DrawImage = WebImage,
    AvatarImage = AvatarImage,
    DrawAvatar = AvatarImage,
}
 

Comments