commit d23fb2b07f151b41d33657963ff613674c546690 Author: Sergiusz 'q3k' BazaƄski Date: Sat Sep 21 23:33:14 2013 +0200 First commit. Oh my. It's been such a long time since I wrote hook and plugin and general system wankery in Lua. Ah, the good ol' Garry's Mod days. I kind of miss them. Or maybe not. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9568ca --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*swp diff --git a/core/hook.lua b/core/hook.lua new file mode 100644 index 0000000..f3f01a6 --- /dev/null +++ b/core/hook.lua @@ -0,0 +1,31 @@ +hook = {} +hook.Hooks = {} + +function hook.Add(event_name, hook_name, callback) + if hook.Hooks[event_name] == nil then + hook.Hooks[event_name] = {} + end + hook.Hooks[event_name][hook_name] = callback +end + +function hook.Call(event_name, ...) + local Args = {...} + if hook.Hooks[event_name] == nil then + return + end + for K, Function in pairs(hook.Hooks[event_name]) do + if type(Function) == 'function' then + local Return = Function(unpack(Args)) + if Return == false then + return + end + end + end +end + +function hook.Remove(event_name, hook_name) + if hook.Hooks[event_name] == nil then + return + end + hook.Hooks[event_name][hook_name] = nil +end diff --git a/core/reactor.lua b/core/reactor.lua new file mode 100644 index 0000000..81aadd0 --- /dev/null +++ b/core/reactor.lua @@ -0,0 +1,41 @@ +local socket = require('socket') + +reactor = {} + +function reactor:Initialize(quantum) + self._read_sockets = {} + self._write_sockets = {} + self._quantum = quantum or 0.1 +end + +function reactor:Run() + local read = {} + for Socket, V in pairs(self._read_sockets) do + read[#read+1] = Socket + end + local write = {} + for Socket, V in pairs(self._write_sockets) do + read[#read+1] = Socket + end + + local r, w, e = socket.select(read, write, self._quantum) + if e == nil then + -- we actually got something on our sockets + for Socket, Data in pairs(self._read_sockets) do + if r[Socket] ~= nil then + local Callback = Data[1] + local Args = Data[2] + Callback(unpack(Args)) + hook.Call('SocketDataReceived', Socket) + end + end + for Socket, Data in pairs(self._write_sockets) do + if w[Socket] ~= nil then + local Callback = Data[1] + local Args = Data[2] + Callback(unpack(Args)) + end + end + end + hook.Call('ReactorTick') +end diff --git a/start.lua b/start.lua new file mode 100644 index 0000000..b77c2f0 --- /dev/null +++ b/start.lua @@ -0,0 +1,5 @@ +require('core.hook') +require('core.reactor') + + +reactor:Initialize()