int AskForConfirmation(anime::Episode& episode) { auto anime_item = AnimeDatabase.FindItem(episode.anime_id); // Set up dialog win32::TaskDialog dlg; wstring title = L"Anime title: " + anime_item->GetTitle(); dlg.SetWindowTitle(APP_TITLE); dlg.SetMainIcon(TD_ICON_INFORMATION); dlg.SetMainInstruction(L"Do you want to update your anime list?"); dlg.SetContent(title.c_str()); dlg.SetVerificationText(L"Don't ask again, update automatically"); dlg.UseCommandLinks(true); // Get episode number int number = GetEpisodeHigh(episode.number); if (number == 0) number = 1; if (anime_item->GetEpisodeCount() == 1) episode.number = L"1"; // Add buttons if (anime_item->GetMyStatus() != mal::MYSTATUS_NOTINLIST) { if (anime_item->GetEpisodeCount() == number) { // Completed dlg.AddButton(L"Update and move\n" L"Update and set as completed", IDCANCEL); } else if (anime_item->GetMyStatus() != mal::MYSTATUS_WATCHING) { // Watching dlg.AddButton(L"Update and move\n" L"Update and set as watching", IDCANCEL); } } wstring button = L"Update\n" L"Update episode number from " + ToWstr(anime_item->GetMyLastWatchedEpisode()) + L" to " + ToWstr(number); dlg.AddButton(button.c_str(), IDYES); dlg.AddButton(L"Cancel\n" L"Don't update anything", IDNO); // Show dialog dlg.Show(g_hMain); if (dlg.GetVerificationCheck()) Settings.Account.Update.ask_to_confirm = FALSE; return dlg.GetSelectedButtonID(); }
void EventQueue::Add(EventItem& item, bool save) { auto anime = AnimeDatabase.FindItem(item.anime_id); // Add to user list if (anime && !anime->IsInList()) if (item.mode != HTTP_MAL_AnimeDelete) anime->AddtoUserList(); // Validate values if (anime && anime->IsInList()) { if (item.episode) if (anime->GetMyLastWatchedEpisode() == *item.episode || *item.episode < 0) item.episode.Reset(); if (item.score) if (anime->GetMyScore() == *item.score || *item.score < 0 || *item.score > 10) item.score.Reset(); if (item.status) if (anime->GetMyStatus() == *item.status || *item.status < 1 || *item.status == 5 || *item.status > 6) item.status.Reset(); if (item.enable_rewatching) if (anime->GetMyRewatching() == *item.enable_rewatching) item.enable_rewatching.Reset(); if (item.tags) if (anime->GetMyTags() == *item.tags) item.tags.Reset(); if (item.date_start) if (anime->GetMyDate(anime::DATE_START) == mal::TranslateDateFromApi(*item.date_start)) item.date_start.Reset(); if (item.date_finish) if (anime->GetMyDate(anime::DATE_END) == mal::TranslateDateFromApi(*item.date_finish)) item.date_finish.Reset(); } switch (item.mode) { case HTTP_MAL_AnimeUpdate: if (!item.episode && !item.score && !item.status && !item.enable_rewatching && !item.tags && !item.date_start && !item.date_finish) return; break; } // Edit previous item with the same ID... bool add_new_item = true; if (!History.queue.updating) { for (auto it = items.rbegin(); it != items.rend(); ++it) { if (it->anime_id == item.anime_id && it->enabled) { if (it->mode != HTTP_MAL_AnimeAdd && it->mode != HTTP_MAL_AnimeDelete) { if (!item.episode || (!it->episode && it == items.rbegin())) { if (item.episode) it->episode = *item.episode; if (item.score) it->score = *item.score; if (item.status) it->status = *item.status; if (item.enable_rewatching) it->enable_rewatching = *item.enable_rewatching; if (item.tags) it->tags = *item.tags; if (item.date_start) it->date_start = *item.date_start; if (item.date_finish) it->date_finish = *item.date_finish; add_new_item = false; } if (!add_new_item) { it->mode = HTTP_MAL_AnimeUpdate; it->time = (wstring)GetDate() + L" " + GetTime(); } break; } } } } // ...or add a new one if (add_new_item) { if (item.time.empty()) item.time = (wstring)GetDate() + L" " + GetTime(); items.push_back(item); } if (anime && save) { // Save history->Save(); // Announce if (Taiga.logged_in && item.episode) { anime::Episode episode; episode.anime_id = anime->GetId(); episode.number = ToWstr(*item.episode); Taiga.play_status = PLAYSTATUS_UPDATED; Announcer.Do(ANNOUNCE_TO_HTTP | ANNOUNCE_TO_TWITTER, &episode); } // Check new episode if (item.episode) { anime->SetNewEpisodePath(L""); anime->CheckEpisodes(0); } // Refresh history MainDialog.treeview.RefreshHistoryCounter(); HistoryDialog.RefreshList(); // Refresh anime window if (item.mode == HTTP_MAL_AnimeAdd || item.mode == HTTP_MAL_AnimeDelete || item.status || item.enable_rewatching) { AnimeListDialog.RefreshList(); AnimeListDialog.RefreshTabs(); } else { AnimeListDialog.RefreshListItem(item.anime_id); } // Refresh now playing NowPlayingDialog.Refresh(false, false, false); // Change status if (!Taiga.logged_in) { MainDialog.ChangeStatus(L"\"" + anime->GetTitle() + L"\" is queued for update."); } // Update Check(); } }
bool EvaluateCondition(const FeedFilterCondition& condition, const FeedItem& item) { bool is_numeric = false; std::wstring element; std::wstring value = ReplaceVariables(condition.value, item.episode_data); auto anime = AnimeDatabase.FindItem(item.episode_data.anime_id); switch (condition.element) { case kFeedFilterElement_File_Title: element = item.title; break; case kFeedFilterElement_File_Category: element = item.category; break; case kFeedFilterElement_File_Description: element = item.description; break; case kFeedFilterElement_File_Link: element = item.link; break; case kFeedFilterElement_Meta_Id: if (anime) element = ToWstr(anime->GetId()); is_numeric = true; break; case kFeedFilterElement_Episode_Title: element = item.episode_data.title; break; case kFeedFilterElement_Meta_DateStart: if (anime) element = anime->GetDateStart(); break; case kFeedFilterElement_Meta_DateEnd: if (anime) element = anime->GetDateEnd(); break; case kFeedFilterElement_Meta_Episodes: if (anime) element = ToWstr(anime->GetEpisodeCount()); is_numeric = true; break; case kFeedFilterElement_Meta_Status: if (anime) element = ToWstr(anime->GetAiringStatus()); is_numeric = true; break; case kFeedFilterElement_Meta_Type: if (anime) element = ToWstr(anime->GetType()); is_numeric = true; break; case kFeedFilterElement_User_Status: if (anime) element = ToWstr(anime->GetMyStatus()); is_numeric = true; break; case kFeedFilterElement_Episode_Number: element = ToWstr(anime::GetEpisodeHigh(item.episode_data.number)); is_numeric = true; break; case kFeedFilterElement_Episode_Version: element = item.episode_data.version; if (element.empty()) element = L"1"; is_numeric = true; break; case kFeedFilterElement_Local_EpisodeAvailable: if (anime) element = ToWstr(anime->IsEpisodeAvailable( anime::GetEpisodeHigh(item.episode_data.number))); is_numeric = true; break; case kFeedFilterElement_Episode_Group: element = item.episode_data.group; break; case kFeedFilterElement_Episode_VideoResolution: element = item.episode_data.resolution; break; case kFeedFilterElement_Episode_VideoType: element = item.episode_data.video_type; break; } switch (condition.op) { case kFeedFilterOperator_Equals: if (is_numeric) { if (IsEqual(value, L"True")) return ToInt(element) == TRUE; return ToInt(element) == ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) == anime::TranslateResolution(condition.value); } else { return IsEqual(element, value); } } case kFeedFilterOperator_NotEquals: if (is_numeric) { if (IsEqual(value, L"True")) return ToInt(element) == TRUE; return ToInt(element) != ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) != anime::TranslateResolution(condition.value); } else { return !IsEqual(element, value); } } case kFeedFilterOperator_IsGreaterThan: if (is_numeric) { return ToInt(element) > ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) > anime::TranslateResolution(condition.value); } else { return CompareStrings(element, condition.value) > 0; } } case kFeedFilterOperator_IsGreaterThanOrEqualTo: if (is_numeric) { return ToInt(element) >= ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) >= anime::TranslateResolution(condition.value); } else { return CompareStrings(element, condition.value) >= 0; } } case kFeedFilterOperator_IsLessThan: if (is_numeric) { return ToInt(element) < ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) < anime::TranslateResolution(condition.value); } else { return CompareStrings(element, condition.value) < 0; } } case kFeedFilterOperator_IsLessThanOrEqualTo: if (is_numeric) { return ToInt(element) <= ToInt(value); } else { if (condition.element == kFeedFilterElement_Episode_VideoResolution) { return anime::TranslateResolution(element) <= anime::TranslateResolution(condition.value); } else { return CompareStrings(element, condition.value) <= 0; } } case kFeedFilterOperator_BeginsWith: return StartsWith(element, value); case kFeedFilterOperator_EndsWith: return EndsWith(element, value); case kFeedFilterOperator_Contains: return InStr(element, value, 0, true) > -1; case kFeedFilterOperator_NotContains: return InStr(element, value, 0, true) == -1; } return false; }