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 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
@@ -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, usersInMenus)
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 (!isStringEmty(".isString")) return
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
- if (!isUserChecked(activeMenu)) return
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
- isStringEmty(".isString")
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
- isStringEmty(".isString")
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
- if (usedTrigger.includes($(this).val())) {
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")
@@ -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 removeUsedTrigger(triggers, activemenu) {
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
- $(userListe).each(function (key, user) {
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} checkbox Entrys with Checkbox Values
327
+ * @param {Array} checkboxes Entrys with Checkbox Values
343
328
  */
344
329
  // @ts-ignore
345
- function setCheckbox(checkbox) {
346
- Object.keys(checkbox).forEach((key) => {
347
- if (checkbox[key]) {
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 list = splitTextInArray(activeMenu);
422
-
423
- list = deleteDoubleEntrysInArray(list);
424
- list = deleteUnnessesaryElements(list);
425
- const usedAndNotUsedTrigger = removeUsedTrigger(list, activeMenu);
426
- list = usedAndNotUsedTrigger.triggers;
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",
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 (_this, selector, text, userToSend, newline) => {
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(_this, userToSend, text2Send);
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) {
@@ -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(_this, id, element.text, userToSend, element.newline);
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) sendToTelegram(_this, userToSend, text, undefined, telegramInstance);
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(_this, text, groupData, userToSend, instanceTelegram, resize_keyboard, one_time_keyboard) {
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();
@@ -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
- user: user,
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
- user: user,
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, name, text, keyboard, instance = "telegram.0") {
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
- // chatId: chatId,
57
- name: 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 user = value.slice(1, value.indexOf("]"));
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(this, userToSend, textNoEntryFound, undefined, instanceTelegram);
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(_this, part, userToSend, instanceTelegram);
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(_this, userToSend, path, undefined, instanceTelegram);
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.4",
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.5.9",
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.0",
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.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.1.6"
52
+ "typescript": "~5.2.2"
53
53
  },
54
54
  "main": "main.js",
55
55
  "files": [