artemx32

GShare shared

Aug 7th, 2021
423
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.48 KB | None | 0 0
  1. if CLIENT then
  2.     local GShare = { }
  3.     GShare.STRING = 'GShare.stream'
  4.     GShare.Crop = false
  5.     GShare.Bounds = { }
  6.     GShare.Container = { }
  7.     GShare.RT = GetRenderTarget("GShareRenderer", 300, 300, false)
  8.     GShare.Key = 'wC2Gs@cHG_artybyte_gBLcW7@d$s^'
  9.     GShare.RTMAT = CreateMaterial("GShareMat","UnlitGeneric",{
  10.     ['$basetexture'] = GShare.RT:GetName(),
  11.     });
  12.     GShare.Net = function(t)
  13.         net.Start(GShare.STRING)
  14.         net.WriteTable(t)
  15.         net.SendToServer()
  16.     end
  17.     GShare.DisplayScreenshot = function(url)
  18.         local f = vgui.Create('DFrame')
  19.         f:SetSize(500, 500)
  20.         f:Center()
  21.         f:SetSizable(true)
  22.         f:MakePopup()
  23.         local h = vgui.Create('DHTML', f)
  24.         h:Dock(FILL)
  25.         h:OpenURL(url)
  26.     end
  27.     GShare.InitContainer = function()
  28.         for i = 1, GShare.Bounds[3] do
  29.             GShare.Container[i] = { }
  30.             for j = 1, GShare.Bounds[4] do
  31.                 GShare.Container[i][j] = { }
  32.             end
  33.         end
  34.     end
  35.     GShare.ShowShareWindow = function(url)
  36.         local f = vgui.Create('DFrame')
  37.         f:SetSize(100,200)
  38.         f:Center()
  39.         f:MakePopup()
  40.         local ds = vgui.Create('DScrollPanel', f)
  41.         ds:SetSize(100,180)
  42.         ds:SetPos(0, 20)
  43.         for i, kv in pairs(player.GetHumans()) do
  44.             local b = vgui.Create('DButton', f)
  45.             b:SetPos(10, 20+i*15)
  46.             b:SetSize(80, 14)
  47.             b:SetText(kv:Nick())
  48.             b.DoClick = function()
  49.                 GShare.Net({'share_screenshot', LocalPlayer():SteamID(), kv:SteamID(), url})
  50.                 f:Close()
  51.             end
  52.         end
  53.     end
  54.     GShare.PostPixelData = function(tbl)
  55.         local function post(descr)
  56.             local readyJSON = util.TableToJSON(tbl)
  57.             local readyData = util.Base64Encode(readyJSON)
  58.             local sid = LocalPlayer():SteamID()
  59.             local nick = LocalPlayer():Nick()
  60.             http.Post( "http://91.122.14.185:11111/saveimage",
  61.                 {
  62.                     key = GShare.Key,
  63.                     pixeldata = readyData,
  64.                     width = tostring(GShare.Bounds[3]),
  65.                     height = tostring(GShare.Bounds[4]),
  66.                     sid = sid,
  67.                     username = nick,
  68.                     description = descr
  69.                 },
  70.                 -- onSuccess function
  71.                 function( req, length, headers, code )
  72.                     GShare.ShowShareWindow(req)
  73.                 end,
  74.                 -- onFailure function
  75.                 function( message )
  76.                     chat.AddText(Color(255,0,255), 'GShare: ' .. tostring(message))
  77.                 end
  78.             )
  79.         end
  80.         local f = vgui.Create('DFrame')
  81.         f:SetSize(350,50)
  82.         f:Center()
  83.         f:SetTitle('Enter description')
  84.         f:MakePopup()
  85.         local t = vgui.Create('DTextEntry', f)
  86.         t:SetPos(10, 24)
  87.         t:SetSize(f:GetWide()-80, f:GetTall()*0.4)
  88.         t:RequestFocus()
  89.         t.OnEnter = function() f:Close(); post(t:GetValue()) end
  90.         local b = vgui.Create('DButton', f)
  91.         b:SetPos(f:GetWide() - 70, 24)
  92.         b:SetSize(60, f:GetTall()*0.4)
  93.         b:SetText('Send')
  94.         b.DoClick = t.OnEnter
  95.     end
  96.     GShare.DataMapping = function()
  97.         -- first: convert RGB to 0xRRGGBBAA
  98.         -- init temporary table
  99.         local temp = { }
  100.         for i = 1, GShare.Bounds[3] do
  101.             temp[i] = { }
  102.             for j = 1, GShare.Bounds[4] do
  103.                 temp[i][j] = { }
  104.             end
  105.         end
  106.         for i = 1, GShare.Bounds[3] do
  107.             for j = 1, GShare.Bounds[4] do
  108.                 local c = GShare.Container[i][j]
  109.                 local _r = string.format('%02x', c[1])
  110.                 local _g = string.format('%02x', c[2])
  111.                 local _b = string.format('%02x', c[3])
  112.                 temp[i][j] = '0x' .. tostring(_r) .. tostring(_g) .. tostring(_b) .. 'FF'
  113.             end
  114.         end
  115.         -- send pixeldata to server
  116.         GShare.PostPixelData(temp)
  117.     end
  118.     GShare.ReadPixels = function()
  119.         -- re-create table of container with new given size
  120.         GShare.InitContainer()
  121.         -- call hook to scan pixels
  122.         hook.Add('PostRenderVGUI', 'GShare.ReadPixels', function( )
  123.             render.CapturePixels()
  124.             for w = 1, GShare.Bounds[3] do
  125.                 for h = 1, GShare.Bounds[4] do
  126.                     local r, g, b = render.ReadPixel( GShare.Bounds[1] + w, GShare.Bounds[2] + h )
  127.                     GShare.Container[w][h] = { r, g, b }
  128.                 end
  129.             end
  130.             GShare.DataMapping()
  131.             hook.Remove('PostRenderVGUI', 'GShare.ReadPixels')
  132.         end )
  133.     end
  134.     GShare.FlipCorners = function(px, py, ppx, ppy)
  135.         local lux, luy, rlx, rly = 0, 0, 0, 0
  136.         local rux, ruy, llx, lly = 0, 0, 0, 0
  137.         -- 1st quarter
  138.         if ppx > px and ppy < py then
  139.             -- left upper
  140.             local lux, luy = px, ppy
  141.             -- right lower
  142.             local rlx, rly = ppx, py
  143.             px = lux
  144.             py = luy
  145.             ppx = rlx
  146.             ppy = rly
  147.         end
  148.         -- 2st quarter
  149.         if ppx < px and ppy < py then
  150.             -- left lower
  151.             local llx, lly = ppx, py
  152.             -- right upper
  153.             local rux, ruy = px, ppy
  154.             px = llx
  155.             py = ruy
  156.             ppx = rux
  157.             ppy = lly
  158.         end
  159.         -- 3st quarter
  160.         if ppx < px and ppy > py then
  161.             -- left upper
  162.             local lux, luy = ppx, py
  163.             -- right lower
  164.             local rlx, rly = px, ppy
  165.             px = lux
  166.             py = luy
  167.             ppx = rlx
  168.             ppy = rly
  169.         end
  170.         -- 4th quarter
  171.         if ppx > px and ppy > py then
  172.             -- right upper
  173.             local rux, ruy = ppx, py
  174.             -- left lower
  175.             local llx, lly = px, ppy
  176.             px = llx
  177.             py = ruy
  178.             ppx = rux
  179.             ppy = lly
  180.         end
  181.         return px, py, ppx, ppy
  182.     end
  183.     GShare.OpenCropWindow = function()
  184.         if GShare.Crop then return end
  185.         GShare.Crop = true
  186.  
  187.         local pnl = vgui.Create('DPanel')
  188.         pnl:SetPos(0, 0)
  189.         pnl:SetSize(ScrW(), ScrH())
  190.         pnl:MakePopup()
  191.         local pressed = false
  192.         local prsd = false
  193.         local capturing = false
  194.         local px, py, ppx, ppy = 0, 0, 0, 0
  195.         pnl.Think = function()
  196.             if input.IsMouseDown(107) and not pressed then
  197.                 prsd = false
  198.                 pressed = true
  199.                 capturing = true
  200.                 px, py = input.GetCursorPos()
  201.             end
  202.  
  203.             if not input.IsMouseDown(107) and prsd != pressed then
  204.  
  205.                 pressed = false
  206.                 capturing = false
  207.  
  208.                 ppx, ppy = input.GetCursorPos()
  209.  
  210.                 -- 4th quarters --
  211.                 -- simple algorythm to fix coords (make: LEFT_UPPER-RIGHT_LOWER vector in all of 4 cases)
  212.  
  213.                 px, py, ppx, ppy = GShare.FlipCorners(px, py, ppx, ppy)
  214.  
  215.                 local sizeW, sizeH = ppx - px, ppy - py
  216.  
  217.                 GShare.Bounds = { px, py, sizeW, sizeH }
  218.  
  219.                 GShare.Crop = false
  220.                 pnl:Remove()
  221.  
  222.                 GShare.ReadPixels()
  223.  
  224.             end
  225.  
  226.         end
  227.         pnl.Paint = function(self, w, h)
  228.  
  229.             draw.NoTexture()
  230.             surface.SetDrawColor(255,0,0,140)
  231.             local ppx, ppy = input.GetCursorPos()
  232.             local PX, PY, PPX, PPY = GShare.FlipCorners(px, py, ppx, ppy)
  233.             local _w, _h = PPX-PX, PPY-PY
  234.             if pressed then
  235.                 -- horizontal lines
  236.                 surface.DrawRect(PX, PY, _w-1, 1)
  237.                 surface.DrawRect(PX, PY+_h-2, _w-1, 1)
  238.                 -- vertical lines
  239.                 surface.DrawRect(PX, PY, 1, _h-1)
  240.                 surface.DrawRect(PX+_w-2, PY, 1, _h-1)
  241.                 -- bottom size panel
  242.                 surface.SetDrawColor(0, 0, 0, 180)
  243.                 surface.DrawRect(PX, PY + _h - 20, _w, 20)
  244.                 draw.SimpleText(string.format('start [%d,%d], end [%d, %d]', PX, PY, PPX, PPY), 'DermaDefault', PX + _w/2, PY + _h - 10, Color(255,255,255), 1, 1)
  245.             end
  246.         end
  247.         chat.AddText(Color(200,50,170), 'Select rectangle to make screenshot')
  248.     end
  249.     GShare.Receive = function()
  250.         local t = net.ReadTable()
  251.         local cmd = t[1]
  252.         if cmd == 'open_crop_window' then
  253.             GShare.OpenCropWindow()
  254.         elseif cmd == 'open_screenshot_by_share' then
  255.             local caller = t[2]
  256.             local url = t[3]
  257.             local caller_ply = player.GetBySteamID(caller)
  258.             local f = vgui.Create('DFrame')
  259.             f:SetSize(400, 80)
  260.             f:Center()
  261.             f:MakePopup()
  262.             local l = vgui.Create('DLabel', f)
  263.             l:SetPos(25, 30)
  264.             l:SetText('Player ' .. tostring(caller_ply:Nick()) .. ' wanna show you screenshot. Accept? ')
  265.             l:SetSize(350, 30)
  266.             local b = vgui.Create('DButton', f)
  267.             b:SetSize(50, 18)
  268.             b:Center()
  269.             b:SetPos(select(1, b:GetPos()), 55)
  270.             b:SetText('Show')
  271.             b.DoClick = function()
  272.                 GShare.DisplayScreenshot(url)
  273.                 f:Close()
  274.             end
  275.         end
  276.     end
  277.     -- init script
  278.     hook.Add('InitPostEntity', 'GShare.init', GShare.Init)
  279.     -- receive networks
  280.     net.Receive(GShare.STRING, GShare.Receive)
  281.     concommand.Add('gshare', GShare.OpenCropWindow)
  282. end
  283. if SERVER then
  284.     local GShare = { }
  285.     GShare.STRING = 'GShare.stream'
  286.     GShare.cmd = '!gs'
  287.     GShare.Receive = function()
  288.         local t = net.ReadTable()
  289.         local cmd = t[1]
  290.         if cmd == 'share_screenshot' then
  291.             local caller = t[2]
  292.             local tar = t[3]
  293.             local url = t[4]
  294.             local sendTo = player.GetBySteamID(tar)
  295.             GShare.Net({'open_screenshot_by_share', caller, url}, sendTo)
  296.         end
  297.     end
  298.     GShare.Net = function(t, ply)
  299.         net.Start(GShare.STRING)
  300.             net.WriteTable(t)
  301.         if ply == nil then
  302.             net.Broadcast()
  303.         else
  304.             net.Send(ply)
  305.         end
  306.     end
  307.     GShare.Chat = function(ply, text)
  308.         if string.Trim(text, ' ') == GShare.cmd then
  309.             print(ply, ' used a GShare')
  310.             GShare.Net({'open_crop_window'}, ply)
  311.             return ''
  312.         end
  313.     end
  314.     -- init network
  315.     util.AddNetworkString(GShare.STRING)
  316.     -- start receiving networks
  317.     net.Receive('GShare.stream', GShare.Receive)
  318.     -- catch player messages
  319.     hook.Add('PlayerSay', 'GShare.psay', GShare.Chat)
  320. end
Add Comment
Please, Sign In to add comment