Compare commits

...

18 Commits
v1.3 ... master

Author SHA1 Message Date
c1078b5b8b
fix: 🐛 mp4 is detected as audio
Some checks failed
Build Project / build (push) Has been cancelled
Deploy Documentation / deploy (push) Has been cancelled
Changed video to webm, maybe this will work.
2025-04-25 06:45:30 +03:00
1de80cdbb9
fix: 🐛 update mkdocs-video plugin configuration to force mp4 type 2025-04-25 06:35:52 +03:00
975ace70f9
fix: 🎨 correct shebang formatting in bridge.sh 2025-04-25 04:31:47 +03:00
ad076dfac7
docs: 📝 improve documentation to be more detailed
Included video tutorial link for installing the LaunchAgent and bridge inside CrossOver.
2025-04-25 04:29:35 +03:00
8c54d5bb2f
Fix theme toggle names and icons in light and dark modes 2025-04-25 03:43:35 +03:00
a0615229ef
Add installation checks to launchd.sh for improved user feedback 2025-04-25 03:42:34 +03:00
18c422101b
Remove obsolete installation and removal scripts 2025-04-25 03:41:09 +03:00
77a2a748ad
Fix macos version
Some checks failed
Build Project / build (push) Has been cancelled
2025-04-09 10:03:54 +03:00
0d4f46e536
Fix build error #14 2025-04-09 06:38:25 +03:00
d065019137
Fix formatting in documentation
Some checks failed
Build Project / build (push) Has been cancelled
Deploy Documentation / deploy (push) Has been cancelled
2025-04-08 12:11:52 +03:00
e03dce1a7c
Improve formatting of installation instructions in documentation 2025-04-08 12:09:38 +03:00
7c806779d2
Add link to latest pre-release in documentation 2025-04-08 12:05:58 +03:00
885cf775f9
Remove link to latest pre-release in documentation 2025-04-08 12:05:04 +03:00
7c07952df1
Add paths-ignore to GitHub Actions for build workflow 2025-04-08 12:04:16 +03:00
ea566cfdeb
Update documentation links in index.md 2025-04-08 12:00:56 +03:00
d56de21e74
Refactor GitHub Actions workflows 2025-04-08 11:58:50 +03:00
26a016cb26
Bump version 2025-04-08 11:51:50 +03:00
edfcce2ae9
Update copyright year in bridge.rc to 2025
[no ci]
2025-04-08 11:51:02 +03:00
18 changed files with 229 additions and 78 deletions

35
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Build Project
on:
push:
branches: [ "master" ]
paths-ignore:
- 'ISSUE_TEMPLATE/**'
- 'workflows/**'
- '.vsocde/**'
- 'docs/**'
pull_request:
branches: [ "master" ]
paths-ignore:
- 'ISSUE_TEMPLATE/**'
- 'workflows/**'
- '.vsocde/**'
- 'docs/**'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: dependencies
run: sudo apt update && sudo apt -y install gcc-mingw-w64 make
- name: make
run: make
- name: artifact
uses: actions/upload-artifact@v4
with:
name: bridge
path: build

View File

@ -1,29 +1,21 @@
name: Build and Deploy docs
name: Deploy Documentation
on:
push:
branches: [ "master" ]
branches: [ master ]
paths:
- docs/**
- mkdocs.yml
pull_request:
branches: [ "master" ]
paths:
- docs/**
- mkdocs.yml
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: dependencies
run: sudo apt update && sudo apt -y install gcc-mingw-w64 make
- name: make
run: make
- name: artifact
uses: actions/upload-artifact@v4
with:
name: bridge
path: build
deploy:
runs-on: ubuntu-latest
steps:
@ -43,4 +35,5 @@ jobs:
restore-keys: |
mkdocs-material-
- run: pip install mkdocs-material
- run: pip install mkdocs-video
- run: mkdocs gh-deploy --force

View File

@ -4,7 +4,9 @@ C_OBJECTS = $(C_SOURCES:.c=.o)
GIT_COMMIT = $(shell git rev-parse --short HEAD)
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
CFLAGS = -std=c17 -Wno-int-conversion -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
CWARNFLAGS = -Wno-int-conversion -Wno-incompatible-pointer-types
CFLAGS = -std=c17 -DGIT_COMMIT='"$(GIT_COMMIT)"' -DGIT_BRANCH='"$(GIT_BRANCH)"'
LFLAGS = -lgdi32 -lws2_32
# DBGFLAGS = -Wl,--export-all-symbols -g -O0 -ggdb3 -Wall
@ -18,7 +20,7 @@ build: $(C_OBJECTS)
%.o: %.c
$(info Compiling $<)
x86_64-w64-mingw32-gcc $(CFLAGS) $(DBGFLAGS) -c $< -o $@
x86_64-w64-mingw32-gcc $(CFLAGS) $(CWARNFLAGS) $(DBGFLAGS) -c $< -o $@
clean:
rm -f $(C_OBJECTS) build/bridge.exe bridge.res

View File

@ -58,12 +58,14 @@ The steps for MacOS are almost the same, but due to the way `$TMPDIR` works, you
- Download the latest build from the [releases](https://github.com/EnderIce2/rpc-bridge/releases)
- Open the archive and make the `launchd.sh` script executable by doing: `chmod +x launchd.sh`
- To **install** the LaunchAgent, run `./launchd install` and to **remove** it simply run `./launchd remove`.
- To **install** the LaunchAgent, run `./launchd.sh install` and to **remove** it simply run `./launchd.sh remove`.
The script will add a LaunchAgent to your user, that will symlink the `$TMPDIR` directory to `/tmp/rpc-bridge/tmpdir`.
*Note: You will need to launch the `bridge.exe` file manually in Wine at least once for it to register and launch automatically the next time.*
More details on how to install the LaunchAgent can be found in the [documentation](https://enderice2.github.io/rpc-bridge/).
## Compiling from source
- Install the `wine`, `gcc-mingw-w64` and `make` packages.

View File

@ -20,11 +20,13 @@
#define __darwin_close 0x2000006
#define __darwin_socket 0x2000061
#define __darwin_connect 0x2000062
#define __darwin_mmap 0x20000C5
#define __darwin_fcntl 0x200005C
#define __darwin_sysctl 0x20000CA
#define O_RDONLY 00
/* macos & linux are the same for PROT_READ, PROT_WRITE, MAP_FIXED & MAP_PRIVATE */
#define PROT_READ 1
#define PROT_WRITE 2
#define MAP_PRIVATE 0x02
@ -32,6 +34,8 @@
#define MAP_ANON 0x20
#define MAP_FAILED ((void *)-1)
#define __darwin_MAP_ANON 0x1000
#define SYS_SOCKET 1
#define SYS_CONNECT 3
@ -134,8 +138,17 @@ static inline int sys_close(int fd)
static inline unsigned int *sys_mmap(unsigned int *addr, size_t length, int prot, int flags, int fd, off_t offset)
{
assert(IsLinux);
return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset);
if (IsLinux)
return linux_syscall(__linux_mmap2, addr, length, prot, flags, fd, offset);
else
{
if (flags & MAP_ANON)
{
flags &= ~MAP_ANON;
flags |= __darwin_MAP_ANON;
}
return darwin_syscall(__darwin_mmap, addr, length, prot, flags, fd, offset);
}
}
static inline int sys_munmap(unsigned int *addr, size_t length)
@ -285,9 +298,6 @@ void ConnectToSocket(int fd)
"%s/snap.discord-canary/discord-ipc-%d",
};
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
socketAddr->sun_family = AF_UNIX;
int sockRet = 0;
for (int i = 0; i < sizeof(discordUnixSockets) / sizeof(discordUnixSockets[0]); i++)
{
@ -296,12 +306,16 @@ void ConnectToSocket(int fd)
for (int j = 0; j < 16; j++)
{
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
print("Probing %s\n", pipePath);
if (IsLinux)
{
struct sockaddr_un *socketAddr = sys_mmap(0x23000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
print("Socket address allocated at %#lx\n", socketAddr);
socketAddr->sun_family = AF_UNIX;
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr->sun_path, sizeof(socketAddr->sun_path), pipePath);
print("Probing %s\n", pipePath);
// unsigned long socketArgs[] = {
// (unsigned long)fd,
// (unsigned long)(intptr_t)&socketAddr,
@ -315,7 +329,16 @@ void ConnectToSocket(int fd)
sockRet = sys_socketcall(SYS_CONNECT, socketArgs);
}
else
{
struct sockaddr_un socketAddr;
socketAddr.sun_family = AF_UNIX;
snprintf(pipePath, pipePathLen, discordUnixSockets[i], runtime, j);
strcpy_s(socketAddr.sun_path, sizeof(socketAddr.sun_path), pipePath);
print("Probing %s\n", pipePath);
sockRet = sys_connect(fd, (caddr_t)&socketAddr, sizeof(socketAddr));
}
print(" error: %d\n", sockRet);
if (sockRet >= 0)
@ -347,7 +370,12 @@ void PipeBufferInThread(LPVOID lpParam)
bridge_thread *bt = (bridge_thread *)lpParam;
print("In thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
int EOFCount = 0;
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
char *l_buffer;
if (IsLinux)
l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
else
l_buffer = malloc(BUFFER_LENGTH);
print("Buffer in thread allocated at %#lx\n", l_buffer);
while (TRUE)
{
char buffer[BUFFER_LENGTH];
@ -439,7 +467,12 @@ void PipeBufferOutThread(LPVOID lpParam)
{
bridge_thread *bt = (bridge_thread *)lpParam;
print("Out thread started using fd %d and pipe %#x\n", bt->fd, bt->hPipe);
char *l_buffer = sys_mmap(0x25000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
char *l_buffer;
if (IsLinux)
l_buffer = sys_mmap(0x26000, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED, -1, 0);
else
l_buffer = malloc(BUFFER_LENGTH);
print("Buffer out thread allocated at %#lx\n", l_buffer);
while (TRUE)
{
char buffer[BUFFER_LENGTH];

View File

@ -19,7 +19,7 @@ BEGIN
VALUE "FileDescription", "Simple bridge that allows you to use Discord Rich Presence with Wine games/software."
VALUE "FileVersion", VER_VERSION_STR
VALUE "InternalName", "bridge"
VALUE "LegalCopyright", "Copyright (c) 2024 EnderIce2"
VALUE "LegalCopyright", "Copyright (c) 2025 EnderIce2"
VALUE "OriginalFilename", "bridge.exe"
VALUE "ProductName", "rpc-bridge"
VALUE "ProductVersion", VER_VERSION_STR

View File

@ -1,4 +1,4 @@
#! /bin/sh
#!/bin/sh
# This script is used to run Steam Play with the bridge.
# Usage: /path/to/bridge.sh %command%

View File

@ -1,3 +0,0 @@
@echo off
START /WAIT bridge.exe --install

View File

@ -8,6 +8,16 @@ LOCATION=~/Library/Application\ Support/rpc-bridge
SCRIPT=$LOCATION/rpc-bridge
AGENT=~/Library/LaunchAgents/com.enderice2.rpc-bridge.plist
function is_installed() {
if [ -f "$AGENT" ]; then
launchctl list | grep -q "com.enderice2.rpc-bridge"
if [ $? -eq 0 ]; then
return 0
fi
fi
return 1
}
function install() {
# Directories
if [ ! -d "$SYMLINK" ]; then
@ -71,9 +81,16 @@ fi
case $1 in
install)
if is_installed; then
echo "LaunchAgent is already installed."
exit 0
fi
install
;;
remove)
if ! is_installed; then
echo "LaunchAgent is not installed. Continuing anyway."
fi
remove
;;
*)

View File

@ -1,3 +0,0 @@
@echo off
START /WAIT bridge.exe --uninstall

35
docs/README.md Normal file
View File

@ -0,0 +1,35 @@
# Documentation
> **Note:** This documentation is built and deployed using [MkDocs Material](https://squidfunk.github.io/mkdocs-material/) (with mkdocs-video) via GitHub Actions. For the best experience, view it on the [published site](https://enderice2.github.io/rpc-bridge/) or with MkDocs locally. Some features (such as tabs, videos, or special formatting) may not display correctly in plain Markdown viewers.
This repository contains the documentation for the project. It is written in Markdown and rendered using MkDocs.
## Getting Started
To view the documentation locally, install the required Python packages:
```bash
pip install mkdocs mkdocs-material mkdocs-video
```
Once installed, you can serve the documentation locally by running:
```bash
mkdocs serve
```
This will start a local web server and you can view the documentation in your browser at `http://127.0.0.1:8000`.
## Contributing
If you want to contribute to the documentation, please follow these steps:
1. Fork the repository.
2. Make your changes in a branch.
3. Submit a pull request.
Please ensure that your changes are consistent with the existing style and structure of the documentation.
## License
This documentation is licensed under the MIT License. See the LICENSE file for more information.

Binary file not shown.

View File

@ -9,7 +9,7 @@ Simple bridge that allows you to use Discord Rich Presence with Wine games/softw
[Download latest release](https://github.com/EnderIce2/rpc-bridge/releases/latest/download/bridge.zip "Recommended"){ .md-button .md-button--primary }
[Download latest pre-release](https://github.com/EnderIce2/rpc-bridge/releases "Unstable builds with experimental features"){ .md-button }
<!-- [Download latest build](https://github.com/EnderIce2/rpc-bridge/actions "Builds from the latest commits, here be dragons!"){ .md-button } -->
[Download latest build](https://github.com/EnderIce2/rpc-bridge/actions/workflows/build.yml "Builds from the latest commits, here be dragons!"){ .md-button }
Works by running a small program in the background that creates a [named pipe](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes) `\\.\pipe\discord-ipc-0` inside the prefix and forwards all data to the pipe `/run/user/1000/discord-ipc-0`.
@ -27,6 +27,35 @@ For v1.0, see [the original README](https://github.com/EnderIce2/rpc-bridge/blob
---
## My game is not showing up in Discord
If your game is not showing up in Discord, please check the following:
- The game you are playing has [Rich Presence](https://discord.com/developers/docs/rich-presence/overview) support!
- Some games may not have this feature. It's up to developers of the game to implement it.
This is not an issue related to the bridge.
- You followed the installation steps correctly.
- You are using the latest version of the bridge. Currently is ![GitHub Release](https://img.shields.io/github/v/release/EnderIce2/rpc-bridge?style=flat-square&label=%20).
### I still want to see the game in Discord!
This is outside the scope of this project, but here are some workarounds:
- You can manually add the game to Discord by going to `User Settings >` under `Activity Settings` in `Registered Games` tab. [Official Article](https://support.discord.com/hc/en-us/articles/7931156448919-Activity-Status-Recent-Activity#h_01HTJA8QV5ABSA6FY6GEPMA946)
- Tip: You can rename the game to whatever you want.
---
## Compiling from source
- Install the `wine`, `gcc-mingw-w64` and `make` packages.
- Open a terminal in the directory that contains this file and run `make`.
- The compiled executable will be located in `build/bridge.exe`.
---
## Examples
[**League Of Legends**](https://www.leagueoflegends.com/en-us/) running under Wine using Lutris

View File

@ -62,19 +62,6 @@ This method is recommended because it's easier to manage.
- Globally
- `flatpak override --user --filesystem=xdg-run/discord-ipc-0`
## macOS
The steps for MacOS are almost the same, but due to the way `$TMPDIR` works, you will have to install a **LaunchAgent**.
- Download the latest build from the [releases](https://github.com/EnderIce2/rpc-bridge/releases)
- Open the archive and make the `launchd.sh` script executable by doing: `chmod +x launchd.sh`
- To **install** the LaunchAgent, run `./launchd install` and to **remove** it simply run `./launchd remove`.
The script will add a LaunchAgent to your user, that will symlink the `$TMPDIR` directory to `/tmp/rpc-bridge/tmpdir`.
!!! info "Note"
You will need to launch the `bridge.exe` file manually in Wine at least once for it to register and launch automatically the next time.
## Run without installing the service
If you prefer not to use the service, you can manually run `bridge.exe` within the Wine prefix.
@ -84,28 +71,18 @@ In Lutris, you can achieve this by adding the path to `bridge.exe` in the `Execu
=== "Without bridge"
```
Executable
/mnt/games/lutris/league-of-legends/drive_c/Riot Games/League of Legends/LeagueClient.exe
Arguments
--locale=en_US --launch-product=league_of_legends --launch-patchline=live
```
- Executable
- `/mnt/games/lutris/league-of-legends/drive_c/Riot Games/League of Legends/LeagueClient.exe`
- Arguments
- `--locale=en_US --launch-product=league_of_legends --launch-patchline=live`
=== "With bridge"
```
Executable
/mnt/games/lutris/league-of-legends/drive_c/bridge.exe
Arguments
"C:\Riot Games\League of Legends\LeagueClient.exe" --locale=en_US --launch-product=league_of_legends --launch-patchline=live
```
- Executable
- `/mnt/games/lutris/league-of-legends/drive_c/bridge.exe`
- Arguments
- `"C:\Riot Games\League of Legends\LeagueClient.exe" --locale=en_US --launch-product=league_of_legends --launch-patchline=live`
In Wine, all you need to do is run `bridge.exe` and select `Start`.
## Compiling from source
- Install the `wine`, `gcc-mingw-w64` and `make` packages.
- Open a terminal in the directory that contains this file and run `make`.
- The compiled executable will be located in `build/bridge.exe`.
[^1]: As requested [here](https://github.com/EnderIce2/rpc-bridge/issues/2).

28
docs/macos.md Normal file
View File

@ -0,0 +1,28 @@
# Installation
Installation will copy itself to `C:\windows\bridge.exe` and create a Windows service.
Logs are stored in `C:\windows\logs\bridge.log`.
## Preparing macOS for Installation
Before proceeding with the installation, you need to set up a **LaunchAgent** due to the way `$TMPDIR` works on macOS.
- Download the latest build from the [releases](https://github.com/EnderIce2/rpc-bridge/releases).
- Open the archive and make the `launchd.sh` script executable by doing: `chmod +x launchd.sh`.
- To **install** the LaunchAgent, run `./launchd.sh install` and to **remove** it simply run `./launchd.sh remove`.
The script will add a LaunchAgent to your user, that will symlink the `$TMPDIR` directory to `/tmp/rpc-bridge/tmpdir`.
## Video Tutorial on how to install the LaunchAgent + bridge inside CrossOver
![type:video](assets/macos-crossover.webm){: style='width: 66%; height: 20vw;'}
## Wine (~/.wine)
- Double click `bridge.exe` and click `Install`.
- ![gui](assets/gui.png "rpc-bridge GUI")
- To remove, the same process can be followed, but click `Remove` instead.
## Run without installing the service
If you prefer not to use the service, you can manually run `bridge.exe` within the prefix, and click on `Start` in the GUI.

View File

@ -8,7 +8,7 @@
- `Install` will install the service.
- `Remove` will uninstall the service.
## Commands
## CLI
- `--help` Show help message
- This will show the help message

View File

@ -14,22 +14,22 @@ theme:
palette:
- media: "(prefers-color-scheme)"
toggle:
icon: material/weather-sunny
name: Switch to light mode
icon: material/brightness-auto
name: Switch to dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
primary: black
accent: indigo
toggle:
icon: material/brightness-4
name: Switch to system preference
name: Switch to light mode
- media: "(prefers-color-scheme: light)"
scheme: default
primary: indigo
accent: indigo
toggle:
icon: material/brightness-7
name: Switch to dark mode
name: Switch to system preference
font:
text: Roboto
code: Roboto Mono
@ -70,7 +70,13 @@ markdown_extensions:
alternate_style: true
plugins:
- offline
- mkdocs-video:
is_video: true
video_controls: true
video_loop: false
video_muted: false
nav:
- Home: index.md
- Installation: installation.md
- Linux: linux.md
- macOS: macos.md
- Usage: usage.md

View File

@ -5,5 +5,5 @@
#define IDM_HELP_ABOUT 40003
#define IDM_VIEW_LOG 40004
#define VER_VERSION 1, 3, 0, 0
#define VER_VERSION_STR "1.3\0"
#define VER_VERSION 1, 4, 0, 0
#define VER_VERSION_STR "1.4.0.0\0"