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
Revision: 1.6
Committed: Fri Mar 2 02:46:56 2001 UTC (23 years, 2 months ago) by tdb
Branch: MAIN
Changes since 1.5: +5 -4 lines
Log Message:
Changed the printing of the alert level.

File Contents

# Content
1 //---PACKAGE DECLARATION---
2 package uk.ac.ukc.iscream.client.alerters;
3
4 //---IMPORTS---
5 import uk.ac.ukc.iscream.client.*;
6 import uk.ac.ukc.iscream.core.*;
7 import uk.ac.ukc.iscream.util.*;
8 import uk.ac.ukc.iscream.componentmanager.*;
9
10 import java.io.*;
11 import java.net.*;
12
13 /**
14 * This Alert sends an IRC message.
15 *
16 * @author $Author: tdb1 $
17 * @version $Id: IRC__Alerter.java,v 1.5 2001/03/02 01:32:09 tdb1 Exp $
18 */
19 public class IRC__Alerter implements PluginAlerter {
20
21 //---FINAL ATTRIBUTES---
22
23 /**
24 * The current CVS revision of this class
25 */
26 public final String REVISION = "$Revision: 1.5 $";
27
28 public final String DESC = "Sends alerts on an IRC channel";
29
30 //---STATIC METHODS---
31
32 //---CONSTRUCTORS---
33
34 public IRC__Alerter() {
35 // get the configuration for this alerter
36 Configuration config = ReferenceManager.getInstance().getCM().getConfiguration(_name);
37
38 // an integer value
39 _level = Integer.parseInt(config.getProperty("Alerter.IRC.level"));
40 // the hostname of the IRC server
41 _IRCServer = config.getProperty("Alerter.IRC.IRCServer");
42 // the port number of the IRC server
43 _IRCPort = Integer.parseInt(config.getProperty("Alerter.IRC.IRCPort"));
44 // the nickname to use
45 _nick = config.getProperty("Alerter.IRC.nick");
46 // the channel to join
47 _channel = config.getProperty("Alerter.IRC.channel");
48 // a message with the following: %level% and %message%
49 _message = config.getProperty("Alerter.IRC.message");
50
51 // connect to the IRC server
52 _ircbot = null;
53 try {
54 _ircbot = new IRCBot();
55 _ircbot.connect();
56 _ircbot.sendNotice("iscreamBot activated");
57 } catch(IOException e) {
58 _logger.write(toString(), Logger.ERROR, "Error starting IRCBot: "+e);
59 }
60
61 _logger.write(toString(), Logger.SYSINIT, "IRC Alerter started");
62 }
63
64 //---PUBLIC METHODS---
65
66 public void sendAlert(Alert alert) {
67 // only send if it's equal (or above) our level
68 if(alert.getLevel() >= _level) {
69 String alertType = Alert.alerts[alert.getLevel()]+"["+String.valueOf(alert.getLevel())+"]";
70 // sort out the message
71 String message = _message;
72 message = StringUtils.replaceText(message, "%level%", alertType);
73 message = StringUtils.replaceText(message, "%source%", alert.getSource());
74 message = StringUtils.replaceText(message, "%value%", alert.getValue());
75 message = StringUtils.replaceText(message, "%thresholdValue%", alert.getThresholdValue());
76 message = StringUtils.replaceText(message, "%attributeName%", alert.getAttributeName());
77
78 // send the message
79 _logger.write(toString(), Logger.DEBUG, "Sending IRC Alert at level"+String.valueOf(alert.getLevel()));
80 _ircbot.sendMsg(message);
81 }
82 }
83
84 /**
85 * Overrides the {@link java.lang.Object#toString() Object.toString()}
86 * method to provide clean logging (every class should have this).
87 *
88 * This uses the uk.ac.ukc.iscream.util.NameFormat class
89 * to format the toString()
90 *
91 * @return the name of this class and its CVS revision
92 */
93 public String toString() {
94 return FormatName.getName(
95 _name,
96 getClass().getName(),
97 REVISION);
98 }
99
100 /**
101 * return the String representation of what the filter does
102 */
103 public String getDescription(){
104 return DESC;
105 }
106
107 //---PRIVATE METHODS---
108
109 //---ACCESSOR/MUTATOR METHODS---
110
111 //---ATTRIBUTES---
112
113 // an integer value
114 private int _level;
115
116 // the hostname of the IRC server
117 private String _IRCServer;
118
119 // the port number of the IRC server
120 private int _IRCPort;
121
122 // the nickname to use
123 private String _nick;
124
125 // the channel to join
126 private String _channel;
127
128 // the ircbot
129 private IRCBot _ircbot;
130
131 // a message with the following: %level% and %message%
132 private String _message;
133
134 /**
135 * This is the friendly identifier of the
136 * component this class is running in.
137 * eg, a Filter may be called "filter1",
138 * If this class does not have an owning
139 * component, a name from the configuration
140 * can be placed here. This name could also
141 * be changed to null for utility classes.
142 */
143 private String _name = ClientMain.NAME;
144
145 /**
146 * This holds a reference to the
147 * system logger that is being used.
148 */
149 private Logger _logger = ReferenceManager.getInstance().getLogger();
150
151 //---STATIC ATTRIBUTES---
152
153 //---INNER CLASSES---
154
155 /**
156 * This class provides some basic IRCBot functionality. It connects
157 * to a specified server, and will remain there until told to
158 * leave. Whilst connected it can send a message or a notice to
159 * the server.
160 */
161 class IRCBot extends Thread {
162
163 /**
164 * Main thread loop, this part of the class listens for
165 * messages from the server, and acts accordingly. At the
166 * present moment it only responds to pings.
167 */
168 public void run() {
169 // flag so we can stop the loop
170 boolean run = true;
171 while(run) {
172 try {
173 // read a command
174 String cmd = _socketIn.readLine();
175 // if it's a PING...
176 if(cmd.startsWith("PING")) {
177 // ...send a PONG
178 _socketOut.println("PONG" + cmd.substring(4));
179 }
180 } catch (IOException e) {
181 // comms failure, lets stop
182 _logger.write(this.toString(), Logger.ERROR, "Comms error: "+e);
183 //run = false;
184 }
185 }
186 }
187
188 /**
189 * Sends a message to the channel.
190 *
191 * @param msg The message to send
192 */
193 public void sendMsg(String msg) {
194 _socketOut.println("PRIVMSG "+_channel+" :"+msg);
195 }
196
197 /**
198 * Sends a notice to the channel.
199 *
200 * @param msg The notice to send
201 */
202 public void sendNotice(String msg) {
203 _socketOut.println("NOTICE "+_channel+" :"+msg);
204 }
205
206 /**
207 * Connect to the IRC server, log in, and join the channel.
208 *
209 * @throws IOException if the connection fails
210 */
211 public void connect() throws IOException {
212 // setup the socket, reader and writer
213 _socket = new Socket(_IRCServer, _IRCPort);
214 _socketIn = new BufferedReader(new InputStreamReader(_socket.getInputStream()));
215 _socketOut = new PrintWriter(_socket.getOutputStream(), true);
216 // send the various log in messages
217 _socketOut.println("PASS");
218 _socketOut.println("NICK "+_nick);
219 _socketOut.println("USER iscream 8 * :i-scream Bot");
220 // join the channel
221 _socketOut.println("JOIN "+_channel);
222 // start our listening thread
223 this.start();
224 }
225
226 /**
227 * Disconnect "nicely" from the IRC server.
228 *
229 * @throws IOException if the disconnection fails
230 */
231 public void disconnect() throws IOException {
232 // send proper QUIT
233 _socketOut.println("QUIT : iscreamBot component shutting down...");
234 // close the socket
235 _socketOut.close();
236 _socketIn.close();
237 _socket.close();
238 }
239
240 /**
241 * The socket connected to the server
242 */
243 private Socket _socket;
244
245 /**
246 * The writer
247 */
248 private PrintWriter _socketOut;
249
250 /**
251 * The reader
252 */
253 private BufferedReader _socketIn;
254
255 }
256
257 }