Skip to content

Commit 80765ad

Browse files
committed
Custom channel mode support
1 parent 17dc99d commit 80765ad

File tree

6 files changed

+171
-194
lines changed

6 files changed

+171
-194
lines changed

src/main/java/org/kitteh/irc/client/library/defaults/feature/DefaultServerInfo.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.kitteh.irc.client.library.element.ISupportParameter;
3232
import org.kitteh.irc.client.library.element.mode.ChannelMode;
3333
import org.kitteh.irc.client.library.element.mode.ChannelUserMode;
34+
import org.kitteh.irc.client.library.element.mode.Mode;
3435
import org.kitteh.irc.client.library.element.mode.UserMode;
3536
import org.kitteh.irc.client.library.feature.ServerInfo;
3637
import org.kitteh.irc.client.library.util.Sanity;
@@ -43,8 +44,11 @@
4344
import java.util.List;
4445
import java.util.Map;
4546
import java.util.Optional;
47+
import java.util.Set;
4648
import java.util.concurrent.ConcurrentHashMap;
49+
import java.util.concurrent.CopyOnWriteArrayList;
4750
import java.util.regex.Pattern;
51+
import java.util.stream.Collectors;
4852

4953
/**
5054
* Default implementation for tracking server information.
@@ -53,6 +57,7 @@ public class DefaultServerInfo implements ServerInfo.WithManagement {
5357
private final Client client;
5458
private final Map<String, ISupportParameter> iSupportParameterMap = new ConcurrentHashMap<>();
5559
private final List<ChannelMode> defaultChannelModes;
60+
private final List<ChannelMode> customChannelModes = new CopyOnWriteArrayList<>();
5661
private final List<Character> defaultChannelPrefixes = Arrays.asList('#', '&', '!', '+');
5762
private final List<ChannelUserMode> defaultChannelUserModes;
5863
private List<String> motd;
@@ -96,6 +101,11 @@ public DefaultServerInfo(@NonNull Client client) {
96101
this.userModes = Collections.unmodifiableList(defaultUserModes);
97102
}
98103

104+
@Override
105+
public void addCustomChannelMode(@NonNull ChannelMode mode) {
106+
this.customChannelModes.add(Sanity.nullCheck(mode, "mode"));
107+
}
108+
99109
@Override
100110
public @NonNull Optional<String> getAddress() {
101111
return Optional.ofNullable(this.address);
@@ -109,7 +119,12 @@ public void setAddress(@NonNull String serverAddress) {
109119
@Override
110120
public @NonNull List<ChannelMode> getChannelModes() {
111121
Optional<ISupportParameter.ChanModes> optional = this.getISupportParameter(ISupportParameter.ChanModes.NAME, ISupportParameter.ChanModes.class);
112-
return new ArrayList<>(optional.map(ISupportParameter.ChanModes::getModes).orElse(this.defaultChannelModes));
122+
List<ChannelMode> list = new ArrayList<>();
123+
List<ChannelMode> modes = optional.map(ISupportParameter.ChanModes::getModes).orElse(this.defaultChannelModes);
124+
Set<Character> customModeChar = this.customChannelModes.stream().map(Mode::getChar).collect(Collectors.toSet());
125+
modes.stream().filter(mode -> !customModeChar.contains(mode.getChar())).forEach(list::add);
126+
list.addAll(this.customChannelModes);
127+
return list;
113128
}
114129

115130
@Override

src/main/java/org/kitteh/irc/client/library/feature/ServerInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ interface WithManagement extends ServerInfo {
8989
void setVersion(@NonNull String version);
9090
}
9191

92+
/**
93+
* Adds a custom mode, for a server that doesn't correctly list modes.
94+
*
95+
* @param mode custom mode to support
96+
*/
97+
void addCustomChannelMode(@NonNull ChannelMode mode);
98+
9299
/**
93100
* Gets the server-stated address of the server.
94101
*
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.kitteh.irc.client.library.defaults.feature;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
import org.kitteh.irc.client.library.Client;
6+
import org.kitteh.irc.client.library.defaults.element.isupport.DefaultISupportChanModes;
7+
import org.kitteh.irc.client.library.defaults.element.mode.DefaultChannelMode;
8+
import org.kitteh.irc.client.library.element.mode.ChannelMode;
9+
import org.mockito.Mockito;
10+
11+
import java.util.List;
12+
13+
/**
14+
* A test for DefaultServerInfo
15+
*/
16+
public class ServerInfoTest {
17+
/**
18+
* Tests modes.
19+
*/
20+
@Test
21+
public void testChannelModes() {
22+
final Client client = Mockito.mock(Client.class);
23+
final DefaultServerInfo serverInfo = new DefaultServerInfo(client);
24+
serverInfo.addISupportParameter(new DefaultISupportChanModes(client, DefaultISupportChanModes.NAME, "b,k,l,imnDdRcC"));
25+
List<ChannelMode> modes = serverInfo.getChannelModes();
26+
Assert.assertEquals(11, modes.size());
27+
Assert.assertEquals(1, modes.stream().filter(mode -> mode.getType() == ChannelMode.Type.A_MASK).count());
28+
Assert.assertEquals(1, modes.stream().filter(mode -> mode.getType() == ChannelMode.Type.B_PARAMETER_ALWAYS).count());
29+
Assert.assertEquals(1, modes.stream().filter(mode -> mode.getType() == ChannelMode.Type.C_PARAMETER_ON_SET).count());
30+
Assert.assertEquals(8, modes.stream().filter(mode -> mode.getType() == ChannelMode.Type.D_PARAMETER_NEVER).count());
31+
serverInfo.addCustomChannelMode(new DefaultChannelMode(client, 'z', ChannelMode.Type.D_PARAMETER_NEVER));
32+
serverInfo.addCustomChannelMode(new DefaultChannelMode(client, 'd', ChannelMode.Type.C_PARAMETER_ON_SET));
33+
List<ChannelMode> modesRedux = serverInfo.getChannelModes();
34+
Assert.assertEquals(12, modesRedux.size());
35+
Assert.assertEquals(1, modesRedux.stream().filter(mode -> mode.getType() == ChannelMode.Type.A_MASK).count());
36+
Assert.assertEquals(1, modesRedux.stream().filter(mode -> mode.getType() == ChannelMode.Type.B_PARAMETER_ALWAYS).count());
37+
Assert.assertEquals(2, modesRedux.stream().filter(mode -> mode.getType() == ChannelMode.Type.C_PARAMETER_ON_SET).count());
38+
Assert.assertEquals(8, modesRedux.stream().filter(mode -> mode.getType() == ChannelMode.Type.D_PARAMETER_NEVER).count());
39+
Assert.assertEquals(ChannelMode.Type.C_PARAMETER_ON_SET, serverInfo.getChannelMode('d').get().getType());
40+
}
41+
}
Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
package org.kitteh.irc.client.library.util;
22

3-
import org.checkerframework.checker.nullness.qual.NonNull;
43
import org.junit.Assert;
54
import org.junit.Test;
65
import org.kitteh.irc.client.library.Client;
7-
import org.kitteh.irc.client.library.element.ISupportParameter;
8-
import org.kitteh.irc.client.library.element.mode.ChannelMode;
9-
import org.kitteh.irc.client.library.element.mode.ChannelUserMode;
10-
import org.kitteh.irc.client.library.element.mode.UserMode;
116
import org.kitteh.irc.client.library.feature.CaseMapping;
12-
import org.kitteh.irc.client.library.feature.ServerInfo;
137
import org.mockito.Mockito;
148

15-
import java.util.Collections;
169
import java.util.HashMap;
17-
import java.util.List;
1810
import java.util.Map;
19-
import java.util.Optional;
2011

2112
/**
2213
* Tests the CIKeyMap.
@@ -117,92 +108,4 @@ public Client getMockClientWithCaseMapping(CaseMapping mapping) {
117108
Mockito.when(clientMock.getServerInfo()).thenReturn(new StubServerInfo(mapping));
118109
return clientMock;
119110
}
120-
121-
class StubServerInfo implements ServerInfo {
122-
private final CaseMapping caseMapping;
123-
124-
StubServerInfo(CaseMapping caseMapping) {
125-
this.caseMapping = caseMapping;
126-
}
127-
128-
@Override
129-
public @NonNull Optional<String> getAddress() {
130-
return Optional.empty();
131-
}
132-
133-
@Override
134-
public @NonNull CaseMapping getCaseMapping() {
135-
return this.caseMapping;
136-
}
137-
138-
@Override
139-
public int getChannelLengthLimit() {
140-
return 0;
141-
}
142-
143-
@Override
144-
public @NonNull Map<Character, Integer> getChannelLimits() {
145-
return Collections.emptyMap();
146-
}
147-
148-
@Override
149-
public @NonNull List<ChannelMode> getChannelModes() {
150-
return Collections.emptyList();
151-
}
152-
153-
@Override
154-
public @NonNull List<Character> getChannelPrefixes() {
155-
return Collections.emptyList();
156-
}
157-
158-
@Override
159-
public @NonNull List<ChannelUserMode> getChannelUserModes() {
160-
return Collections.emptyList();
161-
}
162-
163-
@Override
164-
public @NonNull Optional<ISupportParameter> getISupportParameter(@NonNull String name) {
165-
return Optional.empty();
166-
}
167-
168-
@Override
169-
public @NonNull Map<String, ISupportParameter> getISupportParameters() {
170-
return null;
171-
}
172-
173-
@Override
174-
public @NonNull Optional<List<String>> getMotd() {
175-
return Optional.empty();
176-
}
177-
178-
@Override
179-
public @NonNull Optional<String> getNetworkName() {
180-
return Optional.empty();
181-
}
182-
183-
@Override
184-
public int getNickLengthLimit() {
185-
return 0;
186-
}
187-
188-
@Override
189-
public @NonNull List<UserMode> getUserModes() {
190-
return null;
191-
}
192-
193-
@Override
194-
public @NonNull Optional<String> getVersion() {
195-
return Optional.empty();
196-
}
197-
198-
@Override
199-
public boolean hasWhoXSupport() {
200-
return false;
201-
}
202-
203-
@Override
204-
public boolean isValidChannel(@NonNull String name) {
205-
return false;
206-
}
207-
}
208111
}
Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
11
package org.kitteh.irc.client.library.util;
22

3-
import org.checkerframework.checker.nullness.qual.NonNull;
43
import org.junit.Assert;
54
import org.junit.Test;
65
import org.kitteh.irc.client.library.Client;
7-
import org.kitteh.irc.client.library.element.ISupportParameter;
8-
import org.kitteh.irc.client.library.element.mode.ChannelMode;
9-
import org.kitteh.irc.client.library.element.mode.ChannelUserMode;
10-
import org.kitteh.irc.client.library.element.mode.UserMode;
116
import org.kitteh.irc.client.library.feature.CaseMapping;
12-
import org.kitteh.irc.client.library.feature.ServerInfo;
137
import org.mockito.Mockito;
148

159
import java.util.Arrays;
1610
import java.util.Collections;
1711
import java.util.List;
18-
import java.util.Map;
19-
import java.util.Optional;
2012

2113
/**
2214
* Tests CISet.
@@ -103,92 +95,4 @@ private Client getMockClientWithCaseMapping(CaseMapping mapping) {
10395
Mockito.when(clientMock.getServerInfo()).thenReturn(new StubServerInfo(mapping));
10496
return clientMock;
10597
}
106-
107-
class StubServerInfo implements ServerInfo {
108-
private final CaseMapping caseMapping;
109-
110-
StubServerInfo(CaseMapping caseMapping) {
111-
this.caseMapping = caseMapping;
112-
}
113-
114-
@Override
115-
public @NonNull Optional<String> getAddress() {
116-
return Optional.empty();
117-
}
118-
119-
@Override
120-
public @NonNull CaseMapping getCaseMapping() {
121-
return this.caseMapping;
122-
}
123-
124-
@Override
125-
public int getChannelLengthLimit() {
126-
return 0;
127-
}
128-
129-
@Override
130-
public @NonNull Map<Character, Integer> getChannelLimits() {
131-
return Collections.emptyMap();
132-
}
133-
134-
@Override
135-
public @NonNull List<ChannelMode> getChannelModes() {
136-
return Collections.emptyList();
137-
}
138-
139-
@Override
140-
public @NonNull List<Character> getChannelPrefixes() {
141-
return Collections.emptyList();
142-
}
143-
144-
@Override
145-
public @NonNull List<ChannelUserMode> getChannelUserModes() {
146-
return Collections.emptyList();
147-
}
148-
149-
@Override
150-
public @NonNull Optional<ISupportParameter> getISupportParameter(@NonNull String name) {
151-
return Optional.empty();
152-
}
153-
154-
@Override
155-
public @NonNull Map<String, ISupportParameter> getISupportParameters() {
156-
return null;
157-
}
158-
159-
@Override
160-
public @NonNull Optional<List<String>> getMotd() {
161-
return Optional.empty();
162-
}
163-
164-
@Override
165-
public @NonNull Optional<String> getNetworkName() {
166-
return Optional.empty();
167-
}
168-
169-
@Override
170-
public int getNickLengthLimit() {
171-
return 0;
172-
}
173-
174-
@Override
175-
public @NonNull List<UserMode> getUserModes() {
176-
return null;
177-
}
178-
179-
@Override
180-
public @NonNull Optional<String> getVersion() {
181-
return Optional.empty();
182-
}
183-
184-
@Override
185-
public boolean hasWhoXSupport() {
186-
return false;
187-
}
188-
189-
@Override
190-
public boolean isValidChannel(@NonNull String name) {
191-
return false;
192-
}
193-
}
19498
}

0 commit comments

Comments
 (0)