From 392aaec972146b14392ed56eba8063354875e0c3 Mon Sep 17 00:00:00 2001 From: Jakob Friedl <71284620+jakobfriedl@users.noreply.github.com> Date: Sun, 12 Oct 2025 15:00:42 +0200 Subject: [PATCH] Timestamp formatting broke text selection, so the int64 unix timestamp is formatted to a string before being added to the console component. This solved most of the highlighting issues I encountered. --- src/agent/nim.cfg | 2 +- src/client/main.nim | 11 +++++---- src/client/views/console.nim | 25 ++++++++++----------- src/client/views/eventlog.nim | 10 ++++----- src/client/views/modals/generatePayload.nim | 2 +- src/common/types.nim | 2 +- 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/agent/nim.cfg b/src/agent/nim.cfg index 0b6f1d9..32f3d53 100644 --- a/src/agent/nim.cfg +++ b/src/agent/nim.cfg @@ -3,6 +3,6 @@ -d:release --opt:size --passL:"-s" # Strip symbols, such as sensitive function names --d:CONFIGURATION="PLACEHOLDERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLACEHOLDER" +-d:CONFIGURATION="PLACEHOLDERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLACEHOLDER" -d:MODULES="255" -o:"/mnt/c/Users/jakob/Documents/Projects/conquest/bin/monarch.x64.exe" \ No newline at end of file diff --git a/src/client/main.nim b/src/client/main.nim index c86820b..826c7e6 100644 --- a/src/client/main.nim +++ b/src/client/main.nim @@ -1,5 +1,5 @@ import whisky -import tables, strutils, strformat, json, parsetoml, base64, os # native_dialogs +import tables, times, strutils, strformat, json, parsetoml, base64, os # native_dialogs import ./utils/[appImGui, globals] import ./views/[dockspace, sessions, listeners, eventlog, console] import ./views/loot/[screenshots, downloads] @@ -133,21 +133,21 @@ proc main(ip: string = "localhost", port: int = 37573) = consoles[agentId].addItem( cast[LogType](event.data["logType"].getInt()), event.data["message"].getStr(), - event.timestamp + event.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss") ) of CLIENT_EVENTLOG_ITEM: eventlog.addItem( cast[LogType](event.data["logType"].getInt()), event.data["message"].getStr(), - event.timestamp + event.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss") ) of CLIENT_BUILDLOG_ITEM: listenersTable.generatePayloadModal.addBuildlogItem( cast[LogType](event.data["logType"].getInt()), event.data["message"].getStr(), - event.timestamp + event.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss") ) of CLIENT_LOOT_ADD: @@ -193,8 +193,7 @@ proc main(ip: string = "localhost", port: int = 37573) = # This is done to ensure that closed console windows can be opened again consoles = newConsoleTable - - igShowDemoWindow(nil) + # igShowDemoWindow(nil) # render app.render() diff --git a/src/client/views/console.nim b/src/client/views/console.nim index da4d1b9..cd7c3ad 100644 --- a/src/client/views/console.nim +++ b/src/client/views/console.nim @@ -23,9 +23,9 @@ type Helper functions for text selection ]# proc getText(item: ConsoleItem): cstring = - if item.timestamp > 0: - let timestamp = "[" & item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") & "]" - return timestamp & $item.itemType & item.text + if item.itemType != LOG_OUTPUT: + # let timestamp = item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") + return "[" & item.timestamp & "]" & $item.itemType & item.text else: return $item.itemType & item.text @@ -172,10 +172,10 @@ proc callback(data: ptr ImGuiInputTextCallbackData): cint {.cdecl.} = #[ API to add new console item ]# -proc addItem*(component: ConsoleComponent, itemType: LogType, data: string, timestamp: int64 = now().toTime().toUnix()) = +proc addItem*(component: ConsoleComponent, itemType: LogType, data: string, timestamp: string = now().format("dd-MM-yyyy HH:mm:ss")) = for line in data.split("\n"): component.console.items.add(ConsoleItem( - timestamp: if itemType == LOG_OUTPUT: 0 else: timestamp, + timestamp: timestamp, itemType: itemType, text: line )) @@ -195,11 +195,10 @@ proc displayCommandHelp(component: ConsoleComponent, command: Command) = ).join(" ") component.addItem(LOG_OUTPUT, command.description) - component.addItem(LOG_OUTPUT, "Usage : " & usage) - - if command.example != "": - component.addItem(LOG_OUTPUT, "Example : " & command.example) - + component.addItem(LOG_OUTPUT, "Usage : " & usage) + component.addItem(LOG_OUTPUT, "Example : " & command.example) + component.addItem(LOG_OUTPUT, "") + if command.arguments.len > 0: component.addItem(LOG_OUTPUT, "Arguments:") @@ -249,9 +248,9 @@ proc handleAgentCommand*(component: ConsoleComponent, connection: WsConnection, ]# proc print(item: ConsoleItem) = - if item.timestamp > 0: - let timestamp = item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") - igTextColored(vec4(0.6f, 0.6f, 0.6f, 1.0f), "[" & timestamp & "]") + if item.itemType != LOG_OUTPUT: + # let timestamp = item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") + igTextColored(GRAY, "[" & item.timestamp & "]", nil) igSameLine(0.0f, 0.0f) case item.itemType: diff --git a/src/client/views/eventlog.nim b/src/client/views/eventlog.nim index 1c60226..bc1e0ff 100644 --- a/src/client/views/eventlog.nim +++ b/src/client/views/eventlog.nim @@ -11,9 +11,8 @@ type showTimestamps: bool proc getText(item: ConsoleItem): cstring = - if item.timestamp > 0: - let timestamp = item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") - return fmt"[{timestamp}]{$item.itemType}{item.text}".string + if item.itemType != LOG_OUTPUT: + return fmt"[{item.timestamp}]{$item.itemType}{item.text}".string else: return fmt"{$item.itemType}{item.text}".string @@ -43,7 +42,7 @@ proc Eventlog*(title: string): EventlogComponent = #[ API to add new log entry ]# -proc addItem*(component: EventlogComponent, itemType: LogType, data: string, timestamp: int64 = now().toTime().toUnix()) = +proc addItem*(component: EventlogComponent, itemType: LogType, data: string, timestamp: string = now().format("dd-MM-yyyy HH:mm:ss")) = for line in data.split("\n"): component.log.items.add(ConsoleItem( @@ -57,8 +56,7 @@ proc addItem*(component: EventlogComponent, itemType: LogType, data: string, tim ]# proc print(component: EventlogComponent, item: ConsoleItem) = if (item.itemType != LOG_OUTPUT) and component.showTimestamps: - let timestamp = item.timestamp.fromUnix().format("dd-MM-yyyy HH:mm:ss") - igTextColored(vec4(0.6f, 0.6f, 0.6f, 1.0f), fmt"[{timestamp}]".cstring) + igTextColored(vec4(0.6f, 0.6f, 0.6f, 1.0f), fmt"[{item.timestamp}]".cstring) igSameLine(0.0f, 0.0f) case item.itemType: diff --git a/src/client/views/modals/generatePayload.nim b/src/client/views/modals/generatePayload.nim index d181fda..04c5eb4 100644 --- a/src/client/views/modals/generatePayload.nim +++ b/src/client/views/modals/generatePayload.nim @@ -49,7 +49,7 @@ proc resetModalValues*(component: AgentModalComponent) = component.moduleSelection.reset() component.buildLog.items = @[] -proc addBuildlogItem*(component: AgentModalComponent, itemType: LogType, data: string, timestamp: int64 = now().toTime().toUnix()) = +proc addBuildlogItem*(component: AgentModalComponent, itemType: LogType, data: string, timestamp: string = now().format("dd-MM-yyyy HH:mm:ss")) = for line in data.split("\n"): component.buildLog.items.add(ConsoleItem( timestamp: timestamp, diff --git a/src/common/types.nim b/src/common/types.nim index 24cec89..83f28d9 100644 --- a/src/common/types.nim +++ b/src/common/types.nim @@ -338,7 +338,7 @@ type type ConsoleItem* = ref object itemType*: LogType - timestamp*: int64 + timestamp*: string text*: string ConsoleItems* = ref object