using Org.BouncyCastle.Asn1.Ocsp; 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; namespace GameServer { internal class SearchNicknameAction : EntityActionBase { ConcurrentDictionary> m_search_result_pages = new(); string m_latest_search_string = string.Empty; int m_search_result_count = 0; readonly int m_page_nickname_count = 10; // GameConfigData.xlsx 에 추가되어야 함 public SearchNicknameAction(Player owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { return; } public int getSearchResultTotalPageCount() { return m_search_result_pages.Count; } public int getSearchResultCount() { return m_search_result_count; } public async Task<(Result, List?)> trySearchNickname(string searchString, int pageNum) { var result = new Result(); var err_msg = string.Empty; var result_page_num = pageNum; if (m_latest_search_string != searchString || pageNum == 0) { m_search_result_pages.Clear(); // DB 에서 Search (result, var search_result_nicknames) = await NicknameHelper.searchNicknameBeginWith(searchString); if (result.isFail()) { err_msg = $"Failed to searchNicknameBeginWith() !!! : searchString:{searchString} : {this.getTypeName()}"; Log.getLogger().error(err_msg); return (result, null); } NullReferenceCheckHelper.throwIfNull(search_result_nicknames, () => $"search_result_nicknames is null !!!"); m_search_result_count = search_result_nicknames.Count; // Search 결과 Page 별 분할 저장 int last_page = 0; var page_nicknames = new List(); foreach (var nickname in search_result_nicknames) { if (page_nicknames.Count == 0) { last_page++; m_search_result_pages.TryAdd(last_page, page_nicknames); } page_nicknames.Add(nickname); if (page_nicknames.Count >= m_page_nickname_count) { page_nicknames = new List(); } } m_latest_search_string = searchString; if (pageNum == 0) { result_page_num = 1; } } // Page 에 맞는 Nickname들 얻어오기 if (!m_search_result_pages.TryGetValue(result_page_num, out var result_page_nicknames)) { err_msg = $"Failed to m_search_result_nicknames.TryGetValue() !!! : pageNum:{result_page_num} : {this.getTypeName()}"; result.setFail(ServerErrorCode.UserNicknameSearchPageWrong, err_msg); Log.getLogger().error(err_msg); return (result, null); } return (result, result_page_nicknames); } } }