Route TeamSync team creation through coordinator
This commit is contained in:
+23
-3
@@ -6084,12 +6084,32 @@ static asio::awaitable<void> on_EA_BB(std::shared_ptr<Client> c, Channel::Messag
|
|||||||
send_command(c, 0x02EA, 0x00000001);
|
send_command(c, 0x02EA, 0x00000001);
|
||||||
} else {
|
} else {
|
||||||
std::string player_name = c->character_file()->disp.visual.name.decode(c->language());
|
std::string player_name = c->character_file()->disp.visual.name.decode(c->language());
|
||||||
auto team = s->team_index->create(team_name, c->login->account->account_id, player_name);
|
std::shared_ptr<const TeamIndex::Team> team;
|
||||||
|
|
||||||
|
if (TeamSync::relay_team_actions_enabled()) {
|
||||||
|
if (!TeamSync::enqueue_team_create(team_name, c->login->account->account_id, player_name)) {
|
||||||
|
send_command(c, 0x02EA, 0x00000001);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!co_await TeamSync::exchange_once_now()) {
|
||||||
|
send_command(c, 0x02EA, 0x00000001);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
team = s->team_index->get_by_account_id(c->login->account->account_id);
|
||||||
|
if (!team || (team->name != team_name)) {
|
||||||
|
send_command(c, 0x02EA, 0x00000001);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
team = s->team_index->create(team_name, c->login->account->account_id, player_name);
|
||||||
|
}
|
||||||
|
|
||||||
c->login->account->bb_team_id = team->team_id;
|
c->login->account->bb_team_id = team->team_id;
|
||||||
c->login->account->save();
|
c->login->account->save();
|
||||||
|
|
||||||
TeamSync::enqueue_team_create(team_name, c->login->account->account_id, player_name);
|
|
||||||
|
|
||||||
send_command(c, 0x02EA, 0x00000000);
|
send_command(c, 0x02EA, 0x00000000);
|
||||||
send_team_metadata_change_notifications(s, team, c->login->account->account_id, TeamMetadataChange::TEAM_CREATED);
|
send_team_metadata_change_notifications(s, team, c->login->account->account_id, TeamMetadataChange::TEAM_CREATED);
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-4
@@ -453,13 +453,13 @@ bool relay_team_actions_enabled() {
|
|||||||
return cfg.enabled && cfg.relay_team_actions;
|
return cfg.enabled && cfg.relay_team_actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
void enqueue_team_create(const std::string& team_name, uint32_t creator_account_id, const std::string& creator_name) {
|
bool enqueue_team_create(const std::string& team_name, uint32_t creator_account_id, const std::string& creator_name) {
|
||||||
auto cfg = get_config();
|
auto cfg = get_config();
|
||||||
if (!cfg.enabled || !cfg.relay_team_actions) {
|
if (!cfg.enabled || !cfg.relay_team_actions) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (team_name.empty() || creator_account_id == 0 || creator_name.empty()) {
|
if (team_name.empty() || creator_account_id == 0 || creator_name.empty()) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard<std::mutex> g(exchange_state_mutex);
|
std::lock_guard<std::mutex> g(exchange_state_mutex);
|
||||||
@@ -468,7 +468,7 @@ void enqueue_team_create(const std::string& team_name, uint32_t creator_account_
|
|||||||
"[TeamSync] warning outbound_event_dropped reason=queue_full source=%s team_namespace=%s type=team_create\n",
|
"[TeamSync] warning outbound_event_dropped reason=queue_full source=%s team_namespace=%s type=team_create\n",
|
||||||
source_label(cfg).c_str(),
|
source_label(cfg).c_str(),
|
||||||
cfg.team_namespace.c_str());
|
cfg.team_namespace.c_str());
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
OutboundEvent ev;
|
OutboundEvent ev;
|
||||||
@@ -477,6 +477,7 @@ void enqueue_team_create(const std::string& team_name, uint32_t creator_account_
|
|||||||
ev.creator_account_id = creator_account_id;
|
ev.creator_account_id = creator_account_id;
|
||||||
ev.creator_name = creator_name;
|
ev.creator_name = creator_name;
|
||||||
outbound_events.emplace_back(std::move(ev));
|
outbound_events.emplace_back(std::move(ev));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_canonical_team_state_callback(CanonicalTeamStateCallback cb) {
|
void set_canonical_team_state_callback(CanonicalTeamStateCallback cb) {
|
||||||
@@ -617,6 +618,37 @@ static asio::awaitable<void> run_empty_exchange_once(const Config& cfg) {
|
|||||||
co_return;
|
co_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
asio::awaitable<bool> exchange_once_now() {
|
||||||
|
auto cfg = get_config();
|
||||||
|
if (!exchange_enabled(cfg) || cfg.coordinator_url.empty()) {
|
||||||
|
co_return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
bool was_bootstrapped = get_exchange_state().bootstrapped;
|
||||||
|
co_await run_empty_exchange_once(cfg);
|
||||||
|
|
||||||
|
// First exchange after startup only bootstraps cursor/seq. Run once more so
|
||||||
|
// newly queued team_create events are actually sent before the client gets
|
||||||
|
// success.
|
||||||
|
if (!was_bootstrapped) {
|
||||||
|
co_await run_empty_exchange_once(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
co_return true;
|
||||||
|
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
std::fprintf(stderr,
|
||||||
|
"[TeamSync] warning exchange_once_failed source=%s team_namespace=%s error=%s\n",
|
||||||
|
source_label(cfg).c_str(),
|
||||||
|
cfg.team_namespace.c_str(),
|
||||||
|
e.what());
|
||||||
|
co_return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static asio::awaitable<void> exchange_task() {
|
static asio::awaitable<void> exchange_task() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
auto cfg = get_config();
|
auto cfg = get_config();
|
||||||
|
|||||||
+2
-1
@@ -34,7 +34,8 @@ bool enabled();
|
|||||||
bool relay_team_chat_enabled();
|
bool relay_team_chat_enabled();
|
||||||
bool relay_team_actions_enabled();
|
bool relay_team_actions_enabled();
|
||||||
|
|
||||||
void enqueue_team_create(const std::string& team_name, uint32_t creator_account_id, const std::string& creator_name);
|
bool enqueue_team_create(const std::string& team_name, uint32_t creator_account_id, const std::string& creator_name);
|
||||||
|
asio::awaitable<bool> exchange_once_now();
|
||||||
|
|
||||||
using CanonicalTeamStateCallback = std::function<void(const phosg::JSON&)>;
|
using CanonicalTeamStateCallback = std::function<void(const phosg::JSON&)>;
|
||||||
void set_canonical_team_state_callback(CanonicalTeamStateCallback cb);
|
void set_canonical_team_state_callback(CanonicalTeamStateCallback cb);
|
||||||
|
|||||||
Reference in New Issue
Block a user