Skip to content

Commit e284d74

Browse files
committed
preliminary event tracking to address issue LordGrimmauld#1
- Added field "eventType" to watcher payload - Added tracking of zero-duration delete file event [ID `foss.grimmauld.aw.watcher.obsidian.deleteFileEvent`] - Added tracking of zero-duration create file event [ID `foss.grimmauld.aw.watcher.obsidian.createFileEvent`] - Added tracking of zero-duration rename file event [ID `foss.grimmauld.aw.watcher.obsidian.renameFileEvent`] Heartbeats now have the id `foss.grimmauld.aw.watcher.obsidian.activeFileHeartbeatEvent` This *should* be non-breaking changes.
1 parent f1ce595 commit e284d74

File tree

2 files changed

+59
-19
lines changed

2 files changed

+59
-19
lines changed
File renamed without changes.

main.ts

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import {
2+
apiVersion,
23
App,
4+
FileSystemAdapter,
35
Plugin,
46
PluginSettingTab,
57
request,
68
RequestUrlParam,
7-
Setting,
8-
apiVersion,
9-
FileSystemAdapter
9+
Setting, TAbstractFile
1010
} from 'obsidian';
1111
import * as os from "os";
1212

13+
type Nullable<T> = T | null;
1314

1415
class AWrequest implements RequestUrlParam {
1516
body: string | ArrayBuffer;
@@ -33,7 +34,6 @@ const DEFAULT_SETTINGS: ActivityWatcherSettings = {
3334
devServer: false
3435
}
3536

36-
3737
export default class ActivityWatchPlugin extends Plugin {
3838
settings: ActivityWatcherSettings;
3939
hostname: string = os.hostname()
@@ -57,15 +57,15 @@ export default class ActivityWatchPlugin extends Plugin {
5757
console.log(`endpoint_url is ${this.endpoint_url}`)
5858
}
5959

60-
await this.create_bucket(this.bucket_id, "app.editor.activity")
60+
await this.createBucket(this.bucket_id, "app.editor.activity")
6161
this.statusBarItemEl.setText('ActivityWatch active');
6262
}
6363

6464
async post(endpoint: string, data: object) {
6565
await request(new AWrequest(this.endpoint_url + endpoint, JSON.stringify(data)))
6666
}
6767

68-
async create_bucket(id: string, event_type: string) {
68+
async createBucket(id: string, event_type: string) {
6969
const data = {
7070
"client": this.watcher_name,
7171
"hostname": this.hostname,
@@ -74,32 +74,72 @@ export default class ActivityWatchPlugin extends Plugin {
7474
await this.post(`buckets/${id}`, data)
7575
}
7676

77-
async send_heartbeat_data(id: string, heartbeat_data: object, pulsetime: number) {
77+
async sendHeartbeatData(id: string, heartbeat_data: object, pulsetime: number) {
7878
const endpoint = `buckets/${id}/heartbeat?pulsetime=${pulsetime}`
7979
const t = new Date().toISOString().slice(0, -1)
8080
await this.post(endpoint, {"timestamp": t, "duration": 0, "data": heartbeat_data})
8181
}
8282

83+
async sendAbstractFileEvent(file: Nullable<TAbstractFile>, extraData: Nullable<object>, pulseTime: number) {
84+
if (file) {
85+
await this.sendHeartbeatData(this.bucket_id, {
86+
"file": "/" + file.path,
87+
"project": file.vault.getName(),
88+
"language": "Markdown", // todo: map file extension to language
89+
"projectPath": file.vault.adapter instanceof FileSystemAdapter ? file.vault.adapter.getBasePath() : "unknown vault path",
90+
"editor": "Obsidian",
91+
"editorVersion": apiVersion,
92+
...(extraData ? extraData : {})
93+
}, pulseTime)
94+
}
95+
}
96+
97+
async sendFileHeartbeatEvent(file: Nullable<TAbstractFile>) {
98+
await this.sendAbstractFileEvent(file, {
99+
"eventType": "foss.grimmauld.aw.watcher.obsidian.activeFileHeartbeatEvent"
100+
}, this.sleeptime + 1)
101+
}
102+
103+
async sendFileRenameEvent(file: Nullable<TAbstractFile>, oldPath: string) {
104+
await this.sendAbstractFileEvent(file, {
105+
"eventType": "foss.grimmauld.aw.watcher.obsidian.renameFileEvent",
106+
"oldPath": oldPath
107+
}, 0);
108+
}
109+
110+
async sendFileDeleteEvent(oldPath: Nullable<TAbstractFile>) {
111+
await this.sendAbstractFileEvent(oldPath, {
112+
"eventType": "foss.grimmauld.aw.watcher.obsidian.deleteFileEvent",
113+
}, 0);
114+
}
115+
116+
async sendFileCreateEvent(oldPath: Nullable<TAbstractFile>) {
117+
await this.sendAbstractFileEvent(oldPath, {
118+
"eventType": "foss.grimmauld.aw.watcher.obsidian.createFileEvent",
119+
}, 0);
120+
}
121+
83122
async onload() {
84123
this.statusBarItemEl = this.addStatusBarItem();
85124
await this.loadSettings();
86125
await this.init()
87126

127+
this.registerEvent(app.vault.on('rename', (file, oldPath) =>
128+
this.sendFileRenameEvent(file, oldPath)
129+
));
130+
131+
this.registerEvent(app.vault.on('delete', oldFile =>
132+
this.sendFileDeleteEvent(oldFile)
133+
));
134+
135+
this.registerEvent(app.vault.on('create', oldFile =>
136+
this.sendFileCreateEvent(oldFile)
137+
));
138+
88139
this.addSettingTab(new ObsidianWatcherSettingTab(this.app, this));
89140

90141
this.registerInterval(window.setInterval(() => {
91-
const file = this.app.workspace.getActiveFile();
92-
const adapter = this.app.vault.adapter;
93-
if (file) {
94-
this.send_heartbeat_data(this.bucket_id, {
95-
"file": "/" + file.path,
96-
"project": file.vault.getName(),
97-
"language": "Markdown", // todo: map file extension to language
98-
"projectPath": adapter instanceof FileSystemAdapter ? adapter.getBasePath() : "unknown vault path",
99-
"editor": "Obsidian",
100-
"editorVersion": apiVersion
101-
}, this.sleeptime + 1)
102-
}
142+
this.sendFileHeartbeatEvent(this.app.workspace.getActiveFile());
103143
}, this.sleeptime * 1000));
104144
}
105145

0 commit comments

Comments
 (0)