summaryrefslogtreecommitdiffstats
path: root/EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java
blob: d1d39c31dae9a35b5c451a97e9d6deefe3b3cc0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
package f00f.net.irc.martyr.clientstate;

import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

import f00f.net.irc.martyr.Command;
import f00f.net.irc.martyr.InCommand;
import f00f.net.irc.martyr.Mode;
import f00f.net.irc.martyr.modes.channel.OperMode;
import f00f.net.irc.martyr.modes.channel.VoiceMode;
import f00f.net.irc.martyr.util.FullNick;
//import org.apache.log4j.Logger;

/**
 * Channel is simply a repository for information about a channel.
 * Contains channel name, topic, who created the topic, when the topic
 * was created, who is in the channel, mode, etc.
 *
 * <p>If a user of the framework wishes to use their own Member object
 * (to trap events like setting/removing ops), then subclass
 * Channel and add a method as follows.</p>
 *
 * <pre>
 * public Member makeMember( String member )
 * {
 *     return MyMemberSubClass( member ) );
 * }
 * </pre>
 *
 * <p>Each of the methods in Channel that need to create a Member
 * object (many are just temporary members, for the enhanced 'equals')
 * calls makeMember instead of new Member(...).  That is why this
 * version of addMember is protected, so that a part of the framework
 * won't do something silly like:</p>
 *
 * <pre>
 *      ...
 *      channel.addMember( new Member( member ) );
 *      ...
 * </pre>
 */
public class Channel
{

    //static Logger log = Logger.getLogger(Channel.class);

    private String name = null;
	private String topic = null;
	private String topicAuthor = null;
	private Date topicDate = null;
	private Date creationDate = null;

	private List<Mode> modes = null;
	
	/** 
	 * Hopefully we can replace this with a more useful data structure.
	 * This is a vector of Member objects.
	 */
	private Vector<Member> members;
	
	public Channel( String chanName )
	{
		this.name = chanName;
		members = new Vector<Member>();
		modes = new LinkedList<Mode>();
	}
	
	public String getName()
	{
		return name;
	}
	
	protected void addMember( Member member )
	{
		members.addElement( member );
	}
		
	/**
	 * Adds the member to the channel.
	 *
     * @param member Member to add to the channel
     * @param why Command that caused the member to be added
	 * @deprecated Use <code>addMember( String, InCommand )</code>
	 * instead.
	 */
	public void addMember( String member, Command why )
	{
		addMember( makeMember( member ) );
	}

	/**
	 * Adds the member to the channel.
     *
     * @param member Nick to add to the channel
     * @param why Command that caused the member to be added
	 */
	public void addMember( String member, InCommand why )
	{
		addMember( makeMember( member ) );
	}

	
	/**
     * @param nick Nick to add to the channel
     * @param why Command that caused the member to be added
	 * @deprecated Use <code>addMember( FullNick, InCommand )</code> intead.
	 */
	public void addMember( FullNick nick, Command why )
	{
		addMember( makeMember( nick.getNick() ));
	}
	
	/**
     * @param nick Nick to add to the channel
     * @param why Command that caused the member to be added
	 * Adds the member to the channel. Just calls nick.getNick().
	 */
	public void addMember( FullNick nick, InCommand why )
	{
		addMember( nick.getNick(), why );
	}
	
	/**
	 * Removes the user from the channel. Ignores leading @ or + symbols.
	 * This is the cononical version of removeMember.
	 * @param member Nick of the person leaving.
	 * @param why Command issed that caused this action.
	 */
	public void removeMember( String member, InCommand why )
	{
		removeMember( makeMember( member ) );
	}
	
	/**
     * @param member Nick to remove from channel
     * @param why Command that caused removal
	 * @deprecated Use <code>removeMember( String, InCommand ) instead.</code>
	 * */
	public void removeMember( String member, Command why )
	{
		removeMember( makeMember( member ) );
	}

	/**
     * @param member Member to remove from channel
     * @param why Command that caused removal
	 * @deprecated Use <code>removeMember( FullNick, InCommand ) instead.</code>
	 * */
	public void removeMember( FullNick member, Command why )
	{
		removeMember( member, (InCommand)why );
	}

	/**
	 * Simply a wrapper to allow FullNicks to be used.  Calls the string
	 * version of removeMember with nick.getNick().
     *
     * @param nick Nick to remove from channel
     * @param why Command that caused removal
	 */
	public void removeMember( FullNick nick, InCommand why )
	{
		removeMember( nick.getNick(), why );
	}
	
	protected void removeMember( Member compareTo )
	{
		for( int i = 0; i < members.size(); ++i )
		{
			if( (members.elementAt( i )).equals( compareTo ) )
			{
				members.removeElementAt( i );
				return;
			}
		}
	}
	
	/**
	 * Informs the channel of a mode change. A mode change might be for the
	 * channel (such as l, n, or t) or for a user on this channel (such as
	 * o).
     *
     * @param mode Mode to set on the channel
	 */
	public void setMode( Mode mode )
	{
		// Note that Modes are supposed to be equal if the character is
		// equal.  Thus, we can remove a mode from the set, even though it
		// is different because its sign or parameters may be different.
		if( mode.onePerChannel() && modes.contains( mode ) )
		{
			modes.remove( mode );
		}
		
		if( (mode.getSign() != Mode.Sign.NEGATIVE) && mode.recordInChannel() )
		{
			modes.add( mode );
		}
		
		if( mode instanceof OperMode )
		{
			OperMode oMode = (OperMode)mode;
			Member member = findMember( oMode.getParam() );

			member.setOps( oMode.getSign() == Mode.Sign.POSITIVE );
		}
		else if( mode instanceof VoiceMode )
		{
			VoiceMode vMode = (VoiceMode)mode;
			Member member = findMember( vMode.getParam() );
			
			member.setVoice( vMode.getSign() == Mode.Sign.POSITIVE );
		}
	}
	
	public Iterator getModes()
	{
		return modes.iterator();
	}
	
	/**
	 * Returns an enumeration of Member objects, in no particular order.
     *
     * @return List of members in the channel
	 */
	public Enumeration getMembers()
	{
		return members.elements();
	}
	
	/**
	 * Determines if the nick is in the channel.  Nick can be in the form
	 * "@sork" or "+sork" or just "sork", for example.
     *
     * @param nick Nick of member to check
     * @return True or false if the member is in this channel.
	 */
	public boolean isMemberInChannel( String nick )
	{
		return isMemberInChannel( makeMember( nick ) );
	}
	
	/**
	 * Determines if the member is in this channel.
     *
     * @param member Member to check
     * @return True or false if the member is in this channel.
	 */
	protected boolean isMemberInChannel( Member member )
	{	
		return findMember( member ) != null;
	}
	
	/**
	 * Finds the Member object associated with a specific nick.  Ignores
	 * prefixed + or @.
     *
     * @param nick Nick to check whether it's a member of the channel or not
     * @return Member object for specified nick, if it exists (null if not)
	 */
	public Member findMember( String nick )
	{
		return findMember( makeMember( nick ) );
	}
	
	protected Member findMember( Member member )
	{
		Enumeration membersE = getMembers();
		while( membersE.hasMoreElements() )
		{
			Member memberCompare = (Member)membersE.nextElement();
	
			if( memberCompare.equals( member ) )
			{
				return memberCompare;
			}
		}
		
		return null;
	}
	
	public void setTopic( String topic )
	{
		//log.debug(getName()+": Topic: " + topic);
		this.topic = topic;
	}
	
	public String getTopic()
	{
		return topic;
	}
	
	public Date getTopicDate()
	{
		return topicDate;
	}
	
	public void setTopicDate( Date date )
	{
		//log.debug(getName()+": Topic date: " + date);
		this.topicDate = date;
	}
	
	public Date getCreationDate()
	{
		return creationDate;
	}

	public void setCreationDate( Date date )
	{
		//log.debug(getName()+": Creation date: " + date);
		this.creationDate = date;
	}
	
	public String getTopicAuthor()
	{
		return topicAuthor;
	}
	
	public void setTopicAuthor( String author )
	{
		//log.debug(getName()+": Topic by: " + author);
		this.topicAuthor = author;
	}
	
	/**
	 * To use a customized Member class, override this.
     *
     * @param nick Nickname to create a member object for
     * @return Member object for nick
	 */
	protected Member makeMember( String nick )
	{
		return new Member( nick );
	}
	
	
	/**
	 * Determines if the string represents a channel name or not.
     *
     * @param str String to test if it's a channel or not
     * @return True or false if a string looks like a channel
	 */
	public static boolean isChannel( String str )
	{
		return str.charAt(0) == '#' || str.charAt(0) == '!' || str.charAt(0) == '&';
	}

	/**
	 * Compares the two channel names for equality.  Returns false if
	 * either are null.
     *
     * @param one Left side of comparison
     * @param two Right side of comparison
     * @return True or false whether two channels are equal, false of either are null/
	 */
	public static boolean areEqual( String one, String two )
	{
		if( one == null || two == null )
		{
			return false;
		}
		
		return one.equalsIgnoreCase( two );
	}
}