iobroker.telegram-menu 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/admin/img/info-big.png +0 -0
- package/admin/index_m.html +14 -13
- package/admin/js/component.js +2 -2
- package/admin/js/global.js +59 -0
- package/admin/js/main.js +26 -63
- package/io-package.json +29 -28
- package/lib/js/action.js +21 -3
- package/lib/js/getstate.js +23 -3
- package/lib/js/subMenu.js +11 -1
- package/lib/js/telegram.js +14 -5
- package/main.js +50 -4
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -33,6 +33,14 @@ You can create different groups with separate menus, and then assign users to th
|
|
|
33
33
|
Placeholder for the next version (at the beginning of the line):
|
|
34
34
|
### **WORK IN PROGRESS**
|
|
35
35
|
-->
|
|
36
|
+
### 0.6.6 (2023-09-03)
|
|
37
|
+
|
|
38
|
+
- add info-big.png
|
|
39
|
+
|
|
40
|
+
### 0.6.5 (2023-09-01)
|
|
41
|
+
|
|
42
|
+
- get user by chatID and send back to this chatID
|
|
43
|
+
|
|
36
44
|
### 0.6.4 (2023-08-20)
|
|
37
45
|
|
|
38
46
|
- Trigger check, used triggers are no longer available in action, in nav it is visualized that the trigger is already in use
|
|
Binary file
|
package/admin/index_m.html
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
<script type="text/javascript" src="./js/main.js"></script>
|
|
12
12
|
<script type="text/javascript" src="./js/component.js"></script>
|
|
13
13
|
<script type="text/javascript" src="./js/emit.js"></script>
|
|
14
|
+
<script type="text/javascript" src="./js/global.js"></script>
|
|
14
15
|
<script type="text/javascript" src="../../js/translate.js"></script>
|
|
15
16
|
<script type="text/javascript" src="../../lib/js/materialize.js"></script>
|
|
16
17
|
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
|
@@ -38,6 +39,7 @@
|
|
|
38
39
|
let valUserFromTelegram
|
|
39
40
|
let usedTrigger = []
|
|
40
41
|
let inputFieldWithDoubleCall = false
|
|
42
|
+
let userListWithChatID = []
|
|
41
43
|
// This will be called by the admin adapter when the settings page loads
|
|
42
44
|
async function load(settings, onChange) {
|
|
43
45
|
// example: select elements with id=key and class=value and insert value
|
|
@@ -50,9 +52,8 @@
|
|
|
50
52
|
if (settings.instance) telegramInstance = settings.instance
|
|
51
53
|
else telegramInstance = "telegram.0"
|
|
52
54
|
console.log("Telegram Instance: " + settings.instance)
|
|
53
|
-
valUserFromTelegram = await getUsersFromTelegram(socket, this, telegramInstance
|
|
54
|
-
|
|
55
|
-
createGroup("#group_list", settings.users, activeMenu, userActiveCheckbox, usersInMenus)
|
|
55
|
+
valUserFromTelegram = await getUsersFromTelegram(socket, this, telegramInstance)
|
|
56
|
+
createGroup("#group_list", settings.users, activeMenu, userActiveCheckbox)
|
|
56
57
|
fillTable("#navigation", settings.data.nav, newTableRow_Nav, menus)
|
|
57
58
|
fillTableAction(settings.data.action)
|
|
58
59
|
showHideUserEntry(activeMenu)
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
menuToSpan(activeMenu)
|
|
63
64
|
disableEnableInputField("#checkboxNoValueFound", "#textNoEntry")
|
|
64
65
|
// When import from old Version import Username
|
|
65
|
-
buildUserSelection(valUserFromTelegram, menus, usersInMenus)
|
|
66
|
+
userListWithChatID = buildUserSelection(valUserFromTelegram, menus, usersInMenus)
|
|
66
67
|
setInstanceSelect(telegramInstance)
|
|
67
68
|
translateAll()
|
|
68
69
|
|
|
@@ -123,6 +124,7 @@
|
|
|
123
124
|
usersInMenus = {}
|
|
124
125
|
usersInMenus = getUserInMenus()
|
|
125
126
|
obj.usersInGroup = usersInMenus
|
|
127
|
+
obj.userListWithChatID = userListWithChatID
|
|
126
128
|
|
|
127
129
|
const checkboxes = {}
|
|
128
130
|
$("#group_active_checkbox input").each(function () {
|
|
@@ -131,7 +133,7 @@
|
|
|
131
133
|
})
|
|
132
134
|
obj.userActiveCheckbox = checkboxes
|
|
133
135
|
const tableDevices = table2Values(".saveTable");
|
|
134
|
-
if (!
|
|
136
|
+
if (!isInputFieldEmty(".isString")) return
|
|
135
137
|
|
|
136
138
|
obj.instance = $("#select_instance").val()
|
|
137
139
|
obj.data = tableDevices;
|
|
@@ -166,7 +168,7 @@
|
|
|
166
168
|
addNewGroup(menus, newMenu, _onChange)
|
|
167
169
|
activeMenu = newMenu
|
|
168
170
|
showUser(newMenu, showHideUserCheckbox)
|
|
169
|
-
buildUserSelection(valUserFromTelegram, [newMenu], usersInMenus)
|
|
171
|
+
userListWithChatID = buildUserSelection(valUserFromTelegram, [newMenu], usersInMenus)
|
|
170
172
|
translateAll()
|
|
171
173
|
}
|
|
172
174
|
})
|
|
@@ -273,7 +275,7 @@
|
|
|
273
275
|
// Click Nav Buttons
|
|
274
276
|
let activeBtn = "nav"
|
|
275
277
|
$("header ul").on("click", ".btn_nav", function () {
|
|
276
|
-
|
|
278
|
+
isUserChecked(activeMenu)
|
|
277
279
|
usedTrigger = generateSelectTrigger(activeMenu, menus)
|
|
278
280
|
activeBtn = displayCards(activeBtn, this)
|
|
279
281
|
translateAll()
|
|
@@ -282,7 +284,7 @@
|
|
|
282
284
|
$(".adapter-container").on("click", ".btn_add_row", function () {
|
|
283
285
|
$(this).parent().parent().after(newTableRow_Nav(activeMenu, menus))
|
|
284
286
|
checkUpAndDownArrowBtn(activeMenu)
|
|
285
|
-
|
|
287
|
+
isInputFieldEmty(".isString")
|
|
286
288
|
})
|
|
287
289
|
|
|
288
290
|
// Button Row up
|
|
@@ -293,13 +295,13 @@
|
|
|
293
295
|
})
|
|
294
296
|
// Btn Row down
|
|
295
297
|
$(".adapter-container").on("click", ".btn_down", function (key) {
|
|
296
|
-
console.log("klick")
|
|
297
298
|
$(this).parent().parent().insertAfter($(this).parent().parent().next())
|
|
298
299
|
checkUpAndDownArrowBtn(activeMenu)
|
|
299
300
|
_onChange()
|
|
300
301
|
})
|
|
302
|
+
// Input check if it is not empty
|
|
301
303
|
$(".adapter-container").on("input", ".isString", function () {
|
|
302
|
-
|
|
304
|
+
isInputFieldEmty(".isString")
|
|
303
305
|
})
|
|
304
306
|
|
|
305
307
|
// ----------------------------------------//
|
|
@@ -448,10 +450,9 @@
|
|
|
448
450
|
checkValueModal(showTrigger)
|
|
449
451
|
})
|
|
450
452
|
|
|
451
|
-
|
|
452
|
-
//TODO - Trigger müssen noch in anderes Menu übertragen werden
|
|
453
453
|
$(".adapter-container").on("input", "input[data-name='call']", function () {
|
|
454
|
-
|
|
454
|
+
usedTrigger = generateSelectTrigger(activeMenu, menus)
|
|
455
|
+
if (countOccurrences(usedTrigger, $(this).val()) == 2) {
|
|
455
456
|
inputFieldWithDoubleCall = true
|
|
456
457
|
$(this).parent().addClass("bg-error-doubleUser")
|
|
457
458
|
$("#triggerAllreadyInUser").removeClass("hide")
|
package/admin/js/component.js
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
function groupUserInput(menu) {
|
|
7
7
|
return /*html*/ `<div data-name="group" data-menu="${menu}" class="${menu} "></div>`;
|
|
8
8
|
}
|
|
9
|
-
function userSelectionTelegram(user, menu) {
|
|
9
|
+
function userSelectionTelegram(user, menu, chatID) {
|
|
10
10
|
$(`#group_UserInput .${menu}`)
|
|
11
|
-
.append(/*html*/ `<div data-name="${user}"><p>${user}</p><label><input data-menu="${user}" type="checkbox" class="filled-in userSelection" /><span></span></label></div>
|
|
11
|
+
.append(/*html*/ `<div data-name="${user}" data-id="${chatID}"><p>${user}</p><label><input data-menu="${user}" type="checkbox" class="filled-in userSelection" /><span></span></label></div>
|
|
12
12
|
`);
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*global $, */
|
|
2
|
+
/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "isInputFieldEmpty|countOccurrences|deleteDoubleEntrysInArray|"}]*/
|
|
3
|
+
/**
|
|
4
|
+
* Counts how often an element is present in the array
|
|
5
|
+
* @param {[]} arr The array which should be checked
|
|
6
|
+
* @param {"string"} searchValue Search String
|
|
7
|
+
* @returns Occurrences of the Search Value
|
|
8
|
+
*/
|
|
9
|
+
function countOccurrences(arr, searchValue) {
|
|
10
|
+
let count = 0;
|
|
11
|
+
for (let i = 0; i < arr.length; i++) {
|
|
12
|
+
if (arr[i] === searchValue) {
|
|
13
|
+
count++;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return count;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Checks if the Inputsfields are empty, if true the parent class gets class="bg-error"
|
|
21
|
+
* @param {string} classes Class to browse for empty String
|
|
22
|
+
* @returns boolean True Everything is ok
|
|
23
|
+
*/
|
|
24
|
+
function isInputFieldEmty(classes) {
|
|
25
|
+
let allFieldsAreFilled = true;
|
|
26
|
+
$(classes).each(function (key, element) {
|
|
27
|
+
if (element.value == "") {
|
|
28
|
+
$(element).parent().addClass("bg-error");
|
|
29
|
+
allFieldsAreFilled = false;
|
|
30
|
+
} else {
|
|
31
|
+
$(element).parent().removeClass("bg-error");
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return allFieldsAreFilled;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Removes duplicate entries and saves the result
|
|
38
|
+
* @param {[]} arr Array
|
|
39
|
+
* @returns Array with unique entrys
|
|
40
|
+
*/
|
|
41
|
+
function deleteDoubleEntrysInArray(arr) {
|
|
42
|
+
return arr.filter((item, index) => arr.indexOf(item) === index);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sorts the array descending
|
|
46
|
+
* @param {any[]} arr Array witch should be sorted
|
|
47
|
+
* @returns Sorted Array
|
|
48
|
+
*/
|
|
49
|
+
function sortArray(arr) {
|
|
50
|
+
arr.sort((a, b) => {
|
|
51
|
+
const lowerCaseA = a.toLowerCase();
|
|
52
|
+
const lowerCaseB = b.toLowerCase();
|
|
53
|
+
|
|
54
|
+
if (lowerCaseA < lowerCaseB) return -1;
|
|
55
|
+
if (lowerCaseA > lowerCaseB) return 1;
|
|
56
|
+
return 0;
|
|
57
|
+
});
|
|
58
|
+
return arr;
|
|
59
|
+
}
|
package/admin/js/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*global newUserBtn,getUsersFromTelegram ,navElement, userSelectionTelegram ,actionElement,createSelectTrigger,newTableRow_Action,newTableRow_Action,newTrInAction,userActivCheckbox,$, groupUserInput*/
|
|
1
|
+
/*global deleteDoubleEntrysInArray,sortArray,newUserBtn,getUsersFromTelegram ,navElement, userSelectionTelegram ,actionElement,createSelectTrigger,newTableRow_Action,newTableRow_Action,newTrInAction,userActivCheckbox,$, groupUserInput*/
|
|
2
2
|
/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "disableEnableInputField|isStringEmty|generate|create|set|fill|reset|add|show|ins|table|get|new|show|checkValueModal|disable|checkUpAndDownArrowBtn|"}]*/
|
|
3
3
|
|
|
4
4
|
function checkSubMenu(activeMenu) {
|
|
@@ -34,7 +34,7 @@ function displayCards(activeBtn, _this) {
|
|
|
34
34
|
* @param {string} activemenu
|
|
35
35
|
* @returns
|
|
36
36
|
*/
|
|
37
|
-
function
|
|
37
|
+
function splitUsedUnusedTrigger(triggers, activemenu) {
|
|
38
38
|
const usedTriggers = [];
|
|
39
39
|
const list = [
|
|
40
40
|
{
|
|
@@ -64,9 +64,9 @@ function removeUsedTrigger(triggers, activemenu) {
|
|
|
64
64
|
if ($(e).val()) value = $(e).val();
|
|
65
65
|
else if ($(e).text()) value = $(e).text();
|
|
66
66
|
if (typeof value == "string") value = value.trim();
|
|
67
|
+
usedTriggers.push(value);
|
|
67
68
|
if (typeof value === "string" && triggers.includes(value)) {
|
|
68
69
|
triggers.splice(triggers.indexOf(value), 1);
|
|
69
|
-
usedTriggers.push(value);
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
});
|
|
@@ -78,6 +78,7 @@ function isUserChecked(activeMenu) {
|
|
|
78
78
|
$(`#group_UserInput div[data-menu="${activeMenu}"] input`).each(function () {
|
|
79
79
|
if ($(this).prop("checked")) checked = true;
|
|
80
80
|
});
|
|
81
|
+
|
|
81
82
|
if (!$(`#group_active_checkbox div.${activeMenu} input`).prop("checked") || checked) {
|
|
82
83
|
$("#userSelection").addClass("hide");
|
|
83
84
|
return true;
|
|
@@ -132,25 +133,6 @@ function disableEnableInputField(checkbox, inputfield) {
|
|
|
132
133
|
if (active) $(inputfield).removeAttr("disabled");
|
|
133
134
|
else $(inputfield).attr("disabled", "disabled");
|
|
134
135
|
}
|
|
135
|
-
/**
|
|
136
|
-
*
|
|
137
|
-
* @param {string} classes Class to browse for empty String
|
|
138
|
-
* @returns boolean True Everything is ok
|
|
139
|
-
*/
|
|
140
|
-
// @ts-ignore
|
|
141
|
-
function isStringEmty(classes) {
|
|
142
|
-
let allOk = true;
|
|
143
|
-
// @ts-ignore
|
|
144
|
-
$(classes).each(function (key, element) {
|
|
145
|
-
if (element.value == "") {
|
|
146
|
-
$(element).parent().addClass("bg-error");
|
|
147
|
-
allOk = false;
|
|
148
|
-
} else {
|
|
149
|
-
$(element).parent().removeClass("bg-error");
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
return allOk;
|
|
153
|
-
}
|
|
154
136
|
// @ts-ignore
|
|
155
137
|
function checkUpAndDownArrowBtn(activeuser) {
|
|
156
138
|
const lengthOfNavList = $(`tbody#${activeuser}.visibilityArrowBtn tr`).length - 1;
|
|
@@ -223,16 +205,19 @@ function createGroup(id, menu, activeGroup, userActiveCheckbox, usersInGroup) {
|
|
|
223
205
|
function buildUserSelection(state, menus, userinGroup) {
|
|
224
206
|
const usersInTelegram = JSON.parse(state.val);
|
|
225
207
|
const userListe = [];
|
|
208
|
+
const userListWithChatID = [];
|
|
226
209
|
for (const user in usersInTelegram) {
|
|
227
210
|
userListe.push(usersInTelegram[user]["firstName"]);
|
|
211
|
+
userListWithChatID.push({ name: usersInTelegram[user]["firstName"], chatID: user });
|
|
228
212
|
}
|
|
229
213
|
$(menus).each(function (key, menu) {
|
|
230
|
-
$(
|
|
214
|
+
$(userListWithChatID).each(function (key, user) {
|
|
231
215
|
// @ts-ignore
|
|
232
|
-
userSelectionTelegram(user, menu);
|
|
216
|
+
userSelectionTelegram(user.name, menu, user.chatID);
|
|
233
217
|
});
|
|
234
218
|
checkCheckbox(menu, userListe, userinGroup);
|
|
235
219
|
});
|
|
220
|
+
return userListWithChatID;
|
|
236
221
|
}
|
|
237
222
|
|
|
238
223
|
function checkCheckbox(menu, userList, userinGroup) {
|
|
@@ -339,12 +324,12 @@ function showHideUserEntry(activeGroup) {
|
|
|
339
324
|
|
|
340
325
|
/**
|
|
341
326
|
*
|
|
342
|
-
* @param {Array}
|
|
327
|
+
* @param {Array} checkboxes Entrys with Checkbox Values
|
|
343
328
|
*/
|
|
344
329
|
// @ts-ignore
|
|
345
|
-
function setCheckbox(
|
|
346
|
-
Object.keys(
|
|
347
|
-
if (
|
|
330
|
+
function setCheckbox(checkboxes) {
|
|
331
|
+
Object.keys(checkboxes).forEach((key) => {
|
|
332
|
+
if (checkboxes[key]) {
|
|
348
333
|
$(`#${key}`).prop("checked", true);
|
|
349
334
|
} else $(`#${key}`).prop("checked", false);
|
|
350
335
|
});
|
|
@@ -374,13 +359,11 @@ function getAllCheckedUserInMenu(activemenu) {
|
|
|
374
359
|
return activeUserList;
|
|
375
360
|
}
|
|
376
361
|
|
|
377
|
-
//TODO - Submenu Trigger
|
|
378
362
|
//ANCHOR - Trigger erstellen
|
|
379
|
-
// @ts-ignore
|
|
380
|
-
|
|
381
363
|
function generateSelectTrigger(activeMenu, menus) {
|
|
382
364
|
const submenu = checkSubMenu(activeMenu);
|
|
383
365
|
let list = [];
|
|
366
|
+
let usedAndNotUsedTrigger = {};
|
|
384
367
|
if (submenu) {
|
|
385
368
|
const activeUserList = getAllCheckedUserInMenu(activeMenu);
|
|
386
369
|
const menuListWithUser = [];
|
|
@@ -396,10 +379,11 @@ function generateSelectTrigger(activeMenu, menus) {
|
|
|
396
379
|
const errorTriggerList = [];
|
|
397
380
|
menuListWithUser.forEach(function (menu) {
|
|
398
381
|
list = list.concat(splitTextInArray(menu));
|
|
382
|
+
const usedAndNotUsedTrigger = splitUsedUnusedTrigger(list, menu);
|
|
383
|
+
list = usedAndNotUsedTrigger.triggers;
|
|
384
|
+
// @ts-ignore
|
|
399
385
|
list = deleteDoubleEntrysInArray(list);
|
|
400
386
|
list = deleteUnnessesaryElements(list);
|
|
401
|
-
const usedAndNotUsedTrigger = removeUsedTrigger(list, menu);
|
|
402
|
-
list = usedAndNotUsedTrigger.triggers;
|
|
403
387
|
usedAndNotUsedTrigger.usedTriggers.forEach(function (element) {
|
|
404
388
|
if (usedTriggers.includes(element)) {
|
|
405
389
|
errorTriggerList.push(element);
|
|
@@ -408,7 +392,6 @@ function generateSelectTrigger(activeMenu, menus) {
|
|
|
408
392
|
});
|
|
409
393
|
|
|
410
394
|
if (!triggerInUse) {
|
|
411
|
-
console.log(usedTriggers);
|
|
412
395
|
if (usedTriggers.length != 0) usedTriggers.concat(usedAndNotUsedTrigger.usedTriggers);
|
|
413
396
|
else usedTriggers = usedAndNotUsedTrigger.usedTriggers;
|
|
414
397
|
|
|
@@ -418,13 +401,15 @@ function generateSelectTrigger(activeMenu, menus) {
|
|
|
418
401
|
$("#doubleTriggerInSubmenu").removeClass("hide");
|
|
419
402
|
}
|
|
420
403
|
});
|
|
421
|
-
} else
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
404
|
+
} else {
|
|
405
|
+
list = splitTextInArray(activeMenu);
|
|
406
|
+
usedAndNotUsedTrigger = splitUsedUnusedTrigger(list, activeMenu);
|
|
407
|
+
list = usedAndNotUsedTrigger.triggers;
|
|
408
|
+
// @ts-ignore
|
|
409
|
+
list = deleteDoubleEntrysInArray(list);
|
|
410
|
+
list = deleteUnnessesaryElements(list);
|
|
411
|
+
}
|
|
412
|
+
// @ts-ignore
|
|
428
413
|
list = sortArray(list);
|
|
429
414
|
// HTML Elemente löschen und neu aufbauen
|
|
430
415
|
// @ts-ignore
|
|
@@ -433,38 +418,16 @@ function generateSelectTrigger(activeMenu, menus) {
|
|
|
433
418
|
return usedAndNotUsedTrigger.usedTriggers;
|
|
434
419
|
}
|
|
435
420
|
|
|
436
|
-
function deleteDoubleEntrysInArray(arr) {
|
|
437
|
-
return arr.filter((item, index) => arr.indexOf(item) === index);
|
|
438
|
-
}
|
|
439
421
|
function deleteUnnessesaryElements(list) {
|
|
440
422
|
const newlist = [];
|
|
441
423
|
list.forEach(function (e) {
|
|
442
424
|
if (e != "menu:back" && e != "-") {
|
|
443
425
|
if (e.includes("menu:")) e = e.split(":")[2];
|
|
444
|
-
|
|
445
426
|
newlist.push(e);
|
|
446
427
|
}
|
|
447
428
|
});
|
|
448
429
|
return newlist;
|
|
449
430
|
}
|
|
450
|
-
/**
|
|
451
|
-
*
|
|
452
|
-
* @param {any[]} arr
|
|
453
|
-
* @returns Sorted Array
|
|
454
|
-
*/
|
|
455
|
-
function sortArray(arr) {
|
|
456
|
-
arr.sort((a, b) => {
|
|
457
|
-
// @ts-ignore
|
|
458
|
-
const lowerCaseA = a.toLowerCase();
|
|
459
|
-
// @ts-ignore
|
|
460
|
-
const lowerCaseB = b.toLowerCase();
|
|
461
|
-
|
|
462
|
-
if (lowerCaseA < lowerCaseB) return -1;
|
|
463
|
-
if (lowerCaseA > lowerCaseB) return 1;
|
|
464
|
-
return 0;
|
|
465
|
-
});
|
|
466
|
-
return arr;
|
|
467
|
-
}
|
|
468
431
|
|
|
469
432
|
// @ts-ignore
|
|
470
433
|
function fillTable(id, data, newTableRow_Nav, users) {
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "telegram-menu",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.6",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.6.6": {
|
|
7
|
+
"en": "add info-big.png",
|
|
8
|
+
"de": "info-big.png",
|
|
9
|
+
"ru": "добавить info-big.png",
|
|
10
|
+
"pt": "adicionar info-big.png",
|
|
11
|
+
"nl": "voeg info-big toe",
|
|
12
|
+
"fr": "ajouter info-big.png",
|
|
13
|
+
"it": "aggiungere info-big.png",
|
|
14
|
+
"es": "añadir info-big.png",
|
|
15
|
+
"pl": "info-big.png",
|
|
16
|
+
"uk": "javascript licenses api веб-сайт go1.13.8",
|
|
17
|
+
"zh-cn": "增 编"
|
|
18
|
+
},
|
|
19
|
+
"0.6.5": {
|
|
20
|
+
"en": "get user by chatID and send back to this chatID",
|
|
21
|
+
"de": "benutzer per chatID ermitteln und zurück senden an diese chatID",
|
|
22
|
+
"ru": "получить пользователя по чатID и отправить обратно в этот чатID",
|
|
23
|
+
"pt": "obter usuário por chatID e enviar de volta para este chatID",
|
|
24
|
+
"nl": "haal gebruiker van chatID en stuur terug naar dit chatID",
|
|
25
|
+
"fr": "obtenir utilisateur par chatID et renvoyer à ce chatID",
|
|
26
|
+
"it": "ottenere l'utente da chatID e tornare a questo chatID",
|
|
27
|
+
"es": "obtener usuario por chatID y enviar de nuevo a este chatID",
|
|
28
|
+
"pl": "użytkowanie przez czat i wysyłane do tego czatID",
|
|
29
|
+
"uk": "отримати користувач по chatID і відправити назад в цей чатID",
|
|
30
|
+
"zh-cn": "被混乱者利用,然后再送给这一混乱的裁研所。"
|
|
31
|
+
},
|
|
6
32
|
"0.6.4": {
|
|
7
33
|
"en": "Trigger check, used triggers are no longer available in action, in nav it is visualized that the trigger is already in use",
|
|
8
34
|
"de": "Trigger-Check, verwendete Trigger sind nicht mehr in Aktion, in nav wird visualisiert, dass der Trigger bereits im Einsatz ist",
|
|
@@ -67,32 +93,6 @@
|
|
|
67
93
|
"pl": "okładka\nstylistyka\ndrobne rozwiązanie\nAdd Row Button (ang.)\nWięcej grup z tymi samymi grupami User\nTrigger generuje bez oszczędzania",
|
|
68
94
|
"uk": "поштова скринька для користувачів Telegram\nстрахування\nмаленькі кріплення\nДодати кнопку Row в Nav для кожного рядка\nБільше груп з тим самим Користувачем\nТригер генерує без збереження",
|
|
69
95
|
"zh-cn": "电报用户检查箱\n处理\n小型配件\n增加纳维州的Row Button\n与同一用户的更多集团\n不节约的漏洞"
|
|
70
|
-
},
|
|
71
|
-
"0.5.1": {
|
|
72
|
-
"en": "sent to the wrong instance, fixed",
|
|
73
|
-
"de": "an die falsche instanz gesendet, fixiert",
|
|
74
|
-
"ru": "отправлено в неправильный экземпляр, исправлено",
|
|
75
|
-
"pt": "enviado para a instância errada, corrigido",
|
|
76
|
-
"nl": "verzonden naar de verkeerde instantie",
|
|
77
|
-
"fr": "envoyé à la mauvaise instance, fixe",
|
|
78
|
-
"it": "inviato all'istanza sbagliata, fisso",
|
|
79
|
-
"es": "enviado al caso equivocado, fijo",
|
|
80
|
-
"pl": "wysłany do niewłaściwej instancji, ustalony",
|
|
81
|
-
"uk": "відправлений на неправильний екземпляр, фіксований",
|
|
82
|
-
"zh-cn": "向错误案件发出的固定通知"
|
|
83
|
-
},
|
|
84
|
-
"0.5.0": {
|
|
85
|
-
"en": "trigger avoid duplicate entries and sort alphabetical\nadapter stops responding after some time, fixed #42\ngenerate Trigger in Action, fixed\nmath value for getstate\nsettings instance #41, menus, fixed\nno spellcheck for input fields\nmenu go back to last Sides",
|
|
86
|
-
"de": "trigger vermeiden doppelte einträge und sortieren alphabetisch\nadapter stoppt nach einiger zeit, fixiert #42\ntrigger in Aktion generieren, fixiert\nmath wert für getstate\neinstellungen instanz #41, menüs, fixiert\nkeine rechtschreibprüfung für eingabefelder\nmenü zurück zu den letzten Seiten",
|
|
87
|
-
"ru": "триггер избегает дублирования записей и сортировать алфавитный\nадаптер останавливается после некоторого времени, фиксированный #42\nгенерировать триггер в действии, фиксированный\nматематическое значение для getstate\nнастройки экземпляра #41, меню, фиксированные\nбез орфографии для входящих полей\nменю вернуться к последним Сторонам",
|
|
88
|
-
"pt": "gatilho evitar entradas duplicadas e classificar alfabético\nadaptador pára de responder após algum tempo, fixo #42\ngerar gatilho em Ação, fixo\nvalor de matemática para getstate\nsetting instance #41, menus, fixo\nsem verificação ortográfica para campos de entrada\nmenu voltar para os últimos lados",
|
|
89
|
-
"nl": "de trekker ontwijkt duplicaat en alfabetische\nadapter stopt met reageren na enige tijd, gerepareerd #42\ngenereerde Trigger in Actie, gerepareerd\nwiskunde waarde voor onroerend goed\nvertaling:\ngeen spellcheck voor input velden\nmenu gaat terug naar de laatste Sides",
|
|
90
|
-
"fr": "déclencheur éviter les doubles entrées et trier alphabétique\nadaptateur s'arrête après un certain temps, fixe #42\ngénérer Trigger en action, fixe\nmath value for getstate\nparamètres instance #41, menus, fixe\npas de sortcheck pour les champs d'entrée\nmenu retourner aux derniers côtés",
|
|
91
|
-
"it": "trigger evitare voci duplicate e ordinare alfabetico\nadattatore smette di rispondere dopo qualche tempo, fisso #42\ngenerare Trigger in Azione, fisso\nvalore matematico per getstate\nimpostazioni istanza #41, menu, fisso\nnessun spellcheck per i campi di input\nmenu torna all'ultimo lato",
|
|
92
|
-
"es": "gatillo evitar entradas duplicadas y ordenar entradas alfabéticas\nadaptador deja de responder después de algún tiempo, fijo #42\ngenerar Trigger en Acción, fijo\nvalor matemático para getstate\nconfiguración instancia #41, menús, fijo\nno hechizo para campos de entrada\nmenu go back to last Sides",
|
|
93
|
-
"pl": "wykorzystywanie wyjściowe unikanie duplikacji wpisów i alfabetyzacji\npo pewnym czasie przerwy reagują na stałe #42\ngeneruje Triggera w akcji\nwartość matrycowa\nna przykład #41, menus, ustawiony\nzaklęcie dla pól wejściowych\nmenu wraca do ostatniej strony",
|
|
94
|
-
"uk": "уникнути дублікатів записів і сортування алфавіту\nадаптер припиняє реагувати на деякий час, фіксований #42\nгенерувати Трігер в дії, фіксований\nматематичне значення для getstate\nзамість налаштувань #41, меню, фіксовані\nвідсутність орцепції для вхідних полів\nім'я користувача",
|
|
95
|
-
"zh-cn": "2. 避免重复物品和名称\n适应者在一段时间后停止作出反应,固定的编号为42\na. 行动的三倍,固定\n获取国产值\n例如第41号、男性、固定地点\n没有对投入领域进行明确的检查\n男子回到最后的Sides。"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -169,7 +169,8 @@
|
|
|
169
169
|
"directory": "",
|
|
170
170
|
"userActiveCheckbox": [],
|
|
171
171
|
"usersInGroup": {},
|
|
172
|
-
"textNoEntry": ""
|
|
172
|
+
"textNoEntry": "",
|
|
173
|
+
"userListWithChatID": []
|
|
173
174
|
},
|
|
174
175
|
"objects": [],
|
|
175
176
|
"instanceObjects": [
|
package/lib/js/action.js
CHANGED
|
@@ -83,7 +83,17 @@ async function editArrayButtons(val, _this) {
|
|
|
83
83
|
* @param {*} userToSend
|
|
84
84
|
* @param {*} newline
|
|
85
85
|
*/
|
|
86
|
-
const idBySelector = async (
|
|
86
|
+
const idBySelector = async (
|
|
87
|
+
_this,
|
|
88
|
+
selector,
|
|
89
|
+
text,
|
|
90
|
+
userToSend,
|
|
91
|
+
newline,
|
|
92
|
+
telegramInstance,
|
|
93
|
+
one_time_keyboard,
|
|
94
|
+
resize_keyboard,
|
|
95
|
+
userListWithChatID,
|
|
96
|
+
) => {
|
|
87
97
|
let text2Send = "";
|
|
88
98
|
try {
|
|
89
99
|
if (selector.includes("functions")) {
|
|
@@ -123,7 +133,16 @@ const idBySelector = async (_this, selector, text, userToSend, newline) => {
|
|
|
123
133
|
_this.log.debug("text2send " + JSON.stringify(text2Send));
|
|
124
134
|
_this.log.debug("usertosend " + JSON.stringify(userToSend));
|
|
125
135
|
|
|
126
|
-
sendToTelegram(
|
|
136
|
+
sendToTelegram(
|
|
137
|
+
_this,
|
|
138
|
+
userToSend,
|
|
139
|
+
text,
|
|
140
|
+
undefined,
|
|
141
|
+
telegramInstance,
|
|
142
|
+
one_time_keyboard,
|
|
143
|
+
resize_keyboard,
|
|
144
|
+
userListWithChatID,
|
|
145
|
+
);
|
|
127
146
|
})
|
|
128
147
|
.catch((e) => {
|
|
129
148
|
_this.log.debug("Error " + JSON.stringify(e));
|
|
@@ -151,7 +170,6 @@ async function generateNewObjectStructure(_this, val) {
|
|
|
151
170
|
nav: element.value,
|
|
152
171
|
text: element.text,
|
|
153
172
|
};
|
|
154
|
-
_this.log.debug("elementVal " + JSON.stringify(element.value));
|
|
155
173
|
});
|
|
156
174
|
return obj;
|
|
157
175
|
} catch (err) {
|
package/lib/js/getstate.js
CHANGED
|
@@ -3,7 +3,7 @@ const idBySelector = require("./action").idBySelector;
|
|
|
3
3
|
const exchangeValue = require("./action").exchangeValue;
|
|
4
4
|
const calcValue = require("./action").calcValue;
|
|
5
5
|
|
|
6
|
-
function getstate(_this, part, userToSend, telegramInstance) {
|
|
6
|
+
function getstate(_this, part, userToSend, telegramInstance, one_time_keyboard, resize_keyboard, userListWithChatID) {
|
|
7
7
|
try {
|
|
8
8
|
let text = "";
|
|
9
9
|
let i = 1;
|
|
@@ -13,7 +13,17 @@ function getstate(_this, part, userToSend, telegramInstance) {
|
|
|
13
13
|
const id = element.id;
|
|
14
14
|
if (id.indexOf(specificatorSelektor) != -1) {
|
|
15
15
|
// const selector = id.replace(/\"/g, "");
|
|
16
|
-
idBySelector(
|
|
16
|
+
idBySelector(
|
|
17
|
+
_this,
|
|
18
|
+
id,
|
|
19
|
+
element.text,
|
|
20
|
+
userToSend,
|
|
21
|
+
element.newline,
|
|
22
|
+
telegramInstance,
|
|
23
|
+
one_time_keyboard,
|
|
24
|
+
resize_keyboard,
|
|
25
|
+
userListWithChatID,
|
|
26
|
+
);
|
|
17
27
|
} else {
|
|
18
28
|
_this.getForeignStateAsync(element.id).then((value) => {
|
|
19
29
|
if (value) {
|
|
@@ -50,7 +60,17 @@ function getstate(_this, part, userToSend, telegramInstance) {
|
|
|
50
60
|
_this.log.debug("Length & i: " + JSON.stringify({ length: part.getData.length, i: i }));
|
|
51
61
|
if (i == part.getData.length) {
|
|
52
62
|
_this.log.debug("User to send: " + JSON.stringify(userToSend));
|
|
53
|
-
if (userToSend)
|
|
63
|
+
if (userToSend)
|
|
64
|
+
sendToTelegram(
|
|
65
|
+
_this,
|
|
66
|
+
userToSend,
|
|
67
|
+
text,
|
|
68
|
+
undefined,
|
|
69
|
+
telegramInstance,
|
|
70
|
+
one_time_keyboard,
|
|
71
|
+
resize_keyboard,
|
|
72
|
+
userListWithChatID,
|
|
73
|
+
);
|
|
54
74
|
}
|
|
55
75
|
i++;
|
|
56
76
|
});
|
package/lib/js/subMenu.js
CHANGED
|
@@ -12,7 +12,16 @@ const backMenu = {};
|
|
|
12
12
|
* @param {string} userToSend
|
|
13
13
|
* @returns
|
|
14
14
|
*/
|
|
15
|
-
function subMenu(
|
|
15
|
+
function subMenu(
|
|
16
|
+
_this,
|
|
17
|
+
text,
|
|
18
|
+
groupData,
|
|
19
|
+
userToSend,
|
|
20
|
+
instanceTelegram,
|
|
21
|
+
resize_keyboard,
|
|
22
|
+
one_time_keyboard,
|
|
23
|
+
userListWithChatID,
|
|
24
|
+
) {
|
|
16
25
|
const splittetText = JSON.stringify(text).split(`"`)[1].split(":");
|
|
17
26
|
const callbackData = splittetText[1];
|
|
18
27
|
let device2Switch = splittetText[2];
|
|
@@ -153,6 +162,7 @@ function subMenu(_this, text, groupData, userToSend, instanceTelegram, resize_ke
|
|
|
153
162
|
instanceTelegram,
|
|
154
163
|
resize_keyboard,
|
|
155
164
|
one_time_keyboard,
|
|
165
|
+
userListWithChatID,
|
|
156
166
|
);
|
|
157
167
|
}
|
|
158
168
|
backMenu[userToSend].last = list.pop();
|
package/lib/js/telegram.js
CHANGED
|
@@ -16,17 +16,22 @@ function sendToTelegram(
|
|
|
16
16
|
instance = "telegram.0",
|
|
17
17
|
resize_keyboard = true,
|
|
18
18
|
one_time_keyboard = true,
|
|
19
|
+
userListWithChatID,
|
|
19
20
|
) {
|
|
20
21
|
_this.log.debug("Send this Value : " + JSON.stringify(value));
|
|
21
22
|
_this.log.debug("Send this to : " + JSON.stringify(user));
|
|
22
23
|
_this.log.debug("Instance : " + JSON.stringify(instance));
|
|
24
|
+
let chatId = "";
|
|
25
|
+
userListWithChatID.forEach((element) => {
|
|
26
|
+
if (element.name === user) chatId = element.chatID;
|
|
27
|
+
});
|
|
23
28
|
if (keyboard.length == 0) {
|
|
24
29
|
_this.sendTo(
|
|
25
30
|
instance,
|
|
26
31
|
"send",
|
|
27
32
|
{
|
|
28
33
|
text: value,
|
|
29
|
-
|
|
34
|
+
chatId: chatId,
|
|
30
35
|
},
|
|
31
36
|
function (res) {
|
|
32
37
|
console.log("Sent Value to " + res + " users!");
|
|
@@ -37,7 +42,7 @@ function sendToTelegram(
|
|
|
37
42
|
instance,
|
|
38
43
|
"send",
|
|
39
44
|
{
|
|
40
|
-
|
|
45
|
+
chatId: chatId,
|
|
41
46
|
text: value,
|
|
42
47
|
reply_markup: {
|
|
43
48
|
keyboard: keyboard,
|
|
@@ -51,10 +56,14 @@ function sendToTelegram(
|
|
|
51
56
|
);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
|
-
function sendToTelegramSubmenu(_this,
|
|
59
|
+
function sendToTelegramSubmenu(_this, user, text, keyboard, instance = "telegram.0", userListWithChatID) {
|
|
60
|
+
let chatId = "";
|
|
61
|
+
userListWithChatID.forEach((element) => {
|
|
62
|
+
if (element.name === user) chatId = element.chatID;
|
|
63
|
+
});
|
|
55
64
|
_this.sendTo(instance, "send", {
|
|
56
|
-
|
|
57
|
-
name:
|
|
65
|
+
chatId: chatId,
|
|
66
|
+
// name: user,
|
|
58
67
|
text: text,
|
|
59
68
|
reply_markup: keyboard,
|
|
60
69
|
});
|
package/main.js
CHANGED
|
@@ -68,6 +68,7 @@ class TelegramMenu extends utils.Adapter {
|
|
|
68
68
|
const userActiveCheckbox = this.config.userActiveCheckbox;
|
|
69
69
|
const groupsWithUsers = this.config.usersInGroup;
|
|
70
70
|
const textNoEntryFound = this.config.textNoEntry;
|
|
71
|
+
const userListWithChatID = this.config.userListWithChatID;
|
|
71
72
|
const menu = {
|
|
72
73
|
data: {},
|
|
73
74
|
};
|
|
@@ -126,6 +127,7 @@ class TelegramMenu extends utils.Adapter {
|
|
|
126
127
|
this.log.debug("Startseite: " + JSON.stringify(startside));
|
|
127
128
|
groupsWithUsers[group].forEach((user) => {
|
|
128
129
|
backMenuFuc(this, startside, null, user);
|
|
130
|
+
this.log.debug("User List " + JSON.stringify(userListWithChatID));
|
|
129
131
|
sendToTelegram(
|
|
130
132
|
_this,
|
|
131
133
|
user,
|
|
@@ -134,6 +136,7 @@ class TelegramMenu extends utils.Adapter {
|
|
|
134
136
|
instanceTelegram,
|
|
135
137
|
resize_keyboard,
|
|
136
138
|
one_time_keyboard,
|
|
139
|
+
userListWithChatID,
|
|
137
140
|
);
|
|
138
141
|
});
|
|
139
142
|
}
|
|
@@ -148,7 +151,19 @@ class TelegramMenu extends utils.Adapter {
|
|
|
148
151
|
if (telegramAktiv && state?.ack) {
|
|
149
152
|
if (state && typeof state.val === "string" && state.val != "" && id == telegramID) {
|
|
150
153
|
const value = state.val;
|
|
151
|
-
const
|
|
154
|
+
const chatID = await this.getForeignStateAsync(
|
|
155
|
+
`${instanceTelegram}.communicate.requestChatId`,
|
|
156
|
+
);
|
|
157
|
+
let user;
|
|
158
|
+
if (chatID) {
|
|
159
|
+
this.log.debug("ChatID: " + JSON.stringify(chatID.val));
|
|
160
|
+
userListWithChatID.forEach((element) => {
|
|
161
|
+
this.log.debug("element " + JSON.stringify(element));
|
|
162
|
+
if (element.chatID == chatID.val) user = element.name;
|
|
163
|
+
this.log.debug("user " + JSON.stringify(user));
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
152
167
|
const calledValue = value.slice(value.indexOf("]") + 1, value.length);
|
|
153
168
|
this.log.debug(
|
|
154
169
|
JSON.stringify({
|
|
@@ -180,7 +195,16 @@ class TelegramMenu extends utils.Adapter {
|
|
|
180
195
|
} else continue;
|
|
181
196
|
}
|
|
182
197
|
if (!dataFound && checkboxNoEntryFound) {
|
|
183
|
-
sendToTelegram(
|
|
198
|
+
sendToTelegram(
|
|
199
|
+
this,
|
|
200
|
+
userToSend,
|
|
201
|
+
textNoEntryFound,
|
|
202
|
+
undefined,
|
|
203
|
+
instanceTelegram,
|
|
204
|
+
resize_keyboard,
|
|
205
|
+
one_time_keyboard,
|
|
206
|
+
userListWithChatID,
|
|
207
|
+
);
|
|
184
208
|
}
|
|
185
209
|
|
|
186
210
|
// Auf Setstate reagieren und Wert schicken
|
|
@@ -226,6 +250,9 @@ class TelegramMenu extends utils.Adapter {
|
|
|
226
250
|
textToSend,
|
|
227
251
|
undefined,
|
|
228
252
|
instanceTelegram,
|
|
253
|
+
resize_keyboard,
|
|
254
|
+
one_time_keyboard,
|
|
255
|
+
userListWithChatID,
|
|
229
256
|
);
|
|
230
257
|
// Die Elemente auf die Reagiert wurde entfernen
|
|
231
258
|
setStateIdsToListenTo.splice(key, 1);
|
|
@@ -270,6 +297,7 @@ class TelegramMenu extends utils.Adapter {
|
|
|
270
297
|
instanceTelegram,
|
|
271
298
|
resize_keyboard,
|
|
272
299
|
one_time_keyboard,
|
|
300
|
+
userListWithChatID,
|
|
273
301
|
);
|
|
274
302
|
return true;
|
|
275
303
|
}
|
|
@@ -280,7 +308,15 @@ class TelegramMenu extends utils.Adapter {
|
|
|
280
308
|
setStateIdsToListenTo = setstate(_this, part, userToSend);
|
|
281
309
|
return true;
|
|
282
310
|
} else if (part.getData) {
|
|
283
|
-
getstate(
|
|
311
|
+
getstate(
|
|
312
|
+
_this,
|
|
313
|
+
part,
|
|
314
|
+
userToSend,
|
|
315
|
+
instanceTelegram,
|
|
316
|
+
one_time_keyboard,
|
|
317
|
+
resize_keyboard,
|
|
318
|
+
userListWithChatID,
|
|
319
|
+
);
|
|
284
320
|
return true;
|
|
285
321
|
} else if (part.sendPic) {
|
|
286
322
|
try {
|
|
@@ -315,7 +351,16 @@ class TelegramMenu extends utils.Adapter {
|
|
|
315
351
|
const path = `${directoryPicture}${element.fileName}`;
|
|
316
352
|
const timeout = _this.setTimeout(async () => {
|
|
317
353
|
_this.log.debug("Send Pic to Telegram");
|
|
318
|
-
sendToTelegram(
|
|
354
|
+
sendToTelegram(
|
|
355
|
+
_this,
|
|
356
|
+
userToSend,
|
|
357
|
+
path,
|
|
358
|
+
undefined,
|
|
359
|
+
instanceTelegram,
|
|
360
|
+
resize_keyboard,
|
|
361
|
+
one_time_keyboard,
|
|
362
|
+
userListWithChatID,
|
|
363
|
+
);
|
|
319
364
|
|
|
320
365
|
let timeoutToClear = {};
|
|
321
366
|
timeoutToClear = timeouts.filter((item) => item.key == timeoutKey);
|
|
@@ -352,6 +397,7 @@ class TelegramMenu extends utils.Adapter {
|
|
|
352
397
|
instanceTelegram,
|
|
353
398
|
resize_keyboard,
|
|
354
399
|
one_time_keyboard,
|
|
400
|
+
userListWithChatID,
|
|
355
401
|
);
|
|
356
402
|
if (subMenuData && subMenuData[3]) setStateIdsToListenTo = subMenuData[3];
|
|
357
403
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.telegram-menu",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.6",
|
|
4
4
|
"description": "Easily create Telegram Menus",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "MiRo1310",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@iobroker/adapter-core": "^3.0.3"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@alcalzone/release-script": "^3.
|
|
27
|
+
"@alcalzone/release-script": "^3.6.0",
|
|
28
28
|
"@alcalzone/release-script-plugin-iobroker": "^3.6.0",
|
|
29
29
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
30
30
|
"@alcalzone/release-script-plugin-manual-review": "^3.5.9",
|
|
@@ -41,15 +41,15 @@
|
|
|
41
41
|
"@types/sinon-chai": "^3.2.9",
|
|
42
42
|
"chai": "^4.3.7",
|
|
43
43
|
"chai-as-promised": "^7.1.1",
|
|
44
|
-
"eslint": "^8.
|
|
44
|
+
"eslint": "^8.48.0",
|
|
45
45
|
"eslint-config-prettier": "^8.9.0",
|
|
46
46
|
"eslint-plugin-prettier": "^4.2.1",
|
|
47
47
|
"mocha": "^10.2.0",
|
|
48
|
-
"prettier": "^3.0.
|
|
48
|
+
"prettier": "^3.0.3",
|
|
49
49
|
"proxyquire": "^2.1.3",
|
|
50
50
|
"sinon": "^15.2.0",
|
|
51
51
|
"sinon-chai": "^3.7.0",
|
|
52
|
-
"typescript": "~5.
|
|
52
|
+
"typescript": "~5.2.2"
|
|
53
53
|
},
|
|
54
54
|
"main": "main.js",
|
|
55
55
|
"files": [
|