iobroker.telegram-menu 2.1.9 → 2.2.0
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 +13 -2
- package/admin/build/index.js +68 -68
- package/admin/build/index.js.map +4 -4
- package/admin/css/button.css +1 -1
- package/admin/css/custom_classes.css +116 -0
- package/admin/css/description.css +29 -0
- package/admin/css/style.css +85 -36
- package/admin/css/textarea.css +22 -20
- package/admin/i18n/de/translations.json +10 -3
- package/admin/i18n/en/translations.json +122 -115
- package/admin/i18n/es/translations.json +8 -1
- package/admin/i18n/fr/translations.json +8 -1
- package/admin/i18n/it/translations.json +8 -1
- package/admin/i18n/nl/translations.json +8 -1
- package/admin/i18n/pl/translations.json +8 -1
- package/admin/i18n/pt/translations.json +8 -1
- package/admin/i18n/ru/translations.json +8 -1
- package/admin/i18n/uk/translations.json +8 -1
- package/admin/i18n/zh-cn/translations.json +8 -1
- package/admin/words.js +6 -5
- package/build/lib/action.js +1 -1
- package/build/lib/action.js.map +1 -1
- package/build/lib/echarts.js +8 -4
- package/build/lib/echarts.js.map +2 -2
- package/build/lib/global.js +32 -2
- package/build/lib/global.js.map +3 -3
- package/build/lib/httpRequest.js +10 -5
- package/build/lib/httpRequest.js.map +2 -2
- package/build/lib/processData.js +1 -1
- package/build/lib/processData.js.map +2 -2
- package/build/lib/sendNav.js +1 -1
- package/build/lib/sendNav.js.map +1 -1
- package/build/lib/sendpic.js +6 -2
- package/build/lib/sendpic.js.map +2 -2
- package/build/lib/telegram.js +3 -1
- package/build/lib/telegram.js.map +2 -2
- package/build/main.js +31 -14
- package/build/main.js.map +2 -2
- package/io-package.json +28 -28
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/telegram.ts"],
|
|
4
|
-
"sourcesContent": ["import { debug, error } from './logging';\nimport { newLine, getChatID, checkStatusInfo } from './utilities';\nimport TelegramMenu from '../main';\nimport type { NavPart, UserListWithChatId, BooleanString, ParseModeType, Location } from './telegram-menu';\n\nasync function sendToTelegram(\n user = '',\n textToSend: string,\n keyboard: NavPart = [],\n instance = 'telegram.0',\n resize_keyboard = true,\n one_time_keyboard = true,\n userListWithChatID: UserListWithChatId[],\n parse_mode: BooleanString
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAC7B,uBAAoD;AACpD,kBAAyB;
|
|
4
|
+
"sourcesContent": ["import { debug, error } from './logging';\nimport { newLine, getChatID, checkStatusInfo } from './utilities';\nimport TelegramMenu from '../main';\nimport type { NavPart, UserListWithChatId, BooleanString, ParseModeType, Location } from './telegram-menu';\nimport { isTruthy } from './global';\n\nasync function sendToTelegram(\n user = '',\n textToSend: string,\n keyboard: NavPart = [],\n instance = 'telegram.0',\n resize_keyboard = true,\n one_time_keyboard = true,\n userListWithChatID: UserListWithChatId[],\n parse_mode: BooleanString,\n): Promise<void> {\n try {\n const _this = TelegramMenu.getInstance();\n const chatId = getChatID(userListWithChatID, user);\n const parse_modeType: ParseModeType = getParseMode(parse_mode);\n debug([\n { text: `Send to: ${user} => ${textToSend}` },\n { text: 'Instance:', val: instance },\n { text: 'UserListWithChatID\t:', val: userListWithChatID },\n { text: 'Parse_mode\t:', val: parse_mode },\n { text: 'ChatId\t:', val: chatId },\n { text: 'ParseModeType:', val: parse_modeType },\n ]);\n\n textToSend = newLine(textToSend);\n if (keyboard.length == 0) {\n _this.log.debug('No Keyboard');\n _this.sendTo(\n instance,\n 'send',\n {\n text: textToSend,\n chatId: chatId,\n parse_mode: parse_modeType,\n },\n function (res: any) {\n _this.log.debug(`Sent Value to ${JSON.stringify(res)} users!`);\n },\n );\n } else {\n const text = await checkStatusInfo(textToSend);\n _this.sendTo(\n instance,\n 'send',\n {\n chatId: chatId,\n parse_mode: parse_modeType,\n text: text,\n reply_markup: {\n keyboard: keyboard,\n resize_keyboard: resize_keyboard,\n one_time_keyboard: one_time_keyboard,\n },\n },\n function (res: any) {\n debug([{ text: `Sent Value to ${res} users!` }]);\n },\n );\n }\n } catch (e: any) {\n error([\n { text: 'Error sendToTelegram:', val: e.message },\n { text: 'Stack:', val: e.stack },\n ]);\n }\n}\n\nfunction sendToTelegramSubmenu(\n user: string,\n textToSend: string,\n keyboard: string,\n instance = 'telegram.0',\n userListWithChatID: UserListWithChatId[],\n parse_mode: BooleanString,\n): void {\n const _this = TelegramMenu.getInstance();\n const parseModeType = getParseMode(parse_mode);\n debug([{ text: 'Send this ParseMode:', val: parseModeType }]);\n try {\n const chatId = getChatID(userListWithChatID, user);\n textToSend = newLine(textToSend);\n _this.sendTo(instance, 'send', {\n chatId: chatId,\n parse_mode: parseModeType,\n text: textToSend,\n reply_markup: keyboard,\n });\n } catch (e: any) {\n error([\n { text: 'Error sendToTelegramSubmenu:', val: e.message },\n { text: 'Stack:', val: e.stack },\n ]);\n }\n}\n\nconst sendLocationToTelegram = async (\n user: string,\n data: Location[],\n instance: string,\n userListWithChatID: UserListWithChatId[],\n): Promise<void> => {\n const _this = TelegramMenu.getInstance();\n try {\n const chatId = getChatID(userListWithChatID, user);\n for (const element of data) {\n if (!(element.latitude || element.longitude)) {\n continue;\n }\n\n const latitude = await _this.getForeignStateAsync(element.latitude);\n const longitude = await _this.getForeignStateAsync(element.longitude);\n if (!latitude || !longitude) {\n continue;\n }\n _this.sendTo(instance, {\n chatId: chatId,\n latitude: latitude.val,\n longitude: longitude.val,\n disable_notification: true,\n });\n }\n } catch (e: any) {\n error([\n { text: 'Error sendLocationToTelegram:', val: e.message },\n { text: 'Stack:', val: e.stack },\n ]);\n }\n};\n\nfunction getParseMode(val: BooleanString | boolean): ParseModeType {\n if (isTruthy(val)) {\n return 'HTML';\n }\n return 'Markdown';\n}\n\nexport { sendToTelegram, sendToTelegramSubmenu, sendLocationToTelegram };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["TelegramMenu"]
|
|
7
7
|
}
|
package/build/main.js
CHANGED
|
@@ -234,26 +234,37 @@ class TelegramMenu extends utils.Adapter {
|
|
|
234
234
|
resize_keyboard,
|
|
235
235
|
one_time_keyboard,
|
|
236
236
|
userListWithChatID,
|
|
237
|
-
""
|
|
237
|
+
"false"
|
|
238
238
|
);
|
|
239
239
|
}
|
|
240
240
|
return;
|
|
241
241
|
}
|
|
242
242
|
if (state && setStateIdsToListenTo && setStateIdsToListenTo.find((element) => element.id == id)) {
|
|
243
|
-
(0, import_logging.debug)([
|
|
243
|
+
(0, import_logging.debug)([
|
|
244
|
+
{ text: "State, which is listen to was changed:", val: id },
|
|
245
|
+
{ text: "State:", val: state }
|
|
246
|
+
]);
|
|
244
247
|
setStateIdsToListenTo.forEach((element, key) => {
|
|
245
248
|
var _a, _b;
|
|
246
249
|
if (element.id == id) {
|
|
247
|
-
(0, import_logging.debug)([
|
|
248
|
-
|
|
250
|
+
(0, import_logging.debug)([
|
|
251
|
+
{ text: "Send Value:", val: element },
|
|
252
|
+
{ text: "Ack:", val: state.ack }
|
|
253
|
+
]);
|
|
254
|
+
if (!(0, import_global.isFalsy)(element.confirm) && !(state == null ? void 0 : state.ack) && element.returnText.includes("{confirmSet:")) {
|
|
249
255
|
const substring = (0, import_utilities.decomposeText)(
|
|
250
256
|
element.returnText,
|
|
251
257
|
"{confirmSet:",
|
|
252
258
|
"}"
|
|
253
259
|
).substring.split(":");
|
|
260
|
+
(0, import_logging.debug)([{ text: "Substring:", val: substring }]);
|
|
254
261
|
let text = "";
|
|
255
|
-
if (state.val) {
|
|
256
|
-
text = substring[2] && substring[2].includes("noValue") ? substring[1] : (0, import_action.exchangePlaceholderWithValue)(substring[1], state.val);
|
|
262
|
+
if ((0, import_global.isDefined)(state.val)) {
|
|
263
|
+
text = substring[2] && substring[2].includes("noValue") ? substring[1] : (0, import_action.exchangePlaceholderWithValue)(substring[1], state.val.toString());
|
|
264
|
+
}
|
|
265
|
+
(0, import_logging.debug)([{ text: "Return-text:", val: text }]);
|
|
266
|
+
if (text === "") {
|
|
267
|
+
(0, import_logging.error)([{ text: "The return text cannot be empty, please check." }]);
|
|
257
268
|
}
|
|
258
269
|
(0, import_telegram.sendToTelegram)(
|
|
259
270
|
element.userToSend,
|
|
@@ -273,15 +284,20 @@ class TelegramMenu extends utils.Adapter {
|
|
|
273
284
|
});
|
|
274
285
|
return;
|
|
275
286
|
}
|
|
276
|
-
|
|
277
|
-
|
|
287
|
+
(0, import_logging.debug)([
|
|
288
|
+
{
|
|
289
|
+
text: "Data: ",
|
|
290
|
+
val: { confirm: element.confirm, ack: state == null ? void 0 : state.ack, val: state == null ? void 0 : state.val }
|
|
291
|
+
}
|
|
292
|
+
]);
|
|
293
|
+
if (!(0, import_global.isFalsy)(element.confirm) && (state == null ? void 0 : state.ack)) {
|
|
278
294
|
let textToSend = element.returnText;
|
|
279
295
|
if (textToSend.includes("{confirmSet:")) {
|
|
280
296
|
const substring = (0, import_utilities.decomposeText)(textToSend, "{confirmSet:", "}").substring;
|
|
281
297
|
textToSend = textToSend.replace(substring, "");
|
|
282
298
|
}
|
|
283
299
|
let value = "";
|
|
284
|
-
let valueChange =
|
|
300
|
+
let valueChange = null;
|
|
285
301
|
const resultChange = (0, import_utilities.changeValue)(textToSend, ((_a = state.val) == null ? void 0 : _a.toString()) || "");
|
|
286
302
|
if (resultChange) {
|
|
287
303
|
valueChange = resultChange.val;
|
|
@@ -290,10 +306,13 @@ class TelegramMenu extends utils.Adapter {
|
|
|
290
306
|
if (textToSend == null ? void 0 : textToSend.toString().includes("{novalue}")) {
|
|
291
307
|
value = "";
|
|
292
308
|
textToSend = textToSend.replace("{novalue}", "");
|
|
293
|
-
} else if ((state == null ? void 0 : state.val)
|
|
294
|
-
value = (_b = state.val) == null ? void 0 : _b.toString();
|
|
309
|
+
} else if ((0, import_global.isDefined)(state == null ? void 0 : state.val)) {
|
|
310
|
+
value = ((_b = state.val) == null ? void 0 : _b.toString()) || "";
|
|
311
|
+
}
|
|
312
|
+
if (valueChange) {
|
|
313
|
+
value = valueChange;
|
|
295
314
|
}
|
|
296
|
-
|
|
315
|
+
(0, import_logging.debug)([{ text: "Value to send:", val: value }]);
|
|
297
316
|
textToSend = (0, import_action.exchangePlaceholderWithValue)(textToSend, value);
|
|
298
317
|
(0, import_telegram.sendToTelegram)(
|
|
299
318
|
element.userToSend,
|
|
@@ -334,7 +353,6 @@ class TelegramMenu extends utils.Adapter {
|
|
|
334
353
|
return !!(id.includes("alexa-shoppinglist") && !id.includes("add_position") && userToSend);
|
|
335
354
|
}
|
|
336
355
|
isMenuToSend(state, id, telegramID, userToSend) {
|
|
337
|
-
this.log.debug(`User in Abfrage: ${userToSend}`);
|
|
338
356
|
return !!(state && typeof state.val === "string" && state.val != "" && id == telegramID && (state == null ? void 0 : state.ack) && userToSend);
|
|
339
357
|
}
|
|
340
358
|
async checkInfoConnection(id, infoConnectionOfTelegram) {
|
|
@@ -355,7 +373,6 @@ class TelegramMenu extends utils.Adapter {
|
|
|
355
373
|
return;
|
|
356
374
|
}
|
|
357
375
|
const userToSend = (0, import_action.getUserToSendFromUserListWithChatID)(userListWithChatID, chatID.val.toString());
|
|
358
|
-
this.log.debug(JSON.stringify(`User to send: ${userToSend}`));
|
|
359
376
|
if (!userToSend) {
|
|
360
377
|
this.log.debug("User to send not found");
|
|
361
378
|
return;
|
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["'use strict';\n/*\n * Created with @iobroker/create-adapter v2.3.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\n\nimport {\n generateActions,\n generateNewObjectStructure,\n editArrayButtons,\n getUserToSendFromUserListWithChatID,\n getMenusWithUserToSend,\n exchangePlaceholderWithValue,\n checkEvent,\n} from './lib/action.js';\nimport { _subscribeForeignStatesAsync } from './lib/subscribeStates.js';\nimport { sendToTelegram } from './lib/telegram.js';\nimport { decomposeText, changeValue } from './lib/utilities.js';\nimport { createState } from './lib/createState.js';\nimport { saveMessageIds } from './lib/messageIds.js';\nimport { adapterStartMenuSend } from './lib/adapterStartMenuSend.js';\nimport { getStateIdsToListenTo, checkEveryMenuForData, getTimeouts } from './lib/processData.js';\nimport { shoppingListSubscribeStateAndDeleteItem, deleteMessageAndSendNewShoppingList } from './lib/shoppingList.js';\nimport { debug, error } from './lib/logging.js';\n\nimport type {\n Checkboxes,\n ListOfMenus,\n IsUserActiveCheckbox,\n MenusWithUsers,\n UserListWithChatId,\n DataObject,\n StartSides,\n MenuData,\n GeneratedActions,\n SetStateIds,\n NewObjectNavStructureKey,\n} from './lib/telegram-menu.js';\nimport type { BooleanString } from '@/types/app.js';\nimport { checkIsTelegramActive } from './lib/connection.js';\nimport { isString } from './lib/global';\n\nconst timeoutKey = '0';\nlet subscribeForeignStateIds: string[];\n\nexport default class TelegramMenu extends utils.Adapter {\n private static instance: TelegramMenu;\n\n /**\n * @param [options] - Adapter options\n */\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'telegram-menu',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n TelegramMenu.instance = this;\n }\n\n public static getInstance(): TelegramMenu {\n return TelegramMenu.instance;\n }\n\n private async onReady(): Promise<void> {\n await this.setState('info.connection', false, true);\n await createState(this);\n\n let instanceTelegram: string = this.config.instance;\n if (!instanceTelegram || instanceTelegram.length == 0) {\n instanceTelegram = 'telegram.0';\n }\n const telegramID = `${instanceTelegram}.communicate.request`;\n const botSendMessageID = `${instanceTelegram}.communicate.botSendMessageId`;\n const requestMessageID = `${instanceTelegram}.communicate.requestMessageId`;\n const infoConnectionOfTelegram = `${instanceTelegram}.info.connection`;\n\n const checkboxes: Checkboxes = this.config.checkbox as Checkboxes;\n const one_time_keyboard: boolean = checkboxes.oneTiKey;\n const resize_keyboard: boolean = checkboxes.resKey;\n const checkboxNoEntryFound: boolean = checkboxes.checkboxNoValueFound;\n const sendMenuAfterRestart: boolean = checkboxes.sendMenuAfterRestart;\n let listOfMenus: ListOfMenus = [];\n if (this.config.usersInGroup) {\n listOfMenus = Object.keys(this.config.usersInGroup);\n }\n const token = this.config.tokenGrafana;\n const directoryPicture: string = this.config.directory;\n const isUserActiveCheckbox: IsUserActiveCheckbox = this.config.userActiveCheckbox;\n const menusWithUsers: MenusWithUsers = this.config.usersInGroup;\n const textNoEntryFound: string = this.config.textNoEntry;\n const userListWithChatID: UserListWithChatId[] = this.config.userListWithChatID;\n const dataObject: DataObject = this.config.data as DataObject;\n const startSides: StartSides = {};\n\n const menuData: MenuData = {\n data: {},\n } as MenuData;\n\n Object.keys(menusWithUsers).forEach(element => {\n startSides[element] = dataObject.nav[element][0].call;\n });\n\n await this.getForeignObject(infoConnectionOfTelegram, async (err, obj) => {\n try {\n if (err || obj == null) {\n this.log.error(`The State ${infoConnectionOfTelegram} was not found! ${err}`);\n return;\n }\n\n const isTelegramActive = await checkIsTelegramActive(infoConnectionOfTelegram);\n if (!isTelegramActive) {\n return;\n }\n\n const { nav, action } = dataObject;\n\n this.log.info('Telegram was found');\n\n for (const name in nav) {\n const value = editArrayButtons(nav[name], this);\n\n const newObjectStructure = generateNewObjectStructure(value);\n if (newObjectStructure) {\n menuData.data[name] = newObjectStructure;\n }\n\n const generatedActions: GeneratedActions | undefined = generateActions(\n action[name],\n menuData.data[name],\n );\n if (generatedActions) {\n menuData.data[name] = generatedActions?.obj;\n subscribeForeignStateIds = generatedActions?.ids;\n } else {\n debug([{ text: 'No Actions generated!' }]);\n }\n\n if (subscribeForeignStateIds && subscribeForeignStateIds?.length > 0) {\n await _subscribeForeignStatesAsync(subscribeForeignStateIds);\n } else {\n debug([{ text: 'Nothing to Subscribe!' }]);\n }\n\n // Subscribe Events\n if (dataObject.action[name] && dataObject.action[name].events) {\n for (const event of dataObject.action[name].events) {\n await _subscribeForeignStatesAsync([event.ID]);\n }\n }\n debug([\n { text: 'Menu: ', val: name },\n { text: 'Array Buttons: ', val: value },\n { text: 'Gen. Actions: ', val: menuData.data[name] },\n ]);\n }\n debug([\n { text: 'Checkbox', val: checkboxes },\n { text: 'MenuList', val: listOfMenus },\n ]);\n\n if (sendMenuAfterRestart) {\n await adapterStartMenuSend(\n listOfMenus,\n startSides,\n isUserActiveCheckbox,\n menusWithUsers,\n menuData,\n userListWithChatID,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n );\n }\n\n this.on('stateChange', async (id, state) => {\n const setStateIdsToListenTo: SetStateIds[] = getStateIdsToListenTo();\n\n const isActive = await this.checkInfoConnection(id, infoConnectionOfTelegram);\n if (!isActive) {\n return;\n }\n\n const obj = await this.getChatIDAndUserToSend(instanceTelegram, userListWithChatID);\n if (!obj) {\n return;\n }\n\n const { userToSend } = obj;\n\n if (isString(state?.val) && state.val.includes('sList:')) {\n await shoppingListSubscribeStateAndDeleteItem(\n state.val,\n instanceTelegram,\n userListWithChatID,\n resize_keyboard,\n one_time_keyboard,\n );\n\n return;\n }\n\n if (this.isAddToShoppingList(id, userToSend)) {\n await deleteMessageAndSendNewShoppingList(instanceTelegram, userListWithChatID, userToSend);\n return;\n }\n\n if (\n state &&\n (await checkEvent(\n dataObject,\n id,\n state,\n menuData,\n userListWithChatID,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n menusWithUsers,\n ))\n ) {\n return;\n }\n\n if (this.isMessageID(id, botSendMessageID, requestMessageID) && state) {\n await saveMessageIds(state, instanceTelegram);\n } else if (this.isMenuToSend(state, id, telegramID, userToSend)) {\n let value = state?.val;\n if (!value || !userToSend) {\n return;\n }\n\n value = value.toString();\n const calledValue = value.slice(value.indexOf(']') + 1, value.length);\n const menus: NewObjectNavStructureKey[] = getMenusWithUserToSend(menusWithUsers, userToSend);\n\n const dataFound = await checkEveryMenuForData({\n menuData,\n calledValue,\n userToSend,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n menus,\n isUserActiveCheckbox,\n token,\n directoryPicture,\n timeoutKey,\n });\n\n debug([\n { text: 'Groups with searched User:', val: menus },\n { text: 'Data found:', val: dataFound },\n ]);\n\n if (!dataFound && checkboxNoEntryFound && userToSend) {\n debug([{ text: 'No Entry found' }]);\n await sendToTelegram(\n userToSend,\n textNoEntryFound,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n '',\n );\n }\n return;\n }\n if (\n state &&\n setStateIdsToListenTo &&\n setStateIdsToListenTo.find((element: { id: string }) => element.id == id)\n ) {\n debug([{ text: 'State, which is listen to was changed:', val: id }]);\n\n setStateIdsToListenTo.forEach((element, key: number) => {\n if (element.id == id) {\n debug([{ text: 'Send Value:', val: element }]);\n\n if (\n element.confirm != 'false' &&\n !state?.ack &&\n element.returnText.includes('{confirmSet:')\n ) {\n const substring = decomposeText(\n element.returnText,\n '{confirmSet:',\n '}',\n ).substring.split(':');\n let text = '';\n if (state.val) {\n text =\n substring[2] && substring[2].includes('noValue')\n ? substring[1]\n : exchangePlaceholderWithValue(substring[1], state.val as string);\n }\n\n sendToTelegram(\n element.userToSend,\n text,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n element.parse_mode as BooleanString,\n ).catch((e: { message: any; stack: any }) => {\n error([\n { text: 'Error SendToTelegram' },\n { val: e.message },\n { text: 'Error', val: e.stack },\n ]);\n });\n return;\n }\n if (element.confirm != 'false' && state?.ack) {\n debug([{ text: 'User:', val: element.userToSend }]);\n let textToSend = element.returnText;\n\n if (textToSend.includes('{confirmSet:')) {\n const substring = decomposeText(textToSend, '{confirmSet:', '}').substring;\n textToSend = textToSend.replace(substring, '');\n }\n\n let value: string | number = '';\n let valueChange: string | number = '';\n const resultChange = changeValue(textToSend, state.val?.toString() || '');\n if (resultChange) {\n valueChange = resultChange.val;\n textToSend = resultChange.textToSend;\n }\n\n if (textToSend?.toString().includes('{novalue}')) {\n value = '';\n textToSend = textToSend.replace('{novalue}', '');\n } else if (state?.val == false) {\n value = state.val?.toString();\n }\n\n valueChange ? (value = valueChange) : value;\n textToSend = exchangePlaceholderWithValue(textToSend, value);\n\n sendToTelegram(\n element.userToSend,\n textToSend,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n element.parse_mode as BooleanString,\n ).catch((e: { message: any; stack: any }) => {\n error([\n { text: 'Error sendToTelegram' },\n { val: e.message },\n { text: 'Error', val: e.stack },\n ]);\n });\n\n setStateIdsToListenTo.splice(key, 1);\n }\n }\n });\n }\n });\n } catch (e: any) {\n error([{ text: 'Error onReady' }, { val: e.message }, { text: 'Error', val: e.stack }]);\n }\n });\n\n await this.subscribeForeignStatesAsync(botSendMessageID);\n await this.subscribeForeignStatesAsync(requestMessageID);\n await this.subscribeForeignStatesAsync(`${instanceTelegram}.communicate.requestChatId`);\n await this.subscribeForeignStatesAsync(telegramID);\n await this.subscribeForeignStatesAsync(`${instanceTelegram}.info.connection`);\n }\n\n private isMessageID(id: string, botSendMessageID: string, requestMessageID: string): boolean {\n return id == botSendMessageID || id == requestMessageID;\n }\n\n private isAddToShoppingList(id: string, userToSend: string): boolean {\n return !!(id.includes('alexa-shoppinglist') && !id.includes('add_position') && userToSend);\n }\n\n private isMenuToSend(\n state: ioBroker.State | null | undefined,\n id: string,\n telegramID: string,\n userToSend: string | null,\n ): boolean {\n this.log.debug(`User in Abfrage: ${userToSend}`);\n\n return !!(\n state &&\n typeof state.val === 'string' &&\n state.val != '' &&\n id == telegramID &&\n state?.ack &&\n userToSend\n );\n }\n\n private async checkInfoConnection(id: string, infoConnectionOfTelegram: string): Promise<boolean> {\n if (id === infoConnectionOfTelegram) {\n const isActive = await checkIsTelegramActive(infoConnectionOfTelegram);\n if (!isActive) {\n this.log.debug('Telegram is not active');\n return false;\n }\n return true;\n }\n return true;\n }\n\n private async getChatIDAndUserToSend(\n instanceTelegram: string,\n userListWithChatID: UserListWithChatId[],\n ): Promise<{ chatID: string; userToSend: string } | undefined> {\n const chatID = await this.getForeignStateAsync(`${instanceTelegram}.communicate.requestChatId`);\n\n if (!chatID?.val) {\n debug([{ text: 'ChatID not found' }]);\n return;\n }\n\n const userToSend = getUserToSendFromUserListWithChatID(userListWithChatID, chatID.val.toString());\n this.log.debug(JSON.stringify(`User to send: ${userToSend}`));\n if (!userToSend) {\n this.log.debug('User to send not found');\n return;\n }\n return { chatID: chatID.val.toString(), userToSend };\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback - Is called when adapter has closed all connections and released all resources\n */\n private onUnload(callback: () => void): void {\n const timeouts = getTimeouts();\n try {\n // Here you must clear all timeouts or intervals that may still be active\n timeouts.forEach((element: { timeout: string | number | NodeJS.Timeout | undefined }) => {\n clearTimeout(element.timeout);\n });\n\n callback();\n } catch (e: any) {\n this.log.error(`Error onUnload ${e}`);\n callback();\n }\n }\n\n onMessage(obj: ioBroker.Message): void {\n if (typeof obj === 'object' && obj.message) {\n if (obj.command === 'send') {\n // e.g. send email or pushover or whatever\n this.log.info('send command');\n\n // Send response in callback if required\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, 'Message received', obj.callback);\n }\n }\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n /**\n * @param [options] - Adapter options\n */\n module.exports = (options: Partial<utils.AdapterOptions<undefined, undefined>> | undefined) =>\n new TelegramMenu(options);\n} else {\n // otherwise start the instance directly\n new TelegramMenu();\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,YAAuB;AAEvB,oBAQO;AACP,6BAA6C;AAC7C,sBAA+B;AAC/B,uBAA2C;AAC3C,yBAA4B;AAC5B,wBAA+B;AAC/B,kCAAqC;AACrC,yBAA0E;AAC1E,0BAA6F;AAC7F,qBAA6B;AAgB7B,wBAAsC;AACtC,
|
|
4
|
+
"sourcesContent": ["'use strict';\n/*\n * Created with @iobroker/create-adapter v2.3.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\n\nimport {\n checkEvent,\n editArrayButtons,\n exchangePlaceholderWithValue,\n generateActions,\n generateNewObjectStructure,\n getMenusWithUserToSend,\n getUserToSendFromUserListWithChatID,\n} from './lib/action.js';\nimport { _subscribeForeignStatesAsync } from './lib/subscribeStates.js';\nimport { sendToTelegram } from './lib/telegram.js';\nimport { changeValue, decomposeText } from './lib/utilities.js';\nimport { createState } from './lib/createState.js';\nimport { saveMessageIds } from './lib/messageIds.js';\nimport { adapterStartMenuSend } from './lib/adapterStartMenuSend.js';\nimport { checkEveryMenuForData, getStateIdsToListenTo, getTimeouts } from './lib/processData.js';\nimport { deleteMessageAndSendNewShoppingList, shoppingListSubscribeStateAndDeleteItem } from './lib/shoppingList.js';\nimport { debug, error } from './lib/logging.js';\n\nimport type {\n Checkboxes,\n DataObject,\n GeneratedActions,\n IsUserActiveCheckbox,\n ListOfMenus,\n MenuData,\n MenusWithUsers,\n NewObjectNavStructureKey,\n SetStateIds,\n StartSides,\n UserListWithChatId,\n} from './lib/telegram-menu.js';\nimport type { BooleanString } from '@/types/app.js';\nimport { checkIsTelegramActive } from './lib/connection.js';\nimport { isDefined, isFalsy, isString } from './lib/global';\n\nconst timeoutKey = '0';\nlet subscribeForeignStateIds: string[];\n\nexport default class TelegramMenu extends utils.Adapter {\n private static instance: TelegramMenu;\n\n /**\n * @param [options] - Adapter options\n */\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'telegram-menu',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n TelegramMenu.instance = this;\n }\n\n public static getInstance(): TelegramMenu {\n return TelegramMenu.instance;\n }\n\n private async onReady(): Promise<void> {\n await this.setState('info.connection', false, true);\n await createState(this);\n\n let instanceTelegram: string = this.config.instance;\n if (!instanceTelegram || instanceTelegram.length == 0) {\n instanceTelegram = 'telegram.0';\n }\n const telegramID = `${instanceTelegram}.communicate.request`;\n const botSendMessageID = `${instanceTelegram}.communicate.botSendMessageId`;\n const requestMessageID = `${instanceTelegram}.communicate.requestMessageId`;\n const infoConnectionOfTelegram = `${instanceTelegram}.info.connection`;\n\n const checkboxes: Checkboxes = this.config.checkbox as Checkboxes;\n const one_time_keyboard: boolean = checkboxes.oneTiKey;\n const resize_keyboard: boolean = checkboxes.resKey;\n const checkboxNoEntryFound: boolean = checkboxes.checkboxNoValueFound;\n const sendMenuAfterRestart: boolean = checkboxes.sendMenuAfterRestart;\n let listOfMenus: ListOfMenus = [];\n if (this.config.usersInGroup) {\n listOfMenus = Object.keys(this.config.usersInGroup);\n }\n const token = this.config.tokenGrafana;\n const directoryPicture: string = this.config.directory;\n const isUserActiveCheckbox: IsUserActiveCheckbox = this.config.userActiveCheckbox;\n const menusWithUsers: MenusWithUsers = this.config.usersInGroup;\n const textNoEntryFound: string = this.config.textNoEntry;\n const userListWithChatID: UserListWithChatId[] = this.config.userListWithChatID;\n const dataObject: DataObject = this.config.data as DataObject;\n const startSides: StartSides = {};\n\n const menuData: MenuData = {\n data: {},\n } as MenuData;\n\n Object.keys(menusWithUsers).forEach(element => {\n startSides[element] = dataObject.nav[element][0].call;\n });\n\n await this.getForeignObject(infoConnectionOfTelegram, async (err, obj) => {\n try {\n if (err || obj == null) {\n this.log.error(`The State ${infoConnectionOfTelegram} was not found! ${err}`);\n return;\n }\n\n const isTelegramActive = await checkIsTelegramActive(infoConnectionOfTelegram);\n if (!isTelegramActive) {\n return;\n }\n\n const { nav, action } = dataObject;\n\n this.log.info('Telegram was found');\n\n for (const name in nav) {\n const value = editArrayButtons(nav[name], this);\n\n const newObjectStructure = generateNewObjectStructure(value);\n if (newObjectStructure) {\n menuData.data[name] = newObjectStructure;\n }\n\n const generatedActions: GeneratedActions | undefined = generateActions(\n action[name],\n menuData.data[name],\n );\n if (generatedActions) {\n menuData.data[name] = generatedActions?.obj;\n subscribeForeignStateIds = generatedActions?.ids;\n } else {\n debug([{ text: 'No Actions generated!' }]);\n }\n\n if (subscribeForeignStateIds && subscribeForeignStateIds?.length > 0) {\n await _subscribeForeignStatesAsync(subscribeForeignStateIds);\n } else {\n debug([{ text: 'Nothing to Subscribe!' }]);\n }\n\n // Subscribe Events\n if (dataObject.action[name] && dataObject.action[name].events) {\n for (const event of dataObject.action[name].events) {\n await _subscribeForeignStatesAsync([event.ID]);\n }\n }\n debug([\n { text: 'Menu: ', val: name },\n { text: 'Array Buttons: ', val: value },\n { text: 'Gen. Actions: ', val: menuData.data[name] },\n ]);\n }\n debug([\n { text: 'Checkbox', val: checkboxes },\n { text: 'MenuList', val: listOfMenus },\n ]);\n\n if (sendMenuAfterRestart) {\n await adapterStartMenuSend(\n listOfMenus,\n startSides,\n isUserActiveCheckbox,\n menusWithUsers,\n menuData,\n userListWithChatID,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n );\n }\n\n this.on('stateChange', async (id, state) => {\n const setStateIdsToListenTo: SetStateIds[] = getStateIdsToListenTo();\n\n const isActive = await this.checkInfoConnection(id, infoConnectionOfTelegram);\n if (!isActive) {\n return;\n }\n\n const obj = await this.getChatIDAndUserToSend(instanceTelegram, userListWithChatID);\n if (!obj) {\n return;\n }\n\n const { userToSend } = obj;\n\n if (isString(state?.val) && state.val.includes('sList:')) {\n await shoppingListSubscribeStateAndDeleteItem(\n state.val,\n instanceTelegram,\n userListWithChatID,\n resize_keyboard,\n one_time_keyboard,\n );\n\n return;\n }\n\n if (this.isAddToShoppingList(id, userToSend)) {\n await deleteMessageAndSendNewShoppingList(instanceTelegram, userListWithChatID, userToSend);\n return;\n }\n\n if (\n state &&\n (await checkEvent(\n dataObject,\n id,\n state,\n menuData,\n userListWithChatID,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n menusWithUsers,\n ))\n ) {\n return;\n }\n\n if (this.isMessageID(id, botSendMessageID, requestMessageID) && state) {\n await saveMessageIds(state, instanceTelegram);\n } else if (this.isMenuToSend(state, id, telegramID, userToSend)) {\n let value = state?.val;\n if (!value || !userToSend) {\n return;\n }\n\n value = value.toString();\n const calledValue = value.slice(value.indexOf(']') + 1, value.length);\n const menus: NewObjectNavStructureKey[] = getMenusWithUserToSend(menusWithUsers, userToSend);\n\n const dataFound = await checkEveryMenuForData({\n menuData,\n calledValue,\n userToSend,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n menus,\n isUserActiveCheckbox,\n token,\n directoryPicture,\n timeoutKey,\n });\n\n debug([\n { text: 'Groups with searched User:', val: menus },\n { text: 'Data found:', val: dataFound },\n ]);\n\n if (!dataFound && checkboxNoEntryFound && userToSend) {\n debug([{ text: 'No Entry found' }]);\n await sendToTelegram(\n userToSend,\n textNoEntryFound,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n 'false',\n );\n }\n return;\n }\n if (\n state &&\n setStateIdsToListenTo &&\n setStateIdsToListenTo.find((element: { id: string }) => element.id == id)\n ) {\n debug([\n { text: 'State, which is listen to was changed:', val: id },\n { text: 'State:', val: state },\n ]);\n\n setStateIdsToListenTo.forEach((element, key: number) => {\n if (element.id == id) {\n debug([\n { text: 'Send Value:', val: element },\n { text: 'Ack:', val: state.ack },\n ]);\n\n if (\n !isFalsy(element.confirm) &&\n !state?.ack &&\n element.returnText.includes('{confirmSet:')\n ) {\n const substring = decomposeText(\n element.returnText,\n '{confirmSet:',\n '}',\n ).substring.split(':');\n debug([{ text: 'Substring:', val: substring }]);\n let text = '';\n if (isDefined(state.val)) {\n text =\n substring[2] && substring[2].includes('noValue')\n ? substring[1]\n : exchangePlaceholderWithValue(substring[1], state.val.toString());\n }\n debug([{ text: 'Return-text:', val: text }]);\n\n if (text === '') {\n error([{ text: 'The return text cannot be empty, please check.' }]);\n }\n\n sendToTelegram(\n element.userToSend,\n text,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n element.parse_mode as BooleanString,\n ).catch((e: { message: any; stack: any }) => {\n error([\n { text: 'Error SendToTelegram' },\n { val: e.message },\n { text: 'Error', val: e.stack },\n ]);\n });\n return;\n }\n debug([\n {\n text: 'Data: ',\n val: { confirm: element.confirm, ack: state?.ack, val: state?.val },\n },\n ]);\n if (!isFalsy(element.confirm) && state?.ack) {\n let textToSend = element.returnText;\n\n if (textToSend.includes('{confirmSet:')) {\n const substring = decomposeText(textToSend, '{confirmSet:', '}').substring;\n textToSend = textToSend.replace(substring, '');\n }\n\n let value: string | number = '';\n let valueChange: string | number | null = null;\n const resultChange = changeValue(textToSend, state.val?.toString() || '');\n if (resultChange) {\n valueChange = resultChange.val;\n textToSend = resultChange.textToSend;\n }\n\n if (textToSend?.toString().includes('{novalue}')) {\n value = '';\n textToSend = textToSend.replace('{novalue}', '');\n } else if (isDefined(state?.val)) {\n value = state.val?.toString() || '';\n }\n if (valueChange) {\n value = valueChange;\n }\n\n debug([{ text: 'Value to send:', val: value }]);\n textToSend = exchangePlaceholderWithValue(textToSend, value);\n\n sendToTelegram(\n element.userToSend,\n textToSend,\n undefined,\n instanceTelegram,\n resize_keyboard,\n one_time_keyboard,\n userListWithChatID,\n element.parse_mode as BooleanString,\n ).catch((e: { message: any; stack: any }) => {\n error([\n { text: 'Error sendToTelegram' },\n { val: e.message },\n { text: 'Error', val: e.stack },\n ]);\n });\n\n setStateIdsToListenTo.splice(key, 1);\n }\n }\n });\n }\n });\n } catch (e: any) {\n error([{ text: 'Error onReady' }, { val: e.message }, { text: 'Error', val: e.stack }]);\n }\n });\n\n await this.subscribeForeignStatesAsync(botSendMessageID);\n await this.subscribeForeignStatesAsync(requestMessageID);\n await this.subscribeForeignStatesAsync(`${instanceTelegram}.communicate.requestChatId`);\n await this.subscribeForeignStatesAsync(telegramID);\n await this.subscribeForeignStatesAsync(`${instanceTelegram}.info.connection`);\n }\n\n private isMessageID(id: string, botSendMessageID: string, requestMessageID: string): boolean {\n return id == botSendMessageID || id == requestMessageID;\n }\n\n private isAddToShoppingList(id: string, userToSend: string): boolean {\n return !!(id.includes('alexa-shoppinglist') && !id.includes('add_position') && userToSend);\n }\n\n private isMenuToSend(\n state: ioBroker.State | null | undefined,\n id: string,\n telegramID: string,\n userToSend: string | null,\n ): boolean {\n return !!(\n state &&\n typeof state.val === 'string' &&\n state.val != '' &&\n id == telegramID &&\n state?.ack &&\n userToSend\n );\n }\n\n private async checkInfoConnection(id: string, infoConnectionOfTelegram: string): Promise<boolean> {\n if (id === infoConnectionOfTelegram) {\n const isActive = await checkIsTelegramActive(infoConnectionOfTelegram);\n if (!isActive) {\n this.log.debug('Telegram is not active');\n return false;\n }\n return true;\n }\n return true;\n }\n\n private async getChatIDAndUserToSend(\n instanceTelegram: string,\n userListWithChatID: UserListWithChatId[],\n ): Promise<{ chatID: string; userToSend: string } | undefined> {\n const chatID = await this.getForeignStateAsync(`${instanceTelegram}.communicate.requestChatId`);\n\n if (!chatID?.val) {\n debug([{ text: 'ChatID not found' }]);\n return;\n }\n\n const userToSend = getUserToSendFromUserListWithChatID(userListWithChatID, chatID.val.toString());\n if (!userToSend) {\n this.log.debug('User to send not found');\n return;\n }\n return { chatID: chatID.val.toString(), userToSend };\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback - Is called when adapter has closed all connections and released all resources\n */\n private onUnload(callback: () => void): void {\n const timeouts = getTimeouts();\n try {\n // Here you must clear all timeouts or intervals that may still be active\n timeouts.forEach((element: { timeout: string | number | NodeJS.Timeout | undefined }) => {\n clearTimeout(element.timeout);\n });\n\n callback();\n } catch (e: any) {\n this.log.error(`Error onUnload ${e}`);\n callback();\n }\n }\n\n onMessage(obj: ioBroker.Message): void {\n if (typeof obj === 'object' && obj.message) {\n if (obj.command === 'send') {\n // e.g. send email or pushover or whatever\n this.log.info('send command');\n\n // Send response in callback if required\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, 'Message received', obj.callback);\n }\n }\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n /**\n * @param [options] - Adapter options\n */\n module.exports = (options: Partial<utils.AdapterOptions<undefined, undefined>> | undefined) =>\n new TelegramMenu(options);\n} else {\n // otherwise start the instance directly\n new TelegramMenu();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["obj"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "telegram-menu",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.2.0",
|
|
5
5
|
"news": {
|
|
6
|
-
"2.
|
|
7
|
-
"en": "
|
|
8
|
-
"de": "
|
|
9
|
-
"ru": "
|
|
10
|
-
"pt": "
|
|
11
|
-
"nl": "
|
|
12
|
-
"fr": "
|
|
13
|
-
"it": "
|
|
14
|
-
"es": "
|
|
15
|
-
"pl": "
|
|
16
|
-
"uk": "
|
|
17
|
-
"zh-cn": "
|
|
6
|
+
"2.2.0": {
|
|
7
|
+
"en": "FEAT: #237 Navigate by nav-button-click to action\nFIX: Cannot get value false in return text\nFIX: Delete row in Actions\nFIX: HttpRequest\nFEAT: Navigation styling and selectable menus",
|
|
8
|
+
"de": "FEAT: #237 Navigieren Sie mit nav-button-klick auf Aktion\nFIX: Kann nicht Wert falsch im Rückgabetext erhalten\nFIX: Zeile in Aktion löschen\nFIX: HttpRequest\nFEAT: Navigations-Styling und wählbare Menüs",
|
|
9
|
+
"ru": "FEAT: #237 Навигай на навигай-кнопкой мыши к действию\nFIX: не может получить значение ложное в ответном тексте\nFIX: Исключить строку в действии\nFIX: HttpRequest\nFEAT: Навигационный стиль и подбираемые меню",
|
|
10
|
+
"pt": "FEAT: #237 Navegue por nav-button-clique para ação\nFIX: Não pode obter valor falso em texto de retorno\nFIX: Excluir linha em Ações\nFIX: HttpRequest\nFEAT: Estilo de navegação e menus selecionáveis",
|
|
11
|
+
"nl": "FEAT: #237 Navigeren met nav-knop-klik op actie\nFIX: kan waarde niet foutief krijgen in de terugzendingstekst\nFIX: rij in acties verwijderen\nFIX: HttpRequest\nFEAT: Navigatie styling en selecteerbare menu's",
|
|
12
|
+
"fr": "FEAT: #237 Naviguez par nav-bouton-cliquez vers l'action\nFIX: Impossible d'obtenir la valeur false dans le texte de retour\nFIX: Supprimer la ligne dans Actions\nDemande Http\nFEAT: Style de navigation et menus sélectionnables",
|
|
13
|
+
"it": "FEAT: #237 Navigare da nav-button-click all'azione\nFIX: Non può ottenere valore falso nel testo di ritorno\nFIX: Elimina la riga in Azioni\nFIX: HttpRequest\nFEAT: menu di navigazione e selezionabili",
|
|
14
|
+
"es": "FEAT: #237 Navigate by nav-button-click to action\nFIX: No se puede obtener valor falso en el texto de retorno\nFIX: Eliminar fila en Acciones\nFIX: HtpRequest\nFEAT: Estilismo de navegación y menús seleccionables",
|
|
15
|
+
"pl": "FEAT: # 237\nFIX: Nie można uzyskać wartości false w zwrotnym tekście\nFIX: Usuń wiersz w działaniach\nFIX: HttpRequest\nFEAT: Stylizacja nawigacyjna i menu do wyboru",
|
|
16
|
+
"uk": "FEAT: #237 Нейгат від nav-button-click до дії\nFIX: Неможливо отримати значення помилково в поверненні тексту\nFIX: Видалити ряд в дії\nFIX: HttpRequest\nFEAT: Налаштування навігації та вибіркові меню",
|
|
17
|
+
"zh-cn": "FEAT: # 237 导航通过导航按钮点击动作\nFIX: 无法在返回文本中获取错误值\nFIX: 删除动作中的行\nFIX: Http 请求\nFEAT:导航样式和可选菜单"
|
|
18
18
|
},
|
|
19
|
-
"2.1.
|
|
19
|
+
"2.1.10": {
|
|
20
|
+
"en": "FIX: Return text for menus was not send",
|
|
21
|
+
"de": "FIX: Rückgabetext für Menüs wurde nicht gesendet",
|
|
22
|
+
"ru": "FIX: Возвращаемый текст для меню не был отправлен",
|
|
23
|
+
"pt": "FIX: O texto de retorno para menus não foi enviado",
|
|
24
|
+
"nl": "FIX: Retourtekst voor menu's is niet verstuurd",
|
|
25
|
+
"fr": "FIX: Retour de texte pour les menus n'a pas été envoyé",
|
|
26
|
+
"it": "FIX: Il testo di ritorno per i menu non è stato inviato",
|
|
27
|
+
"es": "FIX: El texto devuelto para los menús no fue enviado",
|
|
28
|
+
"pl": "FIX: Tekst zwrotny dla menu nie został wysłany",
|
|
29
|
+
"uk": "FIX: Повернути текст для меню не відправлено",
|
|
30
|
+
"zh-cn": "FIX: 菜单的返回文本没有发送"
|
|
31
|
+
},
|
|
32
|
+
"2.1.9": {
|
|
20
33
|
"en": "FIX: #224 Submenu trigger",
|
|
21
34
|
"de": "FIX: #224 Submenu Trigger",
|
|
22
35
|
"ru": "FIX: #224",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "FIX: # 203 Przewijanie w tabeli",
|
|
81
94
|
"uk": "FIX: #203 Прокручування в таблиці",
|
|
82
95
|
"zh-cn": "FIX: # 203 在表格中滚动"
|
|
83
|
-
},
|
|
84
|
-
"2.1.3": {
|
|
85
|
-
"en": "FIX: User checkbox error message\nFEAT: #194 Styling",
|
|
86
|
-
"de": "FIX: Benutzer-Checkbox Fehlermeldung\nFEAT: #194 Styling",
|
|
87
|
-
"ru": "FIX: Сообщение об ошибке в флажке пользователя\n#194 Стиль",
|
|
88
|
-
"pt": "FIX: Mensagem de erro da caixa de seleção do usuário\nFEAT: #194 Styling",
|
|
89
|
-
"nl": "FIX: foutmelding gebruikerscontrolevak\n#194 Styling",
|
|
90
|
-
"fr": "FIX: Message d'erreur de la case à cocher\nVIANDE: #194 Styling",
|
|
91
|
-
"it": "FIX: messaggio di errore della casella di controllo utente\nFEAT: #194 Styling",
|
|
92
|
-
"es": "FIX: Mensaje de error de la casilla de verificación del usuario\nFEAT: #194 Styling",
|
|
93
|
-
"pl": "FIX: Komunikat błędu w polu wyboru użytkownika\nFEAT: # 194 Styling",
|
|
94
|
-
"uk": "FIX: Повідомлення про помилку користувача\nFEAT: #194 Стилування",
|
|
95
|
-
"zh-cn": "FIX: 用户复选框错误消息\nFEAT: #194 时尚"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
"users": [],
|
|
292
292
|
"startsides": [],
|
|
293
293
|
"tokenGrafana": "",
|
|
294
|
-
"directory": "",
|
|
294
|
+
"directory": "/opt/iobroker/media",
|
|
295
295
|
"userActiveCheckbox": {},
|
|
296
296
|
"usersInGroup": {},
|
|
297
297
|
"textNoEntry": "",
|