Add channel-based communications to the chat history logs as well. This groud work for msoy issue 286, which has probably been around since the channel system was added.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5990 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Jamie Doornbos
2009-11-09 20:31:46 +00:00
parent 6c65caeb1b
commit 09c7229fa6
2 changed files with 42 additions and 13 deletions
@@ -34,6 +34,9 @@ public class UserMessage extends ChatMessage
/** The mode of the message. @see ChatCodes.DEFAULT_MODE */
public byte mode;
/** The channel of the message, or null if not set. */
public ChatChannel channel;
/**
* For unserialization.
*/
@@ -41,25 +44,33 @@ public class UserMessage extends ChatMessage
{
}
/**
* Construct a user message.
*/
public UserMessage (Name speaker, String bundle, String message, byte mode)
{
super(message, bundle);
this.speaker = speaker;
this.mode = mode;
}
/**
* Constructs a user message for a player originated tell (which has no bundle and is in the
* default mode).
*/
public UserMessage (Name speaker, String message)
{
super(message, null);
this(speaker, null, message, ChatCodes.DEFAULT_MODE);
}
/**
* Construct a user message.
*/
public UserMessage (Name speaker, String bundle, String message, byte mode)
{
this(null, speaker, bundle, message, mode);
}
/**
* Construct a user message that was spoken using the channel system.
*/
public UserMessage (
ChatChannel channel, Name speaker, String bundle, String message, byte mode)
{
super(message, bundle);
this.channel = channel;
this.speaker = speaker;
this.mode = ChatCodes.DEFAULT_MODE;
this.mode = mode;
}
/**
@@ -85,7 +85,7 @@ public abstract class ChatChannelManager
public void speak (ClientObject caller, final ChatChannel channel, String message, byte mode)
{
final UserMessage umsg = new UserMessage(
((BodyObject)caller).getVisibleName(), null, message, mode);
intern(channel), ((BodyObject)caller).getVisibleName(), null, message, mode);
// if we're hosting this channel, dispatch it directly
if (_channels.containsKey(channel)) {
@@ -169,6 +169,7 @@ public abstract class ChatChannelManager
{
// map the participants of our now resolved channel
ChannelInfo info = new ChannelInfo();
info.channel = channel;
info.participants = parts;
_channels.put(channel, info);
@@ -243,6 +244,7 @@ public abstract class ChatChannelManager
for (int bodyId : bodyIds) {
BodyObject bobj = getBodyObject(bodyId);
if (bobj != null && shouldDeliverSpeak(channel, message, bobj)) {
SpeakUtil.recordToChatHistory(message, bobj.username);
bobj.postMessage(ChatCodes.CHAT_CHANNEL_NOTIFICATION, channel, message);
}
}
@@ -275,6 +277,19 @@ public abstract class ChatChannelManager
return true;
}
/**
* Returns a widely referenced instance equivalent to the given channel, if one is available.
* This reduces memory usage since clients send new channel instances with each message.
*/
protected ChatChannel intern (ChatChannel channel)
{
ChannelInfo chinfo = _channels.get(channel);
if (chinfo != null) {
return chinfo.channel;
}
return channel;
}
/**
* Converts a speaker's visible name into a unique integer id. This is not the oid for this
* speaker but rather a persistent integer identifier that can be passed between servers and
@@ -371,6 +386,9 @@ public abstract class ChatChannelManager
/** Contains metadata for a particular channel. */
protected static class ChannelInfo
{
/** The channel this info is for. */
public ChatChannel channel;
/** The body ids of the participants of this channel. */
public IntSet participants;