SneakySquid

Images!

Nov 24th, 2018 (edited)
927
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.63 KB | None | 0 0
  1. local default_avatar = Material("vgui/avatar_default.vtf")
  2.  
  3. local cache_path = "assets/%s.png"
  4. local profile_url = "http://steamcommunity.com/profiles/%s/?xml=1"
  5.  
  6. local cached_avatars = {}
  7. local cached_materials = {}
  8.  
  9. local avatar_patterns = {
  10.     [32] = "<avatarIcon><!%[CDATA%[(.*)%]%]></avatarIcon>",
  11.     [64] = "<avatarMedium><!%[CDATA%[(.*)%]%]></avatarMedium>",
  12.     [184] = "<avatarFull><!%[CDATA%[(.*)%]%]></avatarFull>",
  13. }
  14.  
  15. local FetchImage, FetchAvatar do
  16.     function FetchImage(url, params)
  17.         local url_hash = util.SHA1(url)
  18.  
  19.         if (not cached_materials[url_hash]) then
  20.             local path = string.format(cache_path, url_hash)
  21.  
  22.             cached_materials[url_hash] = Material("data/" .. path, params)
  23.  
  24.             http.Fetch(url, function(data)
  25.                 file.CreateDir("assets")
  26.                 file.Write(path, data)
  27.  
  28.                 local new = Material("data/" .. path, params)
  29.                 cached_materials[url_hash]:SetTexture("$basetexture", new:GetName())
  30.             end)
  31.         end
  32.  
  33.         return cached_materials[url_hash]
  34.     end
  35.  
  36.     function FetchAvatar(id, size, params)
  37.         if (type(id) == "Player") then
  38.             id = id:SteamID64()
  39.         end
  40.  
  41.         if (id == "BOT") then
  42.             return default_avatar
  43.         end
  44.  
  45.         if (not size or size > 64) then
  46.             size = 184
  47.         elseif (size > 32) then
  48.             size = 64
  49.         else
  50.             size = 32
  51.         end
  52.  
  53.         local size_id = string.format("%s_%i", id, size)
  54.  
  55.         if (not cached_avatars[size_id]) then
  56.             cached_avatars[size_id] = Material("Avatar " .. size_id, params)
  57.             cached_avatars[size_id]:SetTexture("$basetexture", default_avatar:GetName())
  58.  
  59.             http.Fetch(string.format(profile_url, id), function(data)
  60.                 local link = string.match(data, avatar_patterns[size])
  61.                 if (not link) then return end
  62.  
  63.                 local new = FetchImage(link, params)
  64.                 cached_avatars[size_id]:SetTexture("$basetexture", new:GetName())
  65.             end)
  66.         end
  67.  
  68.         return cached_avatars[size_id]
  69.     end
  70. end
  71.  
  72. local SetImage, SetAvatar do
  73.     function SetImage(...)
  74.         surface.SetMaterial(FetchImage(...))
  75.     end
  76.  
  77.     function SetAvatar(...)
  78.         surface.SetMaterial(FetchAvatar(...))
  79.     end
  80. end
  81.  
  82. local WebImage, AvatarImage do
  83.     function WebImage(url, x, y, w, h, col)
  84.         SetImage(url)
  85.  
  86.         surface.SetDrawColor(col or color_white)
  87.         surface.DrawTexturedRect(x, y, w, h)
  88.     end
  89.  
  90.     function AvatarImage(id, x, y, w, h, col)
  91.         SetAvatar(id, math.max(w, h))
  92.  
  93.         surface.SetDrawColor(col or color_white)
  94.         surface.DrawTexturedRect(x, y, w, h)
  95.     end
  96. end
  97.  
  98. return {
  99.     FetchImage = FetchImage,
  100.     FetchAvatar = FetchAvatar,
  101.  
  102.     SetImage = SetImage,
  103.     GetImage = FetchImage,
  104.     SetAvatar = SetAvatar,
  105.     GetAvatar = FetchAvatar,
  106.  
  107.     WebImage = WebImage,
  108.     DrawImage = WebImage,
  109.     AvatarImage = AvatarImage,
  110.     DrawAvatar = AvatarImage,
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment