From 2d7a2be5298bc47946b19dad3e18a7b95a202dff Mon Sep 17 00:00:00 2001 From: luxick Date: Thu, 21 May 2020 14:22:52 +0200 Subject: [PATCH] Respect the verbose verbose flag. --- src/providers.nim | 15 +++++++-------- src/randopix.nim | 25 +++++++++++++++---------- src/server.nim | 35 ++++++++++++++++++++++++----------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/providers.nim b/src/providers.nim index 5d9249e..e96b0c9 100644 --- a/src/providers.nim +++ b/src/providers.nim @@ -1,5 +1,5 @@ import os, sets, random, httpClient, json, strformat -import gintro/[gdkpixbuf, gobject, gtk] +import gintro/[gdkpixbuf, gobject] import commands const @@ -28,7 +28,6 @@ type var client = newHttpClient() ## For loading images from the web - verbose = true ######################## # Constructors @@ -64,8 +63,8 @@ proc newFileOpResult(file: string): FileOpResult = # Utilities ######################## -proc log(msg: string) = - if verbose: echo msg +proc log(ip: ImageProvider, msg: string) = + if ip.verbose: echo msg ######################## # Image Provider procs @@ -81,10 +80,10 @@ proc getFox(ip: ImageProvider): FileOpResult = writeFile(dlFile, imageData) return newFileOpResult(dlFile) except JsonParsingError: - log fmt"Error while fetching from fox API: {getCurrentExceptionMsg()}" + ip.log fmt"Error while fetching from fox API: {getCurrentExceptionMsg()}" return newFileOpResultError("Json parsing error") except KeyError: - log fmt"No image in downloaded data: {getCurrentExceptionMsg()}" + ip.log fmt"No image in downloaded data: {getCurrentExceptionMsg()}" return newFileOpResultError("No image from API") proc getLocalFile(ip: var ImageProvider): FileOpResult = @@ -94,12 +93,12 @@ proc getLocalFile(ip: var ImageProvider): FileOpResult = if ip.files.len < 1: if ip.path == "": return newFileOpResultError("No path for image loading") - log "Reloading file list..." + ip.log "Reloading file list..." for file in walkDirRec(ip.path): let split = splitFile(file) if ip.exts.contains(split.ext): ip.files.add(file) - log fmt"Loaded {ip.files.len} files" + ip.log fmt"Loaded {ip.files.len} files" shuffle(ip.files) # Remove the current file after result = newFileOpResult(ip.files[0]) diff --git a/src/randopix.nim b/src/randopix.nim index 67a5b01..cfb68f0 100644 --- a/src/randopix.nim +++ b/src/randopix.nim @@ -1,5 +1,5 @@ import os, options, strformat -import gintro/[glib, gobject, gdkpixbuf, gtk, gio] +import gintro/[glib, gobject, gtk, gio] import gintro/gdk except Window import argparse except run import providers, server, commands @@ -21,12 +21,16 @@ var window: ApplicationWindow label: Label # Server vor recieving commands from external tools - serverWorker: system.Thread[void] + serverWorker: system.Thread[ServerArgs] proc enumToStrings(en: typedesc): seq[string] = for x in en: result.add $x +proc log(things: varargs[string, `$`]) = + if args.verbose: + echo things.join() + proc notify(label: Label, message: string = "") = ## Shows the notification box in the lower left corner. ## If no message is passed, the box will be hidden @@ -67,7 +71,7 @@ proc newArgs(): Option[Args] = proc updateImage(image: Image): bool = ## Updates the UI with a new image try: - if (args.verbose): echo "Refreshing..." + if (args.verbose): log "Refreshing..." var wWidth, wHeight: int window.getSize(wWidth, wHeight) @@ -82,7 +86,7 @@ proc updateImage(image: Image): bool = let e = getCurrentException() msg = getCurrentExceptionMsg() - echo "Got exception ", repr(e), " with message ", msg + log "Got exception ", repr(e), " with message ", msg return false proc forceUpdate(action: SimpleAction; parameter: Variant; image: Image) = @@ -103,17 +107,17 @@ proc checkServerChannel(image: Image): bool = if tried.dataAvailable: let msg: CommandMessage = tried.msg - echo "Main app got message: ", msg.command + log "Main app got message: ", msg.command case msg.command of cRefresh: discard updateImage(image) of cTimeout: let val = msg.parameter.parseInt * 1000 - echo "Setting timeout to ", val + log "Setting timeout to ", val args.timeout = val else: - echo "Command ignored: ", msg.command + log "Command ignored: ", msg.command sleep(100) result = true @@ -129,11 +133,11 @@ proc toggleFullscreen(action: SimpleAction; parameter: Variant; window: Applicat proc cleanUp(w: ApplicationWindow, app: Application) = ## Stop the control server and exit the GTK application - echo "Stopping control server..." + log "Stopping control server..." closeServer() serverWorker.joinThread() chan.close() - echo "Server stopped." + log "Server stopped." app.quit() proc quit(action: SimpleAction; parameter: Variant; app: Application) = @@ -199,7 +203,8 @@ proc appActivate(app: Application) = chan.open() ## Start the server for handling incoming commands - createThread(serverWorker, runServer) + let serverArgs = newServerArgs(args.verbose) + createThread(serverWorker, runServer, serverArgs) discard idleAdd(checkServerChannel, image) when isMainModule: diff --git a/src/server.nim b/src/server.nim index d74067a..7758540 100644 --- a/src/server.nim +++ b/src/server.nim @@ -1,8 +1,20 @@ -import net, json +import net, json, strutils import commands +type + ServerArgs* = object of RootObj + verbose: bool + var chan*: Channel[CommandMessage] + verbose: bool + +proc newServerArgs*(verbose: bool): ServerArgs = + ServerArgs(verbose: verbose) + +proc log(things: varargs[string, `$`]) = + if verbose: + echo things.join() proc closeServer*() = ## Sends a "Close" command to the server @@ -12,36 +24,37 @@ proc closeServer*() = socket.send(c.wrap) socket.close() -proc runServer*() = - var server = newSocket() +proc runServer*[ServerArgs](arg: ServerArgs) {.thread, nimcall.} = + verbose = arg.verbose + var server = net.newSocket() server.bindAddr(Port(defaultPort)) server.listen() - echo "Control server is listening" + log "Control server is listening" while true: # Process client requests - var client = newSocket() + var client = net.newSocket() server.accept(client) - echo("Client connected") + log "Client connected" try: var line = client.recvLine() if line == "": - echo "No data from client" + log "No data from client" continue var jsonData = parseJson(line) let msg = jsonData.to(CommandMessage) case msg.command of cClose: - echo "Server recieved termination command. Exiting." + log "Server recieved termination command. Exiting." break else: # Pass command from client to main applicaiton chan.send(msg) except OSError: - echo "Server error: ", getCurrentExceptionMsg() + log "Server error: ", getCurrentExceptionMsg() except: - echo "Invalid command from client: ", getCurrentExceptionMsg() - echo repr(getCurrentException()) + log "Invalid command from client: ", getCurrentExceptionMsg() + log repr(getCurrentException()) server.close() \ No newline at end of file