Cuberite Forum
Multi-callback table as class - Printable Version

+- Cuberite Forum (https://forum.cuberite.org)
+-- Forum: Plugins (https://forum.cuberite.org/forum-1.html)
+--- Forum: Plugin Discussion (https://forum.cuberite.org/forum-8.html)
+--- Thread: Multi-callback table as class (/thread-2062.html)



Multi-callback table as class - NiLSPACE - 07-18-2015

Can plugins currently create classes instead of simple tables for multi callbacks like the network callbacks. An example is the nether portal scanner in the source code (though currently chunkstay doesn't use a table, but simply a parameter for each callback). If we'd want the same the callbacks would have to give their own table as a parameter I believe.

After creating the class you could simply give the object as a parameter for a function.

I'll describe a use-case. Currently when doing network request where you need to have the complete return body you append the data to a variable. Take for example the WorldEdit update class. (local variable, append data). This means you can't do multiple requests at once as the from multiple requests would be mixed together in some Frankensteins monster.

If instead you could have a class with a member variable that would make this allot easier. The updater callbacks from WorldEdit would look a little like this:

local CheckForNewerVersionCallbacks = {}

function CheckForNewerVersionCallbacks:new()
	local obj = {}
	setmetatable(obj, CheckForNewerVersionCallbacks)
	self.__index = self
	
	-- Member variable containing all the received data
	obj.m_ReceivedPluginInfo = ""
	
	return obj
end

function CheckForNewerVersionCallbacks:OnConnected(a_TCPLink)
	local res, msg = a_TCPLink:StartTLSClient()
	a_TCPLink:Send("GET /cuberite/WorldEdit/master/Info.lua HTTP/1.0\r\nHost: raw.githubusercontent.com\r\n\r\n")
end
	
function CheckForNewerVersionCallbacks:OnError(a_TCPLink, a_ErrorCode, a_ErrorMsg) 
	LOGWARNING("Error while checking for newer WorldEdit version: " .. a_ErrorMsg)
end
	
function CheckForNewerVersionCallbacks:OnReceivedData(a_TCPLink, a_Data)
	self.m_ReceivedPluginInfo = self.m_ReceivedPluginInfo .. a_Data
end
	
function CheckForNewerVersionCallbacks:OnRemoteClosed(a_TCPLink)
	-- Do something with the data now that we've received everything.
	cUpdater:ParseResults(self.m_ReceivedPluginInfo)
end



-- Start a network request
cNetwork:Connect("raw.githubusercontent.com", 443, CheckForNewerVersionCallbacks:new())



RE: Multi-callback table as class - xoft - 08-23-2016

This will be implemented for the cUrlClient callbacks.

Not sure if I should change the cNetwork bindings to do that as well, because it would break existing code (the functions need an invisible extra parameter, "self").


RE: Multi-callback table as class - NiLSPACE - 08-23-2016

Perhaps it's possible to detect if a function was created with a colon?


RE: Multi-callback table as class - xoft - 08-23-2016

No, unfortunately there's no way to distinguish those cases.


RE: Multi-callback table as class - NiLSPACE - 08-23-2016

How many plugins currently use the network API? All I can think of from the top of my head is my WorldEdit plugin (which will use the cUrlClient instead), your GalExport plugin and the DockerCraft plugin (though I don't think they've continued working on their implementation)


RE: Multi-callback table as class - xoft - 08-23-2016

There's always a possibility of having multiple API function signatures and decide based upon those. Such as "If there's an extra bool param, use the object-oriented callbacks".


RE: Multi-callback table as class - NiLSPACE - 08-23-2016

I guess that could work. We could also log a warning to try to get people over to OO callbacks.


RE: Multi-callback table as class - xoft - 08-24-2016

Heh, even easier than that. We could just swap the current parameters - each of the cNetwork functions takes *something* and callbacks. So if it receives callbacks and *something* instead, it will assume the OO callbacks.