opencode-discord 1.1.0 → 1.1.1

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 +54 -8
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -3,8 +3,23 @@ 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
- export const DiscordStatus: Plugin = async ({ project }) => {
7
- const client = new Client({ clientId: CLIENT_ID })
6
+ export const DiscordStatus: Plugin = async ({ client: sdk, project }) => {
7
+ async function log(level: string, message: string, extra?: any) {
8
+ try {
9
+ await sdk.app.log({
10
+ service: "opencode-discord",
11
+ level,
12
+ message,
13
+ extra,
14
+ })
15
+ } catch (e) {
16
+ console.error(`[opencode-discord] ${message}`, extra ?? "", e)
17
+ }
18
+ }
19
+
20
+ await log("info", "Plugin initializing", { clientId: CLIENT_ID, project: project?.name })
21
+
22
+ const rpc = new Client({ clientId: CLIENT_ID })
8
23
  let connected = false
9
24
  let sessionActive = false
10
25
  let currentProject = project?.name ?? ""
@@ -12,7 +27,11 @@ export const DiscordStatus: Plugin = async ({ project }) => {
12
27
  let lastEditedFile: string | undefined
13
28
 
14
29
  async function updatePresence() {
15
- if (!connected) return
30
+ await log("debug", "updatePresence called", { connected, sessionActive, lastEditedFile })
31
+ if (!connected) {
32
+ await log("warn", "Skipping presence update - not connected to Discord")
33
+ return
34
+ }
16
35
 
17
36
  const details = sessionActive
18
37
  ? currentProject
@@ -27,7 +46,7 @@ export const DiscordStatus: Plugin = async ({ project }) => {
27
46
  : "Idle"
28
47
 
29
48
  try {
30
- await client.user?.setActivity({
49
+ await rpc.user?.setActivity({
31
50
  details,
32
51
  state,
33
52
  startTimestamp,
@@ -36,43 +55,67 @@ export const DiscordStatus: Plugin = async ({ project }) => {
36
55
  smallImageKey: sessionActive ? "ai" : "idle",
37
56
  smallImageText: sessionActive ? "AI Active" : "Idle",
38
57
  })
39
- } catch {}
58
+ await log("info", "Presence updated", { details, state })
59
+ } catch (e) {
60
+ await log("error", "Failed to update presence", { error: String(e) })
61
+ }
40
62
  }
41
63
 
42
- client.on("ready", () => {
64
+ rpc.on("ready", async () => {
43
65
  connected = true
44
66
  startTimestamp = Date.now()
45
- updatePresence()
67
+ await log("info", "Discord RPC connected", { user: rpc.user?.username })
68
+ await updatePresence()
69
+ })
70
+
71
+ rpc.on("error", async (err: any) => {
72
+ await log("error", "Discord RPC error", { error: String(err) })
46
73
  })
47
74
 
48
- client.login().catch(() => {
75
+ rpc.on("disconnected", async () => {
49
76
  connected = false
77
+ await log("warn", "Discord RPC disconnected")
50
78
  })
51
79
 
80
+ try {
81
+ await log("info", "Attempting Discord RPC login...")
82
+ await rpc.login()
83
+ await log("info", "Discord RPC login successful")
84
+ } catch (e) {
85
+ connected = false
86
+ await log("error", "Discord RPC login failed", { error: String(e) })
87
+ }
88
+
52
89
  return {
53
90
  event: async ({ event }) => {
91
+ await log("debug", `Event received: ${event.type}`, { event })
92
+
54
93
  switch (event.type) {
55
94
  case "session.created":
56
95
  sessionActive = true
57
96
  startTimestamp = Date.now()
58
97
  lastEditedFile = undefined
98
+ await log("info", "Session created")
59
99
  break
60
100
 
61
101
  case "session.idle":
62
102
  case "session.error":
63
103
  sessionActive = false
64
104
  lastEditedFile = undefined
105
+ await log("info", `Session ${event.type}`)
65
106
  break
66
107
 
67
108
  case "session.deleted":
68
109
  sessionActive = false
69
110
  lastEditedFile = undefined
111
+ await log("info", "Session deleted")
70
112
  break
71
113
 
72
114
  case "file.edited":
73
115
  lastEditedFile =
74
116
  (event as any).file?.split("/").pop() ??
75
117
  (event as any).file
118
+ await log("info", "File edited", { file: lastEditedFile })
76
119
  break
77
120
  }
78
121
 
@@ -80,10 +123,13 @@ export const DiscordStatus: Plugin = async ({ project }) => {
80
123
  },
81
124
 
82
125
  "tool.execute.after": async (input) => {
126
+ await log("debug", `Tool executed: ${input.tool}`, { args: input.args })
127
+
83
128
  if (input.tool === "edit" || input.tool === "write") {
84
129
  const path = input.args?.filePath as string | undefined
85
130
  if (path) {
86
131
  lastEditedFile = path.split("/").pop() ?? path
132
+ await log("info", "File tool detected", { file: lastEditedFile })
87
133
  }
88
134
  await updatePresence()
89
135
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-discord",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
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",