深入discord-rpc客户端:adobe-discord-rpc的IPC连接、15秒自动重连与setActivity API全解析

📅 2026/8/24 8:59:44
深入discord-rpc客户端:adobe-discord-rpc的IPC连接、15秒自动重连与setActivity API全解析
深入discord-rpc客户端adobe-discord-rpc的IPC连接、15秒自动重连与setActivity API全解析【免费下载链接】adobe-discord-rpcDiscord Rich Presence extension for your adobe apps!项目地址: https://gitcode.com/gh_mirrors/ad/adobe-discord-rpcadobe-discord-rpc是一款免费的 Discord Rich Presence 扩展它能将 Photoshop、After Effects、Premiere Pro 等 Adobe 应用实时接入 Discord 客户端打开 Adobe 软件你的个人资料就会自动显示正在使用 After Effects、当前文档名、计时器等信息。本文将带你深入它的 discord-rpc 客户端源码完整解析IPC 连接原理、15 秒自动重连机制与setActivity API的每个字段——不需要会写代码也能看懂。 先看懂效果Rich Presence 到底展示了什么从上面的演示图可以看到adobe-discord-rpc 支持 After Effects、Photoshop、Premiere Pro、Illustrator、Audition、Animate 等应用。每张状态卡片包含大图标应用 Logo如 Ps、AeDetails文档名例如Untitled Project.aepState当前状态例如Comp 1当前合成/图层计时00:49 elapsed从打开应用开始累计PartyLayer 1 (1 of 1)这类图层进度信息在 Discord 个人资料页效果同样清晰可见️ 整体架构一个隐藏窗口 一条事件总线adobe-discord-rpc 的 discord-rpc 客户端运行在一个对用户完全不可见的隐藏 HTML 窗口里。入口是 src/rpc.html它只加载两个脚本src/libs/CSInterface.jsAdobe CEP 提供的官方桥接库负责在 ExtendScriptAdobe 主程序与网页 JavaScript 之间通信打包后的rpc_client-dist/bundle.js真正的 RPC 客户端核心调度逻辑在 src/rpc_client-src/index.js一个每秒执行一次的main()循环不断向 Adobe 主程序查询现在是什么文档、什么图层组装成 props 后通过 Discord 的 setActivity 接口推送出去。而 UI 面板你看到的设置界面位于 src/client-src/两者不直接对话而是通过com.tee.rpc.activity、com.tee.rpc.user等CSEvent 事件解耦通信——改配置、看日志、重置状态全靠这条事件总线。 IPC 连接原理为什么选择 transport: ipcDiscord Rich Presence 支持多种传输通道adobe-discord-rpc 在 src/rpc_client-src/rpc.js 的login()中明确选择了IPC进程间通信this.client new Client({ transport: ipc })为什么是 IPC因为 Discord 桌面客户端在本机开放了一个本地通信端口命名管道/IPC 端点。扩展只要在本机运行就能零网络延迟、无需账号密码、不依赖 Discord 在线 API地把状态注入桌面客户端。这也是所有桌面游戏正在玩 XXX状态的标准做法。IPC 通道还有一个关键前提每个应用需要一个 Discord Application ID。adobe-discord-rpc 在 src/rpc_client-src/client.js 里维护了一张映射表把 13 个 Adobe 应用一一绑定到各自的 Discord 应用 IDAdobe 应用应用 ID部分示例Photoshop748586506888806460After Effects748568089939148832Premiere Pro748580494324662353启动时通过csInterface.getApplicationID()判断我是哪个 Adobe 应用自动取到对应的 clientId 完成登录。登录成功的标志是ready事件触发此时会打印当前 Discord 用户名并把active置为true。 15 秒自动重连断线后如何自愈用 Discord 的人都遇到过这种情况升级客户端、切换账号Rich Presence 就悄悄消失了。adobe-discord-rpc 在 src/rpc_client-src/rpc.js 里内置了一套非常简洁的15 秒自动重连机制监听disconnected事件——一旦 Discord 断开 IPC 通道立即调用destroy()销毁旧连接active false删除 client 实例启动一个setInterval每 15 秒15000ms重新执行一次login()重连成功后clearInterval停止轮询日志提示Reconnecting in 15 seconds...也只会在失败时出现。const reconnect setInterval(() { this.login().then(() { this.active true; clearInterval(reconnect) }) }, 15000)设计亮点重连间隔定为 15 秒而非 1 秒是在恢复速度与避免疯狂重试刷屏日志之间的平衡。配合每秒一次的main()心跳断线恢复后状态会在下一个 1 秒周期内自动补发用户几乎无感知 setActivity API 字段全解析setActivity()是整个扩展的最后一公里实现在 src/rpc_client-src/rpc.js。它把 Adobe 侧收集到的 props 翻译成 Discord 官方的 Activity 对象字段来源主机脚本函数在 Discord 中的显示detailsdetails()卡片第一行如文档名statestate()卡片第二行如当前图层名timestamps.start启动时间00:49 elapsed计时assets.large_imagelargeImageKey()左侧大图标logo / logo2assets.small_imagesmallImageKey()右下角小图标如当前工具party.sizepartySize()/partyMax()Layer 1 (1 of 1)大图标logo2就是项目内置的应用 Logo 素材例如 Photoshop 的 src/assets/PHXS1.png 会在登录 Discord 时注册为可引用的 image key防抖细节在 src/rpc_client-src/index.js 中main()循环每秒都会组装新的 props但先用lodash/isEqual与上一次缓存对比——只有内容真正变化才调用 setActivity。否则每秒无脑推送会既浪费资源又触发 Discord 的频率限制。 状态数据从哪来ExtendScript 主机脚本props 的每个字段都不是凭空而来而是由callScript()通过csInterface.evalScript()注入 Adobe 主程序执行的 ExtendScript 函数得到的。以 Photoshop 的 src/host/PHXS.jsx 为例details()→ 返回app.activeDocument.name文档名state()→ 返回app.activeDocument.activeLayer.name当前图层smallImageKey()→ 返回app.currentTool当前工具映射为小图标partySize()/partyMax()→ 遍历图层树统计层级位置层数超过 100 时主动降级为 0避免拖慢主程序每个支持的应用都在 src/host/ 下有一份同款脚本AEFT.jsx、PPRO.jsx、AUDT.jsx……这就是一套 RPC 客户端 N 份应用脚本的插件式设计。 顺带一提配置项里还藏着一个Cat 彩蛋模式见 src/rpc_client-src/localstorage.js开启后扩展界面会出现这只幸存的猫 快速上手与常见问题安装方式解压扩展包把adobe-discord-rpc文件夹放入 Adobe 的 CEP 扩展目录Windows 为C:\Program Files (x86)\Common Files\Adobe\CEP\extensions然后重启应用即可扩展会随应用自动启动如需从源码构建仓库地址为git clone https://gitcode.com/gh_mirrors/ad/adobe-discord-rpc常见问题Apple Silicon 的 Mac需通过 Rosetta 运行 Photoshop并在 首选项 → 常规 中开启Legacy Extensions再重启应用详见 README.md。状态不更新Discord 官方近期调整过 RPC API请务必从 Releases 下载最新版本。部分应用不受支持Media Encoder、Acrobat、Premiere Rush、Lightroom Classic 暂不支持。 总结adobe-discord-rpc 的 discord-rpc 客户端虽然代码量不大工程思路却很清晰IPC 直连Discord 桌面端本机通信零延迟每个 Adobe 应用绑定独立 Application ID15 秒自动重连让断线自愈配合每秒心跳在恢复后立即补发状态setActivity 全字段映射 isEqual 防抖保证展示丰富且推送克制事件总线解耦UI 与 RPC 客户端ExtendScript 主机脚本按应用可插拔。理解了这套IPC 连接 自动重连 setActivity的组合拳你甚至可以把同样的模式搬到自己开发的桌面应用里。输出文章【免费下载链接】adobe-discord-rpcDiscord Rich Presence extension for your adobe apps!项目地址: https://gitcode.com/gh_mirrors/ad/adobe-discord-rpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考