Mail - osy9611/ProjectPT GitHub Wiki

Mail

ν•΄λ‹Ή λ¬Έμ„œλŠ” λΆ•κ΄΄ μŠ€νƒ€λ ˆμΌμ˜ 우편 μ‹œμŠ€ν…œμ„ λͺ¨μž‘ν•œ λ‚΄μš©μ„ κΈ°λ‘ν•œ λ¬Έμ„œμ΄λ‹€.

ν˜„μž¬ μ„œλ²„ 연동이 μ—†λŠ” μƒνƒœμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μž„μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜κ³  있으며, ν–₯ν›„ μ„œλ²„ μΆ”κ°€ μ‹œ μˆ˜μ •λ  ꡬ쑰λ₯Ό κ³ λ €ν•˜μ—¬ 섀계가 λ˜μ—ˆλ‹€.

κ²°κ³Όλ¬Ό

bandicam2025-02-2014-12-32-628-ezgif com-video-to-gif-converter

μ£Όμš” κΈ°λŠ₯

  • 메일 리슀트 λ·°

    • 받은 메일을 리슀트 ν˜•νƒœλ‘œ 확인 κ°€λŠ₯

    • μ„œλ²„μ—μ„œ ν•œ λ²ˆμ— λ§Žμ€ 메일을 λ³΄λ‚΄λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λΆ„ν•  μš”μ²­μ„ 처리

    • 슀크둀 νŠΉμ • μœ„μΉ˜ 도달 μ‹œ μƒˆλ‘œμš΄ 메일 데이터λ₯Ό μš”μ²­ν•˜μ—¬ 좔가적인 νŒ¨ν‚· λ‘œλ“œλ₯Ό μ΅œμ†Œν™”

    • μ„œλ²„μ—μ„œ 받은 메일 개수λ₯Ό μ΄ˆκ³Όν•˜λ©΄ 더 이상 μš”μ²­ν•˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„

    • μ„œλ²„ μš”μ²­ 흐름(ν–₯ν›„ μ„œλ²„ 연동 μ‹œ)

      1. 슀크둀이 70% 이상 λ‚΄λ €κ°€λ©΄ 메일 μΆ”κ°€ μš”μ²­
      2. μ„œλ²„μ—μ„œ μΆ”κ°€ 메일 데이터λ₯Ό λ°˜ν™˜
      3. κΈ°μ‘΄ λ¦¬μŠ€νŠΈμ—μ„œ μƒˆλ‘œμš΄ 메일을 μΆ”κ°€
      4. λ§Œμ•½ μ„œλ²„μ—μ„œ β€œλ” 이상 메일 μ—†μŒβ€ 응닡을 λ°›μœΌλ©΄ μΆ”κ°€ μš”μ²­ 쀑지

      μ„œλ²„ μš”μ²­ λ‹€μ΄μ–΄κ·Έλž¨ (μ˜ˆμ‹œ)

      [슀크둀 νŠΉμ • μœ„μΉ˜ 도달] β†’ [μ„œλ²„μ— μΆ”κ°€ 메일 μš”μ²­] β†’ [μ„œλ²„ 응닡 μˆ˜μ‹ ] β†’ [UI μ—…λ°μ΄νŠΈ]
  • 메일 상세 νŒμ—…

    • μ„ νƒν•œ λ©”μΌμ˜ 제λͺ©, λ°œμ‹ μž, λ‚΄μš©, 첨뢀 보상 등을 확인 κ°€λŠ₯
  • 보상 수령 및 메일 μ‚­μ œ

    • 보상 수령 ν›„ μ‚­μ œ κ°€λŠ₯ (ν˜„μž¬λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μž„μ‹œ 처리)
    • ν–₯ν›„ μ„œλ²„ μΆ”κ°€ μ‹œ μš”μ²­ - 응닡을 기반으둜 μ‚­μ œ 방식 λ³€κ²½ μ˜ˆμ •

뢄석 및 고렀사항

우편 데이터 ꡬ쑰

  • μš΄μ˜νˆ΄μ—μ„œ μƒμ„±λœ 메일과 μ‹œμŠ€ν…œ 메일을 ꡬ뢄

    • μš΄μ˜νˆ΄μ—μ„œ 직접 μƒμ„±ν•˜λŠ” 메일과 κ²Œμž„ μ‹œμŠ€ν…œμ—μ„œ μžλ™ λ°œμ†‘ν•˜λŠ” 메일을 λΆ„λ¦¬ν•˜μ—¬ 관리
    • μ„œλ²„μ—μ„œ 받은 λ°μ΄ν„°μ˜ ν…Œμ΄λΈ” IDκ°€ 0이면 μš΄μ˜νˆ΄μ—μ„œ μƒμ„±ν•œ λ©”μΌλ‘œ κ°„μ£Ό
  • 데이터 ꡬ쑰

    tableNo MailType MailName MailDesc
    int MailType string string

μ„œλ²„ 연동 및 ν™•μž₯μ„±

  • 메일 데이터 μš”μ²­ 흐름
    1. 메일 UI 슀크둀 νŠΉμ • μœ„μΉ˜(70%)에 λ„λ‹¬ν•˜λ©΄ μΆ”κ°€ μš”μ²­ λ°œμƒ
    2. μ„œλ²„μ—μ„œ μƒˆλ‘œμš΄ 데이터λ₯Ό κ°€μ Έμ˜΄
    3. μ„œλ²„μ—μ„œ 받을 수 μžˆλŠ” μ΅œλŒ€ 메일을 μ΄ˆκ³Όν™”λ©΄ μΆ”κ°€ μš”μ²­ 쀑지
  • μ„œλ²„κ°€ μΆ”κ°€λ˜λ©΄ μ‚­μ œ 둜직 λ³€κ²½
    • ν˜„μž¬λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ¦‰μ‹œ μ‚­μ œλ˜μ§€λ§Œ μ„œλ²„ 연동 ν›„μ—λŠ” μš”μ²­ νŒ¨ν‚·μ„ 보내고 응닡을 받은 ν›„ μ‚­μ œλ˜λ„λ‘ 변경될 μ˜ˆμ •

UI/UI κ³ λ € 사항

  • RedDot 처리
    • 보상을 λ°›μ§€ μ•Šμ€ 메일은 λ ˆλ“œλ‹· ν‘œμ‹œλ₯Ό 톡해 미확인 λ©”μΌμž„μ„ λͺ…ν™•νžˆ 함
    • μ‹ κ·œ 메일 도착 μ‹œ λ‘œλΉ„μ˜ 메일 UI에도 λ ˆλ“œλ‹· ν™œμ„±ν™”
  • 메일 리슀트 μ—…λ°μ΄νŠΈ μ΅œμ ν™”
    • 전체 데이터λ₯Ό 맀번 μž¬μƒμ„±ν•˜λŠ” λŒ€μ‹ , κΈ°μ‘΄ 데이터 μ—…λ°μ΄νŠΈ, μ‹ κ·œ 데이터 μΆ”κ°€, λΆˆν•„μš”ν•œ 데이터 μ‚­μ œλ₯Ό 톡해 μ„±λŠ₯ μ΅œμ ν™”

κ΅¬ν˜„ λ‚΄μš©

μ„œλ²„ 데이터 처리

  • μ„œλ²„μ—μ„œ 데이터λ₯Ό 받더라도, ν΄λΌμ΄μ–ΈνŠΈλŠ” 만료된 메일을 ν˜„μž¬ μ‹œκ°„κ³Ό λΉ„κ΅ν•˜μ—¬ μ‚­μ œ

  • μ£Όμš” μ½”λ“œ

    // 만료된 메일 μžλ™ μ‚­μ œ (μ„œλ²„ 톡신 μ „ λ‹¨κ³„μ—μ„œ 정리)
    MailDatas.RemoveAll([](const FMailData& MailData) {
    	return MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks();
    	});

메일 μ—…λ°μ΄νŠΈ κ°±μ‹  및 λ ˆλ“œλ‹· 처리

  • 보상을 아직 λ°›μ§€ μ•Šμ€ 메일이 μžˆλŠ” 경우 λ ˆλ“œλ‹·μ„ ν™œμ„±ν™”

  • μ£Όμš” μ½”λ“œ

    void UPTPlayerDataSubsystem::UpdateMails() 
    {
        bool RedDotActive = MailDatas.ContainsByPredicate([](const FMailData& MailData) {
            return MailData.ReceivedDate.GetTicks() == 0;
        });
        UpdateContentRedDot(ERedDotType::Mail, RedDotActive);
    
        const FPTGameplayTags& GameplayTags = FPTGameplayTags::Get();
        UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this);
        FUIUpdateMailMessage Message;
        MessageSubsystem.BroadcastMessage(GameplayTags.UI_Event_MailUpdate, Message);
    }

메일 리슀트 μ—…λ°μ΄νŠΈ 및 μ„œλ²„ λΆ„ν•  μš”μ²­

  • 슀크둀 νŠΉμ • μœ„μΉ˜(70%) 도달 μ‹œ μƒˆλ‘œμš΄ 메일 데이터λ₯Ό μš”μ²­

  • μ£Όμš” μ½”λ“œ

    void UPTMailWidget::RegisterGetMailDataCallback()
    {
    	// ν˜„μž¬ μœ„μΉ˜μ˜ 70% 정도가 되면 메일 μ—…λ°μ΄νŠΈ μš”μ²­μ„ μ§„ν–‰
    	int32 NumItems = MailListView->GetNumItems();
    	int32 Index = FMath::FloorToInt(NumItems * RecieveScrollPercent);
    	Index = FMath::Clamp(Index, 0, NumItems - 1);
    
    	UObject* Target = MailListView->GetItemAt(Index);
    	if (UPTMailCellData* CellData = Cast<UPTMailCellData>(Target))
    	{
    		CellData->OnGetMailDataCallback = [this]()
    			{
    				RequesetRecieveMailData();
    			};
    	}
    }

메일 μ‚­μ œ

  • μ„œλ²„κ°€ μ—†κΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‚­μ œλ₯Ό μž„μ‹œ μ²˜λ¦¬ν•˜μ§€λ§Œ, ν–₯ν›„ μ„œλ²„μ—μ„œ 응닡 ν›„ μ‚­μ œν•˜λ„λ‘ λ³€κ²½ μ˜ˆμ •

  • μ„œλ²„ 연동 ν›„μ—λŠ” μš”μ²­μ„ 보내고 응닡을 받은 ν›„ μ‹€μ œ μ‚­μ œκ°€ μ΄λ£¨μ–΄μ§€λŠ” λ°©μ‹μœΌλ‘œ λ³€κ²½

  • ν˜„μž¬λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ¦‰μ‹œ μ‚­μ œν•˜μ§€λ§Œ, ν–₯ν›„ μ„œλ²„ 검증 ν›„ μ‚­μ œ 적용

  • μ£Όμš” μ½”λ“œ

    void UPTPlayerDataSubsystem::RequestDeleteMail(FGameplayTag InChannel, const FDeleteMailMessage& InMessage)
    {
    	TArray<FMailData> RemoveMails = MailDatas.FilterByPredicate([InMessage](const FMailData& MailData)
    		{
    			bool CanRemove = MailData.ReceivedDate.GetTicks() > 0 || MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks();
    			return CanRemove && InMessage.Pids.Contains(MailData.Pid);
    		});
    
    	if (!RemoveMails.IsEmpty())
    	{
    		//ν•΄λ‹Ή 뢀뢄은 μ„œλ²„κ°€ μžˆλ‹€λ©΄ μ„œλ²„μ—μ„œ 받은 데이터 처리λ₯Ό ν•˜κ³  UpdateMails()λ₯Ό ν˜ΈμΆœν•œλ‹€.
    		MailDatas.RemoveAll([InMessage](const FMailData& MailData)
    			{
    				bool CanRemove = MailData.ReceivedDate.GetTicks() > 0 || MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks();
    				return CanRemove && InMessage.Pids.Contains(MailData.Pid);
    			});
    		UpdateMails();
    	}
    }

메일 보상

  • 보상 λ―Έ 수령 메일에 λŒ€ν•΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 보상 μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , UI νŒμ—…μ„ 톡해 보상 내역을 ν‘œμ‹œ

  • μ£Όμš” μ½”λ“œ

    void UPTPlayerDataSubsystem::RequestReceiveReward(FGameplayTag InChannel, const FRecieveRewardMessage& InMessage)
    {
        UE_LOG(PTLog, Error, TEXT("[PTPlayerDataSubsystem] RequestReceiveReward"));
    
        if (InMessage.Pids.IsEmpty())
            return;
    
        TArray<FMailData> MergeRewardDatas;
        FDateTime CurrentTime = FDateTime::Now();
        for (const FString& Pid : InMessage.Pids)
        {
            FMailData* MailData = MailDatas.FindByPredicate([Pid](const FMailData& MailData)
            {
                return MailData.Pid == Pid;
            });
    
            if (!MailData)
                continue;
    
            MailData->ReceivedDate = CurrentTime;
            MergeRewardDatas.Add(*MailData);
        }
    
        if (!MergeRewardDatas.IsEmpty())
        {
            TArray<FItemReward> ItemRewards = MergeRewardData(MergeRewardDatas);
            UPTUIManagerSubsystem* UIManager = GetWorld()->GetGameInstance()->GetSubsystem<UPTUIManagerSubsystem>();
            UIManager->ShowItemRewardPopup(ItemRewards);
        }
    
        UpdateMails();
    }
⚠️ **GitHub.com Fallback** ⚠️