diff --git a/cmd/mavend/quiet_toggle.go b/cmd/mavend/quiet_toggle.go index 13979cf..1bbd922 100644 --- a/cmd/mavend/quiet_toggle.go +++ b/cmd/mavend/quiet_toggle.go @@ -133,10 +133,21 @@ var ( quietOnPhrases = [][]string{ {"quiet", "on"}, {"quiet", "mode"}, {"тих", "режим"}, {"не", "шум"}, {"не", "беспоко"}, - {"тих"}, + // The noun form and the comparative. "режим тишины" is how the + // setting is named half the time, and "сделай потише" is how it is + // actually asked for out loud. Both used to fall through to the + // router, which has no quiet intent, so the command did nothing. + {"режим", "тишин"}, {"сделай", "тише"}, {"сделай", "потише"}, + {"говори", "тише"}, {"будь", "потише"}, + {"тих"}, {"потише"}, } ) +// quietWordStems — every stem that names the setting. Used by the +// negated-but-unmatched fallback in classifyQuietToggle, which has to +// recognise "хватит тишины" without an ON phrase having matched. +var quietWordStems = []string{"тих", "тишин", "потише"} + // quietNegatorWords — negators that are whole words with no useful stem. var quietNegatorWords = map[string]bool{ "не": true, "нет": true, "хватит": true, "no": true, "not": true, "off": true, @@ -197,8 +208,10 @@ func classifyQuietToggle(text string) (on, off bool) { // on after he asked for it to stop. if quietNegated(tokens, nil) { for _, t := range tokens { - if quietStem(t, "тих") { - return false, true + for _, stem := range quietWordStems { + if quietStem(t, stem) { + return false, true + } } } } diff --git a/cmd/mavend/quiet_toggle_test.go b/cmd/mavend/quiet_toggle_test.go index c450b95..c754fcc 100644 --- a/cmd/mavend/quiet_toggle_test.go +++ b/cmd/mavend/quiet_toggle_test.go @@ -47,6 +47,15 @@ func TestResolveQuietToggle(t *testing.T) { {"побудь в тихом режиме", quietOn}, {"Тихий Режим!", quietOn}, {"тихая", quietOn}, + // The noun form and the comparative. + {"включи режим тишины", quietOn}, + {"режим тишины", quietOn}, + {"сделай потише", quietOn}, + {"сделай тише", quietOn}, + {"потише", quietOn}, + // English, as the fixture phrases it. + {"turn quiet mode back on", quietOn}, + {"enable quiet mode", quietOn}, // OFF vocabulary — all seven, incl. the three that used to say ON. {"quiet off", quietOff}, @@ -60,6 +69,12 @@ func TestResolveQuietToggle(t *testing.T) { {"выключи тихий режим", quietOff}, {"отмени тихий режим пожалуйста", quietOff}, {"верни громкий режим", quietOff}, + {"выключи режим тишины", quietOff}, + {"хватит тишины", quietOff}, + {"turn off quiet mode", quietOff}, + {"quiet mode off", quietOff}, + {"stop quiet mode", quietOff}, + {"disable quiet mode", quietOff}, // False positives: "тихо"/"тихий" as ordinary Russian. {"очень тихий сегодня день", quietNone}, @@ -68,6 +83,8 @@ func TestResolveQuietToggle(t *testing.T) { {"потихоньку", quietNone}, {"тихонько", quietNone}, {"он говорил тихим голосом весь вечер", quietNone}, + {"в тишине лучше думается", quietNone}, + {"на улице стало потише", quietNone}, // Unrelated. {"напомни завтра позвонить маме", quietNone},