seperate dataspaces for core and friends
This commit is contained in:
parent
389fd04c4a
commit
2f83d0ef62
11
protocol.prs
11
protocol.prs
|
@ -10,6 +10,17 @@ Address = <address @text string> .
|
||||||
|
|
||||||
Name = <name @name string> .
|
Name = <name @name string> .
|
||||||
|
|
||||||
|
Connection = =none / =tcp / =udp .
|
||||||
|
Status = <status @status Connection> .
|
||||||
|
|
||||||
StatusMessage = <status-message @msg string> .
|
StatusMessage = <status-message @msg string> .
|
||||||
|
|
||||||
|
Typing = <typing> .
|
||||||
|
|
||||||
|
; Asserted by the core on a friend request.
|
||||||
|
FriendRequest = <request @key bytes @msg string> .
|
||||||
|
|
||||||
|
; Asserted to the core to accept a friend request.
|
||||||
|
FriendAccept = <accept @key bytes> .
|
||||||
|
|
||||||
BootstrapNode = <bootstrap @publicKey string @host string @port int> .
|
BootstrapNode = <bootstrap @publicKey string @host string @port int> .
|
||||||
|
|
|
@ -6,6 +6,10 @@ type
|
||||||
Name* {.preservesRecord: "name".} = object
|
Name* {.preservesRecord: "name".} = object
|
||||||
`name`*: string
|
`name`*: string
|
||||||
|
|
||||||
|
FriendRequest* {.preservesRecord: "request".} = object
|
||||||
|
`key`*: seq[byte]
|
||||||
|
`msg`*: string
|
||||||
|
|
||||||
FriendDataspace*[E] {.preservesRecord: "friend".} = ref object
|
FriendDataspace*[E] {.preservesRecord: "friend".} = ref object
|
||||||
`publicKey`*: seq[byte]
|
`publicKey`*: seq[byte]
|
||||||
`entity`*: Preserve[E]
|
`entity`*: Preserve[E]
|
||||||
|
@ -17,6 +21,8 @@ type
|
||||||
`publicKey`*: seq[byte]
|
`publicKey`*: seq[byte]
|
||||||
`entity`*: Preserve[E]
|
`entity`*: Preserve[E]
|
||||||
|
|
||||||
|
Typing* {.preservesRecord: "typing".} = object
|
||||||
|
|
||||||
BootstrapNode* {.preservesRecord: "bootstrap".} = object
|
BootstrapNode* {.preservesRecord: "bootstrap".} = object
|
||||||
`publicKey`*: string
|
`publicKey`*: string
|
||||||
`host`*: string
|
`host`*: string
|
||||||
|
@ -25,6 +31,14 @@ type
|
||||||
StatusMessage* {.preservesRecord: "status-message".} = object
|
StatusMessage* {.preservesRecord: "status-message".} = object
|
||||||
`msg`*: string
|
`msg`*: string
|
||||||
|
|
||||||
|
Status* {.preservesRecord: "status".} = object
|
||||||
|
`status`*: Connection
|
||||||
|
|
||||||
|
FriendAccept* {.preservesRecord: "accept".} = object
|
||||||
|
`key`*: seq[byte]
|
||||||
|
|
||||||
|
`Connection`* {.preservesOr, pure.} = enum
|
||||||
|
`none`, `tcp`, `udp`
|
||||||
CoreVersion* {.preservesRecord: "core".} = object
|
CoreVersion* {.preservesRecord: "core".} = object
|
||||||
`major`*: int
|
`major`*: int
|
||||||
`minor`*: int
|
`minor`*: int
|
||||||
|
@ -36,9 +50,16 @@ proc `$`*[E](x: FriendDataspace[E] | ToxDataspace[E]): string =
|
||||||
proc encode*[E](x: FriendDataspace[E] | ToxDataspace[E]): seq[byte] =
|
proc encode*[E](x: FriendDataspace[E] | ToxDataspace[E]): seq[byte] =
|
||||||
encode(toPreserve(x, E))
|
encode(toPreserve(x, E))
|
||||||
|
|
||||||
proc `$`*(x: Name | Address | BootstrapNode | StatusMessage | CoreVersion): string =
|
proc `$`*(x: Name | FriendRequest | Address | Typing | BootstrapNode |
|
||||||
|
StatusMessage |
|
||||||
|
Status |
|
||||||
|
FriendAccept |
|
||||||
|
CoreVersion): string =
|
||||||
`$`(toPreserve(x))
|
`$`(toPreserve(x))
|
||||||
|
|
||||||
proc encode*(x: Name | Address | BootstrapNode | StatusMessage | CoreVersion): seq[
|
proc encode*(x: Name | FriendRequest | Address | Typing | BootstrapNode |
|
||||||
byte] =
|
StatusMessage |
|
||||||
|
Status |
|
||||||
|
FriendAccept |
|
||||||
|
CoreVersion): seq[byte] =
|
||||||
encode(toPreserve(x))
|
encode(toPreserve(x))
|
||||||
|
|
|
@ -45,13 +45,12 @@ type
|
||||||
core: Tox
|
core: Tox
|
||||||
statusCounts: array[3, int]
|
statusCounts: array[3, int]
|
||||||
handles: CoreHandles
|
handles: CoreHandles
|
||||||
friendRequests: Table[toxcore.PublicKey, Handle]
|
friends: Table[Friend, FriendEntity]
|
||||||
friendEntities: seq[FriendEntity]
|
|
||||||
|
|
||||||
proc init(e: Entity; turn: var Turn; parent: Ref): Handle =
|
proc init(e: Entity; turn: var Turn; parent: Ref): Handle =
|
||||||
assert e.facet.isNil
|
assert e.facet.isNil
|
||||||
e.facet = turn.facet
|
e.facet = turn.facet
|
||||||
e.ds = newRef(turn, parent.target)
|
e.ds = newDataspace(turn)
|
||||||
|
|
||||||
proc initCore(entity: CoreEntity; turn: var Turn; parentRef: Ref) =
|
proc initCore(entity: CoreEntity; turn: var Turn; parentRef: Ref) =
|
||||||
assert entity.core.isNil
|
assert entity.core.isNil
|
||||||
|
@ -123,17 +122,53 @@ proc initCore(entity: CoreEntity; turn: var Turn; parentRef: Ref) =
|
||||||
entity.handles.statusMessage = publish(turn, entity.ds,
|
entity.handles.statusMessage = publish(turn, entity.ds,
|
||||||
StatusMessage(msg: entity.core.statusMessage))
|
StatusMessage(msg: entity.core.statusMessage))
|
||||||
block: # Friends initialization
|
block: # Friends initialization
|
||||||
var friendNums = entity.core.friends
|
proc createFriend(turn: var Turn; fn: Friend) =
|
||||||
entity.friendEntities.setLen(friendNums.len)
|
|
||||||
for fn in friendNums:
|
|
||||||
var fe = new FriendEntity
|
var fe = new FriendEntity
|
||||||
discard init(fe, turn, entity.ds)
|
discard init(fe, turn, entity.ds)
|
||||||
discard publish(turn, entity.ds, FriendDataspace[Ref](
|
discard publish(turn, entity.ds, FriendDataspace[Ref](
|
||||||
publicKey: entity.core.publicKey(fn).bytes.toSeq,
|
publicKey: entity.core.publicKey(fn).bytes.toSeq,
|
||||||
entity: fe.ds.embed))
|
entity: fe.ds.embed))
|
||||||
if fn.int > entity.friendEntities.len:
|
fe.handles.name = publish(turn, fe.ds, Name(name: entity.core.name(fn)))
|
||||||
entity.friendEntities.setLen(fn.int.succ)
|
entity.friends[fn] = fe
|
||||||
entity.friendEntities[int fn] = fe
|
|
||||||
|
for fn in entity.core.friends: createFriend(turn, fn)
|
||||||
|
|
||||||
|
entity.core.onSelfConnectionStatus do (status: toxcore.Connection):
|
||||||
|
run(entity.facet) do (turn: var Turn):
|
||||||
|
let conn = case status
|
||||||
|
of TOX_CONNECTION_NONE: protocol.Connection.none
|
||||||
|
of TOX_CONNECTION_TCP: protocol.Connection.tcp
|
||||||
|
of TOX_CONNECTION_UDP: protocol.Connection.udp
|
||||||
|
replace(turn, entity.ds, entity.handles.connectionStatus,
|
||||||
|
Status(status: conn))
|
||||||
|
|
||||||
|
template update[T](fe: FriendEntity; h: var Handle; a: T) =
|
||||||
|
run(fe.facet) do (turn: var Turn): replace(turn, fe.ds, h, a)
|
||||||
|
|
||||||
|
entity.core.onFriendName do (num: Friend; name: string):
|
||||||
|
let fe = entity.friends[num]
|
||||||
|
update(fe, fe.handles.name, Name(name: name))
|
||||||
|
|
||||||
|
entity.core.onFriendStatusMessage do (num: Friend; msg: string):
|
||||||
|
let fe = entity.friends[num]
|
||||||
|
update(fe, fe.handles.statusMessage, StatusMessage(msg: msg))
|
||||||
|
|
||||||
|
entity.core.onFriendTyping do (num: Friend; typing: bool):
|
||||||
|
let fe = entity.friends[num]
|
||||||
|
if typing:
|
||||||
|
update(fe, fe.handles.typing, Typing())
|
||||||
|
else:
|
||||||
|
run(fe.facet) do (turn: var Turn):
|
||||||
|
retract(turn, fe.handles.typing)
|
||||||
|
|
||||||
|
entity.core.onFriendRequest do (pk: PublicKey; msg: string):
|
||||||
|
run(entity.facet) do (turn: var Turn):
|
||||||
|
let reqHandle = publish(turn, entity.ds,
|
||||||
|
FriendRequest(key: pk.bytes.toSeq, msg: msg))
|
||||||
|
onPublish(turn, entity.ds, ?FriendAccept(key: pk.bytes.toSeq)) do:
|
||||||
|
createFriend(turn, entity.core.addFriendNoRequest(pk))
|
||||||
|
retract(turn, reqHandle)
|
||||||
|
# TODO: stop watching for the accept assertion
|
||||||
|
|
||||||
var alive: bool
|
var alive: bool
|
||||||
setControlCHook do:
|
setControlCHook do:
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<require-service <daemon tox_bot>>
|
||||||
|
<daemon tox_bot {
|
||||||
|
argv: "/home/repo/syndicate/syndicate_actor_tox/syndicate_actor_tox"
|
||||||
|
dir: "/home/repo/syndicate/syndicate_actor_tox"
|
||||||
|
protocol: text/syndicate
|
||||||
|
clearEnv: #t
|
||||||
|
}>
|
||||||
|
|
||||||
|
? <service-object <daemon tox_bot> ?tox> [
|
||||||
|
$config ? <service-object <daemon freedesktop_notifier> ?notifier> [
|
||||||
|
$tox [
|
||||||
|
<bootstrap "6EF679EBD205E8DF9B6975D21CD157D046287700CADDF86F94B7ED243DC26A30" "20a:c3d2:8cf8:f8e5:80fe:9194:3800:87e6" 33445>
|
||||||
|
? <tox ?pk ?core> $core [
|
||||||
|
? <address ?addr> $log ! <log "-" { line: ["tox address" $addr] }>
|
||||||
|
? <request ?pk ?msg> [
|
||||||
|
$notifier ! <notify "friend request" $msg 0 Low>
|
||||||
|
<accept $pk>
|
||||||
|
]
|
||||||
|
? <friend ?pk ?friend> $friend [
|
||||||
|
$notifier ! <notify "new friend" $pk 0 Low>
|
||||||
|
? <name ?name> [
|
||||||
|
$notifier ! <notify "friend name" $name 0 Low>
|
||||||
|
? <status-message ?msg> [ $notifier ! <notify $name $msg 0 Low> ]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
Loading…
Reference in New Issue