60 lines
1.4 KiB
Nim
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() |