diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 68f174837d..922c763a63 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -974,6 +974,22 @@ error_code sceNpBasicSendMessage(vm::cptr to, vm::cptr data, u32 return SCE_NP_BASIC_ERROR_EXCEEDS_MAX; } + if (nph.get_psn_status() != SCE_NP_MANAGER_STATUS_ONLINE) + { + return not_an_error(SCE_NP_BASIC_ERROR_NOT_CONNECTED); + } + + message_data msg_data = { + .commId = nph.get_basic_handler_context(), + .msgId = 0, + .mainType = SCE_NP_BASIC_MESSAGE_MAIN_TYPE_GENERAL, + .subType = SCE_NP_BASIC_MESSAGE_GENERAL_SUBTYPE_NONE, + .msgFeatures = {}}; + std::set npids; + npids.insert(std::string(to->handle.data)); + + nph.send_message(msg_data, npids); + return CELL_OK; } diff --git a/rpcs3/Emu/NP/np_handler.cpp b/rpcs3/Emu/NP/np_handler.cpp index 9e62704e67..c530af806d 100644 --- a/rpcs3/Emu/NP/np_handler.cpp +++ b/rpcs3/Emu/NP/np_handler.cpp @@ -970,6 +970,11 @@ namespace np } } + void np_handler::send_message(const message_data& msg_data, const std::set& npids) + { + get_rpcn()->send_message(msg_data, npids); + } + void np_handler::operator()() { if (g_cfg.net.psn_status != np_psn_status::psn_rpcn) @@ -1100,6 +1105,7 @@ namespace np switch (msg->second.mainType) { case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_DATA_ATTACHMENT: + case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_URL_ATTACHMENT: event = SCE_NP_BASIC_EVENT_INCOMING_ATTACHMENT; break; case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE: @@ -1109,15 +1115,16 @@ namespace np event = (msg->second.msgFeatures & SCE_NP_BASIC_MESSAGE_FEATURES_BOOTABLE) ? SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_CUSTOM_DATA_MESSAGE : SCE_NP_BASIC_EVENT_INCOMING_CUSTOM_DATA_MESSAGE; break; case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_GENERAL: - case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_ADD_FRIEND: - case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_URL_ATTACHMENT: event = SCE_NP_BASIC_EVENT_MESSAGE; + break; + case SCE_NP_BASIC_MESSAGE_MAIN_TYPE_ADD_FRIEND: default: continue; } basic_event to_add{}; to_add.event = event; + to_add.data = std::move(msg->second.data); strcpy_trunc(to_add.from.userId.handle.data, msg->first); strcpy_trunc(to_add.from.name.data, msg->first); @@ -1319,7 +1326,7 @@ namespace np return SCE_NP_BASIC_ERROR_NOT_CONNECTED; } - auto friend_infos = rpcn->get_friend_presence_by_npid(std::string(reinterpret_cast(&npid.handle.data[0]))); + auto friend_infos = rpcn->get_friend_presence_by_npid(std::string(npid.handle.data)); if (!friend_infos) { return SCE_NP_BASIC_ERROR_INVALID_ARGUMENT; diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index aadb759430..00904da11f 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -133,6 +133,7 @@ namespace np void set_message_selected(SceNpBasicAttachmentDataId id, u64 msg_id); std::optional>> get_message_selected(SceNpBasicAttachmentDataId id); void clear_message_selected(SceNpBasicAttachmentDataId id); + void send_message(const message_data& msg_data, const std::set& npids); // Those should probably be under match2 ctx vm::ptr room_event_cb{}; // Room events diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 8d650b1137..7eea16e03d 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -1772,7 +1772,7 @@ namespace rpcn return forge_send(CommandType::RequestTicket, req_id, data); } - bool rpcn_client::sendmessage(const message_data& msg_data, const std::set& npids) + bool rpcn_client::send_message(const message_data& msg_data, const std::set& npids) { flatbuffers::FlatBufferBuilder builder(1024); diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 2fd16c4fc7..f2fc89f9bc 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -464,7 +464,7 @@ namespace rpcn bool send_room_message(u32 req_id, const SceNpCommunicationId& communication_id, const SceNpMatching2SendRoomMessageRequest* req); bool req_sign_infos(u32 req_id, const std::string& npid); bool req_ticket(u32 req_id, const std::string& service_id, const std::vector& cookie); - bool sendmessage(const message_data& msg_data, const std::set& npids); + bool send_message(const message_data& msg_data, const std::set& npids); bool get_board_infos(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id); bool record_score(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, SceNpScorePcId char_id, SceNpScoreValue score, const std::optional comment, const std::optional> score_data); bool get_score_range(u32 req_id, const SceNpCommunicationId& communication_id, SceNpScoreBoardId board_id, u32 start_rank, u32 num_rank, bool with_comment, bool with_gameinfo); diff --git a/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp b/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp index 90f27e8b28..a71eb36d39 100644 --- a/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/sendmessage_dialog_frame.cpp @@ -70,7 +70,7 @@ bool sendmessage_dialog_frame::Exec(message_data& msg_data, std::settext().toStdString()); // Send the message - result = m_rpcn->sendmessage(msg_data, npids); + result = m_rpcn->send_message(msg_data, npids); m_dialog->close(); });