43 lines
1.0 KiB
Nim
43 lines
1.0 KiB
Nim
import asyncnet, asyncdispatch
|
|
|
|
type
|
|
Client = tuple
|
|
socket: AsyncSocket
|
|
name: string
|
|
connected: bool
|
|
|
|
var clients {.threadvar.}: seq[Client]
|
|
|
|
proc sendOthers(client: Client, line: string) {.async.} =
|
|
for c in clients:
|
|
if c != client and c.connected:
|
|
await c.socket.send(line & "\c\L")
|
|
|
|
proc processClient(socket: AsyncSocket) {.async.} =
|
|
await socket.send("Please enter your name: ")
|
|
var client: Client = (socket, await socket.recvLine(), true)
|
|
|
|
clients.add(client)
|
|
asyncCheck client.sendOthers("+++ " & client.name & " arrived +++")
|
|
|
|
while true:
|
|
let line = await client.socket.recvLine()
|
|
if line == "":
|
|
asyncCheck client.sendOthers("--- " & client.name & " leaves ---")
|
|
client.connected = false
|
|
return
|
|
asyncCheck client.sendOthers(client.name & "> " & line)
|
|
|
|
proc serve() {.async.} =
|
|
clients = @[]
|
|
var server = newAsyncSocket()
|
|
server.bindAddr(Port(4004))
|
|
server.listen()
|
|
|
|
while true:
|
|
let socket = await server.accept()
|
|
asyncCheck processClient(socket)
|
|
|
|
asyncCheck serve()
|
|
runForever()
|