opencode-discord 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.ts +107 -0
  2. package/package.json +30 -0
package/index.ts ADDED
@@ -0,0 +1,107 @@
1
+ import type { Plugin } from "@opencode-ai/plugin"
2
+ import { Client } from "@theuntraceable/discord-rpc"
3
+
4
+ const CLIENT_ID = process.env.DISCORD_CLIENT_ID ?? "YOUR_DISCORD_APP_ID"
5
+
6
+ const client = new Client({ clientId: CLIENT_ID })
7
+ let connected = false
8
+ let sessionActive = false
9
+ let currentProject = ""
10
+ let startTimestamp = Date.now()
11
+ let lastEditedFile: string | undefined
12
+
13
+ async function updatePresence(): Promise<void> {
14
+ if (!connected) return
15
+
16
+ const details = sessionActive
17
+ ? currentProject
18
+ ? `Working on ${currentProject}`
19
+ : "Working on a project"
20
+ : "No active session"
21
+
22
+ const state = sessionActive
23
+ ? lastEditedFile
24
+ ? `Editing ${lastEditedFile}`
25
+ : "AI session active"
26
+ : "Idle"
27
+
28
+ try {
29
+ await client.user?.setActivity({
30
+ details,
31
+ state,
32
+ startTimestamp,
33
+ largeImageKey: "opencode",
34
+ largeImageText: "OpenCode",
35
+ smallImageKey: sessionActive ? "ai" : "idle",
36
+ smallImageText: sessionActive ? "AI Active" : "Idle",
37
+ })
38
+ } catch {
39
+ // Presence update failed
40
+ }
41
+ }
42
+
43
+ export const DiscordStatus: Plugin = async ({ project }) => {
44
+ currentProject = project?.name ?? ""
45
+
46
+ client.on("ready", () => {
47
+ connected = true
48
+ startTimestamp = Date.now()
49
+ updatePresence()
50
+ })
51
+
52
+ client.login().catch(() => {
53
+ connected = false
54
+ })
55
+
56
+ return {
57
+ "session.created": async () => {
58
+ sessionActive = true
59
+ startTimestamp = Date.now()
60
+ lastEditedFile = undefined
61
+ await updatePresence()
62
+ },
63
+
64
+ "session.updated": async ({ event }) => {
65
+ sessionActive = true
66
+ if (event.data?.project) {
67
+ currentProject = event.data.project
68
+ }
69
+ await updatePresence()
70
+ },
71
+
72
+ "session.idle": async () => {
73
+ sessionActive = false
74
+ lastEditedFile = undefined
75
+ await updatePresence()
76
+ },
77
+
78
+ "session.error": async () => {
79
+ sessionActive = false
80
+ await updatePresence()
81
+ },
82
+
83
+ "session.deleted": async () => {
84
+ sessionActive = false
85
+ lastEditedFile = undefined
86
+ await updatePresence()
87
+ },
88
+
89
+ "file.edited": async ({ event }) => {
90
+ if (event.data?.file) {
91
+ lastEditedFile = event.data.file.split("/").pop() ?? event.data.file
92
+ }
93
+ await updatePresence()
94
+ },
95
+
96
+ "command.executed": async ({ event }) => {
97
+ if (event.data?.command) {
98
+ lastEditedFile = undefined
99
+ }
100
+ await updatePresence()
101
+ },
102
+
103
+ "session.diff": async () => {
104
+ await updatePresence()
105
+ },
106
+ }
107
+ }
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "opencode-discord",
3
+ "version": "1.0.0",
4
+ "description": "Discord Rich Presence plugin for OpenCode — shows your AI coding activity in Discord",
5
+ "type": "module",
6
+ "main": "index.ts",
7
+ "files": [
8
+ "index.ts"
9
+ ],
10
+ "keywords": [
11
+ "opencode",
12
+ "plugin",
13
+ "discord",
14
+ "rich-presence",
15
+ "rpc",
16
+ "status"
17
+ ],
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/TheUntraceable/opencode-discord-status.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/TheUntraceable/opencode-discord-status/issues"
25
+ },
26
+ "homepage": "https://github.com/TheUntraceable/opencode-discord-status#readme",
27
+ "dependencies": {
28
+ "@theuntraceable/discord-rpc": "^1.0.0"
29
+ }
30
+ }