diff --git a/src/Pushover.ts b/src/Pushover.ts index ace51c7..e2937c3 100644 --- a/src/Pushover.ts +++ b/src/Pushover.ts @@ -87,12 +87,20 @@ const MessageSchema = z export type PushoverMessage = z.infer; -export interface PushoverResponse { +interface PushoverResponse { status: number; +} + +export interface PushoverMessageResponse extends PushoverResponse { request: string; errors?: string[]; } +export interface PushoverValidationResponse extends PushoverResponse { + devices?: string[]; + licenses?: string[]; +} + export interface PushoverConfig { token: string; defaultUser?: string; @@ -104,10 +112,15 @@ export interface SendOptions { verbose?: boolean; } +export interface ValidateOptions { + user?: string; + deviceName?: string; +} + export class Pushover { private token: string; private defaultUser?: string; - private apiUrl = "https://api.pushover.net/1/messages.json"; + private apiUrl = "https://api.pushover.net/1/"; constructor(config: PushoverConfig) { this.token = config.token; @@ -210,10 +223,13 @@ export class Pushover { } } - return this.makeRequest(params); + return this.makeRequest("messages.json", params); } - private makeRequest(params: URLSearchParams): Promise { + private makeRequest( + url: string, + params: URLSearchParams, + ): Promise { return new Promise((resolve, reject) => { const options = { method: "POST", @@ -222,7 +238,7 @@ export class Pushover { }, }; - const req = https.request(this.apiUrl, options, (res) => { + const req = https.request(this.apiUrl + url, options, (res) => { let data = ""; res.on("data", (chunk) => { @@ -232,7 +248,11 @@ export class Pushover { res.on("end", () => { try { const response = JSON.parse(data) as PushoverResponse; - resolve(response); + if (url === "messages.json") + resolve(response as PushoverMessageResponse); + else if (url == "users/validate.json") + resolve(response as PushoverValidationResponse); + else resolve(response); } catch (error) { console.error(error); reject(new Error(`Failed to parse response: ${data}`)); @@ -248,4 +268,19 @@ export class Pushover { req.end(); }); } + + /** + * Validate a user and device. + * + * If only user is provided, it will validate the user and return. + */ + validate(options: ValidateOptions): Promise { + const params = new URLSearchParams(); + + params.append("token", this.token); + params.append("user", options.user ?? this.defaultUser ?? ""); + if (options.deviceName) params.append("device", options.deviceName); + + return this.makeRequest("users/validate.json", params); + } }