5 Commits
Author SHA1 Message Date
Dusk-92 750fe8a2e5 release v1.1 2026-09-01 16:18:30 +02:00
Dusk-92 aa9412d7c2 Prepare WowPresence v1.1 release 2026-09-01 16:18:19 +02:00
Dusk-92 d0aff5e95a Document Modernization Tool data path 2026-09-01 16:14:15 +02:00
Dusk-92 2a10763dac Support Modernization Tool data directory 2026-09-01 16:13:59 +02:00
Dusk-92 9449080788 Support Modernization Tool data directory 2026-09-01 16:13:53 +02:00
5 changed files with 89 additions and 29 deletions
+4 -4
View File
@@ -72,18 +72,18 @@ jobs:
dist/WowPresence.zip dist/WowPresence.zip
if-no-files-found: error if-no-files-found: error
- name: Create GitHub Release v1.0 - name: Create GitHub Release v1.1
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == 'release v1.0' }} if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == 'release v1.1' }}
uses: softprops/action-gh-release@v3 uses: softprops/action-gh-release@v3
with: with:
tag_name: v1.0 tag_name: v1.1
target_commitish: ${{ github.sha }} target_commitish: ${{ github.sha }}
files: | files: |
dist/WowPresence.dll dist/WowPresence.dll
dist/WowPresence.exe dist/WowPresence.exe
dist/WowPresence.zip dist/WowPresence.zip
fail_on_unmatched_files: true fail_on_unmatched_files: true
name: "WowPresence v1.0" name: "WowPresence v1.1"
body_path: RELEASE_NOTES.md body_path: RELEASE_NOTES.md
generate_release_notes: true generate_release_notes: true
make_latest: true make_latest: true
+23 -1
View File
@@ -44,6 +44,14 @@ After extraction, the relevant files should look like this:
The runtime JSON and log files are created automatically inside the same `WowPresence` folder. The runtime JSON and log files are created automatically inside the same `WowPresence` folder.
When WowPresence is installed through **Modernization Tool**, the same binaries automatically use:
```text
<WoW folder>\.modernization_tool\WowPresence\
```
instead. No separate build is required.
## 🛰️ Discord Application ID ## 🛰️ Discord Application ID
WowPresence intentionally does **not** include a server-specific Discord Application ID. WowPresence intentionally does **not** include a server-specific Discord Application ID.
@@ -120,7 +128,9 @@ The DLL does not communicate directly with Discord.
The companion executable does not read or write WoW memory. The companion executable does not read or write WoW memory.
Runtime files are kept together in: Runtime files are kept together in one of these locations:
**Standalone installation:**
```text ```text
<WoW folder>\WowPresence\ <WoW folder>\WowPresence\
@@ -130,6 +140,18 @@ Runtime files are kept together in:
└─ WowPresence.log └─ WowPresence.log
``` ```
**Installed through Modernization Tool:**
```text
<WoW folder>\.modernization_tool\WowPresence\
├─ discord_application_id
├─ discord_broadcast_flags
├─ discord_wow_status.json
└─ WowPresence.log
```
If the Modernization Tool managed folder exists, WowPresence automatically prefers it. Otherwise it uses the standalone `WowPresence` folder.
## 🔒 Privacy flags ## 🔒 Privacy flags
The included file: The included file:
+12 -18
View File
@@ -1,25 +1,19 @@
# WowPresence v1.0 # WowPresence v1.1
First standalone release of WowPresence. ## Changes
- Added automatic support for Modernization Tool installations.
- Standalone installs continue to use `WowPresence\` in the WoW folder.
- When `.modernization_tool\WowPresence\` already exists, the same binaries automatically use that managed data directory instead.
- No separate Modernization Tool build of WowPresence is required.
- Existing `discord_application_id` and `discord_broadcast_flags` files remain user-managed.
## Included ## Included
- WowPresence.dll - `WowPresence.dll`
- WowPresence.exe - `WowPresence.exe`
- WowPresence.zip ready-to-install package - `WowPresence.zip` ready-to-install standalone package
## Highlights ## Standalone installation
- Native Discord Rich Presence for WoW 1.12.1 build 5875 compatible clients
- Character name, guild, level, class, race, faction and zone display
- Stable elapsed-session timer across character changes
- Read-only game-memory sampling
- Separate native Discord IPC companion
- Configurable Discord Application ID through `WowPresence\discord_application_id`
- Privacy flags through `WowPresence\discord_broadcast_flags`
- Standalone `WowPresence\` runtime folder
- Automatic companion startup and exact WoW process tracking
## Installation
Extract `WowPresence.zip` into the WoW folder, edit `WowPresence\discord_application_id`, add `WowPresence.dll` to VanillaFixes `dlls.txt`, then launch WoW normally. Extract `WowPresence.zip` into the WoW folder, edit `WowPresence\discord_application_id`, add `WowPresence.dll` to VanillaFixes `dlls.txt`, then launch WoW normally.
+26 -3
View File
@@ -3,8 +3,8 @@
* Read-only WoW 1.12.1 (build 5875) status sampler for WowPresence. * Read-only WoW 1.12.1 (build 5875) status sampler for WowPresence.
* *
* Runtime contract: * Runtime contract:
* <game>\WowPresence\discord_wow_status.json * standalone: <game>\WowPresence\...
* <game>\WowPresence\discord_broadcast_flags * Modernization Tool: <game>\.modernization_tool\WowPresence\...
* *
* Discord IPC is intentionally out of process. After the first sample, this * Discord IPC is intentionally out of process. After the first sample, this
* DLL starts WowPresence.exe from its worker thread and passes the exact * DLL starts WowPresence.exe from its worker thread and passes the exact
@@ -541,11 +541,34 @@ static int game_folder(char *output, size_t output_size) {
return 1; return 1;
} }
static int directory_exists(const char *path) {
DWORD attrs;
if (!path || !path[0]) return 0;
attrs = GetFileAttributesA(path);
return attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY);
}
static int support_folder(char *output, size_t output_size) { static int support_folder(char *output, size_t output_size) {
char root[MAX_PATH]; char root[MAX_PATH], managed[MAX_PATH];
int count; int count;
if (!game_folder(root, sizeof(root))) return 0; if (!game_folder(root, sizeof(root))) return 0;
/* Modernization Tool creates this directory before WoW starts. Prefer it
* when present so the same binaries can use the tool-managed location. */
count = _snprintf(
managed,
sizeof(managed),
"%s\\.modernization_tool\\WowPresence",
root
);
managed[sizeof(managed) - 1] = 0;
if (count >= 0 && (size_t)count < sizeof(managed) && directory_exists(managed)) {
if (strlen(managed) + 1u > output_size) return 0;
lstrcpynA(output, managed, (int)output_size);
return 1;
}
/* Standalone installs keep their data in <game>\\WowPresence. */
count = _snprintf(output, output_size, "%s\\WowPresence", root); count = _snprintf(output, output_size, "%s\\WowPresence", root);
if (output_size) output[output_size - 1] = 0; if (output_size) output[output_size - 1] = 0;
if (count < 0 || (size_t)count >= output_size) return 0; if (count < 0 || (size_t)count >= output_size) return 0;
+24 -3
View File
@@ -3,7 +3,7 @@
* Invisible companion process for WowPresence. * Invisible companion process for WowPresence.
* *
* - is started automatically by WowPresence.dll after WoW is running * - is started automatically by WowPresence.dll after WoW is running
* - reads WowPresence\discord_wow_status.json * - reads the standalone WowPresence folder or the Modernization Tool managed folder
* - publishes Discord Rich Presence over the local Discord IPC named pipe * - publishes Discord Rich Presence over the local Discord IPC named pipe
* - exits when WoW_Modernized.exe exits * - exits when WoW_Modernized.exe exits
*/ */
@@ -54,9 +54,30 @@ static int own_directory(char *out, size_t out_size) {
return 1; return 1;
} }
static int directory_exists(const char *path) {
DWORD attrs;
if (!path || !path[0]) return 0;
attrs = GetFileAttributesA(path);
return attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY);
}
static int support_directory(char *out, size_t out_size) { static int support_directory(char *out, size_t out_size) {
char root[MAX_PATH]; char root[MAX_PATH], managed[MAX_PATH];
if (!own_directory(root, sizeof(root))) return 0; if (!own_directory(root, sizeof(root))) return 0;
_snprintf(
managed,
sizeof(managed),
"%s\\.modernization_tool\\WowPresence",
root
);
managed[sizeof(managed) - 1] = 0;
if (directory_exists(managed)) {
if (strlen(managed) + 1 >= out_size) return 0;
lstrcpynA(out, managed, (int)out_size);
return 1;
}
if (strlen(root) + strlen("\\WowPresence") + 1 >= out_size) return 0; if (strlen(root) + strlen("\\WowPresence") + 1 >= out_size) return 0;
_snprintf(out, out_size, "%s\\WowPresence", root); _snprintf(out, out_size, "%s\\WowPresence", root);
out[out_size - 1] = 0; out[out_size - 1] = 0;
@@ -140,7 +161,7 @@ static int load_application_id(char *out, size_t out_size) {
if (!support_file(path, sizeof(path), "discord_application_id") || if (!support_file(path, sizeof(path), "discord_application_id") ||
!read_text_file(path, configured_id, sizeof(configured_id))) { !read_text_file(path, configured_id, sizeof(configured_id))) {
log_line("discord_application_id is missing. Add your Discord Application ID to WowPresence\\discord_application_id."); log_line("discord_application_id is missing. Add your Discord Application ID to the active WowPresence data folder.");
return 0; return 0;
} }