service_outcome_commit.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "service_outcome_commit.h"
  2. #include "../../../../core/logging/log.h"
  3. #include "../../../../state/activity/runtime.h"
  4. #include "../../../../state/matchmaking/matchmaking_state.h"
  5. #include "../../../../state/runtime/runtime.h"
  6. #include "../internal.h"
  7. namespace sunrise::server::bap::encrypted::transactions {
  8. /**
  9. * Commits at most one delayed State transaction.
  10. * @param outcome Checked service result whose pending transaction is used up.
  11. * @param publication Gets connection fields to publish after the output copy.
  12. * @return True when there is no transaction, or the one transaction commits.
  13. */
  14. bool commit(ServiceOutcome& outcome, Publication& publication) noexcept {
  15. publication = {};
  16. if (auto* allocation = transaction_if<state::activity::PendingAllocation>(outcome)) {
  17. const std::uint64_t sessionId = allocation->sessionId;
  18. if (sessionId == state::activity::kAbsentSessionId
  19. || !state::activity::commit(*allocation)) {
  20. return false;
  21. }
  22. publication.activitySessionId = sessionId;
  23. publication.hasActivitySessionBinding = true;
  24. return true;
  25. }
  26. if (auto* plan = transaction_if<activity_message::ActivityPlan>(outcome)) {
  27. if (plan->mutationDomain == activity_message::MutationDomain::entitySlots) {
  28. return state::activity::entity_slots::commit(plan->entitySlotMutation);
  29. }
  30. if (plan->mutationDomain == activity_message::MutationDomain::membership) {
  31. return state::activity::membership::commit(plan->membershipMutation);
  32. }
  33. // The retained patch epoch is connection state, so it commits nothing here.
  34. return plan->mutationDomain == activity_message::MutationDomain::patchEpoch;
  35. }
  36. if (auto* mutation = transaction_if<state::matchmaking::PendingMutation>(outcome)) {
  37. return state::matchmaking::commit(*mutation);
  38. }
  39. if (auto* transaction = transaction_if<EquipmentSwapTransaction>(outcome)) {
  40. const bool committed = state::commit_equipment_swap(transaction->pending);
  41. core::log::write(core::log::Channel::server,
  42. committed ? core::log::Level::debug : core::log::Level::warn,
  43. committed ? "ev=equip stage=transaction_commit result=ok"
  44. : "ev=equip stage=transaction_commit result=fail");
  45. return committed;
  46. }
  47. if (auto* transaction = transaction_if<ItemAcquisitionTransaction>(outcome)) {
  48. const bool committed = state::commit_item_acquisition(transaction->pending);
  49. core::log::write(core::log::Channel::server,
  50. committed ? core::log::Level::debug : core::log::Level::warn,
  51. committed ? "ev=acquire stage=transaction_commit result=ok"
  52. : "ev=acquire stage=transaction_commit result=fail");
  53. return committed;
  54. }
  55. if (auto* transaction = transaction_if<SocketPlugTransaction>(outcome)) {
  56. const bool committed = state::commit_socket_plug(transaction->pending);
  57. core::log::write(core::log::Channel::server,
  58. committed ? core::log::Level::debug : core::log::Level::warn,
  59. committed ? "ev=socket_plug stage=transaction_commit result=ok"
  60. : "ev=socket_plug stage=transaction_commit result=fail");
  61. return committed;
  62. }
  63. if (auto* transaction = transaction_if<ItemStateTransaction>(outcome)) {
  64. const bool committed = state::commit_item_state(transaction->pending);
  65. core::log::write(core::log::Channel::server,
  66. committed ? core::log::Level::debug : core::log::Level::warn,
  67. committed ? "ev=item_state stage=transaction_commit result=ok"
  68. : "ev=item_state stage=transaction_commit result=fail");
  69. return committed;
  70. }
  71. if (auto* transaction = transaction_if<ProfileItemAcquisitionTransaction>(outcome)) {
  72. const bool committed = state::commit_profile_item_acquisition(transaction->pending);
  73. core::log::write(core::log::Channel::server,
  74. committed ? core::log::Level::debug : core::log::Level::warn,
  75. committed ? "ev=profile_acquire stage=transaction_commit result=ok"
  76. : "ev=profile_acquire stage=transaction_commit result=fail");
  77. return committed;
  78. }
  79. if (auto* transaction = transaction_if<ItemDismantleTransaction>(outcome)) {
  80. const bool committed = state::commit_item_dismantle(transaction->pending);
  81. core::log::write(core::log::Channel::server,
  82. committed ? core::log::Level::debug : core::log::Level::warn,
  83. committed ? "ev=dismantle stage=transaction_commit result=ok"
  84. : "ev=dismantle stage=transaction_commit result=fail");
  85. return committed;
  86. }
  87. return true;
  88. }
  89. } // namespace sunrise::server::bap::encrypted::transactions