using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static ClientToGameReq.Types; namespace GameServer { internal class BuildingFloorAgentAction : EntityActionBase { ConcurrentDictionary m_building_floors = new(); public BuildingFloorAgentAction(Building owner) : base(owner) { } public override async Task onInit() { var result = new Result(); return await Task.FromResult(result); } public override void onClear() { return; } public async Task tryLoadBuildingFloorFromDb(int buildingMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var db_client = server_logic.getDynamoDbClient(); var doc = new BuildingFloorDoc(); doc.setCombinationKeyForPK(buildingMetaId.ToString()); var error_code = doc.onApplyPKSK(); if (error_code.isFail()) { err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()}"; result.setFail(error_code, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var query_config = db_client.makeQueryConfigWithPKSKBySKBeginWith(doc.getPK(), BuildingFloorDoc.getPrefixOfSK()); (result, var read_docs) = await db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { err_msg = $"Failed to simpleQueryDocTypesWithQueryOperationConfig() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building = getOwner() as Building; NullReferenceCheckHelper.throwIfNull(building, () => $"building is null !!!"); foreach (var read_doc in read_docs) { var building_floor_attrib = read_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(building_floor_attrib, () => $"building_floor_attrib is null !!!"); if (building_floor_attrib.RentalFinishTime < DateTime.UtcNow) continue; var building_floor = new BuildingFloor(building); await building_floor.onInit(); var building_floor_action = building_floor.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_floor_action, () => $"building_floor_action is null !!!"); result = building_floor_action.tryLoadBuildingFloorFromDoc(read_doc); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingFloorFromDoc() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building_floor_attribute = building_floor.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(building_floor_attribute, () => $"building_floor_attribute is null !!!"); if (!m_building_floors.TryAdd(building_floor_attribute.Floor, building_floor)) { err_msg = $"Failed to TryAdd() !!! : {building_floor.toBasicString()} : {this.getTypeName()}"; result.setFail(ServerErrorCode.RentalDocLoadDuplicatedRental, err_msg); Log.getLogger().error(result.toBasicString()); return result; } await MapManager.Instance.tryAddRoomMapTreeFromDb(read_doc); } return result; } public bool isEmptyFloor(int floor) { return !m_building_floors.ContainsKey(floor); } public void addBuildingFloor(int floor, BuildingFloor buildingFloor) { m_building_floors[floor] = buildingFloor; } public void removeBuildingFloor(int floor) { m_building_floors.TryRemove(floor, out _); } public ConcurrentDictionary getBuildingFloors() => m_building_floors; } }