| src | ||
| tests/OwChatAssistant.Tests | ||
| .gitignore | ||
| LICENSE | ||
| OwChatAssistant.sln | ||
| README.md | ||
OwChatAssistant
Experimental Windows desktop assistant that checks outgoing Overwatch chat messages against a configurable word list. It uses external input hooks; it does not read game memory or inject code into the game.
Requirements and setup
- Windows 10 version 1607 or later, or Windows 11.
- .NET 10 SDK for building and running tests.
- Overwatch's default Enter-to-open/send and Escape-to-cancel chat bindings.
- Windowed or borderless mode for the notification overlay. Exclusive fullscreen may hide external windows.
From the repository root:
dotnet restore OwChatAssistant.sln
dotnet build OwChatAssistant.sln
dotnet test OwChatAssistant.sln
dotnet run --project src/OwChatAssistant/OwChatAssistant.csproj
To publish a self-contained Windows build:
dotnet publish src/OwChatAssistant/OwChatAssistant.csproj -c Release -r win-x64 --self-contained true
Keep the published Assets and Configuration folders alongside the executable. Paths to bundled resources are resolved from the executable directory, independently of the working directory.
Usage
- Open the tray icon menu and choose Start. The assistant starts paused.
- Focus Overwatch. Press Escape to discard any existing chat draft, then Enter to open a fresh chat.
- Type the message and press Enter to send. A blocked message stays editable and is checked again on every send attempt.
- After switching applications, press Escape before starting another chat. This avoids treating a partially edited draft as an empty message.
- Choose Stop or Exit from the tray menu when finished.
The overlay does not activate a window or take keyboard focus. It shows notices for five seconds and hides when the game loses focus. Stopping or changing focus never sends synthetic Escape keys.
Configuration
On first launch, the bundled Configuration/config.json is copied to:
%LOCALAPPDATA%\OwChatAssistant\config.json
Edit that user copy and restart the application. Existing user settings are preserved. Invalid or empty word lists, null sections, invalid enum values and malformed JSON produce an actionable startup error rather than silently disabling filtering. The original flat DefaultLanguage/Translations format is still accepted.
{
"Keyboard": { "DisableBloqMayus": true },
"System": { "DebugMode": false },
"Language": {
"DefaultLanguage": "en",
"Translations": {}
},
"Toxicity": {
"ToxicityBehavior": "Block",
"ToxicWords": {
"en": ["troll", "diff"]
}
}
}
- Block suppresses sending and displays a notice.
- BlockSilent suppresses sending without a toxicity notice.
- Warn allows sending and displays a notice; it does not request confirmation.
- Caps Lock suppression applies only while Overwatch is foreground and the assistant is running.
- Debug mode enables the console. Captured messages are never logged.
- Language falls back to English for missing translations. Built-in notices also support Spanish.
Capture behavior and limits
Chat detection uses the default Enter/Escape sequence. It does not assume that Overwatch exposes a Windows text caret. This is a heuristic, not proof that a chat input is open: other game menus, custom bindings and game-side changes can desynchronize it. Real-game validation is required before relying on the filter.
Supported editing includes ordinary text from the active keyboard layout, punctuation, Backspace, Delete, Left/Right, Home/End, Shift selections, Ctrl+A/C/X, and single-line Ctrl+V/Shift+Insert paste. Clipboard text is read only for an explicit paste while tracking the game's chat.
When text cannot be reconstructed safely (mouse editing, undo/redo, word navigation, IME/dead-key composition, injected input, surrogate pairs, or unsupported keys), sending is blocked until Escape resets the draft. Multiline or unavailable clipboard content is not pasted. These restrictions deliberately avoid approving an unknown message.
Additional limits:
- The input model cannot observe game-side truncation, rejected edits, network state, or a chat opened by another binding or by clicking.
- Escape reset assumes the game discards its chat draft. Verify this with the current game client.
- The dictionary detects whole words, case-insensitively and without accents. It is not a semantic toxicity model and does not detect every obfuscation.
- Privilege differences and game input handling may affect hooks. A failed hook installation is reported.
- External overlays may not appear in exclusive fullscreen.
Validation
The xUnit/NSubstitute suite covers repeated blocking, immediate typing, focus isolation, Start/Stop, hook-install failure, uncertain input, paste, text editing, configuration, Unicode normalization and Block/Warn/BlockSilent behavior.
Manual checks inside the game remain necessary:
- Start before and after launching Overwatch; confirm capture works in both cases.
- Verify Escape discards a draft and Enter opens/sends it with the current bindings.
- Verify two Enter presses cannot send a blocked message; edit it and resend.
- Try punctuation, Spanish keyboard input, selection, paste and game text-length limits.
- Alt-Tab to a text editor: typing and Caps Lock must be unaffected.
- Confirm notices appear without stealing focus in windowed/borderless mode.
- Repeat Start/Stop and exit; confirm no keyboard interception remains.
This project is not affiliated with or endorsed by Blizzard Entertainment.