diff --git a/package.json b/package.json index 89f861e4..edc5bc2b 100644 --- a/package.json +++ b/package.json @@ -175,6 +175,11 @@ "default": true, "description": "Should elapsed time be shown?" }, + "vscord.status.RestoreElapsedTime": { + "type": "boolean", + "default": true, + "description": "Should elapsed time be saved and restored on different sessions?" + }, "vscord.status.resetElapsedTimePerFile": { "type": "boolean", "default": false, diff --git a/src/activity.ts b/src/activity.ts index 69972e53..57189e50 100644 --- a/src/activity.ts +++ b/src/activity.ts @@ -20,6 +20,8 @@ import { type TextDocument } from "vscode"; +import { sessionStart, previousTotal } from "./extension" + export enum CURRENT_STATUS { IDLE = "idle", NOT_IN_FILE = "notInFile", @@ -98,11 +100,23 @@ export const activity = async ( if (isIdling && !config.get(CONFIG_KEYS.Status.Idle.Enabled)) return {}; - if (config.get(CONFIG_KEYS.Status.ShowElapsedTime)) { - presence.startTimestamp = config.get(CONFIG_KEYS.Status.ResetElapsedTimePerFile) - ? Date.now() - : (previous.startTimestamp ?? Date.now()); - } else { + if( config.get( CONFIG_KEYS.Status.ShowElapsedTime ) ) + { + if( config.get( CONFIG_KEYS.Status.RestoreElapsedTime ) ) + { + presence.startTimestamp = sessionStart - previousTotal; + } + else if( config.get( CONFIG_KEYS.Status.ResetElapsedTimePerFile ) || !previous.startTimestamp ) + { + presence.startTimestamp = Date.now(); + } + else + { + presence.startTimestamp = previous.startTimestamp; + } + } + else + { delete presence.startTimestamp; } diff --git a/src/config.ts b/src/config.ts index 77747d45..cb7d636b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -97,6 +97,7 @@ export interface ExtensionConfigurationType { "status.idle.resetElapsedTime": boolean; "status.idle.timeout": number; "status.showElapsedTime": boolean; + "status.RestoreElapsedTime": boolean; "status.resetElapsedTimePerFile": boolean; "ignore.workspaces": Array; "ignore.workspacesText": string | Record; @@ -267,19 +268,19 @@ export type WorkspaceConfigurationWithType)>( section: S, diff --git a/src/constants.ts b/src/constants.ts index 01c91904..145b2ba2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -181,6 +181,7 @@ export const CONFIG_KEYS = { Timeout: "status.idle.timeout" as const } as const, ShowElapsedTime: "status.showElapsedTime" as const, + RestoreElapsedTime: "status.RestoreElapsedTime" as const, ResetElapsedTimePerFile: "status.resetElapsedTimePerFile" as const } as const, Ignore: { diff --git a/src/extension.ts b/src/extension.ts index 184bfbe8..eba2c64d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,6 +9,11 @@ import { logInfo } from "./logger"; import { dataClass } from "./data"; import { StatusBarMode, editor } from "./editor"; +import { loadTotalTime, saveTotalTime } from './session'; + +export let sessionStart = Math.floor( Date.now() / 1000 ); +export let previousTotal = loadTotalTime(); + const controller = new RPCController( getApplicationId(getConfig()).clientId, getConfig().get(CONFIG_KEYS.Behaviour.Debug) @@ -192,6 +197,9 @@ export async function activate(ctx: ExtensionContext) { export async function deactivate() { logInfo("Discord Rich Presence for VS Code deactivated."); + const now = Math.floor( Date.now() / 1000 ); + const elapsed = now - sessionStart; + saveTotalTime( previousTotal + elapsed ); await controller.destroy(); logInfo("[004] Destroyed Discord RPC client"); } diff --git a/src/session.ts b/src/session.ts new file mode 100644 index 00000000..0eaa5356 --- /dev/null +++ b/src/session.ts @@ -0,0 +1,26 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; + +const FILE = path.join( os.homedir(), '.vscord-session.json' ); + +export function loadTotalTime(): number +{ + if( !fs.existsSync( FILE ) ) + return 0; + + try + { + const { totalTime } = JSON.parse( fs.readFileSync( FILE, 'utf8' ) ); + return typeof totalTime === 'number' ? totalTime : 0; + } + catch + { + return 0; + } +} + +export function saveTotalTime( totalSeconds: number ) +{ + fs.writeFileSync( FILE, JSON.stringify( { totalTime: totalSeconds } ), 'utf8' ); +}