@@ -297,6 +297,11 @@ update msg model =
297297 timestamp =
298298 model.currentTime
299299
300+ senderXPubHex =
301+ model.xPub
302+ |> Maybe.map X.publicKeyToHex
303+ |> Maybe.withDefault ""
304+
300305 plaintextJson =
301306 Encode.encode 0
302307 (Encode.object
@@ -304,11 +309,12 @@ update msg model =
304309 , ( "id", Encode.string msgId )
305310 , ( "timestamp", Encode.int timestamp )
306311 , ( "body", Encode.string model.draft )
312+ , ( "xpub", Encode.string senderXPubHex )
307313 ]
308314 )
309315
310316 blob =
311− encryptMessage edPriv edPub c.xPubHex ephSeedHex nonceHex plaintextJson
317+ encryptMessage edPriv edPub senderXPubHex c.xPubHex ephSeedHex nonceHex plaintextJson
312318
313319 outMsg =
314320 { id = msgId
@@ -390,36 +396,42 @@ update msg model =
390396
391397 updatedMessages =
392398 List.foldl
393− (\( from, chatMsg ) dict ->
399+ (\im dict ->
394400 let
395401 existing =
396− Dict.get from dict |> Maybe.withDefault []
402+ Dict.get im.senderEdPubHex dict |> Maybe.withDefault []
397403 in
398− Dict.insert from (existing ++ [ chatMsg ]) dict
404+ Dict.insert im.senderEdPubHex (existing ++ [ im.chatMsg ]) dict
399405 )
400406 model.messages
401407 newMessages
402408
403409 updatedContacts =
404410 List.foldl
405− (\( from, chatMsg ) dict ->
406− Dict.update from
411+ (\im dict ->
412+ Dict.update im.senderEdPubHex
407413 (\existing ->
408414 case existing of
409415 Just c ->
410416 Just
411417 { c
412− | lastMessage = chatMsg.body
413− , lastTime = chatMsg.timestamp
418+ | lastMessage = im.chatMsg.body
419+ , lastTime = im.chatMsg.timestamp
420+ , xPubHex =
421+ if String.isEmpty c.xPubHex && not (String.isEmpty im.senderXPubHex) then
422+ im.senderXPubHex
423+
424+ else
425+ c.xPubHex
414426 }
415427
416428 Nothing ->
417429 Just
418− { edPubHex = from
419− , xPubHex = ""
420− , name = String.left 8 from ++ "..."
421− , lastMessage = chatMsg.body
422− , lastTime = chatMsg.timestamp
430+ { edPubHex = im.senderEdPubHex
431+ , xPubHex = im.senderXPubHex
432+ , name = String.left 8 im.senderEdPubHex ++ "..."
433+ , lastMessage = im.chatMsg.body
434+ , lastTime = im.chatMsg.timestamp
423435 , online = True
424436 }
425437 )
@@ -1267,8 +1279,9 @@ encryptMessage :
12671279 -> String
12681280 -> String
12691281 -> String
1282+ -> String
12701283 -> Maybe String
1271−encryptMessage edPriv edPub recipientXPubHex ephSeedHex nonceHex plaintextJson =
1284+encryptMessage edPriv edPub senderXPubHex recipientXPubHex ephSeedHex nonceHex plaintextJson =
12721285 case ( X.privateKeyFromHex ephSeedHex, X.publicKeyFromHex recipientXPubHex, Cipher.nonce24FromHex nonceHex ) of
12731286 ( Just ephPriv, Just recipientXPub, Just nonce ) ->
12741287 let
@@ -1379,6 +1392,15 @@ decryptMessage xPriv blob =
13791392 Nothing
13801393
13811394
1395+{-| Incoming message with sender info.
1396+-}
1397+type alias IncomingMessage =
1398+ { senderEdPubHex : String
1399+ , senderXPubHex : String
1400+ , chatMsg : ChatMessage
1401+ }
1402+
1403+
13821404{-| Process poll events: decrypt, dedup, collect ACK IDs.
13831405-}
13841406processEvents :
@@ -1386,7 +1408,7 @@ processEvents :
13861408 -> String
13871409 -> List PollEvent
13881410 -> Set String
1389− -> ( List ( String, ChatMessage ), Set String, List String )
1411+ -> ( List IncomingMessage, Set String, List String )
13901412processEvents xPriv myEdHex events seenIds =
13911413 List.foldl
13921414 (\event ( msgs, seen, acks ) ->
@@ -1418,13 +1440,15 @@ processEvents xPriv myEdHex events seenIds =
14181440 ( msgs, seen, event.id :: acks )
14191441
14201442 else
1421− ( ( senderPub
1422− , { id = payload.id
1423− , body = payload.body
1424− , timestamp = payload.timestamp
1425− , outgoing = False
1426− }
1427− )
1443+ ( { senderEdPubHex = senderPub
1444+ , senderXPubHex = payload.xpub
1445+ , chatMsg =
1446+ { id = payload.id
1447+ , body = payload.body
1448+ , timestamp = payload.timestamp
1449+ , outgoing = False
1450+ }
1451+ }
14281452 :: msgs
14291453 , Set.insert payload.id seen
14301454 , event.id :: acks
@@ -1525,16 +1549,22 @@ type alias MessagePayload =
15251549 , id : String
15261550 , timestamp : Int
15271551 , body : String
1552+ , xpub : String
15281553 }
15291554
15301555
15311556messagePayloadDecoder : Decoder MessagePayload
15321557messagePayloadDecoder =
1533− Decode.map4 MessagePayload
1558+ Decode.map5 MessagePayload
15341559 (Decode.field "type" Decode.string)
15351560 (Decode.field "id" Decode.string)
15361561 (Decode.field "timestamp" Decode.int)
15371562 (Decode.field "body" Decode.string)
1563+ (Decode.oneOf
1564+ [ Decode.field "xpub" Decode.string
1565+ , Decode.succeed ""
1566+ ]
1567+ )
15381568
15391569
15401570type alias LookupResponse =