phoenix-firestorm/indra/newview/fsradar.h

161 lines
5.1 KiB
C++

/**
* @file fsradar.h
* @brief Firestorm radar implementation
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_RADAR_H
#define FS_RADAR_H
#include "llsingleton.h"
#include "fsradarentry.h"
#include <unordered_map>
class LLAvatarName;
constexpr U32 FSRADAR_MAX_AVATARS_PER_ALERT{ 6 }; // maximum number of UUIDs we can cram into a single channel radar alert message
constexpr U32 FSRADAR_COARSE_OFFSET_INTERVAL{ 7 }; // seconds after which we query the bridge for a coarse location adjustment
constexpr U32 FSRADAR_MAX_OFFSET_REQUESTS{ 60 }; // 2048 / UUID size, leaving overhead space
constexpr U32 FSRADAR_CHAT_MIN_SPACING{ 6 }; // minimum delay between radar chat messages
typedef enum e_radar_name_format
{
FSRADAR_NAMEFORMAT_DISPLAYNAME,
FSRADAR_NAMEFORMAT_USERNAME,
FSRADAR_NAMEFORMAT_DISPLAYNAME_USERNAME,
FSRADAR_NAMEFORMAT_USERNAME_DISPLAYNAME
} ERadarNameFormat;
typedef enum e_radar_payment_info_flag
{
FSRADAR_PAYMENT_INFO_NONE,
FSRADAR_PAYMENT_INFO_FILLED,
FSRADAR_PAYMENT_INFO_USED
} ERadarPaymentInfoFlag;
class FSRadar
: public LLSingleton<FSRadar>
{
LOG_CLASS(FSRadar);
LLSINGLETON(FSRadar);
virtual ~FSRadar();
public:
typedef std::unordered_map<LLUUID, std::shared_ptr<FSRadarEntry>> entry_map_t;
entry_map_t getRadarList() { return mEntryList; }
void startTracking(const LLUUID& avatar_id);
void zoomAvatar(const LLUUID& avatar_id, std::string_view name);
void teleportToAvatar(const LLUUID& targetAv);
void requestRadarChannelAlertSync();
void updateNames();
void updateName(const LLUUID& avatar_id);
void updateNotes(const LLUUID& avatar_id, std::string_view notes);
static void onRadarNameFmtClicked(const LLSD& userdata);
static bool radarNameFmtCheck(const LLSD& userdata);
static void onRadarReportToClicked(const LLSD& userdata);
static bool radarReportToCheck(const LLSD& userdata);
void getCurrentData(std::vector<LLSD>& entries, LLSD& stats) const { entries = mRadarEntriesData; stats = mAvatarStats; }
std::shared_ptr<FSRadarEntry> getEntry(const LLUUID& avatar_id);
// internals
class Updater
{
public:
typedef std::function<void()> callback_t;
Updater(callback_t cb)
: mCallback(cb)
{ }
virtual ~Updater()
{ }
protected:
void update()
{
mCallback();
}
callback_t mCallback;
};
typedef boost::signals2::signal<void(const std::vector<LLSD>& entries, const LLSD& stats)> radar_update_callback_t;
boost::signals2::connection setUpdateCallback(const radar_update_callback_t::slot_type& cb)
{
return mUpdateSignal.connect(cb);
}
protected:
void initSingleton() override;
private:
void updateRadarList();
void updateTracking();
void checkTracking();
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
void updateAgeAlertCheck();
void onRegionChanged();
std::unique_ptr<Updater> mRadarListUpdater;
struct RadarFields
{
F32 lastDistance;
LLUUID lastRegion;
bool lastIgnore;
};
typedef std::unordered_map<LLUUID, RadarFields> radarfields_map_t;
radarfields_map_t mLastRadarSweep;
entry_map_t mEntryList;
uuid_vec_t mRadarEnterAlerts;
uuid_vec_t mRadarLeaveAlerts;
uuid_vec_t mRadarOffsetRequests;
std::vector<LLSD> mRadarEntriesData;
S32 mRadarFrameCount;
bool mRadarAlertRequest;
F32 mRadarLastRequestTime;
U32 mRadarLastBulkOffsetRequestTime;
LLUUID mTrackedAvatarId;
LLSD mAvatarStats;
radar_update_callback_t mUpdateSignal;
boost::signals2::connection mShowUsernamesCallbackConnection;
boost::signals2::connection mNameFormatCallbackConnection;
boost::signals2::connection mAgeAlertCallbackConnection;
boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection;
boost::signals2::connection mRegionChangedCallbackConnection;
};
#endif // FS_RADAR_H