Mercurial > minori
comparison dep/animia/src/strategist.cc @ 152:8700806c2cc2
dep/animia: awesome new breaking changes!
I'm so tired
| author | Paper <mrpapersonic@gmail.com> | 
|---|---|
| date | Wed, 15 Nov 2023 02:34:59 -0500 | 
| parents | 54744a48a7d7 | 
| children | bd439dd6ffc5 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 151:54744a48a7d7 | 152:8700806c2cc2 | 
|---|---|
| 1 #include "animia/strategies.h" | 1 #include "animia/strategies.h" | 
| 2 #include "animia/util.h" | 2 #include "animia/util.h" | 
| 3 #include "animia/fd.h" | 3 #include "animia/fd.h" | 
| 4 #include "animia.h" | 4 #include "animia.h" | 
| 5 | |
| 6 #include <iostream> | |
| 7 | |
| 8 #include <regex> | |
| 5 | 9 | 
| 6 namespace animia::internal { | 10 namespace animia::internal { | 
| 7 | 11 | 
| 8 class Strategist { | 12 class Strategist { | 
| 9 public: | 13 public: | 
| 13 | 17 | 
| 14 private: | 18 private: | 
| 15 bool AddMedia(const MediaInfo media_information); | 19 bool AddMedia(const MediaInfo media_information); | 
| 16 | 20 | 
| 17 bool ApplyOpenFilesStrategy(); | 21 bool ApplyOpenFilesStrategy(); | 
| 22 bool ApplyWindowTitleStrategy(); | |
| 18 | 23 | 
| 19 Result& result_; | 24 Result& result_; | 
| 20 }; | 25 }; | 
| 21 | 26 | 
| 22 bool Strategist::ApplyStrategies() { | 27 bool Strategist::ApplyStrategies() { | 
| 23 bool success = false; | 28 bool success = false; | 
| 24 | 29 | 
| 25 for (const auto strategy : result_.player.strategies) { | 30 switch (result_.type) { | 
| 26 switch (strategy) { | 31 case ResultType::Process: | 
| 27 case Strategy::OpenFiles: | 32 success |= ApplyOpenFilesStrategy(); | 
| 28 success |= ApplyOpenFilesStrategy(); | 33 break; | 
| 29 break; | 34 case ResultType::Window: | 
| 30 } | 35 std::cout << "Wat" << std::endl; | 
| 36 success |= ApplyWindowTitleStrategy(); | |
| 37 break; | |
| 31 } | 38 } | 
| 32 | 39 | 
| 33 return success; | 40 return success; | 
| 34 } | 41 } | 
| 35 | 42 | 
| 44 return success; | 51 return success; | 
| 45 } | 52 } | 
| 46 | 53 | 
| 47 //////////////////////////////////////////////////////////////////////////////// | 54 //////////////////////////////////////////////////////////////////////////////// | 
| 48 | 55 | 
| 56 static bool ApplyWindowTitleFormat(const std::string& format, std::string& title) { | |
| 57 if (format.empty()) | |
| 58 return false; | |
| 59 | |
| 60 const std::regex pattern(format); | |
| 61 std::smatch match; | |
| 62 std::regex_match(title, match, pattern); | |
| 63 | |
| 64 // Use the first non-empty match result, because the regular expression may | |
| 65 // contain multiple sub-expressions. | |
| 66 for (size_t i = 1; i < match.size(); ++i) { | |
| 67 if (!match.str(i).empty()) { | |
| 68 title = match.str(i); | |
| 69 return true; | |
| 70 } | |
| 71 } | |
| 72 | |
| 73 // Results are empty, but the match was successful | |
| 74 if (!match.empty()) { | |
| 75 title.clear(); | |
| 76 return true; | |
| 77 } | |
| 78 | |
| 79 return true; | |
| 80 } | |
| 81 | |
| 82 static MediaInfoType InferMediaInformationType(const std::string& str) { | |
| 83 const std::regex path_pattern(R"(^(?:[A-Za-z]:[/\\]|\\\\)[^<>:"/\\|?*]+)"); | |
| 84 return (std::regex_search(str, path_pattern)) | |
| 85 ? MediaInfoType::File : MediaInfoType::Unknown; | |
| 86 } | |
| 87 | |
| 88 bool Strategist::ApplyWindowTitleStrategy() { | |
| 89 auto title = result_.window.text; | |
| 90 ApplyWindowTitleFormat(result_.player.window_title_format, title); | |
| 91 | |
| 92 return AddMedia({InferMediaInformationType(title), title}); | |
| 93 } | |
| 94 | |
| 49 bool Strategist::ApplyOpenFilesStrategy() { | 95 bool Strategist::ApplyOpenFilesStrategy() { | 
| 50 bool success = false; | 96 bool success = false; | 
| 51 | 97 | 
| 52 const std::set<pid_t> pids{result_.process.pid}; | 98 const std::set<pid_t> pids{result_.process.pid}; | 
| 53 std::vector<OpenFile> files; | |
| 54 | 99 | 
| 55 fd.EnumerateOpenFiles(pids, files); | 100 auto open_file_proc = [&](const OpenFile& file) -> bool { | 
| 101 success |= AddMedia({MediaInfoType::File, file.path}); | |
| 102 return true; | |
| 103 }; | |
| 56 | 104 | 
| 57 for (const auto& [pid, path] : files) { | 105 fd.EnumerateOpenFiles(pids, open_file_proc); | 
| 58 success |= AddMedia({MediaInfoType::File, path}); | |
| 59 } | |
| 60 | 106 | 
| 61 return success; | 107 return success; | 
| 62 } | 108 } | 
| 63 | 109 | 
| 64 //////////////////////////////////////////////////////////////////////////////// | 110 //////////////////////////////////////////////////////////////////////////////// | 
