events -> json export properly working!

This commit is contained in:
Adam 2021-10-20 23:27:47 +02:00
parent a70b2935f3
commit 239951ac48
4 changed files with 108 additions and 101 deletions

View file

@ -1,7 +1,3 @@
// import {Kafka, Producer} from "kafkajs";
// const {Kafka} = require("kafkajs")
// import {Kafka, Producer} from "kafkajs/types"
// import {Data, Mods} from "typed-factorio/settings/types" // import {Data, Mods} from "typed-factorio/settings/types"
// import { events } from "typed-factorio/generated" // import { events } from "typed-factorio/generated"
@ -17,44 +13,57 @@ import {JsonTable, Serdes} from "./serdes/serdes"
// const SERVER_ID: uint = 0 // const SERVER_ID: uint = 0
// const EVENT_FILE_DIR: string = "events" // const EVENT_FILE_DIR: string = "events"
function playerEvent(tick: uint, player_index: uint, eventType: string) { function createFactorioEvent(tick: uint, object_name: string, eventType: string, data: JsonTable): JsonTable {
return {
tick,
object_name,
eventType,
data,
}
}
function handlePlayerUpdate(tick: uint, player_index: uint, eventType: string) {
let player: LuaPlayer = game.players[player_index]
let table = Serdes.Player.playerToTable(player)
let event = createFactorioEvent(tick, player.object_name, eventType, table)
emitEvent(event)
handleCharactersEvent(tick, player_index, eventType)
}
function handleCharactersEvent(tick: uint, player_index: uint, eventType: string) {
let player: LuaPlayer = game.players[player_index] let player: LuaPlayer = game.players[player_index]
let filename: string = table.concat([player.index, eventType, tick], "_")
let data = Serdes.Player.playerToTable(player)
outputEventFile(player.object_name + "/" + filename, data)
if (player.character != undefined) { if (player.character != undefined) {
entityEvent(tick, player.character, eventType) handleEntityUpdate(tick, player.character, eventType)
for (const char of player.get_associated_characters()) { for (const char of player.get_associated_characters()) {
if (char != undefined) { if (char != undefined) {
entityEvent(tick, char, eventType) handleEntityUpdate(tick, char, eventType)
} }
} }
} }
} }
function entityEvent(tick: uint, entity: LuaEntity, eventType: string) { function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
if (entity.unit_number != undefined && entity.unit_number != 0) { let table = Serdes.Entity.entityToTable(entity)
let filename: string = table.concat([entity.unit_number, eventType, tick], "_") let event = createFactorioEvent(tick, entity.object_name, eventType, table)
let data = Serdes.Entity.entityToTable(entity) emitEvent(event)
outputEventFile(entity.object_name + "/" + filename, data)
}
} }
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) { function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
let filename: string = let table = Serdes.Surface.surfaceToTable(surface)
surface.object_name + "/" + table.concat([surface.index, eventType, tick], "_") let event = createFactorioEvent(tick, surface.object_name, eventType, table)
let data = Serdes.Surface.surfaceToTable(surface) emitEvent(event)
outputEventFile(filename, data)
} }
function outputEventFile(filename: string, obj: JsonTable) { /** Emit a serialised event */
let data = game.table_to_json(obj) function emitEvent(event: JsonTable) {
let data = game.table_to_json(event)
// game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID) // game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID)
localised_print(`!===== ${filename} | ${data} =====!`) localised_print(`FactorioWebMapJsonEvent: ${data}`)
} }
// script.on_event( // script.on_event(
@ -67,21 +76,22 @@ function outputEventFile(filename: string, obj: JsonTable) {
script.on_event( script.on_event(
defines.events.on_player_mined_entity, defines.events.on_player_mined_entity,
(e: OnPlayerMinedEntityEvent) => { (e: OnPlayerMinedEntityEvent) => {
entityEvent(e.tick, e.entity, "on_player_mined_entity") handlePlayerUpdate(e.tick, e.player_index, "on_player_mined_entity")
playerEvent(e.tick, e.player_index, "on_player_mined_entity") handleEntityUpdate(e.tick, e.entity, "on_player_mined_entity")
} }
) )
script.on_event( script.on_event(
defines.events.on_player_joined_game, defines.events.on_player_joined_game,
(e: OnPlayerJoinedGameEvent) => { (e: OnPlayerJoinedGameEvent) => {
playerEvent(e.tick, e.player_index, "on_player_joined_game") handlePlayerUpdate(e.tick, e.player_index, "on_player_joined_game")
} }
) )
script.on_event( script.on_event(
defines.events.on_player_changed_position, defines.events.on_player_changed_position,
// this is actually a character update, not a player update?
(e: OnPlayerChangedPositionEvent) => { (e: OnPlayerChangedPositionEvent) => {
playerEvent(e.tick, e.player_index, "on_player_changed_position") handlePlayerUpdate(e.tick, e.player_index, "on_player_changed_position")
} }
) )
@ -90,8 +100,6 @@ script.on_event(
(e: OnTickEvent) => { (e: OnTickEvent) => {
if (e.tick % 60 == 0) { if (e.tick % 60 == 0) {
game.surfaces
for (const [index,] of pairs(game.surfaces)) { for (const [index,] of pairs(game.surfaces)) {
let surface = game.surfaces[index] let surface = game.surfaces[index]
surfaceEvent(e.tick, surface, "on_tick") surfaceEvent(e.tick, surface, "on_tick")

View file

@ -1,16 +0,0 @@
// declare interface LuaArray<TValue = any> extends LuaTable<number, TValue> {
// }
// = LuaTable<number, TValue>;
// declare type LuaArrayConstructor = (new <TValue = any>() => LuaArray<TValue>)
// declare const LuaArray: LuaArrayConstructor
// class LuaArray<TValue = any> extends LuaTable<number, TValue> {
// add(val: TValue) {
// this.set(this.length(), val)
// }
// }
// declare type LuaArray<TKey extends AnyNotNil = AnyNotNil, TValue = any> & LuaTable<TKey, TValue>

View file

@ -1,25 +1,46 @@
export type PrimitiveType = number | string | boolean export type JsonPrimitiveType = number | string | boolean | undefined | null | void
export type JsonArray<TValue extends PrimitiveType> = TValue[]
export type JsonTableValueType =
PrimitiveType
| JsonTable
| JsonArray<PrimitiveType>
export type JsonTable = LuaTable<string, JsonTableValueType> // & table
// export type JsonArray = LuaArray<PrimitiveType> // & table
// export type JsonArray<TValue extends JsonPrimitiveType> = TValue[]
// export class JsonArray extends Array<JsonPrimitiveTypes> {
// }
// export type JsonArray = Array<JsonPrimitiveTypes>
// declare type JsonArrayConstructor = (new () => JsonArray)
// declare const JsonArray: JsonArrayConstructor
export type JsonArray<T extends JsonPrimitiveType = void> = T[]
export type JsonTableValueType =
JsonPrimitiveType
| JsonTable
| JsonArray<JsonPrimitiveType>
| undefined
| null
// export class JsonTable extends LuaTable<string, JsonTableValueType> {
// }
// export type JsonTable = LuaTable<string, JsonTableValueType>
// const JsonTable = () => new LuaTable<string, JsonTableValueType>()
// export type JsonTableConstructor = (new () => JsonTable)
// declare const JsonTable: JsonTableConstructor
export interface JsonTable {
[key: string]: JsonTableValueType
}
export namespace Serdes { export namespace Serdes {
export namespace Player { export namespace Player {
export function playerToTable(player: LuaPlayer): JsonTable { export function playerToTable(player: LuaPlayer): JsonTable {
let table = new LuaTable<string, JsonTableValueType>() let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
return {
table.set("name", player.name) "name": player.name,
let charIds: JsonArray<number> = Entity.entitiesToUnitNumbers(player.get_associated_characters()) "characterId": player.character?.unit_number,
table.set("characterIds", charIds) "associatedCharacterIds": charIds,
"position": DataClasses.positionTableToTable(player.position),
return table }
} }
} }
@ -27,34 +48,32 @@ export namespace Serdes {
export namespace Entity { export namespace Entity {
export function entityToTable(entity: LuaEntity): JsonTable { export function entityToTable(entity: LuaEntity): JsonTable {
let table = new LuaTable<string, JsonTableValueType>()
if (entity.player?.index != null) { let player: JsonTable =
table.set("playerId", entity.player?.index) entity.is_player() ? {
"playerId": entity.player?.index,
} : {}
return {
player,
"name": entity.name,
"type": entity.type,
"active": entity.active,
"health": entity.health,
"surfaceId": entity.surface.index,
"unit_number": entity.unit_number,
"position": DataClasses.positionTableToTable(entity.position),
} }
table.set("type", entity.type)
table.set("active", entity.active)
if (entity.health != null) {
table.set("health", entity.health)
}
table.set("surfaceId", entity.surface.index)
table.set("position", DataClasses.positionTableToTable(entity.position))
return table
} }
export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> { export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> {
let array: number[] = [] let result: (number) [] = []
let j: number = 0 for (let entity of entities) {
for (let i = 0; i < entities.length; i++) { if (entity.unit_number != null) {
let unitNum = entities[i].unit_number result[result.length] = entity.unit_number
if (unitNum != null) {
array[j++] = unitNum
} }
} }
return array return result
} }
} }
@ -62,13 +81,11 @@ export namespace Serdes {
export namespace Surface { export namespace Surface {
export function surfaceToTable(surface: LuaSurface): JsonTable { export function surfaceToTable(surface: LuaSurface): JsonTable {
let table = new LuaTable<string, JsonTableValueType>() return {
"name": surface.name,
table.set("name", surface.name) "index": surface.index,
table.set("index", surface.index) "daytime": surface.daytime,
table.set("daytime", surface.daytime) }
return table
} }
} }
@ -76,10 +93,10 @@ export namespace Serdes {
export namespace DataClasses { export namespace DataClasses {
export function positionTableToTable(positionTable: PositionTable): JsonTable { export function positionTableToTable(positionTable: PositionTable): JsonTable {
let table = new LuaTable<string, JsonTableValueType>() return {
table.set("x", positionTable.x) "x": positionTable.x,
table.set("y", positionTable.y) "y": positionTable.y,
return table }
} }
} }

View file

@ -29,7 +29,7 @@
"tstlVerbose": true, "tstlVerbose": true,
"noHeader": true, "noHeader": true,
"noImplicitSelf": true, "noImplicitSelf": true,
"luaLibImport" : "require", "luaLibImport": "inline"
}, },
"//": { "//": {
"noResolve": true, "noResolve": true,
@ -39,7 +39,7 @@
], ],
"exactOptionalPropertyTypes": true, "exactOptionalPropertyTypes": true,
"luaTarget": "5.2", "luaTarget": "5.2",
"skipLibCheck": true, "skipLibCheck": true,
"skipDefaultLibCheck": true, "skipDefaultLibCheck": true,
"types": [ "types": [
"node", "node",
@ -50,12 +50,10 @@
"node_modules/@types" "node_modules/@types"
], ],
"//": "lua-types/5.2", "//": "lua-types/5.2",
"luaLibImport" : "inline", "luaLibImport": "inline",
"noImplicitSelf": true, "noImplicitSelf": true,
"sourceMapTraceback": true, "sourceMapTraceback": true,
"luaBundle ": "bundle.lua",
"luaBundle " : "bundle.lua", "luaBundleEntry ": "bundleEntry.lua"
"luaBundleEntry " : "bundleEntry.lua"
} }
} }