KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > rero > client > server > ProcessEvents


1 package rero.client.server;
2
3 import rero.ircfw.*;
4 import rero.ircfw.interfaces.*;
5 import rero.ircfw.data.*;
6
7 import rero.util.*;
8 import java.util.*;
9
10 import rero.client.*;
11 import rero.client.output.*;
12
13 import rero.config.*;
14
15 public class ProcessEvents extends Feature implements FrameworkConstants, ChatListener
16 {
17    protected InternalDataList ircData;
18    protected OutputCapabilities output;
19    protected SyncCheck syncs = new SyncCheck();
20
21    public void init()
22    {
23       output = getCapabilities().getOutputCapabilities();
24     
25       ircData = (InternalDataList)getCapabilities().getDataStructure("clientInformation");
26
27       getCapabilities().addChatListener(this);
28    }
29
30    public int fireChatEvent (HashMap eventDescription)
31    {
32       String JavaDoc target = (String JavaDoc) eventDescription.get($TARGET$);
33       String JavaDoc nick = (String JavaDoc) eventDescription.get($NICK$);
34       String JavaDoc channel = (String JavaDoc) eventDescription.get($TARGET$);
35       String JavaDoc event = (String JavaDoc) eventDescription.get($EVENT$);
36  
37       if (event.equals("PRIVMSG"))
38       {
39          if (ClientUtils.isChannel(target))
40          {
41 /* if (!getCapabilities().getUserInterface().isActive(channel))
42              {
43                  rero.util.ClientUtils.dump(eventDescription);
44              } */

45
46              output.fireSetTarget(eventDescription, channel, output.chooseSet(channel, "CHANNEL_TEXT", "CHANNEL_TEXT_INACTIVE"));
47              touchUser(nick, target);
48          }
49          else
50          {
51              if (ClientState.getClientState().isOption("auto.query", ClientDefaults.auto_option))
52              {
53                 boolean isSelected = ! ClientState.getClientState().isOption("auto.hide", ClientDefaults.auto_option);
54                 getCapabilities().getUserInterface().openQueryWindow(nick, isSelected);
55              }
56              output.fireSetQuery(eventDescription, nick, target, "PRIVMSG");
57          }
58       }
59       else if (event.equals("MODE"))
60       {
61          if (ClientUtils.isChannel(target))
62          {
63              output.fireSetTarget(eventDescription, channel, "CHANNEL_MODE");
64              getCapabilities().getUserInterface().notifyWindow(channel);
65          }
66          else
67          {
68              output.fireSetTarget(eventDescription, nick, "USER_MODE");
69              getCapabilities().getUserInterface().notifyWindow(nick);
70          }
71 // rero.util.ClientUtils.dump(eventDescription);
72
}
73       else if (event.equals("NOTICE"))
74       {
75          if (nick == null || nick.length() == 0)
76          {
77             output.fireSetStatus(eventDescription, "NOTICE");
78          }
79          else if (ClientUtils.isChannel(target) || ClientState.getClientState().isOption("active.notice", ClientDefaults.active_option))
80          {
81             output.fireSetConfused(eventDescription, target, "notice", "NOTICE");
82          }
83          else
84          {
85             output.fireSetAllTarget2(eventDescription, nick, "NOTICE");
86          }
87
88 // rero.util.ClientUtils.dump(eventDescription);
89
}
90       else if (event.equals("ACTION"))
91       {
92          if (ClientUtils.isChannel(target))
93          {
94              output.fireSetTarget(eventDescription, channel, output.chooseSet(channel, "ACTION", "ACTION_INACTIVE"));
95              touchUser(nick, target);
96          }
97          else
98          {
99              if (ClientState.getClientState().isOption("auto.query", ClientDefaults.auto_option))
100              {
101                 boolean isSelected = ! ClientState.getClientState().isOption("auto.hide", ClientDefaults.auto_option);
102                 getCapabilities().getUserInterface().openQueryWindow(nick, isSelected);
103              }
104
105              output.fireSetTarget(eventDescription, nick, "PRIVACTION");
106          }
107       }
108       else if (event.equals("JOIN"))
109       {
110          if (eventDescription.get("$nick").equals(ircData.getMyNick()))
111          {
112             syncs.addChannel(channel.toString().toLowerCase());
113             getCapabilities().sendln("MODE " + channel.toString());
114
115             //
116
// make this an option later
117
//
118

119             if (ClientState.getClientState().isOption("update.ial", ClientDefaults.update_ial))
120             {
121                UpdateIAL checkIAL = new UpdateIAL();
122                getCapabilities().addTemporaryListener(checkIAL);
123                getCapabilities().sendln("WHO " + channel.toString());
124             }
125
126             //
127
// auto /window on join
128
//
129
if (ClientState.getClientState().isOption("auto.join", ClientDefaults.auto_option))
130             {
131                getCapabilities().getUserInterface().openChannelWindow(ircData.getChannel(channel));
132             }
133             else
134             {
135                getCapabilities().getUserInterface().setQuery(channel.toString());
136             }
137          }
138
139          output.fireSetTarget(eventDescription, channel, "CHANNEL_JOIN");
140       }
141       else if (event.equals("KICK"))
142       {
143          if (eventDescription.get("$nick").equals(ircData.getMyNick()))
144          {
145             output.cycleQuery();
146          }
147          output.fireSetTarget(eventDescription, channel, "CHANNEL_KICK");
148       }
149       else if (event.equals("PART"))
150       {
151          if (eventDescription.get("$nick").equals(ircData.getMyNick()))
152          {
153             output.cycleQuery();
154          }
155
156          if (ClientState.getClientState().isOption("auto.part", ClientDefaults.auto_option) && ClientState.getClientState().isOption("auto.join", ClientDefaults.auto_option) && ! getCapabilities().getUserInterface().isWindow(channel))
157          {
158             // do nothing if there is no window open and we have the option set to part the channel on closing the window.
159
}
160          else
161          {
162             output.fireSetTarget(eventDescription, channel, "CHANNEL_PART");
163          }
164       }
165       else if (event.equals("QUIT"))
166       {
167          output.fireSetAllDeadTarget(eventDescription, nick, "USER_QUIT");
168       }
169       else if (event.equals("NICK"))
170       {
171          getCapabilities().getUserInterface().notifyActiveWindow();
172
173          if (eventDescription.containsKey("$parms"))
174             output.fireSetAllTarget(eventDescription, eventDescription.get("$parms").toString(), "USER_NICK");
175
176          if (getCapabilities().getUserInterface().isWindow(nick))
177          {
178             getCapabilities().getUserInterface().renameWindow(nick, eventDescription.get("$parms").toString());
179          }
180       }
181       else if (event.equals("TOPIC"))
182       {
183          output.fireSetTarget(eventDescription, channel, "CHANNEL_TOPIC_CHANGED");
184          getCapabilities().getUserInterface().notifyWindow(channel);
185          touchUser(nick, target);
186       }
187       else if (event.equals("SIGNON"))
188       {
189          output.fireSetConfused(eventDescription, null, "notify", "NOTIFY_SIGNON");
190       }
191       else if (event.equals("SIGNOFF"))
192       {
193          output.fireSetConfused(eventDescription, null, "notify", "NOTIFY_SIGNOFF");
194       }
195       else if (event.equals("REQUEST"))
196       {
197          String JavaDoc type = (String JavaDoc)eventDescription.get("$type");
198          if (type.equals("VERSION"))
199          {
200             getCapabilities().sendln("NOTICE " + nick + " :" + (char)1 + "VERSION " + ClientUtils.ShowVersion() + (char)1);
201          }
202          if (type.equals("PING"))
203          {
204             getCapabilities().sendln("NOTICE " + nick + " :" + (char)1 + eventDescription.get("$parms") + (char)1);
205          }
206          if (type.equals("CLIENTINFO"))
207          {
208             getCapabilities().sendln("NOTICE " + nick + " :" + (char)1 + "CLIENTINFO ACTION CLIENTINFO DCC PING SOURCE TIME VERSION" + (char)1);
209          }
210          if (type.equals("SOURCE"))
211          {
212             getCapabilities().sendln("NOTICE " + nick + " :" + (char)1 + "SOURCE http://jirc.hick.org" + (char)1);
213          }
214          if (type.equals("TIME"))
215          {
216             getCapabilities().sendln("NOTICE " + nick + " :" + (char)1 + "TIME " + ClientUtils.TimeDateStamp(System.currentTimeMillis() / 1000) + (char)1);
217          }
218
219          if (type.equals("DCC"))
220          {
221             output.fireSetConfused(eventDescription, target, "ctcp", "DCC_REQUEST");
222          }
223          else
224          {
225             output.fireSetConfused(eventDescription, target, "ctcp", "CTCP_REQUEST");
226          }
227       }
228       else if (event.equals("CHAT_OPEN"))
229       {
230          nick = "=" + eventDescription.get("$nick");
231
232          if (ClientState.getClientState().isOption("auto.chat", ClientDefaults.auto_option))
233          {
234             boolean isSelected = ! ClientState.getClientState().isOption("auto.hide", ClientDefaults.auto_option);
235             getCapabilities().getUserInterface().openQueryWindow(nick, isSelected);
236          }
237
238          output.fireSetTarget(eventDescription, nick, "CHAT_OPEN");
239       }
240       else if (event.equals("CHAT"))
241       {
242          nick = "=" + eventDescription.get("$nick");
243
244          output.fireSetTarget(eventDescription, nick, "CHATMSG");
245       }
246       else if (event.equals("ERROR"))
247       {
248          output.fireSetAll(eventDescription, "SERVER_ERROR");
249       }
250       else if (event.equals("CHAT_CLOSE"))
251       {
252          nick = "=" + eventDescription.get("$nick");
253
254          if (ClientState.getClientState().isOption("auto.chatclose", ClientDefaults.auto_option) && ! getCapabilities().getUserInterface().isWindow(nick))
255          {
256             // we don't have a window anymore, and we have something enabled to close the chat on closing the window as such
257
// we'll do nothing now.
258
}
259          else
260          {
261             output.fireSetTarget(eventDescription, nick, "CHAT_CLOSE");
262          }
263       }
264       else if (event.equals("SEND_FAILED") || event.equals("RECEIVE_FAILED") || event.equals("SEND_COMPLETE") || event.equals("RECEIVE_COMPLETE") || event.equals("SEND_START") || event.equals("RECEIVE_START"))
265       {
266          output.fireSetConfused(eventDescription, nick, "ctcp", event);
267          getCapabilities().getUserInterface().notifyActiveWindow();
268       }
269       else if (event.equals("REPLY"))
270       {
271          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
272          data.tokenize(" ");
273
274          if (data.getToken(0).equals("PING") && data.getTotalTokens() > 1)
275          {
276             try
277             {
278                long temp = Long.parseLong(data.getToken(1));
279                eventDescription.put("$pt", ClientUtils.formatLongAsDecimal(System.currentTimeMillis() - temp) + "s");
280             } catch (Exception JavaDoc ex) { }
281          }
282
283          output.fireSetConfused(eventDescription, (String JavaDoc)eventDescription.get($TARGET$), "reply", "CTCP_REPLY");
284       }
285       else if (event.equals("INVITE"))
286       {
287          output.fireSetActive(eventDescription, "INVITE");
288       }
289       else if (event.equals("329") && output.isSet("CHANNEL_CREATED"))
290       {
291          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
292          data.tokenize(" ");
293
294          eventDescription.put("$created", ClientUtils.TimeDateStamp(Long.parseLong(data.getToken(1))));
295
296          output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_CREATED");
297       }
298       else if (event.equals("324"))
299       {
300          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
301          data.tokenize(" ");
302
303          channel = data.getToken(0);
304
305          if (syncs.isSyncing(channel.toLowerCase()))
306          {
307             eventDescription.put("$sync", ClientUtils.formatLongAsDecimal(syncs.getSyncTime(channel.toLowerCase())));
308             output.fireSetTarget(eventDescription, channel, "JOIN_SYNC");
309          }
310          else if (output.isSet("CHANNEL_MODE_IS"))
311          {
312             eventDescription.put("$parms", data.getTokenFrom(1) );
313             eventDescription.put("$data", data.getTokenFrom(0) );
314        
315             output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_MODE_IS");
316          }
317          else
318          {
319             processNumeric("324", eventDescription);
320          }
321   
322          getCapabilities().getUserInterface().notifyWindow(channel);
323       }
324       else if ((event.equals("332") || event.equals("331")) && output.isSet("CHANNEL_TOPIC_IS"))
325       {
326          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
327          data.tokenize(" ");
328
329          eventDescription.put("$parms", data.getTokenFrom(1) );
330          eventDescription.put("$data", data.getTokenFrom(0) );
331        
332          output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_TOPIC_IS");
333       }
334       else if (event.equals("333") && output.isSet("CHANNEL_TOPIC_SETBY"))
335       {
336          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
337          data.tokenize(" ");
338
339          eventDescription.put("$seton", ClientUtils.TimeDateStamp(Long.parseLong(data.getToken(2))));
340          
341          nick = data.getToken(1);
342          if (nick.indexOf('!') > -1)
343          {
344             nick = nick.substring(0, nick.indexOf('!'));
345          }
346
347          eventDescription.put("$nick", nick);
348
349          output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_TOPIC_SETBY");
350       }
351       else if (event.equals("353") && output.isSet("CHANNEL_NAMES"))
352       {
353          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
354          data.tokenize(" ");
355
356          output.fireSetTarget(eventDescription, data.getToken(1), "CHANNEL_NAMES");
357       }
358       else if (event.equals("353") && output.isSet("FORMATTED_NAMES"))
359       {
360          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
361          data.tokenize(" ");
362
363          eventDescription.put("$total", (data.getTotalTokens() - 2) + "");
364
365          output.fireSetTarget(eventDescription, data.getToken(1), "FORMATTED_NAMES_HEADER");
366
367          if (data.getTotalTokens() < 3 || data.getToken(2).equals(":"))
368          {
369             return 0;
370          }
371
372          String JavaDoc[] names = new String JavaDoc[data.getTotalTokens() - 2];
373
374          for (int x = 0; x < names.length; x++)
375          {
376             char n = data.getToken(x + 2).charAt(0);
377             if (ircData.getPrefixInfo().isPrefixChar(n))
378             {
379                eventDescription.put("$nick", data.getToken(x + 2).substring(1, data.getToken(x + 2).length()));
380             }
381             else
382             {
383                eventDescription.put("$nick", data.getToken(x + 2));
384             }
385
386             names[x] = output.parseSet(eventDescription, "FORMATTED_NAMES");
387          }
388          output.echo(data.getToken(1), names, .85);
389       }
390       else if (event.equals("367") && output.isSet("CHANNEL_BANLIST"))
391       {
392          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
393          data.tokenize(" ");
394
395          output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_BANLIST");
396       }
397       else if (event.equals("368") && output.isSet("CHANNEL_BANLIST_END"))
398       {
399          TokenizedString data = new TokenizedString((String JavaDoc)eventDescription.get($PARMS$));
400          data.tokenize(" ");
401
402          output.fireSetTarget(eventDescription, data.getToken(0), "CHANNEL_BANLIST_END");
403       }
404       else if ((event.equals("375") || event.equals("376") || event.equals("372")) && !ClientState.getClientState().isOption("option.showmotd", ClientDefaults.option_showmotd))
405       {
406          // do nothing as 372 is the MOTD reply
407
}
408       else if (eventDescription.get($NUMERIC$) != null)
409       {
410          String JavaDoc numeric = (String JavaDoc)eventDescription.get($NUMERIC$);
411          processNumeric(numeric, eventDescription);
412       }
413       else
414       {
415          output.fireSetStatus(eventDescription, event);
416 // rero.util.ClientUtils.dump(eventDescription);
417
}
418  
419       return 0;
420    }
421
422    private ChatListener allowAway = new AllowAwayReply(); // kind of a hack but bare with me...
423

424    public void processNumeric(String JavaDoc numeric, HashMap eventDescription)
425    {
426       int temp = Integer.parseInt(numeric);
427
428       String JavaDoc type = "NUMERIC";
429
430       if (output.isSet("REPL_" + numeric))
431       {
432          type = "REPL_" + numeric;
433       }
434
435       if (isWhoisNumeric(temp)) /* looking for /whois related numerics */
436       {
437           if (!(allowAway.isChatEvent(numeric, eventDescription) && allowAway.fireChatEvent(eventDescription) == ChatListener.EVENT_HALT))
438           {
439              output.fireSetConfused(eventDescription, null, "whois", type);
440           }
441           else
442           {
443              // halting numeric... its a numeric we don't want to display
444
}
445       }
446       else
447       {
448           output.fireSetStatus(eventDescription, type);
449       }
450    }
451  
452    public boolean isChatEvent(String JavaDoc eventId, HashMap eventDescription)
453    {
454       return true;
455    }
456
457    private static boolean isWhoisNumeric(int x)
458    {
459       return ((x >= 311 && x < 321) || x == 338 || x == 369 || x == 301 || x == 302 || x == 307 || x == 308 || x == 330 || x == 401 || x == 406 || x == 378 || x == 379 || x == 310 || x== 671 || x == 703);
460    }
461
462    private static class AllowAwayReply implements ChatListener
463    {
464       private boolean awayIsGood = false;
465       
466       public boolean isChatEvent(String JavaDoc eventId, HashMap eventDescription)
467       {
468          return (eventId.equals("301") || eventId.equals("311") || eventId.equals("318"));
469       }
470
471       public int fireChatEvent(HashMap desc)
472       {
473          if ( "311".equals(desc.get($EVENT$)) )
474              awayIsGood = true;
475
476          if ( "318".equals(desc.get($EVENT$)) )
477              awayIsGood = false;
478
479          if ( "301".equals(desc.get($EVENT$)) && !awayIsGood )
480              return ChatListener.EVENT_HALT;
481
482          return ChatListener.EVENT_DONE;
483       }
484    }
485
486     private void touchUser(String JavaDoc nick, String JavaDoc channel)
487     {
488         User user = ircData.getUser(nick);
489
490         boolean wasIdle = user.isIdle();
491
492         user.touch();
493
494         if (wasIdle && ircData.getChannel(channel) != null) {
495             ChannelDataWatch temp = ircData.getChannelDataWatch(ircData.getChannel(channel));
496             if (temp != null)
497                 temp.userChanged();
498         }
499     }
500 }
501
Popular Tags