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.
- package/index.ts +54 -8
- 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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
rpc.on("ready", async () => {
|
|
43
65
|
connected = true
|
|
44
66
|
startTimestamp = Date.now()
|
|
45
|
-
|
|
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
|
-
|
|
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
|
}
|