the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 490 lines 17 kB view raw
1#include "stdafx.h" 2 3#include "Orbis_NPToolkit.h" 4#include "Orbis\ps4__np_conf.h" 5#include "Orbis/Network/SonyCommerce_Orbis.h" 6 7// #define NP_TITLE_ID "CUSA00265_00" 8// #define NP_TITLE_SECRET_HEX "c37e30fa1f7fd29e3534834d62781143ae29aa7b51d02320e7aa0b45116ad600e4d309e8431bc37977d98b8db480e721876e7d736e11fd906778c0033bbb6370903477b1dc1e65106afc62007a5feee3158844d721b88c3f4bff2e56417b6910cedfdec78b130d2e0dd35a35a9e2ae31d5889f9398c1d62b52a3630bb03faa5b" 9// #define CLIENT_ID_FOR_SAMPLE "c8c483e7-f0b4-420b-877b-307fcb4c3cdc" 10 11//#define _USE_STANDARD_ALLOC 12 13// Singleton 14OrbisNPToolkit NPToolkit; 15sce::Toolkit::NP::Utilities::Future< sce::Toolkit::NP::NpSessionInformation > OrbisNPToolkit::sm_createJoinFuture; 16sce::Toolkit::NP::NpSessionInformation OrbisNPToolkit::m_currentSessionInfo; 17sce::Toolkit::NP::Utilities::Future<sce::Toolkit::NP::MessageAttachment> OrbisNPToolkit::m_messageData; 18 19 20void OrbisNPToolkit::presenceCallback( const sce::Toolkit::NP::Event& event ) 21{ 22 switch(event.event) 23 { 24 case sce::Toolkit::NP::Event::presenceSet: 25 app.DebugPrintf("presenceSet Successfully\n"); 26 break; 27 case sce::Toolkit::NP::Event::presenceSetFailed: 28 app.DebugPrintf("presenceSetFailed event received = 0x%x\n", event.returnCode); 29 SQRNetworkManager_Orbis::SetPresenceFailedCallback(); 30 break; 31 default: 32 break; 33 } 34} 35 36void OrbisNPToolkit::coreCallback( const sce::Toolkit::NP::Event& event ) 37{ 38 switch (event.event) 39 { 40 case sce::Toolkit::NP::Event::enetDown: 41 app.DebugPrintf("Online: Received core callback: Network down \n"); 42 ProfileManager.SetNetworkStatus(false); 43 break; 44 case sce::Toolkit::NP::Event::enetUp: 45 app.DebugPrintf("Online: Received core callback: Network up \n"); 46 ProfileManager.SetNetworkStatus(true); 47 break; 48 case sce::Toolkit::NP::Event::loggedIn: 49 app.DebugPrintf("Online: Received core callback: PSN sign in \n"); 50 assert(event.userInformation.state == SCE_NP_STATE_SIGNED_IN); 51 ProfileManager.SignedInPSNStateCallback(event.userInformation.userId, event.userInformation.state, &event.userInformation.npId); 52 break; 53 case sce::Toolkit::NP::Event::loggedOut: 54 app.DebugPrintf("Online: Received core callback: PSN sign out \n"); 55 assert(event.userInformation.state == SCE_NP_STATE_SIGNED_OUT); 56 ProfileManager.SignedInPSNStateCallback(event.userInformation.userId, event.userInformation.state, &event.userInformation.npId); 57 break; 58 default: 59 app.DebugPrintf("Online: Received core callback: event Num: %d \n", event.event); 60 break; 61 } 62} 63 64void OrbisNPToolkit::sceNpToolkitCallback( const sce::Toolkit::NP::Event& event) 65{ 66 switch(event.service) 67 { 68 case sce::Toolkit::NP::ServiceType::core: 69 coreCallback(event); 70 break; 71// case sce::Toolkit::NP::ServiceType::netInfo: 72// Menu::NetInfo::sceNpToolkitCallback(event); 73// break; 74 case sce::Toolkit::NP::ServiceType::sessions: 75 sessionsCallback(event); 76 break; 77// case sce::Toolkit::NP::ServiceType::tss: 78// Menu::Tss::sceNpToolkitCallback(event); 79// break; 80// case sce::Toolkit::NP::ServiceType::ranking: 81// Menu::Ranking::sceNpToolkitCallback(event); 82// break; 83// case sce::Toolkit::NP::ServiceType::tus: 84// Menu::Tus::sceNpToolkitCallback(event); 85// break; 86// case sce::Toolkit::NP::ServiceType::profile: 87// Menu::Profile::sceNpToolkitCallback(event); 88// break; 89// case sce::Toolkit::NP::ServiceType::friends: 90// Menu::Friends::sceNpToolkitCallback(event); 91// break; 92// case sce::Toolkit::NP::ServiceType::auth: 93// Menu::Auth::sceNpToolkitCallback(event); 94// break; 95 case sce::Toolkit::NP::ServiceType::trophy: 96 ProfileManager.trophySystemCallback(event); 97 break; 98 case sce::Toolkit::NP::ServiceType::messaging: 99 messagingCallback(event); 100 break; 101// case sce::Toolkit::NP::ServiceType::inGameMessage: 102// Menu::Messaging::sceNpToolkitCallback(event); 103// break; 104 105 case sce::Toolkit::NP::ServiceType::commerce: 106 SonyCommerce_Orbis::commerce2Handler(event); 107 break; 108 case sce::Toolkit::NP::ServiceType::presence: 109 presenceCallback(event); 110 break; 111// case sce::Toolkit::NP::ServiceType::wordFilter: 112// Menu::WordFilter::sceNpToolkitCallback(event); 113// break; 114// case sce::Toolkit::NP::ServiceType::sns: 115// Menu::Sns::sceNpToolkitCallback(event); 116// break; 117 118 case sce::Toolkit::NP::ServiceType::gameCustomData: 119 gameCustomDataCallback(event); 120 default: 121 break; 122 } 123} 124 125 126 127void OrbisNPToolkit::sessionsCallback( const sce::Toolkit::NP::Event& event) 128{ 129 switch(event.event) 130 { 131 case sce::Toolkit::NP::Event::npSessionCreateResult: ///< An event generated when the %Np session creation process has been completed. 132 app.DebugPrintf("npSessionCreateResult"); 133 if(sm_createJoinFuture.hasResult()) 134 { 135 app.DebugPrintf("Session Created Successfully\n"); 136 m_currentSessionInfo = *sm_createJoinFuture.get(); 137 } 138 else 139 { 140 app.DebugPrintf("Session Creation Failed 0x%x\n",sm_createJoinFuture.getError()); 141 } 142 sm_createJoinFuture.reset(); 143 break; 144 case sce::Toolkit::NP::Event::npSessionJoinResult: ///< An event generated when the join %Np session process has been completed. 145 app.DebugPrintf("npSessionJoinResult"); 146 if(sm_createJoinFuture.hasResult()) 147 { 148 app.DebugPrintf("Session joined successfully\n"); 149 m_currentSessionInfo = *sm_createJoinFuture.get(); 150 } 151 else 152 { 153 app.DebugPrintf("Session join Failed 0x%x\n",sm_createJoinFuture.getError()); 154 } 155 sm_createJoinFuture.reset(); 156 break; 157 case sce::Toolkit::NP::Event::npSessionError: ///< An event generated when there was error performing the current %Np session process. 158 app.DebugPrintf("npSessionError"); 159 break; 160 case sce::Toolkit::NP::Event::npSessionLeaveResult: ///< An event generated when the user has left the current %Np session. 161 app.DebugPrintf("npSessionLeaveResult"); 162 break; 163 case sce::Toolkit::NP::Event::npSessionModified: ///< An event generated when the %Np session has been modified. 164 app.DebugPrintf("npSessionModified"); 165 break; 166 case sce::Toolkit::NP::Event::npSessionUpdateResult: ///< An event generated when the %Np session has been updated. 167 app.DebugPrintf("npSessionUpdateResult"); 168 break; 169 case sce::Toolkit::NP::Event::npSessionGetInfoResult: ///< An event generated when the %Np session info has been retrieved. 170 app.DebugPrintf("npSessionGetInfoResult"); 171 break; 172 case sce::Toolkit::NP::Event::npSessionGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. 173 app.DebugPrintf("npSessionGetInfoListResult"); 174 break; 175 case sce::Toolkit::NP::Event::npSessionGetSessionDataResult: ///< An event generated when the %Np session data has been retrieved. 176 app.DebugPrintf("npSessionGetSessionDataResult"); 177 break; 178 case sce::Toolkit::NP::Event::npSessionSearchResult: ///< An event generated when the %Np session search request has been completed. 179 app.DebugPrintf("npSessionSearchResult"); 180 break; 181 case sce::Toolkit::NP::Event::npSessionInviteNotification: ///< An event generated when the %Np session push notification is received. 182 app.DebugPrintf("npSessionInviteNotification"); 183 break; 184 case sce::Toolkit::NP::Event::npSessionInviteGetInfoResult: ///< An event generated when the %Np session info has been retrieved. 185 app.DebugPrintf("npSessionInviteGetInfoResult"); 186 break; 187 case sce::Toolkit::NP::Event::npSessionInviteGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. 188 app.DebugPrintf("npSessionInviteGetInfoListResult"); 189 break; 190 case sce::Toolkit::NP::Event::npSessionInviteGetDataResult: ///< An event generated when the %Np session data has been retrieved. 191 app.DebugPrintf("npSessionInviteGetDataResult"); 192 break; 193 default: 194 assert(0); 195 break; 196 } 197 198} 199 200void OrbisNPToolkit::gameCustomDataCallback( const sce::Toolkit::NP::Event& event) 201{ 202 switch(event.event) 203 { 204 205 case sce::Toolkit::NP::Event::gameCustomDataItemListResult: 206 app.DebugPrintf("gameCustomDataItemListResult"); 207 break; 208 case sce::Toolkit::NP::Event::gameCustomDataGameDataResult: 209 app.DebugPrintf("gameCustomDataGameDataResult"); 210 if(m_messageData.hasResult()) 211 { 212 SQRNetworkManager_Orbis::GetInviteDataAndProcess(m_messageData.get()); 213 } 214 else 215 { 216 app.DebugPrintf("gameCustomDataMessageResult error 0x%08x\n", m_messageData.getError()); 217 218 UINT uiIDA[1] = { IDS_OK }; 219 220 switch(m_messageData.getError()) 221 { 222 case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: 223 case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: 224 app.ShowPatchAvailableError(); 225 break; 226 case SCE_NP_ERROR_AGE_RESTRICTION: 227 default: 228 ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1); 229 break; 230 } 231 } 232 break; 233 case sce::Toolkit::NP::Event::gameCustomDataMessageResult: 234 app.DebugPrintf("gameCustomDataMessageResult"); 235 break; 236 case sce::Toolkit::NP::Event::gameCustomDataSetUseFlagResult: 237 app.DebugPrintf("gameCustomDataSetUseFlagResult"); 238 break; 239 case sce::Toolkit::NP::Event::gameCustomDataGameThumbnailResult: 240 app.DebugPrintf("gameCustomDataGameThumbnailResult"); 241 break; 242 case sce::Toolkit::NP::Event::messageError: 243 app.DebugPrintf("messageError : 0x%08x\n", event.returnCode); 244 assert(0); 245 break; 246 default: 247 assert(0); 248 break; 249 } 250} 251 252void OrbisNPToolkit::messagingCallback( const sce::Toolkit::NP::Event& event) 253{ 254 switch(event.event) 255 { 256 case sce::Toolkit::NP::Event::messageSent: ///< An event generated when a message has been sent. 257 app.DebugPrintf("sce::Toolkit::NP::Event::messageSent\n"); 258 SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; 259 break; 260 case sce::Toolkit::NP::Event::messageError: ///< An event generated when a message failed to be received or sent. 261 app.DebugPrintf("sce::Toolkit::NP::Event::messageError\n"); 262 SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; 263 break; 264 case sce::Toolkit::NP::Event::messageDialogTerminated: ///< An event generated when a message dialog box is terminated. 265 app.DebugPrintf("sce::Toolkit::NP::Event::messageDialogTerminated\n"); 266 SQRNetworkManager_Orbis::s_bInviteDialogRunning = false; 267 break; 268 //case sce::Toolkit::NP::Event::messageRetrieved: ///< An event generated when a message attachment has been retrieved. 269 //case sce::Toolkit::NP::Event::messageInGameDataReceived: ///< An event generated when in-game data is received. 270 //case sce::Toolkit::NP::Event::messageInGameDataRetrievalDone: ///< An event generated when in-game data retrieval is complete. 271 272 // case sce::Toolkit::NP::Event::messageAttachmentReceived: ///< An event generated when a message with a data attachment has been received. 273 // case sce::Toolkit::NP::Event::messageAttachmentOpened: ///< An event generated when a message with a data attachment has been opened (and the sysutil GUI is closed). 274 // case sce::Toolkit::NP::Event::messageInviteReceived: ///< An event generated when a message with an invite has been received. 275 // case sce::Toolkit::NP::Event::messageInviteAccepted: ///< An event generated when a message with an invite has been accepted via ToolkitNp (and the sysutil GUI is closed). 276 } 277} 278 279static uint8_t hexCharToUint(char ch) 280{ 281 uint8_t val = 0; 282 283 if ( isdigit(ch) ){ 284 val = (ch - '0'); 285 } 286 else if ( isupper(ch) ){ 287 val = (ch - 'A' + 10); 288 } 289 else{ 290 val = (ch - 'a' + 10); 291 } 292 293 return val; 294} 295 296void hexStrToBin( 297 const char *pHexStr, 298 uint8_t *pBinBuf, 299 size_t binBufSize 300 ) 301{ 302 uint8_t val = 0; 303 int hexStrLen = strlen(pHexStr); 304 305 int binOffset = 0; 306 for (int i = 0; i < hexStrLen; i++) { 307 val |= hexCharToUint(*(pHexStr + i)); 308 if (i % 2 == 0) { 309 val <<= 4; 310 } 311 else { 312 if (pBinBuf != NULL && binOffset < binBufSize) { 313 memcpy(pBinBuf + binOffset, &val, 1); 314 val = 0; 315 } 316 binOffset++; 317 } 318 } 319 320 if (val != 0 && pBinBuf != NULL && binOffset < binBufSize) { 321 memcpy(pBinBuf + binOffset, &val, 1); 322 } 323 324 return; 325} 326 327void OrbisNPToolkit::init() 328{ 329// MenuApp menuApp; 330 331 sce::Toolkit::NP::NpTitleId nptTitleId; 332 nptTitleId.setTitleSecret(*SQRNetworkManager_Orbis::GetSceNpTitleId(), *SQRNetworkManager_Orbis::GetSceNpTitleSecret()); 333 sce::Toolkit::NP::CommunicationId commsIds(s_npCommunicationId, s_npCommunicationPassphrase, s_npCommunicationSignature); 334 sce::Toolkit::NP::Parameters params(sceNpToolkitCallback,nptTitleId); 335 336 337 int ret = sce::Toolkit::NP::Interface::init(params); 338 if (ret != SCE_OK) 339 { 340 app.DebugPrintf("Failed to initialize NP Toolkit Library : 0x%x\n", ret); 341 assert(0); 342 } 343 344 345 ret = sce::Toolkit::NP::Interface::registerNpCommsId(commsIds, sce::Toolkit::NP::matching); 346 if (ret < 0) 347 { 348 app.DebugPrintf("Failed to register TSS Comms ID : 0x%x\n", ret); 349 assert(0); 350 } 351 352 // Get network status and inform library 353 sce::Toolkit::NP::Utilities::Future<sce::Toolkit::NP::NetStateBasic> netStateFuture = sce::Toolkit::NP::Utilities::Future<sce::Toolkit::NP::NetStateBasic>(); 354 sce::Toolkit::NP::NetInfo::Interface::getNetInfo(&netStateFuture); 355 356 // Wait for the net state (< 5ms) 357 while (netStateFuture.isBusy()) 358 { 359 Sleep(1); 360 } 361 362 if (netStateFuture.hasResult()) 363 { 364 sce::Toolkit::NP::NetStateBasic *netState = netStateFuture.get(); 365 ProfileManager.SetNetworkStatus(netState->connectionStatus == SCE_NET_CTL_STATE_IPOBTAINED); 366 } 367 else 368 { 369 // Error message means we're disconnected 370 ProfileManager.SetNetworkStatus(false); 371 } 372 373// // Register Client ID for Auth 374// ret = sce::Toolkit::NP::Interface::registerClientId(CLIENT_ID_FOR_SAMPLE); 375// if (ret < 0) 376// { 377// app.DebugPrintf("Failed to register Auth Client ID : 0x%x\n", ret); 378// assert(0); 379// } 380 381} 382 383 384 385void OrbisNPToolkit::createNPSession() 386{ 387#define CURRENT_SESSION_ATTR_NUMS 5 388#define SESSION_IMAGE_PATH "/app0/orbis/session_image.png" 389#define SESSION_STATUS "Minecraft online game (this text needs defined and localised)" 390#define SESSION_NAME "Minecraft(this text needs defined and localised)" 391 392 static const int maxSlots = 8; 393 394 SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; 395 int ret = sceUserServiceGetInitialUser(&userId); 396 if( ret < 0 ) 397 { 398 app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); 399 } 400 401 sce::Toolkit::NP::CreateNpSessionRequest createSessionRequest; 402 memset(&createSessionRequest,0,sizeof(createSessionRequest)); 403 strncpy(createSessionRequest.sessionName,SESSION_NAME,strlen(SESSION_NAME)); 404 createSessionRequest.sessionTypeFlag = SCE_TOOLKIT_NP_CREATE_SESSION_TYPE_PUBLIC; 405 createSessionRequest.maxSlots = maxSlots; 406 strncpy(createSessionRequest.sessionImgPath,SESSION_IMAGE_PATH,strlen(SESSION_IMAGE_PATH)); 407 strncpy(createSessionRequest.sessionStatus,SESSION_STATUS,strlen(SESSION_STATUS)); 408 createSessionRequest.userInfo.userId = userId; 409 char test[3] = {'R','K','B'}; 410 createSessionRequest.sessionData= test; 411 createSessionRequest.sessionDataSize = 3; 412 ret = sce::Toolkit::NP::Sessions::Interface::create(&createSessionRequest,&sm_createJoinFuture); 413} 414 415 416void OrbisNPToolkit::joinNPSession() 417{ 418 SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; 419 int ret = sceUserServiceGetInitialUser(&userId); 420 if( ret < 0 ) 421 { 422 app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); 423 } 424 425 sce::Toolkit::NP::JoinNpSessionRequest joinSessionRequest; 426 memset(&joinSessionRequest,0,sizeof(joinSessionRequest)); 427 // still to sort this out 428 ORBIS_STUBBED; 429} 430 431void OrbisNPToolkit::leaveNPSession() 432{ 433 434} 435 436 437 438void OrbisNPToolkit::getMessageData(SceNpGameCustomDataEventParam* paramData) 439{ 440 441 sce::Toolkit::NP::GameCustomDataGameDataRequest req; 442 SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; 443 int ret = sceUserServiceGetInitialUser(&userId); 444 if( ret < 0 ) { 445 //Error handling 446 } 447 448 req.itemId = paramData->itemId; 449 req.userInfo.userId = userId; 450 ret = sce::Toolkit::NP::GameCustomData::Interface::getGameData(&req, &m_messageData); 451 if( ret < 0 ) { 452 //Error handling 453 } else { 454 //Error handling 455 } 456 457 458// 459// 460// sce::Toolkit::NP::GameDataRequest req; 461// SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; 462// int ret = sceUserServiceGetInitialUser(&userId); 463// if( ret < 0 ) { 464// //Error handling 465// } 466// 467// req.itemId = ItemID ; 468// req.userInfo.userId = userId; 469// sce::Toolkit::NP::Utilities::Future<sce::Toolkit::NP::MessageAttachment> actualMessage; 470// ret = sce::Toolkit::NP::GameCustomData::Interface::getGameData(&req,&actualMessage,false); 471// if( ret < 0 ) { 472// //Error handling 473// } else { 474// //Error handling 475// } 476// 477// 478// 479// 480// 481// 482// 483// 484// app.DebugPrintf("Session Invitation \n"); 485// sce::Toolkit::NP::ReceiveMessageRequest request; 486// request.eventParamData = paramData; 487// request.msgType = SCE_TOOLKIT_NP_MESSAGE_TYPE_CUSTOM_DATA; 488// sceUserServiceGetInitialUser(&request.userInfo.userId); 489// sce::Toolkit::NP::Messaging::Interface::retrieveMessageAttachmentFromEvent(&request,&m_messageData); 490}