diff --git a/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text1.json b/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text1.json
index 6b378db..51b2fe5 100644
--- a/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text1.json
+++ b/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text1.json
@@ -227,7 +227,7 @@
"textToSpeech": "",
"lang": "ru",
"speech": [
- "$name1 просыпается ещё до будильника. За окном маленького домика шумит море, и этот звук лучше любой музыки. Каникулы в самом разгаре, а до конца лета — целых $daysLeft дней солнца, песка и солёного ветра!\nСхватив панамку и надувной круг (а на нём — $animal1!), $name1 бежит на пляж. Песок с утра ещё прохладный и приятно щекочет пятки. Папа уже расставляет зонтик, а мама раскладывает полотенца и достаёт из сумки $food1.\n— Кто последний до воды — тот моет посуду весь отпуск! — кричит младший брат $name2 и несётся к волнам.\nВода тёплая, как парное молоко. Они вдвоём ныряют, брызгаются и ищут на дне разноцветные камешки. Нашёлся один особенный — гладкий, почти прозрачный, с маленькой дырочкой посередине. «$adj1», — решает $name1 и прячет его в карман.\nСочиним, что было дальше?"
+ "$name1 просыпается ещё до будильника. За окном маленького домика шумит море, и этот звук лучше любой музыки. Каникулы в самом разгаре, а до конца лета ещё столько дней — $daysLeft! Целое море солнца, песка и солёного ветра!\nСхватив панамку и надувной круг (а на нём — $animal1!), $name1 бежит на пляж. Песок с утра ещё прохладный и приятно щекочет пятки. Папа уже расставляет зонтик, а мама раскладывает полотенца и достаёт из сумки $food1.\n— Кто последний до воды — тот моет посуду весь отпуск! — кричит младший брат $name2 и несётся к волнам.\nВода тёплая, как парное молоко. Они вдвоём ныряют, брызгаются и ищут на дне разноцветные камешки. Нашёлся один особенный — гладкий, почти прозрачный, с маленькой дырочкой посередине. «$adj1», — решает $name1 и прячет его в карман.\nСочиним, что было дальше?"
],
"condition": ""
}
diff --git a/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text2.json b/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text2.json
index 79c948a..70e5d5d 100644
--- a/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text2.json
+++ b/Dialogflow/FillInTheTextBot-eu/intents/37-BeachVacation-text2.json
@@ -84,7 +84,7 @@
"textToSpeech": "",
"lang": "ru",
"speech": [
- "Вот что было дальше:\nПосле обеда они строят огромный замок из песка — с башнями, рвами и мостами. А когда набегает шальная волна и слизывает одну из башен, ребята не расстраиваются и строят новую, ещё выше — целых $castleHeight метров!\nВечером, уставшие и загорелые, они сидят на берегу и смотрят, как солнце медленно тонет в море, окрашивая небо в $color1, розовый и золотой.\n— Хочу, чтобы этот день никогда не кончался, — шепчет #text-37.name1, сжимая в ладони тот самый счастливый камешек.\nИ знаешь что? Впереди ещё целых #text-37.daysLeft дней лета, а это почти бесконечно!\nПо-моему, отличные каникулы получились! Сочиним ещё что-нибудь?"
+ "Вот что было дальше:\nПосле обеда они строят огромный замок из песка — с башнями, рвами и мостами. А когда набегает шальная волна и слизывает одну из башен, ребята не расстраиваются и строят новую, ещё выше — метров $castleHeight!\nВечером, уставшие и загорелые, они сидят на берегу и смотрят, как солнце медленно тонет в море, окрашивая небо в $color1, розовый и золотой.\n— Хочу, чтобы этот день никогда не кончался, — шепчет #text-37.name1, сжимая в ладони тот самый счастливый камешек.\nИ знаешь что? Впереди ещё столько летних дней — #text-37.daysLeft! А это почти бесконечно!\nПо-моему, отличные каникулы получились! Сочиним ещё что-нибудь?"
],
"condition": ""
},
diff --git a/src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj b/src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj
index bbae8f9..baddfbf 100644
--- a/src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj
+++ b/src/FillInTheTextBot.Api/FillInTheTextBot.Api.csproj
@@ -3,8 +3,8 @@
net6.0
Linux
- 1.23.0
- Optimized interaction with Dialogflow
+ 1.23.1
+ Added new texts and computes
diff --git a/src/FillInTheTextBot.Services.Tests/StoryComputationsTests.cs b/src/FillInTheTextBot.Services.Tests/StoryComputationsTests.cs
index 8f745fb..cfddcc0 100644
--- a/src/FillInTheTextBot.Services.Tests/StoryComputationsTests.cs
+++ b/src/FillInTheTextBot.Services.Tests/StoryComputationsTests.cs
@@ -47,6 +47,36 @@ public void TryBuildContext_MidSummer_FillsContext()
Assert.AreEqual("90", context.Parameters["daysLeft"]);
}
+ [Test]
+ public void TryBuildContext_SeasonStart_May29_FillsContext()
+ {
+ // 29 мая — старт сезона: до 30 августа 93 дня
+ var result = StoryComputations.TryBuildContext(BeachVacationFirstPart, new DateTime(2026, 5, 29), out var context);
+
+ Assert.True(result);
+ Assert.AreEqual("93", context.Parameters["daysLeft"]);
+ }
+
+ [Test]
+ public void TryBuildContext_BeforeSeason_FallbackNoContext()
+ {
+ // 28 мая — ещё до старта сезона → фоллбэк-вопрос
+ var result = StoryComputations.TryBuildContext(BeachVacationFirstPart, new DateTime(2026, 5, 28), out var context);
+
+ Assert.False(result);
+ Assert.Null(context);
+ }
+
+ [Test]
+ public void TryBuildContext_NewYear_FallbackNoContext()
+ {
+ // 1 января — вне сезона → значение не передаётся, бот спрашивает число
+ var result = StoryComputations.TryBuildContext(BeachVacationFirstPart, new DateTime(2027, 1, 1), out var context);
+
+ Assert.False(result);
+ Assert.Null(context);
+ }
+
[Test]
public void TryBuildContext_DayBeforeEnd_One()
{
diff --git a/src/FillInTheTextBot.Services/StoryComputations.cs b/src/FillInTheTextBot.Services/StoryComputations.cs
index 8f49ac3..f3e94bd 100644
--- a/src/FillInTheTextBot.Services/StoryComputations.cs
+++ b/src/FillInTheTextBot.Services/StoryComputations.cs
@@ -95,15 +95,24 @@ public static DateTime MoscowToday()
///
/// Сколько дней осталось до конца лета (30 августа) от указанной даты.
- /// Возвращает null, если осталось меньше одного дня (лето уже прошло).
+ /// Считается только в пределах сезона — с 29 мая по 29 августа. Вне этого окна
+ /// (в том числе зимой и осенью) возвращает null, и значение спрашивается у игрока.
///
private static string SummerDaysLeft(DateTime today)
{
- var endOfSummer = new DateTime(today.Year, 8, 30);
+ var date = today.Date;
- var daysLeft = (endOfSummer - today.Date).Days;
+ var seasonStart = new DateTime(date.Year, 5, 29);
+ var endOfSummer = new DateTime(date.Year, 8, 30);
- return daysLeft < 1 ? null : daysLeft.ToString(CultureInfo.InvariantCulture);
+ var daysLeft = (endOfSummer - date).Days;
+
+ if (date < seasonStart || daysLeft < 1)
+ {
+ return null;
+ }
+
+ return daysLeft.ToString(CultureInfo.InvariantCulture);
}
}
}