Fix /emptyMail (Add UpdatePersistentMessages Handling)
This commit is contained in:
@@ -41,6 +41,7 @@ set(SOURCES
|
||||
protocol/SetApiVersion.hpp
|
||||
protocol/SetAvatarAttributes.hpp
|
||||
protocol/UpdatePersistentMessage.hpp
|
||||
protocol/UpdatePersistentMessages.hpp
|
||||
|
||||
ChatAvatar.cpp
|
||||
ChatAvatar.hpp
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "protocol/SetApiVersion.hpp"
|
||||
#include "protocol/SetAvatarAttributes.hpp"
|
||||
#include "protocol/UpdatePersistentMessage.hpp"
|
||||
#include "protocol/UpdatePersistentMessages.hpp"
|
||||
|
||||
#include "easylogging++.h"
|
||||
|
||||
@@ -725,3 +726,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);
|
||||
}
|
||||
|
||||
67
src/stationchat/protocol/UpdatePersistentMessages.hpp
Normal file
67
src/stationchat/protocol/UpdatePersistentMessages.hpp
Normal 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_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user