From 5d347b2ba8f6c2d6d4f8d8a72f462cf6a96c6e0a Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 21 May 2024 14:47:16 +0200 Subject: [PATCH] Assert parse failures Some messages with emojii aren't parsing, log and discard them. --- README.md | 1 + src/telegram_actor.nim | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6044cc5..047592e 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Probably a front for gathering metadata, like Signal, except FSB. let ?ds = dataspace ? ?cap> [ + $cap ? [ $log ! ] $cap ] diff --git a/src/telegram_actor.nim b/src/telegram_actor.nim index 2bd1f9e..c64179d 100644 --- a/src/telegram_actor.nim +++ b/src/telegram_actor.nim @@ -11,8 +11,10 @@ discard td_execute("""{"@type":"setLogVerbosityLevel", "new_verbosity_level":0}" type State = ref object facet: Facet + initialRef: Cap subscribers: Table[int, Cap] buffer: StringStream + recvError: Handle let state = State( buffer: newStringStream() ) # Global state object @@ -20,6 +22,7 @@ let state = State( buffer: newStringStream() ) let actor = bootActor("main") do (turn: Turn): state.facet = turn.facet resolveEnvironment(turn) do (turn: Turn; ds: Cap): + state.initialRef = ds during(turn, ds, TelegramArguments.grabTypeFlat) do (ds: Cap): # Extern actors assert themselves here and a ClientId @@ -47,14 +50,8 @@ proc recv(state: State; id: int; recvMsg: Value) = queueTurn(state.facet) do (turn: Turn): message(turn, subscriber, recvMsg) -while actor.running: - # Poll Syndicate and Telegram - const - syndicateTimeout = some initDuration(seconds = 4) - telegramTimeout = 4.0 - syndicate.runOnce(syndicateTimeout) - let cstr = td_receive(telegramTimeout) - if not cstr.isNil: +proc recv(state: State; cstr: cstring) = + try: var pr = parsePreserves $cstr clientId: Value @@ -63,3 +60,20 @@ while actor.running: recv(state, clientId.register, initRecord("recv", pr)) else: stderr.writeLine "discarding message without @client_id: ", cstr + except ValueError: + var buf = newSeq[byte](cstr.len) + copyMem(buf[0].addr, cstr[0].addr, buf.len) + var rec = initRecord("telegram-recv-error", buf.toPreserves) + stderr.writeLine rec + queueTurn(state.facet) do (turn: Turn): + replace(turn, state.initialRef, state.recvError, rec) + +while actor.running: + # Poll Syndicate and Telegram + const + syndicateTimeout = some initDuration(seconds = 4) + telegramTimeout = 4.0 + syndicate.runOnce(syndicateTimeout) + let cstr = td_receive(telegramTimeout) + if not cstr.isNil: + recv(state, cstr)