diff --git a/src/java/com/threerings/crowd/chat/ChatMessageHandler.java b/src/java/com/threerings/crowd/chat/ChatMessageHandler.java new file mode 100644 index 000000000..95d0a2c38 --- /dev/null +++ b/src/java/com/threerings/crowd/chat/ChatMessageHandler.java @@ -0,0 +1,44 @@ +// +// $Id: ChatMessageHandler.java,v 1.1 2001/08/03 02:14:41 mdb Exp $ + +package com.threerings.cocktail.party.chat; + +import com.threerings.cocktail.cher.dobj.MessageEvent; + +import com.threerings.cocktail.party.Log; +import com.threerings.cocktail.party.data.BodyObject; +import com.threerings.cocktail.party.data.PlaceObject; +import com.threerings.cocktail.party.server.PartyServer; +import com.threerings.cocktail.party.server.PlaceManager; + +/** + * The chat message handler handles chat messages that are issued on a + * place object with the intention of speaking to everyone in that place. + */ +public class ChatMessageHandler implements PlaceManager.MessageHandler +{ + public void handleEvent (MessageEvent event, PlaceObject target) + { + // presently we do no ratification of chat messages, so we just + // generate a chat notification with the message and name of the + // speaker + int soid = event.getSourceOid(); + BodyObject source = (BodyObject)PartyServer.omgr.getObject(soid); + if (source == null) { + Log.info("Chatter went away. Dropping chat request " + + "[req=" + event + "]."); + return; + } + + // parse our incoming arguments + Object[] inargs = event.getArgs(); + int reqid = ((Integer)inargs[0]).intValue(); + String message = (String)inargs[1]; + + // and generate a chat notification + Object[] outargs = new Object[] { source.username, message }; + MessageEvent nevt = new MessageEvent( + target.getOid(), ChatService.SPEAK_NOTIFICATION, outargs); + PartyServer.omgr.postEvent(nevt); + } +} diff --git a/src/java/com/threerings/crowd/chat/client/ChatDirector.java b/src/java/com/threerings/crowd/chat/client/ChatDirector.java index 18c891006..37b797e33 100644 --- a/src/java/com/threerings/crowd/chat/client/ChatDirector.java +++ b/src/java/com/threerings/crowd/chat/client/ChatDirector.java @@ -1,5 +1,5 @@ // -// $Id: ChatDirector.java,v 1.2 2001/08/02 23:47:21 mdb Exp $ +// $Id: ChatDirector.java,v 1.3 2001/08/03 02:14:41 mdb Exp $ package com.threerings.cocktail.party.chat; @@ -61,11 +61,23 @@ public class ChatManager * * @return an id which can be used to coordinate this speak request * with the response that will be delivered to all active chat - * displays when it arrives. + * displays when it arrives, or -1 if we were unable to make the + * request because we are not currently in a place. */ public int requestSpeak (String message) { - return -1; + // make sure we're currently in a place + if (_place == null) { + return -1; + } + + // dispatch a speak request on the active place object + int reqid = _ctx.getClient().getInvocationManager().nextInvocationId(); + Object[] args = new Object[] { new Integer(reqid), message }; + MessageEvent mevt = new MessageEvent( + _place.getOid(), ChatService.SPEAK_REQUEST, args); + _ctx.getDObjectManager().postEvent(mevt); + return reqid; } /** @@ -139,6 +151,12 @@ public class ChatManager { String speaker = (String)args[0]; String message = (String)args[1]; + + // pass this on to our chat displays + for (int i = 0; i < _displays.size(); i++) { + ChatDisplay display = (ChatDisplay)_displays.get(i); + display.displaySpeakMessage(speaker, message); + } } protected PartyContext _ctx; diff --git a/src/java/com/threerings/crowd/data/BodyObject.dobj b/src/java/com/threerings/crowd/data/BodyObject.dobj index 666b84081..f55b02706 100644 --- a/src/java/com/threerings/crowd/data/BodyObject.dobj +++ b/src/java/com/threerings/crowd/data/BodyObject.dobj @@ -1,5 +1,5 @@ // -// $Id: BodyObject.dobj,v 1.1 2001/07/20 20:07:37 mdb Exp $ +// $Id: BodyObject.dobj,v 1.2 2001/08/03 02:14:41 mdb Exp $ package com.threerings.cocktail.party.data; @@ -7,4 +7,16 @@ import com.threerings.cocktail.cher.data.ClientObject; public class BodyObject extends ClientObject { + /** The field name of the username field. */ + public static final String USERNAME = "username"; + + /** + * The username associated with this body object. + */ + public String username; + + public void setUsername (String username) + { + requestAttributeChange(USERNAME, username); + } } diff --git a/src/java/com/threerings/crowd/server/PlaceManager.java b/src/java/com/threerings/crowd/server/PlaceManager.java index 0a7fbb40c..97430c523 100644 --- a/src/java/com/threerings/crowd/server/PlaceManager.java +++ b/src/java/com/threerings/crowd/server/PlaceManager.java @@ -1,8 +1,9 @@ // -// $Id: PlaceManager.java,v 1.5 2001/08/01 20:37:35 mdb Exp $ +// $Id: PlaceManager.java,v 1.6 2001/08/03 02:14:41 mdb Exp $ package com.threerings.cocktail.party.server; +import java.util.HashMap; import java.util.Properties; import com.threerings.cocktail.cher.dobj.*; @@ -31,7 +32,7 @@ import com.threerings.cocktail.party.data.PlaceObject; * protected void didShutdown () * * - * as well as through additions to handlEvent. + * as well as through additions to handleEvent. */ public class PlaceManager implements Subscriber { @@ -75,6 +76,23 @@ public class PlaceManager implements Subscriber { } + /** + * Registers a particular message handler instance to be used when + * processing message events with the specified name. + * + * @param name the message name of the message events that should be + * handled by this handler. + * @param handler the handler to be registered. + */ + public void registerMessageHandler (String name, MessageHandler handler) + { + // create our handler map if necessary + if (_msghandlers == null) { + _msghandlers = new HashMap(); + } + _msghandlers.put(name, handler); + } + /** * Returns the place object managed by this place manager. */ @@ -99,9 +117,36 @@ public class PlaceManager implements Subscriber */ public boolean handleEvent (DEvent event, DObject target) { + // if this is a message event, see if we have a handler for it + if (event instanceof MessageEvent) { + MessageEvent mevt = (MessageEvent)event; + MessageHandler handler = (MessageHandler) + _msghandlers.get(mevt.getName()); + if (handler != null) { + handler.handleEvent(mevt, (PlaceObject)target); + } + } + return true; } + /** + * An interface used to allow the registration of standard message + * handlers to be invoked by the place manager when particular types + * of message events are received. + */ + protected static interface MessageHandler + { + /** + * Invokes this message handler on the supplied event. + * + * @param event the message event received. + * @param target the place object on which the message event was + * received. + */ + public void handleEvent (MessageEvent event, PlaceObject target); + } + /** A reference to the place object that we manage. */ protected PlaceObject _plobj; @@ -110,4 +155,7 @@ public class PlaceManager implements Subscriber /** The configuration provided for this place manager. */ protected Properties _config; + + /** Message handlers are used to process message events. */ + protected HashMap _msghandlers; }