@@ -100,7 +100,10 @@ public void AddFileToPlayList(string path) {
100100 Playlist . Add ( mfile ) ;
101101 nclient . SendMessage ( Packets . CraftSetFileMessage ( mfile . FilePath , mfile . Duration , mfile . Size ) ) ;
102102 }
103-
103+ /// <summary>
104+ /// Sends a message to the server
105+ /// </summary>
106+ /// <param name="message">Message to send</param>
104107 public void SendChatMessage ( string message ) {
105108 nclient . SendMessage ( Packets . CraftOutgoingChatMessage ( message ) ) ;
106109 }
@@ -169,6 +172,13 @@ public SyncPlayClient(String serverip, int port, String username, String passwor
169172 /// </summary>
170173 public event PlayerSeekHandler OnPlayerStateChange ;
171174 public delegate void PlayerSeekHandler ( SyncPlayClient sender , EventArgs . RemoteStateChangeEventArgs e ) ;
175+
176+ /// <summary>
177+ /// This event will be triggered when an even that is note worthy of notifying the user via chat
178+ /// occurs. Such as someone joining a chat, leaving a chat, seeking or switching files
179+ /// </summary>
180+ public event ChatMessageEvent OnChatInfoEvent ;
181+ public delegate void ChatMessageEvent ( SyncPlayClient sender , EventArgs . ChatInfoMessageArgs e ) ;
172182 #endregion
173183
174184
@@ -192,13 +202,16 @@ public void IncrementPosition() {
192202 /// <param name="username">Username to add</param>
193203 /// <returns></returns>
194204 private User AddNewUser ( string username ) {
195- var user = new User ( ) ;
196- user . Username = username ;
197- this . UserDictionary . Add ( username , user ) ;
198- var eventargs = new EventArgs . UserRoomStateEventArgs ( ) ;
199- eventargs . EventType = EventArgs . UserRoomStateEventArgs . EventTypes . JOINED ;
200- eventargs . User = user ;
201- OnUserRoomEvent ? . Invoke ( this , eventargs ) ;
205+ User user ;
206+ if ( ! this . UserDictionary . TryGetValue ( username , out user ) ) {
207+ user = new User ( ) ;
208+ user . Username = username ;
209+ this . UserDictionary . Add ( username , user ) ;
210+ var eventargs = new EventArgs . UserRoomStateEventArgs ( ) ;
211+ eventargs . EventType = EventArgs . UserRoomStateEventArgs . EventTypes . JOINED ;
212+ eventargs . User = user ;
213+ OnUserRoomEvent ? . Invoke ( this , eventargs ) ;
214+ }
202215 return user ;
203216 }
204217
@@ -316,11 +329,11 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
316329 Misc . Common . PrintInColor ( statusmessage , ConsoleColor . Green ) ;
317330
318331
332+ var chatinfomsg = readystatus ? $ "{ agent } is ready to play" : $ "{ agent } is not ready to play";
333+ OnChatInfoEvent ? . Invoke ( this , new EventArgs . ChatInfoMessageArgs ( GetUserFromDictionary ( agent ) , chatinfomsg ) ) ;
319334 OnDebugLog ? . Invoke ( this , statusmessage ) ;
320- if ( OnNewReadyPacket != null ) {
321- var EventArgs = new EventArgs . UserReadyEventArgs ( userobj , manuallyinitiated , readystatus ) ;
322- OnNewReadyPacket ( this , EventArgs ) ;
323- }
335+ OnNewReadyPacket ? . Invoke ( this , new EventArgs . UserReadyEventArgs ( userobj , manuallyinitiated , readystatus ) ) ;
336+
324337 return ;
325338 }
326339 #endregion
@@ -337,11 +350,13 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
337350 switch ( eventName ) {
338351 case "joined" :
339352 OnDebugLog ? . Invoke ( this , $ "The user { username } has joined the room") ;
353+ OnChatInfoEvent ? . Invoke ( this , new EventArgs . ChatInfoMessageArgs ( GetUserFromDictionary ( username ) , $ "{ username } has joined the party!") ) ;
340354 AddNewUser ( username ) ;
341355 break ;
342356
343357 case "left" :
344358 OnDebugLog ? . Invoke ( this , $ "The user { username } has left the room") ;
359+ OnChatInfoEvent ? . Invoke ( this , new EventArgs . ChatInfoMessageArgs ( GetUserFromDictionary ( username ) , $ "{ username } has left the party") ) ;
345360 RemoveUser ( username ) ;
346361 break ;
347362
@@ -386,64 +401,70 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
386401 if ( setByUserString != null ) {
387402
388403
389- var setByUser = GetUserFromDictionary ( setByUserString ) ;
390- if ( playstatekey . Value < Boolean > ( "paused" ) != isPaused ) {
404+ var setByUser = GetUserFromDictionary ( setByUserString ) ;
405+ if ( playstatekey . Value < Boolean > ( "paused" ) != isPaused ) {
391406
392- isPaused = playstatekey . Value < Boolean > ( "paused" ) ;
393- OnDebugLog ? . Invoke ( this , isPaused ? "Remote pause requested" : "Remote resume requested" ) ;
407+ isPaused = playstatekey . Value < Boolean > ( "paused" ) ;
408+ OnDebugLog ? . Invoke ( this , isPaused ? "Remote pause requested" : "Remote resume requested" ) ;
394409
395- // Create an even args object to notify the player that it needs to change its pause state
396- // because someone paused or unpaused
397- var remotepauseeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
398- remotepauseeventargs . Agent = setByUser ;
399- remotepauseeventargs . Paused = isPaused ;
400- remotepauseeventargs . Position = serverPosition ;
401- remotepauseeventargs . Seeked = false ;
410+ // Create an even args object to notify the player that it needs to change its pause state
411+ // because someone paused or unpaused
412+ var remotepauseeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
413+ remotepauseeventargs . Agent = setByUser ;
414+ remotepauseeventargs . Paused = isPaused ;
415+ remotepauseeventargs . Position = serverPosition ;
416+ remotepauseeventargs . Seeked = false ;
402417
403- OnPlayerStateChange ? . Invoke ( this , remotepauseeventargs ) ;
404- }
418+ var chtmsg = isPaused ? $ "{ setByUser . Username } has paused" : $ "{ setByUser . Username } has resumed playback";
405419
406- if ( playstatekey . ContainsKey ( "doSeek" ) ) {
407- try {
408- if ( ( bool ) playstatekey [ "doSeek" ] ) {
420+ this . OnChatInfoEvent ? . Invoke ( this , new EventArgs . ChatInfoMessageArgs ( setByUser , chtmsg ) ) ;
421+ this . OnPlayerStateChange ? . Invoke ( this , remotepauseeventargs ) ;
422+ }
409423
410- playPosition = serverPosition ;
411- OnDebugLog ? . Invoke ( this , $ "Seeking to { Misc . Common . ConvertSecondsToTimeStamp ( ( int ) playPosition ) } ") ;
424+ if ( playstatekey . ContainsKey ( "doSeek" ) ) {
425+ try {
426+ if ( ( bool ) playstatekey [ "doSeek" ] ) {
412427
413- // Create an even args object to notify the player that it needs to seek because someone on the
414- // server side seeked
415- var remoteseekingeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
416- remoteseekingeventargs . Agent = setByUser ;
417- remoteseekingeventargs . Paused = isPaused ;
418- remoteseekingeventargs . Position = serverPosition ;
419- remoteseekingeventargs . Seeked = true ;
428+ playPosition = serverPosition ;
429+ OnDebugLog ? . Invoke ( this , $ "Seeking to { Misc . Common . ConvertSecondsToTimeStamp ( ( int ) playPosition ) } ") ;
420430
431+ // Create an even args object to notify the player that it needs to seek because someone on the
432+ // server side seeked
433+ var remoteseekingeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
434+ remoteseekingeventargs . Agent = setByUser ;
435+ remoteseekingeventargs . Paused = isPaused ;
436+ remoteseekingeventargs . Position = serverPosition ;
437+ remoteseekingeventargs . Seeked = true ;
421438
422- OnPlayerStateChange ? . Invoke ( this , remoteseekingeventargs ) ;
423- }
424- } catch ( Exception e ) {
439+ var seekinfomsg = $ " { setByUser . Username } has seeked to { serverPosition } seconds" ;
440+ this . OnChatInfoEvent ? . Invoke ( this , new EventArgs . ChatInfoMessageArgs ( setByUser , seekinfomsg ) ) ;
441+
425442
443+ OnPlayerStateChange ? . Invoke ( this , remoteseekingeventargs ) ;
426444 }
445+ } catch ( Exception e ) {
427446
428- } else if ( Math . Abs ( serverPosition - playPosition ) > 5 ) {
447+ }
429448
430- playPosition = serverPosition ;
431- OnDebugLog ? . Invoke ( this , $ "Seeking to { Misc . Common . ConvertSecondsToTimeStamp ( ( int ) playPosition ) } sync with server") ;
449+ } else if ( Math . Abs ( serverPosition - playPosition ) > 5 ) {
432450
433- // Create an event args object to notify the player that it needs to seek to sync with the
434- // other users
435- var syncseekingeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
436- syncseekingeventargs . Agent = setByUser ;
437- syncseekingeventargs . Paused = isPaused ;
438- syncseekingeventargs . Position = serverPosition ;
439- syncseekingeventargs . Seeked = true ;
451+ playPosition = serverPosition ;
452+ OnDebugLog ? . Invoke ( this , $ "Seeking to { Misc . Common . ConvertSecondsToTimeStamp ( ( int ) playPosition ) } sync with server") ;
440453
454+ // Create an event args object to notify the player that it needs to seek to sync with the
455+ // other users
456+ var syncseekingeventargs = new EventArgs . RemoteStateChangeEventArgs ( ) ;
457+ syncseekingeventargs . Agent = setByUser ;
458+ syncseekingeventargs . Paused = isPaused ;
459+ syncseekingeventargs . Position = serverPosition ;
460+ syncseekingeventargs . Seeked = true ;
441461
442- OnPlayerStateChange ? . Invoke ( this , syncseekingeventargs ) ;
443462
463+ OnPlayerStateChange ? . Invoke ( this , syncseekingeventargs ) ;
444464
445465
446- }
466+
467+ }
447468
448469 }
449470 }
0 commit comments