Browse Source

Use a ModeManager for boolean user modes.

Change-Id: Ia4b9a93b529e734b4d7c9194ee4db6f9c2175590
Reviewed-on: http://gerrit.dmdirc.com/3963
Reviewed-by: Greg Holmes <greg@dmdirc.com>
Automatic-Compile: DMDirc Build Manager
changes/63/3963/2
Chris Smith 9 years ago
parent
commit
4f6ce3bb3f

+ 14
- 25
src/com/dmdirc/parser/irc/IRCClientInfo.java View File

@@ -27,6 +27,7 @@ import com.dmdirc.parser.interfaces.LocalClientInfo;
27 27
 import com.dmdirc.parser.interfaces.Parser;
28 28
 
29 29
 import java.util.ArrayList;
30
+import java.util.Collection;
30 31
 import java.util.HashMap;
31 32
 import java.util.LinkedList;
32 33
 import java.util.List;
@@ -46,7 +47,7 @@ public class IRCClientInfo implements LocalClientInfo {
46 47
     /** Known host of client. */
47 48
     private String host = "";
48 49
     /** Known user modes of client. */
49
-    private long modes;
50
+    private String modes;
50 51
     /** Known Away Reason of client. */
51 52
     private String awayReason = "";
52 53
     /** Known Account name of client. */
@@ -64,7 +65,7 @@ public class IRCClientInfo implements LocalClientInfo {
64 65
     /** List of ChannelClientInfos that point to this. */
65 66
     private final Map<String, IRCChannelClientInfo> clients = new HashMap<>();
66 67
     /** Modes waiting to be sent to the server. */
67
-    private final List<String> modeQueue = new LinkedList<>();
68
+    private final Collection<String> modeQueue = new LinkedList<>();
68 69
 
69 70
     /**
70 71
      * Create a new client object from a hostmask.
@@ -136,7 +137,6 @@ public class IRCClientInfo implements LocalClientInfo {
136 137
      */
137 138
     public static String[] parseHostFull(final String hostmask) {
138 139
         String[] sTemp;
139
-        final String[] result = new String[3];
140 140
 
141 141
         if (!hostmask.isEmpty() && hostmask.charAt(0) == ':') {
142 142
             sTemp = hostmask.substring(1).split("@", 2);
@@ -144,6 +144,7 @@ public class IRCClientInfo implements LocalClientInfo {
144 144
             sTemp = hostmask.split("@", 2);
145 145
         }
146 146
 
147
+        final String[] result = new String[3];
147 148
         result[2] = sTemp.length == 1 ? "" : sTemp[1];
148 149
         sTemp = sTemp[0].split("!", 2);
149 150
         result[1] = sTemp.length == 1 ? "" : sTemp[1];
@@ -193,7 +194,7 @@ public class IRCClientInfo implements LocalClientInfo {
193 194
      */
194 195
     @Override
195 196
     public String toString() {
196
-        return nickname + "!" + ident + "@" + host;
197
+        return nickname + '!' + ident + '@' + host;
197 198
     }
198 199
 
199 200
     /**
@@ -206,7 +207,7 @@ public class IRCClientInfo implements LocalClientInfo {
206 207
     public String getNickname() {
207 208
         // If this is the localClient then do what we are supposed to do, and ask
208 209
         // the parser using parser.getNickname()
209
-        if (this.equals(parser.getLocalClient())) {
210
+        if (equals(parser.getLocalClient())) {
210 211
             return parser.getMyNickname();
211 212
         } else {
212 213
             return nickname;
@@ -295,37 +296,26 @@ public class IRCClientInfo implements LocalClientInfo {
295 296
     }
296 297
 
297 298
     /**
298
-     * Set the user modes (as an integer).
299
+     * Set the user modes.
299 300
      *
300
-     * @param newMode new long representing channel modes. (Boolean only)
301
+     * @param newMode new string containing boolean channel modes.
301 302
      */
302
-    public void setUserMode(final long newMode) {
303
+    public void setUserMode(final String newMode) {
303 304
         modes = newMode;
304 305
     }
305 306
 
306 307
     /**
307
-     * Get the user modes (as an integer).
308
+     * Get the user modes.
308 309
      *
309 310
      * @return long representing channel modes. (Boolean only)
310 311
      */
311
-    public long getUserMode() {
312
+    public String getUserMode() {
312 313
         return modes;
313 314
     }
314 315
 
315 316
     @Override
316 317
     public String getModes() {
317
-        final StringBuilder sModes = new StringBuilder("+");
318
-        final long nChanModes = this.getUserMode();
319
-
320
-        for (char cTemp : parser.userModes.keySet()) {
321
-            final long nTemp = parser.userModes.get(cTemp);
322
-
323
-            if ((nChanModes & nTemp) == nTemp) {
324
-                sModes.append(cTemp);
325
-            }
326
-        }
327
-
328
-        return sModes.toString();
318
+        return '+' + modes;
329 319
     }
330 320
 
331 321
     /**
@@ -336,8 +326,7 @@ public class IRCClientInfo implements LocalClientInfo {
336 326
      * @return True/False if this client appears to be an oper
337 327
      */
338 328
     public boolean isOper() {
339
-        final String modestr = getModes();
340
-        return modestr.indexOf('o') > -1 || modestr.indexOf('O') > -1;
329
+        return modes.indexOf('o') > -1 || modes.indexOf('O') > -1;
341 330
     }
342 331
 
343 332
     /**
@@ -389,7 +378,7 @@ public class IRCClientInfo implements LocalClientInfo {
389 378
 
390 379
     @Override
391 380
     public void alterMode(final boolean add, final Character mode) {
392
-        if (isFake() || !parser.userModes.containsKey(mode)) {
381
+        if (isFake() || !parser.userModes.isMode(mode)) {
393 382
             return;
394 383
         }
395 384
 

+ 3
- 18
src/com/dmdirc/parser/irc/IRCParser.java View File

@@ -168,10 +168,8 @@ public class IRCParser extends BaseParser implements SecureParser, EncodingParse
168 168
     private int connectTimeout = 5000;
169 169
     /** Manager used to handle prefix modes. */
170 170
     public final PrefixModeManager prefixModes = new PrefixModeManager();
171
-    /** Hashtable storing known user modes (owxis etc). */
172
-    public final Map<Character, Long> userModes = new HashMap<>();
173
-    /** Integer representing the next avaliable integer value of a User mode. */
174
-    public long nNextKeyUser = 1;
171
+    /** Manager used to handle user modes (owxis etc). */
172
+    public final ModeManager userModes = new ModeManager();
175 173
     /**
176 174
      * Hashtable storing known boolean chan modes (cntmi etc).
177 175
      * Valid Boolean Modes are stored as Hashtable.pub('m',1); where 'm' is the mode and 1 is a numeric value.<br><br>
@@ -716,7 +714,6 @@ public class IRCParser extends BaseParser implements SecureParser, EncodingParse
716 714
         }
717 715
         // Reset the mode indexes
718 716
         nextKeyCMBool = 1;
719
-        nNextKeyUser = 1;
720 717
         setServerName("");
721 718
         networkName = "";
722 719
         lastLine = null;
@@ -1650,19 +1647,7 @@ public class IRCParser extends BaseParser implements SecureParser, EncodingParse
1650 1647
             h005Info.put("USERMODES", sDefaultModes);
1651 1648
         }
1652 1649
 
1653
-        // resetState
1654
-        userModes.clear();
1655
-        nNextKeyUser = 1;
1656
-
1657
-        // Boolean Mode
1658
-        for (int i = 0; i < modeStr.length(); ++i) {
1659
-            final Character cMode = modeStr.charAt(i);
1660
-            callDebugInfo(DEBUG_INFO, "Found User Mode: %c [%d]", cMode, nNextKeyUser);
1661
-            if (!userModes.containsKey(cMode)) {
1662
-                userModes.put(cMode, nNextKeyUser);
1663
-                nNextKeyUser *= 2;
1664
-            }
1665
-        }
1650
+        userModes.set(modeStr);
1666 1651
     }
1667 1652
 
1668 1653
     /**

+ 14
- 21
src/com/dmdirc/parser/irc/processors/ProcessMode.java View File

@@ -283,51 +283,44 @@ public class ProcessMode extends IRCProcessor {
283 283
      * @param clearOldModes Clear old modes before applying these modes (used by 221)
284 284
      */
285 285
     private void processUserMode(final String sParam, final String[] token, final String[] sModestr, final boolean clearOldModes) {
286
-        long nCurrent, nValue;
287
-        boolean bPositive = true;
288
-
289 286
         final IRCClientInfo iClient = getClientInfo(token[2]);
290 287
 
291 288
         if (iClient == null) {
292 289
             return;
293 290
         }
294 291
 
292
+        String nCurrent;
295 293
         if (clearOldModes) {
296
-            nCurrent = 0;
294
+            nCurrent = "";
297 295
         } else {
298 296
             nCurrent = iClient.getUserMode();
299 297
         }
300 298
 
299
+        boolean bPositive = true;
301 300
         for (int i = 0; i < sModestr[0].length(); ++i) {
302 301
             final Character cMode = sModestr[0].charAt(i);
303 302
             if (cMode.equals("+".charAt(0))) {
304 303
                 bPositive = true;
305 304
             } else if (cMode.equals("-".charAt(0))) {
306 305
                 bPositive = false;
307
-            } else if (cMode.equals(":".charAt(0))) {
308
-                continue;
309
-            } else {
310
-                if (parser.userModes.containsKey(cMode)) {
311
-                    nValue = parser.userModes.get(cMode);
312
-                } else {
306
+            } else if (!cMode.equals(":".charAt(0))) {
307
+                if (!parser.userModes.isMode(cMode)) {
313 308
                     // Unknown mode
314 309
                     callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got unknown user mode " + cMode + " - Added", parser.getLastLine()));
315
-                    parser.userModes.put(cMode, parser.nNextKeyUser);
316
-                    nValue = parser.nNextKeyUser;
317
-                    parser.nNextKeyUser = parser.nNextKeyUser * 2;
310
+                    parser.userModes.add(cMode);
318 311
                 }
319 312
                 // Usermodes are always boolean
320
-                callDebugInfo(IRCParser.DEBUG_INFO, "User Mode: %c [%d] {Positive: %b}", cMode, nValue, bPositive);
313
+                callDebugInfo(IRCParser.DEBUG_INFO, "User Mode: %c {Positive: %b}", cMode, bPositive);
321 314
                 if (bPositive) {
322
-                    nCurrent = nCurrent | nValue;
315
+                    nCurrent = parser.userModes.insertMode(nCurrent, cMode);
323 316
                 } else {
324
-                    nCurrent = nCurrent ^ (nCurrent & nValue);
317
+                    nCurrent = parser.userModes.removeMode(nCurrent, cMode);
325 318
                 }
326 319
             }
327 320
         }
328 321
 
329 322
         iClient.setUserMode(nCurrent);
330
-        if (sParam.equals("221")) {
323
+        if ("221".equals(sParam)) {
331 324
             callUserModeDiscovered(iClient, sModestr[0]);
332 325
         } else {
333 326
             callUserModeChanged(iClient, token[0], sModestr[0]);
@@ -337,7 +330,7 @@ public class ProcessMode extends IRCProcessor {
337 330
     /**
338 331
      * Callback to all objects implementing the ChannelModeChanged Callback.
339 332
      *
340
-     * @see com.dmdirc.parser.interfaces.callbacks.ChannelModeChangeListener
333
+     * @see ChannelModeChangeListener
341 334
      * @param cChannel Channel where modes were changed
342 335
      * @param cChannelClient Client chaning the modes (null if server)
343 336
      * @param sHost Host doing the mode changing (User host or server name)
@@ -351,7 +344,7 @@ public class ProcessMode extends IRCProcessor {
351 344
     /**
352 345
      * Callback to all objects implementing the ChannelUserModeChanged Callback.
353 346
      *
354
-     * @see com.dmdirc.parser.interfaces.callbacks.ChannelUserModeChangeListener
347
+     * @see ChannelUserModeChangeListener
355 348
      * @param cChannel Channel where modes were changed
356 349
      * @param cChangedClient Client being changed
357 350
      * @param cSetByClient Client chaning the modes (null if server)
@@ -366,7 +359,7 @@ public class ProcessMode extends IRCProcessor {
366 359
     /**
367 360
      * Callback to all objects implementing the UserModeChanged Callback.
368 361
      *
369
-     * @see com.dmdirc.parser.interfaces.callbacks.UserModeChangeListener
362
+     * @see UserModeChangeListener
370 363
      * @param cClient Client that had the mode changed (almost always us)
371 364
      * @param sSetby Host that set the mode (us or servername)
372 365
      * @param sModes The modes set.
@@ -379,7 +372,7 @@ public class ProcessMode extends IRCProcessor {
379 372
     /**
380 373
      * Callback to all objects implementing the UserModeDiscovered Callback.
381 374
      *
382
-     * @see com.dmdirc.parser.interfaces.callbacks.UserModeDiscoveryListener
375
+     * @see UserModeDiscoveryListener
383 376
      * @param cClient Client that had the mode changed (almost always us)
384 377
      * @param sModes The modes set.
385 378
      * @return true if a method was called, false otherwise

Loading…
Cancel
Save