Skip to content

Commit 64b8053

Browse files
committed
Less nesting for incompletable listening
1 parent bee2232 commit 64b8053

12 files changed

+232
-235
lines changed

src/main/java/org/kitteh/irc/client/library/defaults/listener/AbstractDefaultListenerBase.java

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,14 @@
2626
import org.checkerframework.checker.nullness.qual.NonNull;
2727
import org.kitteh.irc.client.library.Client;
2828
import org.kitteh.irc.client.library.element.Channel;
29-
import org.kitteh.irc.client.library.element.User;
3029
import org.kitteh.irc.client.library.element.mode.ChannelUserMode;
31-
import org.kitteh.irc.client.library.event.channel.ChannelCtcpEvent;
32-
import org.kitteh.irc.client.library.event.channel.ChannelTargetedCtcpEvent;
33-
import org.kitteh.irc.client.library.event.client.ClientReceiveCommandEvent;
3430
import org.kitteh.irc.client.library.event.helper.ClientEvent;
3531
import org.kitteh.irc.client.library.event.helper.ClientReceiveServerMessageEvent;
36-
import org.kitteh.irc.client.library.event.user.PrivateCtcpQueryEvent;
37-
import org.kitteh.irc.client.library.event.user.PrivateCtcpReplyEvent;
3832
import org.kitteh.irc.client.library.exception.KittehServerMessageException;
3933
import org.kitteh.irc.client.library.feature.ActorTracker;
4034
import org.kitteh.irc.client.library.feature.EventManager;
41-
import org.kitteh.irc.client.library.util.CtcpUtil;
4235
import org.kitteh.irc.client.library.util.ToStringer;
4336

44-
import java.util.Date;
4537
import java.util.Optional;
4638

4739
/**
@@ -83,55 +75,6 @@ protected void fire(@NonNull ClientEvent event) {
8375
this.client.getEventManager().callEvent(event);
8476
}
8577

86-
/**
87-
* Processes a CTCP message.
88-
*
89-
* @param event the currently handled event
90-
*/
91-
protected void ctcp(ClientReceiveCommandEvent event) {
92-
final String ctcpMessage = CtcpUtil.fromCtcp(event.getParameters().get(1));
93-
final MessageTargetInfo messageTargetInfo = this.getTypeByTarget(event.getParameters().get(0));
94-
User user = (User) event.getActor();
95-
switch (event.getCommand()) {
96-
case "NOTICE":
97-
if (messageTargetInfo instanceof MessageTargetInfo.Private) {
98-
this.fire(new PrivateCtcpReplyEvent(this.getClient(), event.getSource(), user, event.getParameters().get(0), ctcpMessage));
99-
}
100-
break;
101-
case "PRIVMSG":
102-
if (messageTargetInfo instanceof MessageTargetInfo.Private) {
103-
String reply = null; // Message to send as CTCP reply (NOTICE). Send nothing if null.
104-
switch (ctcpMessage) {
105-
case "VERSION":
106-
reply = "VERSION I am Kitteh!";
107-
break;
108-
case "TIME":
109-
reply = "TIME " + new Date().toString();
110-
break;
111-
case "FINGER":
112-
reply = "FINGER om nom nom tasty finger";
113-
break;
114-
}
115-
if (ctcpMessage.startsWith("PING ")) {
116-
reply = ctcpMessage;
117-
}
118-
PrivateCtcpQueryEvent ctcpEvent = new PrivateCtcpQueryEvent(this.getClient(), event.getSource(), user, event.getParameters().get(0), ctcpMessage, reply);
119-
this.fire(ctcpEvent);
120-
Optional<String> replyMessage = ctcpEvent.getReply();
121-
if (ctcpEvent.isToClient()) {
122-
replyMessage.ifPresent(message -> this.getClient().sendRawLine("NOTICE " + user.getNick() + " :" + CtcpUtil.toCtcp(message)));
123-
}
124-
} else if (messageTargetInfo instanceof MessageTargetInfo.ChannelInfo) {
125-
MessageTargetInfo.ChannelInfo channelInfo = (MessageTargetInfo.ChannelInfo) messageTargetInfo;
126-
this.fire(new ChannelCtcpEvent(this.getClient(), event.getSource(), user, channelInfo.getChannel(), ctcpMessage));
127-
} else if (messageTargetInfo instanceof MessageTargetInfo.TargetedChannel) {
128-
MessageTargetInfo.TargetedChannel channelInfo = (MessageTargetInfo.TargetedChannel) messageTargetInfo;
129-
this.fire(new ChannelTargetedCtcpEvent(this.getClient(), event.getSource(), user, channelInfo.getChannel(), channelInfo.getPrefix(), ctcpMessage));
130-
}
131-
break;
132-
}
133-
}
134-
13578
/**
13679
* Fires an exception in processing a server message event.
13780
*

src/main/java/org/kitteh/irc/client/library/defaults/listener/AbstractModeInfoListenerBase.java

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
package org.kitteh.irc.client.library.defaults.listener;
2525

2626
import org.checkerframework.checker.nullness.qual.NonNull;
27+
import org.checkerframework.checker.nullness.qual.Nullable;
2728
import org.kitteh.irc.client.library.Client;
2829
import org.kitteh.irc.client.library.defaults.element.mode.DefaultModeInfo;
2930
import org.kitteh.irc.client.library.element.Channel;
@@ -37,7 +38,6 @@
3738
import java.time.Instant;
3839
import java.util.ArrayList;
3940
import java.util.List;
40-
import java.util.Optional;
4141

4242
/**
4343
* A base for listening to mode info events.
@@ -80,26 +80,25 @@ protected void modeInfoList(@NonNull ClientReceiveNumericEvent event, @NonNull S
8080
this.trackException(event, name + " response too short");
8181
return;
8282
}
83-
Optional<Channel> channel = this.getTracker().getChannel(event.getParameters().get(1));
84-
if (channel.isPresent()) {
85-
messageList.add(event.getServerMessage());
86-
String creator = (event.getParameters().size() > (3 + offset)) ? event.getParameters().get((3 + offset)) : null;
87-
Instant creationTime = null;
88-
if (event.getParameters().size() > (4 + offset)) {
89-
try {
90-
creationTime = Instant.ofEpochSecond(Integer.parseInt(event.getParameters().get((4 + offset))));
91-
} catch (NumberFormatException | DateTimeException ignored) {
92-
}
93-
}
94-
Optional<ChannelMode> channelMode = this.getClient().getServerInfo().getChannelMode(mode);
95-
if (channelMode.isPresent()) {
96-
infoList.add(new DefaultModeInfo(this.getClient(), channel.get(), channelMode.get(), event.getParameters().get((2 + offset)), creator, creationTime));
97-
} else {
98-
this.trackException(event, name + " can't list if there's no '" + mode + "' mode");
83+
Channel channel;
84+
if ((channel = this.getChannel(event, name)) == null) {
85+
return;
86+
}
87+
ChannelMode channelMode;
88+
if ((channelMode = this.getChannelMode(event, name, mode)) == null) {
89+
return;
90+
}
91+
92+
messageList.add(event.getServerMessage());
93+
String creator = (event.getParameters().size() > (3 + offset)) ? event.getParameters().get((3 + offset)) : null;
94+
Instant creationTime = null;
95+
if (event.getParameters().size() > (4 + offset)) {
96+
try {
97+
creationTime = Instant.ofEpochSecond(Integer.parseInt(event.getParameters().get((4 + offset))));
98+
} catch (NumberFormatException | DateTimeException ignored) {
9999
}
100-
} else {
101-
this.trackException(event, name + " response sent for invalid channel name");
102100
}
101+
infoList.add(new DefaultModeInfo(this.getClient(), channel, channelMode, event.getParameters().get((2 + offset)), creator, creationTime));
103102
}
104103

105104
/**
@@ -116,21 +115,36 @@ protected void endModeInfoList(@NonNull ClientReceiveNumericEvent event, @NonNul
116115
this.trackException(event, name + " response too short");
117116
return;
118117
}
119-
Optional<Channel> channel = this.getTracker().getChannel(event.getParameters().get(1));
120-
if (channel.isPresent()) {
121-
messageList.add(event.getServerMessage());
122-
Optional<ChannelMode> channelMode = this.getClient().getServerInfo().getChannelMode(mode);
123-
if (channelMode.isPresent()) {
124-
List<ModeInfo> modeInfos = new ArrayList<>(infoList);
125-
this.fire(new ChannelModeInfoListEvent(this.getClient(), messageList, channel.get(), channelMode.get(), modeInfos));
126-
this.getTracker().setChannelModeInfoList(channel.get().getName(), mode, modeInfos);
127-
} else {
128-
this.trackException(event, name + " can't list if there's no '" + mode + "' mode");
129-
}
130-
infoList.clear();
131-
messageList.clear();
132-
} else {
118+
Channel channel;
119+
if ((channel = this.getChannel(event, name)) == null) {
120+
return;
121+
}
122+
ChannelMode channelMode;
123+
if ((channelMode = this.getChannelMode(event, name, mode)) == null) {
124+
return;
125+
}
126+
127+
messageList.add(event.getServerMessage());
128+
List<ModeInfo> modeInfos = new ArrayList<>(infoList);
129+
this.fire(new ChannelModeInfoListEvent(this.getClient(), messageList, channel, channelMode, modeInfos));
130+
this.getTracker().setChannelModeInfoList(channel.getName(), mode, modeInfos);
131+
infoList.clear();
132+
messageList.clear();
133+
}
134+
135+
protected @Nullable Channel getChannel(@NonNull ClientReceiveNumericEvent event, @NonNull String name) {
136+
Channel channel = this.getTracker().getChannel(event.getParameters().get(1)).orElse(null);
137+
if (channel == null) {
133138
this.trackException(event, name + " response sent for invalid channel name");
134139
}
140+
return channel;
141+
}
142+
143+
protected @Nullable ChannelMode getChannelMode(@NonNull ClientReceiveNumericEvent event, @NonNull String name, char mode) {
144+
ChannelMode channelMode = this.getClient().getServerInfo().getChannelMode(mode).orElse(null);
145+
if (channelMode == null) {
146+
this.trackException(event, name + " can't list if there's no '" + mode + "' mode");
147+
}
148+
return channelMode;
135149
}
136150
}

src/main/java/org/kitteh/irc/client/library/defaults/listener/DefaultInviteListener.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
import org.kitteh.irc.client.library.event.client.ClientReceiveCommandEvent;
3232
import org.kitteh.irc.client.library.feature.filter.CommandFilter;
3333

34-
import java.util.Optional;
35-
3634
/**
3735
* Default INVITE listener, producing events using default classes.
3836
*/
@@ -53,14 +51,14 @@ public void invite(ClientReceiveCommandEvent event) {
5351
this.trackException(event, "INVITE message too short");
5452
return;
5553
}
56-
Optional<Channel> channel = this.getTracker().getChannel(event.getParameters().get(1));
57-
if (channel.isPresent()) {
58-
if (this.getClient().getNick().equalsIgnoreCase(event.getParameters().get(0)) && this.getClient().getIntendedChannels().contains(channel.get().getName())) {
59-
this.getClient().sendRawLine("JOIN " + channel.get().getName());
60-
}
61-
this.fire(new ChannelInviteEvent(this.getClient(), event.getSource(), channel.get(), event.getActor(), event.getParameters().get(0)));
62-
} else {
54+
Channel channel = this.getTracker().getChannel(event.getParameters().get(1)).orElse(null);
55+
if (channel == null) {
6356
this.trackException(event, "INVITE message sent for invalid channel name");
57+
return;
58+
}
59+
if (this.getClient().getNick().equalsIgnoreCase(event.getParameters().get(0)) && this.getClient().getIntendedChannels().contains(channel.getName())) {
60+
this.getClient().sendRawLine("JOIN " + channel.getName());
6461
}
62+
this.fire(new ChannelInviteEvent(this.getClient(), event.getSource(), channel, event.getActor(), event.getParameters().get(0)));
6563
}
6664
}

src/main/java/org/kitteh/irc/client/library/defaults/listener/DefaultJoinListener.java

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -57,41 +57,43 @@ public void join(ClientReceiveCommandEvent event) {
5757
return;
5858
}
5959
String channelName = event.getParameters().get(0);
60-
if (this.getClient().getServerInfo().isValidChannel(channelName)) {
61-
if (event.getActor() instanceof User) {
62-
this.getTracker().trackChannel(channelName);
63-
Channel channel = this.getTracker().getTrackedChannel(channelName).get();
64-
User user = (User) event.getActor();
65-
this.getTracker().trackChannelUser(channelName, user, new HashSet<>());
66-
if (event.getParameters().size() > 2) {
67-
if (!"*".equals(event.getParameters().get(1))) {
68-
this.getTracker().setUserAccount(user.getNick(), event.getParameters().get(1));
69-
}
70-
this.getTracker().setUserRealName(user.getNick(), event.getParameters().get(2));
71-
Optional<User> u = this.getTracker().getTrackedUser(user.getNick());
72-
if (u.isPresent()) { // Just in case something goes funny, let's not murder the event and instead just sacrifice some info
73-
user = u.get();
74-
}
75-
}
76-
ChannelJoinEvent joinEvent = null;
77-
if (user.getNick().equals(this.getClient().getNick())) {
78-
if (this.getClient().getActorTracker().shouldQueryChannelInformation()) {
79-
this.getClient().sendRawLine("MODE " + channelName);
80-
this.getClient().sendRawLine("WHO " + channelName + (this.getClient().getServerInfo().hasWhoXSupport() ? " %cuhsnfar" : ""));
81-
}
82-
if (this.getClient().getIntendedChannels().contains(channelName)) {
83-
joinEvent = new RequestedChannelJoinCompleteEvent(this.getClient(), event.getSource(), channel, user);
84-
}
85-
}
86-
if (joinEvent == null) {
87-
joinEvent = new ChannelJoinEvent(this.getClient(), event.getSource(), channel, user);
88-
}
89-
this.fire(joinEvent);
90-
} else {
91-
this.trackException(event, "JOIN message sent for non-user");
92-
}
93-
} else {
60+
if (!this.getClient().getServerInfo().isValidChannel(channelName)) {
9461
this.trackException(event, "JOIN message sent for invalid channel name");
62+
return;
63+
}
64+
if (!(event.getActor() instanceof User)) {
65+
this.trackException(event, "JOIN message sent for non-user");
66+
return;
67+
}
68+
this.getTracker().trackChannel(channelName);
69+
Channel channel = this.getTracker().getTrackedChannel(channelName).get();
70+
User user = (User) event.getActor();
71+
this.getTracker().trackChannelUser(channelName, user, new HashSet<>());
72+
if (event.getParameters().size() > 2) {
73+
if (!"*".equals(event.getParameters().get(1))) {
74+
this.getTracker().setUserAccount(user.getNick(), event.getParameters().get(1));
75+
}
76+
this.getTracker().setUserRealName(user.getNick(), event.getParameters().get(2));
77+
78+
// We've updated the user, so let's update the snapshot we have.
79+
Optional<User> u = this.getTracker().getTrackedUser(user.getNick());
80+
if (u.isPresent()) { // Just in case something goes funny, let's not murder the event and instead just sacrifice some info
81+
user = u.get();
82+
}
83+
}
84+
ChannelJoinEvent joinEvent = null;
85+
if (user.getNick().equals(this.getClient().getNick())) {
86+
if (this.getClient().getActorTracker().shouldQueryChannelInformation()) {
87+
this.getClient().sendRawLine("MODE " + channelName);
88+
this.getClient().sendRawLine("WHO " + channelName + (this.getClient().getServerInfo().hasWhoXSupport() ? " %cuhsnfar" : ""));
89+
}
90+
if (this.getClient().getIntendedChannels().contains(channelName)) {
91+
joinEvent = new RequestedChannelJoinCompleteEvent(this.getClient(), event.getSource(), channel, user);
92+
}
93+
}
94+
if (joinEvent == null) {
95+
joinEvent = new ChannelJoinEvent(this.getClient(), event.getSource(), channel, user);
9596
}
97+
this.fire(joinEvent);
9698
}
9799
}

src/main/java/org/kitteh/irc/client/library/defaults/listener/DefaultKickListener.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
import org.kitteh.irc.client.library.event.helper.ClientEvent;
3535
import org.kitteh.irc.client.library.feature.filter.CommandFilter;
3636

37-
import java.util.Optional;
38-
3937
/**
4038
* Default KICK listener, producing events using default classes.
4139
*/
@@ -56,28 +54,28 @@ public void kick(ClientReceiveCommandEvent event) {
5654
this.trackException(event, "KICK message too short");
5755
return;
5856
}
59-
Optional<Channel> channel = this.getTracker().getChannel(event.getParameters().get(0));
60-
if (channel.isPresent()) {
61-
Optional<User> kickedUser = this.getTracker().getTrackedUser(event.getParameters().get(1));
62-
if (kickedUser.isPresent()) {
63-
boolean isSelf = event.getParameters().get(1).equals(this.getClient().getNick());
64-
ClientEvent kickEvent;
65-
String kickReason = (event.getParameters().size() > 2) ? event.getParameters().get(2) : "";
66-
if (isSelf && this.getClient().getIntendedChannels().contains(channel.get().getName())) {
67-
kickEvent = new UnexpectedChannelLeaveViaKickEvent(this.getClient(), event.getSource(), channel.get(), event.getActor(), kickedUser.get(), kickReason);
68-
} else {
69-
kickEvent = new ChannelKickEvent(this.getClient(), event.getSource(), channel.get(), event.getActor(), kickedUser.get(), kickReason);
70-
}
71-
this.fire(kickEvent);
72-
this.getTracker().trackUserPart(channel.get().getName(), event.getParameters().get(1));
73-
if (isSelf) {
74-
this.getTracker().unTrackChannel(channel.get().getName());
75-
}
76-
} else {
77-
this.trackException(event, "KICK message sent for non-user");
78-
}
79-
} else {
57+
Channel channel = this.getTracker().getChannel(event.getParameters().get(0)).orElse(null);
58+
if (channel == null) {
8059
this.trackException(event, "KICK message sent for invalid channel name");
60+
return;
61+
}
62+
User kickedUser = this.getTracker().getTrackedUser(event.getParameters().get(1)).orElse(null);
63+
if (kickedUser == null) {
64+
this.trackException(event, "KICK message sent for non-user");
65+
return;
66+
}
67+
boolean isSelf = event.getParameters().get(1).equals(this.getClient().getNick());
68+
ClientEvent kickEvent;
69+
String kickReason = (event.getParameters().size() > 2) ? event.getParameters().get(2) : "";
70+
if (isSelf && this.getClient().getIntendedChannels().contains(channel.getName())) {
71+
kickEvent = new UnexpectedChannelLeaveViaKickEvent(this.getClient(), event.getSource(), channel, event.getActor(), kickedUser, kickReason);
72+
} else {
73+
kickEvent = new ChannelKickEvent(this.getClient(), event.getSource(), channel, event.getActor(), kickedUser, kickReason);
74+
}
75+
this.fire(kickEvent);
76+
this.getTracker().trackUserPart(channel.getName(), event.getParameters().get(1));
77+
if (isSelf) {
78+
this.getTracker().unTrackChannel(channel.getName());
8179
}
8280
}
8381
}

src/main/java/org/kitteh/irc/client/library/defaults/listener/DefaultKnockListener.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ public void knock(ClientReceiveNumericEvent event) {
5555
return;
5656
}
5757
Optional<Channel> channel = this.getTracker().getChannel(event.getParameters().get(1));
58-
if (channel.isPresent()) {
59-
User user = (User) this.getTracker().getActor(event.getParameters().get(2));
60-
this.fire(new ChannelKnockEvent(this.getClient(), event.getSource(), channel.get(), user));
61-
} else {
58+
if (!channel.isPresent()) {
6259
this.trackException(event, "KNOCK message sent for invalid channel name");
60+
return;
6361
}
62+
User user = (User) this.getTracker().getActor(event.getParameters().get(2));
63+
this.fire(new ChannelKnockEvent(this.getClient(), event.getSource(), channel.get(), user));
6464
}
6565
}

0 commit comments

Comments
 (0)