KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > rero > ircfw > data > ModeTracker


1 package rero.ircfw.data;
2
3 /* the mode parser... code like this always makes my day (not!) */
4
5 import rero.ircfw.Channel;
6 import rero.ircfw.interfaces.FrameworkConstants;
7
8 import java.util.HashMap JavaDoc;
9
10 public class ModeTracker extends DataEventAction implements FrameworkConstants {
11   public boolean isEvent(HashMap JavaDoc data) {
12     return ("MODE".equals(data.get($EVENT$)) || "324".equals(data.get($EVENT$)) || "221".equals(data.get($EVENT$)));
13   }
14
15   public void process(HashMap JavaDoc data) {
16     String JavaDoc event = (String JavaDoc) data.get($EVENT$);
17     String JavaDoc target = "", modes = "";
18
19     if (event.equals("MODE") || event.equals("221")) {
20       target = (String JavaDoc) data.get($TARGET$);
21       modes = (String JavaDoc) data.get($PARMS$);
22       data.put($PARMS$, modes.trim()); // should fix extra characters being appended to the modes :)
23
} else if (event.equals("324")) {
24       String JavaDoc[] blah = data.get($PARMS$).toString().split("\\s", 2);
25
26       target = blah[0];
27       modes = blah[1];
28     }
29
30     boolean isChannel = (target.charAt(0) == '#' || target.charAt(0) == '&');
31     boolean doSet = false;
32
33     String JavaDoc parse[] = modes.split("\\s", 0);
34
35     modes = parse[0];
36
37     int target_index = 1; /* index of current target in parse[] array */
38
39     for (int x = 0; x < modes.length(); x++) {
40       if (modes.charAt(x) == '+') {
41         doSet = true;
42       } else if (modes.charAt(x) == '-') {
43         doSet = false;
44       } else if (isChannel) {
45         Channel ch = dataList.getChannel(target);
46
47         if (dataList.getPrefixInfo().isPrefixMode(modes.charAt(x))) {
48           dataList.synchronizeUserPreChange(dataList.getUser(parse[target_index]), ch);
49
50           int temp = dataList.getUser(parse[target_index]).getModeFor(ch);
51
52           if (doSet) {
53             dataList.getUser(parse[target_index])
54               .setModeFor(ch, dataList.getPrefixInfo().setMode(temp, modes.charAt(x)));
55           } else {
56             dataList.getUser(parse[target_index])
57               .setModeFor(ch, dataList.getPrefixInfo().unsetMode(temp, modes.charAt(x)));
58           }
59
60           dataList.synchronizeUserPostChange(dataList.getUser(parse[target_index]), ch);
61           target_index++;
62         } else {
63           switch (modes.charAt(x)) {
64             case 'l':
65               if (doSet) {
66                 ch.getMode().SetMode('l');
67                 ch.setLimit(Integer.parseInt(parse[target_index]));
68                 target_index++;
69               } else {
70                 ch.getMode().UnsetMode('l');
71                 ch.setLimit(-1);
72               }
73               break;
74
75             case 'k':
76               if (doSet) {
77                 ch.getMode().SetMode('k');
78                 ch.setKey(parse[target_index]);
79                 target_index++;
80               } else {
81                 ch.getMode().UnsetMode('k');
82                 target_index++;
83               }
84               break;
85
86             default:
87               // modes from group A (such as b) operate user lists, always have
88
// params and are not handled here
89
if (dataList.isChanGroupMode("A", modes.charAt(x))) {
90                 target_index++;
91                 break;
92               }
93
94               // modes from group B (such as k) always have a param,
95
// only k is handled above at the moment, for all the rest just
96
// skip the target and set mode for channel
97
if (dataList.isChanGroupMode("B", modes.charAt(x))) {
98                 target_index++;
99               }
100
101               // modes from group C (such as l) only have params when set,
102
// so we need to adjust the index when mode is set
103
if (dataList.isChanGroupMode("C", modes.charAt(x)) && doSet) {
104                 target_index++;
105               }
106
107               // modes from group D have no params and we don't need to adjust
108
// the target index
109

110               if (doSet) {
111                 ch.getMode().SetMode(modes.charAt(x));
112               } else {
113                 ch.getMode().UnsetMode(modes.charAt(x));
114               }
115           }
116         }
117       } else {
118         if (!target.equals(dataList.getMyNick())) {
119           return;
120         }
121
122         if (doSet) {
123           dataList.getMyUserInformation().getMode().SetMode(modes.charAt(x));
124         } else {
125           dataList.getMyUserInformation().getMode().UnsetMode(modes.charAt(x));
126         }
127       }
128     }
129   }
130 }
131
Popular Tags