chat2 improvements (#403)

This commit is contained in:
Hanno Cornelius 2021-03-03 10:40:19 +02:00 committed by GitHub
parent 168f8d1e1d
commit 1eb1cbaaa8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 4 deletions

1
.gitignore vendored
View File

@ -30,3 +30,4 @@
/metrics/waku-sim-all-nodes-grafana-dashboard.json /metrics/waku-sim-all-nodes-grafana-dashboard.json
rln rln
*.log

View File

@ -4,7 +4,7 @@
when not(compileOption("threads")): when not(compileOption("threads")):
{.fatal: "Please, compile this program with the --threads:on option!".} {.fatal: "Please, compile this program with the --threads:on option!".}
import std/[tables, strformat, strutils] import std/[tables, strformat, strutils, times, httpclient, json, sequtils, random]
import confutils, chronicles, chronos, stew/shims/net as stewNet, import confutils, chronicles, chronos, stew/shims/net as stewNet,
eth/keys, bearssl, stew/[byteutils, endians2], eth/keys, bearssl, stew/[byteutils, endians2],
nimcrypto/pbkdf2 nimcrypto/pbkdf2
@ -48,6 +48,7 @@ type Chat = ref object
subscribed: bool # indicates if a node is subscribed or not to a topic subscribed: bool # indicates if a node is subscribed or not to a topic
connected: bool # if the node is connected to another peer connected: bool # if the node is connected to another peer
started: bool # if the node has started started: bool # if the node has started
nick: string # nickname for this chat session
type type
PrivateKey* = crypto.PrivateKey PrivateKey* = crypto.PrivateKey
@ -70,6 +71,23 @@ proc connectToNodes(c: Chat, nodes: seq[string]) {.async.} =
await c.node.connectToNodes(nodes) await c.node.connectToNodes(nodes)
c.connected = true c.connected = true
proc selectRandomNode(): string =
randomize()
let
# Get latest fleet
fleet = newHttpClient().getContent("https://fleets.status.im")
# Select the JSONObject corresponding to the wakuv2 test fleet and convert to seq of key-val pairs
nodes = toSeq(fleet.parseJson(){"fleets", "wakuv2.test", "waku"}.pairs())
# Select a random node from the test fleet, convert to string and return
return nodes[rand(nodes.len - 1)].val.getStr()
proc readNick(transp: StreamTransport): Future[string] {.async.} =
# Chat prompt
stdout.write("Choose a nickname >> ")
stdout.flushFile()
return await transp.readLine()
proc publish(c: Chat, line: string) = proc publish(c: Chat, line: string) =
when PayloadV1: when PayloadV1:
# Use Waku v1 payload encoding/encryption # Use Waku v1 payload encoding/encryption
@ -107,6 +125,10 @@ proc writeAndPrint(c: Chat) {.async.} =
# echo "type an address or wait for a connection:" # echo "type an address or wait for a connection:"
# echo "type /[help|?] for help" # echo "type /[help|?] for help"
# Chat prompt
stdout.write(">> ")
stdout.flushFile()
let line = await c.transp.readLine() let line = await c.transp.readLine()
if line.startsWith("/help") or line.startsWith("/?") or not c.started: if line.startsWith("/help") or line.startsWith("/?") or not c.started:
echo Help echo Help
@ -128,6 +150,11 @@ proc writeAndPrint(c: Chat) {.async.} =
if address.len > 0: if address.len > 0:
await c.connectToNodes(@[address]) await c.connectToNodes(@[address])
elif line.startsWith("/nick"):
# Set a new nickname
c.nick = await readNick(c.transp)
echo "You are now known as " & c.nick
# elif line.startsWith("/exit"): # elif line.startsWith("/exit"):
# if p.connected and p.conn.closed.not: # if p.connected and p.conn.closed.not:
# await p.conn.close() # await p.conn.close()
@ -139,7 +166,10 @@ proc writeAndPrint(c: Chat) {.async.} =
else: else:
# XXX connected state problematic # XXX connected state problematic
if c.started: if c.started:
c.publish(line) # Get message timestamp
let time = getTime().utc().format("'<'HH:mm'>'")
c.publish(time & " " & c.nick & ": " & line)
# TODO Connect to peer logic? # TODO Connect to peer logic?
else: else:
try: try:
@ -180,10 +210,22 @@ proc processInput(rfd: AsyncFD, rng: ref BrHmacDrbgContext) {.async.} =
else: else:
node.mountRelay(@[], rlnRelayEnabled = conf.rlnrelay) node.mountRelay(@[], rlnRelayEnabled = conf.rlnrelay)
var chat = Chat(node: node, transp: transp, subscribed: true, connected: false, started: true) let nick = await readNick(transp)
echo "Welcome, " & nick & "!"
var chat = Chat(node: node, transp: transp, subscribed: true, connected: false, started: true, nick: nick)
if conf.staticnodes.len > 0: if conf.staticnodes.len > 0:
await connectToNodes(chat, conf.staticnodes) await connectToNodes(chat, conf.staticnodes)
else:
# Connect to at least one random fleet node
echo "No static peers configured. Choosing one at random from test fleet..."
let randNode = selectRandomNode()
echo "Connecting to " & randNode
await connectToNodes(chat, @[randNode])
let peerInfo = node.peerInfo let peerInfo = node.peerInfo
let listenStr = $peerInfo.addrs[0] & "/p2p/" & $peerInfo.peerId let listenStr = $peerInfo.addrs[0] & "/p2p/" & $peerInfo.peerId

View File

@ -83,7 +83,7 @@ task chat2, "Build example Waku v2 chat usage":
# NOTE For debugging, set debug level. For chat usage we want minimal log # NOTE For debugging, set debug level. For chat usage we want minimal log
# output to STDOUT. Can be fixed by redirecting logs to file (e.g.) # output to STDOUT. Can be fixed by redirecting logs to file (e.g.)
#buildBinary name, "examples/v2/", "-d:chronicles_log_level=WARN" #buildBinary name, "examples/v2/", "-d:chronicles_log_level=WARN"
buildBinary name, "examples/v2/", "-d:chronicles_log_level=DEBUG" buildBinary name, "examples/v2/", "-d:chronicles_log_level=DEBUG -d:chronicles_sinks=textlines[file] -d:ssl"
task bridge, "Build Waku v1 - v2 bridge": task bridge, "Build Waku v1 - v2 bridge":
buildBinary "wakubridge", "waku/common/", "-d:chronicles_log_level=DEBUG" buildBinary "wakubridge", "waku/common/", "-d:chronicles_log_level=DEBUG"