Author: bdonlan
Date: 2005-05-23 20:05:37 -0400 (Mon, 23 May 2005)
New Revision: 718

Added:
   trunk/clients/Javer2/src/org/haverdev/haver/server/ChatChannel.java
Modified:
   trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
   trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
Log:
Channels and stuff

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java     
2005-05-23 23:45:35 UTC (rev 717)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Channel.java     
2005-05-24 00:05:37 UTC (rev 718)
@@ -18,9 +18,10 @@
     public void unregister(Entity e);
     
     public Entity[] getContents();
+    public Entity[] filterContents(String namespace);
     public String[] getNames(String namespace);
     
-    public java.util.Set quitListeners();
+    public User[] quitListeners();
     public void distributePublicMessage(Entity from, String[] args);
     public void distributeJoin(Entity who);
     public void distributePart(Entity who);

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java 
2005-05-23 23:45:35 UTC (rev 717)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/ChannelBase.java 
2005-05-24 00:05:37 UTC (rev 718)
@@ -45,6 +45,17 @@
         return ents;
     }
 
+    public synchronized Entity[] filterContents(String namespace) {
+        HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
+        if (subset == null)
+            return new Entity[0];
+        Object[] objs = subset.values().toArray();
+        Entity[] ents = new Entity[objs.length];
+        for (int i = 0; i < objs.length; i++)
+            ents[i] = (Entity)objs[i];
+        return ents;
+    }
+
     public synchronized boolean contains(String namespace, String name) {
         HashMap subset = (HashMap)namespaces.get(namespace.toLowerCase());
         if (subset == null)

Added: trunk/clients/Javer2/src/org/haverdev/haver/server/ChatChannel.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/ChatChannel.java 
2005-05-23 23:45:35 UTC (rev 717)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/ChatChannel.java 
2005-05-24 00:05:37 UTC (rev 718)
@@ -0,0 +1,54 @@
+/*
+ * ChatChannel.java
+ *
+ * Created on May 23, 2005, 7:49 PM
+ */
+
+package org.haverdev.haver.server;
+
+/**
+ *
+ * @author bdonlan
+ */
+public class ChatChannel extends ChannelBase {
+    String name;
+    
+    /** Creates a new instance of ChatChannel */
+    public ChatChannel(String name) {
+        this.name = name.intern();
+    }
+
+    public void distributePart(Entity who) {
+        User[] notify = quitListeners();
+        for (int i = 0; i < notify.length; i++) {
+            notify[i].notifyPart(name, who);
+        }
+    }
+
+    public void distributeJoin(Entity who) {
+        User[] notify = quitListeners();
+        for (int i = 0; i < notify.length; i++) {
+            notify[i].notifyJoin(name, who);
+        }
+    }
+
+    public void distributePublicMessage(Entity from, String[] args) {
+        User[] who = quitListeners();
+        for (int i = 0; i < who.length; i++) {
+            who[i].notifyPublicMessage(name, from.getName(), args);
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public User[] quitListeners() {
+        Entity[] ents = filterContents("user");
+        User[] users = new User[ents.length];
+        for (int i = 0; i < ents.length; i++)
+            users[i] = (User)ents[i];
+        return users;
+    }
+    
+}


Property changes on: 
trunk/clients/Javer2/src/org/haverdev/haver/server/ChatChannel.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java       
2005-05-23 23:45:35 UTC (rev 717)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/Lobby.java       
2005-05-24 00:05:37 UTC (rev 718)
@@ -17,6 +17,7 @@
     /** There can be only one */
     private Lobby() {
         register(this);
+        register(new ChatChannel("test"));
     }
     
     public void distributePart(Entity who) {
@@ -29,8 +30,8 @@
         throw new UnsupportedOperationException("&lobby does not support 
messaging.");
     }
 
-    public Set quitListeners() {
-        return new HashSet();
+    public User[] quitListeners() {
+        return new User[0];
     }
 
     public String getName() {

Modified: trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java
===================================================================
--- trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java      
2005-05-23 23:45:35 UTC (rev 717)
+++ trunk/clients/Javer2/src/org/haverdev/haver/server/UserConnection.java      
2005-05-24 00:05:37 UTC (rev 718)
@@ -161,7 +161,7 @@
         try { sock.close(); } catch (Throwable t) { }
         writer = null;
         if (this.e != null)
-            this.e.kill();
+            this.e.quit("disconnected", e.getMessage());
     }
     
     public synchronized void sendLine(String[] args) {
@@ -181,7 +181,7 @@
         String name;
         HashSet channels = new HashSet();
         
-        UserEntity(String name) {
+        UserEntity(String name) throws PropagatedException {
             this.name = name.intern();
             join(Lobby.theLobby);
         }
@@ -222,6 +222,8 @@
         }
 
         public void notifyQuit(String who, String type, String detail) {
+            String[] msg = { "QUIT", who, type, detail };
+            sendLine(msg);
         }
 
         public boolean equals(Object obj) {
@@ -240,26 +242,36 @@
             return name.hashCode() ^ "user".hashCode();
         }
         
-        public void kill() {
+        public void quit(String why, String detail) {
             Iterator i = channels.iterator();
             // XXX
+            HashSet interested_parties = new HashSet();
             while (i.hasNext()) {
                 Channel c = (Channel)i.next();
                 c.unregister(this);
+                // XXX: use set
+                User[] quit_notice = c.quitListeners();
+                for (int j = 0; j < quit_notice.length; j++)
+                    interested_parties.add(quit_notice[j]);
             }
+            i = interested_parties.iterator();
+            while (i.hasNext()) {
+                User u = (User)i.next();
+                u.notifyQuit(name, why, detail);
+            }
         }
         
-        public synchronized void join(Channel channel) {
-            if (channels.contains(channel)) return;
+        public synchronized void join(Channel channel) throws 
PropagatedException {
+            if (channels.contains(channel)) throw new 
AlreadyThereJoin(channel.getName());
             channel.register(this);
             channel.distributeJoin(this);
             channels.add(channel);
         }
         
-        public synchronized void part(Channel channel) {
-            if (!channels.contains(channel)) return;
+        public synchronized void part(Channel channel) throws 
PropagatedException {
+            if (!channels.contains(channel)) throw new 
NotPresentPart(channel.getName());
+            channel.distributePart(this);
             channel.unregister(this);
-            channel.distributePart(this);
             channels.remove(channel);
         }
     }
@@ -364,7 +376,15 @@
             if (chan_e == Lobby.theLobby)
                 throw new SimplePropagatedException("PART", "forbidden", 
channel);
             e.part(chan_e);
-        }        
+        }
         
+        public void handle_IN(String[] args) throws PropagatedException {
+            String channel = args[1]; // TODO: check presence
+            Channel chan_e = (Channel)Lobby.theLobby.lookup("channel", 
channel);
+            String[] margs = new String[args.length - 2];
+            System.arraycopy(args, 2, margs, 0, margs.length);
+            chan_e.distributePublicMessage(e, margs);
+        }
+        
     }
 }


Reply via email to