]> git.somenet.org - irc/pjirc-ng.git/blob - src/main/java/irc/ModeHandler.java
Pjirc 2.2.1 as available on the net, reformatted and made it compile.
[irc/pjirc-ng.git] / src / main / java / irc / ModeHandler.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.Vector;\r
33 \r
34 /**\r
35  * IRC mode handler.\r
36  */\r
37 public class ModeHandler {\r
38         private String _mode;\r
39         private Vector _parameters;\r
40         private char[][] _modes;\r
41         private char[] _prefix;\r
42 \r
43         /**\r
44          * Create a new ModeHandler with empty mode.\r
45          * \r
46          * @param modes\r
47          *          A,B,C,D known modes. This is an array of four arrays of chars.\r
48          * @param prefix\r
49          *          prefix modes.\r
50          */\r
51         public ModeHandler(char[][] modes, char[] prefix) {\r
52                 this("", modes, prefix);\r
53         }\r
54 \r
55         /**\r
56          * Create a new ModeHandler with given mode.\r
57          * \r
58          * @param mode\r
59          *          initial mode.\r
60          * @param modes\r
61          *          A,B,C,D know modes.\r
62          * @param prefix\r
63          *          prefix modes.\r
64          */\r
65         public ModeHandler(String mode, char[][] modes, char[] prefix) {\r
66                 _modes = modes;\r
67                 _prefix = prefix;\r
68                 _mode = "";\r
69                 _parameters = new Vector();\r
70                 if (mode.startsWith("+"))\r
71                         mode = mode.substring(1);\r
72                 apply("+" + mode);\r
73         }\r
74 \r
75         /**\r
76          * Reset current mode.\r
77          */\r
78         public void reset() {\r
79                 _mode = "";\r
80         }\r
81 \r
82         /**\r
83          * Get password (+k), if defined.\r
84          * \r
85          * @return password.\r
86          */\r
87         public String getPassword() {\r
88                 if (hasMode('k'))\r
89                         return findParameter('k');\r
90                 return "";\r
91         }\r
92 \r
93         /**\r
94          * Get user limit (+l), if defined.\r
95          * \r
96          * @return the user limit.\r
97          */\r
98         public int getLimit() {\r
99                 if (hasMode('l'))\r
100                         return new Integer(findParameter('l')).intValue();\r
101                 return 0;\r
102         }\r
103 \r
104         private boolean inside(char[] list, char c) {\r
105                 for (int i = 0; i < list.length; i++)\r
106                         if (list[i] == c)\r
107                                 return true;\r
108                 return false;\r
109         }\r
110 \r
111         private String findParameter(char k) {\r
112                 int index = getParameterIndex(k);\r
113                 if (index >= 0)\r
114                         return (String) _parameters.elementAt(index);\r
115                 return "";\r
116         }\r
117 \r
118         private boolean hasParameter(boolean positive, char c) {\r
119                 if (inside(_prefix, c))\r
120                         return false;\r
121                 else if (inside(_modes[0], c))\r
122                         return true;\r
123                 else if (inside(_modes[1], c))\r
124                         return true;\r
125                 else if (inside(_modes[2], c))\r
126                         return positive;\r
127                 else\r
128                         return false;\r
129         }\r
130 \r
131         private int getParameterIndex(char k) {\r
132                 if (_parameters.size() == 0)\r
133                         return -1;\r
134                 int index = 0;\r
135                 for (int i = 0; i < _mode.length(); i++) {\r
136                         char c = _mode.charAt(i);\r
137                         if (hasParameter(true, c)) {\r
138                                 if (c == k)\r
139                                         return index;\r
140                                 index++;\r
141                                 if (index >= _parameters.size())\r
142                                         return -1;\r
143                         } else {\r
144                                 if (c == k)\r
145                                         return -1;\r
146                         }\r
147                 }\r
148                 return -1;\r
149         }\r
150 \r
151         private void addMode(char mode, String param) {\r
152                 if (hasMode(mode))\r
153                         removeMode(mode, param);\r
154                 _mode += mode;\r
155                 if (hasParameter(true, mode))\r
156                         _parameters.insertElementAt(param, _parameters.size());\r
157         }\r
158 \r
159         private void removeMode(char mode, String param) {\r
160                 if (!hasMode(mode))\r
161                         return;\r
162                 if (hasParameter(true, mode))\r
163                         _parameters.removeElementAt(getParameterIndex(mode));\r
164                 int pos = _mode.indexOf(mode);\r
165                 _mode = _mode.substring(0, pos) + _mode.substring(pos + 1);\r
166         }\r
167 \r
168         private void applyOne(boolean positive, char mode, String param) {\r
169                 if (positive)\r
170                         addMode(mode, param);\r
171                 else\r
172                         removeMode(mode, param);\r
173         }\r
174 \r
175         /**\r
176          * Apply a new mode on the current mode.\r
177          * \r
178          * @param mode\r
179          *          new mode to apply.\r
180          */\r
181         public void apply(String mode) {\r
182                 String[] params = (new StringParser()).parseString(mode);\r
183                 boolean positive = true;\r
184                 int index = 0;\r
185 \r
186                 for (int i = 0; i < params[0].length(); i++) {\r
187                         char c = params[0].charAt(i);\r
188                         if (c == '+') {\r
189                                 positive = true;\r
190                         } else if (c == '-') {\r
191                                 positive = false;\r
192                         } else {\r
193                                 String param = "";\r
194                                 if (hasParameter(positive, c)) {\r
195                                         index++;\r
196                                         if (index >= params.length)\r
197                                                 return;\r
198                                         param = params[index];\r
199                                 }\r
200                                 applyOne(positive, c, param);\r
201                         }\r
202                 }\r
203         }\r
204 \r
205         /**\r
206          * Test wether the given mode is set.\r
207          * \r
208          * @param mode\r
209          *          mode to test.\r
210          * @return true if mode is set, false otherwise.\r
211          */\r
212         public boolean hasMode(char mode) {\r
213                 return _mode.indexOf(mode) != -1;\r
214         }\r
215 \r
216         /**\r
217          * Get a string representation of the current mode.\r
218          * \r
219          * @return string representation of current mode.\r
220          */\r
221         public String getMode() {\r
222                 String ans = _mode;\r
223                 for (int i = 0; i < _parameters.size(); i++)\r
224                         ans += " " + _parameters.elementAt(i);\r
225                 return ans;\r
226         }\r
227 }\r