summaryrefslogtreecommitdiffstats
path: root/EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java')
-rw-r--r--EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java373
1 files changed, 373 insertions, 0 deletions
diff --git a/EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java b/EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java
new file mode 100644
index 000000000..d1d39c31d
--- /dev/null
+++ b/EssentialsUpdate/src/f00f/net/irc/martyr/clientstate/Channel.java
@@ -0,0 +1,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 );
+ }
+}
+
+
+