From f4612a7046ecfd3c971c065595889cfa04a0addb Mon Sep 17 00:00:00 2001 From: grilledham Date: Sat, 24 Nov 2018 14:15:14 +0000 Subject: [PATCH] more functions --- control.lua | 32 ++++++++++++++ server.lua | 100 +++++++++++++++++++++++++++++++++++++++++++- server_commands.lua | 8 ++++ 3 files changed, 139 insertions(+), 1 deletion(-) diff --git a/control.lua b/control.lua index a1f771aa..9a4b8417 100644 --- a/control.lua +++ b/control.lua @@ -47,3 +47,35 @@ require 'features.gui.blueprint_helper' require 'features.gui.paint' require 'features.gui.score' require 'features.gui.popup' + +Server.on_data_set_changed( + 'Test', + function(data) + game.print(serpent.block(data)) + end +) + +Server.on_data_set_changed( + 'Test 2', + function(data) + game.print(serpent.block(data)) + end +) + +Server.on_data_set_changed( + 'Test,2', + function(data) + game.print(serpent.block(data)) + end +) + +local Event = require('utils.event') +Event.add( + Server.events.on_server_started, + function(tbl) + game.print('on_server_started') + print('on_server_started') + game.print(serpent.block(tbl)) + print(serpent.block(tbl)) + end +) diff --git a/server.lua b/server.lua index e76753b2..25de18ca 100644 --- a/server.lua +++ b/server.lua @@ -1,4 +1,5 @@ local Token = require 'utils.global_token' +local Event = require 'utils.event' local Public = {} @@ -21,9 +22,19 @@ local regular_deomote_tag = '[REGULAR-DEOMOTE]' local donator_set_tag = '[DONATOR-SET]' local start_scenario_tag = '[START-SCENARIO]' local ping_tag = '[PING]' +local data_set_tag = '[DATA-SET]' +local data_get_tag = '[DATA-GET]' +local data_get_all_tag = '[DATA-GET-ALL]' +local data_tracked_tag = '[DATA-TRACKED]' Public.raw_print = raw_print +local data_set_handlers = {} + +defines.events.on_server_started = script.generate_event_name() + +Public.events = {on_server_started = defines.events.on_server_started} + function Public.to_discord(message) raw_print(discord_tag .. message) end @@ -100,7 +111,7 @@ local default_ping_token = local now = game.tick local diff = now - sent_tick - local message = table.concat({'Ping in ', diff, ' ticks ', 'sent: ', sent_tick, ' received: ', now}) + local message = table.concat({'Pong in ', diff, ' tick(s) ', 'sent tick: ', sent_tick, ' received tick: ', now}) game.print(message) end ) @@ -110,4 +121,91 @@ function Public.ping(func_token) raw_print(message) end +function Public.set_data(data_set, key, value) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + if type(key) ~= 'string' then + error('key must be a string') + end + + local message + local vt = type(value) + if vt == 'nil' then + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '"}'}) + elseif vt == 'string' then + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"\\"', value, '\\""}'}) + elseif vt == 'number' or vt == 'boolean' then + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"', value, '"}'}) + elseif vt == 'function' then + error('value cannot be a function') + else + value = serpent.line(value) + message = table.concat({data_set_tag, '{data_set:"', data_set, '",key:"', key, '",value:"', value, '"}'}) + end + + raw_print(message) +end + +local function data_set_changed(data) + local handlers = data_set_handlers[data.data_set] + if handlers == nil then + return + end + + if _DEBUG then + for _, handler in ipairs(handlers) do + local success, err = pcall(handler, data) + if not success then + log(err) + error(err) + end + end + else + for _, handler in ipairs(handlers) do + local success, err = pcall(handler, data) + if not success then + log(err) + end + end + end +end + +function Public.on_data_set_changed(data_set, handler) + if type(data_set) ~= 'string' then + error('data_set must be a string') + end + + local handlers = data_set_handlers[data_set] + if handlers == nil then + handlers = {handler} + data_set_handlers[data_set] = handlers + else + table.insert(handlers, handler) + end +end + +Public.raise_data_set = data_set_changed + +function Public.get_tracked_data_sets() + local message = {data_tracked_tag, '['} + + for k, _ in pairs(data_set_handlers) do + table.insert(message, '"') + table.insert(message, k) + table.insert(message, '"') + table.insert(message, ',') + end + + if message[#message] == ',' then + table.remove(message) + end + + table.insert(message, ']') + + message = table.concat(message) + raw_print(message) + game.print(message) +end + return Public diff --git a/server_commands.lua b/server_commands.lua index ad00f363..7f47b95d 100644 --- a/server_commands.lua +++ b/server_commands.lua @@ -1,6 +1,7 @@ local Poll = require 'features.gui.poll' local UserGroups = require 'features.user_groups' local Token = require 'utils.global_token' +local Server = require 'server' local Public = {} @@ -17,4 +18,11 @@ function Public.raise_callback(func_token, data) func(data) end +Public.raise_data_set = Server.raise_data_set +Public.get_tracked_data_sets = Server.get_tracked_data_sets + +function Public.server_started() + script.raise_event(Server.events.on_server_started, {}) +end + return Public