forked from AndreBaltazar8/obsidian-canvas-conversation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.ts
136 lines (122 loc) · 3.12 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import { Plugin, MenuItem } from "obsidian";
import { ChatGPTAPI } from "./src/chatgpt-api";
import {
CanvasConversationPluginSettings,
CanvasConversationSettingTab,
DEFAULT_SETTINGS,
} from "./src/settings";
import {
performCanvasMonkeyPatch,
removeCanvasMonkeyPatch,
} from "src/canvas-patch";
import { onPromptChatGPT } from "src/actions/propmt-chatgpt";
import {
cleanUpChatGPTMetadata,
nodeHasMetadata,
} from "src/actions/clean-metadata";
export let api: ChatGPTAPI;
export default class CanvasConversationPlugin extends Plugin {
settings: CanvasConversationPluginSettings;
initGPT() {
if (
!this.settings.clearanceToken ||
!this.settings.sessionToken ||
!this.settings.userAgent
) {
return;
}
api = new ChatGPTAPI({
userAgent: this.settings.userAgent,
clearanceToken: this.settings.clearanceToken,
sessionToken: this.settings.sessionToken,
});
}
async onload() {
await this.loadSettings();
this.initGPT();
this.addSettingTab(new CanvasConversationSettingTab(this.app, this));
this.registerEvent(
this.app.workspace.on(
"canvas-conversation:canvas-menu",
(node, menu) => {
menu.addSeparator();
menu.addItem((item: MenuItem) => {
item.setTitle("Prompt ChatGPT")
.setIcon("star")
.onClick(() => onPromptChatGPT(node));
});
if (nodeHasMetadata(node)) {
menu.addItem((item: MenuItem) => {
item.setTitle("Clean up ChatGPT metadata")
.setIcon("trash")
.onClick(() => cleanUpChatGPTMetadata(node));
});
}
}
)
);
this.registerEvent(
this.app.workspace.on(
"canvas-conversation:canvas-selection-menu",
(canvas, menu, nodes) => {
if (nodes.some((node) => nodeHasMetadata(node))) {
menu.addSeparator();
menu.addItem((item: MenuItem) => {
item.setTitle("Clean up ChatGPT metadata")
.setIcon("trash")
.onClick(() => {
nodes.forEach((node) => {
cleanUpChatGPTMetadata(node);
});
});
});
}
}
)
);
performCanvasMonkeyPatch(this);
}
onunload() {
removeCanvasMonkeyPatch();
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
this.initGPT();
}
}
declare module "obsidian" {
interface Workspace {
/**
* Fires when a canvas node is right-clicked.
*
* This is a custom event because the official API does not support it.
*
* @param node The node that was right-clicked.
* @param menu The menu that will be shown.
*/
on(
event: "canvas-conversation:canvas-menu",
callback: (node: any, menu: Menu) => void
): EventRef;
/**
* Fires when a selection of canvas nodes is right-clicked.
*
* This is a custom event because the official API does not support it.
*
* @param canvas The canvas that the nodes are on.
* @param menu The menu that will be shown.
* @param nodes The nodes that were selected.
*/
on(
event: "canvas-conversation:canvas-selection-menu",
callback: (canvas: any, menu: Menu, nodes: any[]) => void
): EventRef;
}
}