#include "ReportMenu.h" //#include "ReportMenuData_parser.h" #include "rline/rlgamerinfo.h" #include "rline/rltitleid.h" #include "Network/Live/livemanager.h" #include "parser/manager.h" #include "parser/macros.h" #include "parsercore/settings.h" #include "net/status.h" #include "text/text.h" #include "Frontend/ui_channel.h" #include "Frontend/PauseMenu.h" #include "Frontend/ContextMenu.h" #include "system/controlMgr.h" #include "script/script.h" #include "stats/StatsInterface.h" #include "Network/Cloud/Tunables.h" #include "Network/Live/NetworkTelemetry.h" #define REPORTMENU_DATA_XML_FILENAME "common:/data/ui/reportplayer.xml" #define REPORTMENU_MOVIE_NAME "MP_RESULTS_PANEL" #define MAX_CUSTOM_COMPLAINT_LENGTH (64) netStatus CReportMenu::sm_NetStatusPool[MAX_SIMULTANEOUS_COMPLAINT]; CReportMenu::CReportMenu(): m_bAllowCancel(true), m_bActive(false), m_bInactiveThisFrame(false), m_bWasPauseMenuActive(false), m_bInSystemKeyboard(false), m_iSelectedIndex(0), m_iSelectedMenu(0), m_iStoredCallbackIndex(0), m_iSelectedMissionIndex(0), m_iReportAbuseCountThreshold(0), m_iReportAbuseTimeThreshold(0), m_eReportType(ReportType_None), m_eMenuType(eReportMenu_Invalid), m_NetStatusCallback(NULL), m_iInputDisableDuration(500U) // disable all inputs for half a second when the warning screen exits! { m_ButtonFlags = static_cast(FE_WARNING_CONFIRM | FE_WARNING_BACK); m_szCustomReportInfo = rage_new char[MAX_CUSTOM_COMPLAINT_LENGTH]; m_Name = rage_new char[RL_MAX_DISPLAY_NAME_BUF_SIZE]; memset(m_szCustomReportInfo,'\0',sizeof(char)*MAX_CUSTOM_COMPLAINT_LENGTH); memset(m_Name,'\0',sizeof(char)*RL_MAX_DISPLAY_NAME_BUF_SIZE); m_GamerHandle.Clear(); m_AbuseArray.Reset(); // bind query delegate m_QueryMissionsDelegate.Bind(this, &CReportMenu::OnRecentMissionsContentResult); // reset the status member m_QueryMissionsStatus.Reset(); m_QueryMissionsOp = eUgcMissionsOp_Idle; } CReportMenu::~CReportMenu() { delete m_szCustomReportInfo; m_szCustomReportInfo = NULL; if (m_Name) { delete m_Name; m_Name = NULL; } if (m_NetStatusCallback) { delete m_NetStatusCallback; m_NetStatusCallback = NULL; } } void CReportMenu::Open(const rlGamerHandle& rlHandle, eMenuType eType) { reportDisplayf("CReportMenu::Open"); m_HistoryStack.Reset(); m_GamerHandle.Clear(); m_GamerHandle = rlHandle; CNetGamePlayer* pPlayer = NetworkInterface::GetPlayerFromGamerHandle(m_GamerHandle); if (pPlayer) { #if RSG_DURANGO if (pPlayer->GetGamerInfo().HasDisplayName()) { formatf(m_Name, RL_MAX_DISPLAY_NAME_BUF_SIZE,"%s",pPlayer->GetGamerInfo().GetDisplayName()); } else #endif { formatf(m_Name, RL_MAX_DISPLAY_NAME_BUF_SIZE,"%s",pPlayer->GetGamerInfo().GetName()); } } m_iReportAbuseCountThreshold = Tunables::GetInstance().TryAccess(CD_GLOBAL_HASH, ATSTRINGHASH("REPORT_ABUSE_COUNT_THRESHOLD", 0x082623a4), 2); LoadDataXMLFile(eType); #if RSG_PC CMousePointer::SetMouseCursorStyle(MOUSE_CURSOR_STYLE_ARROW); CMousePointer::SetMouseCursorVisible(true); #endif m_ButtonFlags = static_cast(FE_WARNING_CONFIRM | FE_WARNING_BACK); } void CReportMenu::Close() { reportDisplayf("CReportMenu::Close"); #if RSG_PC CMousePointer::SetMouseCursorVisible(false); #endif m_iStoredCallbackIndex = 0; memset(m_szCustomReportInfo,'0',sizeof(char)*MAX_CUSTOM_COMPLAINT_LENGTH); RemoveReportMovie(); } //**************************************************************************************** // LoadDataXMLFile - Loads reportplayer.xml into our menu structure //**************************************************************************************** bool CReportMenu::LoadDataXMLFile(eMenuType eType) { reportDisplayf("CReportMenu::LoadDataXMLFile"); // initialize any arrays: m_eMenuType = eType; parSettings settings = PARSER.Settings(); DEV_ONLY( settings.SetFlag(parSettings::READ_SAFE_BUT_SLOW, true); ) settings.SetFlag(parSettings::CULL_OTHER_PLATFORM_DATA, true); if( !PARSER.LoadObject(REPORTMENU_DATA_XML_FILENAME, "", m_MenuArray, &settings) ) return false; if (m_eMenuType == eReportMenu_CommendMenu) { m_HistoryStack.PushAndGrow(ReportLink_None); UpdateMenuOptions(ReportLink_CommendRoot); } else if ( m_eMenuType == eReportMenu_ReportMenu) { m_HistoryStack.PushAndGrow(ReportLink_None); UpdateMenuOptions(ReportLink_ReportRoot); } else { m_HistoryStack.PushAndGrow(ReportLink_None); UpdateMenuOptions(ReportLink_UGCReportRoot); } return true; } //**************************************************************************************** // UpdateMenuOptions - Moves to the appropriate page based on the link //**************************************************************************************** void CReportMenu::UpdateMenuOptions(eReportLink eToMoveTo) { // These menus are dynamically created. Populate depending on the screen if (eToMoveTo == ReportLink_UGCReportRoot ) { reportDisplayf("CReportMenu::UpdateMenuOptions - setting m_iSelectedMenu to ReportLink_UGCReportRoot"); m_iSelectedMenu = ReportLink_UGCReportRoot; if (m_QueryMissionsOp != eUgcMissionsOp_Pending) { m_NumberOfMissionsInArray = 0; m_nContentTotal = 0; m_QueryMissionsStatus.Reset(); m_QueryMissionsOp = eUgcMissionsOp_Idle; reportDisplayf("CReportMenu::UpdateMenuOptions - about to call GetMyRecentlyPlayedContent"); char szQueryParams[256]; formatf(szQueryParams, sizeof(szQueryParams), "{lang:[%s]}", CText::GetStringOfSupportedLanguagesFromCurrentLanguageSetting()); if (UserContentManager::GetInstance().QueryContent(RLUGC_CONTENT_TYPE_GTA5MISSION, "GetMyRecentlyPlayedContent", szQueryParams, 0, MAX_WARNING_MISSIONS, &m_nContentTotal, NULL, m_QueryMissionsDelegate, &m_QueryMissionsStatus)) { reportDisplayf("CReportMenu::UpdateMenuOptions - GetMyRecentlyPlayedContent has successfully started. Setting m_QueryMissionsOp to eUgcMissionsOp_Pending"); m_QueryMissionsOp = eUgcMissionsOp_Pending; } } else { reportDisplayf("CReportMenu::UpdateMenuOptions - m_QueryMissionsOp is %d so GetMyRecentlyPlayedContent has been skipped", (int) m_QueryMissionsOp); } LoadReportMovie(); } else { int iMenuScreensCount = m_MenuArray.m_ReportLists.GetCount(); for (int i = 0; i < iMenuScreensCount; i++) { if (m_MenuArray.m_ReportLists[i].ReportLinkId == eToMoveTo) { Populate(m_MenuArray.m_ReportLists[i]); m_iSelectedMenu = i; } } } } //**************************************************************************************** // Populate - Fills out the report page according to the list information //**************************************************************************************** void CReportMenu::Populate(CReportList& list) { m_NameHashArray.Reset(); m_CallbackArray.Reset(); m_ButtonFlags = static_cast(FE_WARNING_CONFIRM | FE_WARNING_BACK); for (int i = 0; i < list.ReportOptions.GetCount(); i++) { if (list.ReportOptions[i].ReportLink == ReportLink_Crew) { const rlClanDesc* pClanDesc = CLiveManager::GetNetworkClan().GetPrimaryClan(m_GamerHandle); if (pClanDesc && !pClanDesc->IsValid()) { continue; } } if (list.ReportOptions[i].ReportLink == ReportLink_PlayerMadeMissions) { if (strcmp(CTheScripts::GetContentIdOfCurrentUGCMission(),"") == 0) continue; } m_NameHashArray.PushAndGrow(list.ReportOptions[i].LabelHash.GetHash()); switch (list.ReportOptions[i].ReportType) { // Negative report callbacks case ReportType_Exploit: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForExploit)); break; } case ReportType_OffensiveUGC: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForOffensiveUGC)); break; } case ReportType_OffensiveLicensePlate: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForOffensiveTagPlate)); break; } case ReportType_OffensiveLanguage: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForOffensiveLang)); break; } case ReportType_Griefing: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForGriefing)); break; } case ReportType_GameExploit: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForGameExploit)); break; } case ReportType_None: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForGriefing)); break; } case ReportType_OffensiveCrewName: case ReportType_OffensiveCrewMotto: case ReportType_OffensiveCrewStatus: case ReportType_OffensiveCrewEmblem: case ReportType_PlayerMade_Title: case ReportType_PlayerMade_Description: case ReportType_PlayerMade_Photo: case ReportType_PlayerMade_Content: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForUGCContent)); break; } case ReportType_VoiceChat_Annoying: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForVCAnnoying)); break; } case ReportType_VoiceChat_Hate: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForVCHate)); break; } case ReportType_TextChat_Annoying: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForTextChatAnnoying)); break; } case ReportType_TextChat_Hate: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForTextChatHate)); break; } case ReportType_Other: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbReportForVCHate)); break; } //Positive case ReportType_Friendly: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbCommendForFriendly)); break; } case ReportType_Helpful: { m_CallbackArray.PushAndGrow(datCallback(CContextMenuHelper::clbCommendForHelpful)); break; } } } ShowReportScreen(list.SubtitleHash); } //**************************************************************************************** // ResetAbuseList - //**************************************************************************************** void CReportMenu::ResetAbuseList() { SReportMenu::GetInstance().ResetMenuAbuseList(); } void CReportMenu::ResetMenuAbuseList() { m_AbuseArray.Reset(); } //**************************************************************************************** // Update - A stub update that encapsulates the singleton so we can use gameskeleton. //**************************************************************************************** void CReportMenu::Update() { SReportMenu::GetInstance().UpdateMenu(); // This class doesnt handle the result of the requests (fire and forget) so we can reset the status, no one is checking for it for(int i=0; i= m_iReportAbuseCountThreshold) { char szUserId[64] = {0}; char szReportedId[64] = {0}; #if RSG_XENON || RSG_DURANGO s64 sUserId = m_GamerHandle.GetXuid(); s64 sReportedId = NetworkInterface::GetLocalGamerHandle().GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u",sReportedId ); #elif RSG_PS3 || RSG_ORBIS formatf(szUserId,64, "%s",m_GamerHandle.GetNpOnlineId().data ); formatf(szReportedId,64, "%s",NetworkInterface::GetLocalGamerHandle().GetNpOnlineId().data ); #elif RSG_PC s64 sUserId = m_GamerHandle.GetRockstarId(); s64 sReportedId = NetworkInterface::GetLocalGamerHandle().GetRockstarId(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId,64, "%" I64FMT "u",sReportedId ); #else Assert(0); #endif CNetworkTelemetry::AppendMetricReporter(szUserId, szReportedId, m_iStoredCallbackIndex , m_AbuseArray[uIndex].reportCount); } } else { sAbuseInfo info; info.Init(m_GamerHandle, 1); m_AbuseArray.PushAndGrow(info); return false; } return uIndex == -1; } //**************************************************************************************** // UpdateMenu - Updates our report system. //**************************************************************************************** void CReportMenu::UpdateMenu() { PF_AUTO_PUSH_TIMEBAR("CReportMenu Update"); if (IsActive() && m_Movie.IsActive()) { if (m_bWasPauseMenuActive && (!CPauseMenu::IsActive() || CLiveManager::GetInviteMgr().IsAwaitingInviteConfirm())) { RemoveReportMovie(); m_bWasPauseMenuActive = false; return; } m_bInactiveThisFrame = true; CWarningScreen::SetMessageWithHeader(WARNING_MESSAGE_REPORT_SCREEN, "", "", m_ButtonFlags, false, -1, NULL, NULL, false); // no background UpdateUGCFlow(); UpdateInput(); } else if(m_bInactiveThisFrame) { m_bInactiveThisFrame = false; CControlMgr::GetMainPlayerControl(false).DisableAllInputs(m_iInputDisableDuration); } m_bWasPauseMenuActive = CPauseMenu::IsActive(); } #if RSG_PC void CReportMenu::UpdateMouseEvents(const GFxValue* args) { if (args[4].IsNumber() && (s32)args[4].GetNumber() != m_iSelectedIndex) { if ( (s32)args[4].GetNumber() > m_iSelectedIndex ) { CPauseMenu::PlayInputSound(FRONTEND_INPUT_UP); } if ( (s32)args[4].GetNumber() < m_iSelectedIndex ) { CPauseMenu::PlayInputSound(FRONTEND_INPUT_DOWN); } if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam(0); m_Movie.EndMethod(); } m_iSelectedIndex = (s32)args[4].GetNumber(); } if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam((int)(BIT(0))); m_Movie.EndMethod(); } const sScaleformMouseEvent evt = CMousePointer::GetLastMouseEvent(); if(evt.iMovieID != SF_INVALID_MOVIE ) { if (evt.evtType == eMOUSE_EVT::EVENT_TYPE_MOUSE_RELEASE) { OnAcceptInput(); } } } #endif //*********************************************************************************************** // UpdateUGCFlow - Updates UGC flow for report menu when we need to sent complaint to SC backend. //*********************************************************************************************** void CReportMenu::UpdateUGCFlow() { if (CControlMgr::UpdateVirtualKeyboard() != ioVirtualKeyboard::kKBState_PENDING && m_bInSystemKeyboard) { if (CControlMgr::GetVirtualKeyboardState() == ioVirtualKeyboard::kKBState_SUCCESS) { formatf(m_szCustomReportInfo, MAX_CUSTOM_COMPLAINT_LENGTH,"%s",CControlMgr::GetVirtualKeyboardResult()); // Store which callback to use m_bInSystemKeyboard = false; m_iStoredCallbackIndex = m_iSelectedIndex; if (m_eReportType == ReportType_None) m_eReportType = ReportType_Other; m_HistoryStack.PushAndGrow(m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportLinkId); UpdateConfirmationScreen(); } } if (m_NetStatus.GetStatus() != netStatus::NET_STATUS_NONE) { if (m_NetStatus.GetStatus() == netStatus::NET_STATUS_SUCCEEDED || m_NetStatus.GetStatus() == netStatus::NET_STATUS_FAILED) { if (m_NetStatusCallback) { m_NetStatusCallback->Call(); delete m_NetStatusCallback; m_NetStatusCallback = NULL; } m_NetStatus.Reset(); } } if(m_QueryMissionsOp == eUgcMissionsOp_Pending && !m_QueryMissionsStatus.Pending()) { if (m_iSelectedMenu == ReportLink_UGCReportRoot) { if(m_QueryMissionsStatus.Succeeded()) { reportDisplayf("CReportMenu::UpdateUGCFlow - Recent mission request has succeeded. m_NumberOfMissionsInArray is %u", m_NumberOfMissionsInArray); PopulateMissionPage(); } else { reportDisplayf("CReportMenu::UpdateUGCFlow - Recent mission request has failed"); UpdateThankYouScreen(); } } else { reportDisplayf("CReportMenu::UpdateUGCFlow - Recent mission request has finished but m_iSelectedMenu isn't ReportLink_UGCReportRoot so don't try to populate the list of mission names"); } m_QueryMissionsOp = eUgcMissionsOp_Finished; } } //**************************************************************************************** // Render - A stub render that encapsulates the singleton so we can use gameskeleton. //**************************************************************************************** void CReportMenu::Render() { SReportMenu::GetInstance().RenderMenu(); } //**************************************************************************************** // Render - A stub render that encapsulates the singleton so we can use gameskeleton. //**************************************************************************************** void CReportMenu::RenderMenu() { if (IsActive() && m_Movie.IsActive()) { if (CWarningScreen::CanRender()) CWarningScreen::Render(); m_Movie.Render(true); } } //**************************************************************************************** // LoadReportMovie //**************************************************************************************** void CReportMenu::LoadReportMovie() { if (!m_bActive) { m_Movie.CreateMovieAndWaitForLoad(SF_BASE_CLASS_GENERIC, REPORTMENU_MOVIE_NAME, Vector2(0.0f,0.0f), Vector2(1.0f, 1.0f)); CScaleformMgr::ForceMovieUpdateInstantly(m_Movie.GetMovieID(), true); m_bActive = true; } } //**************************************************************************************** // RemoveReportMovie //**************************************************************************************** void CReportMenu::RemoveReportMovie() { reportDisplayf("CReportMenu::RemoveReportMovie"); if(m_Movie.IsActive()) { m_Movie.RemoveMovie(); m_bActive = false; if(CPauseMenu::IsActive() && CPauseMenu::GetDisplayPed() && CPauseMenu::GetCurrentScreenData().GetDynamicMenu() && CPauseMenu::GetCurrentScreenData().GetDynamicMenu()->GetMenuScreenId() != MENU_UNIQUE_ID_MISSION_CREATOR) { CPauseMenu::GetDisplayPed()->SetVisible(true); } } // m_QueryMissionsOp = eUgcMissionsOp_Idle; // Graeme - I'll try without this just now. } //**************************************************************************************** // OnAcceptInput //**************************************************************************************** void CReportMenu::OnAcceptInput() { // ReportLink_UGCReportRoot is a special flow - the screen is created dynamically via UGC results thus doesn't exist in the ReportOptions. // We need to check specifically for this to handle proper flow in code. if (m_iSelectedMenu == ReportLink_UGCReportRoot) { if (m_QueryMissionsOp == eUgcMissionsOp_Finished) { if ( (m_iSelectedIndex >= 0) && (m_iSelectedIndex < m_NumberOfMissionsInArray) ) { reportDisplayf("CReportMenu::UpdateInput - player has pressed Accept so move on to ReportLink_PlayerMadeMissions. m_iSelectedIndex=%d", m_iSelectedIndex); m_HistoryStack.PushAndGrow(ReportLink_UGCReportRoot); m_iSelectedMissionIndex = m_iSelectedIndex; UpdateMenuOptions(ReportLink_PlayerMadeMissions); } else { reportDisplayf("CReportMenu::UpdateInput - player has pressed Accept but m_iSelectedIndex=%d. It's out of the range 0 to %d so do nothing", m_iSelectedIndex, m_NumberOfMissionsInArray); } } } else { eReportLink eNewLink = m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportOptions[m_iSelectedIndex].ReportLink; if (eNewLink == ReportLink_None) { m_iStoredCallbackIndex = 0; memset(m_szCustomReportInfo,'0',sizeof(char)*MAX_CUSTOM_COMPLAINT_LENGTH); RemoveReportMovie(); } else if (eNewLink == ReportLink_Confirmation) { // Store which callback to use m_iStoredCallbackIndex = m_iSelectedIndex; m_eReportType = m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportOptions[m_iSelectedIndex].ReportType; m_HistoryStack.PushAndGrow(m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportLinkId); UpdateConfirmationScreen(); } else if (eNewLink == ReportLink_Other) { ShowKeyboard("RP_CUSTOM_TITLE"); } else if (eNewLink == ReportLink_Content) { ShowKeyboard("RP_CUSTOM_TITLE"); m_eReportType = ReportType_PlayerMade_Content; } else if (eNewLink == ReportLink_Successful) { if (m_eReportType == ReportType_OffensiveCrewName || m_eReportType == ReportType_OffensiveCrewMotto || m_eReportType == ReportType_OffensiveCrewStatus || m_eReportType == ReportType_OffensiveCrewEmblem || m_eReportType == ReportType_Other) { if (m_NetStatus.GetStatus() == netStatus::NET_STATUS_NONE) { GenerateReport(); } } else if ( m_eReportType == ReportType_PlayerMade_Title || m_eReportType == ReportType_PlayerMade_Description || m_eReportType == ReportType_PlayerMade_Content) { if (!m_QueryMissionsStatus.Pending() && (m_iSelectedMissionIndex >= 0) && (m_iSelectedMissionIndex < m_NumberOfMissionsInArray)) { if (m_NetStatus.GetStatus() == netStatus::NET_STATUS_NONE) { reportDisplayf("CReportMenu::UpdateInput - player has pressed Accept so call GenerateMissionReport"); CReportMenu::GenerateMissionReport(); } else { reportDisplayf("CReportMenu::UpdateInput - player has pressed Accept but we can't call GenerateMissionReport because an earlier call to rlSocialClub::RegisterComplaint hasn't finished yet"); } } } else { if (m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportOptions[m_iSelectedIndex].ReportType == ReportType_Friendly || m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportOptions[m_iSelectedIndex].ReportType == ReportType_Helpful ) { m_iStoredCallbackIndex = m_iSelectedIndex; } if (m_eMenuType != eReportMenu_CommendMenu && m_iStoredCallbackIndex < ReportType_Friendly) { if (!IsReportAbusive()) { m_CallbackArray[m_iStoredCallbackIndex].Call(); } } else { m_CallbackArray[m_iStoredCallbackIndex].Call(); } UpdateThankYouScreen(); m_eReportType = ReportType_None; } m_NameHashArray.Reset(); m_CallbackArray.Reset(); m_bAllowCancel = false; } else { if (eNewLink == ReportLink_Crew) { const rlClanDesc* pClanDesc = CLiveManager::GetNetworkClan().GetPrimaryClan(m_GamerHandle); eReportLink eLink = eNewLink; if (pClanDesc && !pClanDesc->IsValid()) { eLink = ReportLink_PlayerMadeMissions; // Graeme - ask Geoff what this does } m_HistoryStack.PushAndGrow(m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportLinkId); UpdateMenuOptions(eLink); } else { m_HistoryStack.PushAndGrow(m_MenuArray.m_ReportLists[m_iSelectedMenu].ReportLinkId); UpdateMenuOptions(eNewLink); } } } CPauseMenu::PlayInputSound(FRONTEND_INPUT_ACCEPT); } //**************************************************************************************** // UpdateInput - Controls input and navigation between pages. //**************************************************************************************** bool CReportMenu::UpdateInput() { if (!IsActive()) { return false; } #if RSG_PC if (CControlMgr::GetVirtualKeyboardState() == ioVirtualKeyboard::kKBState_PENDING ) return false; #endif if (CPauseMenu::CheckInput(FRONTEND_INPUT_ACCEPT, false, CHECK_INPUT_OVERRIDE_FLAG_STORAGE_DEVICE | CHECK_INPUT_OVERRIDE_FLAG_WARNING_MESSAGE)) { OnAcceptInput(); return true; } if (CPauseMenu::CheckInput(FRONTEND_INPUT_BACK, false, CHECK_INPUT_OVERRIDE_FLAG_STORAGE_DEVICE | CHECK_INPUT_OVERRIDE_FLAG_WARNING_MESSAGE)) { if (m_bAllowCancel && (m_HistoryStack.Top() == ReportLink_None )) { RemoveReportMovie(); } else { eReportLink eLink = m_HistoryStack.Top(); m_eReportType = ReportType_None; memset(m_szCustomReportInfo,'0',sizeof(char)*MAX_CUSTOM_COMPLAINT_LENGTH); if(eLink != ReportLink_None) { m_HistoryStack.Pop(); UpdateMenuOptions(eLink); CPauseMenu::PlayInputSound(FRONTEND_INPUT_BACK); } } return true; } if (CPauseMenu::CheckInput(FRONTEND_INPUT_UP, false, CHECK_INPUT_OVERRIDE_FLAG_STORAGE_DEVICE | CHECK_INPUT_OVERRIDE_FLAG_WARNING_MESSAGE)) { if ( m_NameHashArray.GetCount() == 0 && m_iSelectedMenu != ReportLink_UGCReportRoot) return false; int newIndex = m_iSelectedIndex-1; if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam(0); m_Movie.EndMethod(); } if(newIndex < 0) { if (m_iSelectedMenu == ReportLink_UGCReportRoot) { m_iSelectedIndex = m_NumberOfMissionsInArray - 1; } else { m_iSelectedIndex = m_CallbackArray.GetCount() - 1; } } else { m_iSelectedIndex = newIndex; } if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam((int)(BIT(0))); m_Movie.EndMethod(); } CPauseMenu::PlayInputSound(FRONTEND_INPUT_UP); } if (CPauseMenu::CheckInput(FRONTEND_INPUT_DOWN, false, CHECK_INPUT_OVERRIDE_FLAG_STORAGE_DEVICE | CHECK_INPUT_OVERRIDE_FLAG_WARNING_MESSAGE)) { if ( m_NameHashArray.GetCount() == 0 && m_iSelectedMenu != ReportLink_UGCReportRoot) return false; int newIndex = m_iSelectedIndex+1; if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam(0); m_Movie.EndMethod(); } s32 numberOfMenuItems = 0; if (m_iSelectedMenu == ReportLink_UGCReportRoot) { numberOfMenuItems = m_NumberOfMissionsInArray; } else { numberOfMenuItems = m_CallbackArray.GetCount(); } if(newIndex == numberOfMenuItems) { m_iSelectedIndex = 0; } else { m_iSelectedIndex = newIndex; } if(m_Movie.BeginMethod("SET_SLOT_STATE")) { m_Movie.AddParam(m_iSelectedIndex); m_Movie.AddParam((int)(BIT(0))); m_Movie.EndMethod(); } CPauseMenu::PlayInputSound(FRONTEND_INPUT_DOWN); } return false; } void CReportMenu::ShowKeyboard(const char* szTitle) { const int titleSize = 50; static char16 s_TitleForKeyboardUI[titleSize]; static char16 s_InitialValueForKeyboard[MAX_CUSTOM_COMPLAINT_LENGTH]; Utf8ToWide(s_TitleForKeyboardUI, TheText.Get(szTitle), titleSize); Utf8ToWide(s_InitialValueForKeyboard,"", MAX_CUSTOM_COMPLAINT_LENGTH); ioVirtualKeyboard::Params params; params.m_KeyboardType = ioVirtualKeyboard::kTextType_ALPHABET; params.m_MaxLength = MAX_CUSTOM_COMPLAINT_LENGTH; params.m_Title = s_TitleForKeyboardUI; params.m_InitialValue = s_InitialValueForKeyboard; CControlMgr::ShowVirtualKeyboard(params); m_bInSystemKeyboard = true; } void CReportMenu::PopulateMissionPage() { reportDisplayf("CReportMenu::PopulateMissionPage"); // I bet this'll turn out to somehow be incredibly evil... LoadReportMovie(); SetTitle(ATSTRINGHASH("CM_REPORT", 0xE8442257)); if(m_Movie.BeginMethod("CLEAR_ALL_SLOTS")) { m_Movie.EndMethod(); } if (m_NumberOfMissionsInArray == 0) { m_ButtonFlags = static_cast(FE_WARNING_BACK); } // Set the report subtext. if(m_Movie.BeginMethod("SET_SUBTITLE")) { if (m_NumberOfMissionsInArray == 0) { m_Movie.AddParamLocString(ATSTRINGHASH("RP_NO_MISSION", 0x64548BBF)); } else { m_Movie.AddParamLocString(ATSTRINGHASH("RP_SEL_MISSION", 0xbed413e0)); } m_Movie.EndMethod(); } m_bAllowCancel = true; // Arguments 0-5 int i; for(i = 0; (i < m_NumberOfMissionsInArray) && (iSetVisible(false); } } //**************************************************************************************** // UpdateConfirmationScreen - Controls input and navigation between pages. //**************************************************************************************** void CReportMenu::UpdateThankYouScreen() { reportDisplayf("CReportMenu::UpdateThankYouScreen"); int iMenuScreensCount = m_MenuArray.m_ReportLists.GetCount(); m_ButtonFlags = static_cast(FE_WARNING_OK); for (int i = 0; i < iMenuScreensCount; i++) { if (m_MenuArray.m_ReportLists[i].ReportLinkId == ReportLink_Successful) { m_iSelectedMenu = i; m_iSelectedIndex = 0; } } if (m_eMenuType == eReportMenu_CommendMenu) { SetTitle(ATSTRINGHASH("CM_COMMENDED", 0xFFA09734)); } else { SetTitle(ATSTRINGHASH("CM_REPORTED", 0x80483FC9)); } if(m_Movie.BeginMethod("CLEAR_ALL_SLOTS")) { m_Movie.EndMethod(); } // Set the report subtext. if(m_Movie.BeginMethod("SET_SUBTITLE")) { if (m_eMenuType == eReportMenu_CommendMenu) m_Movie.AddParamLocString(ATSTRINGHASH("RP_COM_THANKYOU", 0x9F2B20D2)); else m_Movie.AddParamLocString(ATSTRINGHASH("RP_REP_THANKYOU", 0xE64CF8DC)); m_Movie.EndMethod(); } m_HistoryStack.Reset(); m_HistoryStack.PushAndGrow(ReportLink_None); } //**************************************************************************************** // UpdateConfirmationScreen - Controls input and navigation between pages. //**************************************************************************************** void CReportMenu::UpdateConfirmationScreen() { reportDisplayf("CReportMenu::UpdateConfirmationScreen"); bool bReportingAMission = false; switch (m_eReportType) { case ReportType_PlayerMade_Title : case ReportType_PlayerMade_Description : case ReportType_PlayerMade_Content : case ReportType_PlayerMade_Photo: bReportingAMission = true; break; default : break; } m_NameHashArray.Reset(); int iMenuScreensCount = m_MenuArray.m_ReportLists.GetCount(); m_ButtonFlags = static_cast(FE_WARNING_CONFIRM | FE_WARNING_BACK); for (int i = 0; i < iMenuScreensCount; i++) { if (m_MenuArray.m_ReportLists[i].ReportLinkId == ReportLink_Confirmation) { m_iSelectedMenu = i; m_iSelectedIndex = 0; } } if (m_eMenuType == eReportMenu_CommendMenu) { SetTitle(ATSTRINGHASH("CWS_COMMEND", 0x42546832)); } else { SetTitle(ATSTRINGHASH("CM_REPORT", 0xE8442257)); } if(m_Movie.BeginMethod("CLEAR_ALL_SLOTS")) { m_Movie.EndMethod(); } const char* pGamerTag = m_Name; // Set the report subtext. if (m_Movie.BeginMethod("SET_SUBTITLE")) { char* pOriginalChar; if(m_eMenuType == eReportMenu_CommendMenu) { pOriginalChar = TheText.Get(ATSTRINGHASH("CM_WARN_HDR", 0x1FCC23E4),"CM_WARN_HDR"); } else { if (bReportingAMission) // Maybe I could have checked if (m_eMenuType == eReportMenu_UGCMenu) here { pOriginalChar = TheText.Get(ATSTRINGHASH("RP_WARN_MISS_HDR", 0x3924c267),"RP_WARN_MISS_HDR"); } else { pOriginalChar = TheText.Get(ATSTRINGHASH("RP_WARN_HDR", 0xD5A865A2),"RP_WARN_HDR"); } } char newString[512]; CSubStringWithinMessage substrings[2]; if (bReportingAMission) // Maybe I could have checked if (m_eMenuType == eReportMenu_UGCMenu) here { substrings[0].SetLiteralString(m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentName, CSubStringWithinMessage::LITERAL_STRING_TYPE_FOR_IMMEDIATE_USE, false); } else { substrings[0].SetLiteralString(pGamerTag, CSubStringWithinMessage::LITERAL_STRING_TYPE_FOR_IMMEDIATE_USE, false); } substrings[1].SetTextLabel(FillReportInfo(m_eReportType)); CMessages::InsertNumbersAndSubStringsIntoString( pOriginalChar, NULL,0,substrings,2,newString, 512); m_Movie.AddParamString(newString); m_Movie.EndMethod(); } if(m_Movie.BeginMethod("SET_SLOT")) { m_Movie.AddParam(0); m_Movie.AddParam(0x000000f0); if (m_eMenuType == eReportMenu_CommendMenu) m_Movie.AddParamLocString(ATSTRINGHASH("RP_WARNING", 0x3B37753B)); else m_Movie.AddParamLocString(ATSTRINGHASH("RP_WARNING", 0x3B37753B)); m_Movie.EndMethod(); } } //**************************************************************************************** // ShowReportScreen - Controls input and navigation between pages. //**************************************************************************************** void CReportMenu::ShowReportScreen(u32 uSubtitleHash, bool bAllowCancel) { const int MAX_WARNING_ITEMS = 10; uiAssertf(m_NameHashArray.GetCount() == m_CallbackArray.GetCount(), "Name (%d) and Callback (%d) arrays passed to CustomWarningScreen do not match sizes!", m_NameHashArray.GetCount(), m_CallbackArray.GetCount()); uiAssertf(m_NameHashArray.GetCount() < MAX_WARNING_ITEMS, "Name/Callback array size (%d) is far larger than our allowance of (%d)", m_NameHashArray.GetCount(), MAX_WARNING_ITEMS); // I bet this'll turn out to somehow be incredibly evil... LoadReportMovie(); if (m_eMenuType == eReportMenu_CommendMenu) { SetTitle(ATSTRINGHASH("CWS_COMMEND", 0x42546832)); } else { SetTitle(ATSTRINGHASH("CM_REPORT", 0xE8442257)); } if(m_Movie.BeginMethod("CLEAR_ALL_SLOTS")) { m_Movie.EndMethod(); } // Set the report subtext. if(m_Movie.BeginMethod("SET_SUBTITLE")) { m_Movie.AddParamLocString(uSubtitleHash); m_Movie.EndMethod(); } m_bAllowCancel = bAllowCancel; // Arguments 0-5 int i; for(i = 0; i < m_NameHashArray.GetCount() && iSetVisible(false); } } void CReportMenu::GenerateReport() { if (m_eReportType == ReportType_OffensiveCrewName || m_eReportType == ReportType_OffensiveCrewMotto || m_eReportType == ReportType_OffensiveCrewStatus || m_eReportType == ReportType_OffensiveCrewEmblem ) { GenerateCrewReport(); } else if (m_eReportType == ReportType_Other) { GenerateCustomReport(); } } void CReportMenu::GenerateMPPlayerReport(const netPlayer &fromPlayer, eReportType eReportType) { char szUserId[64] = {0}; char szReportedId[64] = {0}; char szSessionId[64] = {0}; char szOsvcName[8] = {0}; char szPlatform[8] = {0}; s64 sessionId = 0; const rlRosCredentials& cred = rlRos::GetCredentials(NetworkInterface::GetLocalGamerIndex()); if (cred.IsValid()) { sessionId = cred.GetSessionId(); formatf(szSessionId,"%" I64FMT "u",sessionId); } #if __XENON s64 sUserId = fromPlayer.GetGamerInfo().GetGamerHandle().GetXuid(); s64 sReportedId = NetworkInterface::GetLocalGamerHandle().GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u",sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, "xbox"); #elif RSG_DURANGO s64 sUserId = fromPlayer.GetGamerInfo().GetGamerHandle().GetXuid(); s64 sReportedId = NetworkInterface::GetLocalGamerHandle().GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u", sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, rlRosTitleId::GetPlatformName()); #elif RSG_NP formatf(szUserId,64, "%s",fromPlayer.GetGamerInfo().GetGamerHandle().GetNpOnlineId().data ); formatf(szReportedId,64, "%s",NetworkInterface::GetLocalGamerHandle().GetNpOnlineId().data ); safecpy(szOsvcName, "np"); safecpy(szPlatform, rlRosTitleId::GetPlatformName()); #elif RSG_PC s64 sUserId = fromPlayer.GetGamerInfo().GetGamerHandle().GetRockstarId(); s64 sReportedId = NetworkInterface::GetLocalGamerHandle().GetRockstarId(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId,64, "%" I64FMT "u",sReportedId ); sprintf(szOsvcName, "sc"); sprintf(szPlatform, "pc"); #endif u64 uPosixTime = rlGetPosixTime(); const CNetGamePlayer& fromNetGamePlayer = static_cast(fromPlayer); const PlayerAccountId reporterPlayerAccountId = fromNetGamePlayer.GetPlayerAccountId(); const PlayerAccountId playerAccountId = cred.GetPlayerAccountId(); RsonWriter rw; char buff[2096] = {0}; rw.Init(buff, sizeof(buff),RSON_FORMAT_JSON); rw.Begin(NULL, NULL); rw.WriteString("titleName","gta5"); rw.WriteString("osvcname",szOsvcName); rw.WriteString("reporterId",szUserId); rw.WriteInt("reporterPlayerAccountId", reporterPlayerAccountId); rw.WriteString("reporterNickname", fromPlayer.GetGamerInfo().GetName()); rw.WriteString("reportType","GTAV_MP_PLAYER"); if (eReportType == ReportType_VoiceChat_Hate || eReportType == ReportType_TextChat_Hate) rw.WriteString("reportReason", "hate"); else if (eReportType == ReportType_TextChat_Annoying) rw.WriteString("reportReason", "harass"); else if (eReportType == ReportType_Exploit) rw.WriteString("reportReason", "exploit"); else rw.WriteString("reportReason", "gameexploit"); rw.WriteString("reportReasonDesc", "Custom player report."); rw.WriteString("reportMoreInfo", ""); rw.WriteString("status", "new"); rw.WriteInt64("created", uPosixTime); rw.WriteInt64("updated", uPosixTime); rw.Begin("data", NULL); rw.WriteString("id",szReportedId); rw.WriteInt("playerAccountId", playerAccountId); rw.WriteString("gtag", NetworkInterface::GetLocalGamerName()); rw.WriteString("platform", szPlatform); rw.WriteString("sessionId",szSessionId); if (eReportType == ReportType_TextChat_Annoying || eReportType == ReportType_TextChat_Hate) { #if RSG_PC NetworkInterface::GetTextChat().GetChatHistoryWithPlayer(fromPlayer.GetGamerInfo().GetGamerHandle().GetRockstarId(), &rw); #else Assertf(0, "TextChat report not supported on this platform"); #endif } rw.End(); rw.End(); netStatus* NetStatus = GetNetStatus(); if(NetStatus) { rlSocialClub::RegisterComplaint(NetworkInterface::GetLocalGamerIndex(), rw.ToString(), NetStatus); } } void CReportMenu::GenerateCrewReport() { char szOsvcName[8] = {0}; char szUserId[64] = {0}; char szReportType[64] = {0}; char szReportReason[64] = {0}; char szReportMoreInfo[64] = {0}; char szReportReasonDesc[64] = {0}; char szReportedId[64] = {0}; char szCrewId[32] = {0}; char szCrewName[32] = {0}; char szContentId[64] = {0}; char szCrewMotto[RL_CLAN_MOTTO_MAX_CHARS] = {0}; #if __XENON || RSG_DURANGO s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szOsvcName,8, "xbl"); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u",sReportedId ); #elif RSG_NP formatf(szOsvcName,8, "np"); formatf(szUserId,64, "%s",NetworkInterface::GetLocalGamerHandle().GetNpOnlineId().data ); formatf(szReportedId,64, "%s",m_GamerHandle.GetNpOnlineId().data ); #else s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetRockstarId(); s64 sReportedId = m_GamerHandle.GetRockstarId(); formatf(szOsvcName,8, "sc"); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId,64, "%" I64FMT "u",sReportedId ); #endif const rlClanDesc* pClanDesc = CLiveManager::GetNetworkClan().GetPrimaryClan(m_GamerHandle); if (pClanDesc) { formatf(szCrewId,32, "%d", pClanDesc->m_Id); formatf(szCrewName, 32, "%s", pClanDesc->m_ClanName); formatf(szCrewMotto, RL_CLAN_MOTTO_MAX_CHARS, "%s", pClanDesc->m_ClanMotto); } else { #if __ASSERT char ghBuf[RL_MAX_GAMER_HANDLE_CHARS]; uiAssertf(0, "CReportMenu::GenerateCrewReport -- Unable to find rlClanDesc for gamer handle: %s", m_GamerHandle.ToString(ghBuf)); #endif // __ASSERT formatf(szCrewId,32, "%d", 0); formatf(szCrewName, 32, "%s", "--NONE--"); formatf(szCrewMotto, RL_CLAN_MOTTO_MAX_CHARS, "%s", "--NONE--"); } if (m_eReportType == ReportType_OffensiveCrewEmblem) { formatf(szReportType,64,"CREW_ACTIVE_EMBLEM"); formatf(szReportReason,64,"Offensive Emblem"); formatf(szReportMoreInfo,64,"Crew emblem is offensive."); formatf(szReportReasonDesc,64,"Crew emblem is offensive."); formatf(szContentId,64,"CREW.%s.ACTIVE_EMBLEM",szCrewId); } else if (m_eReportType == ReportType_OffensiveCrewMotto) { formatf(szReportType,64,"CREW_MOTTO"); formatf(szReportReason,64,"Offensive Motto"); formatf(szReportMoreInfo,64,"Crew motto is offensive."); formatf(szReportReasonDesc,64,"Crew motto is offensive."); formatf(szContentId,64,"CREW.%s.MOTTO",szCrewId); } else if (m_eReportType == ReportType_OffensiveCrewName) { formatf(szReportType,64,"CREW_NAME"); formatf(szReportReason,64,"Offensive Crew Name"); formatf(szReportMoreInfo,64,"Crew name is offensive."); formatf(szReportReasonDesc,64,"Crew name is offensive."); formatf(szContentId,64,"CREW.%s.NAME",szCrewId); } else { formatf(szReportType,64,"CREW_STATUS"); formatf(szReportReason,64,"Offensive Crew Status"); formatf(szReportMoreInfo,64,"Crew status is offensive."); formatf(szReportReasonDesc,64,"Crew status is offensive."); formatf(szContentId,64,"CREW.%s.STATUS",szCrewId); } u64 uPosixTime = rlGetPosixTime(); const rlRosCredentials& cred = rlRos::GetCredentials(NetworkInterface::GetLocalGamerIndex()); const PlayerAccountId playerAccountId = cred.GetPlayerAccountId(); RsonWriter rw; char buff[2096] = {0}; rw.Init(buff, sizeof(buff), RSON_FORMAT_JSON); rw.Begin(NULL, NULL); rw.WriteString("titleName","gta5"); rw.WriteString("osvcname",szOsvcName); rw.WriteString("reporterId",szUserId); rw.WriteInt("reporterPlayerAccountId", playerAccountId); rw.WriteString("reporterNickname", NetworkInterface::GetLocalGamerName()); rw.WriteString("reportType",szReportType); rw.WriteString("reportReason", szReportReason); rw.WriteString("reportReasonDesc", szReportReasonDesc); rw.WriteString("reportMoreInfo", szReportMoreInfo); rw.WriteString("status", "new"); rw.WriteInt64("created", uPosixTime); rw.WriteInt64("updated", uPosixTime); rw.Begin("data", NULL); rw.WriteString("ContentId", szContentId ); rw.WriteString("gtag", m_Name); rw.WriteString("crewid", szCrewId); rw.WriteString("crewname", szCrewName); rw.WriteString("motto", szCrewMotto); rw.WriteString("ipForm",""); rw.End(); rw.End(); rlSocialClub::RegisterComplaint(NetworkInterface::GetLocalGamerIndex(), rw.ToString(), &m_NetStatus); if (!m_NetStatusCallback) { m_NetStatusCallback = rage_new datCallback(MFA(CReportMenu::UpdateThankYouScreen),(datBase*)this); } CContextMenuHelper::SetLastReportTimer(sysTimer::GetSystemMsTime()); } void CReportMenu::GenerateMissionReport() { reportDisplayf("CReportMenu::GenerateMissionReport for %s %s", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentId.c_str(), m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentName.c_str()); char szUserId[64] = {0}; char szReportedId[64] = {0}; char szSessionId[64] = {0}; char szOsvcName[8] = {0}; char szPlatform[8] = {0}; // char szAuthorId[64] = {0}; char szReportType[64] = {0}; if (m_eReportType == ReportType_PlayerMade_Title) { formatf(szReportType,64,"JOB_TITLE"); } else if (m_eReportType == ReportType_PlayerMade_Description) { formatf(szReportType,64,"JOB_DESCRIPTION"); } else if (m_eReportType == ReportType_PlayerMade_Photo) { formatf(szReportType,64,"JOB_PHOTO"); } else { formatf(szReportType,64,"GTAV_UGC_CONTENT"); } s64 sessionId = 0; const rlRosCredentials& cred = rlRos::GetCredentials(NetworkInterface::GetLocalGamerIndex()); if (cred.IsValid()) { sessionId = cred.GetSessionId(); formatf(szSessionId,"%" I64FMT "u",sessionId); } #if __XENON s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u",sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, "xbox"); #elif RSG_NP formatf(szUserId,64, "%s",NetworkInterface::GetLocalGamerHandle().GetNpOnlineId().data ); formatf(szReportedId,64, "%s",m_GamerHandle.GetNpOnlineId().data ); safecpy(szOsvcName, "np"); safecpy(szPlatform, rlRosTitleId::GetPlatformName()); #elif RSG_DURANGO s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u", sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, rlRosTitleId::GetPlatformName()); #elif RSG_PC s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetRockstarId(); s64 sReportedId = m_GamerHandle.GetRockstarId(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId,64, "%" I64FMT "u",sReportedId ); sprintf(szOsvcName, "sc"); sprintf(szPlatform, "pc"); #endif u64 uPosixTime = rlGetPosixTime(); RsonWriter rw; char buff[2096] = {0}; rw.Init(buff, sizeof(buff),RSON_FORMAT_JSON); rw.Begin(NULL, NULL); rw.WriteString("titleName","gta5"); rw.WriteString("osvcname",szOsvcName); rw.WriteString("reporterId",szUserId); rw.WriteInt("reporterPlayerAccountId", cred.GetPlayerAccountId()); rw.WriteString("reporterNickname", NetworkInterface::GetLocalGamerName()); rw.WriteString("reportType",szReportType); rw.WriteString("reportReason", "harass"); rw.WriteString("reportReasonDesc", "Custom player report."); if (m_eReportType == ReportType_PlayerMade_Content ) rw.WriteString("reportMoreInfo", m_szCustomReportInfo); else rw.WriteString("reportMoreInfo", ""); rw.WriteString("status", "new"); rw.WriteInt64("created",uPosixTime); rw.WriteInt64("updated",uPosixTime); rw.Begin("data", NULL); reportAssertf(m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentId.length() > 0, "CReportMenu::GenerateMissionReport - Empty m_ContentId"); reportAssertf(m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentName.length() > 0, "CReportMenu::GenerateMissionReport - Empty m_ContentName"); reportAssertf(m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentUserName.length() > 0, "CReportMenu::GenerateMissionReport - Empty m_ContentUserName"); reportAssertf(m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentUserId.length() > 0, "CReportMenu::GenerateMissionReport - Empty m_ContentUserId"); rw.WriteString("ContentId", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentId); rw.WriteString("ContentType","gta5mission"); rw.WriteString("ContentName", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentName); rw.WriteString("AuthorNickname", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentUserName); // rw.WriteString("AuthorId", szAuthorId); rw.WriteString("AuthorId", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentRockstarId); rw.WriteString("AuthorGamerTag", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentUserName); rw.WriteString("AuthorUserId", m_ArrayOfMissions[m_iSelectedMissionIndex].m_ContentUserId); rw.WriteString("sessionId",szSessionId); rw.WriteString("platform",szPlatform); rw.End(); rw.End(); rlSocialClub::RegisterComplaint(NetworkInterface::GetLocalGamerIndex(), rw.ToString(), &m_NetStatus); if (!m_NetStatusCallback) { m_NetStatusCallback = rage_new datCallback(MFA(CReportMenu::UpdateThankYouScreen),(datBase*)this); } } void CReportMenu::GenerateCustomReport() { char szUserId[64] = {0}; char szReportedId[64] = {0}; char szSessionId[64] = {0}; char szOsvcName[8] = {0}; char szPlatform[8] = {0}; s64 sessionId = 0; const rlRosCredentials& cred = rlRos::GetCredentials(NetworkInterface::GetLocalGamerIndex()); if (cred.IsValid()) { sessionId = cred.GetSessionId(); formatf(szSessionId,"%" I64FMT "u",sessionId); } #if __XENON s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u",sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, "xbox"); #elif RSG_DURANGO s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId, 64, "%" I64FMT "u", sReportedId ); formatf(szOsvcName,8, "xbl"); formatf(szPlatform, 8, rlRosTitleId::GetPlatformName()); #elif RSG_NP //s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetXuid(); //s64 sReportedId = m_GamerHandle.GetXuid(); formatf(szUserId,64, "%" I64FMT "u",NetworkInterface::GetLocalGamerHandle().GetNpOnlineId().data ); formatf(szReportedId,64, "%" I64FMT "u",m_GamerHandle.GetNpOnlineId().data ); formatf(szOsvcName,8, "np"); formatf(szPlatform,8, rlRosTitleId::GetPlatformName()); #elif RSG_PC s64 sUserId = NetworkInterface::GetLocalGamerHandle().GetRockstarId(); s64 sReportedId = m_GamerHandle.GetRockstarId(); formatf(szUserId,64, "%" I64FMT "u",sUserId ); formatf(szReportedId,64, "%" I64FMT "u",sReportedId ); formatf(szOsvcName, 8, "sc"); formatf(szPlatform, 8, "pc"); #endif u64 uPosixTime = rlGetPosixTime(); RsonWriter rw; char buff[2096] = {0}; rw.Init(buff, sizeof(buff),RSON_FORMAT_JSON); rw.Begin(NULL, NULL); rw.WriteString("titleName","gta5"); rw.WriteString("osvcname",szOsvcName); rw.WriteString("reporterId",szUserId); rw.WriteInt("reporterPlayerAccountId", cred.GetPlayerAccountId()); rw.WriteString("reporterNickname", NetworkInterface::GetLocalGamerName()); rw.WriteString("reportType","GTAV_MP_PLAYER"); rw.WriteString("reportReason", "harass"); rw.WriteString("reportReasonDesc", "Custom player report."); rw.WriteString("reportMoreInfo", m_szCustomReportInfo); rw.WriteString("status", "new"); rw.WriteInt64("created",uPosixTime); rw.WriteInt64("updated",uPosixTime); rw.Begin("data", NULL); rw.WriteString("id",szReportedId); rw.WriteString("gtag", m_Name); rw.WriteString("platform",szPlatform); rw.WriteString("sessionId",szSessionId); rw.End(); rw.End(); rlSocialClub::RegisterComplaint(NetworkInterface::GetLocalGamerIndex(), rw.ToString(), &m_NetStatus); if (!m_NetStatusCallback) { m_NetStatusCallback = rage_new datCallback(MFA(CReportMenu::UpdateThankYouScreen),(datBase*)this); } CContextMenuHelper::SetLastReportTimer(sysTimer::GetSystemMsTime()); } const char* CReportMenu::FillReportInfo(eReportType eReportType) { switch(eReportType) { case ReportType_None: return "SM_LCNONE"; case ReportType_Griefing: return "CWS_GRIEFING"; case ReportType_OffensiveLanguage: return "RP_OFFENSIVE_LANGUAGE"; case ReportType_OffensiveLicensePlate: return "RP_OFFENSIVE_PLATE"; case ReportType_Exploit: return "RP_EXPLOITS"; case ReportType_GameExploit: return "RP_GAME_EXPLOIT"; case ReportType_OffensiveUGC: return "RP_OFFENSIVE_UGC"; case ReportType_Other: return "RP_NET_OTHER"; case ReportType_OffensiveCrewName: return "RP_CREW_NAME"; case ReportType_OffensiveCrewMotto: return "RP_MOTTO"; case ReportType_OffensiveCrewStatus: return "RP_STATUS"; case ReportType_OffensiveCrewEmblem: return "RP_EMBLEM"; case ReportType_PlayerMade_Title: return "RP_PLAYER_MADE_TITLE"; case ReportType_PlayerMade_Description: return "RP_PLAYER_MADE_DESC"; case ReportType_PlayerMade_Photo: return "RP_PLAYER_MADE_PHOTO"; case ReportType_PlayerMade_Content: return "RP_PLAYER_MADE_CONTENT"; case ReportType_VoiceChat_Annoying: return "RP_VC_ANNOY"; case ReportType_VoiceChat_Hate: return "RP_VC_HATE"; case ReportType_TextChat_Annoying: return "RP_TC_ANNOY"; case ReportType_TextChat_Hate: return "RP_TC_HATE"; case ReportType_Friendly: return "CWS_FRIENDLY"; case ReportType_Helpful: return "CWS_HELPFUL"; default: return "Undefined"; } } void CReportMenu::SetTitle(u32 uTitleHash) { // Set the report title. if(m_Movie.BeginMethod("SET_TITLE")) { m_Movie.AddParamLocString(uTitleHash); m_Movie.EndMethod(); } } void CReportMenu::OnRecentMissionsContentResult(const int UNUSED_PARAM(nIndex), const char* szContentID, const rlUgcMetadata* pMetadata, const rlUgcRatings* UNUSED_PARAM(pRatings), const char* UNUSED_PARAM(szStatsJSON), const unsigned UNUSED_PARAM(nPlayers), const unsigned UNUSED_PARAM(nPlayerIndex), const rlUgcPlayer* UNUSED_PARAM(pPlayer)) { if (m_NumberOfMissionsInArray < MAX_WARNING_MISSIONS) { if (reportVerifyf(pMetadata, "CReportMenu::OnRecentMissionsContentResult - pMetadata is NULL")) { switch (pMetadata->GetCategory()) { case RLUGC_CATEGORY_ROCKSTAR_CREATED : reportDisplayf("CReportMenu::OnRecentMissionsContentResult - I've not added %s %s to the array of recent missions because it is ROCKSTAR_CREATED", szContentID, pMetadata->GetContentName()); break; case RLUGC_CATEGORY_ROCKSTAR_CREATED_CANDIDATE : reportDisplayf("CReportMenu::OnRecentMissionsContentResult - I've not added %s %s to the array of recent missions because it is ROCKSTAR_CREATED_CANDIDATE", szContentID, pMetadata->GetContentName()); break; // Bug 1718433 requested that Rockstar Verified jobs also appear in the Report Job list // case RLUGC_CATEGORY_ROCKSTAR_VERIFIED : // reportDisplayf("CReportMenu::OnRecentMissionsContentResult - I've not added %s %s to the array of recent missions because it is ROCKSTAR_VERIFIED", szContentID, pMetadata->GetContentName()); // break; default : { if (strcmp(NetworkInterface::GetActiveGamerInfo()->GetName(),pMetadata->GetUsername()) != 0) { formatf(m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentRockstarId, 64, "%" I64FMT "u", pMetadata->GetRockstarId()); m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentId = szContentID; m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentName = pMetadata->GetContentName(); m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentUserName = pMetadata->GetUsername(); m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentUserId = pMetadata->GetUserId(); reportAssertf(m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentId.length() > 0, "CReportMenu::OnRecentMissionsContentResult - Empty m_ContentId"); reportAssertf(m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentName.length() > 0, "CReportMenu::OnRecentMissionsContentResult - Empty m_ContentName"); reportAssertf(m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentUserName.length() > 0, "CReportMenu::OnRecentMissionsContentResult - Empty m_ContentUserName"); reportAssertf(m_ArrayOfMissions[m_NumberOfMissionsInArray].m_ContentUserId.length() > 0, "CReportMenu::OnRecentMissionsContentResult - Empty m_ContentUserId"); reportDisplayf("CReportMenu::OnRecentMissionsContentResult - Added content. %u Content Id: %s, Content Name: %s, User Id: %s, User Name: %s, Total: %u", m_NumberOfMissionsInArray, szContentID, pMetadata->GetContentName(), pMetadata->GetUserId(), pMetadata->GetUsername(), m_nContentTotal); m_NumberOfMissionsInArray++; } } break; } } } } netStatus* CReportMenu::GetNetStatus() { for(int i=0; i