opencode-discord-presence 0.2.5 → 0.2.7
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/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -3
- package/dist/config.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +31 -3
- package/dist/plugin.js.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/particle.d.ts +16 -0
- package/dist/utils/particle.d.ts.map +1 -0
- package/dist/utils/particle.js +42 -0
- package/dist/utils/particle.js.map +1 -0
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PresenceConfig } from "./types/index.js";
|
|
1
|
+
import type { DiscordPresenceOptions, PresenceConfig } from "./types/index.js";
|
|
2
2
|
export declare const DEFAULT_CLIENT_ID = "1466770544748662819";
|
|
3
|
-
export declare function getConfig(): PresenceConfig;
|
|
3
|
+
export declare function getConfig(options?: DiscordPresenceOptions): PresenceConfig;
|
|
4
4
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAY,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAExF,eAAO,MAAM,iBAAiB,wBAAwB,CAAA;AAQtD,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,cAAc,CAU1E"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
export const DEFAULT_CLIENT_ID = "1466770544748662819";
|
|
2
|
-
|
|
2
|
+
function parseLanguage(lang) {
|
|
3
|
+
const normalized = lang?.toLowerCase();
|
|
4
|
+
if (normalized === "ko" || normalized === "kr" || normalized === "korean")
|
|
5
|
+
return "ko";
|
|
6
|
+
return "en";
|
|
7
|
+
}
|
|
8
|
+
export function getConfig(options) {
|
|
9
|
+
const envEnabled = process.env.OPENCODE_DISCORD_ENABLED;
|
|
10
|
+
const envClientId = process.env.OPENCODE_DISCORD_CLIENT_ID;
|
|
11
|
+
const envLanguage = process.env.OPENCODE_DISCORD_LANGUAGE;
|
|
3
12
|
return {
|
|
4
|
-
enabled:
|
|
5
|
-
clientId:
|
|
13
|
+
enabled: options?.enabled ?? envEnabled !== "false",
|
|
14
|
+
clientId: options?.applicationId ?? envClientId ?? DEFAULT_CLIENT_ID,
|
|
15
|
+
language: parseLanguage(options?.language ?? envLanguage),
|
|
6
16
|
};
|
|
7
17
|
}
|
|
8
18
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAEtD,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAEtD,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,UAAU,GAAG,IAAI,EAAE,WAAW,EAAE,CAAA;IACtC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACtF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAA;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAA;IAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAA;IAEzD,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,UAAU,KAAK,OAAO;QACnD,QAAQ,EAAE,OAAO,EAAE,aAAa,IAAI,WAAW,IAAI,iBAAiB;QACpE,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,IAAI,WAAW,CAAC;KAC1D,CAAA;AACH,CAAC"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAqCjD,eAAO,MAAM,uBAAuB,EAAE,MAmCrC,CAAA"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,17 +1,46 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
import { getConfig } from "./config.js";
|
|
2
4
|
import { DiscordRPCService } from "./services/discord-rpc.js";
|
|
5
|
+
import { getObjectParticle, getTopicParticle } from "./utils/particle.js";
|
|
3
6
|
let rpc = null;
|
|
4
7
|
let currentAgent = "OpenCode";
|
|
5
8
|
let currentModel = "";
|
|
9
|
+
function getPresenceDetails(agent, idle, language) {
|
|
10
|
+
if (language === "ko") {
|
|
11
|
+
if (idle) {
|
|
12
|
+
return `${agent}${getTopicParticle(agent)} 휴식중`;
|
|
13
|
+
}
|
|
14
|
+
return `${agent}${getObjectParticle(agent)} 갈구는중`;
|
|
15
|
+
}
|
|
16
|
+
return idle ? `${agent} is idle` : `Working with ${agent}`;
|
|
17
|
+
}
|
|
18
|
+
async function loadConfigFile(directory) {
|
|
19
|
+
const paths = [
|
|
20
|
+
join(directory, ".discord-presence.json"),
|
|
21
|
+
join(homedir(), ".discord-presence.json"),
|
|
22
|
+
];
|
|
23
|
+
for (const configPath of paths) {
|
|
24
|
+
const file = Bun.file(configPath);
|
|
25
|
+
if (await file.exists()) {
|
|
26
|
+
try {
|
|
27
|
+
return (await file.json());
|
|
28
|
+
}
|
|
29
|
+
catch { }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
6
34
|
export const OpenCodeDiscordPresence = async (ctx) => {
|
|
7
|
-
const
|
|
35
|
+
const fileOptions = await loadConfigFile(ctx.directory);
|
|
36
|
+
const config = getConfig(fileOptions);
|
|
8
37
|
if (!config.enabled)
|
|
9
38
|
return {};
|
|
10
39
|
rpc = new DiscordRPCService(config.clientId);
|
|
11
40
|
const updatePresence = async (idle = false) => {
|
|
12
41
|
if (!rpc)
|
|
13
42
|
return;
|
|
14
|
-
const details =
|
|
43
|
+
const details = getPresenceDetails(currentAgent, idle, config.language);
|
|
15
44
|
const state = currentModel || undefined;
|
|
16
45
|
await rpc.setPresence(details, state);
|
|
17
46
|
};
|
|
@@ -21,7 +50,6 @@ export const OpenCodeDiscordPresence = async (ctx) => {
|
|
|
21
50
|
}
|
|
22
51
|
return {
|
|
23
52
|
"chat.message": async (input) => {
|
|
24
|
-
console.log("[discord-presence] DEBUG input:", JSON.stringify(input, null, 2));
|
|
25
53
|
if (input.agent)
|
|
26
54
|
currentAgent = input.agent;
|
|
27
55
|
if (input.model?.modelID)
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { SetActivity } from "@xhayper/discord-rpc";
|
|
2
|
+
export type Language = "en" | "ko";
|
|
2
3
|
export interface PresenceConfig {
|
|
3
4
|
enabled: boolean;
|
|
4
5
|
clientId: string;
|
|
6
|
+
language: Language;
|
|
7
|
+
}
|
|
8
|
+
export interface DiscordPresenceOptions {
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
applicationId?: string;
|
|
11
|
+
language?: string;
|
|
5
12
|
}
|
|
6
13
|
export interface PresenceState {
|
|
7
14
|
agent: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAA;AAElC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;CACd;AAED,YAAY,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Korean particle utilities
|
|
3
|
+
* Handles proper particle selection based on whether the preceding character
|
|
4
|
+
* ends with a consonant (받침) or not.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get the appropriate particle for 을/를 (object marker)
|
|
8
|
+
* 을 after consonant, 를 after vowel
|
|
9
|
+
*/
|
|
10
|
+
export declare function getObjectParticle(word: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get the appropriate particle for 은/는 (topic marker)
|
|
13
|
+
* 은 after consonant, 는 after vowel
|
|
14
|
+
*/
|
|
15
|
+
export declare function getTopicParticle(word: string): string;
|
|
16
|
+
//# sourceMappingURL=particle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particle.d.ts","sourceRoot":"","sources":["../../src/utils/particle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Korean particle utilities
|
|
3
|
+
* Handles proper particle selection based on whether the preceding character
|
|
4
|
+
* ends with a consonant (받침) or not.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if a character has a final consonant (받침)
|
|
8
|
+
*/
|
|
9
|
+
function hasFinalConsonant(char) {
|
|
10
|
+
const code = char.charCodeAt(0);
|
|
11
|
+
// Korean syllable block range: 0xAC00 ~ 0xD7A3
|
|
12
|
+
if (code < 0xac00 || code > 0xd7a3) {
|
|
13
|
+
// Non-Korean character: treat numbers/letters as having no final consonant
|
|
14
|
+
// except for certain consonant-ending letters
|
|
15
|
+
const consonantEndingChars = /[lmnr136780]$/i;
|
|
16
|
+
return consonantEndingChars.test(char);
|
|
17
|
+
}
|
|
18
|
+
// Korean syllable: check if it has a final consonant
|
|
19
|
+
// (code - 0xAC00) % 28 === 0 means no final consonant
|
|
20
|
+
return (code - 0xac00) % 28 !== 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the appropriate particle for 을/를 (object marker)
|
|
24
|
+
* 을 after consonant, 를 after vowel
|
|
25
|
+
*/
|
|
26
|
+
export function getObjectParticle(word) {
|
|
27
|
+
if (!word || word.length === 0)
|
|
28
|
+
return "를";
|
|
29
|
+
const lastChar = word[word.length - 1];
|
|
30
|
+
return hasFinalConsonant(lastChar) ? "을" : "를";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the appropriate particle for 은/는 (topic marker)
|
|
34
|
+
* 은 after consonant, 는 after vowel
|
|
35
|
+
*/
|
|
36
|
+
export function getTopicParticle(word) {
|
|
37
|
+
if (!word || word.length === 0)
|
|
38
|
+
return "는";
|
|
39
|
+
const lastChar = word[word.length - 1];
|
|
40
|
+
return hasFinalConsonant(lastChar) ? "은" : "는";
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=particle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particle.js","sourceRoot":"","sources":["../../src/utils/particle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/B,+CAA+C;IAC/C,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;QACnC,2EAA2E;QAC3E,8CAA8C;QAC9C,MAAM,oBAAoB,GAAG,gBAAgB,CAAA;QAC7C,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;IACD,qDAAqD;IACrD,sDAAsD;IACtD,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;AAChD,CAAC"}
|
package/package.json
CHANGED