the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}