Cache tell request information in the chat director and pass it along to

the various chat displays once we've ascertained success or failure.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1586 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Walter Korman
2002-07-17 20:53:31 +00:00
parent 34bbab5ee7
commit f53975fe74
3 changed files with 85 additions and 28 deletions
@@ -1,10 +1,12 @@
// //
// $Id: ChatDirector.java,v 1.24 2002/06/28 04:09:39 ray Exp $ // $Id: ChatDirector.java,v 1.25 2002/07/17 20:53:31 shaper Exp $
package com.threerings.crowd.chat; package com.threerings.crowd.chat;
import java.util.ArrayList; import java.util.ArrayList;
import com.samskivert.util.HashIntMap; import com.samskivert.util.HashIntMap;
import com.samskivert.util.Tuple;
import com.threerings.presents.client.*; import com.threerings.presents.client.*;
import com.threerings.presents.dobj.*; import com.threerings.presents.dobj.*;
@@ -143,8 +145,8 @@ public class ChatDirector
} }
// make sure they can say what they want to say // make sure they can say what they want to say
for (int ii=0; ii < _validators.size(); ii++) { for (int ii = 0; ii < _validators.size(); ii++) {
if (!((ChatValidator) _validators.get(ii)).validateSpeak(message)) { if (!((ChatValidator)_validators.get(ii)).validateSpeak(message)) {
return -1; return -1;
} }
} }
@@ -177,13 +179,18 @@ public class ChatDirector
public int requestTell (String target, String message) public int requestTell (String target, String message)
{ {
// make sure they can say what they want to say // make sure they can say what they want to say
for (int ii=0; ii < _validators.size(); ii++) { for (int ii = 0; ii < _validators.size(); ii++) {
if (!((ChatValidator) _validators.get(ii)).validateTell(target, if (!((ChatValidator)_validators.get(ii)).validateTell(
message)) { target, message)) {
return -1; return -1;
} }
} }
return ChatService.tell(_ctx.getClient(), target, message, this);
int invid = ChatService.tell(_ctx.getClient(), target, message, this);
// cache the tell info for use when reporting success or failure
// to our various chat displays
_tells.put(invid, new Tuple(target, message));
return invid;
} }
/** /**
@@ -287,10 +294,19 @@ public class ChatDirector
*/ */
public void handleTellSucceeded (int invid) public void handleTellSucceeded (int invid)
{ {
// remove the tell info for the successful request
Tuple tup = (Tuple)_tells.remove(invid);
if (tup == null) {
Log.warning("Notified of successful tell request but no " +
"tell info available [invid=" + invid + "].");
return;
}
// pass this on to our chat displays // pass this on to our chat displays
String target = (String)tup.left, message = (String)tup.right;
for (int i = 0; i < _displays.size(); i++) { for (int i = 0; i < _displays.size(); i++) {
ChatDisplay display = (ChatDisplay)_displays.get(i); ChatDisplay display = (ChatDisplay)_displays.get(i);
display.handleResponse(invid, SUCCESS); display.handleTellSucceeded(invid, target, message);
} }
} }
@@ -302,10 +318,19 @@ public class ChatDirector
*/ */
public void handleTellFailed (int invid, String reason) public void handleTellFailed (int invid, String reason)
{ {
// remove the tell info for the failed request
Tuple tup = (Tuple)_tells.remove(invid);
if (tup == null) {
Log.warning("Notified of failed tell request but no " +
"tell info available [invid=" + invid + "].");
return;
}
// pass this on to our chat displays // pass this on to our chat displays
String target = (String)tup.left;
for (int i = 0; i < _displays.size(); i++) { for (int i = 0; i < _displays.size(); i++) {
ChatDisplay display = (ChatDisplay)_displays.get(i); ChatDisplay display = (ChatDisplay)_displays.get(i);
display.handleResponse(invid, reason); display.handleTellFailed(invid, target, reason);
} }
} }
@@ -398,4 +423,8 @@ public class ChatDirector
/** An optionally present mutelist director. */ /** An optionally present mutelist director. */
protected MuteDirector _muter; protected MuteDirector _muter;
/** A cache of the target and message text associated with outstanding
* tell chat requests. */
protected HashIntMap _tells = new HashIntMap();
} }
@@ -1,5 +1,5 @@
// //
// $Id: ChatDisplay.java,v 1.9 2002/04/30 17:27:30 mdb Exp $ // $Id: ChatDisplay.java,v 1.10 2002/07/17 20:53:31 shaper Exp $
package com.threerings.crowd.chat; package com.threerings.crowd.chat;
@@ -65,23 +65,35 @@ public interface ChatDisplay
String type, String bundle, String message); String type, String bundle, String message);
/** /**
* Called in response to a chat request (either speak or tell) that * Called in response to a successful tell request that originated on
* originated on this client. The request id supplied will match the * this client. The request id supplied will match the one returned
* one returned when the request was generated and the status will * when the request was generated, with the target and message
* either indicate success (by being equal to <code>SUCCESS</code>) or * detailing the target user name and tell message text associated
* failure (in which case it will contain a message failure code which * with the request.
* 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 * @param reqid the request id of the request that resulted in this
* response. * response.
* @param status the message code indicating whether the chat request * @param target the name of the user to whom the tell request was
* was successful or not. * dispatched.
* @param message the text of the message.
* *
* @see ChatDirector#requestSpeak
* @see ChatDirector#requestTell * @see ChatDirector#requestTell
*/ */
public void handleResponse (int reqid, String status); public void handleTellSucceeded (int reqid, String target, String message);
/**
* Called in response to a failed tell request that originated on this
* client. The request id supplied will match the one returned when
* the request was generated, with the target and message detailing
* the target user name and tell message text associated with the
* request.
*
* @param reqid the request id of the request that resulted in this
* response.
* @param reason a translatable string explaining the reason for the
* tell request failure.
*
* @see ChatDirector#requestTell
*/
public void handleTellFailed (int reqid, String target, String reason);
} }
@@ -1,5 +1,5 @@
// //
// $Id: ChatPanel.java,v 1.14 2002/04/30 17:27:30 mdb Exp $ // $Id: ChatPanel.java,v 1.15 2002/07/17 20:53:31 shaper Exp $
package com.threerings.micasa.client; package com.threerings.micasa.client;
@@ -318,14 +318,30 @@ public class ChatPanel
} }
} }
// documentation inherited // documentation inherited from interface
public void handleResponse (int reqid, String status) public void handleTellSucceeded (int reqid, String target, String message)
{ {
if (!status.equals(ChatCodes.SUCCESS)) { // wrap the speaker in brackets
displayError(status); target = "[You whispered to " + target + "] ";
// stick a newline on the message
message = message + "\n";
Document doc = _text.getDocument();
try {
doc.insertString(doc.getLength(), target, _nameStyle);
doc.insertString(doc.getLength(), message, _msgStyle);
} catch (BadLocationException ble) {
Log.warning("Unable to insert text!? [error=" + ble + "].");
} }
} }
// documentation inherited from interface
public void handleTellFailed (int reqid, String target, String reason)
{
displayError(reason);
}
public void willEnterPlace (PlaceObject place) public void willEnterPlace (PlaceObject place)
{ {
Log.info("We be here: " + place); Log.info("We be here: " + place);