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 target = (String ) eventDescription.get($TARGET$); 33 String nick = (String ) eventDescription.get($NICK$); 34 String channel = (String ) eventDescription.get($TARGET$); 35 String event = (String ) eventDescription.get($EVENT$); 36 37 if (event.equals("PRIVMSG")) 38 { 39 if (ClientUtils.isChannel(target)) 40 { 41 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 } 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 } 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 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 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 } 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 type = (String )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 } 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 )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 ex) { } 281 } 282 283 output.fireSetConfused(eventDescription, (String )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 )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 )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 )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 )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 )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 )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 [] names = new String [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 )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 )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 } 408 else if (eventDescription.get($NUMERIC$) != null) 409 { 410 String numeric = (String )eventDescription.get($NUMERIC$); 411 processNumeric(numeric, eventDescription); 412 } 413 else 414 { 415 output.fireSetStatus(eventDescription, event); 416 } 418 419 return 0; 420 } 421 422 private ChatListener allowAway = new AllowAwayReply(); 424 public void processNumeric(String numeric, HashMap eventDescription) 425 { 426 int temp = Integer.parseInt(numeric); 427 428 String type = "NUMERIC"; 429 430 if (output.isSet("REPL_" + numeric)) 431 { 432 type = "REPL_" + numeric; 433 } 434 435 if (isWhoisNumeric(temp)) 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 } 445 } 446 else 447 { 448 output.fireSetStatus(eventDescription, type); 449 } 450 } 451 452 public boolean isChatEvent(String 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 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 nick, String 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 |