ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/server/uk/org/iscream/cms/server/client/alerters/IRC__Alerter.java
(Generate patch)

Comparing projects/cms/source/server/uk/org/iscream/cms/server/client/alerters/IRC__Alerter.java (file contents):
Revision 1.30.2.3 by tdb, Tue Feb 5 18:00:15 2002 UTC vs.
Revision 1.36 by tdb, Sun Aug 1 10:40:43 2004 UTC

# Line 1 | Line 1
1 + /*
2 + * i-scream central monitoring system
3 + * http://www.i-scream.org
4 + * Copyright (C) 2000-2002 i-scream
5 + *
6 + * This program is free software; you can redistribute it and/or
7 + * modify it under the terms of the GNU General Public License
8 + * as published by the Free Software Foundation; either version 2
9 + * of the License, or (at your option) any later version.
10 + *
11 + * This program is distributed in the hope that it will be useful,
12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 + * GNU General Public License for more details.
15 + *
16 + * You should have received a copy of the GNU General Public License
17 + * along with this program; if not, write to the Free Software
18 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 + */
20 +
21   //---PACKAGE DECLARATION---
22   package uk.org.iscream.cms.server.client.alerters;
23  
24   //---IMPORTS---
25   import uk.org.iscream.cms.server.client.*;
26   import uk.org.iscream.cms.server.core.*;
27 < import uk.org.iscream.cms.server.util.*;
27 > import uk.org.iscream.cms.util.*;
28   import uk.org.iscream.cms.server.componentmanager.*;
29   import java.io.*;
30   import java.net.*;
# Line 94 | Line 114 | public class IRC__Alerter extends AlerterSkeleton {
114       * Overrides the {@link java.lang.Object#toString() Object.toString()}
115       * method to provide clean logging (every class should have this).
116       *
117 <     * This uses the uk.org.iscream.cms.server.util.NameFormat class
117 >     * This uses the uk.org.iscream.cms.util.NameFormat class
118       * to format the toString()
119       *
120       * @return the name of this class and its CVS revision
# Line 224 | Line 244 | public class IRC__Alerter extends AlerterSkeleton {
244           *
245           * @throws IOException if there is any problem initialising
246           */
247 <        public void init() throws IOException {
247 >        private void init() throws IOException {
248              _logger.write(this.toString(), Logger.DEBUG, "Initialising IRCBot...");
249              
250              // get a hook on the configuration system
# Line 245 | Line 265 | public class IRC__Alerter extends AlerterSkeleton {
265              }
266              
267              // get hold of the user details and nickname list
268 <            String user, comment, finger, nickList;
268 >            String user, nickList;
269              try {
270                  user = cp.getProperty(_name, "Alerter.IRC.user");
251                comment = cp.getProperty(_name, "Alerter.IRC.comment");
252                finger = cp.getProperty(_name, "Alerter.IRC.finger");
271                  nickList = cp.getProperty(_name, "Alerter.IRC.nickList");
272              } catch (PropertyNotFoundException e) {
273                  _logger.write(this.toString(), Logger.ERROR, "Configuration error: "+e);
274                  throw new IOException("Can't get user/nickname details due to configuration error");
275              }
276              
277 +            // get hold of comment and finger information
278 +            //  -- we're not too fussed if these aren't set
279 +            String comment = "Alerter.IRC.comment is undefined";
280 +            String finger = "Alerter.IRC.finger is undefined";
281 +            try {
282 +                comment = cp.getProperty(_name, "Alerter.IRC.comment");
283 +                finger = cp.getProperty(_name, "Alerter.IRC.finger");
284 +            } catch (PropertyNotFoundException e) {
285 +                _logger.write(this.toString(), Logger.WARNING, "Configuration warning, using default: "+e);
286 +            }
287 +            
288              // put these details into the bot
289              this.setLogin(user);
290 <            this.setVersion(comment);
290 >            this.setVersion("[" + getRevision() + "] " + comment);
291              this.setFinger(finger);
292              
293              // attempt to connect, trying each nickname
# Line 280 | Line 309 | public class IRC__Alerter extends AlerterSkeleton {
309                      _logger.write(this.toString(), Logger.ERROR, "IO error when connecting to server: "+e);
310                      throw new IOException("IO error when connecting to server");
311                  }
283                catch(IrcException e) {
284                    _logger.write(this.toString(), Logger.ERROR, "IRC error when connecting to server: "+e);
285                    throw new IOException("IRC error when connecting to server");
286                }
312                  catch(NickAlreadyInUseException e) {
313                      _logger.write(this.toString(), Logger.ERROR, "Nickname "+nick+" is already in use: "+e);
314                      // don't do anything, instead just loop round
315                      // and try the next nickname in the list
316                  }
317 +                catch(IrcException e) {
318 +                    _logger.write(this.toString(), Logger.ERROR, "IRC error when connecting to server: "+e);
319 +                    throw new IOException("IRC error when connecting to server");
320 +                }
321              }
322              if(!ok) {
323                  // must have tried all the nicknames, best bail out
# Line 326 | Line 355 | public class IRC__Alerter extends AlerterSkeleton {
355           *
356           * @param message The message to send
357           */
358 <        public void sendMessage(String message) {
358 >        private void sendMessage(String message) {
359              sendMessage(_channel, message);
360          }
361          
# Line 364 | Line 393 | public class IRC__Alerter extends AlerterSkeleton {
393           * @param message The message sent
394           */
395          public void onMessage(String channel, String sender, String login, String hostname, String message) {
396 <            if(isForMe(message)) {
397 <                handleInput(message, channel);
396 >            String trimmedMessage = isForMe(message);
397 >            // if trimmedMessage is null, it's not for us
398 >            if(trimmedMessage != null) {
399 >                handleInput(trimmedMessage, channel);
400              }
401          }
402          
# Line 399 | Line 430 | public class IRC__Alerter extends AlerterSkeleton {
430          public void onNickChange(String oldNick, String login, String hostname, String newNick) {
431              if(oldNick.equals(_nickname)) {
432                  _nickname = newNick;
433 +                // tell the underlying pircbot that our nick has changed too :)
434 +                setName(newNick);
435              }
436          }
437          
# Line 437 | Line 470 | public class IRC__Alerter extends AlerterSkeleton {
470           * This method handles input directed to us, and
471           * responds accordingly if required.
472           *
440         * nb. matching user input is quite bad right now,
441         *     and should be improved one day.
442         *
473           * @param message the message from someone
474           * @param source where the message came from, so we know where to send the response
475           */
# Line 468 | Line 498 | public class IRC__Alerter extends AlerterSkeleton {
498                  return;
499              }
500              
501 <            // see if the message matches (loosely!) any
472 <            // of our known commands
473 <            if(message.indexOf(stopCommand) != -1) {
501 >            if(message.equalsIgnoreCase(stopCommand)) {
502                  _active = false;
503                  sendMessage(source, "alerts have been stopped");
504              }
505 <            else if(message.indexOf(startCommand) != -1) {
505 >            else if(message.equalsIgnoreCase(startCommand)) {
506                  _active = true;
507                  sendMessage(source, "alerts have been activated");
508              }
509              // this needs to go before lastAlertCommand if it contains
510              // the same words as the lastAlertCommand.
511 <            else if(message.indexOf(timeSinceLastAlertCommand) != -1) {
511 >            else if(message.equalsIgnoreCase(timeSinceLastAlertCommand)) {
512                  if(_lastAlertTime != -1) {
513                      long uptime = (System.currentTimeMillis() - _lastAlertTime) / 1000;
514                      String uptimeText = DateUtils.formatTime(uptime, "%DAYS% days, %HOURS% hours, %MINS% mins, and %SECS% secs");
# Line 490 | Line 518 | public class IRC__Alerter extends AlerterSkeleton {
518                      sendMessage(source, "I've never sent an alert!");
519                  }
520              }
521 <            else if(message.indexOf(lastAlertCommand) != -1) {
521 >            else if(message.equalsIgnoreCase(lastAlertCommand)) {
522                  if(_lastAlertTime != -1) {
523                      String date = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.UK).format(new Date(_lastAlertTime));
524                      sendMessage(source, "last alert was at "+date+"; "+_lastAlert);
# Line 500 | Line 528 | public class IRC__Alerter extends AlerterSkeleton {
528                  }
529                  
530              }
531 <            else if(message.indexOf(joinCommand) != -1) {
531 >            else if(message.toLowerCase().startsWith(joinCommand.toLowerCase())) {
532                  String joinCmd = joinCommand;
533                  String newChan = message.substring(message.indexOf(joinCmd) + joinCmd.length() + 1);
534                  int endOfChan = newChan.indexOf(" ");
# Line 516 | Line 544 | public class IRC__Alerter extends AlerterSkeleton {
544                      _channel = newChan;
545                  }
546              }
547 <            else if(message.indexOf(nickChangeCommand) != -1) {
547 >            else if(message.toLowerCase().startsWith(nickChangeCommand.toLowerCase())) {
548                  String nickChangeCmd = nickChangeCommand;
549                  String newNick = message.substring(message.indexOf(nickChangeCmd) + nickChangeCmd.length() + 1);
550                  int endOfNick = newNick.indexOf(" ");
# Line 526 | Line 554 | public class IRC__Alerter extends AlerterSkeleton {
554                  newNick = newNick.substring(0, endOfNick);
555                  changeNick(newNick);
556              }
557 <            else if(message.indexOf(versionCommand) != -1) {
558 <                sendMessage(source, "I am version "+REVISION.substring(11, REVISION.length() -2)+" of the i-scream alerting bot");
557 >            else if(message.equalsIgnoreCase(versionCommand)) {
558 >                sendMessage(source, "I am version " + getRevision() + " of the i-scream alerting bot");
559              }
560 <            else if(message.indexOf(helpCommand) != -1) {
560 >            else if(message.equalsIgnoreCase(helpCommand)) {
561                  sendMessage(source, "Hello, I am the i-scream alerting bot version "+REVISION.substring(11, REVISION.length() -2));
562                  sendMessage(source, "I understand the following commands;");
563                  sendMessage(source, stopCommand);
# Line 542 | Line 570 | public class IRC__Alerter extends AlerterSkeleton {
570                  sendMessage(source, timeSinceLastAlertCommand);
571                  sendMessage(source, helpCommand);
572              }
573 <            else if(message.indexOf(statCommand) != -1) {
573 >            else if(message.equalsIgnoreCase(statCommand)) {
574                  sendMessage(source, "I have sent a total of "+_alertCount+" alerts, and ignored a total of "+_ignoredCount+"!");
575              }
576 <            else if(message.indexOf(uptimeCommand) != -1) {
576 >            else if(message.equalsIgnoreCase(uptimeCommand)) {
577                  long uptime = (System.currentTimeMillis() - _startTime) / 1000;
578                  String uptimeText = DateUtils.formatTime(uptime, "%DAYS% days, %HOURS% hours, %MINS% mins, and %SECS% secs");
579                  sendMessage(source, "I have been running for "+uptimeText);
580              }
581 <            else if(message.indexOf("ping") != -1) {
581 >            else if(message.equalsIgnoreCase("ping")) {
582                  sendMessage(source, "pong");
583              }
584 <            else if(message.indexOf("do a jibble dance") != -1) {
584 >            else if(message.equalsIgnoreCase("do a jibble dance")) {
585                  // little joke :)
586                  sendAction(source, "jives to the funky beat shouting \"ii--screeeaaammm\"");
587              }
# Line 572 | Line 600 | public class IRC__Alerter extends AlerterSkeleton {
600           * Quick method to check if the message appears
601           * to be directed at us. We simply check to see
602           * if it starts with our nick in some fashion.
603 +         * This will return null if the message is not
604 +         * for us - thus allowing this method to perform
605 +         * two tasks at once.
606           *
607           * @param message the message to check
608 <         * @return if the message is for us
608 >         * @return the message (with our nick removed), or null if it's not for us.
609           */
610 <        private boolean isForMe(String message) {
610 >        private String isForMe(String message) {
611 >            // change to lower case to remove
612 >            // case ambiguities
613              String nick = _nickname.toLowerCase();
614              String msg = message.toLowerCase();
615              if(msg.startsWith(nick + ", ") ||
616                 msg.startsWith(nick + ": ") ||
617                 msg.startsWith(nick + " ")) {
618 <                return true;
618 >                // NOTE that the 1 here is hardcoded to be the length
619 >                // of the above 'extra' character (eg , or :)
620 >                return message.substring(nick.length()+1).trim();
621              }
622              else {
623 <                return false;
623 >                return null;
624              }
625          }
626          
# Line 612 | Line 647 | public class IRC__Alerter extends AlerterSkeleton {
647          }
648          
649          /**
650 +         * Returns the revision of the bot.
651 +         *
652 +         * @return the revision of this bot
653 +         */
654 +        private String getRevision() {
655 +            return REVISION.substring(11, REVISION.length()-2);
656 +        }
657 +        
658 +        /**
659           * Overrides the {@link java.lang.Object#toString() Object.toString()}
660           * method to provide clean logging (every class should have this).
661           *
662 <         * This uses the uk.org.iscream.cms.server.util.NameFormat class
662 >         * This uses the uk.org.iscream.cms.util.NameFormat class
663           * to format the toString()
664           *
665           * @return the name of this class and its CVS revision

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines