void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
{
    if ( !update.isMap() ) return;

    if ( update.has("agent_updates") && update["agent_updates"].isMap() )
    {
        LLSD::map_const_iterator update_it;
        for(
            update_it = update["agent_updates"].beginMap();
            update_it != update["agent_updates"].endMap();
            ++update_it)
        {
            LLUUID agent_id(update_it->first);
            LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);

            LLSD agent_data = update_it->second;

            if (agent_data.isMap() && agent_data.has("transition"))
            {
                if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull())
                {
                    speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
                    speakerp->mDotColor = INACTIVE_COLOR;
                    speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
                }
                else if (agent_data["transition"].asString() == "ENTER")
                {
                    // add or update speaker
                    speakerp = setSpeaker(agent_id);
                }
                else
                {
                    llwarns << "bad membership list update " << ll_print_sd(agent_data["transition"]) << llendl;
                }
            }

            if (speakerp.isNull()) continue;

            // should have a valid speaker from this point on
            if (agent_data.isMap() && agent_data.has("info"))
            {
                LLSD agent_info = agent_data["info"];

                if (agent_info.has("is_moderator"))
                {
                    speakerp->mIsModerator = agent_info["is_moderator"];
                }

                if (agent_info.has("mutes"))
                {
                    speakerp->mModeratorMutedText = agent_info["mutes"]["text"];
                }
            }
        }
    }
    else if ( update.has("updates") && update["updates"].isMap() )
    {
        LLSD::map_const_iterator update_it;
        for (
            update_it = update["updates"].beginMap();
            update_it != update["updates"].endMap();
            ++update_it)
        {
            LLUUID agent_id(update_it->first);
            LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);

            std::string agent_transition = update_it->second.asString();
            if (agent_transition == "LEAVE" && speakerp.notNull())
            {
                speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL;
                speakerp->mDotColor = INACTIVE_COLOR;
                speakerp->mActivityTimer.resetWithExpiry(SPEAKER_TIMEOUT);
            }
            else if ( agent_transition == "ENTER")
            {
                // add or update speaker
                speakerp = setSpeaker(agent_id);
            }
            else
            {
                llwarns << "bad membership list update "
                        << agent_transition << llendl;
            }
        }
    }
}
예제 #2
0
void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
{
	if ( !update.isMap() ) return;

	if ( update.has("agent_updates") && update["agent_updates"].isMap() )
	{
		LLSD::map_const_iterator update_it;
		for(
			update_it = update["agent_updates"].beginMap();
			update_it != update["agent_updates"].endMap();
			++update_it)
		{
			LLUUID agent_id(update_it->first);
			LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);

			LLSD agent_data = update_it->second;

			if (agent_data.isMap() && agent_data.has("transition"))
			{
				if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull())
				{
					setSpeakerNotInChannel(speakerp);
				}
				else if (agent_data["transition"].asString() == "ENTER")
				{
					// add or update speaker
					speakerp = setSpeaker(agent_id);
				}
				else
				{
					llwarns << "bad membership list update " << ll_print_sd(agent_data["transition"]) << llendl;
				}
			}

			if (speakerp.isNull()) continue;

			// should have a valid speaker from this point on
			if (agent_data.isMap() && agent_data.has("info"))
			{
				LLSD agent_info = agent_data["info"];

				if (agent_info.has("is_moderator"))
				{
					BOOL is_moderator = speakerp->mIsModerator;
					speakerp->mIsModerator = agent_info["is_moderator"];
					// Fire event only if moderator changed
					if ( is_moderator != speakerp->mIsModerator )
					{
						LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;
						fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");
					}
				}

				if (agent_info.has("mutes"))
				{
					speakerp->mModeratorMutedText = agent_info["mutes"]["text"];
				}
			}
		}
	}
	else if ( update.has("updates") && update["updates"].isMap() )
	{
		LLSD::map_const_iterator update_it;
		for (
			update_it = update["updates"].beginMap();
			update_it != update["updates"].endMap();
			++update_it)
		{
			LLUUID agent_id(update_it->first);
			LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);

			std::string agent_transition = update_it->second.asString();
			if (agent_transition == "LEAVE" && speakerp.notNull())
			{
				setSpeakerNotInChannel(speakerp);
			}
			else if ( agent_transition == "ENTER")
			{
				// add or update speaker
				speakerp = setSpeaker(agent_id);
			}
			else
			{
				llwarns << "bad membership list update "
						<< agent_transition << llendl;
			}
		}
	}
}