Skip to content

Commit

Permalink
Add initial character client v2
Browse files Browse the repository at this point in the history
  • Loading branch information
Chaosvex committed Oct 5, 2024
1 parent a516423 commit 81a900e
Show file tree
Hide file tree
Showing 8 changed files with 358 additions and 15 deletions.
27 changes: 14 additions & 13 deletions schemas/spark/v2/services/Characterv2.fbs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ table Character {
x:float;
y:float;
z:float;
o:float;
orientation:float;
guild_id:uint;
guild_rank:uint;
flags:uint;
Expand All @@ -55,11 +55,6 @@ table Character {
pet_family:uint;
}

table RetrieveResponse {
status:Status;
characters:[Character];
}

table Retrieve {
account_id:uint;
realm_id:uint;
Expand All @@ -72,13 +67,6 @@ table Rename {
character_id:ulong;
}

table RenameResponse {
status:Status;
result:uint;
name:string;
character_id:ulong;
}

table Delete {
account_id:uint;
realm_id:uint;
Expand All @@ -96,6 +84,18 @@ table CreateResponse {
result:uint;
}

table RetrieveResponse {
status:Status;
characters:[Character];
}

table RenameResponse {
status:Status;
result:uint;
name:string;
character_id:ulong;
}

table DeleteResponse {
status:Status;
result:uint;
Expand All @@ -105,6 +105,7 @@ union Message {
CreateResponse,
RenameResponse,
RetrieveResponse,
DeleteResponse,
Create,
Delete,
Rename,
Expand Down
2 changes: 2 additions & 0 deletions src/character/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@ set(LIBRARY_HDR
InventoryTypes.h
Service.h
FilterTypes.h
CharacterService.h
)

set(LIBRARY_SRC
CharacterHandler.cpp
Service.cpp
CharacterService.cpp
)

include_directories(${CMAKE_SOURCE_DIR}/deps/utf8cpp)
Expand Down
26 changes: 26 additions & 0 deletions src/character/CharacterService.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2024 Ember
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#include "CharacterService.h"

namespace ember {

CharacterService::CharacterService(spark::v2::Server& server, log::Logger& logger)
: services::Characterv2Service(server),
logger_(logger) {}


void on_link_up(const spark::v2::Link& link) {

}

void on_link_down(const spark::v2::Link& link) {

}

} // ember
25 changes: 25 additions & 0 deletions src/character/CharacterService.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2024 Ember
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#pragma once

#include <Characterv2ServiceStub.h>

namespace ember {

class CharacterService final : public services::Characterv2Service {
log::Logger& logger_;

void on_link_up(const spark::v2::Link& link) override;
void on_link_down(const spark::v2::Link& link) override;

public:
CharacterService(spark::v2::Server& spark, log::Logger& logger);
};

} // ember
2 changes: 2 additions & 0 deletions src/gateway/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ set(LIBRARY_HDR
WorldSessions.h
WorldClients.h
CharacterService.h
CharacterClient.h
CompressMessage.h
Routing.h
ClientLogHelper.h
Expand Down Expand Up @@ -68,6 +69,7 @@ set(LIBRARY_SRC
WorldSessions.cpp
WorldClients.cpp
CharacterService.cpp
CharacterClient.cpp
CompressMessage.cpp
NetworkListener.cpp
states/Authentication.cpp
Expand Down
212 changes: 212 additions & 0 deletions src/gateway/CharacterClient.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
/*
* Copyright (c) 2024 Ember
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#pragma once

#include "CharacterClient.h"
#include <memory>

namespace ember {

CharacterClient::CharacterClient(spark::v2::Server& server, Config& config, log::Logger& logger)
: services::Characterv2Client(server),
config_(config),
logger_(logger) {
connect("127.0.0.1", 8003); // temp
}

void CharacterClient::on_link_up(const spark::v2::Link& link) {
LOG_DEBUG_ASYNC(logger_, "Link up: {}", link.peer_banner);
link_ = link;
}

void CharacterClient::on_link_down(const spark::v2::Link& link) {
LOG_DEBUG_ASYNC(logger_, "Link up: {}", link.peer_banner);
}

void CharacterClient::retrieve_characters(const std::uint32_t account_id, RetrieveCB cb) const {
LOG_TRACE(logger_) << log_func << LOG_ASYNC;

em::RetrieveT msg {
.account_id = account_id,
.realm_id = config_.realm->id
};

send<em::RetrieveResponse>(msg, link_,
[this, cb](auto link, auto message) {
handle_retrieve_reply(link, message, cb);
}
);
}

void CharacterClient::create_character(const std::uint32_t account_id,
const CharacterTemplate& character,
ResponseCB cb) const {
LOG_TRACE(logger_) << log_func << LOG_ASYNC;

em::CharacterTemplateT tmpl {
.name = character.name,
.race = character.race,
.class_ = character.class_,
.gender = character.gender,
.skin = character.skin,
.face = character.face,
.hairstyle = character.hairstyle,
.haircolour = character.haircolour,
.facialhair = character.facialhair
};

em::CreateT msg;
msg.account_id = account_id;
msg.realm_id = config_.realm->id;
msg.character = std::make_unique<em::CharacterTemplateT>(std::move(tmpl));

send<em::CreateResponse>(msg, link_,
[this, cb](auto link, auto message) {
handle_create_reply(link, message, cb);
}
);
}

void CharacterClient::delete_character(std::uint32_t account_id,
std::uint64_t id,
ResponseCB cb) const {
LOG_TRACE(logger_) << log_func << LOG_ASYNC;

em::DeleteT msg {
.account_id = account_id,
.realm_id = config_.realm->id,
.character_id = id,
};

send<em::DeleteResponse>(msg, link_,
[this, cb](auto link, auto message) {
handle_delete_reply(link, message, cb);
}
);
}

void CharacterClient::rename_character(std::uint32_t account_id,
std::uint64_t character_id,
const utf8_string& name,
RenameCB cb) const {
LOG_TRACE(logger_) << log_func << LOG_ASYNC;

em::RenameT msg {
.account_id = account_id,
.name = name,
.realm_id = config_.realm->id,
.character_id = character_id,
};

send<em::RenameResponse>(msg, link_,
[this, cb](auto link, auto message) {
handle_rename_reply(link, message, cb);
}
);
}

void CharacterClient::handle_create_reply(
const spark::v2::Link& link,
std::expected<const em::CreateResponse*, spark::v2::Result> resp,
ResponseCB cb) const {
if(!resp) {
cb(em::Status::UNKNOWN_ERROR, {});
return;
}

const auto* msg = *resp;
cb(msg->status(), protocol::Result(msg->result()));
}

void CharacterClient::handle_rename_reply(
const spark::v2::Link& link,
std::expected<const em::RenameResponse*, spark::v2::Result> resp,
RenameCB cb) const {
if(!resp) {
cb(em::Status::UNKNOWN_ERROR, {}, 0, "");
return;
}

const auto* msg = *resp;

if(!msg->name()) {
cb(em::Status::ILLFORMED_MESSAGE, {}, 0, "");
return;
}

cb(msg->status(), protocol::Result(msg->result()), msg->character_id(), msg->name()->str());
}

void CharacterClient::handle_retrieve_reply(
const spark::v2::Link& link,
std::expected<const em::RetrieveResponse*, spark::v2::Result> resp,
RetrieveCB cb) const {
if(!resp) {
cb(em::Status::UNKNOWN_ERROR, {});
return;
}

const auto msg = *resp;

if(!msg->characters()) {
cb(em::Status::ILLFORMED_MESSAGE, {});
return;
}

std::vector<Character> characters;
auto key = msg->characters();

for(auto i = key->begin(); i != key->end(); ++i) {
Character character;
character.name = i->name()->str();
character.id = i->id();
character.account_id = i->account_id();
character.realm_id = i->realm_id();
character.race = i->race();
character.class_ = i->class_();
character.gender = i->gender();
character.skin = i->skin();
character.face = i->face();
character.hairstyle = i->hairstyle();
character.haircolour = i->haircolour();
character.facialhair = i->facialhair();
character.level = i->level();
character.zone = i->zone();
character.map = i->map();
character.guild_id = i->guild_id();
character.guild_rank = i->guild_rank();
character.position.x = i->x();
character.position.y = i->y();
character.position.z = i->z();
character.orientation = i->orientation();
character.flags = static_cast<Character::Flags>(i->flags());
character.first_login = i->first_login();
character.pet_display = i->pet_display_id();
character.pet_level = i->pet_level();
character.pet_family = i->pet_family();
characters.emplace_back(std::move(character));
}

cb(msg->status(), std::move(characters));
}

void CharacterClient::handle_delete_reply(
const spark::v2::Link& link,
std::expected<const em::DeleteResponse*, spark::v2::Result> resp,
ResponseCB cb) const {
if(!resp) {
cb(em::Status::UNKNOWN_ERROR, {});
return;
}

const auto* msg = *resp;
cb(msg->status(), protocol::Result(msg->result()));
}

} // ember
Loading

0 comments on commit 81a900e

Please sign in to comment.