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);
+ }
+
}
}