forge/arma/server/addons/cad/functions/fnc_initAssignmentRepository.sqf
Jacob Schmidt 112488f82e Rename offline status to unavailable
- Update CAD client UI and generated site assets
- Keep dispatcher and sidepanel status lists aligned with server defaults
- Refresh task, assignment, and group repository initialization
2026-03-31 06:21:43 -05:00

255 lines
10 KiB
Plaintext

#include "..\script_component.hpp"
/*
* File: fnc_initAssignmentRepository.sqf
* Author: IDSolutions
* Date: 2026-03-30
* Public: No
*
* Description:
* Initializes the CAD assignment repository for contract assignment
* state and dispatcher/group-leader task actions.
*
* Arguments:
* None
*
* Return Value:
* CAD assignment repository object [HASHMAP OBJECT]
*
* Example:
* call forge_server_cad_fnc_initAssignmentRepository
*/
#pragma hemtt ignore_variables ["_self"]
GVAR(AssignmentRepositoryBaseClass) = compileFinal createHashMapFromArray [
["#type", "CadAssignmentRepositoryBaseClass"],
["#create", compileFinal {
_self set ["assignmentRegistry", createHashMap];
}],
["pruneAssignments", compileFinal {
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
private _keysToRemove = [];
{
private _status = EGVAR(task,TaskStore) call ["getTaskStatus", [_x]];
if !(_status in ["active", ""]) then {
_keysToRemove pushBack _x;
};
} forEach _assignmentRegistry;
{
_assignmentRegistry deleteAt _x;
} forEach _keysToRemove;
_self set ["assignmentRegistry", _assignmentRegistry];
count _keysToRemove
}],
["getAssignments", compileFinal {
values (_self getOrDefault ["assignmentRegistry", createHashMap])
}],
["buildContracts", compileFinal {
params [["_uid", "", [""]]];
_self call ["pruneAssignments", []];
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
private _contracts = [];
private _permissionService = _self getOrDefault ["permissionService", createHashMap];
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
private _canDispatch = _permissionService call ["canDispatch", [_uid]];
private _playerGroupId = _groupRepository call ["getPlayerGroupId", [_uid]];
{
private _taskID = _x getOrDefault ["taskID", ""];
if (_taskID isEqualTo "") then { continue; };
private _assignment = _assignmentRegistry getOrDefault [_taskID, createHashMap];
private _entry = +_x;
_entry set ["taskId", _taskID];
_entry set ["assignedGroupId", _assignment getOrDefault ["groupId", ""]];
_entry set ["assignmentState", [_assignment getOrDefault ["state", ""], "unassigned"] select (_assignment isEqualTo createHashMap)];
if (!_canDispatch) then {
private _assignedGroupId = _entry getOrDefault ["assignedGroupId", ""];
if (_assignedGroupId isEqualTo "") then { continue; };
if (_assignedGroupId isNotEqualTo _playerGroupId) then { continue; };
};
_contracts pushBack _entry;
} forEach (EGVAR(task,TaskStore) call ["getActiveTaskCatalog", []]);
_contracts
}],
["assignTaskToGroup", compileFinal {
params [
["_requesterUid", "", [""]],
["_taskID", "", [""]],
["_groupID", "", [""]],
["_note", "", [""]]
];
private _result = createHashMapFromArray [
["success", false],
["message", "Unable to assign task."],
["assignment", createHashMap]
];
private _permissionService = _self getOrDefault ["permissionService", createHashMap];
if !(_permissionService call ["canDispatch", [_requesterUid]]) exitWith {
_result set ["message", "You are not authorized to assign contracts."];
_result
};
if ((EGVAR(task,TaskStore) call ["getTaskStatus", [_taskID]]) isNotEqualTo "active") exitWith {
_result set ["message", "Task is no longer active."];
_result
};
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
private _existingAssignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
if (
_existingAssignment isNotEqualTo createHashMap
&& { (_existingAssignment getOrDefault ["state", ""]) in ["assigned", "acknowledged"] }
) exitWith {
_result set ["message", "Task is already assigned and must be declined or completed before reassignment."];
_result set ["assignment", _existingAssignment];
_result
};
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
private _groupRecord = _groupRepository call ["getGroupRecord", [_groupID]];
if (_groupRecord isEqualTo createHashMap) exitWith {
_result set ["message", "Selected group is unavailable."];
_result
};
private _leaderUid = _groupRecord getOrDefault ["leaderUid", ""];
if (_leaderUid isEqualTo "") exitWith {
_result set ["message", "Selected group has no online leader."];
_result
};
private _requesterPlayer = [_requesterUid] call EFUNC(common,getPlayer);
private _assignment = createHashMapFromArray [
["taskId", _taskID],
["groupId", _groupID],
["assignedByUid", _requesterUid],
["assignedByName", ["Dispatcher", name _requesterPlayer] select (_requesterPlayer isNotEqualTo objNull)],
["assignedAt", serverTime],
["state", "assigned"],
["note", _note]
];
_assignmentRegistry set [_taskID, _assignment];
_self set ["assignmentRegistry", _assignmentRegistry];
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
_activityRepository call ["appendActivity", [
"task_assigned",
format ["%1 assigned %2 to %3.", _assignment get "assignedByName", _taskID, _groupRecord getOrDefault ["callsign", _groupID]],
_taskID,
_groupID,
_requesterUid
]];
_result set ["success", true];
_result set ["message", "Task assigned."];
_result set ["assignment", _assignment];
_result set ["leaderUid", _leaderUid];
_result
}],
["acknowledgeTask", compileFinal {
params [["_requesterUid", "", [""]], ["_taskID", "", [""]]];
private _result = createHashMapFromArray [
["success", false],
["message", "Unable to acknowledge task."],
["assignment", createHashMap]
];
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
private _assignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
if (_assignment isEqualTo createHashMap) exitWith {
_result set ["message", "Task is not assigned."];
_result
};
private _groupID = _assignment getOrDefault ["groupId", ""];
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith {
_result set ["message", "Only the assigned group leader can acknowledge this task."];
_result
};
private _bindResult = EGVAR(task,TaskStore) call ["bindTaskOwnership", [_taskID, _requesterUid]];
if !(_bindResult getOrDefault ["success", false]) exitWith {
_result set ["message", _bindResult getOrDefault ["message", "Failed to bind task ownership."]];
_result
};
_assignment set ["state", "acknowledged"];
_assignment set ["acknowledgedAt", serverTime];
_assignmentRegistry set [_taskID, _assignment];
_self set ["assignmentRegistry", _assignmentRegistry];
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
_activityRepository call ["appendActivity", [
"task_acknowledged",
format ["%1 acknowledged %2.", _requesterUid, _taskID],
_taskID,
_groupID,
_requesterUid
]];
_result set ["success", true];
_result set ["message", "Task acknowledged."];
_result set ["assignment", _assignment];
_result
}],
["declineTask", compileFinal {
params [["_requesterUid", "", [""]], ["_taskID", "", [""]]];
private _result = createHashMapFromArray [
["success", false],
["message", "Unable to decline task."],
["assignment", createHashMap]
];
private _assignmentRegistry = _self getOrDefault ["assignmentRegistry", createHashMap];
private _assignment = +(_assignmentRegistry getOrDefault [_taskID, createHashMap]);
if (_assignment isEqualTo createHashMap) exitWith {
_result set ["message", "Task is not assigned."];
_result
};
private _groupID = _assignment getOrDefault ["groupId", ""];
private _groupRepository = _self getOrDefault ["groupRepository", createHashMap];
if !(_groupRepository call ["isGroupLeader", [_requesterUid, _groupID]]) exitWith {
_result set ["message", "Only the assigned group leader can decline this task."];
_result
};
_assignment set ["state", "declined"];
_assignment set ["declinedAt", serverTime];
EGVAR(task,TaskStore) call ["releaseTaskOwnership", [_taskID]];
_assignmentRegistry deleteAt _taskID;
_self set ["assignmentRegistry", _assignmentRegistry];
private _activityRepository = _self getOrDefault ["activityRepository", createHashMap];
_activityRepository call ["appendActivity", [
"task_declined",
format ["%1 declined %2.", _requesterUid, _taskID],
_taskID,
_groupID,
_requesterUid
]];
_result set ["success", true];
_result set ["message", "Task declined and returned to the contract board."];
_result set ["assignment", _assignment];
_result
}]
];
createHashMapObject [GVAR(AssignmentRepositoryBaseClass)]