KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > rero > ircfw > InternalDataList


1 package rero.ircfw;
2
3 /* InternalDataList
4    This almost could and probably should be split up into 3 classes.
5
6    My information - keeps track of the users nickname and User Object
7    User List Info - keeps track of user information and provides facilities for updating
8    Channel Info - keeps track of channel information and provides some facilities for updating,
9          the bulk of this chore is handled by User List Info though.
10  */

11
12 import rero.ircfw.interfaces.ChannelDataWatch;
13
14 import java.util.*;
15
16 public class InternalDataList {
17   protected String JavaDoc myNickname = "<Unknown>";
18   protected HashMap users = new HashMap(); /* key=<string>, value=<User> */
19   protected MyUser myInformation = new MyUser();
20   protected HashMap channels = new HashMap(); /* key=<string> value=<Channel> */
21   protected HashMap sync = new HashMap(); /* key=<string> value=<ChannelDataWatch> */
22
23   protected HashMap wasOn =
24     new HashMap(); /* key=String value=Set hashmap containing nick->channel mappings for all users who quit. Upon its first access though the value is removed. */
25
26   protected UserMode umode = new UserMode("ohv", "@%+");
27
28   protected HashMap iSupport = new HashMap();
29   protected HashMap chanModes = new HashMap(); // key=<string-group name (A,B,C,D)> value = <string with modes>
30

31   public void reset() {
32     myNickname = "<Unknown>";
33     users = new HashMap();
34     myInformation = new MyUser();
35     channels = new HashMap();
36     umode = new UserMode("ohv", "@%+");
37     iSupport = new HashMap();
38     chanModes = new HashMap();
39   }
40
41   // checks if the mode belongs to one of the CHANMODES group (A, B, C or D)
42
// A - modes that always have a param and operate user lists
43
// B - modes that always have a param and change setting
44
// C - modes that have a param only when set and change setting
45
// D - modes that never have a param and change setting
46
public boolean isChanGroupMode(String JavaDoc group, char mode) {
47     if (!chanModes.containsKey(group)) return false;
48     String JavaDoc modes = ((String JavaDoc) chanModes.get(group));
49     return modes.indexOf(mode) > -1;
50   }
51
52   public void setChanGroupMode(String JavaDoc group, String JavaDoc modes) {
53     chanModes.put(group, modes);
54   }
55
56   public Set getChannelsFromPriorLife(String JavaDoc nick) {
57     Set temp = (Set) wasOn.get(nick);
58     wasOn.remove(temp);
59     return temp;
60   }
61
62   public HashMap getSupportInfo() {
63     return iSupport;
64   }
65
66   public void addSupportInfo(String JavaDoc key, String JavaDoc value) {
67     iSupport.put(key, value);
68   }
69
70   public String JavaDoc getMyNick() {
71     return myNickname;
72   }
73
74   public User getMyUser() {
75     return getUser(getMyNick());
76   }
77
78   public UserMode getPrefixInfo() {
79     return umode;
80   }
81
82   public void setPrefixInfo(String JavaDoc modes, String JavaDoc chars) {
83     umode = new UserMode(modes, chars);
84   }
85
86   public void setMyNick(String JavaDoc n) {
87     myNickname = n;
88   }
89
90   public MyUser getMyUserInformation() {
91     return myInformation;
92   }
93
94   public void installChannelWatch(String JavaDoc channel, ChannelDataWatch ch) {
95     sync.put(channel.toUpperCase(), ch);
96   }
97
98   public ChannelDataWatch getChannelDataWatch(Channel ch) {
99     return (ChannelDataWatch) sync.get(ch.getName().toUpperCase());
100   }
101
102   /**
103    * ********************************************************************
104    */

105
106   public LinkedList nickCompleteAll(String JavaDoc pnick, String JavaDoc channel) {
107     LinkedList rv = new LinkedList();
108
109     if (getChannel(channel) != null) {
110       Set users = getChannel(channel).getAllUsers();
111
112       Iterator i = users.iterator();
113       while (i.hasNext()) {
114         User temp = (User) i.next();
115         if (temp.getNick().length() >= pnick.length()) {
116           if (temp.getNick().toLowerCase().substring(0, pnick.length()).equals(pnick.toLowerCase())) {
117             rv.addFirst(temp.getNick());
118           } else if (temp.getNick().toLowerCase().indexOf(pnick.toLowerCase()) > -1 &&
119             (!temp.getNick().toLowerCase().equals(getMyNick().toLowerCase()))) {
120             rv.addLast(temp.getNick());
121           }
122         }
123       }
124     }
125
126     rv.addLast(pnick);
127
128     return rv;
129   }
130
131   public String JavaDoc nickComplete(String JavaDoc pnick, String JavaDoc channel) {
132     if (getChannel(channel) == null) {
133       return pnick;
134     }
135
136     Set users = getChannel(channel).getAllUsers();
137
138     if (isUser(pnick) && users.contains(getUser(pnick))) {
139       return pnick;
140     }
141
142     String JavaDoc possible = null;
143
144     Iterator i = users.iterator();
145     while (i.hasNext()) {
146       User temp = (User) i.next();
147       if (temp.getNick().length() >= pnick.length()) {
148         if (temp.getNick().toLowerCase().substring(0, pnick.length()).equals(pnick.toLowerCase())) {
149           return temp.getNick();
150         }
151
152         if (temp.getNick().toLowerCase().indexOf(pnick.toLowerCase()) > -1 &&
153           (!temp.getNick().toLowerCase().equals(getMyNick().toLowerCase()))) {
154           possible = temp.getNick();
155         }
156       }
157     }
158
159     if (possible != null) {
160       return possible;
161     }
162
163     return pnick;
164   }
165
166   public Collection getAllUsers() {
167     return users.values();
168   }
169
170   public String JavaDoc toString() {
171     return "[IDL for " + myNickname + " - users: " + users.size() + ", channels: " + channels.size() + "]";
172   }
173
174   public InternalDataList() {
175     /* probably don't need to do anything */
176   }
177
178   public boolean isUser(String JavaDoc nickname) {
179     return (users.get(nickname) != null);
180   }
181
182   public User getUser(String JavaDoc nickname) {
183     if (users.get(nickname) == null) {
184       users.put(nickname, new User(nickname));
185     }
186     return (User) users.get(nickname);
187   }
188
189   public Set getUsersWithMode(String JavaDoc channel, char mode) {
190     return umode.getUsersWithMode(getChannel(channel), mode);
191   }
192
193   public void QuitNick(String JavaDoc nickname) {
194     Channel temp;
195
196     Set oldchannels = new HashSet();
197
198     Iterator iter = (new LinkedList(getUser(nickname).getChannels())).iterator();
199     while (iter.hasNext()) {
200       temp = (Channel) iter.next();
201       RemoveUser(getUser(nickname), temp);
202       oldchannels.add(temp.getName());
203     }
204
205     wasOn.put(nickname, oldchannels);
206
207     users.remove(nickname);
208   }
209
210   public void PartNick(String JavaDoc nickname, Channel channel) {
211     if (getMyNick().equals(nickname)) {
212       Iterator iter = channel.getAllUsers().iterator();
213       while (iter.hasNext()) {
214         User temp = (User) iter.next();
215         temp.getChannelData().remove(channel);
216
217         if (temp.getChannelData().size() == 0) {
218           users.remove(temp); // remove users who are no longer visible
219
}
220       }
221
222       channel.getAllUsers().clear();
223       channels.remove(channel.getName().toUpperCase());
224     }
225
226     RemoveUser(getUser(nickname), channel);
227   }
228
229   public void JoinNick(String JavaDoc nickname, String JavaDoc channel) {
230     if (getMyNick().equals(nickname)) {
231       createChannel(channel);
232     }
233
234     getUser(nickname).getChannelData().put(getChannel(channel), new Integer JavaDoc(0));
235     getChannel(channel).getAllUsers().add(getUser(nickname));
236
237     if (getChannelDataWatch(getChannel(channel)) != null) {
238       getChannelDataWatch(getChannel(channel)).userAdded(getUser(nickname));
239     }
240   }
241
242   public void ChangeNick(String JavaDoc oldnick, String JavaDoc newnick) {
243     User temp = getUser(oldnick);
244
245     // remove the user before the nick is changed in the data structure
246
Channel channel;
247
248     Iterator iter = temp.getChannels().iterator();
249     while (iter.hasNext()) {
250       channel = (Channel) iter.next();
251       channel.getAllUsers().remove(temp);
252     }
253
254     // change the nick in the data structure
255
users.remove(oldnick);
256
257     temp.setNick(newnick);
258
259     users.put(newnick, temp);
260
261     // re add the user to the channel data structure
262
iter = temp.getChannels().iterator();
263     while (iter.hasNext()) {
264       channel = (Channel) iter.next();
265       channel.getAllUsers().add(temp);
266
267       if (getChannelDataWatch(channel) != null) {
268         getChannelDataWatch(channel).userChanged();
269       }
270     }
271
272     // change my nickname (if applicable)
273
if (oldnick.equals(getMyNick())) {
274       setMyNick(newnick);
275     }
276   }
277
278   public boolean isOn(User user, Channel channel) {
279     return user != null && user.getChannels().contains(channel);
280   }
281
282   public void AddUser(String JavaDoc nickname, Channel channel) {
283     int modes = 0;
284
285     while (umode.isPrefixChar(nickname.charAt(0))) {
286       modes = umode.setMode(modes, umode.getModeForDisplay(nickname.charAt(0)));
287       nickname = nickname.substring(1, nickname.length());
288     }
289
290     User user = getUser(nickname);
291
292     // @Serge: when user joins empty channel and obtains +o automatically, he's already present on this channel,
293
// (user.getChannelData().containsKey(channel) returns true on some networks), but without +o,
294
// so we need to update user's mode.
295
// Fix for: http://jirc.hick.org/cgi-bin/bitch.cgi/view.html?7013225
296
if (user.getChannelData().containsKey(channel)) {
297       // only put new mode if it's different
298
if (((Integer JavaDoc) user.getChannelData().get(channel)).intValue() != modes)
299         user.getChannelData().put(channel, new Integer JavaDoc(modes));
300     } else {
301       user.getChannelData().put(channel, new Integer JavaDoc(modes));
302       channel.getAllUsers().add(user);
303     }
304   }
305
306   public Channel getChannel(String JavaDoc channel) {
307     return (Channel) channels.get(channel.toUpperCase());
308   }
309
310   public void createChannel(String JavaDoc channel) {
311     channels.put(channel.toUpperCase(), new Channel(channel));
312
313     if (getChannelDataWatch(getChannel(channel)) != null) {
314       getChannelDataWatch(getChannel(channel)).createChannel(getChannel(channel));
315     }
316   }
317
318   public void synchronizeUserPreChange(User user, Channel channel) {
319     channel.getAllUsers().remove(user);
320   }
321
322   public void synchronizeUserPostChange(User user, Channel channel) {
323     channel.getAllUsers().add(user);
324     if (getChannelDataWatch(channel) != null) {
325       getChannelDataWatch(channel).userChanged();
326     }
327   }
328
329   public void RemoveUser(User user, Channel channel) {
330     channel.getAllUsers().remove(user);
331     user.getChannelData().remove(channel);
332
333     if (user.getChannelData().size() == 0) {
334       users.remove(user);
335     }
336
337     if (getChannelDataWatch(channel) != null) {
338       getChannelDataWatch(channel).userRemoved(user);
339     }
340   }
341 }
342
Popular Tags