refactoring, standardised naming, shuffling the docker infra around,

This commit is contained in:
Adam 2021-10-22 12:29:45 +02:00
parent f9b93c013d
commit 5e69799136
6 changed files with 91 additions and 64 deletions

View file

@ -80,6 +80,9 @@ val modPackageTask = tasks.register<Zip>("package") {
//tasks.build { dependsOn(tstlTask, modPackageTask) } //tasks.build { dependsOn(tstlTask, modPackageTask) }
val modInfraDir = layout.projectDirectory.dir("infra")
val factorioServerDataDir = modInfraDir.dir("factorio-server")
val copyModToServerTask = tasks.register<Copy>("copyModToServer") { val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
description = "Copy the mod to the Factorio Docker server" description = "Copy the mod to the Factorio Docker server"
group = "$projectId.factorioServer" group = "$projectId.factorioServer"
@ -87,7 +90,11 @@ val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
dependsOn(modPackageTask) dependsOn(modPackageTask)
from(modPackageTask) from(modPackageTask)
into(layout.projectDirectory.dir("infra/factorio-server/data/mods").asFile) into(factorioServerDataDir.dir("mods"))
doLast {
logger.lifecycle("Copying mod from ${source.files} to $destinationDir")
}
} }
val serverStopTask = tasks.register<Exec>("dockerStop") { val serverStopTask = tasks.register<Exec>("dockerStop") {
@ -95,7 +102,7 @@ val serverStopTask = tasks.register<Exec>("dockerStop") {
mustRunAfter(copyModToServerTask) mustRunAfter(copyModToServerTask)
workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile workingDir(modInfraDir)
commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server") commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server")
} }
@ -105,7 +112,7 @@ val serverUpTask = tasks.register<Exec>("dockerUp") {
mustRunAfter(copyModToServerTask) mustRunAfter(copyModToServerTask)
dependsOn(serverStopTask) dependsOn(serverStopTask)
workingDir = layout.projectDirectory.dir("infra/factorio-server").asFile workingDir(modInfraDir)
commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server") commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server")
} }
@ -124,6 +131,10 @@ val copyModToClientTask = tasks.register<Copy>("copyModToClient") {
from(modPackageTask) from(modPackageTask)
into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""") into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""")
doLast {
logger.lifecycle("Copying mod from ${source.files} to $destinationDir")
}
} }
//val factorioClientLaunch = tasks.register<Exec>("launch") { //val factorioClientLaunch = tasks.register<Exec>("launch") {

View file

@ -1 +1 @@
data factorio-server

View file

@ -6,13 +6,13 @@ services:
image: factoriotools/factorio:1.1.42 image: factoriotools/factorio:1.1.42
# logging: # logging:
# driver: "json-file" # driver: "json-file"
container_name: "factorio" container_name: "factorio-server"
restart: "unless-stopped" restart: "unless-stopped"
ports: ports:
- "34197:34197/udp" # factorio - "34197:34197/udp" # factorio
- "27015:27015/tcp" # rcon - "27015:27015/tcp" # rcon
volumes: volumes:
- "./data:/factorio" - "./factorio-server:/factorio"
# logging: # logging:
# driver: "mickyg/kafka-logdriver:latest" # driver: "mickyg/kafka-logdriver:latest"
# options: # options:
@ -31,7 +31,7 @@ services:
kafka-kraft: kafka-kraft:
image: dev-adamko/kafka-kraft image: dev-adamko/kafka-kraft
container_name: "kafka-factorio" container_name: "kafka-kraft"
build: build:
dockerfile: "kafka.Dockerfile" dockerfile: "kafka.Dockerfile"
target: "kafka-kraft" target: "kafka-kraft"

View file

@ -1,3 +1,5 @@
#!/usr/bin/env bash
# stream logs from 'factorio' container # stream logs from 'factorio' container
# follow the logs, and # follow the logs, and
# combine stdout and stderr # combine stdout and stderr
@ -6,3 +8,6 @@
docker logs --tail 0 -f factorio 2>&1 | docker logs --tail 0 -f factorio 2>&1 |
sed -n -e 's/^FactorioEvent: //p' | sed -n -e 's/^FactorioEvent: //p' |
kafkacat -P -b localhost -t factorio-server-log kafkacat -P -b localhost -t factorio-server-log
# listen to events
# kafkacat -C -b localhost -t factorio-server-log | jq

View file

@ -10,54 +10,64 @@
import {JsonTable, Serdes} from "./serdes/serdes" import {JsonTable, Serdes} from "./serdes/serdes"
// const SERVER_ID: uint = 0
// const EVENT_FILE_DIR: string = "events"
function createFactorioEvent(tick: uint, object_name: string, eventType: string, data: JsonTable): JsonTable { interface FactorioEvent extends JsonTable {
return { tick: uint
tick, object_name: string,
object_name, event_type: string,
eventType, data: JsonTable,
data,
}
} }
function handlePlayerUpdate(tick: uint, player_index: uint, eventType: string) { const FactorioEvent = ((tick: uint, objectName: string, eventType: string, data: JsonTable) => {
let player: LuaPlayer = game.players[player_index] return {
tick: tick,
object_name: objectName,
event_type: eventType,
data: data,
} as FactorioEvent
}
)
// function createFactorioEvent(tick: uint, object_name: string, eventType: string, data:
// JsonTable): FactorioEvent { return { tick, object_name, eventType, data, } }
function handlePlayerUpdate(tick: uint, playerIndex: uint, eventType: string) {
let player: LuaPlayer = game.players[playerIndex]
let table = Serdes.Player.playerToTable(player) let table = Serdes.Player.playerToTable(player)
let event = createFactorioEvent(tick, player.object_name, eventType, table) let event = FactorioEvent(tick, player.object_name, eventType, table)
emitEvent(event) emitEvent(event)
handleCharactersEvent(tick, player_index, eventType) handleCharactersEvent(tick, playerIndex, eventType)
} }
function handleCharactersEvent(tick: uint, player_index: uint, eventType: string) { function handleCharactersEvent(tick: uint, playerIndex: uint, eventType: string) {
let player: LuaPlayer = game.players[player_index] let player: LuaPlayer = game.players[playerIndex]
if (player.character != undefined) { if (player.character != undefined) {
handleEntityUpdate(tick, player.character, eventType) handleEntityUpdate(tick, player.character, eventType)
}
for (const char of player.get_associated_characters()) { for (const character of player.get_associated_characters()) {
if (char != undefined) { if (character != undefined) {
handleEntityUpdate(tick, char, eventType) handleEntityUpdate(tick, character, eventType)
}
} }
} }
} }
function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) { function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) {
let table = Serdes.Entity.entityToTable(entity) let table = Serdes.Entity.entityToTable(entity)
let event = createFactorioEvent(tick, entity.object_name, eventType, table) let event = FactorioEvent(tick, entity.object_name, eventType, table)
emitEvent(event) emitEvent(event)
} }
function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) { function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) {
let table = Serdes.Surface.surfaceToTable(surface) let table = Serdes.Surface.surfaceToTable(surface)
let event = createFactorioEvent(tick, surface.object_name, eventType, table) let event = FactorioEvent(tick, surface.object_name, eventType, table)
emitEvent(event) emitEvent(event)
} }
// const SERVER_ID: uint = 0
// const EVENT_FILE_DIR: string = "events"
/** Emit a serialised event */ /** Emit a serialised event */
function emitEvent(event: JsonTable) { function emitEvent(event: JsonTable) {
let data = game.table_to_json(event) let data = game.table_to_json(event)

View file

@ -1,13 +1,5 @@
export type JsonPrimitiveType = number | string | boolean | undefined | null | void 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 JsonArray<T extends JsonPrimitiveType = void> = T[]
export type JsonTableValueType = export type JsonTableValueType =
@ -17,6 +9,18 @@ export type JsonTableValueType =
| undefined | undefined
| null | null
export interface JsonTable {
[key: string]: JsonTableValueType
}
// 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 class JsonTable extends LuaTable<string, JsonTableValueType> { // export class JsonTable extends LuaTable<string, JsonTableValueType> {
// } // }
// export type JsonTable = LuaTable<string, JsonTableValueType> // export type JsonTable = LuaTable<string, JsonTableValueType>
@ -25,10 +29,6 @@ export type JsonTableValueType =
// declare const JsonTable: JsonTableConstructor // declare const JsonTable: JsonTableConstructor
export interface JsonTable {
[key: string]: JsonTableValueType
}
export namespace Serdes { export namespace Serdes {
export namespace Player { export namespace Player {
@ -36,10 +36,10 @@ export namespace Serdes {
export function playerToTable(player: LuaPlayer): JsonTable { export function playerToTable(player: LuaPlayer): JsonTable {
let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters()) let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters())
return { return {
"name": player.name, name: player.name,
"characterId": player.character?.unit_number, character_unit_number: player.character?.unit_number,
"associatedCharacterIds": charIds, associated_characters_unit_numbers: charIds,
"position": DataClasses.positionTableToTable(player.position), position: DataClasses.positionTableToTable(player.position),
} }
} }
@ -49,21 +49,22 @@ export namespace Serdes {
export function entityToTable(entity: LuaEntity): JsonTable { export function entityToTable(entity: LuaEntity): JsonTable {
let player: JsonTable = let data: JsonTable = {
entity.is_player() ? { name: entity.name,
"playerId": entity.player?.index, type: entity.type,
} : {} active: entity.active,
health: entity.health,
return { surface_index: entity.surface.index,
player, unit_number: entity.unit_number,
"name": entity.name, position: DataClasses.positionTableToTable(entity.position),
"type": entity.type,
"active": entity.active,
"health": entity.health,
"surfaceId": entity.surface.index,
"unit_number": entity.unit_number,
"position": DataClasses.positionTableToTable(entity.position),
} }
if (entity.is_player()) {
let player = entity.player!!
data.player_index = player.index
}
return data
} }
export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> { export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray<number> {
@ -82,9 +83,9 @@ export namespace Serdes {
export function surfaceToTable(surface: LuaSurface): JsonTable { export function surfaceToTable(surface: LuaSurface): JsonTable {
return { return {
"name": surface.name, name: surface.name,
"index": surface.index, index: surface.index,
"daytime": surface.daytime, daytime: surface.daytime,
} }
} }
@ -94,8 +95,8 @@ export namespace Serdes {
export function positionTableToTable(positionTable: PositionTable): JsonTable { export function positionTableToTable(positionTable: PositionTable): JsonTable {
return { return {
"x": positionTable.x, x: positionTable.x,
"y": positionTable.y, y: positionTable.y,
} }
} }