3232import org .kitteh .irc .client .library .event .client .ClientReceiveNumericEvent ;
3333import org .kitteh .irc .client .library .feature .filter .CommandFilter ;
3434import org .kitteh .irc .client .library .feature .filter .NumericFilter ;
35+ import org .kitteh .irc .client .library .util .CIKeyMap ;
3536
37+ import java .util .Map ;
3638import java .util .Optional ;
3739
3840/**
3941 * Default TOPIC listener, producing events using default classes.
4042 */
4143public class DefaultTopicListener extends AbstractDefaultListenerBase {
44+ private final Map <String , Channel .Topic > oldTopics ;
45+
4246 /**
4347 * Constructs the listener.
4448 *
4549 * @param client client
4650 */
4751 public DefaultTopicListener (Client .@ NonNull WithManagement client ) {
4852 super (client );
53+ this .oldTopics = new CIKeyMap <>(client );
4954 }
5055
5156 @ NumericFilter (332 ) // Topic
@@ -57,7 +62,9 @@ public void topic(ClientReceiveNumericEvent event) {
5762 }
5863 Optional <Channel > topicChannel = this .getTracker ().getChannel (event .getParameters ().get (1 ));
5964 if (topicChannel .isPresent ()) {
60- this .getTracker ().setChannelTopic (topicChannel .get ().getName (), event .getParameters ().get (2 ));
65+ Channel oldChannel = topicChannel .get ();
66+ this .oldTopics .put (oldChannel .getName (), oldChannel .getTopic ());
67+ this .getTracker ().setChannelTopic (oldChannel .getName (), event .getParameters ().get (2 ));
6168 } else {
6269 this .trackException (event , "Topic message sent for invalid channel name" );
6370 }
@@ -72,8 +79,9 @@ public void topicInfo(ClientReceiveNumericEvent event) {
7279 }
7380 Optional <Channel > topicSetChannel = this .getTracker ().getChannel (event .getParameters ().get (1 ));
7481 if (topicSetChannel .isPresent ()) {
75- this .getTracker ().setChannelTopicInfo (topicSetChannel .get ().getName (), Long .parseLong (event .getParameters ().get (3 )) * 1000 , this .getTracker ().getActor (event .getParameters ().get (2 )));
76- this .fire (new ChannelTopicEvent (this .getClient (), event .getSource (), topicSetChannel .get (), false ));
82+ Channel oldChannel = topicSetChannel .get ();
83+ this .getTracker ().setChannelTopicInfo (oldChannel .getName (), Long .parseLong (event .getParameters ().get (3 )) * 1000 , this .getTracker ().getActor (event .getParameters ().get (2 )));
84+ this .fire (new ChannelTopicEvent (this .getClient (), event .getSource (), oldChannel , this .oldTopics .remove (oldChannel .getName ()), oldChannel .getLatest ().get ().getTopic (), false ));
7785 } else {
7886 this .trackException (event , "Topic message sent for invalid channel name" );
7987 }
@@ -88,9 +96,10 @@ public void topic(ClientReceiveCommandEvent event) {
8896 }
8997 Optional <Channel > channel = this .getTracker ().getChannel (event .getParameters ().get (0 ));
9098 if (channel .isPresent ()) {
91- this .getTracker ().setChannelTopic (channel .get ().getName (), event .getParameters ().get (1 ));
92- this .getTracker ().setChannelTopicInfo (channel .get ().getName (), System .currentTimeMillis (), event .getActor ());
93- this .fire (new ChannelTopicEvent (this .getClient (), event .getSource (), channel .get (), true ));
99+ Channel oldChannel = channel .get ();
100+ this .getTracker ().setChannelTopic (oldChannel .getName (), event .getParameters ().get (1 ));
101+ this .getTracker ().setChannelTopicInfo (oldChannel .getName (), System .currentTimeMillis (), event .getActor ());
102+ this .fire (new ChannelTopicEvent (this .getClient (), event .getSource (), oldChannel , oldChannel .getTopic (), oldChannel .getLatest ().get ().getTopic (), true ));
94103 } else {
95104 this .trackException (event , "TOPIC message sent for invalid channel name" );
96105 }
0 commit comments