Advertisement
CapsAdmin

Untitled

Jan 22nd, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.51 KB | None | 0 0
  1. websocket_panel = websocket_panel or NULL
  2. if websocket_panel:IsValid() then websocket_panel:Remove() end
  3.  
  4. local i = 0
  5. local sockets = {}
  6.  
  7. local function create_html_panel()
  8.     local pnl = vgui.Create("DHTML")
  9.     websocket_panel = pnl
  10.    
  11.     pnl:AddFunction("websocket", "Event", function(id, event, val)
  12.         if id == 0 then
  13.             if event == "error" then
  14.                 ErrorNoHalt(val .. "\n")
  15.                 return
  16.             end
  17.         end
  18.        
  19.         print(i, id, event, val)
  20.    
  21.         local socket = sockets[id] or NULL
  22.         if socket:IsValid() and socket[event] then
  23.             socket[event](socket, val)
  24.         end
  25.     end)
  26.     pnl:SetSize(50, 50)
  27.     pnl:SetPos(50, 50)
  28.    
  29.     pnl:QueueJavascript([[
  30.     var sockets = []
  31.     var i = 0
  32.        
  33.     function SocketEvent(id, event, val)
  34.     {
  35.         try
  36.         {
  37.             var socket = sockets[id]
  38.             if (val)
  39.             {
  40.                 if (event == "send")
  41.                 {
  42.                     socket.send(val)
  43.                 }
  44.                 else if (event == "close")
  45.                 {
  46.                     socket.close()
  47.                 }
  48.             }
  49.         }
  50.         catch(err)
  51.         {
  52.             websocket.Event(0, "error", err.message)
  53.         }
  54.     }
  55.        
  56.     function CreateSocket(url)
  57.     {
  58.         try
  59.         {
  60.             i++
  61.        
  62.             var id = i
  63.        
  64.             var socket = new WebSocket(url)
  65.             sockets[id] = socket
  66.            
  67.             socket.onmessage = function(event) { websocket.Event(id, "OnMessage", event.data) }
  68.             socket.onopen = function(event) { websocket.Event(id, "OnOpen") }
  69.             socket.onclose = function() { websocket.Event(id, "OnClose") }
  70.            
  71.             websocket.Event("OnCreated", id)
  72.         }
  73.         catch(err)
  74.         {
  75.             websocket.Event(0, "error", err.message)
  76.         }
  77.     }
  78.     ]])
  79. end
  80.  
  81. local META = {}
  82. META.__index = META
  83.  
  84. function META:__tostring()
  85.     return string.format("websocket[%i]", self.id)
  86. end
  87.  
  88. function META:IsValid()
  89.     return true
  90. end
  91.  
  92. function META:Send(data)
  93.     websocket_panel:QueueJavascript(("SocketEvent(%i, %q, %q)"):format(self.id, "send", data))
  94. end
  95.  
  96. function META:Remove()
  97.     sockets[self.id] = nil
  98.     websocket_panel:QueueJavascript(("SocketEvent(%i, %q)"):format(self.id, "close"))
  99.     setmetatable(self, getmetatable(NULL))
  100.    
  101.     if table.Count(sockets) == 0 then
  102.         websocket_panel:Remove()
  103.     end
  104. end
  105.  
  106. function WebSocket(url)
  107.     if not websocket_panel:IsValid() then
  108.         create_html_panel()
  109.     end
  110.    
  111.     i = i + 1
  112.    
  113.     websocket_panel:QueueJavascript(("CreateSocket(%q)"):format(url))
  114.    
  115.     local socket = setmetatable({id = i}, META)
  116.     sockets[i] = socket
  117.    
  118.     return socket
  119. end
  120.  
  121. function GetAllWebSockets()
  122.     local out = {}
  123.     for key, val in pairs(sockets) do
  124.         table.insert(out, val)
  125.     end
  126.     return out
  127. end
  128.  
  129. -- !lm test = WebSocket("ws://node.remysharp.com:8001") test.OnMessage = Say
  130. -- !lm test:Send("hello world")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement