1 line
28 KiB
JSON
1 line
28 KiB
JSON
{"updatedAt":"2025-12-26T11:49:46.960Z","createdAt":"2025-12-26T08:25:46.267Z","id":"sY0ddu-A-1P9TDZclJDPy","name":"MikroTik Universal (With Duplicate Check)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message","callback_query"],"additionalFields":{}},"id":"0ff5b511-c211-4eb9-b562-42b45c88f0df","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-1376,560],"webhookId":"b396e51b-6ec0-4eca-b8cb-a3ed23b4ff56","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"📋 Выберите адрес-лист:","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"don't touch","additionalFields":{"callback_data":"sl|don't touch"}},{"text":"rdp_ts","additionalFields":{"callback_data":"sl|rdp_ts"}},{"text":"rdp_ts02","additionalFields":{"callback_data":"sl|rdp_ts02"}}]}},{"row":{"buttons":[{"text":"rdp_ts01srv","additionalFields":{"callback_data":"sl|rdp_ts01srv"}},{"text":"rdp_ts02srv","additionalFields":{"callback_data":"sl|rdp_ts02srv"}}]}}]},"additionalFields":{}},"id":"e22c5697-c8dc-4451-9a46-b2c5e2cfd081","name":"Msg: Ask List","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[192,176],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"upsert","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"list":"={{ $('Logic').item.json.list }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,368],"id":"f17f5c31-3e05-4980-9242-7f663a781964","name":"DB: Update List"},{"parameters":{"jsCode":"const input = $input.all()[0].json;\nlet chatId, text = '', cb = '';\nlet deleteMsgId = null; \n\n// Определяем, откуда пришел запрос (кнопка или текст)\nif (input.callback_query) {\n cb = input.callback_query.data || '';\n chatId = input.callback_query.message.chat.id;\n // Берем ID сообщения с кнопками (чтобы удалить меню)\n deleteMsgId = input.callback_query.message.message_id;\n} else if (input.message) {\n text = (input.message.text || '').trim();\n chatId = input.message.chat.id;\n // Берем ID сообщения пользователя (чтобы удалить его команду/текст)\n deleteMsgId = input.message.message_id;\n}\n\n// Функция для удобного ответа\nfunction respond(action, data = {}) {\n return [{\n json: {\n chatId,\n action,\n deleteMsgId, // Передаем ID сообщения дальше\n ...data\n }\n }];\n}\n\n// 1. Команды\nif (text === '/start' || text === '/menu') return respond('menu');\nif (text === '/addip') return respond('ask_ip');\nif (text === '/find') return respond('ask_search');\n\n// 2. Кнопки\nif (cb.startsWith('sl|')) return respond('save_list', { list: cb.split('|')[1] });\nif (cb.startsWith('st|')) return respond('save_time', { time: cb.split('|')[1] });\nif (cb.startsWith('to|') || cb.startsWith('del|')) return respond('check_state'); \n\n// 3. Текст (IP или Комментарий)\nif (text && !text.startsWith('/')) {\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(text)) {\n return respond('save_ip', { ip: text });\n }\n return respond('save_comment', { comment: text });\n}\n\nreturn respond('menu');"},"id":"a3e26177-3807-4a17-aafe-2dbb351b0cf1","name":"Logic","type":"n8n-nodes-base.code","typeVersion":2,"position":[-1152,560]},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"timeout":"={{ $('Logic').item.json.time }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,560],"id":"80ac541c-647e-4579-9c12-829837c15886","name":"DB: Update Time"},{"parameters":{"operation":"get","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-32,832],"id":"ae0f1596-12d0-4209-857b-6233f0bf33c4","name":"DB: Get Final Data"},{"parameters":{"method":"POST","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list/add","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","sendBody":true,"specifyBody":"json","jsonBody":"={{\n {\n \"address\": $('Code in JavaScript1').item.json.ip,\n \"list\": $('Code in JavaScript1').item.json.list,\n \"timeout\": $('Code in JavaScript1').item.json.timeout,\n \"comment\": $('Code in JavaScript1').item.json.comment\n }\n}}","options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[1088,768],"id":"b16afff3-ac57-4e0d-9651-3a988820e853","name":"HTTP Request: Add IP","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"url":"http://10.33.33.1:8738/rest/ip/firewall/address-list","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[416,928],"id":"4c0124cf-ecf2-4d66-b3ce-239c65f4a8e7","name":"HTTP Request1","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"f1a796c2-041d-471a-a4b0-22b0bd15df20","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"ask_ip","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_ip","operator":{"type":"string","operation":"equals"},"id":"ac137fee-fc2a-4c02-89ac-5705e2c934bc"}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"9a906cfd-f59d-40a6-9ed5-83efb7f9a967","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_list","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"536ac3bf-1f51-4652-8f1c-deba5a86718c","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_time","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"7e00d527-7ffa-4093-ae99-5c37197b1f59","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_comment","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"1d088ff0-6dab-49e5-ba4f-68fa40c1cabf","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"check_state","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"cf1925e2-62b7-4a1c-8e8f-08cc7b575d27","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"ask_search","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.4,"position":[-704,480],"id":"5786fbac-4940-4c65-a20c-9c5efd4a07dd","name":"Switch"},{"parameters":{"dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"columns":{"mappingMode":"defineBelow","value":{"ip":"={{ $('Logic').item.json.ip }}","chat_id":"={{ $('Logic').item.json.chatId }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-32,176],"id":"88478b7a-4323-48b8-944f-6cbb04f6a853","name":"DB: Save IP"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"🌐 **Режим добавления IP** Пожалуйста, введите IP-адрес в формате `1.2.3.4`","additionalFields":{"parse_mode":"Markdown"}},"id":"0fd6e587-c181-4575-b3c8-4307b676262d","name":"Msg: Ask IP","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-480,-16],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"matchType":"allConditions","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"last_action":"waiting_search"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"waiting_search","displayName":"waiting_search","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"last_action","displayName":"last_action","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,1040],"id":"779e1473-c343-4223-a78e-9e171fb1be6f","name":"DB: Update State (waiting_search)"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"Введите текст для поиска","additionalFields":{"parse_mode":"Markdown"}},"id":"d39d6cec-5859-4b28-9721-63132abc0607","name":"Msg: Ask Find","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-256,1040],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"leftValue":"={{ $json.last_action }}","rightValue":"waiting_search","operator":{"type":"string","operation":"empty","singleValue":true},"id":"1ba963ee-c3d1-456a-9251-91857c5fdfad"}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"2b8ba99b-47ae-437a-879c-3ce9f5b01c11","leftValue":"={{ $json.last_action }}","rightValue":"=waiting_search","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.4,"position":[192,832],"id":"c26a7967-3af3-4104-ad70-28f07355a8cf","name":"Switch1"},{"parameters":{"chatId":"={{ $('Logic').first().json.chatId }}","text":"={{ $json.text }}","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[864,928],"id":"c15eb3a0-1669-4f51-b349-6c4f795e1975","name":"Send a text message","webhookId":"fb0e3bf8-34c4-42cc-a1fc-a95503049ec8","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⏱ Выберите время через сколько перестанет работать правило: *{{ $json.timeout }}*","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"1 день","additionalFields":{"callback_data":"st|1d"}},{"text":"14 дней","additionalFields":{"callback_data":"st|14d"}},{"text":"31 день","additionalFields":{"callback_data":"st|31d"}}]}}]},"additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,368],"id":"000b9b1b-604a-43c3-aae6-52e242c752a3","name":"Msg: Ask Time","webhookId":"6d930e6d-b512-409c-b06d-4d21b7e94d7f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⏱ Время выбрано: *{{ $json.timeout }}*.📝 Теперь напишите **комментарий** для этой записи (например: \"Иван Офис\"):","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,560],"id":"8d655819-70bc-429a-83f5-859ac04ba738","name":"Msg: Ask Comment","webhookId":"6d930e6d-b512-409c-b06d-4d21b7e94d7f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"comment":"={{ $('Logic').item.json.comment }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"last_action","displayName":"last_action","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"comment","displayName":"comment","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-256,752],"id":"1f363c13-d0b3-4fcf-95c0-40f27e27fa94","name":"DB: Update Comment"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $json.deleteMsgId }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-928,560],"id":"72f208fb-d2b1-444b-ba17-320042f4d692","name":"Delete a chat message","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=✅ **IP-адрес успешно добавлен!** 📍 **IP**: `{{ $node[\"DB: Get Final Data\"].json[\"ip\"] }}` 📋 **Лист**: `{{ $node[\"DB: Get Final Data\"].json[\"list\"] }}` ⏱ **Время**: `{{ $node[\"DB: Get Final Data\"].json[\"timeout\"] }}` 📝 **Комментарий**: _{{ $node[\"DB: Get Final Data\"].json[\"comment\"] }}_ 🚀 Правило уже активно в MikroTik.","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1312,768],"id":"659dc251-4fbd-404c-8b48-603b1982da25","name":"Send a text message1","webhookId":"b9cfc33f-5741-47d3-a972-3e6afe01857d","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⚠️ Ошибка: IP-адрес `{{$json.ip}}` уже есть в списке `{{$json.list}}`. Добавление отменено.","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1088,576],"id":"6c5d7c4e-574a-4876-a00c-ed052b7ee776","name":"Send a text message2","webhookId":"d85390ac-6acf-49e7-9fbb-7afc898ebca7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"jsCode":"// === 1. ПОЛУЧЕНИЕ И НОРМАЛИЗАЦИЯ ДАННЫХ ===\nconst rawItems = $input.all();\nlet items = [];\n\nif (rawItems.length === 1 && Array.isArray(rawItems[0].json)) {\n items = rawItems[0].json.map(record => ({ json: record }));\n} else {\n items = rawItems;\n}\n\n// === 2. ПОЛУЧЕНИЕ ЗАПРОСА ИЗ ПРЕДЫДУЩИХ НОД ===\nlet query = '';\nlet chatId = null;\n\ntry {\n // Пытаемся взять текст, который пользователь ввел последним (из ноды Logic)\n // В n8n v1+ используем $(node).first().json\n const logicData = $('Logic').first().json;\n \n // Если в Logic пришел комментарий/текст для поиска\n query = (logicData.comment || '').toString().toLowerCase().trim();\n chatId = logicData.chatId;\n} catch (e) {\n // Резервный вариант, если путь выше не сработал\n if (rawItems.length > 0) chatId = rawItems[0].json.chatId;\n}\n\n// Если запроса нет — выходим\nif (!query) {\n return [{\n json: {\n chatId: chatId,\n text: \"⚠️ Ошибка: Поисковый запрос пуст. Пожалуйста, введите текст для поиска после команды.\",\n parse_mode: \"Markdown\"\n }\n }];\n}\n\n// === 3. ФИЛЬТРАЦИЯ ===\nconst matchedItems = items.filter(item => {\n const json = item.json || item;\n if (!json.address && !json.list) return false;\n\n const comment = (json.comment || '').toString().toLowerCase();\n const address = (json.address || '').toString().toLowerCase();\n \n return comment.includes(query) || address.includes(query);\n});\n\n// === 4. ЕСЛИ НИЧЕГО НЕ НАЙДЕНО ===\nif (matchedItems.length === 0) {\n return [{\n json: {\n chatId: chatId,\n text: `❌ *Ничего не найдено*\\n\\nЗапрос: \\`${query}\\`\\nПроверено записей: \\`${items.length}\\``,\n parse_mode: \"Markdown\"\n }\n }];\n}\n\n// === 5. ФОРМИРОВАНИЕ ОТВЕТА (КНОПКИ) ===\nreturn matchedItems.map(item => {\n const e = item.json || item;\n const id = e['.id'] || e.id;\n \n const safeList = (e.list || 'нет').toString().replace(/_/g, '\\\\_').replace(/\\*/g, '\\\\*');\n const safeComment = (e.comment || '—').toString().replace(/_/g, '\\\\_').replace(/\\*/g, '\\\\*');\n \n return {\n json: {\n chatId: chatId,\n text: `*Комментарий:* ${safeComment}\\n*IP:* \\`${e.address}\\`\\n*Лист:* ${safeList}`,\n parse_mode: \"Markdown\",\n reply_markup: {\n inline_keyboard: [\n [\n { text: 'trusted', callback_data: `to|${id}|trusted` },\n { text: 'blocked', callback_data: `to|${id}|blocked` },\n { text: 'vpn', callback_data: `to|${id}|vpn` }\n ],\n [\n { text: 'Удалить', callback_data: `del|${id}` }\n ]\n ]\n }\n }\n };\n});"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[640,928],"id":"85cf204a-133c-43dd-b3fe-3a8011eb2371","name":"Code in JavaScript"},{"parameters":{"jsCode":"// Получаем все входящие элементы\nconst items = $input.all();\nconst uniqueItems = [];\nconst seen = new Set();\n\nfor (const item of items) {\n // Создаем уникальный ключ из IP и названия листа\n const key = `${item.json.ip}-${item.json.list}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n uniqueItems.push(item);\n }\n}\n\nreturn uniqueItems;"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[416,672],"id":"b3ae67ec-1630-4819-b5d7-e6f084f0ba98","name":"Code in JavaScript1"},{"parameters":{"operation":"deleteRows","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,176],"id":"1d9e7c6c-5d35-4400-ad49-15c3d0bb5875","name":"Delete row(s)"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $('Logic').item.json.deleteMsgId - 1 }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,176],"id":"17e5622c-56c1-49cd-b2a4-672d580da3f2","name":"Delete a chat message1","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $('Logic').item.json.deleteMsgId - 1 }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-480,752],"id":"2df1ba1b-72aa-4953-b84e-73280b2a00f1","name":"Delete a chat message2","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"url":"=http://10.33.33.1:8738/rest/ip/firewall/address-list","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","sendQuery":true,"queryParameters":{"parameters":[{"name":"address","value":"={{ $json.ip }}"}]},"options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[640,672],"id":"7facdc1f-6534-4724-b2a2-49d12aa07cf2","name":"Check if IP exists","alwaysOutputData":true,"credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"5879c004-357a-4be4-8ac1-66e5e5260ddc","leftValue":"={{ $json.address }}","rightValue":0,"operator":{"type":"string","operation":"notEmpty","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"Exists"}]},"options":{"fallbackOutput":"extra"}},"type":"n8n-nodes-base.switch","typeVersion":3.2,"position":[864,672],"id":"83ba3dca-947d-4bfd-aa3c-c57f9c37494e","name":"Filter: Already Exists?"}],"connections":{"Telegram Trigger":{"main":[[{"node":"Logic","type":"main","index":0}]]},"Logic":{"main":[[{"node":"Delete a chat message","type":"main","index":0}]]},"DB: Update List":{"main":[[{"node":"Msg: Ask Time","type":"main","index":0}]]},"DB: Update Time":{"main":[[{"node":"Msg: Ask Comment","type":"main","index":0}]]},"DB: Get Final Data":{"main":[[{"node":"Switch1","type":"main","index":0}]]},"DB: Save IP":{"main":[[{"node":"Msg: Ask List","type":"main","index":0}]]},"Switch":{"main":[[{"node":"Msg: Ask IP","type":"main","index":0}],[{"node":"Delete row(s)","type":"main","index":0}],[{"node":"DB: Update List","type":"main","index":0}],[{"node":"DB: Update Time","type":"main","index":0}],[{"node":"Delete a chat message2","type":"main","index":0}],[{"node":"DB: Get Final Data","type":"main","index":0}],[{"node":"DB: Update State (waiting_search)","type":"main","index":0}]]},"DB: Update State (waiting_search)":{"main":[[{"node":"Msg: Ask Find","type":"main","index":0}]]},"Switch1":{"main":[[{"node":"Code in JavaScript1","type":"main","index":0}],[{"node":"HTTP Request1","type":"main","index":0}]]},"HTTP Request1":{"main":[[{"node":"Code in JavaScript","type":"main","index":0}]]},"HTTP Request: Add IP":{"main":[[{"node":"Send a text message1","type":"main","index":0}]]},"DB: Update Comment":{"main":[[{"node":"DB: Get Final Data","type":"main","index":0}]]},"Delete a chat message":{"main":[[{"node":"Switch","type":"main","index":0}]]},"Code in JavaScript":{"main":[[{"node":"Send a text message","type":"main","index":0}]]},"Code in JavaScript1":{"main":[[{"node":"Check if IP exists","type":"main","index":0}]]},"Delete row(s)":{"main":[[{"node":"Delete a chat message1","type":"main","index":0}]]},"Delete a chat message1":{"main":[[{"node":"DB: Save IP","type":"main","index":0}]]},"Delete a chat message2":{"main":[[{"node":"DB: Update Comment","type":"main","index":0}]]},"Check if IP exists":{"main":[[{"node":"Filter: Already Exists?","type":"main","index":0}]]},"Filter: Already Exists?":{"main":[[{"node":"Send a text message2","type":"main","index":0}],[{"node":"HTTP Request: Add IP","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","availableInMCP":false},"staticData":null,"meta":null,"pinData":{},"versionId":"155aa8a0-477e-475a-8ab9-fab2cbee50db","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-12-26T08:25:46.267Z","createdAt":"2025-12-26T08:25:46.267Z","role":"workflow:owner","workflowId":"sY0ddu-A-1P9TDZclJDPy","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} |