Fix screen name order in KDM emails.
authorCarl Hetherington <cth@carlh.net>
Thu, 7 Mar 2024 22:33:03 +0000 (23:33 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 7 Mar 2024 22:33:03 +0000 (23:33 +0100)
src/lib/kdm_with_metadata.cc
src/lib/util.cc
src/lib/util.h
test/util_test.cc

index 971eeac76f9a9b38b4efae314010691ac40b39fd..f7ff8443536d8ad7cfa92b70c082946d461beb17 100644 (file)
@@ -238,14 +238,13 @@ send_emails (
                auto subject = substitute_variables(config->kdm_subject());
                auto body = substitute_variables(config->kdm_email());
 
-               string screens;
+               vector<string> screens;
                for (auto kdm: kdms_for_cinema) {
-                       auto screen_name = kdm->get('s');
-                       if (screen_name) {
-                               screens += *screen_name + ", ";
+                       if (auto screen_name = kdm->get('s')) {
+                               screens.push_back(*screen_name);
                        }
                }
-               boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
+               boost::algorithm::replace_all(body, "$SCREENS", screen_names_to_string(screens));
 
                auto emails = first->emails();
                std::copy(extra_addresses.begin(), extra_addresses.end(), std::back_inserter(emails));
index 7f6e9da5aff95feaee14a7cac247952d2e5cbd5d..fe6602de380cf60c2b3f0cf9fc197471eeef011b 100644 (file)
@@ -1123,3 +1123,31 @@ word_wrap(string input, int columns)
        return output;
 }
 
+
+string
+screen_names_to_string(vector<string> names)
+{
+       if (names.empty()) {
+               return {};
+       }
+
+       auto number = [](string const& s) {
+               return s.find_first_not_of("0123456789") == string::npos;
+       };
+
+       if (std::find_if(names.begin(), names.end(), [number](string const& s) { return !number(s); }) == names.end()) {
+               std::sort(names.begin(), names.end(), [](string const& a, string const& b) {
+                       return dcp::raw_convert<int>(a) < dcp::raw_convert<int>(b);
+               });
+       } else {
+               std::sort(names.begin(), names.end());
+       }
+
+       string result;
+       for (auto const& name: names) {
+               result += name + ", ";
+       }
+
+       return result.substr(0, result.length() - 2);
+}
+
index b92869b253a776167c72bbd1b20159a1a9015e4e..fd6fd61649ac4a896f9f04d40571e3686d429913 100644 (file)
@@ -97,5 +97,6 @@ extern std::string error_details(boost::system::error_code ec);
 extern bool contains_assetmap(boost::filesystem::path dir);
 extern std::string word_wrap(std::string input, int columns);
 extern void capture_ffmpeg_logs();
+extern std::string screen_names_to_string(std::vector<std::string> names);
 
 #endif
index 49d0b3bc297ab3458ddae7ab6691234a1508b636..afcc4cfc9cb684e8a246bbf646de3d72c720d96a 100644 (file)
@@ -155,3 +155,14 @@ BOOST_AUTO_TEST_CASE(word_wrap_test)
        BOOST_CHECK(word_wrap("hello this is a longer bit of text and it should be word-wrapped", 31) == string{"hello this is a longer bit of \ntext and it should be word-\nwrapped\n"});
        BOOST_CHECK_EQUAL(word_wrap("hellocan'twrapthissadly", 5), "hello\ncan't\nwrapt\nhissa\ndly\n");
 }
+
+
+BOOST_AUTO_TEST_CASE(screen_names_to_string_test)
+{
+       BOOST_CHECK_EQUAL(screen_names_to_string({"1", "2", "3"}), "1, 2, 3");
+       BOOST_CHECK_EQUAL(screen_names_to_string({"3", "2", "1"}), "1, 2, 3");
+       BOOST_CHECK_EQUAL(screen_names_to_string({"39", "3", "10", "1", "2"}), "1, 2, 3, 10, 39");
+       BOOST_CHECK_EQUAL(screen_names_to_string({"Sheila", "Fred", "Jim"}), "Fred, Jim, Sheila");
+       BOOST_CHECK_EQUAL(screen_names_to_string({"Sheila", "Fred", "Jim", "1"}), "1, Fred, Jim, Sheila");
+}
+