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
if-no-files-found: error
- name: Create GitHub Release v1.0
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == '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.1' }}
uses: softprops/action-gh-release@v3
with:
tag_name: v1.0
tag_name: v1.1
target_commitish: ${{ github.sha }}
files: |
dist/WowPresence.dll
dist/WowPresence.exe
dist/WowPresence.zip
fail_on_unmatched_files: true
name: "WowPresence v1.0"
name: "WowPresence v1.1"
body_path: RELEASE_NOTES.md
generate_release_notes: 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.
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
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.
Runtime files are kept together in:
Runtime files are kept together in one of these locations:
**Standalone installation:**
```text
<WoW folder>\WowPresence\
@@ -130,6 +140,18 @@ Runtime files are kept together in:
└─ 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
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
- WowPresence.dll
- WowPresence.exe
- WowPresence.zip ready-to-install package
- `WowPresence.dll`
- `WowPresence.exe`
- `WowPresence.zip` ready-to-install standalone package
## Highlights
- 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
## Standalone installation
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.
*
* Runtime contract:
* <game>\WowPresence\discord_wow_status.json
* <game>\WowPresence\discord_broadcast_flags
* standalone: <game>\WowPresence\...
* Modernization Tool: <game>\.modernization_tool\WowPresence\...
*
* Discord IPC is intentionally out of process. After the first sample, this
* 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;
}
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) {
char root[MAX_PATH];
char root[MAX_PATH], managed[MAX_PATH];
int count;
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);
if (output_size) output[output_size - 1] = 0;
if (count < 0 || (size_t)count >= output_size) return 0;
+24 -3
View File
@@ -3,7 +3,7 @@
* Invisible companion process for WowPresence.
*
* - 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
* - exits when WoW_Modernized.exe exits
*/
@@ -54,9 +54,30 @@ static int own_directory(char *out, size_t out_size) {
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) {
char root[MAX_PATH];
char root[MAX_PATH], managed[MAX_PATH];
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;
_snprintf(out, out_size, "%s\\WowPresence", root);
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") ||
!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;
}