opencode-discord 1.5.1 → 1.6.2
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.
- package/index.ts +33 -33
- package/package.json +1 -1
package/index.ts
CHANGED
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin"
|
|
2
2
|
import { Client } from "@xhayper/discord-rpc"
|
|
3
3
|
|
|
4
|
-
const CLIENT_ID = process.env.DISCORD_CLIENT_ID ?? "
|
|
4
|
+
const CLIENT_ID = process.env.DISCORD_CLIENT_ID ?? "1486144419940929676"
|
|
5
5
|
|
|
6
6
|
type Activity = "idle" | "thinking" | "editing" | "running" | "reading"
|
|
7
7
|
|
|
8
|
-
export const DiscordStatus: Plugin = async ({ project }) => {
|
|
9
|
-
const
|
|
8
|
+
export const DiscordStatus: Plugin = async ({ client: sdk, project, directory }) => {
|
|
9
|
+
const rpc = new Client({ clientId: CLIENT_ID })
|
|
10
10
|
let connected = false
|
|
11
11
|
let sessionActive = false
|
|
12
|
-
let currentProject = project?.name ?? "Unknown Project"
|
|
12
|
+
let currentProject = project?.name ?? (directory ? directory.split(/[\\/]/).pop() ?? "Unknown Project" : "Unknown Project")
|
|
13
13
|
let startTimestamp = Date.now()
|
|
14
14
|
let lastEditedFile: string | undefined
|
|
15
15
|
let activity: Activity = "idle"
|
|
16
16
|
let sessionCount = 0
|
|
17
|
-
let lastTool: string | undefined
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
async function log(level: string, message: string, extra?: Record<string, unknown>) {
|
|
19
|
+
try {
|
|
20
|
+
await sdk.app.log({
|
|
21
|
+
service: "opencode-discord",
|
|
22
|
+
level,
|
|
23
|
+
message,
|
|
24
|
+
extra,
|
|
25
|
+
})
|
|
26
|
+
} catch {}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
await log("info", "Plugin initializing", { clientId: CLIENT_ID, project: currentProject })
|
|
20
30
|
|
|
21
31
|
async function updatePresence() {
|
|
22
32
|
if (!connected) return
|
|
@@ -37,17 +47,13 @@ export const DiscordStatus: Plugin = async ({ project }) => {
|
|
|
37
47
|
details = "Waiting for response..."
|
|
38
48
|
break
|
|
39
49
|
case "editing":
|
|
40
|
-
details = lastEditedFile
|
|
41
|
-
? `Editing ${lastEditedFile}`
|
|
42
|
-
: `Editing files`
|
|
50
|
+
details = lastEditedFile ? `Editing ${lastEditedFile}` : "Editing files"
|
|
43
51
|
break
|
|
44
52
|
case "running":
|
|
45
53
|
details = "Running terminal commands"
|
|
46
54
|
break
|
|
47
55
|
case "reading":
|
|
48
|
-
details = lastEditedFile
|
|
49
|
-
? `Reading ${lastEditedFile}`
|
|
50
|
-
: "Reading files"
|
|
56
|
+
details = lastEditedFile ? `Reading ${lastEditedFile}` : "Reading files"
|
|
51
57
|
break
|
|
52
58
|
default:
|
|
53
59
|
details = "Session active"
|
|
@@ -59,7 +65,7 @@ export const DiscordStatus: Plugin = async ({ project }) => {
|
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
try {
|
|
62
|
-
await
|
|
68
|
+
await rpc.user?.setActivity({
|
|
63
69
|
details,
|
|
64
70
|
state,
|
|
65
71
|
startTimestamp,
|
|
@@ -67,39 +73,36 @@ export const DiscordStatus: Plugin = async ({ project }) => {
|
|
|
67
73
|
largeImageText: `OpenCode · ${sessionCount} session${sessionCount !== 1 ? "s" : ""}`,
|
|
68
74
|
smallImageKey,
|
|
69
75
|
smallImageText,
|
|
70
|
-
buttons: [
|
|
71
|
-
{ label: "OpenCode", url: "https://opencode.ai" },
|
|
72
|
-
],
|
|
73
76
|
})
|
|
74
|
-
|
|
77
|
+
await log("debug", "Presence updated", { details, state })
|
|
75
78
|
} catch (e) {
|
|
76
|
-
|
|
79
|
+
await log("error", "Failed to set presence", { error: String(e) })
|
|
77
80
|
}
|
|
78
81
|
}
|
|
79
82
|
|
|
80
|
-
|
|
83
|
+
rpc.on("ready", async () => {
|
|
81
84
|
connected = true
|
|
82
85
|
startTimestamp = Date.now()
|
|
83
|
-
|
|
84
|
-
updatePresence()
|
|
86
|
+
await log("info", "Discord RPC connected")
|
|
87
|
+
await updatePresence()
|
|
85
88
|
})
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
rpc.on("error", async (err: any) => {
|
|
91
|
+
await log("error", "Discord RPC error", { error: String(err) })
|
|
89
92
|
})
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
rpc.on("disconnected", async () => {
|
|
92
95
|
connected = false
|
|
93
|
-
|
|
96
|
+
await log("warn", "Discord RPC disconnected")
|
|
94
97
|
})
|
|
95
98
|
|
|
96
99
|
try {
|
|
97
|
-
|
|
98
|
-
await
|
|
99
|
-
|
|
100
|
+
await log("info", "Logging in to Discord RPC...")
|
|
101
|
+
await rpc.login()
|
|
102
|
+
await log("info", "Discord RPC login successful")
|
|
100
103
|
} catch (e) {
|
|
101
104
|
connected = false
|
|
102
|
-
|
|
105
|
+
await log("error", "Discord RPC login failed", { error: String(e) })
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
return {
|
|
@@ -136,8 +139,7 @@ export const DiscordStatus: Plugin = async ({ project }) => {
|
|
|
136
139
|
case "file.edited":
|
|
137
140
|
activity = "editing"
|
|
138
141
|
lastEditedFile =
|
|
139
|
-
(event as any).file?.split("/").pop() ??
|
|
140
|
-
(event as any).file
|
|
142
|
+
(event as any).file?.split("/").pop() ?? (event as any).file
|
|
141
143
|
break
|
|
142
144
|
}
|
|
143
145
|
|
|
@@ -145,8 +147,6 @@ export const DiscordStatus: Plugin = async ({ project }) => {
|
|
|
145
147
|
},
|
|
146
148
|
|
|
147
149
|
"tool.execute.before": async (input) => {
|
|
148
|
-
lastTool = input.tool
|
|
149
|
-
|
|
150
150
|
if (input.tool === "bash") {
|
|
151
151
|
activity = "running"
|
|
152
152
|
} else if (input.tool === "edit" || input.tool === "write") {
|