Compare commits
2 Commits
6fca321f9c
...
54aefcb22e
Author | SHA1 | Date |
---|---|---|
|
54aefcb22e | |
|
be910a5ffa |
22
README.md
22
README.md
|
@ -26,13 +26,19 @@ let ?ds = dataspace
|
|||
]
|
||||
|
||||
$ds [
|
||||
?? <recv {"@type": "error", "code": ?code, "message": ?message}> [
|
||||
$log ! <log "-" { error: {code: $code, message: $message } }>
|
||||
? ?v [
|
||||
$log ! <log "-" { |+++|: $v }>
|
||||
?- $log ! <log "-" { |---|: $v }>
|
||||
]
|
||||
?? <send ?v> [ $log ! <log "-" { |>>>|: $v }> ]
|
||||
?? <recv ?v> [ $log ! <log "-" { |<<<|: $v }> ]
|
||||
? ?v [ $log ! <log "-" { assertion: $v }> ]
|
||||
? <telegram-ready> [
|
||||
|
||||
# Raw TDLib interaction.
|
||||
? <tdlib ?messages> $messages [
|
||||
?? <send ?v> [ $log ! <log "-" { |>>>|: $v }> ]
|
||||
?? <recv ?v> [ $log ! <log "-" { |<<<|: $v }> ]
|
||||
?? <recv {"@type": "error", "code": ?code, "message": ?message}> [
|
||||
$log ! <log "-" { error: {code: $code, message: $message } }>
|
||||
]
|
||||
|
||||
! <send {"@type": "getOption", "name":"version"}>
|
||||
|
||||
?? <recv {"@type": "updateAuthorizationState", "authorization_state": {"@type": "authorizationStateWaitTdlibParameters"}}> [
|
||||
|
@ -100,9 +106,7 @@ $ds [
|
|||
}
|
||||
}
|
||||
}> [
|
||||
$ds ? <user $user_id ?first_name> [
|
||||
$log ! <log "-" { chat_id: $chat_id, first_name: $first_name, updateChatLastMessage: $text, date: $date, user_id: $user_id }>
|
||||
]
|
||||
$log ! <log "-" { updateChatLastMessage: { chat_id: $chat_id, date: $date, text: $text, user_id: $user_id } }>
|
||||
]
|
||||
|
||||
]
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
version 1 .
|
||||
|
||||
# Assert to the actor to register a dataspace for interaction.
|
||||
TelegramArguments = <telegram-client {
|
||||
dataspace: #:any
|
||||
}>.
|
||||
|
||||
# Assertion made when the client is ready to process messages.
|
||||
# Assertion made to when the client is ready to process messages.
|
||||
TelegramReady = <telegram-ready> .
|
||||
|
||||
# Asserted to telegram-client to expose TDLib messages.
|
||||
# Messages received from and sent to TDLib are in the
|
||||
# form of <recv {…}> and <sent {…}> respectively.
|
||||
TDLibClient = <tdlib @messages #:any>.
|
||||
|
|
47
lock.json
47
lock.json
|
@ -1,5 +1,22 @@
|
|||
{
|
||||
"depends": [
|
||||
{
|
||||
"date": "2024-05-22T05:31:33+02:00",
|
||||
"deepClone": false,
|
||||
"fetchLFS": false,
|
||||
"fetchSubmodules": true,
|
||||
"hash": "sha256-OJW1ZSOgT3lxtgwnKumay9xbH9LlObgiU+sVdP3Wl8o=",
|
||||
"leaveDotGit": false,
|
||||
"method": "git",
|
||||
"packages": [
|
||||
"syndicate"
|
||||
],
|
||||
"path": "/nix/store/dkaj279b40qgmyb9l78jj620czchmi1v-syndicate-nim",
|
||||
"rev": "54b711b28a48e6c6d1aeeb3c3fc7085d4d9debf8",
|
||||
"sha256": "1jlpsvyp85gbacibhfg5s8gmpp6bkbljl9qcnrqpjkx04djvb59q",
|
||||
"srcDir": "src",
|
||||
"url": "https://git.syndicate-lang.org/ehmry/syndicate-nim.git"
|
||||
},
|
||||
{
|
||||
"method": "fetchzip",
|
||||
"packages": [
|
||||
|
@ -33,27 +50,16 @@
|
|||
"srcDir": "src",
|
||||
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.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/m1qrs3hwcl5a3bkd8f7nbx5p5syid1dh-source",
|
||||
"rev": "50e8a9b41d221b4eb9981358f65a9ea1a904b471",
|
||||
"sha256": "0w3pwrg4mjpnzsm16jqg0862v3rgb3pdaxzjrrhwz1rbl04gxa6i",
|
||||
"path": "/nix/store/fkrcpp8lzj2yi21na79xm63xk0ggnqsp-source",
|
||||
"rev": "485f7b3cfa83c1beecc0e31be0e964d697aa74d7",
|
||||
"sha256": "1h3dzdbc9kacwpi10mj73yjglvn7kbizj1x8qc9099ax091cj5xn",
|
||||
"srcDir": "",
|
||||
"url": "https://github.com/cheatfate/nimcrypto/archive/50e8a9b41d221b4eb9981358f65a9ea1a904b471.tar.gz"
|
||||
"url": "https://github.com/cheatfate/nimcrypto/archive/485f7b3cfa83c1beecc0e31be0e964d697aa74d7.tar.gz"
|
||||
},
|
||||
{
|
||||
"method": "fetchzip",
|
||||
|
@ -88,17 +94,6 @@
|
|||
"srcDir": "",
|
||||
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
|
||||
},
|
||||
{
|
||||
"method": "fetchzip",
|
||||
"packages": [
|
||||
"syndicate"
|
||||
],
|
||||
"path": "/nix/store/dw30cq9gxz3353zgaq4a36ajq6chvbwc-source",
|
||||
"rev": "3a4dc1f13392830b587138199643d30fdbec8541",
|
||||
"sha256": "1mbd17rjm1fsx7d0ckzyjih2nzdjqs52ck9wscqcg9nvf3ib5mvh",
|
||||
"srcDir": "src",
|
||||
"url": "https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/3a4dc1f13392830b587138199643d30fdbec8541.tar.gz"
|
||||
},
|
||||
{
|
||||
"method": "fetchzip",
|
||||
"packages": [
|
||||
|
|
|
@ -25,21 +25,22 @@ let actor = bootActor("main") do (turn: Turn):
|
|||
state.initialRef = ds
|
||||
|
||||
during(turn, ds, TelegramArguments.grabTypeFlat) do (ds: Cap):
|
||||
|
||||
# Extern actors assert themselves here and a ClientId
|
||||
# is used to isolate their conversations with tdlib.
|
||||
let client = td_create_client_id()
|
||||
state.subscribers[client.int] = ds
|
||||
let
|
||||
client = td_create_client_id()
|
||||
tdlib = turn.newDataspace()
|
||||
state.subscribers[client.int] = tdlib
|
||||
|
||||
onMessage(turn, ds, grabRecord("send", grab())) do (v: Value):
|
||||
onMessage(turn, tdlib, grabRecord("send", grab())) do (v: Value):
|
||||
state.buffer.setPosition 0
|
||||
state.buffer.writeText(v, textJson)
|
||||
state.buffer.data.setLen state.buffer.getPosition
|
||||
td_send(client, state.buffer.data)
|
||||
# TODO: enforce that the subscriber has not set "@client_id"?
|
||||
|
||||
publish(turn, ds, TelegramReady())
|
||||
# Assert to the subscriber that the messages
|
||||
# it sends will be processed.
|
||||
publish(turn, ds, TDLibClient(messages: tdlib.embed))
|
||||
|
||||
do:
|
||||
state.subscribers.del client.int
|
||||
|
|
|
@ -3,6 +3,9 @@ import
|
|||
preserves
|
||||
|
||||
type
|
||||
TDLibClient* {.preservesRecord: "tdlib".} = object
|
||||
`messages`* {.preservesEmbedded.}: Value
|
||||
|
||||
TelegramReady* {.preservesRecord: "telegram-ready".} = object
|
||||
|
||||
TelegramArgumentsField0* {.preservesDictionary.} = object
|
||||
|
@ -11,8 +14,8 @@ type
|
|||
TelegramArguments* {.preservesRecord: "telegram-client".} = object
|
||||
`field0`*: TelegramArgumentsField0
|
||||
|
||||
proc `$`*(x: TelegramReady | TelegramArguments): string =
|
||||
proc `$`*(x: TDLibClient | TelegramReady | TelegramArguments): string =
|
||||
`$`(toPreserves(x))
|
||||
|
||||
proc encode*(x: TelegramReady | TelegramArguments): seq[byte] =
|
||||
proc encode*(x: TDLibClient | TelegramReady | TelegramArguments): seq[byte] =
|
||||
encode(toPreserves(x))
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
version = "20240521"
|
||||
version = "20240522"
|
||||
author = "Emery Hemingway"
|
||||
description = "Telegram client as a Syndicated Actor"
|
||||
license = "Unlicense"
|
||||
srcDir = "src"
|
||||
bin = @["telegram_actor"]
|
||||
|
||||
requires "syndicate"
|
||||
requires "https://git.syndicate-lang.org/ehmry/syndicate-nim.git >= 20240522"
|
||||
|
|
Loading…
Reference in New Issue