using Amazon.DynamoDBv2.DocumentModel; using Newtonsoft.Json; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using System.Collections.Generic; using System; namespace GameServer; internal static class MyhomeHelper { public static Result getMyhomeOwnerUserGuidAndMyhomeGuidFromRoomId(string roomId, out string myhomeOwnerUserGuid, out string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; myhomeOwnerUserGuid = string.Empty; myhomeGuid = string.Empty; var roomIdElement = roomId.Split(":"); if (roomIdElement.Length != ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT) { err_msg = $"MyHome RoomId Element Count Wrong !!! : instanceRoomId:{roomId}"; result.setFail(ServerErrorCode.RoomIsNotMyHome, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (roomIdElement[0] != ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID) { err_msg = $"MyHome RoomId Prefix Is Not {ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID} !!! : instanceRoomId:{roomId}"; result.setFail(ServerErrorCode.RoomIsNotMyHome, err_msg); Log.getLogger().error(result.toBasicString()); return result; } myhomeOwnerUserGuid = roomIdElement[1]; myhomeGuid = roomIdElement[2]; return result; } public static async Task<(Result, MyHomeAttrib?)> getEnterMyhomeAttribFromDynamoDb(string userGuid, string enterMyhomeGuid = "") { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var db_client = server_logic.getDynamoDbClient(); var myhome_doc = new MyhomeDoc(); myhome_doc.setCombinationKeyForPK(userGuid); myhome_doc.onApplyPKSK(); QueryOperationConfig query_config = db_client.makeQueryConfigForReadByPKOnly(myhome_doc.getPK()); (result, var read_docs) = await db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); MyHomeAttrib? myhome_attrib = default; foreach (var doc in read_docs) { myhome_attrib = doc.getAttrib(); if (myhome_attrib == null) continue; if (enterMyhomeGuid == "" && myhome_attrib.SelectedFlag == 1) return (result, myhome_attrib); if (enterMyhomeGuid == myhome_attrib.MyhomeGuid) return (result, myhome_attrib); } err_msg = $"Myhome Not Found !!! : userGuid:{userGuid}, myhomeGuid:{enterMyhomeGuid}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, myhome_attrib); } public static Result checkMyhomeName(string myhomeName) { var result = new Result(); var err_msg = string.Empty; var myhome_name_min_length = MetaHelper.GameConfigMeta.MyhomenameMinLength; var myhome_name_max_length = MetaHelper.GameConfigMeta.MyhomenameMaxLength; if (myhomeName.Length < myhome_name_min_length) { err_msg = $"Myhome Name Length Long !!! : myhomeName:{myhomeName}"; result.setFail(ServerErrorCode.MyhomeNameLengthShort, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (myhomeName.Length > myhome_name_max_length) { err_msg = $"Myhome Name Length Long !!! : myhomeName:{myhomeName}"; result.setFail(ServerErrorCode.MyhomeNameLengthLong, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public static Result checkMyhomeUgcInfo(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; result = checkDuplicateAnchorGuid(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkDuplicateAnchorGuid() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = checkMyhomeInteriorPoint(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkMyhomeInteriorPoint() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = checkMyhomeInterphone(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkMyhomeInterphone() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = checkMyhomeStartPoint(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkMyhomeStartPoint() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = checkCrafterCount(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkCrafterCount() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = checkMyhomeUgcNpc(myhomeUgcInfo); if (result.isFail()) { err_msg = $"Failed to checkMyhomeUgcNpc() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; } public static Result checkDuplicateAnchorGuid(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; var anchor_guids = new HashSet(); foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { var anchor_guid = anchorInfo.AnchorGuid; if (!anchor_guids.Add(anchor_guid)) { err_msg = $"AnchorGuid Duplicate In Myhome Ugc !!! : anchorGuid:{anchor_guid}"; result.setFail(ServerErrorCode.AnchorGuidDuplicate, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } return result; } public static Result checkMyhomeInteriorPoint(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(myhomeUgcInfo.RoomType, out var editableRoomMetaData)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : editableRoomMetaId:{myhomeUgcInfo.RoomType}"; result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var total_interior_point = 0; foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos) { if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}"; result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } total_interior_point += editableFrameworkMetaData.InteriorPoint; } foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isProp()) continue; if (!MetaData.Instance._InteriorMetaTable.TryGetValue(anchorInfo.TableId, out var interiorMetaData)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : interiorMetaId:{anchorInfo.TableId}"; result.setFail(ServerErrorCode.InteriorMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } total_interior_point += interiorMetaData.InteriorPoint; } if (total_interior_point > editableRoomMetaData.LimitInteriorPoint) { err_msg = $"Myhome Ugc Total InteriorPoint:{total_interior_point} > LimitInteriorPoint:{editableRoomMetaData.LimitInteriorPoint}"; result.setFail(ServerErrorCode.InteriorPointExceed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public static Result checkMyhomeInterphone(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; var myhome_interphone_framework_meta_id = MetaHelper.GameConfigMeta.MyhomeInterphone; var is_exist_interphone = false; foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos) { if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData)) { err_msg = $"Failed to TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}"; result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (editableFrameworkMetaData.id == myhome_interphone_framework_meta_id) { if (is_exist_interphone) { err_msg = $"Myhome Interphone Exceed !!!"; result.setFail(ServerErrorCode.MyhomeInterphoneExceed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } is_exist_interphone = true; } } if (!is_exist_interphone) { err_msg = $"Myhome Interphone Not Exist !!!"; result.setFail(ServerErrorCode.MyhomeInterphoneNotExist, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public static Result checkMyhomeStartPoint(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; var myhome_start_point_framework_meta_id = MetaHelper.GameConfigMeta.MyhomeStartPoint; var is_exist_start_pos = false; foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos) { if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData)) { err_msg = $"Failed to TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}"; result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (editableFrameworkMetaData.id == myhome_start_point_framework_meta_id) { if (is_exist_start_pos) { err_msg = $"Myhome StartPos Exceed !!!"; result.setFail(ServerErrorCode.MyhomeStartPointExceed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } is_exist_start_pos = true; } } if (!is_exist_start_pos) { err_msg = $"Myhome StartPos Not Exist !!!"; result.setFail(ServerErrorCode.MyhomeStartPointNotExist, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public static Result checkCrafterCount(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(myhomeUgcInfo.RoomType, out var editable_room_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : editableRoomMetaId:{myhomeUgcInfo.RoomType}"; result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var crafter_count = 0; foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isCrafterProp()) continue; ++crafter_count; } if (crafter_count > editable_room_meta_data.MaxCrafterCount) { err_msg = $"Myhome Crafter Count Exceed !!! Count:{crafter_count} > Allow:{editable_room_meta_data.MaxCrafterCount}"; result.setFail(ServerErrorCode.CrafterCountExceed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public static Result checkMyhomeUgcNpc(MyhomeUgcInfo myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; var ugc_npc_guids = new HashSet(); foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isNpcProp()) continue; var ugc_npc_guid = anchorInfo.EntityGuid; if (!ugc_npc_guids.Add(ugc_npc_guid)) { err_msg = $"Ugc Npc Duplicate In Myhome Ugc !!! : ugcNpcGuid:{ugc_npc_guid}"; result.setFail(ServerErrorCode.UgcNpcDuplicateInMyhomeUgc, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } return result; } public static (Dictionary? userToMyhome, Dictionary? myhomeToUser) getModifyInteriorItems(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo) { var old_interior_items = oldMyhomeUgcInfo.getMyhomeInteriorItems(); var new_interior_items = newMyhomeUgcInfo.getMyhomeInteriorItems(); var user_to_myhome_items = new Dictionary(); foreach (var (item_guid, new_count) in new_interior_items) { old_interior_items.TryGetValue(item_guid, out var old_count); var diff_count = new_count - old_count; if (diff_count > 0) { user_to_myhome_items[item_guid] = diff_count; } } var myhome_to_user_items = new Dictionary(); foreach (var (item_guid, old_count) in old_interior_items) { new_interior_items.TryGetValue(item_guid, out var new_count); var diff_count = old_count - new_count; if (diff_count > 0) { myhome_to_user_items[item_guid] = diff_count; } } return (user_to_myhome_items, myhome_to_user_items); } public static Dictionary getMyhomeInteriorItems(this MyhomeUgcInfo myhomeUgcInfo) { var items = new Dictionary(); foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isProp()) continue; items.TryGetValue(anchorInfo.EntityGuid, out var count); items[anchorInfo.EntityGuid] = count + 1; } return items; } public static (List addInfos, List removeInfos, List modifyInfos) getModifyUgcNpcAnchorInfos(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo) { var old_ugc_npc_anchor_infos = oldMyhomeUgcInfo.getUgcNpcAnchorInfos(); var new_ugc_npc_anchor_infos = newMyhomeUgcInfo.getUgcNpcAnchorInfos(); var modify_ugc_npc_anchor_infos = new List(); var add_ugc_npc_anchor_infos = new List(); foreach (var (new_anchor_guid, new_ugc_npc_anchor_info) in new_ugc_npc_anchor_infos) { // 엥커 비교 (존재 하지 않으면 추가됨) if (old_ugc_npc_anchor_infos.TryGetValue(new_anchor_guid, out var old_ugc_npc_anchor_info)) { // 엥커 존재 // NpcGuid 비교 (같지 않으면 추가됨) if (new_ugc_npc_anchor_info.EntityGuid == old_ugc_npc_anchor_info.EntityGuid) { // NpcGuid 동일 // 정보 비교 (같지 않으면 변경됨) if (!new_ugc_npc_anchor_info.Equals(old_ugc_npc_anchor_info)) { modify_ugc_npc_anchor_infos.Add(new_ugc_npc_anchor_info); } continue; } } add_ugc_npc_anchor_infos.Add(new_ugc_npc_anchor_info); } var remove_ugc_npc_anchor_infos = new List(); foreach (var (old_anchor_guid, old_ugc_npc_anchor_info) in old_ugc_npc_anchor_infos) { // 엥커 비교 (존재 하지 않으면 제거됨) if (new_ugc_npc_anchor_infos.TryGetValue(old_anchor_guid, out var new_ugc_npc_anchor_info)) { // 엥커 존재 // NpcGuid 비교 (같지 않으면 제거됨) if (old_ugc_npc_anchor_info.EntityGuid == new_ugc_npc_anchor_info.EntityGuid) continue; } remove_ugc_npc_anchor_infos.Add(old_ugc_npc_anchor_info); } return (add_ugc_npc_anchor_infos, remove_ugc_npc_anchor_infos, modify_ugc_npc_anchor_infos); } public static Dictionary getUgcNpcAnchorInfos(this MyhomeUgcInfo myhomeUgcInfo) { var ugc_npc_anchor_infos = new Dictionary(); foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isNpcProp()) continue; ugc_npc_anchor_infos.TryAdd(anchorInfo.AnchorGuid, anchorInfo); } return ugc_npc_anchor_infos; } public static (List addGuids, List removeGuids) getModifyCrafterAnchorGuids(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo) { var old_crafter_anchor_infos = oldMyhomeUgcInfo.getCrafterAnchorInfos(); var new_crafting_anchor_infos = newMyhomeUgcInfo.getCrafterAnchorInfos(); var add_crafter_anchor_guids = new List(); foreach (var (anchor_guid, anchor_info) in new_crafting_anchor_infos) { if (old_crafter_anchor_infos.TryGetValue(anchor_guid, out _)) continue; add_crafter_anchor_guids.Add(anchor_guid); } var remove_crafting_anchor_guids = new List(); foreach (var (anchor_guid, anchor_info) in old_crafter_anchor_infos) { if (new_crafting_anchor_infos.TryGetValue(anchor_guid, out _)) continue; remove_crafting_anchor_guids.Add(anchor_guid); } return (add_crafter_anchor_guids, remove_crafting_anchor_guids); } public static Dictionary getCrafterAnchorInfos(this MyhomeUgcInfo myhomeUgcInfo) { var crafter_anchor_infos = new Dictionary(); foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos) { if (!anchorInfo.isCrafterProp()) continue; crafter_anchor_infos.TryAdd(anchorInfo.AnchorGuid, anchorInfo); } return crafter_anchor_infos; } public static Position getMyhomeStartPosAnchorPosition(this MyhomeUgcInfo myhomeUgcInfo) { var startPos = new Position(); foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos) { if (frameworkInfo.InteriorItemId != MetaHelper.GameConfigMeta.MyhomeStartPoint) continue; startPos.X = frameworkInfo.Coordinate.X; startPos.Y = frameworkInfo.Coordinate.Y; startPos.Z = frameworkInfo.Coordinate.Z; } return startPos; } public static MyHomeInfo toMyhomeInfo(this MyhomeAttribute myhomeAttribute) { var myhome_info = new MyHomeInfo(); myhome_info.MyhomeGuid = myhomeAttribute.MyhomeGuid; myhome_info.MyhomeName = myhomeAttribute.MyhomeName; myhome_info.MyhomeUgcInfo = myhomeAttribute.UgcInfo; return myhome_info; } public static string makeMyhomeUgcInfoS3FileName() { return $"{Guid.NewGuid().ToString("N")}.ugcinfo"; } public static string makeMyhomeUgcInfoS3Key(MyHomeAttrib myhomeAttrib) { return makeMyhomeUgcInfoS3Key(myhomeAttrib.MyhomeGuid, myhomeAttrib.MyhomeUgcInfoS3FileName); } public static string makeMyhomeUgcInfoS3Key(MyhomeAttribute myhomeAttribute) { return makeMyhomeUgcInfoS3Key(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName); } public static string makeMyhomeUgcInfoS3Key(string myhomeGuid, string myhomeUgcInfoS3FileName) { return $"{myhomeGuid}/{myhomeUgcInfoS3FileName}"; } public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(MyHomeAttrib myhomeAttrib) { return await getMyhomeUgcInfo(myhomeAttrib.MyhomeGuid, myhomeAttrib.MyhomeUgcInfoS3FileName); } public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(MyhomeAttribute myhomeAttribute) { return await getMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName); } public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName) { var result = new Result(); var err_msg = string.Empty; var myhome_ugc_info_json = string.Empty; var server_logic = GameServerApp.getServerLogic(); var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName; if (server_logic.getServerConfig().OfflineMode) { var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}"; myhome_ugc_info_json = File.ReadAllText(file_path); } else { var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName); var s3_client = server_logic.getS3Connector(); (result, myhome_ugc_info_json) = await s3_client.getMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key); if (result.isFail()) { err_msg = $"Failed to getMyhomeUgcInfo() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null); } } var myhome_ugc_info = JsonConvert.DeserializeObject(myhome_ugc_info_json); if (myhome_ugc_info == null) { err_msg = $"Failed to JsonConvert.DeserializeObject() !!!"; result.setFail(ServerErrorCode.JsonConvertDeserializeFailed, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } return (result, myhome_ugc_info); } public static async Task uploadMyhomeUgcInfo(MyhomeAttribute myhomeAttribute) { return await uploadMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName, myhomeAttribute.UgcInfo.toJson()); } public static async Task uploadMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName, string myhomeUgcInfo) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName; if (server_logic.getServerConfig().OfflineMode) { var folder_path = $"./S3/{bucket_name}/{myhomeGuid}"; var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}"; if (!Directory.Exists(folder_path)) { Directory.CreateDirectory(folder_path); } File.WriteAllText(file_path, myhomeUgcInfo); } else { var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName); ArgumentNullException.ThrowIfNull(myhome_ugc_info_s3_key, $"myhome_ugc_info_s3_key is null !!!"); var s3_client = server_logic.getS3Connector(); result = await s3_client.uploadMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key, myhomeUgcInfo); if (result.isFail()) { err_msg = $"Fail to uploadMyhomeUgcInfo() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } } return result; } public static async Task deleteMyhomeUgcInfo(MyhomeAttribute myhomeAttribute) { return await deleteMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName); } public static async Task deleteMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName; if (server_logic.getServerConfig().OfflineMode) { var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}"; File.Delete(file_path); } else { var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName); ArgumentNullException.ThrowIfNull(myhome_ugc_info_s3_key, $"myhome_ugc_info_s3_key is null !!!"); var s3_client = server_logic.getS3Connector(); result = await s3_client.deleteMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key); if (result.isFail()) { err_msg = $"Fail to deleteMyhomeUgcInfo() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } } return result; } public static async Task deleteMyhomeUgcInfoFolderFile(MyhomeAttribute myhomeAttribute) { return await deleteMyhomeUgcInfoFolderFile(myhomeAttribute.MyhomeGuid); } public static async Task deleteMyhomeUgcInfoFolderFile(string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName; if (server_logic.getServerConfig().OfflineMode) { var folder_path = $"./S3/{bucket_name}/{myhomeGuid}"; Directory.Delete(folder_path, true); } else { var s3_client = server_logic.getS3Connector(); result = await s3_client.deleteMyhomeUgcInfoFolderFile(bucket_name, myhomeGuid); if (result.isFail()) { err_msg = $"Fail to deleteMyhomeUgcInfoFolderFile() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } } return result; } public static async Task checkMyhomeIsEditting(string myhomeGuid, string myhomeOwnerGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!!"); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var edit_room_instance_room_id_base = InstanceRoomHandler.makeEditRoomInstanceRoomIdBase(myhomeOwnerGuid); var edit_room_instance_room_id = await InstanceRoomHandler.makeInstanceRoomId(edit_room_instance_room_id_base, 0); var edit_room_instance_room_info = await instance_room_storage.GetInstanceRoomInfo(edit_room_instance_room_id); if (edit_room_instance_room_info != null) { if (edit_room_instance_room_info.MyhomeGuid == myhomeGuid) { err_msg = $"Myhome is Editting !!! : myhomeGuid:{myhomeGuid}"; result.setFail(ServerErrorCode.MyhomeIsEditting, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } return result; } public static Result getMyhomeInstanceId(int editableRoomId, out int instanceId) { var result = new Result(); var err_msg = string.Empty; instanceId = 0; if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(editableRoomId, out var editable_room_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : editableRoomMetaId:{editableRoomId}"; result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } switch(editable_room_meta_data.SizeType) { case MetaAssets.SizeType.SMALL: { instanceId = MetaHelper.GameConfigMeta.SmallTypeMyhome; } break; case MetaAssets.SizeType.MEDIUM: { instanceId = MetaHelper.GameConfigMeta.MediumTypeMyhome; } break; case MetaAssets.SizeType.LARGE: { instanceId = MetaHelper.GameConfigMeta.LargeTypeMyhome; } break; case MetaAssets.SizeType.GIANT: { instanceId = MetaHelper.GameConfigMeta.GiantTypeMyhome; } break; default: { err_msg = $"SizeType invalid !!! : {editable_room_meta_data.SizeType.ToString()}"; result.setFail(ServerErrorCode.EditableRoomSizeTypeInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } return result; } }