1 Commits

Author SHA1 Message Date
Dusk-92 74deea1791 Initialize WowPresence 2026-09-04 22:32:45 +02:00
7 changed files with 120 additions and 68 deletions
+5 -9
View File
@@ -72,20 +72,18 @@ jobs:
dist/WowPresence.zip
if-no-files-found: error
- name: Create GitHub Release v1.2
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == 'release v1.2' }}
- name: Create GitHub Release v1.3
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == 'release v1.3' }}
uses: softprops/action-gh-release@v3
with:
tag_name: v1.2
tag_name: v1.3
target_commitish: ${{ github.sha }}
files: |
dist/WowPresence.dll
dist/WowPresence.exe
dist/WowPresence.zip
fail_on_unmatched_files: true
name: "WowPresence v1.2"
name: "WowPresence v1.3"
body_path: RELEASE_NOTES.md
generate_release_notes: true
generate_release_notes: false
make_latest: true
- name: Create GitHub Release
@@ -93,8 +91,6 @@ jobs:
uses: softprops/action-gh-release@v3
with:
files: |
dist/WowPresence.dll
dist/WowPresence.exe
dist/WowPresence.zip
fail_on_unmatched_files: true
name: "WowPresence ${{ github.ref_name }}"
+66 -24
View File
@@ -44,7 +44,7 @@ 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:
When WowPresence is installed through the **[Modernization Tool](https://github.com/Dusk-92/Modernization-Tool)**, the same binaries automatically use:
```text
<WoW folder>\.modernization_tool\WowPresence\
@@ -54,9 +54,7 @@ instead. No separate build is required.
## 🛰️ Discord Application ID
WowPresence intentionally does **not** include a server-specific Discord Application ID.
To create yours:
To configure your own Discord Application ID:
1. Open the **Discord Developer Portal**: https://discord.com/developers/applications
2. Create a **New Application**.
@@ -75,6 +73,14 @@ Example:
123456789012345678
```
For **OctoWoW**, you can use the preconfigured Discord Application ID:
```text
1544072796098011176
```
This is the same Application ID automatically configured by **Modernization Tool**.
No Discord Client Secret, bot token or bot account is used or required.
If `discord_application_id` is missing or invalid, Rich Presence remains disabled and the reason is written to `WowPresence\WowPresence.log`.
@@ -155,29 +161,75 @@ Runtime files are kept together in one of these locations:
If the Modernization Tool managed folder exists, WowPresence automatically prefers it. Otherwise it uses the standalone `WowPresence` folder.
## 🔒 Privacy flags
## 🔒 Discord Rich Presence privacy
The included file:
WowPresence lets you choose exactly which character details are shown on Discord.
For a standalone installation, edit:
```text
WowPresence\discord_broadcast_flags
```
controls which character details are published to Discord.
When WowPresence is installed through **Modernization Tool**, the equivalent file is stored in:
```text
.modernization_tool\WowPresence\discord_broadcast_flags
```
Modernization Tool provides checkboxes for these options, so manual bitmask editing is normally only needed for standalone WowPresence installations.
### Available fields
Each field has its own value:
| Value | Field |
| ---: | --- |
| 1 | Name |
| 1 | Character Name |
| 2 | Guild |
| 4 | Faction |
| 8 | Class |
| 16 | Level |
| 32 | Zone |
| 63 | All fields |
| 64 | Race |
The release package uses `63` by default.
To display multiple fields, **add their values together** and put the result in `discord_broadcast_flags`.
If the file is deleted, WowPresence also defaults to all supported fields.
### Examples
| Display | Value |
| --- | ---: |
| Nothing | 0 |
| Character Name only | 1 |
| Faction + Class | 12 |
| Race only | 64 |
| Race + Faction + Class | 76 |
| Character Name + Level + Zone | 49 |
| All character details | 127 |
Example — to display **Race + Faction + Class**:
```text
Race = 64
Faction = 4
Class = 8
64 + 4 + 8 = 76
```
Then set:
```text
76
```
inside `discord_broadcast_flags`.
The default configuration uses `127`, which enables all supported character details.
WowPresence reads this setting while the game is running, so changes should normally appear on Discord automatically within a few seconds.
If the file is missing or contains an invalid value, WowPresence falls back to all supported fields.
## 🛡️ Administrator privileges
@@ -206,26 +258,16 @@ GitHub Actions builds:
The ZIP includes the ready-to-edit `WowPresence` configuration folder.
Tags matching `v*` can publish these files as a GitHub Release.
Tags matching `v*` publish `WowPresence.zip` as the GitHub Release asset.
## 📜 Project identity & licensing
## 📜 Project identity
WowPresence is an **independent community project**.
Compatibility with **World of Warcraft**, **Discord**, **OctoWoW**, **VanillaFixes**, **IchaLaunch**, or other referenced projects does not imply affiliation, endorsement, sponsorship or ownership by their respective rights holders or maintainers.
Compatibility with **World of Warcraft**, **Discord**, **OctoWoW**, **VanillaFixes**, or other referenced projects does not imply affiliation, endorsement, sponsorship or ownership by their respective rights holders or maintainers.
**World of Warcraft**, **Warcraft**, **Blizzard Entertainment**, **Discord**, and related names and marks remain the property of their respective rights holders.
This repository does not currently declare a software license.
For detailed provenance and third-party information, see:
- [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)
## 🙏 Credits
WowPresence is maintained by **Dusk-92**.
The project was inspired in part by the WoW character-status / Discord Rich Presence implementation in **IchaLaunch** by **brutaliccus**.
The current WowPresence implementation is maintained separately and does not include IchaLaunch binaries.
+17 -11
View File
@@ -1,16 +1,22 @@
# WowPresence v1.2
# WowPresence v1.3
## Changes
## What's New
- Reworked zone detection to use the player's real AreaTable ID.
- Zone names are now resolved from `AreaTable.dbc` instead of selecting the first plausible string from several client addresses.
- Prevents internal map/area tokens such as `H32D` and `HLVA` from being published as Discord zone names.
- Uses the client's active localized AreaTable name when available, with a safe populated-locale fallback.
- Keeps WowPresence fully standalone; ClassicAPI is not required.
- Modernization Tool installations continue to use `.modernization_tool\WowPresence\` automatically.
- Added independent privacy control for:
- Character Name
- Guild
- Race
- Faction
- Class
- Level
- Zone
- Added a dedicated Race flag.
- Full detail mask is now `127`.
- Fixed Discord Rich Presence combinations that previously failed when Name, Zone or Level were not shared.
- Race is no longer always shown and can now be disabled independently.
- Improved handling of empty Discord Rich Presence fields.
- Updated README with standalone privacy configuration examples.
## Included
- `WowPresence.dll`
- `WowPresence.exe`
- `WowPresence.zip` ready-to-install standalone package
- `WowPresence.zip` — ready-to-install package containing `WowPresence.dll`, `WowPresence.exe`, and the WowPresence configuration folder.
-14
View File
@@ -2,20 +2,6 @@
WowPresence contains original project code maintained by Dusk-92 and uses compatibility knowledge related to World of Warcraft 1.12.1 and Discord local Rich Presence IPC.
## IchaLaunch
The development of WowPresence was inspired in part by the character-status / Discord Rich Presence implementation in:
- Project: IchaLaunch
- Author / maintainer: brutaliccus
- Repository: https://github.com/brutaliccus/IchaLaunch
IchaLaunch was used as a technical reference during development, particularly for understanding a working WoW 1.12.1 character-status sampling approach.
The current WowPresence implementation is maintained separately and has been independently reworked. No IchaLaunch binary is included in this repository.
At the historical IchaLaunch revision reviewed during development, no explicit LICENSE, LICENSE.md, or COPYING file was present. This notice therefore records provenance and credit; it should not be interpreted as granting rights on behalf of the IchaLaunch author.
## ClassicAPI technical reference
AreaTable and current-player-area client layout details were cross-checked against:
+1 -1
View File
@@ -1 +1 @@
63
127
+4 -2
View File
@@ -75,7 +75,8 @@
#define SHARE_CLASS 8u
#define SHARE_LEVEL 16u
#define SHARE_ZONE 32u
#define SHARE_ALL 63u
#define SHARE_RACE 64u
#define SHARE_ALL 127u
static const uintptr_t kPlayerNameLocations[] = {
0x00C27FC8u, 0x00C27D88u, 0x00C27FD8u, 0
@@ -751,7 +752,8 @@ static void publish_character_snapshot(void) {
collect_character_snapshot(&snapshot);
mask = load_share_mask();
race_text = snapshot.in_world ? label_for_id(kRaceLabels, snapshot.race_id) : "";
race_text = (snapshot.in_world && (mask & SHARE_RACE))
? label_for_id(kRaceLabels, snapshot.race_id) : "";
class_text = (snapshot.in_world && (mask & SHARE_CLASS))
? label_for_id(kClassLabels, snapshot.class_id) : "";
faction_text = (snapshot.in_world && (mask & SHARE_FACTION))
+27 -7
View File
@@ -5,7 +5,7 @@
* - is started automatically by WowPresence.dll after WoW is running
* - 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
* - exits when the target WoW process exits
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@@ -293,7 +293,9 @@ static int load_status(Status *status) {
json_string(json, "class", status->class_name, sizeof(status->class_name));
json_string(json, "race", status->race, sizeof(status->race));
json_int(json, "level", &status->level);
return status->name[0] || status->zone[0] || status->level > 0;
return status->name[0] || status->zone[0] || status->level > 0 ||
status->guild[0] || status->faction[0] || status->class_name[0] ||
status->race[0];
}
static int rpc_read_packet(HANDLE pipe, char *payload, size_t payload_size) {
@@ -402,9 +404,26 @@ static void format_activity(const Status *s, char *out, size_t out_size, long lo
lstrcpynA(details, extra, sizeof(details));
}
_snprintf(out, out_size,
"{\"details\":\"%s\",\"state\":\"%s\",\"timestamps\":{\"start\":%lld}}",
details, s->zone, session_start);
/* Discord rejects empty string values for Rich Presence text fields.
* Omit a field entirely when the user did not choose anything that maps
* to it, so Race/Class/Faction/Guild-only and Zone-only combinations work. */
if (details[0] && s->zone[0]) {
_snprintf(out, out_size,
"{\"details\":\"%s\",\"state\":\"%s\",\"timestamps\":{\"start\":%lld}}",
details, s->zone, session_start);
} else if (details[0]) {
_snprintf(out, out_size,
"{\"details\":\"%s\",\"timestamps\":{\"start\":%lld}}",
details, session_start);
} else if (s->zone[0]) {
_snprintf(out, out_size,
"{\"state\":\"%s\",\"timestamps\":{\"start\":%lld}}",
s->zone, session_start);
} else {
_snprintf(out, out_size,
"{\"timestamps\":{\"start\":%lld}}",
session_start);
}
out[out_size - 1] = 0;
}
@@ -470,10 +489,11 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmdline, int show)
while (!pid && wait_loops++ < 25) {
pid = find_process("WoW_Modernized.exe");
if (!pid) pid = find_process("WoW.exe");
if (!pid) Sleep(200);
}
if (!pid) {
log_line("No running WoW_Modernized.exe found; WowPresence exiting.");
log_line("No running WoW process found; WowPresence exiting.");
return 0;
}
@@ -483,7 +503,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmdline, int show)
return 0;
}
log_line("WoW_Modernized.exe detected.");
log_line("WoW process detected.");
/* Fixed for the lifetime of this WoW process. Text updates, character
* changes and loading states reuse the same Discord elapsed-time origin. */
session_start = (long long)time(NULL);