Route TeamSync team creation through coordinator

This commit is contained in:
2026-06-12 01:07:12 -04:00
parent 7526176bb3
commit 44650179f0
3 changed files with 61 additions and 8 deletions
+23 -3
View File
@@ -6084,12 +6084,32 @@ static asio::awaitable<void> on_EA_BB(std::shared_ptr<Client> c, Channel::Messag
send_command(c, 0x02EA, 0x00000001);
} else {
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->save();
TeamSync::enqueue_team_create(team_name, c->login->account->account_id, player_name);
send_command(c, 0x02EA, 0x00000000);
send_team_metadata_change_notifications(s, team, c->login->account->account_id, TeamMetadataChange::TEAM_CREATED);
}
+36 -4
View File
@@ -453,13 +453,13 @@ bool relay_team_actions_enabled() {
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();
if (!cfg.enabled || !cfg.relay_team_actions) {
return;
return false;
}
if (team_name.empty() || creator_account_id == 0 || creator_name.empty()) {
return;
return false;
}
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",
source_label(cfg).c_str(),
cfg.team_namespace.c_str());
return;
return false;
}
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_name = creator_name;
outbound_events.emplace_back(std::move(ev));
return true;
}
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;
}
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() {
for (;;) {
auto cfg = get_config();
+2 -1
View File
@@ -34,7 +34,8 @@ bool enabled();
bool relay_team_chat_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&)>;
void set_canonical_team_state_callback(CanonicalTeamStateCallback cb);