Progress on chat support.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@155 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2001-08-02 23:46:47 +00:00
parent 5b390ea2ec
commit 234432858c
3 changed files with 220 additions and 1 deletions
@@ -0,0 +1,147 @@
//
// $Id: ChatDirector.java,v 1.1 2001/08/02 23:46:47 mdb Exp $
package com.threerings.cocktail.party.chat;
import java.util.ArrayList;
import com.threerings.cocktail.cher.dobj.*;
import com.threerings.cocktail.party.Log;
import com.threerings.cocktail.party.client.LocationObserver;
import com.threerings.cocktail.party.data.PlaceObject;
import com.threerings.cocktail.party.util.PartyContext;
/**
* The chat manager is the client side coordinator of all chat related
* services. It handles both place constrainted chat as well as direct
* messaging.
*/
public class ChatManager
implements LocationObserver, Subscriber
{
/**
* Creates a chat manager and initializes it with the supplied
* context. The chat manager will register itself as a location
* observer so that it can automatically process place constrained
* chat.
*/
public ChatManager (PartyContext ctx)
{
// keep the context around
_ctx = ctx;
// register ourselves as a location observer
_ctx.getLocationManager().addLocationObserver(this);
}
/**
* Adds the supplied chat display to the chat display list. It will
* subsequently be notified of incoming chat messages as well as tell
* responses.
*/
public void addChatDisplay (ChatDisplay display)
{
_displays.add(display);
}
/**
* Removes the specified chat display from the chat display list. The
* display will no longer receive chat related notifications.
*/
public void removeChatDisplay (ChatDisplay display)
{
_displays.remove(display);
}
/**
* Requests that a speak message be generated and delivered to all
* users that occupy the place object that we currently occupy.
*
* @param message the contents of the speak message.
*
* @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.
*/
public int requestSpeak (String message)
{
}
/**
* Requests that a tell message be delivered to the specified target
* user.
*
* @param target the username of the user to which the tell message
* should be delivered.
* @param message the contents of the tell message.
*
* @return an id which can be used to coordinate this request with the
* tell response that will be delivered to all active chat displays
* when it arrives.
*/
public int requestTell (String target, String message)
{
return -1;
}
public boolean locationMayChange (int placeId)
{
// we accept all location change requests
return true;
}
public void locationDidChange (PlaceObject place)
{
if (_place != null) {
// unsubscribe from our old object
_place.removeSubscriber(this);
}
// subscribe to the new object
_place = place;
_place.addSubscriber(this);
}
public void locationChangeFailed (int placeId, String reason)
{
// nothing we care about
}
public void objectAvailable (DObject object)
{
// nothing to do here
}
public void requestFailed (int oid, ObjectAccessException cause)
{
// nothing to do here
}
public boolean handleEvent (DEvent event, DObject target)
{
// we only care about message events
if (!(event instanceof MessageEvent)) {
return true;
}
// and only those of proper name
MessageEvent mevt = (MessageEvent)event;
String name = mevt.getName();
if (name.equals(ChatService.SPEAK_NOTIFICATION)) {
handleSpeakMessage(mevt.getArgs());
}
return true;
}
protected void handleSpeakMessage (Object[] args)
{
String speaker = (String)args[0];
String message = (String)args[1];
}
protected PartyContext _ctx;
protected PlaceObject _place;
protected ArrayList _displays = new ArrayList();
}
@@ -0,0 +1,56 @@
//
// $Id: ChatDisplay.java,v 1.1 2001/08/02 23:46:47 mdb Exp $
package com.threerings.cocktail.party.chat;
/**
* A chat display provides a means by which chat messages can be
* displayed. The chat display will be notified when chat messages of
* various sorts have been received by the client.
*/
public interface ChatDisplay
{
/**
* Called to display a speak message. A speak message is one that is
* broadcast to all occupants of a particular place. A speak message
* originated by this client will result in a subsequent call to this
* method after the speak message is accepted by the server and
* broadcast to everyone in the place.
*
* @param speaker the username of the speaker.
* @param message the text of the message.
*/
public void displaySpeakMessage (String speaker, String message);
/**
* Called to display a tell message. A tell message is one that is
* delivered directly from one user to another regardless of their
* location in the system.
*
* @param speaker the username of the speaker.
* @param message the text of the message.
*/
public void displayTellMessage (String speaker, String message);
/**
* Called in response to a chat request (either speak or tell) that
* originated on this client. The request id supplied will match the
* one returned when the request was generated and the status will
* either indicate success (by being equal to
* <code>Codes.SUCCESS</code>) or failure (in which case it will
* contain a message failure code which can be converted into a
* displayable string).
*
* <p> A chat display should track outstanding chat requests so that
* it can properly handle the response when it arrives.
*
* @param reqid the request id of the request that resulted in this
* response.
* @param status the message code indicating whether the chat request
* was successful or not.
*
* @see ChatManager#requestSpeak
* @see ChatManager#requestTell
*/
public void handleResponse (int reqid, String status);
}
@@ -1,8 +1,24 @@
//
// $Id: ChatService.java,v 1.1 2001/07/20 20:07:37 mdb Exp $
// $Id: ChatService.java,v 1.2 2001/08/02 23:46:47 mdb Exp $
package com.threerings.cocktail.party.chat;
/**
* The chat services provide a mechanism by which the client can broadcast
* chat messages to all clients that are subscribed to a particular place
* object or directly to a particular client. These services should not be
* used directly, but instead should be accessed via the chat manager.
*
* @see ChatManager
*/
public class ChatService
{
/** The module name for the chat services. */
public static final String MODULE = "chat";
/** The message identifier for a speak request message. */
public static final String SPEAK_REQUEST = "spkreq";
/** The message identifier for a speak notification message. */
public static final String SPEAK_NOTIFICATION = "spknot";
}