You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
8.8 KiB
274 lines
8.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Generic in-game abuse reporting |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef ABUSE_REPORT_H |
|
#define ABUSE_REPORT_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include <igamesystem.h> |
|
#include <GameEventListener.h> |
|
#include <bitmap/bitmap.h> |
|
#include <netadr.h> |
|
|
|
/// Different content types that can be reported as abusive. |
|
/// |
|
/// WARNING: These enum values MUST MATCH the values in Steam's |
|
/// ECommunityContentType! |
|
enum EAbuseReportContentType |
|
{ |
|
k_EAbuseReportContentNoSelection = -1, // dummy ilegal value: the user has not made a selection |
|
k_EAbuseReportContentUnspecified = 0, // we use this to mean "other" |
|
//k_EAbuseReportContentAll = 1, // reset all community content |
|
k_EAbuseReportContentAvatarImage = 2, // clear avatar image |
|
//k_EAbuseReportContentProfileText = 3, // reset profile text |
|
//k_EAbuseReportContentWebLinks = 4, // delete web links |
|
//k_EAbuseReportContentAnnouncement = 5, |
|
//k_EAbuseReportContentEventText = 6, |
|
//k_EAbuseReportContentCustomCSS = 7, |
|
//k_EAbuseReportContentProfileURL = 8, // delete community URL ID |
|
k_EAbuseReportContentComments = 9, // just comments this guy has written |
|
k_EAbuseReportContentPersonaName = 10, // persona name |
|
//k_EAbuseReportContentScreenshot = 11, // screenshot |
|
//k_EAbuseReportContentVideo = 12, // videos |
|
k_EAbuseReportContentCheating = 13, // cheating |
|
k_EAbuseReportContentUGCImage = 14, // Image stored in UGC --- the report is accusing the image of being offensive |
|
k_EAbuseReportContentActorUGCImage = 15, // Abuse report actor has uploaded a UGC image to server as supporting documentation of their claim |
|
}; |
|
|
|
|
|
/// Types of reasons why a violation report was issued |
|
/// |
|
/// WARNING: These enum values MUST MATCH the values in Steam's |
|
/// EAbuseReportType! |
|
enum EAbuseReportType |
|
{ |
|
k_EAbuseReportTypeNoSelection = -1, // dummy ilegal value: the user has not made a selection |
|
k_EAbuseReportTypeUnspecified = 0, |
|
k_EAbuseReportTypeInappropriate = 1, // just not ok to post |
|
k_EAbuseReportTypeProhibited = 2, // prohibited by EULA or general law |
|
k_EAbuseReportTypeSpamming = 3, // excessive spamming |
|
k_EAbuseReportTypeAdvertisement = 4, // unwanted advertisement |
|
//k_EAbuseReportTypeExploit = 5, // content data attempts to exploit code issue |
|
k_EAbuseReportTypeSpoofing = 6, // user/group is impersonating an official contact |
|
k_EAbuseReportTypeLanguage = 7, // bad language |
|
k_EAbuseReportTypeAdultContent = 8, // any kind of adult material, references etc |
|
k_EAbuseReportTypeHarassment = 9, // harassment, discrimination, racism etc |
|
k_EAbuseReportTypeCheating = 10, // cheating |
|
}; |
|
|
|
/// Container class that has everything we need to know in order to file |
|
/// an abuse report, which is significantly more than the data we actually |
|
/// include in a particular abuse report. It's everything we save off at the |
|
/// time the user initiates the abuse reporting mechanism. Games can derive |
|
/// their own report types and put game-specific data in here. |
|
struct AbuseIncidentData_t |
|
{ |
|
AbuseIncidentData_t(); |
|
virtual ~AbuseIncidentData_t(); |
|
|
|
enum EPlayerImageType |
|
{ |
|
k_PlayerImageType_UGC, |
|
k_PlayerImageType_Spray, |
|
}; |
|
|
|
/// A custom image of the player's that could be considered offensive |
|
struct PlayerImage_t |
|
{ |
|
|
|
/// What kind of image is it? |
|
EPlayerImageType m_eType; |
|
|
|
/// For UGC images, what's the handle? |
|
uint64 m_hUGCHandle; |
|
}; |
|
|
|
/// Info we remember for one player. |
|
struct PlayerData_t |
|
{ |
|
PlayerData_t() |
|
{ |
|
m_iClientIndex = -1; |
|
m_iSteamAvatarIndex = -1; |
|
} |
|
|
|
/// The client index. (See UTIL_PlayerByIndex). Note that this |
|
/// index is really only valid at the time the incident is captured. |
|
/// Because players can leave after the incident is captured. |
|
int m_iClientIndex; |
|
|
|
/// The name they were going by at the time |
|
CUtlString m_sPersona; |
|
|
|
/// Their steam ID. This is essential so we can file |
|
/// an abuse report! |
|
CSteamID m_steamID; |
|
|
|
/// Index of steam friends icon for their avatar. |
|
/// 0 if they don't have one! |
|
int m_iSteamAvatarIndex; |
|
|
|
/// Do we have an entity for this player? They might not have spawned, |
|
/// or might be outside our PVS, etc. |
|
bool m_bHasEntity; |
|
|
|
/// Model transform for the player's render stuff |
|
VMatrix m_matModelToWorld; |
|
|
|
/// Model->clip matrix for the player's render stuff |
|
VMatrix m_matModelToClip; |
|
|
|
/// True if the render bounds are approximately correct, false if not |
|
bool m_bRenderBoundsValid; |
|
|
|
/// Bounds (in model space) of the player's renderable stuff |
|
Vector m_vecRenderBoundsMin, m_vecRenderBoundsMax; |
|
|
|
/// Bounds (in normalized screen space coords 0...1) of the player's |
|
/// renderable stuff |
|
Vector2D m_screenBoundsMin, m_screenBoundsMax; |
|
|
|
/// List of his images |
|
CUtlVector<PlayerImage_t> m_vecImages; |
|
}; |
|
|
|
/// List of base player data. You got more data per player in your derived |
|
/// incident type? Store it in a parallel array. |
|
CUtlVector<PlayerData_t> m_vecPlayers; |
|
|
|
/// Camera world -> clip matrix. |
|
VMatrix m_matWorldToClip; |
|
|
|
/// Screenshot |
|
Bitmap_t m_bitmapScreenshot; |
|
|
|
// Screenshot file data |
|
CUtlBuffer m_bufScreenshotFileData; |
|
|
|
/// Number of frames we're willing to wait for the engine to write out a screenshot. |
|
/// Zero if we already failed |
|
int m_nScreenShotWaitFrames; |
|
|
|
/// Is it possible to report the game server itself for abuse? |
|
bool m_bCanReportGameServer; |
|
|
|
/// What Game Server/IP are we on? Will be an invalid address if we don't know |
|
netadr_t m_adrGameServer; |
|
|
|
/// Steam ID of the game server / IP we are on |
|
CSteamID m_steamIDGameServer; |
|
|
|
/// Poll report (some data may have to be fetched asynchronously), |
|
/// return true if everything is ready |
|
virtual bool Poll(); |
|
}; |
|
|
|
/// Generic abuse reporting panel. Your |
|
class CAbuseReportManager : public CBaseGameSystemPerFrame, public CGameEventListener |
|
{ |
|
public: |
|
CAbuseReportManager(); |
|
virtual ~CAbuseReportManager(); |
|
|
|
// |
|
// CAutoGameSystemPerFrame overrides |
|
// |
|
virtual char const *Name(); |
|
virtual bool Init(); |
|
virtual void Shutdown(); |
|
virtual void LevelShutdownPreEntity(); |
|
|
|
// |
|
// CGameEventListener overrides |
|
// |
|
virtual void FireGameEvent( IGameEvent *event ); |
|
|
|
// CAutoGameSystemPerFrame defines different stuff depending on which DLL we're building |
|
#ifdef CLIENT_DLL |
|
|
|
// Do our frame-time processing |
|
virtual void Update( float frametime ); |
|
|
|
#else |
|
#error "Why is this being included?" |
|
#endif |
|
|
|
/// Called when the console command is executed to capture data for a report |
|
virtual void QueueReport(); |
|
|
|
/// Called when the console command is executed to submit data for a report |
|
virtual void SubmitReportUIRequested(); |
|
|
|
/// Called to actually trigger the report UI, after all data is ready |
|
virtual void ActivateSubmitReportUI() = 0; |
|
|
|
/// Fetch the incident that's queued to be reported |
|
AbuseIncidentData_t *GetIncidentData() const { return m_pIncidentData; } |
|
|
|
/// Delete any current report incident. Also should clean |
|
/// out any temporary files used by the incident system. |
|
virtual void DestroyIncidentData(); |
|
|
|
/// Show a message box complaining about lack of steam |
|
/// connection |
|
virtual void ShowNoSteamErrorMessage(); |
|
|
|
/// Insert a a notification into the queue indicating that an unfiled report is ready |
|
virtual void CreateReportReadyNotification( bool bInGame, float flLifetime ); |
|
|
|
/// Test harness. Set this to true, to generate fake data |
|
bool m_bTestReport; |
|
|
|
static const char k_rchScreenShotFilenameBase[]; |
|
static const char k_rchScreenShotFilename[]; |
|
|
|
protected: |
|
|
|
/// Your app will probably define its own abuse report types. |
|
/// if so, you will need to override this function. |
|
/// The base class just calls new to create an object, then calls |
|
/// PopulateIncident() |
|
virtual bool CreateAndPopulateIncident(); |
|
|
|
/// Fill in the details about the current incident. This just fills in the |
|
/// base class data, and it should be called from CreateAndPopulateIncident |
|
bool PopulateIncident(); |
|
|
|
/// Current incident that is pending to be reported or is being generated. |
|
/// Might be NULL. |
|
AbuseIncidentData_t *m_pIncidentData; |
|
|
|
/// Status of incident data. |
|
enum EIncidentDataStatus |
|
{ |
|
k_EIncidentDataStatus_None, |
|
k_EIncidentDataStatus_Preparing, // we shuld call Poll() until it's ready |
|
k_EIncidentDataStatus_Ready, // it's ready |
|
}; |
|
EIncidentDataStatus m_eIncidentDataStatus; |
|
|
|
/// Do we want to show the report UI as soon as the report is ready? |
|
bool m_bReportUIPending; |
|
|
|
void CheckCreateReportReadyNotification( float flMinSecondsSinceLastNotification, bool bInGame, float flLifetime ); |
|
|
|
/// Time when we last pestered them about filing their report |
|
double m_timeLastReportReadyNotification; |
|
|
|
/// Address of the lasts server we connected to |
|
netadr_t m_adrCurrentServer; |
|
CSteamID m_steamIDCurrentServer; |
|
|
|
}; |
|
|
|
/// Pointer to the app-specific instance. This pointer mght be NULL! Your |
|
/// app should define set this pointer if it uses the system |
|
extern CAbuseReportManager *g_AbuseReportMgr; |
|
|
|
#endif // ABUSE_REPORT_H
|
|
|