Private
Public Access
1
0
Files
lua-prometheus-exporter/metrics-combinator.lua
Jan Grießhaber d58c24b8d4 Add metrics combinator entity, GUI, and related functionality; enhance power and production stats tracking
Greatly improved train trip perfomance by culling table after sending

Fixed formatting in many places
2026-01-06 02:02:30 +01:00

176 lines
5.3 KiB
Lua

local function getMetricsStorageData(entity)
local unit = entity.unit_number
storage.metrics[unit] = storage.metrics[unit] or {
name = "",
enabled = false,
}
return storage.metrics[unit]
end
function CreateMetricsEntry(event)
if event.entity.name == "metrics-combinator"
and event.entity.valid then
---@type LuaEntity
local entity = event.entity
storage.metrics[entity.unit_number] = storage.metrics[entity.unit_number] or {
name = "",
enabled = false
}
end
end
local function open_metrics_gui(player, entity)
if player.gui.screen.metrics_frame then
player.gui.screen.metrics_frame.destroy()
end
local frame = player.gui.screen.add {
type = "frame",
name = "metrics_frame",
direction = "vertical"
}
-- Titelzeile mit Close-Button
local titlebar = frame.add {
type = "flow",
direction = "horizontal"
}
titlebar.drag_target = frame
titlebar.add {
type = "label",
caption = "Metrics Combinator",
style = "frame_title"
}
local spacer = titlebar.add {
type = "empty-widget",
style = "draggable_space_header",
}
spacer.style.horizontally_stretchable = true
spacer.drag_target = frame
titlebar.add {
type = "sprite-button",
name = "metrics_close",
sprite = "utility/close",
style = "frame_action_button"
}
-- Inhalt
frame.add {
type = "textfield",
name = "metrics_name",
text = storage.metrics[entity.unit_number].name
}
frame.add {
type = "checkbox",
name = "metrics_enabled",
caption = "Enabled",
state = storage.metrics[entity.unit_number].enabled
}
frame.force_auto_center()
frame.tags = { entity_unit_number = entity.unit_number }
player.opened = frame
end
function onGuiClick(event)
if event.element.name ~= "metrics_close" then return end
local player = game.get_player(event.player_index)
if not player then return end
if player.gui.screen.metrics_frame then
player.gui.screen.metrics_frame.destroy()
end
end
function onGuiOpened(event)
if event.gui_type ~= defines.gui_type.entity then return end
if not (event.entity and event.entity.valid and event.entity.name == "metrics-combinator") then
return
end
local player = game.get_player(event.player_index)
-- SCHLÜSSELZEILE: Engine-GUI sofort schließen
player.opened = nil
open_metrics_gui(player, event.entity)
end
function onClosedCombinatorGui(event)
if event.element and event.element.name == "metrics_frame" then
event.element.destroy()
end
end
function onGuiTextChanged(event)
if event.element.name ~= "metrics_name" then return end
local player = game.get_player(event.player_index)
if not player then return end
local entity = player.opened
if not (entity and entity.valid) then return end
local data = getMetricsStorageData(game.get_entity_by_unit_number(entity.tags.entity_unit_number))
data.name = event.text
end
function onGuiCheckedState(event)
if event.element.name ~= "metrics_enabled" then return end
local player = game.get_player(event.player_index)
if not player then return end
local frame = player.opened
if not (frame and frame.valid) then return end
local data = getMetricsStorageData(game.get_entity_by_unit_number(frame.tags.entity_unit_number))
data.enabled = event.element.state
-- optional: echtes Abschalten
--frame.active = data.enabled
end
function onMetricsCombinatorDied(event)
if event.entity.name ~= "metrics-combinator" then return end
storage.metrics[event.entity.unit_number] = nil
end
function onMetricsCombinatorMined(event)
if event.entity.name ~= "metrics-combinator" then return end
storage.metrics[event.entity.unit_number] = nil
end
function SendCombinatorMetrics()
local netParts = {}
netParts[#netParts + 1] = "---circuit-stats---\n"
for unitNumber, combinatorFlags in pairs(storage.metrics) do
if combinatorFlags.enabled then
local entity = game.get_entity_by_unit_number(unitNumber)
if entity and entity.valid then
---@type LuaCircuitNetwork?
local redNet = entity.get_circuit_network(defines.wire_connector_id.circuit_red)
---@type LuaCircuitNetwork?
local greenNet = entity.get_circuit_network(defines.wire_connector_id.circuit_green)
if redNet then
for _, signal in pairs(redNet.signals) do
netParts[#netParts + 1] = ("%s:red:%s:%d"):format(combinatorFlags.name,
signal.signal.name .. signal.signal.quality.name, signal.count)
end
end
if greenNet then
for _, signal in pairs(greenNet.signals) do
netParts[#netParts + 1] = ("%s:green:%s:%d"):format(combinatorFlags.name,
signal.signal.name .. signal.signal.quality.name, signal.count)
end
end
end
end
end
helpers.send_udp(udpAddress, table.concat(netParts, "\n"), serverIndex)
end