Files
randopix/src/server.nim
2020-05-23 13:55:16 +02:00

60 lines
1.4 KiB
Nim

import net, json, strutils
import common
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
var socket = newSocket()
socket.connect("127.0.0.1", Port(defaultPort))
let c = newCommand(cClose)
socket.send(c.wrap)
socket.close()
proc runServer*[ServerArgs](arg: ServerArgs) {.thread, nimcall.} =
verbose = arg.verbose
var server = net.newSocket()
server.bindAddr(Port(defaultPort))
server.listen()
log "Control server is listening"
while true:
# Process client requests
var client = net.newSocket()
server.accept(client)
log "Client connected"
try:
var line = client.recvLine()
if line == "":
log "No data from client"
continue
var jsonData = parseJson(line)
let msg = jsonData.to(CommandMessage)
case msg.command
of cClose:
log "Server recieved termination command. Exiting."
break
else:
# Pass command from client to main applicaiton
chan.send(msg)
except OSError:
log "Server error: ", getCurrentExceptionMsg()
except:
log "Invalid command from client: ", getCurrentExceptionMsg()
log repr(getCurrentException())
server.close()