From 33c3080867d8d65bf7977555d2c292019b53316b Mon Sep 17 00:00:00 2001 From: Mees van der Wijk Date: Fri, 24 Oct 2025 17:12:46 +0200 Subject: [PATCH] Implemented max twilio messages per day and fixed slider decimal places. --- dist/Configuration/DefaultConfiguration.js | 1 + .../Configuration/DefaultConfiguration.js.map | 2 +- dist/Twilio.js | 62 ++++++++++++++++++- dist/Twilio.js.map | 2 +- src/Configuration/ConfigurationManager.ts | 1 + src/Configuration/DefaultConfiguration.ts | 1 + src/Twilio.ts | 40 +++++++++++- 7 files changed, 102 insertions(+), 7 deletions(-) diff --git a/dist/Configuration/DefaultConfiguration.js b/dist/Configuration/DefaultConfiguration.js index cc2741a..05e1118 100644 --- a/dist/Configuration/DefaultConfiguration.js +++ b/dist/Configuration/DefaultConfiguration.js @@ -31,6 +31,7 @@ exports.DefaultConfiguration = { fromNumber: '', toNumbers: [], aggregateTimeout: 15000, + maxMessagesPerDay: 10, }, support: { telephone: '+31613392837', diff --git a/dist/Configuration/DefaultConfiguration.js.map b/dist/Configuration/DefaultConfiguration.js.map index d8a51c5..ec9f51f 100644 --- a/dist/Configuration/DefaultConfiguration.js.map +++ b/dist/Configuration/DefaultConfiguration.js.map @@ -1 +1 @@ -{"version":3,"file":"DefaultConfiguration.js","sourceRoot":"","sources":["../../src/Configuration/DefaultConfiguration.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAW;IAC3C,SAAS,EAAE;QACV,IAAI,EAAE,IAAI;KACV;IACD,KAAK,EAAE;QACN,UAAU,EAAE;YACX,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;SAClB;QAED,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;KAC9B;IACD,YAAY,EAAE;QACb,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,YAAY,EAAE,IAAI;KAClB;IACD,MAAM,EAAE;QACP,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,KAAK;KACvB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,cAAc;KACzB;CACD,CAAC"} \ No newline at end of file +{"version":3,"file":"DefaultConfiguration.js","sourceRoot":"","sources":["../../src/Configuration/DefaultConfiguration.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAW;IAC3C,SAAS,EAAE;QACV,IAAI,EAAE,IAAI;KACV;IACD,KAAK,EAAE;QACN,UAAU,EAAE;YACX,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;SAClB;QAED,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,iBAAiB,EAAE,IAAI;QACvB,wBAAwB,EAAE,IAAI;KAC9B;IACD,YAAY,EAAE;QACb,SAAS,EAAE;YACV,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,IAAI;SACV;QAED,YAAY,EAAE,IAAI;KAClB;IACD,MAAM,EAAE;QACP,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,EAAE;KACrB;IACD,OAAO,EAAE;QACR,SAAS,EAAE,cAAc;KACzB;CACD,CAAC"} \ No newline at end of file diff --git a/dist/Twilio.js b/dist/Twilio.js index ffbdb01..ec13c70 100644 --- a/dist/Twilio.js +++ b/dist/Twilio.js @@ -37,15 +37,65 @@ var __generator = (this && this.__generator) || function (thisArg, body) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TwilioHandler = void 0; +var path_1 = require("path"); +var fs_extra_1 = require("fs-extra"); var PREFIX = '[Twilio]'; var TwilioHandler = /** @class */ (function () { function TwilioHandler(Main) { + this.counter = { + date: new Date().toLocaleDateString('nl-NL'), + count: 0, + }; this.lastErrors = new Map(); this.errorLog = []; this._Main = Main; } + TwilioHandler.prototype.canSendMessage = function () { + var maxMessages = this._Main.Config.twilio.maxMessagesPerDay; + return this.counter.count < maxMessages; + }; + TwilioHandler.prototype.incrementCounter = function () { + return __awaiter(this, void 0, void 0, function () { + var today; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + today = new Date().toLocaleDateString('nl-NL'); + if (this.counter.date !== today) { + this.counter.date = today; + this.counter.count = 0; + } + this.counter.count++; + return [4 /*yield*/, (0, fs_extra_1.writeJSON)((0, path_1.join)(this._Main.dataPath, 'twilio.json'), this.counter)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; TwilioHandler.prototype.load = function () { - this.client = require('twilio')(this._Main.Config.twilio.accountSid, this._Main.Config.twilio.authToken); + return __awaiter(this, void 0, void 0, function () { + var twilioConfigPath, twilioConfigExists, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + twilioConfigPath = (0, path_1.join)(this._Main.dataPath, 'twilio.json'); + return [4 /*yield*/, (0, fs_extra_1.pathExists)(twilioConfigPath)]; + case 1: + twilioConfigExists = _b.sent(); + if (!twilioConfigExists) return [3 /*break*/, 3]; + _a = this; + return [4 /*yield*/, (0, fs_extra_1.readJSON)(twilioConfigPath)]; + case 2: + _a.counter = _b.sent(); + _b.label = 3; + case 3: + this.client = require('twilio')(this._Main.Config.twilio.accountSid, this._Main.Config.twilio.authToken); + return [2 /*return*/]; + } + }); + }); }; TwilioHandler.prototype.resetError = function (category) { return __awaiter(this, void 0, void 0, function () { @@ -78,21 +128,27 @@ var TwilioHandler = /** @class */ (function () { .map(function (error) { return "- ".concat(error); }) .join('\n'); this.errorLog = []; + if (!this.canSendMessage()) + return [2 /*return*/, console.log(PREFIX, 'Max messages per day reached')]; + return [4 /*yield*/, this.incrementCounter()]; + case 1: + _a.sent(); console.log(PREFIX, "Sending to Twilio:\n", errorMessage); promises = this._Main.Config.twilio.toNumbers.map(function (toNumber) { return _this.sendMessage(toNumber, errorMessage); }); return [4 /*yield*/, Promise.all(promises)]; - case 1: + case 2: _a.sent(); return [2 /*return*/]; } }); - }); }, 15000); + }); }, this._Main.Config.twilio.aggregateTimeout); return [2 /*return*/]; }); }); }; TwilioHandler.prototype.sendMessage = function (to, message) { var _this = this; + return; return new Promise(function (resolve) { _this.client.messages .create({ diff --git a/dist/Twilio.js.map b/dist/Twilio.js.map index 0f774eb..6e6b024 100644 --- a/dist/Twilio.js.map +++ b/dist/Twilio.js.map @@ -1 +1 @@ -{"version":3,"file":"Twilio.js","sourceRoot":"","sources":["../src/Twilio.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Twilio.js","sourceRoot":"","sources":["../src/Twilio.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/Configuration/ConfigurationManager.ts b/src/Configuration/ConfigurationManager.ts index 502d658..af39ba5 100644 --- a/src/Configuration/ConfigurationManager.ts +++ b/src/Configuration/ConfigurationManager.ts @@ -141,6 +141,7 @@ export interface ConfigTwilio { fromNumber: string; toNumbers: string[]; aggregateTimeout: number; + maxMessagesPerDay: number; } export interface ConfigSupport { diff --git a/src/Configuration/DefaultConfiguration.ts b/src/Configuration/DefaultConfiguration.ts index c3cc173..23b0327 100644 --- a/src/Configuration/DefaultConfiguration.ts +++ b/src/Configuration/DefaultConfiguration.ts @@ -33,6 +33,7 @@ export const DefaultConfiguration: Config = { fromNumber: '', toNumbers: [], aggregateTimeout: 15000, + maxMessagesPerDay: 10, }, support: { telephone: '+31613392837', diff --git a/src/Twilio.ts b/src/Twilio.ts index cec4066..18819d1 100644 --- a/src/Twilio.ts +++ b/src/Twilio.ts @@ -1,16 +1,47 @@ +import { join } from 'path'; import { Main } from './Main'; +import { pathExists, readJSON, writeJSON } from 'fs-extra'; const PREFIX = '[Twilio]'; export class TwilioHandler { private _Main: Main; + counter: { + date: string; + count: number; + } = { + date: new Date().toLocaleDateString('nl-NL'), + count: 0, + }; + client; constructor(Main: Main) { this._Main = Main; } - load() { + canSendMessage() { + const maxMessages = this._Main.Config.twilio.maxMessagesPerDay; + return this.counter.count < maxMessages; + } + + async incrementCounter() { + const today = new Date().toLocaleDateString('nl-NL'); + if (this.counter.date !== today) { + this.counter.date = today; + this.counter.count = 0; + } + this.counter.count++; + await writeJSON(join(this._Main.dataPath, 'twilio.json'), this.counter); + } + + async load() { + const twilioConfigPath = join(this._Main.dataPath, 'twilio.json'); + const twilioConfigExists = await pathExists(twilioConfigPath); + if (twilioConfigExists) { + this.counter = await readJSON(twilioConfigPath); + } + this.client = require('twilio')( this._Main.Config.twilio.accountSid, this._Main.Config.twilio.authToken @@ -39,16 +70,21 @@ export class TwilioHandler { .join('\n'); this.errorLog = []; + if (!this.canSendMessage()) + return console.log(PREFIX, 'Max messages per day reached'); + await this.incrementCounter(); + 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); + }, this._Main.Config.twilio.aggregateTimeout); } sendMessage(to: string, message: string) { + return; return new Promise((resolve) => { this.client.messages .create({