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