Add reader functions for Event types
							parent
							
								
									14058f4b69
								
							
						
					
					
						commit
						ce83d1260f
					
				|  | @ -1,5 +1,6 @@ | |||
| module Internal.Values.Event exposing | ||||
|     ( Event | ||||
|     , content, eventId, eventType, originServerTs, roomId, sender, stateKey | ||||
|     , UnsignedData, age, prevContent, redactedBecause, transactionId | ||||
|     , encode, decoder | ||||
|     ) | ||||
|  | @ -15,6 +16,11 @@ of a room. | |||
| @docs Event | ||||
| 
 | ||||
| 
 | ||||
| ## Get information | ||||
| 
 | ||||
| @docs content, eventId, eventType, originServerTs, roomId, sender, stateKey | ||||
| 
 | ||||
| 
 | ||||
| ## Unsigned data | ||||
| 
 | ||||
| @docs UnsignedData, age, prevContent, redactedBecause, transactionId | ||||
|  | @ -30,6 +36,7 @@ import Internal.Config.Default as Default | |||
| import Internal.Tools.Decode as D | ||||
| import Internal.Tools.Encode as E | ||||
| import Internal.Tools.Timestamp as Timestamp exposing (Timestamp) | ||||
| import Internal.Values.Envelope as Envelope | ||||
| import Json.Decode as D | ||||
| import Json.Encode as E | ||||
| 
 | ||||
|  | @ -37,6 +44,10 @@ import Json.Encode as E | |||
| {-| The Event type occurs everywhere on a user's timeline. | ||||
| -} | ||||
| type alias Event = | ||||
|     Envelope.Envelope IEvent | ||||
| 
 | ||||
| 
 | ||||
| type alias IEvent = | ||||
|     { content : E.Value | ||||
|     , eventId : String | ||||
|     , originServerTs : Timestamp | ||||
|  | @ -63,15 +74,30 @@ type UnsignedData | |||
| {-| Get the event's age, if at all provided by the homeserver. | ||||
| -} | ||||
| age : Event -> Maybe Int | ||||
| age event = | ||||
|     Maybe.andThen (\(UnsignedData data) -> data.age) event.unsigned | ||||
| age envelope = | ||||
|     Envelope.extract | ||||
|         (\event -> | ||||
|             Maybe.andThen | ||||
|                 (\(UnsignedData data) -> data.age) | ||||
|                 event.unsigned | ||||
|         ) | ||||
|         envelope | ||||
| 
 | ||||
| 
 | ||||
| {-| The Matrix protocol revolves around users being able to send each other | ||||
| JSON objects. This function reveals the JSON value that the user has sent to | ||||
| the room. | ||||
| -} | ||||
| content : Event -> E.Value | ||||
| content = | ||||
|     Envelope.extract .content | ||||
| 
 | ||||
| 
 | ||||
| {-| Decode an Event from a JSON value. | ||||
| -} | ||||
| decoder : D.Decoder Event | ||||
| decoder = | ||||
|     D.map8 Event | ||||
|     D.map8 IEvent | ||||
|         (D.field "content" D.value) | ||||
|         (D.field "eventId" D.string) | ||||
|         (D.field "originServerTs" Timestamp.decoder) | ||||
|  | @ -80,6 +106,7 @@ decoder = | |||
|         (D.opField "stateKey" D.string) | ||||
|         (D.field "eventType" D.string) | ||||
|         (D.opField "unsigned" decoderUnsignedData) | ||||
|         |> Envelope.decoder | ||||
| 
 | ||||
| 
 | ||||
| {-| Decode Unsigned Data from a JSON value. | ||||
|  | @ -96,7 +123,9 @@ decoderUnsignedData = | |||
| {-| Encode an Event into a JSON value. | ||||
| -} | ||||
| encode : Event -> E.Value | ||||
| encode event = | ||||
| encode envelope = | ||||
|     Envelope.encode | ||||
|         (\event -> | ||||
|             E.maybeObject | ||||
|                 [ ( "content", Just event.content ) | ||||
|                 , ( "eventId", Just <| E.string event.eventId ) | ||||
|  | @ -108,6 +137,8 @@ encode event = | |||
|                 , ( "unsigned", Maybe.map encodeUnsignedData event.unsigned ) | ||||
|                 , ( "version", Just <| E.string Default.currentVersion ) | ||||
|                 ] | ||||
|         ) | ||||
|         envelope | ||||
| 
 | ||||
| 
 | ||||
| {-| Encode Unsigned Data into a JSON value. | ||||
|  | @ -122,24 +153,105 @@ encodeUnsignedData (UnsignedData data) = | |||
|         ] | ||||
| 
 | ||||
| 
 | ||||
| {-| Every event is assigned a unique id in the room. You can use this event id | ||||
| to reference or look up events. | ||||
| -} | ||||
| eventId : Event -> String | ||||
| eventId = | ||||
|     Envelope.extract .eventId | ||||
| 
 | ||||
| 
 | ||||
| {-| To give a hint what the event's [content](#content) might look like, users | ||||
| can use this eventType value to hint at how the JSON might be decoded. | ||||
| 
 | ||||
| Standard examples of event types are `m.room.message`, `m.room.member` and | ||||
| `me.noordstar.game.chess.move`. | ||||
| 
 | ||||
| -} | ||||
| eventType : Event -> String | ||||
| eventType = | ||||
|     Envelope.extract .eventType | ||||
| 
 | ||||
| 
 | ||||
| {-| Timestamp of at what time the event was originally received by the original | ||||
| homeserver. | ||||
| 
 | ||||
| Generally, this timestamp offers a relalatively accurate indicator of when a | ||||
| message was sent. However, this number isn't completely reliable! The timestamp | ||||
| can be far in the past due to long network lag, and a (malicious) homeserver can | ||||
| spoof this number to make it seem like something was sent ridiculously far in | ||||
| the past - or even in the future. | ||||
| 
 | ||||
| -} | ||||
| originServerTs : Event -> Timestamp | ||||
| originServerTs = | ||||
|     Envelope.extract .originServerTs | ||||
| 
 | ||||
| 
 | ||||
| {-| Get the old content, if the event has changed or it has been edited. | ||||
| -} | ||||
| prevContent : Event -> Maybe E.Value | ||||
| prevContent event = | ||||
|     Maybe.andThen (\(UnsignedData data) -> data.prevContent) event.unsigned | ||||
| prevContent envelope = | ||||
|     Envelope.extract | ||||
|         (\event -> | ||||
|             Maybe.andThen | ||||
|                 (\(UnsignedData data) -> data.prevContent) | ||||
|                 event.unsigned | ||||
|         ) | ||||
|         envelope | ||||
| 
 | ||||
| 
 | ||||
| {-| If the event has been redacted, the homeserver can display the event that | ||||
| redacted it here. | ||||
| -} | ||||
| redactedBecause : Event -> Maybe Event | ||||
| redactedBecause event = | ||||
|     Maybe.andThen (\(UnsignedData data) -> data.redactedBecause) event.unsigned | ||||
| redactedBecause envelope = | ||||
|     Envelope.extract | ||||
|         (\event -> | ||||
|             Maybe.andThen | ||||
|                 (\(UnsignedData data) -> data.redactedBecause) | ||||
|                 event.unsigned | ||||
|         ) | ||||
|         envelope | ||||
| 
 | ||||
| 
 | ||||
| {-| Unique id assigned to the Matrix room. You can use this room id to reference | ||||
| or look up rooms. | ||||
| -} | ||||
| roomId : Event -> String | ||||
| roomId = | ||||
|     Envelope.extract .roomId | ||||
| 
 | ||||
| 
 | ||||
| {-| User id of the user that sent this event. You can use this user id to | ||||
| reference or look up users. | ||||
| -} | ||||
| sender : Event -> String | ||||
| sender = | ||||
|     Envelope.extract .sender | ||||
| 
 | ||||
| 
 | ||||
| {-| When an event's state key is `Nothing`, it is an ordinary message event in | ||||
| the timeline. | ||||
| 
 | ||||
| When the state key is `Just ""` or some other `Just string`, then it is a state | ||||
| event that affects how the room works. TODO: Explain state events. | ||||
| 
 | ||||
| -} | ||||
| stateKey : Event -> Maybe String | ||||
| stateKey = | ||||
|     Envelope.extract .stateKey | ||||
| 
 | ||||
| 
 | ||||
| {-| If the user has sent this event to the homeserver, then the homeserver might | ||||
| display the original transaction id used for the event. | ||||
| -} | ||||
| transactionId : Event -> Maybe String | ||||
| transactionId event = | ||||
|     Maybe.andThen (\(UnsignedData data) -> data.transactionId) event.unsigned | ||||
| transactionId envelope = | ||||
|     Envelope.extract | ||||
|         (\event -> | ||||
|             Maybe.andThen | ||||
|                 (\(UnsignedData data) -> data.transactionId) | ||||
|                 event.unsigned | ||||
|         ) | ||||
|         envelope | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| module Types exposing (Vault(..)) | ||||
| module Types exposing (Vault(..), Event(..)) | ||||
| 
 | ||||
| {-| The Elm SDK uses a lot of records and values that are easy to manipulate. | ||||
| Yet, the [Elm design guidelines](https://package.elm-lang.org/help/design-guidelines#keep-tags-and-record-constructors-secret) | ||||
|  | @ -12,13 +12,20 @@ access their content directly. | |||
| The opaque types are placed in a central module so all exposed modules can | ||||
| safely access all exposed data types without risking to create circular imports. | ||||
| 
 | ||||
| @docs Vault | ||||
| @docs Vault, Event | ||||
| 
 | ||||
| -} | ||||
| 
 | ||||
| import Internal.Values.Event as Event | ||||
| import Internal.Values.Vault as Vault | ||||
| 
 | ||||
| 
 | ||||
| {-| Opaque type for Matrix Event | ||||
| -} | ||||
| type Event | ||||
|     = Event Event.Event | ||||
| 
 | ||||
| 
 | ||||
| {-| Opaque type for Matrix Vault | ||||
| -} | ||||
| type Vault | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue