diff --git a/src/Pushover.ts b/src/Pushover.ts index d82267c..0532e2f 100644 --- a/src/Pushover.ts +++ b/src/Pushover.ts @@ -88,11 +88,12 @@ export type PushoverMessage = z.infer; interface PushoverResponse { status: number; + request: string; } export interface PushoverMessageResponse extends PushoverResponse { - request: string; errors?: string[]; + receipt?: string; } export interface PushoverValidationResponse extends PushoverResponse { @@ -100,6 +101,22 @@ export interface PushoverValidationResponse extends PushoverResponse { licenses?: string[]; } +export interface PushoverReceiptResponse extends PushoverResponse { + acknowledged: boolean; + acknowledged_at: number; + acknowledged_by: string; + acknowledged_by_device: string; + last_delivered_at: number; + expired: boolean; + expired_at: number; + called_back: boolean; + called_back_at: number; +} + +export interface PushoverTagCancellationResponse extends PushoverResponse { + canceled: number; +} + export interface SendOptions { recipients: PushoverUser[]; verbose?: boolean; @@ -129,10 +146,8 @@ export class Pushover { public async send( message: PushoverMessage, options: SendOptions, - ): Promise { + ): Promise { return new Promise((resolve, reject) => { - console.log(MessageSchema.parse(message)); - if (options.recipients.length === 0) { reject("No recipients specified."); } @@ -156,7 +171,7 @@ export class Pushover { private async sendToSingleRecipient( message: PushoverMessage, user: PushoverUser, - ): Promise { + ): Promise { const params = new URLSearchParams(); // Add token and user @@ -191,16 +206,17 @@ export class Pushover { params.append("timestamp", String(message.timestamp)); if (message.ttl) params.append("ttl", String(message.ttl)); - return this.makeRequest("messages.json", params); + return this.makeRequest("messages.json", "POST", params); } private makeRequest( url: string, + method: "POST" | "GET", params: URLSearchParams, ): Promise { return new Promise((resolve, reject) => { const options = { - method: "POST", + method: method, headers: { "Content-Type": "application/x-www-form-urlencoded", }, @@ -216,11 +232,7 @@ export class Pushover { res.on("end", () => { try { const response = JSON.parse(data) as PushoverResponse; - if (url === "messages.json") - resolve(response as PushoverMessageResponse); - else if (url == "users/validate.json") - resolve(response as PushoverValidationResponse); - else resolve(response); + resolve(response); } catch (error) { console.error(error); reject(new Error(`Failed to parse response: ${data}`)); @@ -249,6 +261,31 @@ export class Pushover { params.append("user", options.user ?? ""); if (options.deviceName) params.append("device", options.deviceName); - return this.makeRequest("users/validate.json", params); + return this.makeRequest("users/validate.json", "POST", params); + } + + checkReceipt(receipt: string): Promise { + const params = new URLSearchParams(); + return this.makeRequest( + `receipts/${receipt}.json?token=${this.token}`, + "GET", + params, + ) as Promise; + } + + cancelRetries(receipt: string): Promise { + const params = new URLSearchParams(); + params.append("token", this.token); + return this.makeRequest(`receipts/${receipt}/cancel.json`, "POST", params); + } + + cancelRetriesByTag(tag: string): Promise { + const params = new URLSearchParams(); + params.append("token", this.token); + return this.makeRequest( + `receipts/cancel_by_tag/${tag}.json`, + "POST", + params, + ) as Promise; } }