Fix /emptyMail (Add UpdatePersistentMessages Handling)

This commit is contained in:
Cekis
2021-11-26 01:52:23 -05:00
parent fba12a2b80
commit 5f4765ea4b
7 changed files with 114 additions and 0 deletions

View File

@@ -8,6 +8,7 @@
#include <memory>
#include <string>
#include <vector>
#include <stdexcept>
template <typename NodeT, typename ClientT>
class Node : public UdpManagerHandler {

View File

@@ -34,6 +34,7 @@ add_executable(stationchat
protocol/SetApiVersion.hpp
protocol/SetAvatarAttributes.hpp
protocol/UpdatePersistentMessage.hpp
protocol/UpdatePersistentMessages.hpp
ChatAvatar.cpp
ChatAvatar.hpp

View File

@@ -42,6 +42,7 @@
#include "protocol/SetApiVersion.hpp"
#include "protocol/SetAvatarAttributes.hpp"
#include "protocol/UpdatePersistentMessage.hpp"
#include "protocol/UpdatePersistentMessages.hpp"
#include "easylogging++.h"
@@ -138,6 +139,9 @@ void GatewayClient::OnIncoming(std::istringstream& istream) {
case ChatRequestType::UPDATEPERSISTENTMESSAGE:
HandleIncomingMessage<UpdatePersistentMessage>(istream);
break;
case ChatRequestType::UPDATEPERSISTENTMESSAGES:
HandleIncomingMessage<UpdatePersistentMessages>(istream);
break;
case ChatRequestType::IGNORESTATUS:
HandleIncomingMessage<IgnoreStatus>(istream);
break;

View File

@@ -208,3 +208,32 @@ void PersistentMessageService::UpdateMessageStatus(
sqlite3_finalize(stmt);
}
void PersistentMessageService::BulkUpdateMessageStatus(
uint32_t avatarId, const std::u16string& category, PersistentState newStatus)
{
sqlite3_stmt* stmt;
char sql[] = "UPDATE persistent_message SET status = @status WHERE avatar_id = @avatar_id AND "
"category = @category";
auto result = sqlite3_prepare_v2(db_, sql, -1, &stmt, 0);
if (result != SQLITE_OK) {
throw SQLite3Exception{result, sqlite3_errmsg(db_)};
}
int statusIdx = sqlite3_bind_parameter_index(stmt, "@status");
int avatarIdIdx = sqlite3_bind_parameter_index(stmt, "@avatar_id");
int categoryIdx = sqlite3_bind_parameter_index(stmt, "@category");
sqlite3_bind_int(stmt, statusIdx, static_cast<uint32_t>(newStatus));
sqlite3_bind_int(stmt, avatarIdIdx, avatarId);
std::string cat = FromWideString(category);
sqlite3_bind_text(stmt, categoryIdx, cat.c_str(), -1, nullptr);
result = sqlite3_step(stmt);
if (result != SQLITE_DONE) {
throw SQLite3Exception{result, sqlite3_errmsg(db_)};
}
sqlite3_finalize(stmt);
}

View File

@@ -25,6 +25,9 @@ public:
void UpdateMessageStatus(
uint32_t avatarId, uint32_t messageId, PersistentState status);
void BulkUpdateMessageStatus(
uint32_t avatarId, const std::u16string& category, PersistentState newStatus);
private:
sqlite3* db_;
};

View File

@@ -43,6 +43,7 @@
#include "protocol/SetApiVersion.hpp"
#include "protocol/SetAvatarAttributes.hpp"
#include "protocol/UpdatePersistentMessage.hpp"
#include "protocol/UpdatePersistentMessages.hpp"
#include "easylogging++.h"
@@ -729,3 +730,11 @@ UpdatePersistentMessage::UpdatePersistentMessage(GatewayClient* client, const Re
messageService_->UpdateMessageStatus(
request.srcAvatarId, request.messageId, request.status);
}
UpdatePersistentMessages::UpdatePersistentMessages(GatewayClient *client, const RequestType &request, ResponseType &response)
: messageService_{client->GetNode()->GetMessageService()}
{
LOG(INFO) << "UPDATEPERSISTENTMESSAGES request received";
messageService_->BulkUpdateMessageStatus(
request.srcAvatarId, request.category, request.newStatus);
}

View File

@@ -0,0 +1,67 @@
/**
* UpdatePersistentMessages.hpp
* Specific handling for bulk-message update requests
* e.g. for use with /emptyMail command
*
* SWG Source Addition - 2021
* Authors: Aconite
*/
#pragma once
#include "ChatEnums.hpp"
#include "PersistentMessage.hpp"
class PersistentMessageService;
class GatewayClient;
/** Begin UpdatePersistentMessages Request */
struct ReqUpdatePersistentMessages {
const ChatRequestType type = ChatRequestType::UPDATEPERSISTENTMESSAGES;
uint32_t track;
uint32_t srcAvatarId;
PersistentState currentStatus;
PersistentState newStatus;
std::u16string category;
};
template <typename StreamT>
void read(StreamT& ar, ReqUpdatePersistentMessages& data) {
read(ar, data.track);
read(ar, data.srcAvatarId);
read(ar, data.currentStatus);
read(ar, data.newStatus);
read(ar, data.category);
}
/** Begin UpdatePersistentMessages Response */
struct ResUpdatePersistentMessages {
ResUpdatePersistentMessages(uint32_t track_)
: track{track_}
, result{ChatResultCode::SUCCESS} {}
const ChatResponseType type = ChatResponseType::UPDATEPERSISTENTMESSAGES;
uint32_t track;
ChatResultCode result;
};
template <typename StreamT>
void write(StreamT& ar, const ResUpdatePersistentMessages& data) {
write(ar, data.type);
write(ar, data.track);
write(ar, data.result);
}
class UpdatePersistentMessages {
public:
using RequestType = ReqUpdatePersistentMessages;
using ResponseType = ResUpdatePersistentMessages;
UpdatePersistentMessages(GatewayClient* client, const RequestType& request, ResponseType& response);
private:
PersistentMessageService* messageService_;
};