Add basic notification priority filtering.
This commit is contained in:
		
							parent
							
								
									e762864b45
								
							
						
					
					
						commit
						70d6eba427
					
				| @ -284,7 +284,7 @@ updateSyncResponse model r notify = | |||||||
|         notification sr = findFirstBy |         notification sr = findFirstBy | ||||||
|             (\(s, e) -> e.originServerTs) |             (\(s, e) -> e.originServerTs) | ||||||
|             (\(s, e) -> e.sender /= model.loginUsername) |             (\(s, e) -> e.sender /= model.loginUsername) | ||||||
|             <| notificationEvents sr |             <| joinedRoomNotificationEvents sr | ||||||
|         notificationCmd sr = if notify |         notificationCmd sr = if notify | ||||||
|             then Maybe.withDefault Cmd.none |             then Maybe.withDefault Cmd.none | ||||||
|                     <| Maybe.map (\(s, e) -> sendNotificationPort |                     <| Maybe.map (\(s, e) -> sendNotificationPort | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| module Scylla.AccountData exposing (..) | module Scylla.AccountData exposing (..) | ||||||
| import Scylla.Sync exposing (AccountData, JoinedRoom, roomAccountData) | import Scylla.Sync exposing (SyncResponse, AccountData, JoinedRoom, roomAccountData) | ||||||
| import Json.Decode as Decode | import Json.Decode as Decode | ||||||
|  | import Dict | ||||||
| 
 | 
 | ||||||
| type NotificationSetting = Normal | MentionsOnly | None | type NotificationSetting = Normal | MentionsOnly | None | ||||||
| 
 | 
 | ||||||
| @ -20,3 +21,10 @@ roomNotificationSetting jr = Maybe.withDefault Normal | |||||||
|     <| Maybe.andThen Result.toMaybe |     <| Maybe.andThen Result.toMaybe | ||||||
|     <| Maybe.map (Decode.decodeValue notificationSettingDecoder) |     <| Maybe.map (Decode.decodeValue notificationSettingDecoder) | ||||||
|     <| roomAccountData jr "com.danilafe.scylla.notifications" |     <| roomAccountData jr "com.danilafe.scylla.notifications" | ||||||
|  | 
 | ||||||
|  | roomIdNotificationSetting : SyncResponse -> String -> NotificationSetting | ||||||
|  | roomIdNotificationSetting sr s = Maybe.withDefault Normal | ||||||
|  |     <| Maybe.map roomNotificationSetting | ||||||
|  |     <| Maybe.andThen (Dict.get s) | ||||||
|  |     <| Maybe.andThen .join sr.rooms | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -1,5 +1,8 @@ | |||||||
| port module Scylla.Notification exposing (..) | port module Scylla.Notification exposing (..) | ||||||
| import Json.Decode | import Scylla.Sync exposing (SyncResponse, RoomEvent, joinedRoomsEvents) | ||||||
|  | import Scylla.AccountData exposing (..) | ||||||
|  | import Json.Decode as Decode exposing (string, field) | ||||||
|  | import Dict | ||||||
| 
 | 
 | ||||||
| type alias Notification = | type alias Notification = | ||||||
|     { name : String |     { name : String | ||||||
| @ -9,3 +12,25 @@ type alias Notification = | |||||||
| 
 | 
 | ||||||
| port sendNotificationPort : Notification -> Cmd msg | port sendNotificationPort : Notification -> Cmd msg | ||||||
| port onNotificationClickPort : (String -> msg) -> Sub msg | port onNotificationClickPort : (String -> msg) -> Sub msg | ||||||
|  | 
 | ||||||
|  | producesNotification : NotificationSetting -> RoomEvent -> Bool | ||||||
|  | producesNotification ns re = case ns of | ||||||
|  |     Normal -> True | ||||||
|  |     _ -> False | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | notificationText : RoomEvent -> String | ||||||
|  | notificationText re = case (Decode.decodeValue (field "msgtype" string) re.content) of | ||||||
|  |     Ok "m.text" -> Result.withDefault "" <| (Decode.decodeValue (field "body" string) re.content) | ||||||
|  |     _ -> "" | ||||||
|  | 
 | ||||||
|  | joinedRoomNotificationEvents : SyncResponse -> List (String, RoomEvent) | ||||||
|  | joinedRoomNotificationEvents s = | ||||||
|  |     let | ||||||
|  |         applyPair k = List.map (\v -> (k, v)) | ||||||
|  |     in | ||||||
|  |         List.sortBy (\(k, v) -> v.originServerTs) | ||||||
|  |         <| Dict.foldl (\k v a -> a ++ applyPair k v) [] | ||||||
|  |         <| Dict.map (\k v -> List.filter (producesNotification (roomIdNotificationSetting s k)) v) | ||||||
|  |         <| joinedRoomsEvents s | ||||||
|  | 
 | ||||||
|  | |||||||
| @ -1,6 +1,5 @@ | |||||||
| module Scylla.Sync exposing (..) | module Scylla.Sync exposing (..) | ||||||
| import Scylla.Api exposing (..) | import Scylla.Api exposing (..) | ||||||
| import Scylla.Notification exposing (..) |  | ||||||
| import Scylla.Login exposing (Username) | import Scylla.Login exposing (Username) | ||||||
| import Scylla.Route exposing (RoomId) | import Scylla.Route exposing (RoomId) | ||||||
| import Dict exposing (Dict) | import Dict exposing (Dict) | ||||||
| @ -467,20 +466,6 @@ roomName jr = | |||||||
|         Maybe.andThen (name << .content) nameEvent |         Maybe.andThen (name << .content) nameEvent | ||||||
| 
 | 
 | ||||||
| -- Business Logic: Event Extraction | -- Business Logic: Event Extraction | ||||||
| notificationText : RoomEvent -> String |  | ||||||
| notificationText re = case (Decode.decodeValue (field "msgtype" string) re.content) of |  | ||||||
|     Ok "m.text" -> Result.withDefault "" <| (Decode.decodeValue (field "body" string) re.content) |  | ||||||
|     _ -> "" |  | ||||||
| 
 |  | ||||||
| notificationEvents : SyncResponse -> List (String, RoomEvent) |  | ||||||
| notificationEvents s = |  | ||||||
|     let |  | ||||||
|         applyPair k = List.map (\v -> (k, v)) |  | ||||||
|     in |  | ||||||
|         List.sortBy (\(k, v) -> v.originServerTs) |  | ||||||
|         <| Dict.foldl (\k v a -> a ++ applyPair k v) [] |  | ||||||
|         <| joinedRoomsEvents s |  | ||||||
| 
 |  | ||||||
| joinedRoomsEvents : SyncResponse -> Dict String (List RoomEvent) | joinedRoomsEvents : SyncResponse -> Dict String (List RoomEvent) | ||||||
| joinedRoomsEvents s = | joinedRoomsEvents s = | ||||||
|     Maybe.withDefault Dict.empty |     Maybe.withDefault Dict.empty | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user