]> git.somenet.org - irc/pjirc-ng.git/blob - src/main/java/irc/Channel.java
Pjirc 2.2.1 as available on the net, reformatted and made it compile.
[irc/pjirc-ng.git] / src / main / java / irc / Channel.java
1 /*****************************************************/\r
2 /*          This java file is a part of the          */\r
3 /*                                                   */\r
4 /*           -  Plouf's Java IRC Client  -           */\r
5 /*                                                   */\r
6 /*   Copyright (C)  2002 - 2004 Philippe Detournay   */\r
7 /*                                                   */\r
8 /*         All contacts : theplouf@yahoo.com         */\r
9 /*                                                   */\r
10 /*  PJIRC is free software; you can redistribute     */\r
11 /*  it and/or modify it under the terms of the GNU   */\r
12 /*  General Public License as published by the       */\r
13 /*  Free Software Foundation; version 2 or later of  */\r
14 /*  the License.                                     */\r
15 /*                                                   */\r
16 /*  PJIRC is distributed in the hope that it will    */\r
17 /*  be useful, but WITHOUT ANY WARRANTY; without     */\r
18 /*  even the implied warranty of MERCHANTABILITY or  */\r
19 /*  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   */\r
20 /*  General Public License for more details.         */\r
21 /*                                                   */\r
22 /*  You should have received a copy of the GNU       */\r
23 /*  General Public License along with PJIRC; if      */\r
24 /*  not, write to the Free Software Foundation,      */\r
25 /*  Inc., 59 Temple Place, Suite 330, Boston,        */\r
26 /*  MA  02111-1307  USA                              */\r
27 /*                                                   */\r
28 /*****************************************************/\r
29 \r
30 package irc;\r
31 \r
32 import java.util.Enumeration;\r
33 import java.util.Hashtable;\r
34 \r
35 /**\r
36  * Nickname.\r
37  */\r
38 class Nick {\r
39         /**\r
40          * Create a new Nick\r
41          * \r
42          * @param n\r
43          *          nickname.\r
44          * @param m\r
45          *          mode.\r
46          * @param modes\r
47          *          all modes.\r
48          * @param prefix\r
49          *          all prefixes.\r
50          */\r
51         public Nick(String n, String m, char[][] modes, char[] prefix) {\r
52                 Name = n;\r
53                 Mode = new ModeHandler(m, modes, prefix);\r
54                 Whois = "";\r
55         }\r
56 \r
57         /**\r
58          * Nickname.\r
59          */\r
60         public String Name;\r
61         /**\r
62          * Whois information.\r
63          */\r
64         public String Whois;\r
65         /**\r
66          * Nickname mode.\r
67          */\r
68         public ModeHandler Mode;\r
69 }\r
70 \r
71 /**\r
72  * A channel source.\r
73  */\r
74 public class Channel extends IRCSource implements ReplyServerListener {\r
75         private String _name;\r
76         private String _topic;\r
77         private ModeHandler _mode;\r
78         private ListenerGroup _listeners;\r
79         private Hashtable _nicks;\r
80 \r
81         /**\r
82          * Create a new Channel.\r
83          * \r
84          * @param config\r
85          *          the global configuration.\r
86          * @param name\r
87          *          channel name.\r
88          * @param s\r
89          *          the source server.\r
90          */\r
91         public Channel(IRCConfiguration config, String name, IRCServer s) {\r
92                 super(config, s);\r
93                 _name = name;\r
94                 _topic = "";\r
95                 _mode = new ModeHandler(s.getChannelModes(), s.getNickModes());\r
96                 _listeners = new ListenerGroup();\r
97                 _nicks = new Hashtable();\r
98                 s.addReplyServerListener(this);\r
99                 if (_ircConfiguration.getASLMaster())\r
100                         getIRCServer().execute("WHO " + _name);\r
101                 setInterpretor(new ChannelInterpretor(config));\r
102         }\r
103 \r
104         @Override\r
105         public void release() {\r
106                 ((IRCServer) _server).removeReplyServerListener(this);\r
107                 super.release();\r
108         }\r
109 \r
110         /**\r
111          * Add a channel listener.\r
112          * \r
113          * @param lis\r
114          *          listener to add.\r
115          * @deprecated use addChannelListener2 instead.\r
116          */\r
117         @Deprecated\r
118         public void addChannelListener(ChannelListener lis) {\r
119                 _listeners.addListener(lis);\r
120         }\r
121 \r
122         /**\r
123          * Remove a channel listener.\r
124          * \r
125          * @param lis\r
126          *          listener to remove.\r
127          * @deprecated use removeChannelListener2 instead.\r
128          */\r
129         @Deprecated\r
130         public void removeChannelListener(ChannelListener lis) {\r
131                 _listeners.removeListener(lis);\r
132         }\r
133 \r
134         /**\r
135          * Add a channel listener.\r
136          * \r
137          * @param lis\r
138          *          listener to add.\r
139          */\r
140         public void addChannelListener2(ChannelListener2 lis) {\r
141                 _listeners.addListener(lis);\r
142         }\r
143 \r
144         /**\r
145          * Remove a channel listener.\r
146          * \r
147          * @param lis\r
148          *          listener to remove.\r
149          */\r
150         public void removeChannelListener2(ChannelListener2 lis) {\r
151                 _listeners.removeListener(lis);\r
152         }\r
153 \r
154         @Override\r
155         public String getType() {\r
156                 return "Channel";\r
157         }\r
158 \r
159         @Override\r
160         public String getName() {\r
161                 return _name;\r
162         }\r
163 \r
164         @Override\r
165         public boolean talkable() {\r
166                 return true;\r
167         }\r
168 \r
169         @Override\r
170         public void leave() {\r
171                 getIRCServer().leaveChannel(getName());\r
172         }\r
173 \r
174         /**\r
175          * Test wether this channel has the given nickname.\r
176          * \r
177          * @param nick\r
178          *          nickname to test.\r
179          * @return true if nick is present on this channel, false otherwise.\r
180          */\r
181         public boolean hasNick(String nick) {\r
182                 return _nicks.get(nick.toLowerCase(java.util.Locale.ENGLISH)) != null;\r
183         }\r
184 \r
185         /**\r
186          * Notify this channel the given nick has joined, with the given options.\r
187          * \r
188          * @param nick\r
189          *          new nick.\r
190          * @param mode\r
191          *          nick mode.\r
192          */\r
193         public void joinNick(String nick, String mode) {\r
194                 _nicks.put(nick.toLowerCase(java.util.Locale.ENGLISH), new Nick(nick, mode, getIRCServer().getChannelModes(),\r
195                                 getIRCServer().getNickModes()));\r
196                 if (_ircConfiguration.getASLMaster())\r
197                         getIRCServer().execute("WHO " + nick);\r
198                 _listeners.sendEvent("nickJoin", nick, mode, this);\r
199         }\r
200 \r
201         /**\r
202          * Notify this channel it should reset its nick list.\r
203          */\r
204         public void resetNicks() {\r
205                 _nicks.clear();\r
206                 _listeners.sendEvent("nickReset", this);\r
207         }\r
208 \r
209         /**\r
210          * Notify this channel it should change its hole nick list.\r
211          * \r
212          * @param nicks\r
213          *          new nicks.\r
214          * @param modes\r
215          *          new modes. There is a one to one mapping between nicks and modes.\r
216          */\r
217         public void setNicks(String[] nicks, String[] modes) {\r
218                 for (int i = 0; i < nicks.length; i++)\r
219                         _nicks.put(nicks[i].toLowerCase(java.util.Locale.ENGLISH), new Nick(nicks[i], modes[i], getIRCServer()\r
220                                         .getChannelModes(), getIRCServer().getNickModes()));\r
221                 _listeners.sendEvent("nickSet", nicks, modes, this);\r
222         }\r
223 \r
224         /**\r
225          * Notify this channel the given nick has left the channel.\r
226          * \r
227          * @param nick\r
228          *          the nick.\r
229          * @param reason\r
230          *          the reason.\r
231          */\r
232         public void partNick(String nick, String reason) {\r
233                 _nicks.remove(nick.toLowerCase(java.util.Locale.ENGLISH));\r
234                 _listeners.sendEvent("nickPart", nick, reason, this);\r
235         }\r
236 \r
237         /**\r
238          * Notify this channel the given nick has been kicked.\r
239          * \r
240          * @param nick\r
241          *          the kicked nick.\r
242          * @param by\r
243          *          the nick who kicked nick.\r
244          * @param reason\r
245          *          the kick reason.\r
246          */\r
247         public void kickNick(String nick, String by, String reason) {\r
248                 _nicks.remove(nick.toLowerCase(java.util.Locale.ENGLISH));\r
249                 _listeners.sendEvent("nickKick", new Object[] { nick, by, reason, this });\r
250         }\r
251 \r
252         /**\r
253          * Notify this channel the given nick has quit.\r
254          * \r
255          * @param nick\r
256          *          the nick who quit.\r
257          * @param reason\r
258          *          reason.\r
259          */\r
260         public void quitNick(String nick, String reason) {\r
261                 _nicks.remove(nick.toLowerCase(java.util.Locale.ENGLISH));\r
262                 _listeners.sendEvent("nickQuit", nick, reason, this);\r
263         }\r
264 \r
265         /**\r
266          * Get all the nicks in this channel.\r
267          * \r
268          * @return array of all nick names.\r
269          */\r
270         public String[] getNicks() {\r
271                 String[] ans = new String[_nicks.size()];\r
272                 Enumeration e = _nicks.elements();\r
273                 int i = 0;\r
274                 while (e.hasMoreElements())\r
275                         ans[i++] = ((Nick) e.nextElement()).Name;\r
276                 return ans;\r
277         }\r
278 \r
279         /**\r
280          * Get the nick mode associated with the given nick.\r
281          * \r
282          * @param nick\r
283          *          nickname to get mode.\r
284          * @return nick mode or null if nick not found.\r
285          */\r
286         public String getNickMode(String nick) {\r
287                 Nick n = (Nick) _nicks.get(nick.toLowerCase(java.util.Locale.ENGLISH));\r
288                 if (n == null)\r
289                         return null;\r
290                 return n.Mode.getMode();\r
291         }\r
292 \r
293         /**\r
294          * Notify this channel its topic has changed.\r
295          * \r
296          * @param topic\r
297          *          new topic.\r
298          * @param by\r
299          *          nickname who changed topic.\r
300          */\r
301         public void setTopic(String topic, String by) {\r
302                 _topic = topic;\r
303                 _listeners.sendEvent("topicChanged", topic, by, this);\r
304         }\r
305 \r
306         /**\r
307          * Notify this channel a nick mode has changed.\r
308          * \r
309          * @param nick\r
310          *          the nick.\r
311          * @param mode\r
312          *          the applied mode.\r
313          * @param from\r
314          *          the nick who changed mode.\r
315          */\r
316         public void applyUserMode(String nick, String mode, String from) {\r
317                 Nick n = (Nick) _nicks.get(nick.toLowerCase(java.util.Locale.ENGLISH));\r
318                 if (n != null)\r
319                         n.Mode.apply(mode);\r
320                 _listeners.sendEvent("nickModeApply", new Object[] { nick, mode, from, this });\r
321         }\r
322 \r
323         /**\r
324          * Notify this channel its mode has changed.\r
325          * \r
326          * @param mode\r
327          *          applied mode.\r
328          * @param from\r
329          *          user who changed mode.\r
330          */\r
331         public void applyMode(String mode, String from) {\r
332                 _mode.apply(mode);\r
333                 _listeners.sendEvent("modeApply", mode, from, this);\r
334         }\r
335 \r
336         /**\r
337          * Get this channel mode.\r
338          * \r
339          * @return channel mode.\r
340          */\r
341         public String getMode() {\r
342                 return _mode.getMode();\r
343         }\r
344 \r
345         /**\r
346          * Get this channel topic.\r
347          * \r
348          * @return channel topic.\r
349          */\r
350         public String getTopic() {\r
351                 return _topic;\r
352         }\r
353 \r
354         /**\r
355          * Notify this channel a nick has been renamed.\r
356          * \r
357          * @param oldNick\r
358          *          old nickname.\r
359          * @param newNick\r
360          *          new nickname.\r
361          */\r
362         public void changeNick(String oldNick, String newNick) {\r
363                 Nick n = (Nick) _nicks.get(oldNick.toLowerCase(java.util.Locale.ENGLISH));\r
364                 _nicks.remove(oldNick.toLowerCase(java.util.Locale.ENGLISH));\r
365                 n.Name = newNick;\r
366                 _nicks.put(newNick.toLowerCase(java.util.Locale.ENGLISH), n);\r
367 \r
368                 _listeners.sendEvent("nickChanged", oldNick, newNick, this);\r
369         }\r
370 \r
371         private void learn(String nick, String whois) {\r
372                 Nick n = (Nick) _nicks.get(nick.toLowerCase(java.util.Locale.ENGLISH));\r
373                 if (n == null)\r
374                         return;\r
375                 n.Whois = whois;\r
376                 _listeners.sendEvent("nickWhoisUpdated", nick, whois, this);\r
377         }\r
378 \r
379         /**\r
380          * Get bufferised whois data for the given nick.\r
381          * \r
382          * @param nick\r
383          *          nickname.\r
384          * @return whois data for nick, or "" if not found.\r
385          */\r
386         public String whois(String nick) {\r
387                 Nick n = (Nick) _nicks.get(nick.toLowerCase(java.util.Locale.ENGLISH));\r
388                 if (n == null)\r
389                         return "";\r
390                 return n.Whois;\r
391         }\r
392 \r
393         @Override\r
394         public Boolean replyReceived(String prefix, String id, String params[], IRCServer server) {\r
395                 if (id.equals("352")) {\r
396                         String name = params[params.length - 1];\r
397                         int pos = name.indexOf(" ");\r
398                         if (pos != -1)\r
399                                 name = name.substring(pos + 1);\r
400                         String nick = params[5];\r
401                         learn(nick, name);\r
402                 }\r
403                 return Boolean.FALSE;\r
404         }\r
405 }\r