- Add checkout request/response bridge and workspace re-hydration in store UI - Implement server-side checkout stores for charging bank/cash and granting locker/VA items - Normalize catalog/cart payload categories and fix locker VA sync event naming
244 lines
10 KiB
Plaintext
244 lines
10 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
#pragma hemtt ignore_variables ["_self"]
|
|
GVAR(OrgMembershipServiceBase) = compileFinal createHashMapFromArray [
|
|
["#type", "OrgMembershipService"],
|
|
["buildMembershipResult", compileFinal {
|
|
params [["_message", "", [""]]];
|
|
|
|
createHashMapFromArray [
|
|
["success", false],
|
|
["message", _message],
|
|
["actorPatch", createHashMap]
|
|
]
|
|
}],
|
|
["verifyMember", compileFinal {
|
|
params [["_org", createHashMap, [createHashMap]], ["_orgID", "", [""]], ["_uid", "", [""]], ["_player", objNull, [objNull]], ["_actor", createHashMap, [createHashMap]]];
|
|
|
|
if (_orgID isEqualTo "" || { _uid isEqualTo "" }) exitWith { _org };
|
|
|
|
private _members = _org getOrDefault ["members", createHashMap];
|
|
if ((_members getOrDefault [_uid, objNull]) isNotEqualTo objNull) exitWith { _org };
|
|
|
|
["org:members:add", [_orgID, _uid]] call EFUNC(extension,extCall) params ["_memberResult", "_memberSuccess"];
|
|
if (!_memberSuccess) then {
|
|
["WARNING", format ["Failed to add %1 to org %2 members: %3", _uid, _orgID, _memberResult]] call EFUNC(common,log);
|
|
};
|
|
|
|
private _memberName = _actor getOrDefault ["name", ""];
|
|
if (_memberName isEqualTo "" && { _player isNotEqualTo objNull }) then {
|
|
_memberName = name _player;
|
|
};
|
|
if (_memberName isEqualTo "") then {
|
|
_memberName = "Unknown";
|
|
};
|
|
|
|
private _updatedMembers = +_members;
|
|
_updatedMembers set [_uid, createHashMapFromArray [["uid", _uid], ["name", _memberName]]];
|
|
_org set ["members", _updatedMembers];
|
|
|
|
_org
|
|
}],
|
|
["addMember", compileFinal {
|
|
params [["_orgID", "", [""]], ["_uid", "", [""]], ["_player", objNull, [objNull]], ["_actor", createHashMap, [createHashMap]]];
|
|
|
|
if (_orgID isEqualTo "" || { _uid isEqualTo "" }) exitWith { createHashMap };
|
|
|
|
private _org = GVAR(OrgStore) call ["loadById", [_orgID]];
|
|
if (_org isEqualTo createHashMap) exitWith { _org };
|
|
|
|
_org = _self call ["verifyMember", [_org, _orgID, _uid, _player, _actor]];
|
|
GVAR(Registry) set [_orgID, _org, true];
|
|
|
|
_org
|
|
}],
|
|
["removeMember", compileFinal {
|
|
params [["_orgID", "", [""]], ["_uid", "", [""]]];
|
|
|
|
if (_orgID isEqualTo "" || { _uid isEqualTo "" }) exitWith { createHashMap };
|
|
|
|
private _org = GVAR(OrgStore) call ["loadById", [_orgID]];
|
|
if (_org isEqualTo createHashMap) exitWith { _org };
|
|
|
|
["org:members:remove", [_orgID, _uid]] call EFUNC(extension,extCall) params ["_memberResult", "_memberSuccess"];
|
|
if (!_memberSuccess) exitWith {
|
|
["WARNING", format ["Failed to remove %1 from org %2 members: %3", _uid, _orgID, _memberResult]] call EFUNC(common,log);
|
|
createHashMap
|
|
};
|
|
|
|
private _updatedMembers = +(_org getOrDefault ["members", createHashMap]);
|
|
_updatedMembers deleteAt _uid;
|
|
_org set ["members", _updatedMembers];
|
|
GVAR(Registry) set [_orgID, _org, true];
|
|
|
|
_org
|
|
}],
|
|
["restoreDefaultMembership", compileFinal {
|
|
params [["_uid", "", [""]], ["_player", objNull, [objNull]], ["_actor", createHashMap, [createHashMap]]];
|
|
|
|
private _result = _self call ["buildMembershipResult", []];
|
|
if (_uid isEqualTo "") exitWith {
|
|
_result set ["message", "A valid player UID is required."];
|
|
_result
|
|
};
|
|
|
|
private _resolvedPlayer = _player;
|
|
if (_resolvedPlayer isEqualTo objNull) then {
|
|
_resolvedPlayer = [_uid] call EFUNC(common,getPlayer);
|
|
};
|
|
|
|
private _resolvedActor = EGVAR(actor,Registry) getOrDefault [_uid, _actor];
|
|
private _actorPatch = EGVAR(actor,ActorStore) call ["set", [EGVAR(actor,Registry), "actor:update", _uid, "organization", "default", true]];
|
|
private _defaultActor = EGVAR(actor,Registry) getOrDefault [_uid, _resolvedActor];
|
|
private _defaultOrg = _self call ["addMember", ["default", _uid, _resolvedPlayer, _defaultActor]];
|
|
if (_defaultOrg isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Failed to restore default organization membership."];
|
|
_result
|
|
};
|
|
|
|
GVAR(IndexRegistry) set [_uid, createHashMapFromArray [["orgID", "default"]]];
|
|
_result set ["success", true];
|
|
_result set ["actorPatch", _actorPatch];
|
|
_result
|
|
}],
|
|
["leave", compileFinal {
|
|
params [["_uid", "", [""]]];
|
|
|
|
private _result = createHashMapFromArray [
|
|
["success", false],
|
|
["message", ""],
|
|
["actorPatch", createHashMap],
|
|
["notification", []]
|
|
];
|
|
|
|
if (_uid isEqualTo "") exitWith {
|
|
_result set ["message", "A valid player UID is required."];
|
|
_result
|
|
};
|
|
|
|
private _player = [_uid] call EFUNC(common,getPlayer);
|
|
private _actor = EGVAR(actor,Registry) getOrDefault [_uid, createHashMap];
|
|
private _orgID = _actor getOrDefault ["organization", ""];
|
|
if (_orgID isEqualTo "" || { toLower _orgID isEqualTo "default" }) exitWith {
|
|
_result set ["message", "You are already assigned to the default organization."];
|
|
_result
|
|
};
|
|
|
|
private _org = GVAR(OrgStore) call ["loadById", [_orgID]];
|
|
if (_org isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Unable to load organization data for leave request."];
|
|
_result
|
|
};
|
|
|
|
private _ownerUid = _org getOrDefault ["owner", ""];
|
|
if (_ownerUid isEqualTo _uid) exitWith {
|
|
_result set ["message", "Organization owners must disband the organization instead of leaving it."];
|
|
_result
|
|
};
|
|
|
|
private _orgName = _org getOrDefault ["name", "Organization"];
|
|
private _updatedOrg = _self call ["removeMember", [_orgID, _uid]];
|
|
if (_updatedOrg isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Failed to remove you from the organization roster."];
|
|
_result
|
|
};
|
|
|
|
private _defaultResult = _self call ["restoreDefaultMembership", [_uid, _player, _actor]];
|
|
if !(_defaultResult getOrDefault ["success", false]) exitWith {
|
|
_result set ["message", _defaultResult getOrDefault ["message", "Failed to restore default organization membership."]];
|
|
_result
|
|
};
|
|
|
|
private _message = format ["You left %1 and returned to the default organization.", _orgName];
|
|
_result set ["success", true];
|
|
_result set ["message", _message];
|
|
_result set ["actorPatch", _defaultResult getOrDefault ["actorPatch", createHashMap]];
|
|
_result set ["notification", ["info", "Organization Left", _message, 6000]];
|
|
_result
|
|
}],
|
|
["disband", compileFinal {
|
|
params [["_uid", "", [""]]];
|
|
|
|
private _result = createHashMapFromArray [
|
|
["success", false],
|
|
["message", ""],
|
|
["members", []]
|
|
];
|
|
|
|
if (_uid isEqualTo "") exitWith {
|
|
_result set ["message", "A valid player UID is required."];
|
|
_result
|
|
};
|
|
|
|
private _actor = EGVAR(actor,Registry) getOrDefault [_uid, createHashMap];
|
|
private _orgID = _actor getOrDefault ["organization", ""];
|
|
if (_orgID isEqualTo "" || { toLower _orgID isEqualTo "default" }) exitWith {
|
|
_result set ["message", "Only active player organizations can be disbanded."];
|
|
_result
|
|
};
|
|
|
|
private _org = GVAR(OrgStore) call ["loadById", [_orgID]];
|
|
if (_org isEqualTo createHashMap) exitWith {
|
|
_result set ["message", "Unable to load organization data for disbanding."];
|
|
_result
|
|
};
|
|
|
|
private _ownerUid = _org getOrDefault ["owner", ""];
|
|
if (_ownerUid isEqualTo "" || { _ownerUid isNotEqualTo _uid }) exitWith {
|
|
_result set ["message", "Only the organization owner can disband this organization."];
|
|
_result
|
|
};
|
|
|
|
private _orgName = _org getOrDefault ["name", "Organization"];
|
|
private _memberMap = _org getOrDefault ["members", createHashMap];
|
|
private _memberUids = keys _memberMap;
|
|
if !(_uid in _memberUids) then {
|
|
_memberUids pushBack _uid;
|
|
};
|
|
|
|
private _deleteResult = GVAR(OrgStore) call ["delete", [_orgID]];
|
|
if !(_deleteResult getOrDefault ["success", false]) exitWith {
|
|
_result set ["message", _deleteResult getOrDefault ["message", "Failed to disband organization."]];
|
|
_result
|
|
};
|
|
|
|
private _memberResults = [];
|
|
{
|
|
private _memberUid = _x;
|
|
if (_memberUid isNotEqualTo "") then {
|
|
private _memberPlayer = [_memberUid] call EFUNC(common,getPlayer);
|
|
private _memberActor = EGVAR(actor,Registry) getOrDefault [_memberUid, createHashMap];
|
|
private _defaultResult = _self call ["restoreDefaultMembership", [_memberUid, _memberPlayer, _memberActor]];
|
|
if !(_defaultResult getOrDefault ["success", false]) then {
|
|
["WARNING", format ["Failed to restore default org for %1 after disbanding %2: %3", _memberUid, _orgID, _defaultResult getOrDefault ["message", "Unknown error."]]] call EFUNC(common,log);
|
|
};
|
|
|
|
private _responseMessage = [
|
|
format ["%1 has been disbanded.", _orgName],
|
|
format ["Your organization, %1, has been disbanded.", _orgName]
|
|
] select (_memberUid isEqualTo _uid);
|
|
|
|
private _notificationParams = [
|
|
["warning", "Organization Disbanded", _responseMessage, 6000],
|
|
["success", "Organization Disbanded", _responseMessage, 6000]
|
|
] select (_memberUid isEqualTo _uid);
|
|
|
|
_memberResults pushBack (createHashMapFromArray [
|
|
["uid", _memberUid],
|
|
["requester", _memberUid isEqualTo _uid],
|
|
["message", _responseMessage],
|
|
["notification", _notificationParams],
|
|
["actorPatch", _defaultResult getOrDefault ["actorPatch", createHashMap]]
|
|
]);
|
|
};
|
|
} forEach _memberUids;
|
|
|
|
_result set ["success", true];
|
|
_result set ["message", format ["%1 has been disbanded.", _orgName]];
|
|
_result set ["members", _memberResults];
|
|
_result
|
|
}]
|
|
];
|
|
|
|
GVAR(OrgMembershipService) = createHashMapObject [GVAR(OrgMembershipServiceBase)];
|