opencode-discord 1.0.0 → 1.1.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 +65 -80
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -3,45 +3,41 @@ import { Client } from "@theuntraceable/discord-rpc"
3
3
 
4
4
  const CLIENT_ID = process.env.DISCORD_CLIENT_ID ?? "YOUR_DISCORD_APP_ID"
5
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
6
  export const DiscordStatus: Plugin = async ({ project }) => {
44
- currentProject = project?.name ?? ""
7
+ const client = new Client({ clientId: CLIENT_ID })
8
+ let connected = false
9
+ let sessionActive = false
10
+ let currentProject = project?.name ?? ""
11
+ let startTimestamp = Date.now()
12
+ let lastEditedFile: string | undefined
13
+
14
+ async function updatePresence() {
15
+ if (!connected) return
16
+
17
+ const details = sessionActive
18
+ ? currentProject
19
+ ? `Working on ${currentProject}`
20
+ : "Working on a project"
21
+ : "No active session"
22
+
23
+ const state = sessionActive
24
+ ? lastEditedFile
25
+ ? `Editing ${lastEditedFile}`
26
+ : "AI session active"
27
+ : "Idle"
28
+
29
+ try {
30
+ await client.user?.setActivity({
31
+ details,
32
+ state,
33
+ startTimestamp,
34
+ largeImageKey: "opencode",
35
+ largeImageText: "OpenCode",
36
+ smallImageKey: sessionActive ? "ai" : "idle",
37
+ smallImageText: sessionActive ? "AI Active" : "Idle",
38
+ })
39
+ } catch {}
40
+ }
45
41
 
46
42
  client.on("ready", () => {
47
43
  connected = true
@@ -54,54 +50,43 @@ export const DiscordStatus: Plugin = async ({ project }) => {
54
50
  })
55
51
 
56
52
  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
53
+ event: async ({ event }) => {
54
+ switch (event.type) {
55
+ case "session.created":
56
+ sessionActive = true
57
+ startTimestamp = Date.now()
58
+ lastEditedFile = undefined
59
+ break
60
+
61
+ case "session.idle":
62
+ case "session.error":
63
+ sessionActive = false
64
+ lastEditedFile = undefined
65
+ break
66
+
67
+ case "session.deleted":
68
+ sessionActive = false
69
+ lastEditedFile = undefined
70
+ break
71
+
72
+ case "file.edited":
73
+ lastEditedFile =
74
+ (event as any).file?.split("/").pop() ??
75
+ (event as any).file
76
+ break
68
77
  }
69
- await updatePresence()
70
- },
71
78
 
72
- "session.idle": async () => {
73
- sessionActive = false
74
- lastEditedFile = undefined
75
79
  await updatePresence()
76
80
  },
77
81
 
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
82
+ "tool.execute.after": async (input) => {
83
+ if (input.tool === "edit" || input.tool === "write") {
84
+ const path = input.args?.filePath as string | undefined
85
+ if (path) {
86
+ lastEditedFile = path.split("/").pop() ?? path
87
+ }
88
+ await updatePresence()
92
89
  }
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
90
  },
106
91
  }
107
92
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-discord",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Discord Rich Presence plugin for OpenCode — shows your AI coding activity in Discord",
5
5
  "type": "module",
6
6
  "main": "index.ts",