6#include "absl/strings/str_format.h"
14 version_mgr_(nullptr),
15 approval_mgr_(nullptr),
17 sync_in_progress_(false) {
34 return absl::InvalidArgumentError(
"version_mgr cannot be null");
38 return absl::InvalidArgumentError(
"approval_mgr cannot be null");
42 client_->OnMessage(
"rom_sync", [
this](
const nlohmann::json& payload) {
46 client_->OnMessage(
"proposal_shared", [
this](
const nlohmann::json& payload) {
50 client_->OnMessage(
"proposal_vote_received", [
this](
const nlohmann::json& payload) {
54 client_->OnMessage(
"proposal_updated", [
this](
const nlohmann::json& payload) {
58 client_->OnMessage(
"participant_joined", [
this](
const nlohmann::json& payload) {
62 client_->OnMessage(
"participant_left", [
this](
const nlohmann::json& payload) {
71 return absl::OkStatus();
75 return client_->Connect(host, port);
85 const std::string& session_name,
86 const std::string& username,
90 return absl::FailedPreconditionError(
"Not connected to server");
94 return absl::FailedPreconditionError(
"ROM not loaded");
107 if (snapshot_result.ok()) {
112 auto session_result =
client_->HostSession(
119 if (!session_result.ok()) {
120 return session_result.status();
125 return absl::OkStatus();
129 const std::string& session_code,
130 const std::string& username) {
133 return absl::FailedPreconditionError(
"Not connected to server");
137 return absl::FailedPreconditionError(
"ROM not loaded");
142 "Before joining session",
147 if (snapshot_result.ok()) {
152 auto session_result =
client_->JoinSession(session_code, username);
154 if (!session_result.ok()) {
155 return session_result.status();
160 return absl::OkStatus();
165 return absl::FailedPreconditionError(
"Not in a session");
168 return client_->LeaveSession();
172 const std::string& description,
173 const std::string& username) {
176 return absl::FailedPreconditionError(
"Not in a session");
180 return absl::FailedPreconditionError(
"ROM not loaded");
186 return absl::OkStatus();
192 nlohmann::json proposal_data = {
193 {
"description", description},
194 {
"type",
"rom_modification"},
197 {
"to_hash", current_hash}
201 auto status =
client_->ShareProposal(proposal_data, username);
212 const std::string& diff_data,
213 const std::string& rom_hash,
214 const std::string& sender) {
217 return absl::FailedPreconditionError(
"ROM not loaded");
221 return absl::UnavailableError(
"Sync already in progress");
229 absl::StrFormat(
"Before sync from %s", sender),
234 if (!snapshot_result.ok()) {
236 return absl::InternalError(
"Failed to create backup snapshot");
249 if (!snapshots.empty()) {
260 const std::string& proposal_id,
261 const nlohmann::json& proposal_data,
262 const std::string& sender) {
265 return absl::FailedPreconditionError(
"Approval manager not initialized");
272 proposal_data[
"description"],
278 const std::string& proposal_id,
280 const std::string& username) {
283 return absl::FailedPreconditionError(
"Not in a session");
294 return client_->VoteOnProposal(proposal_id, approved, username);
298 const std::string& proposal_id) {
301 return absl::FailedPreconditionError(
"Proposal not approved");
305 if (!proposal_result.ok()) {
306 return proposal_result.status();
311 auto status =
client_->UpdateProposalStatus(proposal_id,
"applied");
316 absl::StrFormat(
"Applied proposal %s", proposal_id.substr(0, 8)),
330 return client_->GetSessionInfo();
340 std::string diff_data = payload[
"diff_data"];
341 std::string rom_hash = payload[
"rom_hash"];
342 std::string sender = payload[
"sender"];
344 auto status =
ApplyRomSync(diff_data, rom_hash, sender);
352 std::string proposal_id = payload[
"proposal_id"];
353 nlohmann::json proposal_data = payload[
"proposal_data"];
354 std::string sender = payload[
"sender"];
360 std::string proposal_id = payload[
"proposal_id"];
362 if (payload.contains(
"status")) {
363 std::string status = payload[
"status"];
371 if (payload.contains(
"votes")) {
373 nlohmann::json votes = payload[
"votes"];
379 std::string username = payload[
"username"];
384 std::string username = payload[
"username"];
391 const std::string& from_hash,
392 const std::string& to_hash) {
405 return "diff_placeholder";
410 return absl::FailedPreconditionError(
"ROM not loaded");
416 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data.
CollaborationService(Rom *rom)
absl::Status LeaveSession()
std::unique_ptr< WebSocketClient > client_
absl::Status ApplyApprovedProposal(const std::string &proposal_id)
void OnProposalUpdated(const nlohmann::json &payload)
absl::Status VoteOnProposal(const std::string &proposal_id, bool approved, const std::string &username)
absl::Status HandleIncomingProposal(const std::string &proposal_id, const nlohmann::json &proposal_data, const std::string &sender)
absl::Status Initialize(const Config &config, RomVersionManager *version_mgr, ProposalApprovalManager *approval_mgr)
void OnProposalReceived(const nlohmann::json &payload)
void OnRomSyncReceived(const nlohmann::json &payload)
void SetAutoSync(bool enabled)
std::string last_sync_hash_
RomVersionManager * version_mgr_
absl::Status ApplyRomSync(const std::string &diff_data, const std::string &rom_hash, const std::string &sender)
absl::StatusOr< SessionInfo > GetSessionInfo() const
absl::Status SubmitChangesAsProposal(const std::string &description, const std::string &username)
ProposalApprovalManager * approval_mgr_
void OnParticipantJoined(const nlohmann::json &payload)
absl::Status Connect(const std::string &host, int port=8765)
absl::Status JoinSession(const std::string &session_code, const std::string &username)
absl::Status ApplyDiff(const std::string &diff_data)
absl::Status HostSession(const std::string &session_name, const std::string &username, bool ai_enabled=true)
void OnParticipantLeft(const nlohmann::json &payload)
std::string GenerateDiff(const std::string &from_hash, const std::string &to_hash)
Manages proposal approval workflow for collaborative sessions.
absl::StatusOr< ApprovalStatus > GetProposalStatus(const std::string &proposal_id) const
absl::Status VoteOnProposal(const std::string &proposal_id, const std::string &username, bool approved)
bool IsProposalApproved(const std::string &proposal_id) const
absl::Status SubmitProposal(const std::string &proposal_id, const std::string &sender, const std::string &description, const nlohmann::json &proposal_data)
Manages ROM versioning, snapshots, and rollback capabilities.
absl::StatusOr< std::string > CreateSnapshot(const std::string &description, const std::string &creator, bool is_checkpoint=false)
std::string GetCurrentHash() const
absl::Status RestoreSnapshot(const std::string &snapshot_id)
absl::Status MarkAsSafePoint(const std::string &snapshot_id)
std::vector< RomSnapshot > GetSnapshots(bool safe_points_only=false) const
WebSocket client for connecting to yaze-server.
Main namespace for the application.
bool require_approval_for_sync
bool create_snapshot_before_sync