feat: Trigger an event when the roster changes
This commit is contained in:
		
							parent
							
								
									2581bbe203
								
							
						
					
					
						commit
						e12f4688d3
					
				| @ -61,6 +61,21 @@ class RosterPushEvent extends XmppEvent { | |||||||
|   final String? ver; |   final String? ver; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /// Triggered when the roster has been modified | ||||||
|  | class RosterUpdatedEvent extends XmppEvent { | ||||||
|  |   RosterUpdatedEvent(this.removed, this.modified, this.added); | ||||||
|  | 
 | ||||||
|  |   /// A list of bare JIDs that are removed from the roster | ||||||
|  |   final List<String> removed; | ||||||
|  | 
 | ||||||
|  |   /// A list of XmppRosterItems that are modified. Can be correlated with one's cache | ||||||
|  |   /// using the jid attribute. | ||||||
|  |   final List<XmppRosterItem> modified; | ||||||
|  | 
 | ||||||
|  |   /// A list of XmppRosterItems that are added to the roster. | ||||||
|  |   final List<XmppRosterItem> added; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /// Triggered when a message is received | /// Triggered when a message is received | ||||||
| class MessageEvent extends XmppEvent { | class MessageEvent extends XmppEvent { | ||||||
|   MessageEvent({ |   MessageEvent({ | ||||||
|  | |||||||
| @ -61,7 +61,9 @@ class RosterFeatureNegotiator extends XmppFeatureNegotiatorBase { | |||||||
| 
 | 
 | ||||||
| /// This manager requires a RosterFeatureNegotiator to be registered. | /// This manager requires a RosterFeatureNegotiator to be registered. | ||||||
| class RosterManager extends XmppManagerBase { | class RosterManager extends XmppManagerBase { | ||||||
|   RosterManager(this._stateManager) : super(); |   RosterManager(this._stateManager) : super() { | ||||||
|  |     _stateManager.register(getAttributes().sendEvent); | ||||||
|  |   } | ||||||
|   final BaseRosterStateManager _stateManager; |   final BaseRosterStateManager _stateManager; | ||||||
|    |    | ||||||
|   @override |   @override | ||||||
|  | |||||||
| @ -28,6 +28,9 @@ abstract class BaseRosterStateManager { | |||||||
|   /// A critical section locking both _currentRoster and _currentVersion. |   /// A critical section locking both _currentRoster and _currentVersion. | ||||||
|   final Lock _lock = Lock(); |   final Lock _lock = Lock(); | ||||||
| 
 | 
 | ||||||
|  |   /// A function to send an XmppEvent to moxxmpp's main event bus | ||||||
|  |   late void Function(XmppEvent) _sendEvent; | ||||||
|  |    | ||||||
|   /// Overrideable function |   /// Overrideable function | ||||||
|   /// Loads the old cached version of the roster and optionally that roster version |   /// Loads the old cached version of the roster and optionally that roster version | ||||||
|   /// from persistent storage into a RosterCacheLoadResult object. |   /// from persistent storage into a RosterCacheLoadResult object. | ||||||
| @ -49,6 +52,12 @@ abstract class BaseRosterStateManager { | |||||||
|   /// roster push or roster fetch request. |   /// roster push or roster fetch request. | ||||||
|   Future<void> commitRoster(String? version, List<String> removed, List<XmppRosterItem> modified, List<XmppRosterItem> added); |   Future<void> commitRoster(String? version, List<String> removed, List<XmppRosterItem> modified, List<XmppRosterItem> added); | ||||||
| 
 | 
 | ||||||
|  |   /// Internal function. Registers functions from the RosterManger against this | ||||||
|  |   /// instance. | ||||||
|  |   void register(void Function(XmppEvent) sendEvent) { | ||||||
|  |     _sendEvent = sendEvent; | ||||||
|  |   } | ||||||
|  |    | ||||||
|   /// Load and cache or return the cached roster version. |   /// Load and cache or return the cached roster version. | ||||||
|   Future<String?> getRosterVersion() async { |   Future<String?> getRosterVersion() async { | ||||||
|     return _lock.synchronized(() async { |     return _lock.synchronized(() async { | ||||||
| @ -58,6 +67,20 @@ abstract class BaseRosterStateManager { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /// A wrapper around _commitRoster that also sends an event to moxxmpp's event | ||||||
|  |   /// bus. | ||||||
|  |   Future<void> _commitRoster(String? version, List<String> removed, List<XmppRosterItem> modified, List<XmppRosterItem> added) async { | ||||||
|  |     _sendEvent( | ||||||
|  |       RosterUpdatedEvent( | ||||||
|  |         removed, | ||||||
|  |         modified, | ||||||
|  |         added, | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |      | ||||||
|  |     await commitRoster(version, removed, modified, added); | ||||||
|  |   } | ||||||
|  |    | ||||||
|   /// Loads the cached roster data into memory, if that has not already happened. |   /// Loads the cached roster data into memory, if that has not already happened. | ||||||
|   /// NOTE: Must be called from within the _lock critical section. |   /// NOTE: Must be called from within the _lock critical section. | ||||||
|   Future<void> _loadRosterCache() async { |   Future<void> _loadRosterCache() async { | ||||||
| @ -111,21 +134,21 @@ abstract class BaseRosterStateManager { | |||||||
|       final result = _handleRosterItem(event.item); |       final result = _handleRosterItem(event.item); | ||||||
| 
 | 
 | ||||||
|       if (result.removed != null) { |       if (result.removed != null) { | ||||||
|         return commitRoster( |         return _commitRoster( | ||||||
|           _currentVersion, |           _currentVersion, | ||||||
|           [result.removed!], |           [result.removed!], | ||||||
|           [], |           [], | ||||||
|           [], |           [], | ||||||
|         ); |         ); | ||||||
|       } else if (result.modified != null) { |       } else if (result.modified != null) { | ||||||
|         return commitRoster( |         return _commitRoster( | ||||||
|           _currentVersion, |           _currentVersion, | ||||||
|           [], |           [], | ||||||
|           [result.modified!], |           [result.modified!], | ||||||
|           [], |           [], | ||||||
|         ); |         ); | ||||||
|       } else if (result.added != null) { |       } else if (result.added != null) { | ||||||
|         return commitRoster( |         return _commitRoster( | ||||||
|           _currentVersion, |           _currentVersion, | ||||||
|           [], |           [], | ||||||
|           [], |           [], | ||||||
| @ -153,7 +176,7 @@ abstract class BaseRosterStateManager { | |||||||
|         if (result.added != null) added.add(result.added!); |         if (result.added != null) added.add(result.added!); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       await commitRoster( |       await _commitRoster( | ||||||
|         _currentVersion, |         _currentVersion, | ||||||
|         removed, |         removed, | ||||||
|         modified, |         modified, | ||||||
| @ -187,5 +210,4 @@ class TestingRosterStateManager extends BaseRosterStateManager { | |||||||
| 
 | 
 | ||||||
|   @override |   @override | ||||||
|   Future<void> commitRoster(String? version, List<String> removed, List<XmppRosterItem> modified, List<XmppRosterItem> added) async {} |   Future<void> commitRoster(String? version, List<String> removed, List<XmppRosterItem> modified, List<XmppRosterItem> added) async {} | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user