The following regex
/^!w(eather)?|f(orecast)?/Si
is incorrect. It will trigger when someone simply says "f" instead of "!f".
This is made worse by the fact that the regex isn't locked to even a word break, so any word starting with "f" will set it off...
To fix it easily you can use
/^!(w(eather)?|f(orecast)?)\b/Si
That's why it needs the parentheses around the main regex.