diff --git a/src/nim_status_client.nim b/src/nim_status_client.nim index e513d2ef96..373465c676 100644 --- a/src/nim_status_client.nim +++ b/src/nim_status_client.nim @@ -2,7 +2,9 @@ import NimQml import applicationView import chats import state -import status + +import status/core as status +import status/test as status_test proc mainProc() = # From QT docs: @@ -21,12 +23,12 @@ proc mainProc() = status.init() - status.setupNewAccount() - discard status.addPeer("enode://2c8de3cbb27a3d30cbb5b3e003bc722b126f5aef82e2052aaef032ca94e0c7ad219e533ba88c70585ebd802de206693255335b100307645ab5170e88620d2a81@47.244.221.14:443") + status_test.setupNewAccount() + discard status_test.addPeer("enode://2c8de3cbb27a3d30cbb5b3e003bc722b126f5aef82e2052aaef032ca94e0c7ad219e533ba88c70585ebd802de206693255335b100307645ab5170e88620d2a81@47.244.221.14:443") echo status.callPrivateRPC("{\"jsonrpc\":\"2.0\", \"method\":\"wakuext_requestMessages\", \"params\":[{\"topics\": [\"0x7998f3c8\"]}], \"id\": 1}") # result.accountResult = status.queryAccounts() - status.subscribeToTest() + status_test.subscribeToTest() let logic = newApplicationView(app, status.callPrivateRPC) defer: logic.delete diff --git a/src/status/chat.nim b/src/status/chat.nim new file mode 100644 index 0000000000..9ae670f7e7 --- /dev/null +++ b/src/status/chat.nim @@ -0,0 +1,60 @@ +import libstatus +import json +import utils + +proc startMessenger*() = + let payload = %* { + "jsonrpc": "2.0", + "id": 3, #TODO: + "method": "startMessenger".prefix, + "params": [] + } + discard $libstatus.callPrivateRPC($payload) + # TODO: create template for error handling + +proc loadFilters*(chatId: string) = + let payload = %* { + "jsonrpc": "2.0", + "id": 3, #TODO: + "method": "loadFilters".prefix, + "params": [ + [{ + "ChatID": chatId, + "OneToOne": false + }] + ] + } + discard $libstatus.callPrivateRPC($payload) + +proc saveChat*(chatId: string) = + let payload = %* { + "jsonrpc": "2.0", + "id": 4, + "method": "saveChat".prefix, + "params": [ #TODO: determine where do these values come from + { + "lastClockValue": 0, + "color": "#51d0f0", + "name": chatId, + "lastMessage": nil, + "active": true, + "id": chatId, + "unviewedMessagesCount": 0, + "chatType": 2, + "timestamp": 1588940692659 + } + ] + } + discard $libstatus.callPrivateRPC($payload) + +proc chatMessages*(chatId: string) = + let payload = %* { + "jsonrpc": "2.0", + "id": 3, #TODO: + "method": "chatMessages".prefix, + "params": [ + chatId, nil, 20 + ] + } + discard $libstatus.callPrivateRPC($payload) + # TODO: create template for error handling diff --git a/src/status/core.nim b/src/status/core.nim new file mode 100644 index 0000000000..ed34c4dcae --- /dev/null +++ b/src/status/core.nim @@ -0,0 +1,15 @@ +import libstatus +import signals +import types + +proc setSignalHandler(signalHandler: SignalCallback) = + libstatus.setSignalEventCallback(signalHandler) + +proc init*() = + setSignalHandler(onSignal) + +proc callRPC*(inputJSON: string): string = + return $libstatus.callRPC(inputJSON) + +proc callPrivateRPC*(inputJSON: string): string = + return $libstatus.callPrivateRPC(inputJSON) diff --git a/src/libstatus.nim b/src/status/libstatus.nim similarity index 94% rename from src/libstatus.nim rename to src/status/libstatus.nim index cd836ee047..eec1af8993 100644 --- a/src/libstatus.nim +++ b/src/status/libstatus.nim @@ -1,3 +1,5 @@ +import types + proc hashMessage*(p0: cstring): cstring {.importc: "HashMessage".} proc initKeystore*(keydir: cstring): cstring {.importc: "InitKeystore".} @@ -16,6 +18,4 @@ proc callPrivateRPC*(inputJSON: cstring): cstring {.importc: "CallPrivateRPC".} proc addPeer*(peer: cstring): cstring {.importc: "AddPeer".} -type SignalCallback* = proc(eventMessage: cstring): void - proc setSignalEventCallback*(callback: SignalCallback) {.importc: "SetSignalEventCallback".} diff --git a/src/signals.nim b/src/status/signals.nim similarity index 59% rename from src/signals.nim rename to src/status/signals.nim index 3f7867af89..22723407d7 100644 --- a/src/signals.nim +++ b/src/status/signals.nim @@ -1,9 +1,19 @@ -import libstatus +import types +import json var onSignal*: SignalCallback = proc(p0: cstring): void = setupForeignThreadGc() # TODO: Dispatch depending on message type $jsonSignal["type"].getStr # Consider also have an intermediate object with an enum for type # So you do not have to deal with json objects but with a nim type - echo $p0 + + let jsonSignal = ($p0).parseJson + let messageType = $jsonSignal["type"].getStr + + case messageType: + of "messages.new": + echo $p0 + else: + echo messageType #TODO: do something + tearDownForeignThreadGc() diff --git a/src/status.nim b/src/status/test.nim similarity index 87% rename from src/status.nim rename to src/status/test.nim index 557573aae6..e77c4a2b1f 100644 --- a/src/status.nim +++ b/src/status/test.nim @@ -1,7 +1,12 @@ import os +import core import libstatus import json -import signals +import chat + +# THIS FILE IS FOR TESTING STATUS FUNCTIONALITY +# ONCE TEST IS DONE, SPLIT THE CODE TO INDIVIDUAL NIM FILES + const datadir = "./data/" const keystoredir = "./data/keystore/" @@ -12,15 +17,6 @@ proc recreateDir(dirname: string) = removeDir(dirname) createDir(dirname) -proc setSignalHandler(signalHandler: SignalCallback) = - libstatus.setSignalEventCallback(signalHandler) - -proc init*() = - - - setSignalHandler(onSignal) - - proc queryAccounts*(): string = var payload = %* { "jsonrpc": "2.0", @@ -29,63 +25,15 @@ proc queryAccounts*(): string = [] ] } - var response = $libstatus.callPrivateRPC($payload) + var response = callPrivateRPC($payload) echo response result = parseJson(response)["result"][0].getStr() -proc subscribeToTest*() = - var result = "" - var payload = %* { - "jsonrpc": "2.0", - "id": 3, - "method": "wakuext_startMessenger", - "params": [] - } - result = $libstatus.callPrivateRPC($payload) - - payload = %* { - "jsonrpc": "2.0", - "id": 3, - "method": "wakuext_loadFilters", - "params": [ - [{ - "ChatID": "test", - "OneToOne": false - }] - ] - } - result = $libstatus.callPrivateRPC($payload) - - payload = %* { - "jsonrpc": "2.0", - "id": 4, - "method": "wakuext_saveChat", - "params": [ - { - "lastClockValue": 0, - "color": "#51d0f0", - "name": "test", - "lastMessage": nil, - "active": true, - "id": "test", - "unviewedMessagesCount": 0, - "chatType": 2, - "timestamp": 1588940692659 - } - ] - } - result = $libstatus.callPrivateRPC($payload) - - payload = %* { - "jsonrpc": "2.0", - "id": 3, - "method": "wakuext_chatMessages", - "params": [ - "test", nil, 20 - ] - } - result = $libstatus.callPrivateRPC($payload) +proc subscribeToTest*() = + loadFilters("test") + saveChat("test") + chatMessages("test") proc setupNewAccount*() = # Deleting directories @@ -356,15 +304,5 @@ proc setupNewAccount*() = if saveResult["error"].getStr == "": echo "Account saved succesfully" - -proc callRPC*(inputJSON: string): string = - return $libstatus.callRPC(inputJSON) - -proc callPrivateRPC*(inputJSON: string): string = - return $libstatus.callPrivateRPC(inputJSON) - proc addPeer*(peer: string): string = return $libstatus.addPeer(peer) - -# proc onMessage*(callback: proc(message: string)): void = -# $libstatus.setSignalEventCallback(callback) diff --git a/src/status/types.nim b/src/status/types.nim new file mode 100644 index 0000000000..d1a14eccea --- /dev/null +++ b/src/status/types.nim @@ -0,0 +1 @@ +type SignalCallback* = proc(eventMessage: cstring): void diff --git a/src/status/utils.nim b/src/status/utils.nim new file mode 100644 index 0000000000..e61a3e95f0 --- /dev/null +++ b/src/status/utils.nim @@ -0,0 +1,6 @@ +proc isWakuEnabled(): bool = + true # TODO: + +proc prefix*(methodName: string): string = + result = if isWakuEnabled(): "wakuext_" else: "shhext_" + result = result & methodName \ No newline at end of file