113 FInputModeUIOnly InputMode;
115 PC->SetInputMode(InputMode);
116 PC->SetShowMouseCursor(
true);
132 FInputModeGameOnly InputMode;
133 PC->SetInputMode(InputMode);
134 PC->SetShowMouseCursor(
false);
137 FSlateApplication::Get().SetAllUserFocusToGameViewport();
152 FString LeftPart, RightPart;
155 if (InMessage.Split(TEXT(
":"), &LeftPart, &RightPart))
158 if (LeftPart.TrimStartAndEnd().Equals(
DefineData::AI, ESearchCase::IgnoreCase))
160 OutQuestion = RightPart.TrimStart();
161 return !OutQuestion.IsEmpty();
169 FString LeftPart, RightPart;
171 if (InMessage.Split(TEXT(
":"), &LeftPart, &RightPart))
173 if (LeftPart.TrimStartAndEnd().Equals(
DefineData::Daily, ESearchCase::IgnoreCase))
175 OutQuestion = RightPart.TrimStart();
176 return !OutQuestion.IsEmpty();
186 if (Message.IsEmpty())
193 auto* PC = Cast<APlayerControl>(GetWorld()->GetFirstPlayerController());
197 const FString MessageStr = Message.ToString();
198 FString CleanQuestion;
200 if (
IsAIAsk(MessageStr, CleanQuestion))
203 PC->ServerRPC_SendChat(Message);
206 PC->ServerRPC_SendAIQuestion(CleanQuestion);
208 PRINTLOG(TEXT(
"[AI Chat] User question: %s"), *CleanQuestion);
210 else if (
IsDailyAsk(MessageStr, CleanQuestion))
218 PRINTLOG(TEXT(
"[Daily] Word generation request: %s"), *CleanQuestion);
224 PC->ServerRPC_SendChat(Message);
239 TArray<FWordData> RandomWordDataArray;
244 PRINTLOG(TEXT(
"[Daily] Error: GameDataManager not found"));
245 return RandomWordDataArray;
251 if (AllKeys.Num() == 0)
253 PRINTLOG(TEXT(
"[Daily] Error: No ReadData available"));
254 return RandomWordDataArray;
258 int32 WordsToGenerate = FMath::Min(Count, AllKeys.Num());
260 for (int32 i = 0; i < WordsToGenerate; ++i)
263 int32 RandomIndex = FMath::RandRange(0, AllKeys.Num() - 1);
264 int32 RandomKey = AllKeys[RandomIndex];
265 AllKeys.RemoveAt(RandomIndex);
274 WordData.
Eng = ReadData.
Eng;
277 RandomWordDataArray.Add(WordData);
281 PRINTLOG(TEXT(
"[Daily] Generated %d random word data from ReadData"), RandomWordDataArray.Num());
282 return RandomWordDataArray;
287 const int32 MIN_REQUIRED_WORDS = 3;
294 if (FallbackWordData.Num() > 0)
296 if (
UPopup_DailyStudy* DailyStudyPopup = UPopupManager::Get(GetWorld())->ShowPopupAs<UPopup_DailyStudy>(EPopupType::DailyStudy))
298 DailyStudyPopup->InitPopup(FallbackWordData);
306 TArray<FString> RawTokens;
307 ResponseData.
answer.ParseIntoArray(RawTokens, TEXT(
"|"),
true);
310 TArray<FWordData> ValidWordDataArray;
311 for (int32 i = 0; i + 2 < RawTokens.Num(); i += 3)
313 FString Kor = RawTokens[i].TrimStartAndEnd();
314 FString Eng = RawTokens[i + 1].TrimStartAndEnd();
315 FString Pronunciation = RawTokens[i + 2].TrimStartAndEnd();
318 if (Kor.IsEmpty() || Eng.IsEmpty() || Pronunciation.IsEmpty())
320 PRINTLOG(TEXT(
"[Daily] Skipped: Empty field (Kor: '%s', Eng: '%s', Phon: '%s')"), *Kor, *Eng, *Pronunciation);
327 PRINTLOG(TEXT(
"[Daily] Skipped: Invalid Korean word '%s'"), *Kor);
337 ValidWordDataArray.Add(WordData);
338 PRINTLOG(TEXT(
"[Daily] Parsed Word: Kor='%s', Eng='%s', Phon='%s'"), *Kor, *Eng, *Pronunciation);
342 if (ValidWordDataArray.Num() < MIN_REQUIRED_WORDS)
344 int32 WordsNeeded = MIN_REQUIRED_WORDS - ValidWordDataArray.Num();
347 ValidWordDataArray.Append(AdditionalWordData);
349 PRINTLOG(TEXT(
"[Daily] Added %d fallback words from ReadData"), AdditionalWordData.Num());
353 if (ValidWordDataArray.Num() > 0)
355 if (
UPopup_DailyStudy* DailyStudyPopup = UPopupManager::Get(GetWorld())->ShowPopupAs<UPopup_DailyStudy>(EPopupType::DailyStudy))
357 DailyStudyPopup->InitPopup(ValidWordDataArray);
358 PRINTLOG(TEXT(
"[Daily] Initialized DailyStudy popup with %d words"), ValidWordDataArray.Num());