Skip to content

Example: Queuing Data To Client

Seppi edited this page Jun 13, 2016 · 4 revisions

To queue data from the server, we make use of an index.

In this example, we will queue chat messages to all clients.

For the server:

lovernetlib = require('lovernet')
lovernet = lovernetlib.new{type=lovernetlib.mode.server}

lovernet:addOp('g') -- (g)etMessages .. use single character to reduce bandwidth
lovernet:addValidateOnServer('g','number')
lovernet:addProcessOnServer('g',function(self,peer,arg,storage)
  storage.chat = storage.chat or {}
  local ret = {}
  for _,line in pairs(storage.chat) do
    if line.index > arg then
      table.insert(ret,{i=line.index,t=line.text})
    end
  end
  return ret
end)

lovernet:addOp('s') -- (s)endMessage .. use single character to reduce bandwidth
lovernet:addValidateOnServer('s',{t='string'})
lovernet:addProcessOnServer('s',function(self,peer,arg,storage)
  storage.chat = storage.chat or {}
  storage.current_index = (storage.current_index or 0) + 1
  table.insert(storage.chat,{index=storage.current_index,text=arg.t})
end)

function love.update(dt)
  lovernet:update(dt)
end

For the client:

lovernetlib = require('lovernet')
lovernet = lovernetlib.new()
lovernet:addOp('s')
lovernet:addOp('g')

chat = {}

function love.keypressed(key)
  if key == "return" then
    lovernet:pushData('s',{t=textinput})
    textinput = nil
  end
end

function love.textinput(char)
  textinput = (textinput or "") .. char
end

function love.update(dt)

  lovernet:sendData('g',chat_index or 0)

  if lovernet:getCache('g') then
    for _,message in pairs(lovernet:getCache('g')) do
      chat_index = math.max(message.i,chat_index or 0)
      table.insert(chat,message.t)
    end
    lovernet:clearCache('g')
  end

  lovernet:update(dt)

end

function love.draw()
  love.graphics.print(textinput or "")
  for i,text in pairs(chat) do
    love.graphics.print(text,0,i*16)
  end
end

Clone this wiki locally