diff --git a/README.md b/README.md index 8ed5b10..e4e5196 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # SimpleX bot actor -A [syndicated actor](https://syndicate-lang.org/) for collecting data from the the [SimpleX](https://simplex.chat/) websocket and reformatting as Syndicate assertions. +A [syndicated actor](https://syndicate-lang.org/) for collecting data from the [SimpleX](https://simplex.chat/) websocket and reformatting it as Syndicate assertions. diff --git a/Tupfile b/Tupfile index 28c450e..eaaeaaf 100644 --- a/Tupfile +++ b/Tupfile @@ -1,2 +1,3 @@ include_rules -: lock.json |> !nim_cfg |> | ./ +: |> !nim_lk |> {lockfile} +: {lockfile} |> !nim_cfg |> | ./ diff --git a/Tuprules.tup b/Tuprules.tup index e673b0a..20e7ebb 100644 --- a/Tuprules.tup +++ b/Tuprules.tup @@ -1,5 +1,6 @@ include ../eris-nim/depends.tup include ../syndicate-nim/depends.tup +NIM = $(DIRENV) $(NIM) NIM_FLAGS += --path:$(TUP_CWD)/../syndicate-nim/src NIM_FLAGS += --path:$(TUP_CWD)/../eris-nim/src NIM_GROUPS += $(TUP_CWD)/ diff --git a/lock.json b/lock.json index 25030d0..845b403 100644 --- a/lock.json +++ b/lock.json @@ -1 +1,103 @@ -{"depends":[{"method":"fetchzip","path":"/nix/store/v03nzlpdgbfxd2zhcnkfbkq01d5kqxcl-source","rev":"84e0247555e4488594975900401baaf5bbbfb53","sha256":"1pfczsv8kl36qpv543f93d2y2vgz2acckssfap7l51s2x62m6qwx","url":"https://github.com/khchen/hashlib/archive/84e0247555e4488594975900401baaf5bbbfb53.tar.gz","packages":["hashlib"],"srcDir":""},{"method":"fetchzip","path":"/nix/store/008s11kkqscfqxs6g29q77c38pnrlppi-source","rev":"552e51899c82c0c2f4f466382be7d8e22a1da689","sha256":"1j3k0zlh5z02adhfvb7rdqz8fjzc6gri4v3v1fgcv2h2b7vrf0dg","url":"https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/552e51899c82c0c2f4f466382be7d8e22a1da689.tar.gz","ref":"20231005","packages":["syndicate"],"srcDir":"src"},{"method":"fetchzip","path":"/nix/store/vx6ihnickx7d5lwy69i8k7fsjicv33r3-source","rev":"c915accf7d2a36ca1f323e2f02e2df7375e815f1","sha256":"11rlcbs9mvk335ibkbj8fk9aslhmnlaiqhcsjpp5n04k447sr7nx","url":"https://git.syndicate-lang.org/ehmry/preserves-nim/archive/c915accf7d2a36ca1f323e2f02e2df7375e815f1.tar.gz","ref":"20230914","packages":["preserves"],"srcDir":"src"},{"method":"fetchzip","path":"/nix/store/zyr8zwh7vaiycn1s4r8cxwc71f2k5l0h-source","rev":"602c5d20c69c76137201b5d41f788f72afb95aa8","sha256":"1dmdmgb6b9m5f8dyxk781nnd61dsk3hdxqks7idk9ncnpj9fng65","url":"https://github.com/cheatfate/nimcrypto/archive/602c5d20c69c76137201b5d41f788f72afb95aa8.tar.gz","ref":"traditional-api","packages":["nimcrypto"],"srcDir":""},{"method":"fetchzip","path":"/nix/store/ffkxmjmigfs7zhhiiqm0iw2c34smyciy-source","rev":"26d62fdc40feb84c6533956dc11d5ee9ea9b6c09","sha256":"0xpzifjkfp49w76qmaylan8q181bs45anmp46l4bwr3lkrr7bpwh","url":"https://github.com/zevv/npeg/archive/26d62fdc40feb84c6533956dc11d5ee9ea9b6c09.tar.gz","ref":"1.2.1","packages":["npeg"],"srcDir":"src"}]} +{ + "depends": [ + { + "method": "fetchzip", + "packages": [ + "bigints" + ], + "path": "/nix/store/jvrm392g8adfsgf36prgwkbyd7vh5jsw-source", + "rev": "86ea14d31eea9275e1408ca34e6bfe9c99989a96", + "sha256": "15pcpmnk1bnw3k8769rjzcpg00nahyrypwbxs88jnwr4aczp99j4", + "srcDir": "src", + "url": "https://github.com/ehmry/nim-bigints/archive/86ea14d31eea9275e1408ca34e6bfe9c99989a96.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "cps" + ], + "path": "/nix/store/452hfhasrn3gl6vijfmzs69djl099j0j-source", + "rev": "b7c179f172e3a256a482a9daee3c0815ea423206", + "sha256": "1sn9s7iv83sw1jl5jgi2h7b0xpgsn13f9icp5124jvbp0qkxskx2", + "srcDir": "", + "url": "https://github.com/nim-works/cps/archive/b7c179f172e3a256a482a9daee3c0815ea423206.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "hashlib" + ], + "path": "/nix/store/fav82xdbicvlk34nmcbl89zx99lr3mbs-source", + "rev": "f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac", + "sha256": "1sx6j952lj98629qfgr7ds5aipyw9d6lldcnnqs205wpj4pkcjb3", + "srcDir": "", + "url": "https://github.com/ehmry/hashlib/archive/f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "nimcrypto" + ], + "path": "/nix/store/jwz8pqbv6rsm8w4fjzdb37r0wzjn5hv0-source", + "rev": "d58da671799c69c0b3208b96c154e13c8b1a9e90", + "sha256": "12dm0gsy10ppga7zf7hpf4adaqjrd9b740n2w926xyazq1njf6k9", + "srcDir": "", + "url": "https://github.com/cheatfate/nimcrypto/archive/d58da671799c69c0b3208b96c154e13c8b1a9e90.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "npeg" + ], + "path": "/nix/store/ffkxmjmigfs7zhhiiqm0iw2c34smyciy-source", + "rev": "26d62fdc40feb84c6533956dc11d5ee9ea9b6c09", + "sha256": "0xpzifjkfp49w76qmaylan8q181bs45anmp46l4bwr3lkrr7bpwh", + "srcDir": "src", + "url": "https://github.com/zevv/npeg/archive/26d62fdc40feb84c6533956dc11d5ee9ea9b6c09.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "preserves" + ], + "path": "/nix/store/2hy124xgabz134dxj3wji7mp47fdwy3w-source", + "rev": "9ae435a83c6d5028405538af5d24a023af625b6e", + "sha256": "1k7ywcp1a53x2fpc6wc2b0qzb264dkifash0s1wcp66rw3lx15k2", + "srcDir": "src", + "url": "https://git.syndicate-lang.org/ehmry/preserves-nim/archive/9ae435a83c6d5028405538af5d24a023af625b6e.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "stew" + ], + "path": "/nix/store/mqg8qzsbcc8xqabq2yzvlhvcyqypk72c-source", + "rev": "3c91b8694e15137a81ec7db37c6c58194ec94a6a", + "sha256": "17lfhfxp5nxvld78xa83p258y80ks5jb4n53152cdr57xk86y07w", + "srcDir": "", + "url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "syndicate" + ], + "path": "/nix/store/yv8nzv7g3nxkz61ylzshs70h754vjq3d-source", + "rev": "b209548f5d15f7391c08fcaec3615ed843f8a410", + "sha256": "0pkypbi42cr01lms5adkl55lyqpniqi4sb1mqnlalr79a70b0vf6", + "srcDir": "src", + "url": "https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/b209548f5d15f7391c08fcaec3615ed843f8a410.tar.gz" + }, + { + "method": "fetchzip", + "packages": [ + "sys" + ], + "path": "/nix/store/syhxsjlsdqfap0hk4qp3s6kayk8cqknd-source", + "rev": "4ef3b624db86e331ba334e705c1aa235d55b05e1", + "sha256": "1q4qgw4an4mmmcbx48l6xk1jig1vc8p9cq9dbx39kpnb0890j32q", + "srcDir": "src", + "url": "https://github.com/ehmry/nim-sys/archive/4ef3b624db86e331ba334e705c1aa235d55b05e1.tar.gz" + } + ] +} diff --git a/shell.nix b/shell.nix index 24f8937..3a6cdd4 100644 --- a/shell.nix +++ b/shell.nix @@ -1,2 +1,5 @@ { pkgs ? import { } }: -pkgs.nim2Packages.buildNimPackage { name = "dummy"; } +pkgs.buildNimPackage { + name = "dummy"; + lockFile = ./lock.json; +} diff --git a/simplex_bot_actor.nimble b/simplex_bot_actor.nimble index 1e248aa..2ac453b 100644 --- a/simplex_bot_actor.nimble +++ b/simplex_bot_actor.nimble @@ -1,6 +1,6 @@ bin = @["simplex_bot_actor"] license = "Unlicense" srcDir = "src" -version = "20231028" +version = "20240315" -requires "nim", "syndicate" +requires "syndicate#b209548f5d15f7391c08fcaec3615ed843f8a410" diff --git a/src/schema/simple_types.nim b/src/schema/simple_types.nim index f9f87b0..59a9e71 100644 --- a/src/schema/simple_types.nim +++ b/src/schema/simple_types.nim @@ -4,20 +4,20 @@ import type Contact* {.preservesRecord: "contact".} = object - `field0`*: Table[Symbol, Preserve[void]] + `field0`*: Table[Symbol, Value] Command* {.preservesDictionary.} = object `cmd`*: string `corrId`*: string Chat* {.preservesRecord: "chat".} = object - `field0`*: Table[Symbol, Preserve[void]] + `field0`*: Table[Symbol, Value] Group* {.preservesRecord: "group".} = object - `field0`*: Table[Symbol, Preserve[void]] + `field0`*: Table[Symbol, Value] proc `$`*(x: Contact | Command | Chat | Group): string = - `$`(toPreserve(x)) + `$`(toPreserves(x)) proc encode*(x: Contact | Command | Chat | Group): seq[byte] = - encode(toPreserve(x)) + encode(toPreserves(x)) diff --git a/src/simplex_bot_actor.nim b/src/simplex_bot_actor.nim index 402778c..feaecc9 100644 --- a/src/simplex_bot_actor.nim +++ b/src/simplex_bot_actor.nim @@ -20,7 +20,7 @@ func step(pr: Assertion; path: varargs[string]): Option[Assertion] = proc sendCommand(turn: var Turn; ds: Cap; cmd: string) = ## Simplex websocket only accepts command ## strings in the format of the CLI client. - message(turn, ds, initRecord("send", Command(cmd: cmd).toPreserve)) + message(turn, ds, initRecord("send", Command(cmd: cmd).toPreserves)) proc `%`(bindings: sink openArray[(string, Pattern)]): Pattern = ## Sugar for creating dictionary patterns. @@ -64,7 +64,7 @@ proc updateContact(turn: var Turn; state: State; id, attrs: Assertion) = var attrs = attrs imagePath = attrs.step("profile", "image").extractImagePath - attrs["image".toSymbol(Cap)] = imagePath.toPreserve(Cap) + attrs["image".toSymbol(Cap)] = imagePath.toPreserves updateTable(turn, state, state.contacts, id, initRecord("contact", attrs)) proc updateGroup(turn: var Turn; state: State; id, attrs: Assertion) = @@ -72,7 +72,7 @@ proc updateGroup(turn: var Turn; state: State; id, attrs: Assertion) = var attrs = attrs imagePath = attrs.step("groupProfile", "image").extractImagePath - attrs["image".toSymbol(Cap)] = imagePath.toPreserve(Cap) + attrs["image".toSymbol(Cap)] = imagePath.toPreserves updateTable(turn, state, state.groups, id, initRecord("group", attrs)) proc updateChat(turn: var Turn; state: State; ass: Assertion) = @@ -115,6 +115,6 @@ type BootArgs {.preservesDictionary.} = object runActor("simplex_bot_actor") do (turn: var Turn, root: Cap): connectStdio(turn, root) - during(turn, root, ?BootArgs) do (ds: Cap, websocket: Cap): + during(turn, root, ?:BootArgs) do (ds: Cap, websocket: Cap): let state = State(ds: ds, websocket: websocket) bootChats(turn, state)