mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-04-01 06:12:07 -07:00
refactor: split main.ts into domain runtimes
This commit is contained in:
90
src/main/discord-presence-lifecycle-runtime.ts
Normal file
90
src/main/discord-presence-lifecycle-runtime.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { createDiscordPresenceRuntime } from './runtime/discord-presence-runtime';
|
||||
|
||||
type DiscordPresenceConfigLike = {
|
||||
enabled?: boolean;
|
||||
};
|
||||
|
||||
type DiscordPresenceServiceLike = {
|
||||
start: () => Promise<void>;
|
||||
stop?: () => Promise<void>;
|
||||
publish: (snapshot: {
|
||||
mediaTitle: string | null;
|
||||
mediaPath: string | null;
|
||||
subtitleText: string;
|
||||
currentTimeSec: number | null;
|
||||
mediaDurationSec: number | null;
|
||||
paused: boolean | null;
|
||||
connected: boolean;
|
||||
sessionStartedAtMs: number;
|
||||
}) => void;
|
||||
};
|
||||
|
||||
export interface DiscordPresenceLifecycleRuntimeInput {
|
||||
getResolvedConfig: () => { discordPresence: DiscordPresenceConfigLike };
|
||||
getDiscordPresenceService: () => DiscordPresenceServiceLike | null;
|
||||
setDiscordPresenceService: (service: DiscordPresenceServiceLike | null) => void;
|
||||
getMpvClient: () => {
|
||||
connected?: boolean;
|
||||
currentTimePos?: number | null;
|
||||
requestProperty: (name: string) => Promise<unknown>;
|
||||
} | null;
|
||||
getCurrentMediaTitle: () => string | null;
|
||||
getCurrentMediaPath: () => string | null;
|
||||
getCurrentSubtitleText: () => string;
|
||||
getPlaybackPaused: () => boolean | null;
|
||||
getFallbackMediaDurationSec: () => number | null;
|
||||
createDiscordPresenceService: (config: unknown) => DiscordPresenceServiceLike;
|
||||
createDiscordRuntime?: typeof createDiscordPresenceRuntime;
|
||||
now?: () => number;
|
||||
}
|
||||
|
||||
export interface DiscordPresenceLifecycleRuntime {
|
||||
publishDiscordPresence: () => void;
|
||||
initializeDiscordPresenceService: () => Promise<void>;
|
||||
stopDiscordPresenceService: () => Promise<void>;
|
||||
}
|
||||
|
||||
export function createDiscordPresenceLifecycleRuntime(
|
||||
input: DiscordPresenceLifecycleRuntimeInput,
|
||||
): DiscordPresenceLifecycleRuntime {
|
||||
let discordPresenceMediaDurationSec: number | null = null;
|
||||
const discordPresenceSessionStartedAtMs = input.now ? input.now() : Date.now();
|
||||
|
||||
const discordPresenceRuntime = (input.createDiscordRuntime ?? createDiscordPresenceRuntime)({
|
||||
getDiscordPresenceService: () => input.getDiscordPresenceService(),
|
||||
isDiscordPresenceEnabled: () => input.getResolvedConfig().discordPresence.enabled === true,
|
||||
getMpvClient: () => input.getMpvClient(),
|
||||
getCurrentMediaTitle: () => input.getCurrentMediaTitle(),
|
||||
getCurrentMediaPath: () => input.getCurrentMediaPath(),
|
||||
getCurrentSubtitleText: () => input.getCurrentSubtitleText(),
|
||||
getPlaybackPaused: () => input.getPlaybackPaused(),
|
||||
getFallbackMediaDurationSec: () => input.getFallbackMediaDurationSec(),
|
||||
getSessionStartedAtMs: () => discordPresenceSessionStartedAtMs,
|
||||
getMediaDurationSec: () => discordPresenceMediaDurationSec,
|
||||
setMediaDurationSec: (next) => {
|
||||
discordPresenceMediaDurationSec = next;
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
publishDiscordPresence: () => {
|
||||
discordPresenceRuntime.publishDiscordPresence();
|
||||
},
|
||||
initializeDiscordPresenceService: async () => {
|
||||
if (input.getResolvedConfig().discordPresence.enabled !== true) {
|
||||
input.setDiscordPresenceService(null);
|
||||
return;
|
||||
}
|
||||
|
||||
input.setDiscordPresenceService(
|
||||
input.createDiscordPresenceService(input.getResolvedConfig().discordPresence),
|
||||
);
|
||||
await input.getDiscordPresenceService()?.start();
|
||||
discordPresenceRuntime.publishDiscordPresence();
|
||||
},
|
||||
stopDiscordPresenceService: async () => {
|
||||
await input.getDiscordPresenceService()?.stop?.();
|
||||
input.setDiscordPresenceService(null);
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user