Question
Refactor a chat room so independent bots can observe messages and emit responses without adding bot-specific branches to the room.
```python
class IBotService:
def should_activate(self, user: str, message: str) -> bool: ...
def execute(self, room, user: str, message: str) -> None: ...
```
`ChatRoom` registers bot services and appends every user and bot message to one ordered log.
## Requirements
- `AwayBot`: `/away <text>` stores a user's status; later mentions of that user emit `AwayBot: <user> stepped out (<text>)`.
- `MeetBot`: `/meet <other>` records a meeting message and marks both users away as `is in a call`.
- `TacoBot`: `/givetaco <taco-string> @user` counts taco symbols and tracks each recipient's cumulative total.
- A bot response must not cause accidental infinite bot activation.
- Define parsing, unknown users, malformed commands, and deterministic bot order.
- Adding another bot should not require modifying `ChatRoom`.
## Follow-ups
1. Replace room polling with an event bus and explicit event types.
2. Isolate failing or slow plugins.
3. Add persistence, replay, and idempotent bot effects.