1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/features/scenario_data_manipulation.lua
RedRafe 26e1c28dc0
Factorio 2.0 update (#1436)
* Init Factorio 2.0 update

* add credits

* fix test module

* I know luackeck, I know

* Fixes

* Fix bad event.player_index handling

* Hotfixes

* Remove all filter inserters

* Migrate removed items

* Deprecating spidertron control and landfill features
2024-10-22 20:22:35 +01:00

299 lines
7.6 KiB
Lua

local Server = require 'features.server'
local Token = require 'utils.token'
local Command = require 'utils.command'
local Global = require 'utils.global'
local Ranks = require 'resources.ranks'
local table = require 'utils.table'
local primitives = {
copy = nil,
delete = nil,
new_dataset = nil,
lockout = nil
}
Global.register(
{
primitives = primitives
},
function(tbl)
primitives = tbl.primitives
end
)
--- Clears primitives
local function clear_primitives()
primitives.copy = nil
primitives.delete = nil
primitives.new_dataset = nil
primitives.lockout = nil
end
--- Writes entries to datasets
local function write_dataset(dataset, entries)
if not dataset or not entries then
game.print('Empty entries or dataset (This is usually due to calling the wrong data_set)')
clear_primitives()
return
end
for k, v in pairs(entries) do
Server.set_data(dataset, k, v)
end
end
--- Nils a dataset
local function nil_dataset(dataset, entries)
if not dataset or not entries then
game.print('Empty entries or dataset (This is usually due to calling the wrong data_set)')
clear_primitives()
return
end
for k in pairs(entries) do
Server.set_data(dataset, k, nil)
end
end
--- Callback token
local data_callback =
Token.register(
function(data)
local old_dataset = data.data_set
if not old_dataset then
game.print('Empty entries (This is usually due to calling the wrong data_set)')
clear_primitives()
return
end
local entries = data.entries
if not entries then
game.print('Empty entries (This is usually due to calling the wrong data_set)')
clear_primitives()
return
end
if primitives.copy then
write_dataset(primitives.new_dataset, entries)
end
if primitives.delete then
nil_dataset(old_dataset, entries)
end
clear_primitives()
game.print('Dataset operation complete.')
end
)
--- Sets parameters to have a dataset copied
local function copy_dataset(args)
if primitives.lockout then
game.print('Data processing already in progress.')
return
end
local dataset = args.dataset
local destination = args.destination
game.print('Copying: ' .. dataset .. ' to ' .. destination)
primitives.new_dataset = destination
primitives.copy = true
primitives.delete = false
primitives.lockout = true
Server.try_get_all_data(dataset, data_callback)
end
--- Sets parameters to have a dataset moved
local function move_dataset(args)
if primitives.lockout then
game.print('Data processing already in progress.')
return
end
local dataset = args.dataset
local destination = args.destination
game.print('Moving: ' .. dataset .. ' to ' .. destination)
primitives.new_dataset = destination
primitives.copy = true
primitives.delete = true
primitives.lockout = true
Server.try_get_all_data(dataset, data_callback)
end
--- Sets parameters to have a dataset deleted
local function delete_dataset(args)
if primitives.lockout then
game.print('Data processing already in progress.')
return
end
local dataset = args.dataset
game.print('Deleting: ' .. dataset)
primitives.new_dataset = nil
primitives.copy = false
primitives.delete = true
primitives.lockout = true
Server.try_get_all_data(dataset, data_callback)
end
Command.add(
'dataset-copy',
{
description = {'command_description.dataset_copy'},
arguments = {'dataset', 'destination'},
required_rank = Ranks.admin,
debug_only = true,
allowed_by_server = true
},
copy_dataset
)
Command.add(
'dataset-move',
{
description = {'command_description.dataset_move'},
arguments = {'dataset', 'destination'},
required_rank = Ranks.admin,
debug_only = true,
allowed_by_server = true
},
move_dataset
)
Command.add(
'dataset-delete',
{
description = {'command_description.dataset_delete'},
arguments = {'dataset'},
required_rank = Ranks.admin,
debug_only = true,
allowed_by_server = true
},
delete_dataset
)
--- Callback token
local transform_callback =
Token.register(
function(data)
local entries = data.entries
if not entries then
game.print('Empty entries (This is usually due to calling the wrong data_set)')
clear_primitives()
return
end
local returned_entries = storage.transform_function(entries)
write_dataset(primitives.new_dataset, returned_entries)
clear_primitives()
game.print('Transform complete.')
end
)
--- Takes a data set, transforms it, then copies it.
local function transform_data(args)
if primitives.lockout then
game.print('Data processing already in progress.')
clear_primitives()
return
end
local transform_function = storage.transform_function
if not transform_function then
game.print('No transform function set')
clear_primitives()
return
end
if type(transform_function) ~= 'function' then
game.print('storage.transform_function does not contain a function')
clear_primitives()
return
end
local destination = args.destination
local dataset = args.dataset
if destination == dataset then
game.print('For transforms, you must copy the output to a different dataset')
clear_primitives()
return
end
game.print('Beginning transform...')
primitives.new_dataset = args.destination
primitives.lockout = true
Server.try_get_all_data(args.dataset, transform_callback)
end
local transform_test_callback =
Token.register(
function(data)
local entries = data.entries
if not entries then
game.print('Empty entries (This is usually due to calling the wrong data_set).')
clear_primitives()
return
end
local transform_function = storage.transform_function
if not transform_function then
game.print('No transform function set.')
clear_primitives()
return
end
if type(transform_function) ~= 'function' then
game.print('storage.transform_function does not contain a function.')
clear_primitives()
return
end
local returned_entries = storage.transform_function(entries)
clear_primitives()
storage.transform_results = returned_entries
local result_str = table.inspect(returned_entries)
game.print(result_str)
log(result_str)
game.print('Test complete. The results can be better seen in the log or in storage.transform_results')
end
)
local function transform_data_test(args)
game.print('Testing transform...')
Server.try_get_all_data(args.dataset, transform_test_callback)
end
Command.add(
'dataset-transform',
{
description = {'command_description.dataset_transform'},
arguments = {'dataset', 'destination'},
required_rank = Ranks.admin,
debug_only = true,
allowed_by_server = true
},
transform_data
)
Command.add(
'dataset-transform-test',
{
description = {'command_description.dataset_transform_test'},
arguments = {'dataset'},
required_rank = Ranks.admin,
debug_only = true,
allowed_by_server = true
},
transform_data_test
)