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 { events } from "typed-factorio/generated"
@ -17,44 +13,57 @@ import {JsonTable, Serdes} from "./serdes/serdes"
// const SERVER_ID: uint = 0
// 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 filename: string = table.concat([player.index, eventType, tick], "_")
let data = Serdes.Player.playerToTable(player)
outputEventFile(player.object_name + "/" + filename, data)
if (player.character != undefined) {
entityEvent(tick, player.character, eventType)
handleEntityUpdate(tick, player.character, eventType)
for (const char of player.get_associated_characters()) {
if (char != undefined) {
entityEvent(tick, char, eventType)
handleEntityUpdate(tick, char, eventType)
}
}
}
}
function entityEvent(tick: uint, entity: LuaEntity, eventType: string) {
if (entity.unit_number != undefined && entity.unit_number != 0) {
let filename: string = table.concat([entity.unit_number, eventType, tick], "_")
let data = Serdes.Entity.entityToTable(entity)
outputEventFile(entity.object_name + "/" + filename, data)
}
function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
let table = Serdes.Entity.entityToTable(entity)
let event = createFactorioEvent(tick, entity.object_name, eventType, table)
emitEvent(event)
}
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
let filename: string =
surface.object_name + "/" + table.concat([surface.index, eventType, tick], "_")
let data = Serdes.Surface.surfaceToTable(surface)
outputEventFile(filename, data)
let table = Serdes.Surface.surfaceToTable(surface)
let event = createFactorioEvent(tick, surface.object_name, eventType, table)
emitEvent(event)
}
function outputEventFile(filename: string, obj: JsonTable) {
let data = game.table_to_json(obj)
/** Emit a serialised event */
function emitEvent(event: JsonTable) {
let data = game.table_to_json(event)
// game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID)
localised_print(`!===== ${filename} | ${data} =====!`)
localised_print(`FactorioWebMapJsonEvent: ${data}`)
}
// script.on_event(
@ -67,21 +76,22 @@ function outputEventFile(filename: string, obj: JsonTable) {
script.on_event(
defines.events.on_player_mined_entity,
(e: OnPlayerMinedEntityEvent) => {
entityEvent(e.tick, e.entity, "on_player_mined_entity")
playerEvent(e.tick, e.player_index, "on_player_mined_entity")
handlePlayerUpdate(e.tick, e.player_index, "on_player_mined_entity")
handleEntityUpdate(e.tick, e.entity, "on_player_mined_entity")
}
)
script.on_event(
defines.events.on_player_joined_game,
(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(
defines.events.on_player_changed_position,
// this is actually a character update, not a player update?
(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) => {
if (e.tick % 60 == 0) {
game.surfaces
for (const [index,] of pairs(game.surfaces)) {
let surface = game.surfaces[index]
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 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 JsonPrimitiveType = number | string | boolean | undefined | null | void
// 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 Player {
export function playerToTable(player: LuaPlayer): JsonTable {
let table = new LuaTable<string, JsonTableValueType>()
table.set("name", player.name)
let charIds: JsonArray<number> = Entity.entitiesToUnitNumbers(player.get_associated_characters())
table.set("characterIds", charIds)
return table
let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
return {
"name": player.name,
"characterId": player.character?.unit_number,
"associatedCharacterIds": charIds,
"position": DataClasses.positionTableToTable(player.position),
}
}
}
@ -27,34 +48,32 @@ export namespace Serdes {
export namespace Entity {
export function entityToTable(entity: LuaEntity): JsonTable {
let table = new LuaTable<string, JsonTableValueType>()
if (entity.player?.index != null) {
table.set("playerId", entity.player?.index)
let player: JsonTable =
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> {
let array: number[] = []
let j: number = 0
for (let i = 0; i < entities.length; i++) {
let unitNum = entities[i].unit_number
if (unitNum != null) {
array[j++] = unitNum
let result: (number) [] = []
for (let entity of entities) {
if (entity.unit_number != null) {
result[result.length] = entity.unit_number
}
}
return array
return result
}
}
@ -62,13 +81,11 @@ export namespace Serdes {
export namespace Surface {
export function surfaceToTable(surface: LuaSurface): JsonTable {
let table = new LuaTable<string, JsonTableValueType>()
table.set("name", surface.name)
table.set("index", surface.index)
table.set("daytime", surface.daytime)
return table
return {
"name": surface.name,
"index": surface.index,
"daytime": surface.daytime,
}
}
}
@ -76,10 +93,10 @@ export namespace Serdes {
export namespace DataClasses {
export function positionTableToTable(positionTable: PositionTable): JsonTable {
let table = new LuaTable<string, JsonTableValueType>()
table.set("x", positionTable.x)
table.set("y", positionTable.y)
return table
return {
"x": positionTable.x,
"y": positionTable.y,
}
}
}

View file

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