using System.Globalization; using Google.Protobuf.WellKnownTypes; using MetaAssets; using ServerBase; using ServerCommon; using UGQApiServer.Converter; using UGQApiServer.Models; using UGQApiServer.UGQData; using UGQDataAccess; namespace UGQApiServer.Controllers.Common; public class MetaDataApi { UGQMetaData _ugqMetaData; DynamoDbClient _dynamoDbClient; public MetaDataApi(UGQMetaData ugqMetaData, DynamoDbClient dynamoDbClient) { _ugqMetaData = ugqMetaData; _dynamoDbClient = dynamoDbClient; } public async Task getAssignableNpcs(string userGuid, int pageNumber, int pageSize) { if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); (Result result, List? ugcNpcs) = await EntitySearchHelper.findUgcNpcAttribAllByUserGuid(_dynamoDbClient, userGuid, ""); if (result.isFail()) return Results.BadRequest(ApiResponseFactory.error(result.ErrorCode)); var UserNpcPos = MetaHelper.GameConfigMeta.UGQNormalBeaconQuestMarkerPos; List value = new List(); if (ugcNpcs != null) { value.AddRange(ugcNpcs.Select(x => new UGQNpcMetaData { UgcNpcGuid = x.UgcNpcMetaGuid, NpcName = x.Nickname, NpcTitle = x.Title, NpcGender = convertGenderTypeFromItem((int)x.BodyItemMetaId), Location = new Locaion() { x = (int)UserNpcPos.X, y = (int)UserNpcPos.Y }, })); } value.AddRange(_ugqMetaData.getAssignableNpcs().Select(x => new UGQNpcMetaData { NpcId = x.npc_id, NpcName = x.name, NpcTitle = x.NpcTitle, NpcGender = x.Gender, Location = new Locaion() { x = x.UGQmap_x, y = x.UGQmap_y }, })); var paging = value.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new UGQNpcMetaDataList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, Npcs = paging.Take(pageSize).Select(x => x.ToNpcLocale(langEnum)).ToList(), }); } private EGenderType convertGenderTypeFromItem(int itemId) { MetaData.Instance._ItemTable.TryGetValue(itemId, out var item); if(item == null) return EGenderType.ALL; return item.Gender; } public async Task getAvailableTaskActions(int pageNumber, int pageSize) { await Task.CompletedTask; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); var paging = _ugqMetaData.TackActions.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new TaskActionList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, TaskActions = paging.Take(pageSize).Select(x => x.Value.ToTaskAction(langEnum)).ToList(), }); } public async Task getActionValues(string userGuid, int taskActionId, int pageNumber, int pageSize) { await Task.CompletedTask; if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); List taskActions = []; { _ugqMetaData.TackActions.TryGetValue(taskActionId, out var value); if (value == null) return Results.BadRequest(ApiResponseFactory.error(ServerErrorCode.UgqInvalidTaskAction)); if (value.Disabled == true) return Results.BadRequest(ApiResponseFactory.error(ServerErrorCode.UgqTaskActionDisabled)); taskActions = value.TaskActions; } // taskActionId°¡ talkÀÎ °æ¿ì dynamodb¿¡¼­ ³» ¼ÒÀ¯ npc °¡Á®¿Í¾ß ÇÑ´Ù if (taskActionId == UGQMetaData.TALK_ACTION_ID) { (Result result, List? ugcNpcs) = await EntitySearchHelper.findUgcNpcAttribAllByUserGuid(_dynamoDbClient, userGuid, ""); if (result.isFail()) return Results.BadRequest(ApiResponseFactory.error(result.ErrorCode)); if (ugcNpcs != null) { List npcValues = new List(); npcValues.AddRange(ugcNpcs.Select(x => new UGQActionValue { UgcValueGuid = x.UgcNpcMetaGuid, ValueName = x.Nickname, })); npcValues.AddRange(taskActions); taskActions = npcValues; } } var paging = taskActions.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new TaskActionValueList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, Values = paging.Take(pageSize).Select(x => x.ToTaskActionValue(langEnum)).ToList(), }); } public async Task getDialogTypes(int pageNumber, int pageSize) { await Task.CompletedTask; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); var paging = _ugqMetaData.DialogActions.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new DialogTypeList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, DialogTypes = _ugqMetaData.DialogActions.Select(x => x.Value.ToDialogType(langEnum)).ToList(), }); } public async Task getDialogActions(int dialogType, int pageNumber, int pageSize) { await Task.CompletedTask; if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); _ugqMetaData.DialogActions.TryGetValue(dialogType, out var value); if (value == null) return Results.BadRequest(ApiResponseFactory.error(ServerErrorCode.UgqInvalidDialogType)); var paging = value.DialogConditions.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new DialogActionList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, DialogActions = paging.Take(pageSize).Select(x => x.ToDialogAction(langEnum)).ToList(), }); } public async Task getDialogConditionValues(int dialogType, int dialogActionId, int pageNumber, int pageSize) { await Task.CompletedTask; if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); _ugqMetaData.DialogActions.TryGetValue(dialogType, out var value); if (value == null) return Results.BadRequest(ApiResponseFactory.error(ServerErrorCode.UgqInvalidDialogType)); var dialogAction = value.DialogConditions.Find(x => x.ConditionId == dialogActionId); if (dialogAction == null) return Results.BadRequest(ApiResponseFactory.error(ServerErrorCode.UgqInvalidDialogCondition)); var paging = dialogAction.DialogConditionValues.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new DialogActionValueList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, Values = paging.Take(pageSize).Select(x => x.ToDialogActionValue(langEnum)).ToList(), }); } public async Task getNpcActionValues(int pageNumber, int pageSize, EGenderType gender) { await Task.CompletedTask; if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); var npcActionMetaDatas = MetaData.Instance.UGQBeaconActionDataListbyId; if(gender != EGenderType.ALL) { npcActionMetaDatas = npcActionMetaDatas.Where(x => x.Value.Gender == gender || x.Value.Gender == EGenderType.ALL).ToDictionary(x => x.Key, x => x.Value); } var paging = npcActionMetaDatas.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new NpcActionValueList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, Values = paging.Take(pageSize).Select(x => x.Value.ToNpcActionValue(langEnum)).ToList(), }); } public async Task getMapDataValues(int pageNumber, int pageSize) { await Task.CompletedTask; if (pageNumber < 1) pageNumber = 1; pageSize = Math.Clamp(pageSize, 1, UGQConstants.MAX_INPUT_PAGE_SIZE); var zoneMetaDatas = MetaData.Instance.ZoneMetaDataListbyId; var paging = zoneMetaDatas.Skip((pageNumber - 1) * pageSize).Take(pageSize + 1).ToList(); bool hasNextPage = false; if (paging.Count > pageSize) hasNextPage = true; LangEnum langEnum = Culture.ToLangEnum(CultureInfo.CurrentCulture.Name); return Results.Ok(new MapDataValueList { PageNumber = pageNumber, PageSize = pageSize, HasNextPage = hasNextPage, Values = paging.Take(pageSize).Select(x => x.Value.ToMapDataValue(langEnum)).ToList(), }); } public async Task getPresetImages(PresetKind kind, PresetCategory category) { await Task.CompletedTask; if (_ugqMetaData.PresetImages.TryGetValue((kind, category), out var presetImages) == false) return Results.BadRequest(); return Results.Ok(presetImages.Select(x => x.ToDTO()).ToList()); } }