Files
NTSH-Control/src/Twilio.ts
2025-10-24 16:21:04 +02:00

72 lines
1.7 KiB
TypeScript

import { Main } from './Main';
const PREFIX = '[Twilio]';
export class TwilioHandler {
private _Main: Main;
client;
constructor(Main: Main) {
this._Main = Main;
}
load() {
this.client = require('twilio')(
this._Main.Config.twilio.accountSid,
this._Main.Config.twilio.authToken
);
}
async resetError(category: TwilioCategories) {
if (!this.lastErrors.has(category)) return;
this.lastErrors.delete(category);
}
private lastErrors: Map<TwilioCategories, string> = new Map();
private errorLog: string[] = [];
private errorTimeout: NodeJS.Timeout;
async sendError(category: TwilioCategories, error: string) {
if (this.lastErrors.get(category) === error) return;
this.lastErrors.set(category, error);
if (error == null) return;
this.errorLog.push(`${category}: ${error}`);
clearTimeout(this.errorTimeout);
this.errorTimeout = setTimeout(async () => {
const errorMessage = this.errorLog
.map((error) => `- ${error}`)
.join('\n');
this.errorLog = [];
console.log(PREFIX, `Sending to Twilio:\n`, errorMessage);
const promises = this._Main.Config.twilio.toNumbers.map(
(toNumber) => this.sendMessage(toNumber, errorMessage)
);
await Promise.all(promises);
}, 15000);
}
sendMessage(to: string, message: string) {
return new Promise<boolean>((resolve) => {
this.client.messages
.create({
body: message,
from: `${this._Main.Config.twilio.fromNumber}`,
to: to,
})
.then((message: any) => {
console.log(`Twilio message sent with SID: ${message.sid}`);
resolve(true);
})
.catch((error: any) => {
console.error('Error sending Twilio message:', error);
resolve(false);
});
});
}
}
type TwilioCategories = 'CameraRunner' | 'UnityRunner' | 'UnityWebSocket';