Index: src/org/igniterealtime/xiff/events/RoomEvent.as =================================================================== --- src/org/igniterealtime/xiff/events/RoomEvent.as (revision 11267) +++ src/org/igniterealtime/xiff/events/RoomEvent.as (working copy) @@ -66,6 +66,8 @@ public static const USER_JOIN:String = "userJoin"; public static const USER_KICKED:String = "userKicked"; + + public static const USER_PRESENCE_CHANGE:String = "userPresenceChange"; private var _data:*; Index: src/org/igniterealtime/xiff/conference/Room.as =================================================================== --- src/org/igniterealtime/xiff/conference/Room.as (revision 11267) +++ src/org/igniterealtime/xiff/conference/Room.as (working copy) @@ -151,6 +151,12 @@ */ [Event( name="userBanned",type="org.igniterealtime.xiff.events.RoomEvent" )] /** + * Dispatched when a user's presence changes. + * + * @eventType org.igniterealtime.xiff.events.RoomEvent.USER_PRESENCE_CHANGE + */ + [Event( name="userPresenceChange",type="org.igniterealtime.xiff.events.RoomEvent" )] + /** * Dispatched when the user's preferred nickname already exists in the room. The * RoomEvent will contain an attribute nickname with the nickname * already existing in the room. @@ -982,6 +988,12 @@ occupant.affiliation = item.affiliation; occupant.role = item.role; occupant.show = aPresence.show; + + // Notify listeners that a user's presence has been updated + roomEvent = new RoomEvent( RoomEvent.USER_PRESENCE_CHANGE ); + roomEvent.nickname = userNickname; + roomEvent.data = aPresence; + dispatchEvent( roomEvent ); } } else if ( aPresence.type != Presence.UNAVAILABLE_TYPE )